summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Brockus <dbrockus@google.com>2020-05-09 13:16:10 -0600
committerCommit Bot <commit-bot@chromium.org>2020-05-11 19:13:41 +0000
commit12c3acd63fd8d73d8254afb48dc72f1deae10142 (patch)
treeca85c2df6c70ae009f04f2842d259c5aafee5063
parent467afef24f49b3f639da2d611a71a0f9007af6c2 (diff)
downloadchrome-ec-12c3acd63fd8d73d8254afb48dc72f1deae10142.tar.gz
tcpmv2: warm start DBG_ACC_SNK correctly
DBG_ACC_SNK connections are warm starting in ATTACHED_SNK and this is not correct. Added BBRMFLG to keep track and jump back to the correct SNK entry state. BUG=none BRANCH=none TEST=connect a DBGACC and reboot should reconnect DBGACC Signed-off-by: Denis Brockus <dbrockus@google.com> Change-Id: I4a17c2487a18ed0e4d58954e8d5ade08b4d44fff Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2191815 Tested-by: Denis Brockus <dbrockus@chromium.org> Reviewed-by: Diana Z <dzigterman@chromium.org> Commit-Queue: Denis Brockus <dbrockus@chromium.org> Auto-Submit: Denis Brockus <dbrockus@chromium.org>
-rw-r--r--common/usbc/usb_tc_drp_acc_trysrc_sm.c27
-rw-r--r--include/usb_pd.h1
2 files changed, 25 insertions, 3 deletions
diff --git a/common/usbc/usb_tc_drp_acc_trysrc_sm.c b/common/usbc/usb_tc_drp_acc_trysrc_sm.c
index dde26301a9..6f3cda307d 100644
--- a/common/usbc/usb_tc_drp_acc_trysrc_sm.c
+++ b/common/usbc/usb_tc_drp_acc_trysrc_sm.c
@@ -1070,7 +1070,10 @@ void tc_state_init(int port)
* change the data role when we get to the state.
*/
TC_SET_FLAG(port, TC_FLAGS_TC_WARM_ATTACHED_SNK);
- set_state_tc(port, TC_ATTACHED_SNK);
+ set_state_tc(port,
+ (saved_flgs[port] & PD_BBRMFLG_DBGACC_ROLE)
+ ? TC_DBG_ACC_SNK
+ : TC_ATTACHED_SNK);
} else {
restart_tc_sm(port, TC_UNATTACHED_SNK);
/*
@@ -2107,6 +2110,9 @@ static void tc_unoriented_dbg_acc_src_entry(const int port)
/* Enable auto discharge disconnect, if not PR Swapping */
if (!TC_CHK_FLAG(port, TC_FLAGS_PR_SWAP_IN_PROGRESS))
tcpm_enable_auto_discharge_disconnect(port, 1);
+
+ /* Save our current connection is a DEBUG ACCESSORY */
+ pd_update_saved_port_flags(port, PD_BBRMFLG_DBGACC_ROLE, 1);
}
static void tc_unoriented_dbg_acc_src_run(const int port)
@@ -2208,6 +2214,9 @@ static void tc_unoriented_dbg_acc_src_exit(const int port)
/* Clear PR swap flag */
TC_CLR_FLAG(port, TC_FLAGS_DO_PR_SWAP);
+
+ /* Save our current connection is not a DEBUG ACCESSORY */
+ pd_update_saved_port_flags(port, PD_BBRMFLG_DBGACC_ROLE, 0);
}
/**
@@ -2247,10 +2256,16 @@ static void tc_dbg_acc_snk_entry(const int port)
pd_set_polarity(port, tc[port].polarity);
/*
- * Initial data role for sink is UFP
+ * Initial data role for sink is UFP unless this is a warm
+ * attach. If it is a warm attach, the data role will be
+ * restored to the current connect role and will already
+ * have called tc_set_data_role with the appropriate role.
* This also sets the usb mux
*/
- tc_set_data_role(port, PD_ROLE_UFP);
+ if (TC_CHK_FLAG(port, TC_FLAGS_TC_WARM_ATTACHED_SNK))
+ TC_CLR_FLAG(port, TC_FLAGS_TC_WARM_ATTACHED_SNK);
+ else
+ tc_set_data_role(port, PD_ROLE_UFP);
if (IS_ENABLED(CONFIG_CHARGE_MANAGER)) {
tc[port].typec_curr =
@@ -2272,6 +2287,9 @@ static void tc_dbg_acc_snk_entry(const int port)
/* Enable auto discharge disconnect, if not PR Swapping */
if (!TC_CHK_FLAG(port, TC_FLAGS_PR_SWAP_IN_PROGRESS))
tcpm_enable_auto_discharge_disconnect(port, 1);
+
+ /* Save our current connection is a DEBUG ACCESSORY */
+ pd_update_saved_port_flags(port, PD_BBRMFLG_DBGACC_ROLE, 1);
}
static void tc_dbg_acc_snk_run(const int port)
@@ -2350,6 +2368,9 @@ static void tc_dbg_acc_snk_exit(const int port)
/* Stop drawing power */
sink_stop_drawing_current(port);
+
+ /* Save our current connection is not a DEBUG ACCESSORY */
+ pd_update_saved_port_flags(port, PD_BBRMFLG_DBGACC_ROLE, 0);
}
/**
diff --git a/include/usb_pd.h b/include/usb_pd.h
index 2ab05ebe2d..f324db8d81 100644
--- a/include/usb_pd.h
+++ b/include/usb_pd.h
@@ -889,6 +889,7 @@ enum pd_states {
#define PD_BBRMFLG_POWER_ROLE BIT(1)
#define PD_BBRMFLG_DATA_ROLE BIT(2)
#define PD_BBRMFLG_VCONN_ROLE BIT(3)
+#define PD_BBRMFLG_DBGACC_ROLE BIT(4)
/* Initial value for CC debounce variable */
#define PD_CC_UNSET -1