summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVic Yang <victoryang@chromium.org>2013-09-02 21:09:24 +0800
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2013-09-05 07:20:13 +0000
commit0492ff9204a527b7cc9bbe84766d9507f52260a6 (patch)
tree82987862b21405960e4f421e64f1f46ca480bcd7
parent4f09144839587a983aad85fa4c74fdda4eed1498 (diff)
downloadchrome-ec-0492ff9204a527b7cc9bbe84766d9507f52260a6.tar.gz
Temporary OTG and external power support
This is only for initial bringup that requires OTG to boot kernel. Note that we are expecting firmware for USB ID detection and hardware change to charger chip, so this is likely going to be thrown away. BUG=chrome-os-partner:21964 TEST=Plug in OTG dongle and check VBUS voltage is ~5V TEST=Unplug and check it's ~0V. BRANCH=None Change-Id: Iee66bef117188fea14a76459945be3bf5afef0dd Signed-off-by: Vic Yang <victoryang@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/167832
-rw-r--r--board/kirby/board.c9
-rw-r--r--board/kirby/board.h2
-rw-r--r--common/build.mk1
-rw-r--r--common/charger_bq24192.c13
-rw-r--r--common/extpower_kirby.c72
-rw-r--r--include/charger.h6
6 files changed, 98 insertions, 5 deletions
diff --git a/board/kirby/board.c b/board/kirby/board.c
index bea56ee462..87b3586877 100644
--- a/board/kirby/board.c
+++ b/board/kirby/board.c
@@ -32,16 +32,15 @@ const struct gpio_info gpio_list[] = {
{"XPSHOLD", GPIO_E, (1<<5), GPIO_INT_RISING, gaia_power_event},
{"CHARGER_INT_L", GPIO_E, (1<<2), GPIO_INT_FALLING,
NULL /*pmu_irq_handler*/},
- {"USB_CHG_INT", GPIO_E, (1<<15), GPIO_INT_RISING,
- NULL /*extpower_interrupt*/},
+ {"USB_CHG_INT", GPIO_E, (1<<15), GPIO_INT_FALLING,
+ extpower_interrupt},
{"USBPD_INT_L", GPIO_E, (1<<1), GPIO_INT_FALLING,
NULL /*extpower_interrupt*/},
{"LID_OPEN", GPIO_E, (1<<6), GPIO_INT_BOTH, lid_interrupt},
{"SUSPEND_L", GPIO_E, (1<<3), GPIO_INT_BOTH, gaia_suspend_event},
{"SPI1_NSS", GPIO_A, (1<<4), GPIO_INT_BOTH | GPIO_PULL_UP,
spi_event},
- {"AC_PRESENT_L", GPIO_A, (1<<1), GPIO_INT_BOTH,
- NULL /*extpower_interrupt*/},
+ {"AC_PRESENT_L", GPIO_A, (1<<1), GPIO_INT_BOTH, extpower_interrupt},
{"KB_IN00", GPIO_E, (1<<7), GPIO_KB_INPUT,
keyboard_raw_gpio_interrupt},
{"KB_IN01", GPIO_E, (1<<8), GPIO_KB_INPUT,
@@ -64,7 +63,7 @@ const struct gpio_info gpio_list[] = {
{"CHARGER_EN_L", GPIO_B, (1<<8), GPIO_OUT_HIGH, NULL},
{"EC_INT", GPIO_C, (1<<9), GPIO_ODR_HIGH, NULL},
{"EC_INT2", GPIO_B, (1<<4), GPIO_ODR_HIGH, NULL},
- {"ID_MUX", GPIO_B, (1<<11), GPIO_ODR_HIGH, NULL},
+ {"ID_MUX", GPIO_B, (1<<11), GPIO_ODR_LOW, NULL},
{"BCHGR_OTG", GPIO_B, (1<<12), GPIO_OUT_LOW, NULL},
{"BCHGR_PSEL", GPIO_B, (1<<14), GPIO_OUT_LOW, NULL},
{"EN_PP3300", GPIO_C, (1<<11), GPIO_OUT_LOW, NULL},
diff --git a/board/kirby/board.h b/board/kirby/board.h
index 7cd7c87218..24d14d6459 100644
--- a/board/kirby/board.h
+++ b/board/kirby/board.h
@@ -17,11 +17,13 @@
#define CONFIG_CHIPSET_GAIA
#undef CONFIG_CHIPSET_HAS_PP1350
#undef CONFIG_CHIPSET_HAS_PP5000
+#define CONFIG_EXTPOWER_KIRBY
#define CONFIG_HOST_COMMAND_STATUS
#define CONFIG_I2C
#define CONFIG_KEYBOARD_PROTOCOL_MKBP
#define CONFIG_SPI
#define CONFIG_PWM
+#define CONFIG_USB_SWITCH_TSU6721
#ifndef __ASSEMBLER__
diff --git a/common/build.mk b/common/build.mk
index fbc78039b5..fa3ad7b24e 100644
--- a/common/build.mk
+++ b/common/build.mk
@@ -41,6 +41,7 @@ common-$(CONFIG_PMU_TPS65090)+=pmu_tps65090.o
common-$(CONFIG_EOPTION)+=eoption.o
common-$(CONFIG_EXTPOWER_FALCO)+=extpower_falco.o
common-$(CONFIG_EXTPOWER_GPIO)+=extpower_gpio.o
+common-$(CONFIG_EXTPOWER_KIRBY)+=extpower_kirby.o
common-$(CONFIG_EXTPOWER_SPRING)+=extpower_spring.o
common-$(CONFIG_FLASH)+=flash_common.o
common-$(CONFIG_FMAP)+=fmap.o
diff --git a/common/charger_bq24192.c b/common/charger_bq24192.c
index 8939cc9e71..377af57665 100644
--- a/common/charger_bq24192.c
+++ b/common/charger_bq24192.c
@@ -9,6 +9,7 @@
#include "charger_bq24192.h"
#include "common.h"
#include "console.h"
+#include "gpio.h"
#include "hooks.h"
#include "i2c.h"
#include "printf.h"
@@ -57,6 +58,18 @@ static int bq24192_watchdog_reset(void)
bq24192_write(BQ24192_REG_POWER_ON_CFG, val);
}
+int charger_enable_otg_power(int enabled)
+{
+ int val, rv;
+
+ gpio_set_level(GPIO_BCHGR_OTG, enabled);
+ rv = bq24192_read(BQ24192_REG_POWER_ON_CFG, &val);
+ if (rv)
+ return rv;
+ val = (val & ~0x30) | (enabled ? 0x20 : 0x10);
+ return bq24192_write(BQ24192_REG_POWER_ON_CFG, val);
+}
+
int charger_set_input_current(int input_current)
{
int i, value, rv;
diff --git a/common/extpower_kirby.c b/common/extpower_kirby.c
new file mode 100644
index 0000000000..ceb4220b4f
--- /dev/null
+++ b/common/extpower_kirby.c
@@ -0,0 +1,72 @@
+/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/* USB charging control for kirby board */
+
+#include "battery.h"
+#include "charger.h"
+#include "chipset.h"
+#include "console.h"
+#include "extpower.h"
+#include "gpio.h"
+#include "hooks.h"
+#include "task.h"
+#include "timer.h"
+#include "tsu6721.h"
+#include "util.h"
+
+/* Console output macros */
+#define CPUTS(outstr) cputs(CC_USBCHARGE, outstr)
+#define CPRINTF(format, args...) cprintf(CC_USBCHARGE, format, ## args)
+
+int extpower_is_present(void)
+{
+ return !gpio_get_level(GPIO_AC_PRESENT_L);
+}
+
+static void extpower_deferred(void)
+{
+ int int_val, dev_type, is_otg;
+ int ac;
+ static int last_ac = -1;
+
+ int_val = tsu6721_get_interrupts();
+ dev_type = tsu6721_get_device_type();
+ is_otg = dev_type & TSU6721_TYPE_OTG;
+
+ ac = extpower_is_present();
+ if (last_ac != ac) {
+ last_ac = ac;
+ hook_notify(HOOK_AC_CHANGE);
+ }
+
+ if (!int_val)
+ return;
+
+ if (is_otg && !gpio_get_level(GPIO_BCHGR_OTG)) {
+ charger_enable_otg_power(1);
+ CPRINTF("[%T OTG power enabled]\n");
+ } else if (!is_otg && gpio_get_level(GPIO_BCHGR_OTG)) {
+ charger_enable_otg_power(0);
+ CPRINTF("[%T OTG power disabled]\n");
+ }
+}
+DECLARE_DEFERRED(extpower_deferred);
+
+/*****************************************************************************/
+/* Hooks */
+
+static void extpower_init(void)
+{
+ tsu6721_init();
+ gpio_enable_interrupt(GPIO_USB_CHG_INT);
+ gpio_enable_interrupt(GPIO_AC_PRESENT_L);
+}
+DECLARE_HOOK(HOOK_INIT, extpower_init, HOOK_PRIO_LAST);
+
+void extpower_interrupt(enum gpio_signal signal)
+{
+ hook_call_deferred(extpower_deferred, 0);
+}
diff --git a/include/charger.h b/include/charger.h
index 9b75bb95b2..c3c2b06cd4 100644
--- a/include/charger.h
+++ b/include/charger.h
@@ -45,6 +45,12 @@ int charger_get_status(int *status);
int charger_set_mode(int mode);
/**
+ * For chargers that are able to supply 5V output power for OTG dongle, this
+ * function enables or disables 5V power output.
+ */
+int charger_enable_otg_power(int enabled);
+
+/**
* Return the closest match the charger can supply to the requested current.
*
* @param current Requested current in mA.