summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVic Yang <victoryang@chromium.org>2013-04-10 18:20:25 +0800
committerChromeBot <chrome-bot@google.com>2013-04-10 09:35:05 -0700
commit9aa3716ca08a3bb8e62964229d67b867aa285c12 (patch)
tree0137a4c74a82c0a66878fc040f83822c4255fb48
parent8a06eb1d35cb460fb5669c720262d437f54b0101 (diff)
downloadchrome-ec-9aa3716ca08a3bb8e62964229d67b867aa285c12.tar.gz
Turn on/off 3.3V output properly
When the system is turned off and then back on, we need to re-enable 3.3V output from TPS65090. Also, when we see 5V input, we should shut down 3.3V output and re-enable it when 5V input goes away. BUG=chrome-os-partner:18186, chrome-os-partner:18482 TEST=Manual BRANCH=spring Change-Id: I0cf0597a60988cc9ec28282eea54908c81e5eabc Signed-off-by: Vic Yang <victoryang@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/47736 Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r--common/extpower_usb.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/common/extpower_usb.c b/common/extpower_usb.c
index e46153fa32..625f93945d 100644
--- a/common/extpower_usb.c
+++ b/common/extpower_usb.c
@@ -128,6 +128,19 @@ static const int apple_charger_type[4] = {I_LIMIT_500MA,
I_LIMIT_2000MA,
I_LIMIT_2400MA};
+static int video_power_enabled;
+
+static int get_video_power(void)
+{
+ return video_power_enabled;
+}
+
+static void set_video_power(int enabled)
+{
+ pmu_enable_fet(FET_VIDEO, enabled, NULL);
+ video_power_enabled = enabled;
+}
+
static void board_ilim_use_gpio(void)
{
/* Disable counter */
@@ -386,6 +399,8 @@ static void usb_boost_power_hook(int power_on)
{
if (current_dev_type == TSU6721_TYPE_NONE)
gpio_set_level(GPIO_BOOST_EN, power_on);
+ else if (current_dev_type & TSU6721_TYPE_JIG_UART_ON)
+ set_video_power(power_on);
}
static void usb_boost_pwr_on_hook(void) { usb_boost_power_hook(1); }
@@ -508,7 +523,7 @@ static void usb_device_change(int dev_type)
/* Supply 3.3V VBUS if needed. */
if (dev_type & POWERED_3300_DEVICE_TYPE)
- pmu_enable_fet(FET_VIDEO, 1, NULL);
+ set_video_power(1);
usb_update_ilim(dev_type);
@@ -533,16 +548,25 @@ static void usb_device_change(int dev_type)
*/
static void board_usb_monitor_detach(void)
{
+ int vbus;
+
if (!(current_dev_type & TSU6721_TYPE_JIG_UART_ON))
return;
if (adc_read_channel(ADC_CH_USB_DP_SNS) > VIDEO_ID_THRESHOLD) {
- pmu_enable_fet(FET_VIDEO, 0, NULL);
+ set_video_power(0);
gpio_set_level(GPIO_ID_MUX, 0);
msleep(DELAY_ID_MUX_MS);
tsu6721_enable_interrupts();
usb_device_change(TSU6721_TYPE_NONE);
}
+
+ /* Check if there is external power */
+ vbus = adc_read_channel(ADC_CH_USB_VBUS_SNS);
+ if (get_video_power() && vbus > 4000)
+ set_video_power(0);
+ else if (!get_video_power() && vbus <= 4000)
+ set_video_power(1);
}
DECLARE_HOOK(HOOK_SECOND, board_usb_monitor_detach, HOOK_PRIO_DEFAULT);