summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--driver/tcpm/tcpci.c50
-rw-r--r--driver/tcpm/tcpci.h8
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)