diff options
-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 | ||||
-rw-r--r-- | driver/tcpm/tcpm.h | 5 | ||||
-rw-r--r-- | include/usb_common.h | 9 |
5 files changed, 42 insertions, 24 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 diff --git a/driver/tcpm/tcpm.h b/driver/tcpm/tcpm.h index 5701a83d01..2c53e03d5d 100644 --- a/driver/tcpm/tcpm.h +++ b/driver/tcpm/tcpm.h @@ -267,6 +267,11 @@ static inline int tcpm_enable_drp_toggle(int port) { return tcpc_config[port].drv->drp_toggle(port); } +#else +static inline int tcpm_auto_toggle_supported(int port) +{ + return false; +} #endif #ifdef CONFIG_USB_PD_TCPC_LOW_POWER diff --git a/include/usb_common.h b/include/usb_common.h index 09957e6191..078f4b0029 100644 --- a/include/usb_common.h +++ b/include/usb_common.h @@ -12,7 +12,9 @@ enum pd_drp_next_states { DRP_TC_DEFAULT, DRP_TC_UNATTACHED_SNK, + DRP_TC_ATTACHED_WAIT_SNK, DRP_TC_UNATTACHED_SRC, + DRP_TC_ATTACHED_WAIT_SRC, DRP_TC_DRP_AUTO_TOGGLE }; @@ -25,11 +27,16 @@ enum pd_drp_next_states { * @param drp_state dual role states * @param cc1 value of CC1 set by tcpm_get_cc * @param cc2 value of CC2 set by tcpm_get_cc + * @param auto_toggle_supported indicates hardware auto toggle support. + * Hardware auto toggle support will perform the + * unattached to attached debouncing before notifying + * us of a connection. * */ enum pd_drp_next_states drp_auto_toggle_next_state(uint64_t *drp_sink_time, 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 cc1, enum tcpc_cc_voltage_status cc2, + bool auto_toggle_supported); enum pd_pref_type { /* prefer voltage larger than or equal to pd_pref_config.mv */ |