diff options
author | Denis Brockus <dbrockus@google.com> | 2020-06-23 20:07:46 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-06-24 19:49:47 +0000 |
commit | 7c3980117e84cf3557a909806bddb376dfb74817 (patch) | |
tree | c58569df148219f9d4edf7c0a75ea6d472c43ed6 /common | |
parent | 7a100e971ad453dbbdfc30736d0e276b16067abc (diff) | |
download | chrome-ec-7c3980117e84cf3557a909806bddb376dfb74817.tar.gz |
tcpm: add attached_wait decision to common after auto-toggle
Need to verify auto toggle connections and non auto
toggle connections still work. I will verify on
trembyle
BUG=b:159736927
BRANCH=none
TEST=check basic functionality
Signed-off-by: Denis Brockus <dbrockus@google.com>
Change-Id: I378ddf520026591d8129986078875ce46f1e0ad8
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2264472
Tested-by: Denis Brockus <dbrockus@chromium.org>
Reviewed-by: Jett Rink <jettrink@chromium.org>
Commit-Queue: Jett Rink <jettrink@chromium.org>
Auto-Submit: Denis Brockus <dbrockus@chromium.org>
Diffstat (limited to 'common')
-rw-r--r-- | common/usb_common.c | 11 | ||||
-rw-r--r-- | common/usb_pd_protocol.c | 10 | ||||
-rw-r--r-- | common/usbc/usb_tc_drp_acc_trysrc_sm.c | 31 |
3 files changed, 29 insertions, 23 deletions
diff --git a/common/usb_common.c b/common/usb_common.c index 5339e293df..9c1c980a8c 100644 --- a/common/usb_common.c +++ b/common/usb_common.c @@ -307,8 +307,13 @@ enum pd_drp_next_states drp_auto_toggle_next_state( enum pd_power_role power_role, enum pd_dual_role_states drp_state, enum tcpc_cc_voltage_status cc1, - enum tcpc_cc_voltage_status cc2) + enum tcpc_cc_voltage_status cc2, + bool auto_toggle_supported) { + const bool hardware_debounced_unattached = + ((drp_state == PD_DRP_TOGGLE_ON) && + auto_toggle_supported); + /* Set to appropriate port state */ if (cc_is_open(cc1, cc2)) { /* @@ -336,6 +341,8 @@ enum pd_drp_next_states drp_auto_toggle_next_state( } else if ((cc_is_rp(cc1) || cc_is_rp(cc2)) && drp_state != PD_DRP_FORCE_SOURCE) { /* SNK allowed unless ForceSRC */ + if (hardware_debounced_unattached) + return DRP_TC_ATTACHED_WAIT_SNK; return DRP_TC_UNATTACHED_SNK; } else if (cc_is_at_least_one_rd(cc1, cc2) || cc_is_audio_acc(cc1, cc2)) { @@ -362,6 +369,8 @@ enum pd_drp_next_states drp_auto_toggle_next_state( else return DRP_TC_DRP_AUTO_TOGGLE; } else { + if (hardware_debounced_unattached) + return DRP_TC_ATTACHED_WAIT_SRC; return DRP_TC_UNATTACHED_SRC; } } else { diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c index 99d1e33ae1..151e4b50aa 100644 --- a/common/usb_pd_protocol.c +++ b/common/usb_pd_protocol.c @@ -4668,14 +4668,20 @@ void pd_task(void *u) break; #endif - /* Check for connection */ + /* + * Check for connection + * + * Send FALSE for supports_auto_toggle to not change + * the current return value of UNATTACHED instead of + * the auto-toggle ATTACHED_WAIT response for TCPMv1. + */ tcpm_get_cc(port, &cc1, &cc2); next_state = drp_auto_toggle_next_state( &pd[port].drp_sink_time, pd[port].power_role, drp_state[port], - cc1, cc2); + cc1, cc2, false); #ifdef CONFIG_USB_PD_TCPC_LOW_POWER /* diff --git a/common/usbc/usb_tc_drp_acc_trysrc_sm.c b/common/usbc/usb_tc_drp_acc_trysrc_sm.c index e912f013d0..9d17e2f10c 100644 --- a/common/usbc/usb_tc_drp_acc_trysrc_sm.c +++ b/common/usbc/usb_tc_drp_acc_trysrc_sm.c @@ -2764,13 +2764,10 @@ static __maybe_unused void check_drp_connection(const int port) tc[port].drp_sink_time = get_time().val; - /* - * TODO(b:159736927) add ATTACHED_WAIT states to possible next states - * - * Get the next toggle state - */ + /* Get the next toggle state */ next_state = drp_auto_toggle_next_state(&tc[port].drp_sink_time, - tc[port].power_role, drp_state[port], cc1, cc2); + tc[port].power_role, drp_state[port], cc1, cc2, + tcpm_auto_toggle_supported(port)); if (next_state == DRP_TC_DEFAULT) next_state = (PD_ROLE_DEFAULT(port) == PD_ROLE_SOURCE) @@ -2779,22 +2776,16 @@ static __maybe_unused void check_drp_connection(const int port) switch (next_state) { case DRP_TC_UNATTACHED_SNK: -#ifdef CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE - if (drp_state[port] == PD_DRP_TOGGLE_ON && - tcpm_auto_toggle_supported(port)) - set_state_tc(port, TC_ATTACH_WAIT_SNK); - else -#endif - set_state_tc(port, TC_UNATTACHED_SNK); + set_state_tc(port, TC_UNATTACHED_SNK); + break; + case DRP_TC_ATTACHED_WAIT_SNK: + set_state_tc(port, TC_ATTACH_WAIT_SNK); break; case DRP_TC_UNATTACHED_SRC: -#ifdef CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE - if (drp_state[port] == PD_DRP_TOGGLE_ON && - tcpm_auto_toggle_supported(port)) - set_state_tc(port, TC_ATTACH_WAIT_SRC); - else -#endif - set_state_tc(port, TC_UNATTACHED_SRC); + set_state_tc(port, TC_UNATTACHED_SRC); + break; + case DRP_TC_ATTACHED_WAIT_SRC: + set_state_tc(port, TC_ATTACH_WAIT_SRC); break; #ifdef CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE |