diff options
author | Ruibin Chang <ruibin.chang@ite.com.tw> | 2020-07-07 15:42:20 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-07-14 06:46:05 +0000 |
commit | 1f73f33656bafa76680be4375e3c9f362d5d5c19 (patch) | |
tree | 2409a48a3427c1946dc4266d6783f97bb8ed38bf | |
parent | ba4b10a78f8da08a56651eebf6941571a0d1d751 (diff) | |
download | chrome-ec-1f73f33656bafa76680be4375e3c9f362d5d5c19.tar.gz |
driver/tcpm: set PD_EVENT_RX_HARD_RESET event when receive hard reset
When we receive hard reset, we should do Vbus on-off cycle
and should keep cc connection. So I change the event setting
from PD_EVENT_TCPC_RESET to PD_EVENT_RX_HARD_RESET for ITE TCPC.
Stand alone TCPCs also use hard reset event instead of calling
pd_execute_hard_reset(), because waked up pd_task() may have chance
setting to other state.
BRANCH=None
BUG=b:159394180
TEST=On board reef_it8320, and it81202_pdevb:
1.TCPMv1: Rx Hard reset -> done Vbus cycle, and keep cc connection,
When we're SRC and SNK.
2.TCPMv2: Rx Hard reset -> done Vbus cycle, and keep cc connection,
When we're SRC and SNK.
Signed-off-by: Ruibin Chang <Ruibin.Chang@ite.com.tw>
Change-Id: Ie94757580e8fed4fb33896f9c1e071def49ff03d
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2284504
Reviewed-by: Jett Rink <jettrink@chromium.org>
Reviewed-by: Eric Yilun Lin <yllin@chromium.org>
-rw-r--r-- | chip/it83xx/intc.c | 3 | ||||
-rw-r--r-- | driver/tcpm/anx74xx.c | 4 | ||||
-rw-r--r-- | driver/tcpm/fusb302.c | 6 | ||||
-rw-r--r-- | driver/tcpm/stub.c | 4 | ||||
-rw-r--r-- | driver/tcpm/tcpci.c | 3 |
5 files changed, 9 insertions, 11 deletions
diff --git a/chip/it83xx/intc.c b/chip/it83xx/intc.c index 8b74134682..d77ec9092a 100644 --- a/chip/it83xx/intc.c +++ b/chip/it83xx/intc.c @@ -21,8 +21,9 @@ static void chip_pd_irq(enum usbpd_port port) if (USBPD_IS_HARD_RESET_DETECT(port)) { /* clear interrupt */ IT83XX_USBPD_ISR(port) = USBPD_REG_MASK_HARD_RESET_DETECT; + USBPD_SW_RESET(port); task_set_event(PD_PORT_TO_TASK_ID(port), - PD_EVENT_TCPC_RESET, 0); + PD_EVENT_RX_HARD_RESET, 0); } if (USBPD_IS_RX_DONE(port)) { diff --git a/driver/tcpm/anx74xx.c b/driver/tcpm/anx74xx.c index 06667ab5ae..26fc0da93c 100644 --- a/driver/tcpm/anx74xx.c +++ b/driver/tcpm/anx74xx.c @@ -1037,8 +1037,8 @@ void anx74xx_tcpc_alert(int port) if (reg & ANX74XX_REG_EXT_HARD_RST) { /* hard reset received */ - pd_execute_hard_reset(port); - task_wake(PD_PORT_TO_TASK_ID(port)); + task_set_event(PD_PORT_TO_TASK_ID(port), + PD_EVENT_RX_HARD_RESET, 0); } } diff --git a/driver/tcpm/fusb302.c b/driver/tcpm/fusb302.c index 8b783683d4..74d32a2052 100644 --- a/driver/tcpm/fusb302.c +++ b/driver/tcpm/fusb302.c @@ -988,10 +988,8 @@ void fusb302_tcpc_alert(int port) /* bring FUSB302 out of reset */ fusb302_pd_reset(port); - - pd_execute_hard_reset(port); - - task_wake(PD_PORT_TO_TASK_ID(port)); + task_set_event(PD_PORT_TO_TASK_ID(port), + PD_EVENT_RX_HARD_RESET, 0); } if (interruptb & TCPC_REG_INTERRUPTB_GCRCSENT) { diff --git a/driver/tcpm/stub.c b/driver/tcpm/stub.c index fcc460a8c6..75a9c9ced6 100644 --- a/driver/tcpm/stub.c +++ b/driver/tcpm/stub.c @@ -147,8 +147,8 @@ void tcpc_alert(int port) } if (status & TCPC_REG_ALERT_RX_HARD_RST) { /* hard reset received */ - pd_execute_hard_reset(port); - task_wake(PD_PORT_TO_TASK_ID(port)); + task_set_event(PD_PORT_TO_TASK_ID(port), + PD_EVENT_RX_HARD_RESET, 0); } if (status & TCPC_REG_ALERT_TX_COMPLETE) { /* transmit complete */ diff --git a/driver/tcpm/tcpci.c b/driver/tcpm/tcpci.c index 653d29e437..99860407a5 100644 --- a/driver/tcpm/tcpci.c +++ b/driver/tcpm/tcpci.c @@ -1180,8 +1180,7 @@ void tcpci_tcpc_alert(int port) if (alert & TCPC_REG_ALERT_RX_HARD_RST) { /* hard reset received */ CPRINTS("C%d Hard Reset received", port); - pd_execute_hard_reset(port); - pd_event |= TASK_EVENT_WAKE; + pd_event |= PD_EVENT_RX_HARD_RESET; } /* USB TCPCI Spec R2 V1.1 Section 4.7.3 Step 2 |