diff options
-rw-r--r-- | common/usb_pd_protocol.c | 17 | ||||
-rw-r--r-- | common/usb_pd_tcpc.c | 15 | ||||
-rw-r--r-- | driver/tcpm/stub.c | 4 | ||||
-rw-r--r-- | driver/tcpm/tcpci.c | 23 | ||||
-rw-r--r-- | driver/tcpm/tcpci.h | 52 | ||||
-rw-r--r-- | include/usb_pd_tcpm.h | 33 |
6 files changed, 70 insertions, 74 deletions
diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c index e22aa29d4e..1d1f71dbbb 100644 --- a/common/usb_pd_protocol.c +++ b/common/usb_pd_protocol.c @@ -1396,8 +1396,8 @@ void pd_task(void) tcpm_get_cc(port, &cc1, &cc2); /* Vnc monitoring */ - if ((TYPEC_CC_IS_RD(cc1) || - TYPEC_CC_IS_RD(cc2)) || + if ((cc1 == TYPEC_CC_VOLT_RD || + cc2 == TYPEC_CC_VOLT_RD) || (cc1 == TYPEC_CC_VOLT_RA && cc2 == TYPEC_CC_VOLT_RA)) { #ifdef CONFIG_USBC_BACKWARDS_COMPATIBLE_DFP @@ -1427,11 +1427,12 @@ void pd_task(void) timeout = 20*MSEC; tcpm_get_cc(port, &cc1, &cc2); - if (TYPEC_CC_IS_RD(cc1) && TYPEC_CC_IS_RD(cc2)) { + if (cc1 == TYPEC_CC_VOLT_RD && + cc2 == TYPEC_CC_VOLT_RD) { /* Debug accessory */ new_cc_state = PD_CC_DEBUG_ACC; - } else if (TYPEC_CC_IS_RD(cc1) || - TYPEC_CC_IS_RD(cc2)) { + } else if (cc1 == TYPEC_CC_VOLT_RD || + cc2 == TYPEC_CC_VOLT_RD) { /* UFP attached */ new_cc_state = PD_CC_UFP_ATTACHED; } else if (cc1 == TYPEC_CC_VOLT_RA && @@ -1462,7 +1463,7 @@ void pd_task(void) /* Debounce complete */ /* UFP is attached */ if (new_cc_state == PD_CC_UFP_ATTACHED) { - pd[port].polarity = (TYPEC_CC_IS_RD(cc2)); + pd[port].polarity = (cc2 == TYPEC_CC_VOLT_RD); tcpm_set_polarity(port, pd[port].polarity); /* initial data role for source is DFP */ @@ -1528,8 +1529,8 @@ void pd_task(void) (cc1 != TYPEC_CC_VOLT_RA || cc2 != TYPEC_CC_VOLT_RA)) || (pd[port].cc_state == PD_CC_DEBUG_ACC && - (!TYPEC_CC_IS_RD(cc1) || - !TYPEC_CC_IS_RD(cc2)))) { + (cc1 != TYPEC_CC_VOLT_RD || + cc2 != TYPEC_CC_VOLT_RD))) { set_state(port, PD_STATE_SRC_DISCONNECTED); #ifdef CONFIG_CASE_CLOSED_DEBUG ccd_set_mode(CCD_MODE_DISABLED); diff --git a/common/usb_pd_tcpc.c b/common/usb_pd_tcpc.c index 1d12620969..54e3ceeca7 100644 --- a/common/usb_pd_tcpc.c +++ b/common/usb_pd_tcpc.c @@ -678,7 +678,7 @@ static int cc_voltage_to_status(int port, int cc_volt) else if (CC_RA(cc_volt)) return TYPEC_CC_VOLT_RA; else - return TYPEC_CC_VOLT_SNK_DEF; + return TYPEC_CC_VOLT_RD; /* If we have a pull-down, then we are sink, check for Rp. */ } #ifdef CONFIG_USB_PD_DUAL_ROLE @@ -1000,17 +1000,12 @@ static int tcpc_i2c_read(int port, int reg, uint8_t *payload) case TCPC_REG_VENDOR_ID: *(uint16_t *)payload = tcpc_vid; return 2; - case TCPC_REG_CC1_STATUS: + case TCPC_REG_CC_STATUS: tcpc_get_cc(port, &cc1, &cc2); payload[0] = TCPC_REG_CC_STATUS_SET( - pd[port].cc_pull == TYPEC_CC_RP ? - TYPEC_CC_TERM_RP_DEF : TYPEC_CC_TERM_RD, - pd[port].cc_status[0]); - payload[1] = TCPC_REG_CC_STATUS_SET( - pd[port].cc_pull == TYPEC_CC_RP ? - TYPEC_CC_TERM_RP_DEF : TYPEC_CC_TERM_RD, - pd[port].cc_status[1]); - return 2; + pd[port].cc_pull == TYPEC_CC_RD, + pd[port].cc_status[0], pd[port].cc_status[1]); + return 1; case TCPC_REG_ROLE_CTRL: payload[0] = TCPC_REG_ROLE_CTRL_SET(0, 0, pd[port].cc_pull, diff --git a/driver/tcpm/stub.c b/driver/tcpm/stub.c index 5fbde334d8..01163a42ff 100644 --- a/driver/tcpm/stub.c +++ b/driver/tcpm/stub.c @@ -131,6 +131,8 @@ void tcpc_alert(int port) } if (status & TCPC_REG_ALERT_TX_COMPLETE) { /* transmit complete */ - pd_transmit_complete(port, status & TCPC_REG_ALERT_TX_COMPLETE); + pd_transmit_complete(port, status & TCPC_REG_ALERT_TX_SUCCESS ? + TCPC_TX_COMPLETE_SUCCESS : + TCPC_TX_COMPLETE_FAILED); } } diff --git a/driver/tcpm/tcpci.c b/driver/tcpm/tcpci.c index 727b41186a..ecb68bbf53 100644 --- a/driver/tcpm/tcpci.c +++ b/driver/tcpm/tcpci.c @@ -59,15 +59,24 @@ int tcpm_get_cc(int port, int *cc1, int *cc2) int status; int rv; - rv = i2c_read16(I2C_PORT_TCPC, I2C_ADDR_TCPC(port), - TCPC_REG_CC1_STATUS, &status); + rv = i2c_read8(I2C_PORT_TCPC, I2C_ADDR_TCPC(port), + TCPC_REG_CC_STATUS, &status); /* If i2c read fails, return error */ if (rv) return rv; - *cc1 = TCPC_REG_CC_STATUS_VOLT(status & 0xff); - *cc2 = TCPC_REG_CC_STATUS_VOLT((status >> 8) & 0xff); + *cc1 = TCPC_REG_CC_STATUS_CC1(status); + *cc2 = TCPC_REG_CC_STATUS_CC2(status); + + /* + * If status is not open, then OR in termination to convert to + * enum tcpc_cc_voltage_status. + */ + if (*cc1 != TYPEC_CC_VOLT_OPEN) + *cc1 |= TCPC_REG_CC_STATUS_TERM(status) << 2; + if (*cc2 != TYPEC_CC_VOLT_OPEN) + *cc2 |= TCPC_REG_CC_STATUS_TERM(status) << 2; return rv; } @@ -150,8 +159,6 @@ int tcpm_get_message(int port, uint32_t *payload, int *head) { int rv, cnt, reg = TCPC_REG_RX_DATA; - /* TODO: need to first read TCPC_REG_RX_STATUS to check if SOP */ - rv = i2c_read8(I2C_PORT_TCPC, I2C_ADDR_TCPC(port), TCPC_REG_RX_BYTE_CNT, &cnt); @@ -232,6 +239,8 @@ void tcpc_alert(int port) } if (status & TCPC_REG_ALERT_TX_COMPLETE) { /* transmit complete */ - pd_transmit_complete(port, status & TCPC_REG_ALERT_TX_COMPLETE); + pd_transmit_complete(port, status & TCPC_REG_ALERT_TX_SUCCESS ? + TCPC_TX_COMPLETE_SUCCESS : + TCPC_TX_COMPLETE_FAILED); } } diff --git a/driver/tcpm/tcpci.h b/driver/tcpm/tcpci.h index 7ede3fe6d7..2863f097c7 100644 --- a/driver/tcpm/tcpci.h +++ b/driver/tcpm/tcpci.h @@ -19,39 +19,43 @@ #define TCPC_REG_DEV_CAP_3 0xe #define TCPC_REG_DEV_CAP_4 0xf #define TCPC_REG_ALERT 0x10 -#define TCPC_REG_ALERT_GPIO_CHANGE (1<<10) -#define TCPC_REG_ALERT_V_ALARM_LO (1<<9) -#define TCPC_REG_ALERT_V_ALARM_HI (1<<8) -#define TCPC_REG_ALERT_SLEEP_EXITED (1<<7) -#define TCPC_REG_ALERT_POWER_STATUS (1<<6) -#define TCPC_REG_ALERT_CC_STATUS (1<<5) -#define TCPC_REG_ALERT_RX_STATUS (1<<4) +#define TCPC_REG_ALERT_TCPC_INITED (1<<14) +#define TCPC_REG_ALERT_INTRFACE_ERR (1<<13) +#define TCPC_REG_ALERT_GPIO_CHANGE (1<<12) +#define TCPC_REG_ALERT_V_CONN_LO (1<<11) +#define TCPC_REG_ALERT_V_ALARM_LO (1<<10) +#define TCPC_REG_ALERT_V_ALARM_HI (1<<9) +#define TCPC_REG_ALERT_SLEEP_EXITED (1<<8) +#define TCPC_REG_ALERT_WAKE_ON_I2C (1<<7) +#define TCPC_REG_ALERT_TX_SUCCESS (1<<6) +#define TCPC_REG_ALERT_TX_DISCARDED (1<<5) +#define TCPC_REG_ALERT_TX_FAILED (1<<4) #define TCPC_REG_ALERT_RX_HARD_RST (1<<3) -#define TCPC_REG_ALERT_TX_SUCCESS (1<<2) -#define TCPC_REG_ALERT_TX_DISCARDED (1<<1) -#define TCPC_REG_ALERT_TX_FAILED (1<<0) +#define TCPC_REG_ALERT_RX_STATUS (1<<2) +#define TCPC_REG_ALERT_POWER_STATUS (1<<1) +#define TCPC_REG_ALERT_CC_STATUS (1<<0) #define TCPC_REG_ALERT_TX_COMPLETE (TCPC_REG_ALERT_TX_SUCCESS | \ TCPC_REG_ALERT_TX_DISCARDED | \ TCPC_REG_ALERT_TX_FAILED) #define TCPC_REG_ALERT_MASK 0x12 #define TCPC_REG_POWER_STATUS_MASK 0x14 -#define TCPC_REG_CC1_STATUS 0x16 -#define TCPC_REG_CC2_STATUS 0x17 -#define TCPC_REG_CC_STATUS_SET(term, volt) \ - ((term) << 3 | volt) -#define TCPC_REG_CC_STATUS_TERM(reg) (((reg) & 0x38) >> 3) -#define TCPC_REG_CC_STATUS_VOLT(reg) ((reg) & 0x7) +#define TCPC_REG_CC_STATUS 0x18 +#define TCPC_REG_CC_STATUS_SET(term, cc1, cc2) \ + ((term) << 4 | ((cc2) & 0x3) << 2 | ((cc1) & 0x3)) +#define TCPC_REG_CC_STATUS_TERM(reg) (((reg) & 0x10) >> 4) +#define TCPC_REG_CC_STATUS_CC2(reg) (((reg) & 0xc) >> 2) +#define TCPC_REG_CC_STATUS_CC1(reg) ((reg) & 0x3) -#define TCPC_REG_POWER_STATUS 0x1a -#define TCPC_REG_ROLE_CTRL 0x1b -#define TCPC_REG_ROLE_CTRL_SET(drp, rp, cc2, cc1) \ +#define TCPC_REG_POWER_STATUS 0x19 +#define TCPC_REG_ROLE_CTRL 0x1a +#define TCPC_REG_ROLE_CTRL_SET(drp, rp, cc1, cc2) \ ((drp) << 6 | (rp) << 4 | (cc2) << 2 | (cc1)) #define TCPC_REG_ROLE_CTRL_CC2(reg) (((reg) & 0xc) >> 2) #define TCPC_REG_ROLE_CTRL_CC1(reg) ((reg) & 0x3) -#define TCPC_REG_POWER_PATH_CTRL 0x1c -#define TCPC_REG_POWER_CTRL 0x1d +#define TCPC_REG_POWER_PATH_CTRL 0x1b +#define TCPC_REG_POWER_CTRL 0x1c #define TCPC_REG_POWER_CTRL_SET(polarity, vconn) \ ((polarity) << 4 | (vconn)) #define TCPC_REG_POWER_CTRL_POLARITY(reg) (((reg) & 0x10) >> 4) @@ -64,10 +68,10 @@ #define TCPC_REG_MSG_HDR_INFO_DROLE(reg) (((reg) & 0x8) >> 3) #define TCPC_REG_MSG_HDR_INFO_PROLE(reg) ((reg) & 0x1) -#define TCPC_REG_RX_BYTE_CNT 0x2f -#define TCPC_REG_RX_STATUS 0x30 -#define TCPC_REG_RX_DETECT 0x31 +#define TCPC_REG_RX_DETECT 0x2f #define TCPC_REG_RX_DETECT_SOP_HRST_MASK 0x21 +#define TCPC_REG_RX_BYTE_CNT 0x30 +#define TCPC_REG_RX_BUF_FRAME_TYPE 0x31 #define TCPC_REG_RX_HDR 0x32 #define TCPC_REG_RX_DATA 0x34 /* through 0x4f */ diff --git a/include/usb_pd_tcpm.h b/include/usb_pd_tcpm.h index 71357e0ac1..bd4803bf03 100644 --- a/include/usb_pd_tcpm.h +++ b/include/usb_pd_tcpm.h @@ -14,30 +14,15 @@ /* Time to wait for TCPC to complete transmit */ #define PD_T_TCPC_TX_TIMEOUT (100*MSEC) -enum tcpc_cc_termination_status { - TYPEC_CC_TERM_RA = 0, - TYPEC_CC_TERM_RP_DEF = 1, - TYPEC_CC_TERM_RP_1_5 = 2, - TYPEC_CC_TERM_RP_3_0 = 3, - TYPEC_CC_TERM_RD = 4, - TYPEC_CC_TERM_VCONN = 5, - TYPEC_CC_TERM_OPEN = 6 -}; enum tcpc_cc_voltage_status { - TYPEC_CC_VOLT_RA = 0, - TYPEC_CC_VOLT_SNK_DEF = 1, - TYPEC_CC_VOLT_SNK_1_5 = 2, - TYPEC_CC_VOLT_SNK_3_0 = 3, - TYPEC_CC_VOLT_SRC_DEF = 4, - TYPEC_CC_VOLT_SRC_1_5 = 5, - TYPEC_CC_VOLT_SRC_3_0 = 6, - TYPEC_CC_VOLT_OPEN = 7 + TYPEC_CC_VOLT_OPEN = 0, + TYPEC_CC_VOLT_RA = 1, + TYPEC_CC_VOLT_RD = 2, + TYPEC_CC_VOLT_SNK_DEF = 5, + TYPEC_CC_VOLT_SNK_1_5 = 6, + TYPEC_CC_VOLT_SNK_3_0 = 7, }; -/* Check if CC voltage is within Rd */ -#define TYPEC_CC_IS_RD(cc) ((cc) >= TYPEC_CC_VOLT_SNK_DEF && \ - (cc) <= TYPEC_CC_VOLT_SNK_3_0) - enum tcpc_cc_pull { TYPEC_CC_RA = 0, TYPEC_CC_RP = 1, @@ -57,9 +42,9 @@ enum tcpm_transmit_type { }; enum tcpc_transmit_complete { - TCPC_TX_COMPLETE_SUCCESS = (1 << 2), - TCPC_TX_COMPLETE_DISCARDED = (1 << 1), - TCPC_TX_COMPLETE_FAILED = (1 << 0), + TCPC_TX_COMPLETE_SUCCESS = 0, + TCPC_TX_COMPLETE_DISCARDED = 1, + TCPC_TX_COMPLETE_FAILED = 2, }; /** |