summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlec Berg <alecaberg@chromium.org>2015-06-25 14:54:31 -0700
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-06-30 17:18:31 +0000
commit4114b7f1fe2274c0d1321cba8182ade8180599d9 (patch)
tree0ecea72eb813a52c9b9b02c3f8be4a5192a7710a
parent82ec2510a3acebbf47f2c366e2eabff80d87cc07 (diff)
downloadchrome-ec-4114b7f1fe2274c0d1321cba8182ade8180599d9.tar.gz
tcpc: update tcpci registers to latest spec
Update TCPCI registers to version 0.62 of PD Interface specification. BUG=none BRANCH=none TEST=test on glados and samus Change-Id: I57338b385123371e90f3b79b84e652af15be1bf1 Signed-off-by: Alec Berg <alecaberg@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/282067 Reviewed-by: Scott Collyer <scollyer@chromium.org> Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r--common/usb_pd_protocol.c17
-rw-r--r--common/usb_pd_tcpc.c15
-rw-r--r--driver/tcpm/stub.c4
-rw-r--r--driver/tcpm/tcpci.c23
-rw-r--r--driver/tcpm/tcpci.h52
-rw-r--r--include/usb_pd_tcpm.h33
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,
};
/**