diff options
author | Joe Bauman <joe.bauman@fairchildsemi.com> | 2016-02-29 12:01:43 -0500 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-03-03 17:04:47 -0800 |
commit | 28334368a8185155de6756213d06c0f53093810b (patch) | |
tree | c06941c165bd1fbb805b92a114b1e53026aa7edb | |
parent | fc715ba428e044519e80078652d70d239fe340c3 (diff) | |
download | chrome-ec-28334368a8185155de6756213d06c0f53093810b.tar.gz |
fusb302: update driver for FUSB302B
Update pull-ups code
Manage BIST Test Data bit
BUG=none
BRANCH=none
TEST=PD contract established with various devices
Signed-off-by: Joe Bauman <joe.bauman@fairchildsemi.com>
Change-Id: Ib2e5f7f5e29f280835ae890148f5c3dd2504a2f9
Reviewed-on: https://chromium-review.googlesource.com/329034
Commit-Ready: Vincent Palatin <vpalatin@chromium.org>
Tested-by: Vincent Palatin <vpalatin@chromium.org>
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r-- | driver/tcpm/fusb302.c | 85 | ||||
-rw-r--r-- | driver/tcpm/fusb302.h | 5 |
2 files changed, 75 insertions, 15 deletions
diff --git a/driver/tcpm/fusb302.c b/driver/tcpm/fusb302.c index 294df7e4dd..fc584ac339 100644 --- a/driver/tcpm/fusb302.c +++ b/driver/tcpm/fusb302.c @@ -28,6 +28,7 @@ static struct fusb302_chip_state { int togdone_pullup_cc1; int togdone_pullup_cc2; int tx_hard_reset_req; + int device_id; } state[CONFIG_USB_PD_PORT_COUNT]; /* bring the FUSB302 out of reset after Hard Reset signaling */ @@ -104,10 +105,17 @@ static void detect_cc_pin_source(int port, int *cc1_lvl, int *cc2_lvl) if (state[port].togdone_pullup_cc1 == 1) { /* Measure CC1 */ - /* Enable CC1 measurement switch and pullup */ - tcpc_write(port, TCPC_REG_SWITCHES0, - TCPC_REG_SWITCHES0_CC1_PU_EN | - TCPC_REG_SWITCHES0_MEAS_CC1); + /* Enable CC1 measurement switch and pullup(s) */ + if (state[port].device_id == FUSB302_DEVID_302A) { + tcpc_write(port, TCPC_REG_SWITCHES0, + TCPC_REG_SWITCHES0_CC1_PU_EN | + TCPC_REG_SWITCHES0_MEAS_CC1); + } else { + tcpc_write(port, TCPC_REG_SWITCHES0, + TCPC_REG_SWITCHES0_CC1_PU_EN | + TCPC_REG_SWITCHES0_CC2_PU_EN | + TCPC_REG_SWITCHES0_MEAS_CC1); + } /* Set MDAC Value to High. MDAC Reg is 7:2 */ tcpc_write(port, TCPC_REG_MEASURE, 0x26 << 2); @@ -142,9 +150,16 @@ static void detect_cc_pin_source(int port, int *cc1_lvl, int *cc2_lvl) /* Measure CC2 */ /* Enable CC2 measurement switch and pullup */ - tcpc_write(port, TCPC_REG_SWITCHES0, - TCPC_REG_SWITCHES0_CC2_PU_EN | - TCPC_REG_SWITCHES0_MEAS_CC2); + if (state[port].device_id == FUSB302_DEVID_302A) { + tcpc_write(port, TCPC_REG_SWITCHES0, + TCPC_REG_SWITCHES0_CC2_PU_EN | + TCPC_REG_SWITCHES0_MEAS_CC2); + } else { + tcpc_write(port, TCPC_REG_SWITCHES0, + TCPC_REG_SWITCHES0_CC1_PU_EN | + TCPC_REG_SWITCHES0_CC2_PU_EN | + TCPC_REG_SWITCHES0_MEAS_CC2); + } /* Set MDAC Value to High. MDAC Reg is 7:2 */ tcpc_write(port, TCPC_REG_MEASURE, 0x26 << 2); @@ -337,6 +352,10 @@ int tcpm_init(int port) /* all other variables assumed to default to 0 */ + /* Read the DeviceID register to get the chip version */ + tcpc_read(port, TCPC_REG_DEVICE_ID, ®); + state[port].device_id = (reg & 0xF0) >> 4; + /* Restore default settings */ tcpc_write(port, TCPC_REG_RESET, TCPC_REG_RESET_SW_RESET); @@ -453,10 +472,15 @@ int tcpm_set_cc(int port, int pull) reg &= ~TCPC_REG_SWITCHES0_CC1_PD_EN; reg &= ~TCPC_REG_SWITCHES0_CC2_PD_EN; - if (state[port].togdone_pullup_cc1) - reg |= TCPC_REG_SWITCHES0_CC1_PU_EN; - else - reg |= TCPC_REG_SWITCHES0_CC2_PU_EN; + if (state[port].device_id == FUSB302_DEVID_302A) { + if (state[port].togdone_pullup_cc1) + reg |= TCPC_REG_SWITCHES0_CC1_PU_EN; + else + reg |= TCPC_REG_SWITCHES0_CC2_PU_EN; + } else { + reg |= TCPC_REG_SWITCHES0_CC1_PU_EN | + TCPC_REG_SWITCHES0_CC2_PU_EN; + } tcpc_write(port, TCPC_REG_SWITCHES0, reg); @@ -877,10 +901,15 @@ void tcpc_alert(int port) reg &= ~TCPC_REG_SWITCHES0_CC1_PD_EN; reg &= ~TCPC_REG_SWITCHES0_CC2_PD_EN; - if (state[port].togdone_pullup_cc1) - reg |= TCPC_REG_SWITCHES0_CC1_PU_EN; - else - reg |= TCPC_REG_SWITCHES0_CC2_PU_EN; + if (state[port].device_id == FUSB302_DEVID_302A) { + if (state[port].togdone_pullup_cc1) + reg |= TCPC_REG_SWITCHES0_CC1_PU_EN; + else + reg |= TCPC_REG_SWITCHES0_CC2_PU_EN; + } else { + reg |= TCPC_REG_SWITCHES0_CC1_PU_EN | + TCPC_REG_SWITCHES0_CC2_PU_EN; + } tcpc_write(port, TCPC_REG_SWITCHES0, reg); } @@ -926,3 +955,29 @@ void tcpc_alert(int port) } } + +void tcpm_set_bist_test_data(int port) +{ + int reg; + + /* 302B Only */ + if (state[port].device_id == FUSB302_DEVID_302B) { + /* Read control3 register */ + tcpc_read(port, TCPC_REG_CONTROL3, ®); + + /* Set the BIST_TMODE bit (Clears on Hard Reset) */ + reg |= TCPC_REG_CONTROL3_BIST_TMODE; + + /* Write the updated value */ + tcpc_write(port, TCPC_REG_CONTROL3, reg); + } else { + /* + * For the 302A, in this test mode, we want to disable + * the protocol layer (don't respond to messages), and + * repeatedly write the CONTROL1_RX_FLUSH bit to clear + * the receive FIFO and allow the part to continue + * sending GoodCRC messages automatically. + */ + } +} + diff --git a/driver/tcpm/fusb302.h b/driver/tcpm/fusb302.h index 1da1a6a0bf..7537df909a 100644 --- a/driver/tcpm/fusb302.h +++ b/driver/tcpm/fusb302.h @@ -10,6 +10,10 @@ #ifndef __CROS_EC_DRIVER_TCPM_FUSB302_H #define __CROS_EC_DRIVER_TCPM_FUSB302_H +/* Chip Device ID - 302A or 302B */ +#define FUSB302_DEVID_302A 0x08 +#define FUSB302_DEVID_302B 0x09 + /* I2C slave address varies by part number */ /* FUSB302BUCX / FUSB302BMPX */ #define FUSB302_I2C_SLAVE_ADDR 0x44 @@ -78,6 +82,7 @@ #define TCPC_REG_CONTROL3 0x09 #define TCPC_REG_CONTROL3_SEND_HARDRESET (1<<6) +#define TCPC_REG_CONTROL3_BIST_TMODE (1<<5) /* 302B Only */ #define TCPC_REG_CONTROL3_AUTO_HARDRESET (1<<4) #define TCPC_REG_CONTROL3_AUTO_SOFTRESET (1<<3) /* two-bit field */ |