summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorDenis Brockus <dbrockus@google.com>2021-02-18 12:50:29 -0700
committerCommit Bot <commit-bot@chromium.org>2021-03-02 00:13:30 +0000
commit198834ed267b7ea742fe1438c95e40e35d1097e0 (patch)
treeb49e94235bd5056514fb01d79a6f6c2ef0545165 /common
parentad70e9e230b290fe8b52871ead1059adcae32e99 (diff)
downloadchrome-ec-198834ed267b7ea742fe1438c95e40e35d1097e0.tar.gz
TCPMv2: PD Timers - Add PE PSSourceTimer to framework
BUG=b:178029034 BRANCH=none TEST=make runtests Signed-off-by: Denis Brockus <dbrockus@google.com> Change-Id: Ie7b6dfb64fb419c43f71493f5de44a6e90b8542a Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2707903 Commit-Queue: Denis Brockus <dbrockus@chromium.org> Tested-by: Denis Brockus <dbrockus@chromium.org> Reviewed-by: Diana Z <dzigterman@chromium.org>
Diffstat (limited to 'common')
-rw-r--r--common/usbc/usb_pe_drp_sm.c60
1 files changed, 29 insertions, 31 deletions
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c
index be7df932a3..f7e8eeb9a9 100644
--- a/common/usbc/usb_pe_drp_sm.c
+++ b/common/usbc/usb_pe_drp_sm.c
@@ -632,19 +632,6 @@ static struct policy_engine {
uint64_t pr_swap_wait_timer;
/*
- * This timer combines the PSSourceOffTimer and PSSourceOnTimer timers.
- * For PSSourceOffTimer, when this DRP device is currently acting as a
- * Sink, this timer times out on a PS_RDY Message during a Power Role
- * Swap sequence.
- *
- * For PSSourceOnTimer, when this DRP device is currently acting as a
- * Source that has just stopped sourcing power and is waiting to start
- * sinking power to timeout on a PS_RDY Message during a Power Role
- * Swap.
- */
- uint64_t ps_source_timer;
-
- /*
* This timer is used by the new Source, after a Power Role Swap or
* Fast Role Swap, to ensure that it does not send Source_Capabilities
* Message before the new Sink is ready to receive the
@@ -4343,18 +4330,23 @@ static void pe_prs_src_snk_transition_to_off_entry(int port)
/* Tell TypeC to power off the source */
tc_src_power_off(port);
- pe[port].ps_source_timer =
- get_time().val + PD_POWER_SUPPLY_TURN_OFF_DELAY;
+ pd_timer_enable(port, PE_TIMER_PS_SOURCE,
+ PD_POWER_SUPPLY_TURN_OFF_DELAY);
}
static void pe_prs_src_snk_transition_to_off_run(int port)
{
/* Give time for supply to power off */
- if (get_time().val > pe[port].ps_source_timer &&
+ if (pd_timer_is_expired(port, PE_TIMER_PS_SOURCE) &&
pd_check_vbus_level(port, VBUS_SAFE0V))
set_state_pe(port, PE_PRS_SRC_SNK_ASSERT_RD);
}
+static void pe_prs_src_snk_transition_to_off_exit(int port)
+{
+ pd_timer_disable(port, PE_TIMER_PS_SOURCE);
+}
+
/**
* PE_PRS_SRC_SNK_Assert_Rd
*/
@@ -4380,25 +4372,24 @@ static void pe_prs_src_snk_wait_source_on_entry(int port)
{
print_current_state(port);
send_ctrl_msg(port, TCPC_TX_SOP, PD_CTRL_PS_RDY);
- pe[port].ps_source_timer = TIMER_DISABLED;
}
static void pe_prs_src_snk_wait_source_on_run(int port)
{
- if (pe[port].ps_source_timer == TIMER_DISABLED &&
- PE_CHK_FLAG(port, PE_FLAGS_TX_COMPLETE)) {
+ if (pd_timer_is_disabled(port, PE_TIMER_PS_SOURCE) &&
+ PE_CHK_FLAG(port, PE_FLAGS_TX_COMPLETE)) {
PE_CLR_FLAG(port, PE_FLAGS_TX_COMPLETE);
/* Update pe power role */
pe[port].power_role = pd_get_power_role(port);
- pe[port].ps_source_timer = get_time().val + PD_T_PS_SOURCE_ON;
+ pd_timer_enable(port, PE_TIMER_PS_SOURCE, PD_T_PS_SOURCE_ON);
}
/*
* Transition to PE_SNK_Startup when:
* 1) A PS_RDY Message is received.
*/
- if (pe[port].ps_source_timer != TIMER_DISABLED &&
+ if (!pd_timer_is_disabled(port, PE_TIMER_PS_SOURCE) &&
PE_CHK_FLAG(port, PE_FLAGS_MSG_RECEIVED)) {
int type = PD_HEADER_TYPE(rx_emsg[port].header);
int cnt = PD_HEADER_CNT(rx_emsg[port].header);
@@ -4407,8 +4398,6 @@ static void pe_prs_src_snk_wait_source_on_run(int port)
PE_CLR_FLAG(port, PE_FLAGS_MSG_RECEIVED);
if ((ext == 0) && (cnt == 0) && (type == PD_CTRL_PS_RDY)) {
- pe[port].ps_source_timer = TIMER_DISABLED;
-
PE_SET_FLAG(port, PE_FLAGS_PR_SWAP_COMPLETE);
set_state_pe(port, PE_SNK_STARTUP);
} else {
@@ -4428,7 +4417,7 @@ static void pe_prs_src_snk_wait_source_on_run(int port)
* 1) The PSSourceOnTimer times out.
* 2) PS_RDY not sent after retries.
*/
- if (get_time().val > pe[port].ps_source_timer ||
+ if (pd_timer_is_expired(port, PE_TIMER_PS_SOURCE) ||
PE_CHK_FLAG(port, PE_FLAGS_PROTOCOL_ERROR)) {
PE_CLR_FLAG(port, PE_FLAGS_PROTOCOL_ERROR);
@@ -4439,6 +4428,7 @@ static void pe_prs_src_snk_wait_source_on_run(int port)
static void pe_prs_src_snk_wait_source_on_exit(int port)
{
+ pd_timer_disable(port, PE_TIMER_PS_SOURCE);
tc_pr_swap_complete(port,
PE_CHK_FLAG(port, PE_FLAGS_PR_SWAP_COMPLETE));
}
@@ -4594,7 +4584,7 @@ static void pe_prs_snk_src_transition_to_off_entry(int port)
!pe_in_frs_mode(port))
tc_snk_power_off(port);
- pe[port].ps_source_timer = get_time().val + PD_T_PS_SOURCE_OFF;
+ pd_timer_enable(port, PE_TIMER_PS_SOURCE, PD_T_PS_SOURCE_OFF);
}
static void pe_prs_snk_src_transition_to_off_run(int port)
@@ -4607,7 +4597,7 @@ static void pe_prs_snk_src_transition_to_off_run(int port)
* Transition to ErrorRecovery state when:
* 1) The PSSourceOffTimer times out.
*/
- if (get_time().val > pe[port].ps_source_timer)
+ if (pd_timer_is_expired(port, PE_TIMER_PS_SOURCE))
set_state_pe(port, PE_WAIT_FOR_ERROR_RECOVERY);
/*
@@ -4632,6 +4622,11 @@ static void pe_prs_snk_src_transition_to_off_run(int port)
}
}
+static void pe_prs_snk_src_transition_to_off_exit(int port)
+{
+ pd_timer_disable(port, PE_TIMER_PS_SOURCE);
+}
+
/**
* PE_PRS_SNK_SRC_Assert_Rp
* PE_FRS_SNK_SRC_Assert_Rp
@@ -4676,22 +4671,22 @@ static void pe_prs_snk_src_source_on_entry(int port)
* VBUS was enabled when the TypeC state machine entered
* Attached.SRC state
*/
- pe[port].ps_source_timer = get_time().val +
- PD_POWER_SUPPLY_TURN_ON_DELAY;
+ pd_timer_enable(port, PE_TIMER_PS_SOURCE,
+ PD_POWER_SUPPLY_TURN_ON_DELAY);
}
static void pe_prs_snk_src_source_on_run(int port)
{
/* Wait until power supply turns on */
- if (pe[port].ps_source_timer != TIMER_DISABLED) {
- if (get_time().val < pe[port].ps_source_timer)
+ if (!pd_timer_is_disabled(port, PE_TIMER_PS_SOURCE)) {
+ if (!pd_timer_is_expired(port, PE_TIMER_PS_SOURCE))
return;
/* update pe power role */
pe[port].power_role = pd_get_power_role(port);
send_ctrl_msg(port, TCPC_TX_SOP, PD_CTRL_PS_RDY);
/* reset timer so PD_CTRL_PS_RDY isn't sent again */
- pe[port].ps_source_timer = TIMER_DISABLED;
+ pd_timer_disable(port, PE_TIMER_PS_SOURCE);
}
/*
@@ -4714,6 +4709,7 @@ static void pe_prs_snk_src_source_on_run(int port)
static void pe_prs_snk_src_source_on_exit(int port)
{
+ pd_timer_disable(port, PE_TIMER_PS_SOURCE);
tc_pr_swap_complete(port,
PE_CHK_FLAG(port, PE_FLAGS_PR_SWAP_COMPLETE));
}
@@ -6957,6 +6953,7 @@ static __const_data const struct usb_state pe_states[] = {
[PE_PRS_SRC_SNK_TRANSITION_TO_OFF] = {
.entry = pe_prs_src_snk_transition_to_off_entry,
.run = pe_prs_src_snk_transition_to_off_run,
+ .exit = pe_prs_src_snk_transition_to_off_exit,
},
[PE_PRS_SRC_SNK_ASSERT_RD] = {
.entry = pe_prs_src_snk_assert_rd_entry,
@@ -6984,6 +6981,7 @@ static __const_data const struct usb_state pe_states[] = {
[PE_PRS_SNK_SRC_TRANSITION_TO_OFF] = {
.entry = pe_prs_snk_src_transition_to_off_entry,
.run = pe_prs_snk_src_transition_to_off_run,
+ .exit = pe_prs_snk_src_transition_to_off_exit,
#ifdef CONFIG_USB_PD_REV30
.parent = &pe_states[PE_PRS_FRS_SHARED],
#endif /* CONFIG_USB_PD_REV30 */