diff options
-rw-r--r-- | driver/tcpm/tcpci.c | 50 | ||||
-rw-r--r-- | driver/tcpm/tcpci.h | 8 |
2 files changed, 41 insertions, 17 deletions
diff --git a/driver/tcpm/tcpci.c b/driver/tcpm/tcpci.c index 001a7ee579..9a0e45f1df 100644 --- a/driver/tcpm/tcpci.c +++ b/driver/tcpm/tcpci.c @@ -622,6 +622,34 @@ static int register_mask_reset(int port) } #endif +static int tcpci_get_fault(int port, int *fault) +{ + int rv; + + rv = tcpc_read(port, TCPC_REG_FAULT_STATUS, fault); + if (rv) + CPRINTS("C%d Reading FAULT failed, rv=%d", port, rv); + + return rv; +} + +static int tcpci_handle_fault(int port, int fault) +{ + CPRINTS("C%d FAULT 0x%02X detected", port, fault); + return EC_SUCCESS; +} + +static int tcpci_clear_fault(int port, int fault) +{ + int rv; + + rv = tcpc_write(port, TCPC_REG_FAULT_STATUS, fault); + if (rv) + CPRINTS("C%d Writing FAULT failed, rv=%d", port, rv); + + return rv; +} + /* * Don't let the TCPC try to pull from the RX buffer forever. We typical only * have 1 or 2 messages waiting. @@ -645,23 +673,11 @@ void tcpci_tcpc_alert(int port) /* Clear any pending faults */ if (status & TCPC_REG_ALERT_FAULT) { int fault; - int fault_rv; - - fault_rv = tcpc_read(port, TCPC_REG_FAULT_STATUS, &fault); - if (!fault_rv) { - CPRINTS("C%d FAULT=0x%02X", port, fault); - - /* Clear any faults that are set */ - fault_rv = tcpc_write(port, - TCPC_REG_FAULT_STATUS, - fault); - if (fault_rv) - CPRINTS("C%d Writing FAULT failed, rv=%d", - port, fault_rv); - } else { - CPRINTS("C%d Reading FAULT failed, rv=%d", - port, fault_rv); - } + + if (tcpci_get_fault(port, &fault) == EC_SUCCESS && + tcpci_handle_fault(port, fault) == EC_SUCCESS && + tcpci_clear_fault(port, fault) == EC_SUCCESS) + CPRINTS("C%d FAULT 0x%02X handled", port, fault); } /* diff --git a/driver/tcpm/tcpci.h b/driver/tcpm/tcpci.h index 930bfd6d70..81baba83bb 100644 --- a/driver/tcpm/tcpci.h +++ b/driver/tcpm/tcpci.h @@ -89,6 +89,14 @@ #define TCPC_REG_POWER_STATUS_VBUS_PRES BIT(2) #define TCPC_REG_FAULT_STATUS 0x1f +#define TCPC_REG_FAULT_STATUS_ALL_REGS_RESET BIT(7) +#define TCPC_REG_FAULT_STATUS_FORCE_OFF_VBUS BIT(6) +#define TCPC_REG_FAULT_STATUS_AUTO_DISCHARGE_FAIL BIT(5) +#define TCPC_REG_FAULT_STATUS_FORCE_DISCHARGE_FAIL BIT(4) +#define TCPC_REG_FAULT_STATUS_VBUS_OVER_CURRENT BIT(3) +#define TCPC_REG_FAULT_STATUS_VBUS_OVER_VOLTAGE BIT(2) +#define TCPC_REG_FAULT_STATUS_VCONN_OVER_CURRENT BIT(1) +#define TCPC_REG_FAULT_STATUS_I2C_INTERFACE_ERR BIT(0) #define TCPC_REG_ALERT_EXT 0x21 #define TCPC_REG_ALERT_EXT_TIMER_EXPIRED BIT(2) |