From 9236754d16b7a54dcb1449e2b3efd5a0044d9ea8 Mon Sep 17 00:00:00 2001 From: Diana Z Date: Thu, 23 Sep 2021 16:31:33 -0600 Subject: TCPMv2: Set mux to None when detaching When detaching from a port partner, we clear out all alternate mode information, but currently we're not clearing out the mux state reliably. There is a mux state clear in Unattached.SNK, but it should be called any time we're forcibly detaching a port (due to unplug, error recovery, or suspend). BRANCH=None BUG=b:198204468 TEST=on guybrush, suspend a port with a monitor plugged in and verify the mux state goes to None while suspended on voxel, pass tast typec.Mode*.manual Signed-off-by: Diana Z Change-Id: I894d8b9358b357300848c063a0db6f5f22caf12a Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3180267 Reviewed-by: Denis Brockus Commit-Queue: Denis Brockus --- common/usbc/usb_tc_drp_acc_trysrc_sm.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'common') diff --git a/common/usbc/usb_tc_drp_acc_trysrc_sm.c b/common/usbc/usb_tc_drp_acc_trysrc_sm.c index bf7d69bf13..182ea686ec 100644 --- a/common/usbc/usb_tc_drp_acc_trysrc_sm.c +++ b/common/usbc/usb_tc_drp_acc_trysrc_sm.c @@ -724,6 +724,11 @@ static void tc_detached(int port) tc_set_modes_exit(port); if (IS_ENABLED(CONFIG_USB_PRL_SM)) prl_set_default_pd_revision(port); + + /* Clear any mux connection on detach */ + if (IS_ENABLED(CONFIG_USBC_SS_MUX)) + usb_mux_set(port, USB_PD_MUX_NONE, + USB_SWITCH_DISCONNECT, tc[port].polarity); } static inline void pd_set_dual_role_and_event(int port, @@ -2242,10 +2247,6 @@ static void tc_unattached_snk_entry(const int port) pd_execute_data_swap(port, PD_ROLE_DISCONNECTED); pd_timer_enable(port, TC_TIMER_NEXT_ROLE_SWAP, PD_T_DRP_SNK); - if (IS_ENABLED(CONFIG_USBC_SS_MUX)) - usb_mux_set(port, USB_PD_MUX_NONE, - USB_SWITCH_DISCONNECT, tc[port].polarity); - if (IS_ENABLED(CONFIG_USB_PE_SM)) { CLR_FLAGS_ON_DISCONNECT(port); tc_enable_pd(port, 0); -- cgit v1.2.1