diff options
author | Alec Berg <alecaberg@chromium.org> | 2015-10-30 11:43:09 -0700 |
---|---|---|
committer | ChromeOS bot <3su6n15k.default@developer.gserviceaccount.com> | 2015-11-03 21:56:37 +0000 |
commit | 5ed13ceaabde4eca28bf1549d5d50504c6516a1b (patch) | |
tree | f1f16c01e9e18e12a65159e7df64a81d66f04f77 | |
parent | 05474671761b8ad84d4e43b132474063996938d6 (diff) | |
download | chrome-ec-5ed13ceaabde4eca28bf1549d5d50504c6516a1b.tar.gz |
ryu: ensure bc1.2 suppliers get cleared on charger disconnect
Manually clear bc1.2 suppliers when VBUS transitions low to make
sure the suppliers don't get stuck on.
BUG=b:25209438
BRANCH=smaug
TEST=make BOARD=smaug
Change-Id: Ia5552213a3f2b6d539a5c8648117eec458115325
Signed-off-by: Alec Berg <alecaberg@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/309918
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Commit-Queue: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r-- | board/ryu/board.c | 46 |
1 files changed, 23 insertions, 23 deletions
diff --git a/board/ryu/board.c b/board/ryu/board.c index 9265abdf62..5498cdf1a3 100644 --- a/board/ryu/board.c +++ b/board/ryu/board.c @@ -125,6 +125,20 @@ void vbus_evt(enum gpio_signal signal) task_wake(TASK_ID_PD); } +static void usb_clear_bc12_suppliers(int port) +{ + struct charge_port_info chg; + + chg.voltage = USB_BC12_CHARGE_VOLTAGE; + chg.current = 0; + + charge_manager_update_charge(CHARGE_SUPPLIER_PROPRIETARY, port, &chg); + charge_manager_update_charge(CHARGE_SUPPLIER_BC12_CDP, port, &chg); + charge_manager_update_charge(CHARGE_SUPPLIER_BC12_DCP, port, &chg); + charge_manager_update_charge(CHARGE_SUPPLIER_BC12_SDP, port, &chg); + charge_manager_update_charge(CHARGE_SUPPLIER_OTHER, port, &chg); +} + static void usb_charger_bc12_detect(void) { int device_type, charger_status; @@ -197,27 +211,7 @@ static void usb_charger_bc12_detect(void) charger_status); charge_manager_update_charge(type, 0, &charge); } else { /* Detachment: update available charge to 0 */ - charge.current = 0; - charge_manager_update_charge( - CHARGE_SUPPLIER_PROPRIETARY, - 0, - &charge); - charge_manager_update_charge( - CHARGE_SUPPLIER_BC12_CDP, - 0, - &charge); - charge_manager_update_charge( - CHARGE_SUPPLIER_BC12_DCP, - 0, - &charge); - charge_manager_update_charge( - CHARGE_SUPPLIER_BC12_SDP, - 0, - &charge); - charge_manager_update_charge( - CHARGE_SUPPLIER_OTHER, - 0, - &charge); + usb_clear_bc12_suppliers(0); } } @@ -244,10 +238,16 @@ void usb_charger_task(void) * Re-enable interrupts on pericom charger detector since the * chip may periodically reset itself, and come back up with * registers in default state. TODO(crosbug.com/p/33823): Fix - * these unwanted resets. + * these unwanted resets. If VBUS is high, enabling interrupts + * will cause an attach interrupt to be generated immediately, + * so there is nothing else to do. But, if VBUS is low, we + * must clear the BC1.2 suppliers here. */ - if (evt & USB_CHG_EVENT_VBUS) + if (evt & USB_CHG_EVENT_VBUS) { + if (!pd_snk_is_vbus_provided(0)) + usb_clear_bc12_suppliers(0); pi3usb9281_enable_interrupts(0); + } /* notify host of power info change */ pd_send_host_event(PD_EVENT_POWER_CHANGE); } |