summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuibin Chang <ruibin.chang@ite.com.tw>2020-07-07 15:42:20 +0800
committerCommit Bot <commit-bot@chromium.org>2020-09-22 02:00:06 +0000
commit63b3a349250abb0e1e26261484de8fc3358ca450 (patch)
tree954b24ffd1519a8d9740dd7c2f3e145387ca6ced
parent8e82913186916a485ec34e09f207fc0f5fc45b73 (diff)
downloadchrome-ec-63b3a349250abb0e1e26261484de8fc3358ca450.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> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2416075 Tested-by: Dawid Niedźwiecki <dn@semihalf.com> Commit-Queue: Eric Yilun Lin <yllin@chromium.org>
-rw-r--r--chip/it83xx/intc.c3
-rw-r--r--driver/tcpm/anx74xx.c4
-rw-r--r--driver/tcpm/fusb302.c6
-rw-r--r--driver/tcpm/stub.c4
-rw-r--r--driver/tcpm/tcpci.c3
5 files changed, 9 insertions, 11 deletions
diff --git a/chip/it83xx/intc.c b/chip/it83xx/intc.c
index cd4e147d01..70bfbea60a 100644
--- a/chip/it83xx/intc.c
+++ b/chip/it83xx/intc.c
@@ -20,8 +20,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);
} else {
if (USBPD_IS_RX_DONE(port)) {
/* mask RX done interrupt */
diff --git a/driver/tcpm/anx74xx.c b/driver/tcpm/anx74xx.c
index e0b4957f69..ea270d4cab 100644
--- a/driver/tcpm/anx74xx.c
+++ b/driver/tcpm/anx74xx.c
@@ -992,8 +992,8 @@ void anx74xx_tcpc_alert(int port)
}
if (status & ANX74XX_REG_ALERT_HARD_RST_RECV) {
/* 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 3be0288bf1..43d3829858 100644
--- a/driver/tcpm/fusb302.c
+++ b/driver/tcpm/fusb302.c
@@ -894,10 +894,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 bb61c83024..96911ab588 100644
--- a/driver/tcpm/stub.c
+++ b/driver/tcpm/stub.c
@@ -148,8 +148,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 c7cdad4390..48830903c2 100644
--- a/driver/tcpm/tcpci.c
+++ b/driver/tcpm/tcpci.c
@@ -320,8 +320,7 @@ void tcpci_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 */