summaryrefslogtreecommitdiff
path: root/common/usbc/usb_tc_drp_acc_trysrc_sm.c
diff options
context:
space:
mode:
authorRob Barnes <robbarnes@google.com>2021-01-29 07:20:54 -0700
committerCommit Bot <commit-bot@chromium.org>2021-05-26 00:15:34 +0000
commitb657c3e96d1809e82554f8c859afffba358a3567 (patch)
tree96ffeeda502d3b2fbec7cf472a56d0370c6d5c1c /common/usbc/usb_tc_drp_acc_trysrc_sm.c
parent4304fe55704c5234545d06223f9c632e5b9fe8d4 (diff)
downloadchrome-ec-b657c3e96d1809e82554f8c859afffba358a3567.tar.gz
usb_common: Assert CCD_MODE when DTS connected
Drive CCD_MODE_ODL from EC when EC sees DTS connected to CCD port. This will fix some cases where the Cr50 is not able to detect that a CCD debug cable has been connected. BUG=b:175056327 TEST=Connect/disconnect SuzyQ cable, see assert/unassert in log Check gpioget on CR50 and ec, confirm CCD_MODE_ODL is correct Connect/disconnect charger, do not see assert/unassert in log Repeat with ServoV4 BRANCH=None Change-Id: I411e75a47f2e1303ddbd9caa63a9417630c99b46 Signed-off-by: Rob Barnes <robbarnes@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2659282 Reviewed-by: Denis Brockus <dbrockus@chromium.org>
Diffstat (limited to 'common/usbc/usb_tc_drp_acc_trysrc_sm.c')
-rw-r--r--common/usbc/usb_tc_drp_acc_trysrc_sm.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/common/usbc/usb_tc_drp_acc_trysrc_sm.c b/common/usbc/usb_tc_drp_acc_trysrc_sm.c
index b73b8ecf25..2fba18a970 100644
--- a/common/usbc/usb_tc_drp_acc_trysrc_sm.c
+++ b/common/usbc/usb_tc_drp_acc_trysrc_sm.c
@@ -223,6 +223,16 @@ GEN_NOT_SUPPORTED(TC_CT_ATTACHED_SNK);
#endif /* CONFIG_USB_PE_SM */
/*
+ * If CONFIG_ASSERT_CCD_MODE_ON_DTS_CONNECT is not defined then
+ * _GPIO_CCD_MODE_ODL is not needed. Declare as extern so IS_ENABLED will work.
+ */
+#ifndef CONFIG_ASSERT_CCD_MODE_ON_DTS_CONNECT
+extern int _GPIO_CCD_MODE_ODL;
+#else
+#define _GPIO_CCD_MODE_ODL GPIO_CCD_MODE_ODL
+#endif /* CONFIG_ASSERT_CCD_MODE_ON_DTS_CONNECT */
+
+/*
* We will use DEBUG LABELS if we will be able to print (COMMON RUNTIME)
* and either CONFIG_USB_PD_DEBUG_LEVEL is not defined (no override) or
* we are overriding and the level is not DISABLED.
@@ -434,6 +444,7 @@ static void set_vconn(int port, int enable);
static __maybe_unused int reset_device_and_notify(int port);
static __maybe_unused void check_drp_connection(const int port);
static void sink_power_sub_states(int port);
+static void set_ccd_mode(int port, bool enable);
__maybe_unused static void handle_new_power_state(int port);
@@ -707,6 +718,7 @@ static void tc_detached(int port)
hook_notify(HOOK_USB_PD_DISCONNECT);
tc_pd_connection(port, 0);
tcpm_debug_accessory(port, 0);
+ set_ccd_mode(port, 0);
tc_set_modes_exit(port);
if (IS_ENABLED(CONFIG_USB_PRL_SM))
prl_set_default_pd_revision(port);
@@ -1611,6 +1623,17 @@ void tc_set_power_role(int port, enum pd_power_role role)
* Private Functions
*/
+/* Set GPIO_CCD_MODE_ODL gpio */
+static void set_ccd_mode(const int port, const bool enable)
+{
+ if (IS_ENABLED(CONFIG_ASSERT_CCD_MODE_ON_DTS_CONNECT) &&
+ port == CONFIG_CCD_USBC_PORT_NUMBER) {
+ if (enable)
+ CPRINTS("Asserting GPIO_CCD_MODE_ODL");
+ gpio_set_level(_GPIO_CCD_MODE_ODL, !enable);
+ }
+}
+
/* Set the TypeC state machine to a new state. */
static void set_state_tc(const int port, const enum usb_tc_state new_state)
{
@@ -2449,8 +2472,10 @@ static void tc_attached_snk_entry(const int port)
if (IS_ENABLED(CONFIG_USB_PE_SM))
tc_enable_pd(port, 1);
- if (TC_CHK_FLAG(port, TC_FLAGS_TS_DTS_PARTNER))
+ if (TC_CHK_FLAG(port, TC_FLAGS_TS_DTS_PARTNER)) {
tcpm_debug_accessory(port, 1);
+ set_ccd_mode(port, 1);
+ }
}
/*
@@ -3023,8 +3048,10 @@ static void tc_attached_src_entry(const int port)
hook_notify(HOOK_USB_PD_CONNECT);
}
- if (TC_CHK_FLAG(port, TC_FLAGS_TS_DTS_PARTNER))
+ if (TC_CHK_FLAG(port, TC_FLAGS_TS_DTS_PARTNER)) {
tcpm_debug_accessory(port, 1);
+ set_ccd_mode(port, 1);
+ }
}
static void tc_attached_src_run(const int port)