diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2015-01-20 14:45:46 -0800 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2015-01-21 06:44:26 +0000 |
commit | 3075113c856dc0c26325a7e5ff9d8ed7f9658b4d (patch) | |
tree | 3a6f8b05719ee61330e01cdf61433c20798ed624 /common | |
parent | 9e07dfb6cb7391844dfd56ba856b30329318f05e (diff) | |
download | chrome-ec-3075113c856dc0c26325a7e5ff9d8ed7f9658b4d.tar.gz |
pd: Clear type-c charge_manager supplier when VBUS disappears
When VBUS is initially present, we set a type-c charge_manager supplier.
Therefore, when we clear our VBUS present flag, we also need to zero our
supplier.
BUG=None
TEST=Manual on Samus. Quickly plug + unplug SDP charger, verify that pd
correctly detects that no charger is present on the board.
BRANCH=Samus
Change-Id: Ie72503f8a9b0f749b7529cfd6ff0675bd5640257
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/242092
Reviewed-by: Alec Berg <alecaberg@chromium.org>
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Diffstat (limited to 'common')
-rw-r--r-- | common/usb_pd_protocol.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c index 57ad53054d..9796462564 100644 --- a/common/usb_pd_protocol.c +++ b/common/usb_pd_protocol.c @@ -386,7 +386,15 @@ static inline void set_state(int port, enum pd_states next_state) #ifdef CONFIG_USB_PD_DUAL_ROLE if (next_state == PD_STATE_SRC_DISCONNECTED || next_state == PD_STATE_SNK_DISCONNECTED) { -#else + if (pd[port].flags & PD_FLAGS_VBUS_PRESENT) { + /* Clear the input current limit */ + pd_set_input_current_limit(port, 0, 0); +#ifdef CONFIG_CHARGE_MANAGER + typec_set_input_current_limit(port, 0, 0); + charge_manager_set_ceil(port, CHARGE_CEIL_NONE); +#endif + } +#else /* CONFIG_USB_PD_DUAL_ROLE */ if (next_state == PD_STATE_SRC_DISCONNECTED) { #endif pd[port].dev_id = 0; @@ -2348,7 +2356,8 @@ void pd_task(void) port, typec_curr, TYPE_C_VOLTAGE); #endif pd[port].flags |= PD_FLAGS_CHECK_PR_ROLE | - PD_FLAGS_CHECK_DR_ROLE; + PD_FLAGS_CHECK_DR_ROLE | + PD_FLAGS_VBUS_PRESENT; set_state(port, PD_STATE_SNK_DISCOVERY); timeout = 10*MSEC; hook_call_deferred( @@ -2753,12 +2762,6 @@ void pd_task(void) pd[port].task_state != PD_STATE_HARD_RESET_EXECUTE) { /* Sink: detect disconnect by monitoring VBUS */ set_state(port, PD_STATE_SNK_DISCONNECTED); - /* Clear the input current limit */ - pd_set_input_current_limit(port, 0, 0); -#ifdef CONFIG_CHARGE_MANAGER - typec_set_input_current_limit(port, 0, 0); - charge_manager_set_ceil(port, CHARGE_CEIL_NONE); -#endif /* set timeout small to reconnect fast */ timeout = 5*MSEC; } |