diff options
author | Rob Barnes <robbarnes@google.com> | 2021-01-29 07:20:54 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-05-26 00:15:34 +0000 |
commit | b657c3e96d1809e82554f8c859afffba358a3567 (patch) | |
tree | 96ffeeda502d3b2fbec7cf472a56d0370c6d5c1c /common/usbc/usb_tc_drp_acc_trysrc_sm.c | |
parent | 4304fe55704c5234545d06223f9c632e5b9fe8d4 (diff) | |
download | chrome-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.c | 31 |
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) |