diff options
Diffstat (limited to 'common/usb_pd_protocol.c')
-rw-r--r-- | common/usb_pd_protocol.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c index 8cefc0cfc9..23c88d7a85 100644 --- a/common/usb_pd_protocol.c +++ b/common/usb_pd_protocol.c @@ -3246,6 +3246,9 @@ void pd_task(void *u) if (rstatus != 0 && rstatus != EC_ERROR_UNIMPLEMENTED) CPRINTS("TCPC p%d release failed!", port); #endif + /* Drain any outstanding software message queues. */ + tcpm_clear_pending_messages(port); + /* Wait for resume */ while (pd[port].task_state == PD_STATE_SUSPENDED) task_wait_event(-1); @@ -4110,6 +4113,29 @@ void pd_set_suspend(int port, int enable) } } +#ifdef CONFIG_USB_PD_TCPM_TCPCI +static uint32_t pd_ports_to_resume; +static void resume_pd_port(void) +{ + uint32_t port; + uint32_t suspended_ports = atomic_read_clear(&pd_ports_to_resume); + + while (suspended_ports) { + port = __builtin_ctz(suspended_ports); + suspended_ports &= ~(1 << port); + pd_set_suspend(port, 0); + } +} +DECLARE_DEFERRED(resume_pd_port); + +void pd_deferred_resume(int port) +{ + atomic_or(&pd_ports_to_resume, 1 << port); + hook_call_deferred(&resume_pd_port_data, SECOND); +} + +#endif /* CONFIG_USB_PD_DEFERRED_RESUME */ + int pd_is_port_enabled(int port) { switch (pd[port].task_state) { |