summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Brockus <dbrockus@google.com>2020-06-23 20:07:46 -0600
committerCommit Bot <commit-bot@chromium.org>2020-06-24 19:49:47 +0000
commit7c3980117e84cf3557a909806bddb376dfb74817 (patch)
treec58569df148219f9d4edf7c0a75ea6d472c43ed6
parent7a100e971ad453dbbdfc30736d0e276b16067abc (diff)
downloadchrome-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>
-rw-r--r--common/usb_common.c11
-rw-r--r--common/usb_pd_protocol.c10
-rw-r--r--common/usbc/usb_tc_drp_acc_trysrc_sm.c31
-rw-r--r--driver/tcpm/tcpm.h5
-rw-r--r--include/usb_common.h9
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 */