summaryrefslogtreecommitdiff
path: root/driver/tcpm/anx7447.c
diff options
context:
space:
mode:
authorXin Ji <xji@analogixsemi.com>2020-02-20 16:10:16 +0800
committerCommit Bot <commit-bot@chromium.org>2020-03-16 19:39:53 +0000
commit20188601a1cd3b4be8a89f4e3b3ef812fb619545 (patch)
tree4cd2a865c5dfeb2c1692f28e3b1ab2ac5475d6a1 /driver/tcpm/anx7447.c
parentf409bbb092789fa01dfa25875fd625ad9d46bc0e (diff)
downloadchrome-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>
Diffstat (limited to 'driver/tcpm/anx7447.c')
-rw-r--r--driver/tcpm/anx7447.c41
1 files changed, 39 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, &reg);
+ 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, &reg);
+ 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