diff options
author | Nicolas Boichat <drinkcat@chromium.org> | 2016-05-26 11:53:01 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-06-07 08:21:33 -0700 |
commit | 091eea69da7a743035cb6c30d0883f6057007066 (patch) | |
tree | b254da4a090fb620f24c4c6d7bd8c0f665e84290 | |
parent | e37b18d7d1d87bd77ace5b9bc86c4dd58624195c (diff) | |
download | chrome-ec-091eea69da7a743035cb6c30d0883f6057007066.tar.gz |
pd: Add support for PD_STATE_SUSPENDED if we are not the TCPC
Also, make sure that pd_set_suspend can work asynchronously,
but looping until the status is read back as SUSPENDED.
BRANCH=none
BUG=chrome-os-partner:52433
TEST=On elm:
ectool pdcontrol reset
sleep 0.1
ectool pdcontrol suspend
i2cset -f -y 2 0x28 0x05 0x10
=> No I2C communication with ANX7688
Change-Id: Iad7b500f1af554e2bc4f64f90ee0a492f903749a
Signed-off-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/347730
-rw-r--r-- | common/usb_pd_protocol.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c index 1de29a184f..094f104ba7 100644 --- a/common/usb_pd_protocol.c +++ b/common/usb_pd_protocol.c @@ -1965,21 +1965,19 @@ void pd_task(void) } break; case PD_STATE_SUSPENDED: - /* - * TODO: Suspend state only supported if we are also - * the TCPC. - */ + CPRINTS("TCPC p%d suspended!", port); #ifdef CONFIG_USB_PD_TCPC pd_rx_disable_monitoring(port); pd_hw_release(port); pd_power_supply_reset(port); - +#endif /* Wait for resume */ while (pd[port].task_state == PD_STATE_SUSPENDED) task_wait_event(-1); - +#ifdef CONFIG_USB_PD_TCPC pd_hw_init(port, PD_ROLE_DEFAULT); #endif + CPRINTS("TCPC p%d resumed!", port); break; case PD_STATE_SNK_DISCONNECTED: #ifdef CONFIG_USB_PD_LOW_POWER @@ -2667,9 +2665,16 @@ DECLARE_HOOK(HOOK_INIT, dual_role_init, HOOK_PRIO_DEFAULT); #ifdef CONFIG_COMMON_RUNTIME void pd_set_suspend(int port, int enable) { - set_state(port, enable ? PD_STATE_SUSPENDED : PD_DEFAULT_STATE); + int tries = 3; - task_wake(PD_PORT_TO_TASK_ID(port)); + do { + set_state(port, enable ? PD_STATE_SUSPENDED : PD_DEFAULT_STATE); + task_wake(PD_PORT_TO_TASK_ID(port)); + } while (enable && pd[port].task_state != PD_STATE_SUSPENDED + && --tries); + + if (!tries) + CPRINTS("TCPC p%d set_suspend failed!", port); } #if defined(CONFIG_CMD_PD) && defined(CONFIG_CMD_PD_FLASH) |