From c27a3a31d32f7cd8c11860de0cc96e804c3840c3 Mon Sep 17 00:00:00 2001 From: Sam Hurst Date: Fri, 23 Dec 2022 13:52:08 -0800 Subject: [PATCH] usb_c: Fix DPM request handlers Processing the common DPM request handler in the Sink DPM request handler. Signed-off-by: Sam Hurst --- subsys/usb/usb_c/usbc_pe_common.c | 13 +++++++------ subsys/usb/usb_c/usbc_pe_common_internal.h | 8 ++++++++ subsys/usb/usb_c/usbc_pe_snk_states.c | 15 +++++++++++---- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/subsys/usb/usb_c/usbc_pe_common.c b/subsys/usb/usb_c/usbc_pe_common.c index 23499072c97..0f8540e16f7 100644 --- a/subsys/usb/usb_c/usbc_pe_common.c +++ b/subsys/usb/usb_c/usbc_pe_common.c @@ -21,7 +21,7 @@ static const struct smf_state pe_states[]; /** * @brief Handle common DPM requests * - * @retval True if the request was handled, else False + * @retval true if request was handled, else false */ bool common_dpm_requests(const struct device *dev) { @@ -33,10 +33,11 @@ bool common_dpm_requests(const struct device *dev) if (pe->dpm_request == REQUEST_PE_DR_SWAP) { pe_set_state(dev, PE_DRS_SEND_SWAP); + return true; } else if (pe->dpm_request == REQUEST_PE_SOFT_RESET_SEND) { pe_set_state(dev, PE_SEND_SOFT_RESET); + return true; } - return true; } return false; @@ -143,6 +144,9 @@ void pe_run(const struct device *dev, const int32_t dpm_request) break; } + /* Get any DPM Requests */ + pe->dpm_request = dpm_request; + /* * 8.3.3.3.8 PE_SNK_Hard_Reset State * The Policy Engine Shall transition to the PE_SNK_Hard_Reset @@ -151,14 +155,11 @@ void pe_run(const struct device *dev, const int32_t dpm_request) */ if (dpm_request == REQUEST_PE_HARD_RESET_SEND) { pe_set_state(dev, PE_SNK_HARD_RESET); - } else { - /* Pass the DPM request along to the state machine */ - pe->dpm_request = dpm_request; - common_dpm_requests(dev); } /* Run state machine */ smf_run_state(SMF_CTX(pe)); + break; } } diff --git a/subsys/usb/usb_c/usbc_pe_common_internal.h b/subsys/usb/usb_c/usbc_pe_common_internal.h index 62bf93fb1f0..fd19837200c 100644 --- a/subsys/usb/usb_c/usbc_pe_common_internal.h +++ b/subsys/usb/usb_c/usbc_pe_common_internal.h @@ -310,4 +310,12 @@ bool policy_is_snk_at_default(const struct device *dev); */ void policy_get_snk_cap(const struct device *dev, uint32_t **pdos, int *num_pdos); +/** + * @brief Handle common DPM requests + * + * @param dev Pointer to the device structure for the driver instance + * @retval true if request was handled, else false + */ +bool common_dpm_requests(const struct device *dev); + #endif /* ZEPHYR_SUBSYS_USBC_PE_COMMON_INTERNAL_H_ */ diff --git a/subsys/usb/usb_c/usbc_pe_snk_states.c b/subsys/usb/usb_c/usbc_pe_snk_states.c index 178126a1856..49362cd0573 100644 --- a/subsys/usb/usb_c/usbc_pe_snk_states.c +++ b/subsys/usb/usb_c/usbc_pe_snk_states.c @@ -18,21 +18,28 @@ LOG_MODULE_DECLARE(usbc_stack, CONFIG_USBC_STACK_LOG_LEVEL); /** * @brief Handle sink-specific DPM requests */ -bool sink_dpm_requests(const struct device *dev) +void sink_dpm_requests(const struct device *dev) { struct usbc_port_data *data = dev->data; struct policy_engine *pe = data->pe; + /* + * Handle any common DPM Requests + */ + if (common_dpm_requests(dev)) { + return; + } + + /* + * Handle Sink DPM Requests + */ if (pe->dpm_request > REQUEST_TC_END) { atomic_set_bit(pe->flags, PE_FLAGS_DPM_INITIATED_AMS); if (pe->dpm_request == REQUEST_PE_GET_SRC_CAPS) { pe_set_state(dev, PE_SNK_GET_SOURCE_CAP); } - return true; } - - return false; } /**