diff options
author | Xin Ji <xji@analogixsemi.com> | 2020-02-20 16:10:16 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-03-16 19:39:53 +0000 |
commit | 20188601a1cd3b4be8a89f4e3b3ef812fb619545 (patch) | |
tree | 4cd2a865c5dfeb2c1692f28e3b1ab2ac5475d6a1 | |
parent | f409bbb092789fa01dfa25875fd625ad9d46bc0e (diff) | |
download | chrome-ec-20188601a1cd3b4be8a89f4e3b3ef812fb619545.tar.gz |
anx7447.c: anx7447/anx3447 has an additional condition(0xAA:bit6) for Look4connection command
0xAA:bit6 default value is 1. When writing Look4connection command
to toggle CC, this bit shall be set to "0"; when TCPM found CC is connected,
this bit shall be set to "1" again
BRANCH=none
BUG=b:146318582
TEST=Manually testing as following:
Attached C to hdmi dongle that works as expected.
Attached charger, make sure DUT can be charged as expected.
Attached with HP USB-C/A Universal Dock G2, make sure
DUT can be charged and can't see tcpc timeout.
Change-Id: Ic75ebc5b126cb464a999f195fd6d2089d820e5e1
Signed-off-by: Xin Ji <xji@analogixsemi.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2065783
Tested-by: Devin Lu <Devin.Lu@quantatw.com>
Reviewed-by: Diana Z <dzigterman@chromium.org>
Reviewed-by: S Wang <swang@analogix.corp-partner.google.com>
Commit-Queue: Tim Wawrzynczak <twawrzynczak@chromium.org>
-rw-r--r-- | driver/tcpm/anx7447.c | 41 | ||||
-rw-r--r-- | driver/tcpm/anx7447.h | 2 |
2 files changed, 41 insertions, 2 deletions
diff --git a/driver/tcpm/anx7447.c b/driver/tcpm/anx7447.c index a093aa9094..e83ca32d9b 100644 --- a/driver/tcpm/anx7447.c +++ b/driver/tcpm/anx7447.c @@ -652,10 +652,47 @@ static int anx7447_mux_get(const struct usb_mux *me, mux_state_t *mux_state) } #endif /* CONFIG_USB_PD_TCPM_MUX */ +#ifdef CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE +static int anx7447_tcpc_drp_toggle(int port) +{ + int rv, reg; + + rv = tcpc_read(port, ANX7447_REG_ANALOG_CTRL_10, ®); + if (rv) + return rv; + /* + * When using Look4Connection command to toggle CC under normal mode + * the CABLE_DET_DIG shall be clear first. + */ + if (reg & ANX7447_REG_CABLE_DET_DIG) { + reg &= ~ANX7447_REG_CABLE_DET_DIG; + rv = tcpc_write(port, ANX7447_REG_ANALOG_CTRL_10, reg); + if (rv) + return rv; + } + + return tcpci_tcpc_drp_toggle(port); +} +#endif + /* Override for tcpci_tcpm_set_cc */ static int anx7447_set_cc(int port, int pull) { - int rp; + int rp, reg; + + rp = tcpc_read(port, ANX7447_REG_ANALOG_CTRL_10, ®); + if (rp) + return rp; + /* + * When setting CC status, should be confirm that the CC toggling + * process is stopped, the CABLE_DET_DIG shall be set to one. + */ + if ((reg & ANX7447_REG_CABLE_DET_DIG) == 0) { + reg |= ANX7447_REG_CABLE_DET_DIG; + rp = tcpc_write(port, ANX7447_REG_ANALOG_CTRL_10, reg); + if (rp) + return rp; + } rp = tcpci_get_cached_rp(port); @@ -702,7 +739,7 @@ const struct tcpm_drv anx7447_tcpm_drv = { .tcpc_discharge_vbus = &tcpci_tcpc_discharge_vbus, #endif #ifdef CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE - .drp_toggle = &tcpci_tcpc_drp_toggle, + .drp_toggle = anx7447_tcpc_drp_toggle, #endif .get_chip_info = &tcpci_get_chip_info, #ifdef CONFIG_USBC_PPC diff --git a/driver/tcpm/anx7447.h b/driver/tcpm/anx7447.h index 849b3c3189..049b82d4bb 100644 --- a/driver/tcpm/anx7447.h +++ b/driver/tcpm/anx7447.h @@ -41,6 +41,8 @@ #define ANX7447_REG_VCONN_OCP_440mA 0x0C #define ANX7447_REG_ANALOG_CTRL_10 0xAA +#define ANX7447_REG_CABLE_DET_DIG 0x40 + #define ANX7447_REG_R_VCONN_PWR_PRT_INRUSH_TIME_MASK 0x38 #define ANX7447_REG_R_VCONN_PWR_PRT_INRUSH_TIME_19US 0x00 #define ANX7447_REG_R_VCONN_PWR_PRT_INRUSH_TIME_38US 0x08 |