summaryrefslogtreecommitdiff
path: root/driver/tcpm/rt1718s.c
diff options
context:
space:
mode:
authorTing Shen <phoenixshen@google.com>2021-04-23 18:22:20 +0800
committerCommit Bot <commit-bot@chromium.org>2021-08-03 08:47:37 +0000
commit7f714b91bb02ecc9afeff4c0a4da65ea8294af31 (patch)
treed881a332f90cb7c7830a9486580ce4f11ad9e753 /driver/tcpm/rt1718s.c
parentb690911962e0c0b73243f388209fa1c2d22e7d9d (diff)
downloadchrome-ec-7f714b91bb02ecc9afeff4c0a4da65ea8294af31.tar.gz
tcpm/rt1718s: implement software workaround
Implement the software workarounds suggested by Richtek. See issue link for details. BUG=b:194982205 TEST=On Cherry & Tomato, manually verify PD works BRANCH=main Signed-off-by: Ting Shen <phoenixshen@google.com> Change-Id: I7d9c6c5fd3c9266f27e52c1756a7ecedc75f1846 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2848280 Reviewed-by: Eric Yilun Lin <yllin@google.com> Commit-Queue: Ting Shen <phoenixshen@chromium.org> Tested-by: Ting Shen <phoenixshen@chromium.org>
Diffstat (limited to 'driver/tcpm/rt1718s.c')
-rw-r--r--driver/tcpm/rt1718s.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/driver/tcpm/rt1718s.c b/driver/tcpm/rt1718s.c
index ea5fd3229c..a2e05838de 100644
--- a/driver/tcpm/rt1718s.c
+++ b/driver/tcpm/rt1718s.c
@@ -155,6 +155,39 @@ static int rt1718s_bc12_init(int port)
return EC_SUCCESS;
}
+static int rt1718s_workaround(int port)
+{
+ int device_id;
+
+ RETURN_ERROR(tcpc_read16(port, RT1718S_DEVICE_ID, &device_id));
+
+ switch (device_id) {
+ case RT1718S_DEVICE_ID_ES1:
+ RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_VCONN_CONTROL_3,
+ RT1718S_VCONN_CONTROL_3_VCONN_OVP_DEG,
+ 0xFF));
+ /* fallthrough */
+ case RT1718S_DEVICE_ID_ES2:
+ RETURN_ERROR(rt1718s_update_bits8(port, TCPC_REG_FAULT_CTRL,
+ TCPC_REG_FAULT_CTRL_VBUS_OCP_FAULT_DIS,
+ 0xFF));
+ RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_VCON_CTRL4,
+ RT1718S_VCON_CTRL4_UVP_CP_EN |
+ RT1718S_VCON_CTRL4_OVP_CP_EN,
+ 0));
+ RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_VCONN_CONTROL_2,
+ RT1718S_VCONN_CONTROL_2_OVP_EN_CC1 |
+ RT1718S_VCONN_CONTROL_2_OVP_EN_CC2,
+ 0xFF));
+ break;
+ default:
+ /* do nothing */
+ break;
+ }
+
+ return EC_SUCCESS;
+}
+
static int rt1718s_init(int port)
{
static bool need_sw_reset = true;
@@ -194,6 +227,7 @@ static int rt1718s_init(int port)
RETURN_ERROR(tcpci_tcpm_init(port));
+ RETURN_ERROR(rt1718s_workaround(port));
/*
* Set vendor defined alert unmasked, this must be done after
* tcpci_tcpm_init.
@@ -310,6 +344,19 @@ void rt1718s_vendor_defined_alert(int port)
if (value & RT1718S_RT_INT6_INT_BC12_SNK_DONE)
task_set_event(USB_CHG_PORT_TO_TASK_ID(port),
USB_CHG_EVENT_BC12);
+
+ /* clear the alerts from rt1718s_workaround() */
+ rv = rt1718s_write8(port, RT1718S_RT_INT2, 0xFF);
+ if (rv)
+ return;
+ /* ES1 workaround: disable Vconn discharge */
+ rv = rt1718s_update_bits8(port, RT1718S_SYS_CTRL2,
+ RT1718S_SYS_CTRL2_VCONN_DISCHARGE_EN,
+ 0);
+ if (rv)
+ return;
+
+ tcpc_write16(port, TCPC_REG_ALERT, TCPC_REG_ALERT_VENDOR_DEF);
}
static void rt1718s_alert(int port)