summaryrefslogtreecommitdiff
path: root/driver/tcpm/rt1718s.c
diff options
context:
space:
mode:
authorFiras Sammoura <fsammoura@google.com>2022-06-17 16:41:11 +0000
committerFiras Sammoura <fsammoura@google.com>2022-06-17 16:41:11 +0000
commit6c1587ca70f558b4f96b3f0b18ad8b027d3ba99d (patch)
tree9a15b4a98d7987870a1805a33883d0cf9123fc05 /driver/tcpm/rt1718s.c
parent63a8a1366e390b757c37e167927102be0fc4fb63 (diff)
parenta46d3f3feaac0d69012f61b66f652bff991d05a7 (diff)
downloadchrome-ec-6c1587ca70f558b4f96b3f0b18ad8b027d3ba99d.tar.gz
Merge remote-tracking branch cros/main into firmware-fpmcu-dartmonkey-release
Generated by: ./util/update_release_branch.py --board dartmonkey --relevant_paths_file ./util/fingerprint-relevant-paths.txt firmware-fpmcu-dartmonkey-release Relevant changes: git log --oneline 63a8a1366e..a46d3f3fea -- board/nocturne_fp board/dartmonkey common/fpsensor docs/fingerprint driver/fingerprint util/getversion.sh 981fb88cf8 docs/fingerprint: Resolve contradictory FPMCU factory flashing instructions 60032a8828 docs/fingerprint: Clean up formatting in fingerprint-factory-quick-guide.md f49eb6f894 docs/fingerprint: Run mdformat 64aa5fc7bb docs/fingerprint: Add links to info on fuzz testing 8bd99cc434 fpsensor: Use correct return type 2b2d7a991d fpsensor: Use correct return type BRANCH=None BUG=b:234772776 b:234181908 TEST=`make -j buildall` Cq-Include-Trybots: chromeos/cq:cq-orchestrator Signed-off-by: Firas Sammoura <fsammoura@google.com> Change-Id: I1714a77d292aad81bdc71982c88b2b067cfdada7
Diffstat (limited to 'driver/tcpm/rt1718s.c')
-rw-r--r--driver/tcpm/rt1718s.c63
1 files changed, 61 insertions, 2 deletions
diff --git a/driver/tcpm/rt1718s.c b/driver/tcpm/rt1718s.c
index d90e09805d..e985419668 100644
--- a/driver/tcpm/rt1718s.c
+++ b/driver/tcpm/rt1718s.c
@@ -207,7 +207,7 @@ static int rt1718s_workaround(int port)
0xFF));
RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_VCON_CTRL4,
RT1718S_VCON_CTRL4_UVP_CP_EN |
- RT1718S_VCON_CTRL4_OVP_CP_EN,
+ RT1718S_VCON_CTRL4_OCP_CP_EN,
0));
RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_VCONN_CONTROL_2,
RT1718S_VCONN_CONTROL_2_OVP_EN_CC1 |
@@ -222,6 +222,42 @@ static int rt1718s_workaround(int port)
return EC_SUCCESS;
}
+static int rt1718s_set_vconn(int port, int enable)
+{
+ if (enable) {
+ /*
+ * b/233698718#comment9: The initial output spike will be likely
+ * trigger the Vconn OCP. Workaround this by disabling the OCP
+ * at the beginning of sourcing Vconn, and then enable OCP back
+ * after Vconn sourced.
+ */
+ RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_VCON_CTRL3,
+ RT1718S_VCON_LIMIT_MODE,
+ 0xFF));
+
+ /* Enable Vconn RVP */
+ RETURN_ERROR(rt1718s_update_bits8(
+ port, RT1718S_VCONN_CONTROL_2,
+ RT1718S_VCONN_CONTROL_2_RVP_EN, 0xFF));
+ }
+
+ RETURN_ERROR(tcpci_tcpm_set_vconn(port, enable));
+
+ if (enable) {
+ /* It takes 10ms that we can switch back to shutdown mode. */
+ msleep(10);
+ RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_VCON_CTRL3,
+ RT1718S_VCON_LIMIT_MODE, 0));
+ } else {
+ /* Disable Vconn RVP */
+ RETURN_ERROR(rt1718s_update_bits8(
+ port, RT1718S_VCONN_CONTROL_2,
+ RT1718S_VCONN_CONTROL_2_RVP_EN, 0x0));
+ }
+
+ return EC_SUCCESS;
+}
+
static int rt1718s_init(int port)
{
static bool need_sw_reset = true;
@@ -242,6 +278,10 @@ static int rt1718s_init(int port)
RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_VCONN_CONTROL_3,
RT1718S_VCONN_CONTROL_3_VCONN_OCP_SEL, 0x7F));
+ /* Increase the Vconn OCP shoot detection from 200ns to 3~5us */
+ RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_VCON_CTRL4,
+ RT1718S_VCON_CTRL4_OCP_CP_EN, 0));
+
/* Disable FOD function */
RETURN_ERROR(rt1718s_update_bits8(port, 0xCF, 0x40, 0x00));
@@ -722,6 +762,22 @@ static int command_rt1718s_gpio(int argc, char **argv)
}
DECLARE_CONSOLE_COMMAND(rt1718s_gpio, command_rt1718s_gpio, "", "RT1718S GPIO");
+#ifdef CONFIG_USB_PD_TCPM_SBU
+static int rt1718s_set_sbu(int port, bool enable)
+{
+ /*
+ * The `enable` here means to enable the SBU line (set 1)
+ * - true: connect SBU lines from outer to the host
+ * - false: isolate the SBU lines
+ */
+ return rt1718s_update_bits8(port, RT1718S_RT2_SBU_CTRL_01,
+ RT1718S_RT2_SBU_CTRL_01_SBU_VIEN |
+ RT1718S_RT2_SBU_CTRL_01_SBU1_SWEN |
+ RT1718S_RT2_SBU_CTRL_01_SBU2_SWEN,
+ enable ? 0xFF : 0);
+}
+#endif
+
/* RT1718S is a TCPCI compatible port controller */
const struct tcpm_drv rt1718s_tcpm_drv = {
.init = &rt1718s_init,
@@ -736,7 +792,7 @@ const struct tcpm_drv rt1718s_tcpm_drv = {
#ifdef CONFIG_USB_PD_DECODE_SOP
.sop_prime_enable = &tcpci_tcpm_sop_prime_enable,
#endif
- .set_vconn = &tcpci_tcpm_set_vconn,
+ .set_vconn = &rt1718s_set_vconn,
.set_msg_header = &tcpci_tcpm_set_msg_header,
.set_rx_enable = &tcpci_tcpm_set_rx_enable,
.get_message_raw = &tcpci_tcpm_get_message_raw,
@@ -758,6 +814,9 @@ const struct tcpm_drv rt1718s_tcpm_drv = {
.set_frs_enable = &rt1718s_set_frs_enable,
#endif
.set_bist_test_mode = &tcpci_set_bist_test_mode,
+#ifdef CONFIG_USB_PD_TCPM_SBU
+ .set_sbu = &rt1718s_set_sbu,
+#endif
};
const struct bc12_drv rt1718s_bc12_drv = {