summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Boichat <drinkcat@chromium.org>2016-05-26 11:53:01 +0800
committerchrome-bot <chrome-bot@chromium.org>2016-06-07 08:21:33 -0700
commit091eea69da7a743035cb6c30d0883f6057007066 (patch)
treeb254da4a090fb620f24c4c6d7bd8c0f665e84290
parente37b18d7d1d87bd77ace5b9bc86c4dd58624195c (diff)
downloadchrome-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.c21
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)