MLK-16013-14: staging: typec: tcpci: handle fault event
authorLi Jun <jun.li@nxp.com>
Wed, 26 Jul 2017 16:39:37 +0000 (00:39 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 20:36:19 +0000 (15:36 -0500)
We need clear any fault alerts to make tcpci controller to recover
from fault.

Reviewed-by: Peter Chen <peter.chen@nxp.com>
Signed-off-by: Li Jun <jun.li@nxp.com>
drivers/staging/typec/tcpci.c
drivers/staging/typec/tcpci.h

index 0e0db86..2b6937a 100644 (file)
@@ -357,6 +357,9 @@ static int tcpci_init(struct tcpc_dev *tcpc)
        if (ret < 0)
                return ret;
 
+       /* Clear fault condition */
+       regmap_write(tcpci->regmap, TCPC_FAULT_STATUS, 0x80);
+
        if (tcpci->controls_vbus)
                reg = TCPC_POWER_STATUS_VBUS_PRES;
        else
@@ -368,7 +371,7 @@ static int tcpci_init(struct tcpc_dev *tcpc)
        reg = TCPC_ALERT_TX_SUCCESS | TCPC_ALERT_TX_FAILED |
                TCPC_ALERT_TX_DISCARDED | TCPC_ALERT_RX_STATUS |
                TCPC_ALERT_RX_HARD_RST | TCPC_ALERT_CC_STATUS |
-               TCPC_ALERT_RX_BUF_OVF;
+               TCPC_ALERT_RX_BUF_OVF | TCPC_ALERT_FAULT;
        if (tcpci->controls_vbus)
                reg |= TCPC_ALERT_POWER_STATUS;
        tcpci->irq_mask = reg;
@@ -433,6 +436,13 @@ static irqreturn_t tcpci_irq(int irq, void *dev_id)
                tcpci_write16(tcpci, TCPC_ALERT,
                        TCPC_ALERT_RX_BUF_OVF | TCPC_ALERT_RX_STATUS);
 
+       /* Clear the fault status anyway */
+       if (status & TCPC_ALERT_FAULT) {
+               regmap_read(tcpci->regmap, TCPC_FAULT_STATUS, &reg);
+               regmap_write(tcpci->regmap, TCPC_FAULT_STATUS,
+                               reg | TCPC_FAULT_STATUS_CLEAR);
+       }
+
        if (status & TCPC_ALERT_RX_HARD_RST)
                tcpm_pd_hard_reset(tcpci->port);
 
index 10b04c8..2f4da3d 100644 (file)
@@ -41,6 +41,7 @@
 #define TCPC_ALERT_MASK                        0x12
 #define TCPC_POWER_STATUS_MASK         0x14
 #define TCPC_FAULT_STATUS_MASK         0x15
+#define TCPC_FAULT_STATUS_CLEAR                BIT(7)
 #define TCPC_CONFIG_STD_OUTPUT         0x18
 
 #define TCPC_TCPC_CTRL                 0x19