From c8371ca4059831d1a409c79cd927e476d621b593 Mon Sep 17 00:00:00 2001 From: Chen Jichang Date: Fri, 16 May 2025 16:14:58 +0800 Subject: [PATCH] fix(mcpwm): only call esp_pm APIs when CONFIG_PM_ENABLE is enabled --- components/esp_driver_mcpwm/src/mcpwm_cap.c | 8 +++++++- components/esp_driver_mcpwm/src/mcpwm_com.c | 2 ++ components/esp_driver_mcpwm/src/mcpwm_private.h | 4 ++++ components/esp_driver_mcpwm/src/mcpwm_timer.c | 8 ++++++-- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/components/esp_driver_mcpwm/src/mcpwm_cap.c b/components/esp_driver_mcpwm/src/mcpwm_cap.c index 85635b2ff4..c46e919fb6 100644 --- a/components/esp_driver_mcpwm/src/mcpwm_cap.c +++ b/components/esp_driver_mcpwm/src/mcpwm_cap.c @@ -52,7 +52,7 @@ static void mcpwm_cap_timer_unregister_from_group(mcpwm_cap_timer_t *cap_timer) static esp_err_t mcpwm_cap_timer_destroy(mcpwm_cap_timer_t *cap_timer) { -#if !SOC_MCPWM_CAPTURE_CLK_FROM_GROUP +#if !SOC_MCPWM_CAPTURE_CLK_FROM_GROUP && CONFIG_PM_ENABLE if (cap_timer->pm_lock) { ESP_RETURN_ON_ERROR(esp_pm_lock_delete(cap_timer->pm_lock), TAG, "delete pm_lock failed"); } @@ -87,7 +87,9 @@ esp_err_t mcpwm_new_capture_timer(const mcpwm_capture_timer_config_t *config, mc #if SOC_MCPWM_CAPTURE_CLK_FROM_GROUP // capture timer clock source is same as the MCPWM group ESP_GOTO_ON_ERROR(mcpwm_select_periph_clock(group, (soc_module_clk_t)clk_src), err, TAG, "set group clock failed"); +#if CONFIG_PM_ENABLE cap_timer->pm_lock = group->pm_lock; +#endif uint32_t periph_src_clk_hz = 0; ESP_GOTO_ON_ERROR(esp_clk_tree_src_get_freq_hz((soc_module_clk_t)clk_src, ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &periph_src_clk_hz), err, TAG, "get clock source freq failed"); ESP_LOGD(TAG, "periph_src_clk_hz %"PRIu32"", periph_src_clk_hz); @@ -157,9 +159,11 @@ esp_err_t mcpwm_capture_timer_enable(mcpwm_cap_timer_handle_t cap_timer) { ESP_RETURN_ON_FALSE(cap_timer, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); ESP_RETURN_ON_FALSE(cap_timer->fsm == MCPWM_CAP_TIMER_FSM_INIT, ESP_ERR_INVALID_STATE, TAG, "timer not in init state"); +#if CONFIG_PM_ENABLE if (cap_timer->pm_lock) { ESP_RETURN_ON_ERROR(esp_pm_lock_acquire(cap_timer->pm_lock), TAG, "acquire pm_lock failed"); } +#endif cap_timer->fsm = MCPWM_CAP_TIMER_FSM_ENABLE; return ESP_OK; } @@ -168,9 +172,11 @@ esp_err_t mcpwm_capture_timer_disable(mcpwm_cap_timer_handle_t cap_timer) { ESP_RETURN_ON_FALSE(cap_timer, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); ESP_RETURN_ON_FALSE(cap_timer->fsm == MCPWM_CAP_TIMER_FSM_ENABLE, ESP_ERR_INVALID_STATE, TAG, "timer not in enable state"); +#if CONFIG_PM_ENABLE if (cap_timer->pm_lock) { ESP_RETURN_ON_ERROR(esp_pm_lock_release(cap_timer->pm_lock), TAG, "release pm_lock failed"); } +#endif cap_timer->fsm = MCPWM_CAP_TIMER_FSM_INIT; return ESP_OK; } diff --git a/components/esp_driver_mcpwm/src/mcpwm_com.c b/components/esp_driver_mcpwm/src/mcpwm_com.c index 6ece740fb5..e13334d9c4 100644 --- a/components/esp_driver_mcpwm/src/mcpwm_com.c +++ b/components/esp_driver_mcpwm/src/mcpwm_com.c @@ -120,9 +120,11 @@ void mcpwm_release_group_handle(mcpwm_group_t *group) MCPWM_RCC_ATOMIC() { mcpwm_ll_enable_bus_clock(group_id, false); } +#if CONFIG_PM_ENABLE if (group->pm_lock) { esp_pm_lock_delete(group->pm_lock); } +#endif #if MCPWM_USE_RETENTION_LINK const periph_retention_module_t module_id = mcpwm_reg_retention_info[group_id].retention_module; if (sleep_retention_is_module_created(module_id)) { diff --git a/components/esp_driver_mcpwm/src/mcpwm_private.h b/components/esp_driver_mcpwm/src/mcpwm_private.h index e8cb1ccbbc..6871184965 100644 --- a/components/esp_driver_mcpwm/src/mcpwm_private.h +++ b/components/esp_driver_mcpwm/src/mcpwm_private.h @@ -83,7 +83,9 @@ struct mcpwm_group_t { portMUX_TYPE spinlock; // group level spinlock uint32_t prescale; // group prescale uint32_t resolution_hz; // MCPWM group clock resolution: clock_src_hz / clock_prescale = resolution_hz +#if CONFIG_PM_ENABLE esp_pm_lock_handle_t pm_lock; // power management lock +#endif soc_module_clk_t clk_src; // peripheral source clock mcpwm_cap_timer_t *cap_timer; // mcpwm capture timers mcpwm_timer_t *timers[SOC_MCPWM_TIMERS_PER_GROUP]; // mcpwm timer array @@ -254,7 +256,9 @@ struct mcpwm_cap_timer_t { portMUX_TYPE spinlock; // spin lock, to prevent concurrently accessing capture timer level resources, including registers uint32_t resolution_hz; // resolution of capture timer mcpwm_cap_timer_fsm_t fsm; // driver FSM +#if CONFIG_PM_ENABLE esp_pm_lock_handle_t pm_lock; // power management lock +#endif mcpwm_cap_channel_t *cap_channels[SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER]; // capture channel array }; diff --git a/components/esp_driver_mcpwm/src/mcpwm_timer.c b/components/esp_driver_mcpwm/src/mcpwm_timer.c index 7dd06af45d..967f9ceb9c 100644 --- a/components/esp_driver_mcpwm/src/mcpwm_timer.c +++ b/components/esp_driver_mcpwm/src/mcpwm_timer.c @@ -247,13 +247,15 @@ esp_err_t mcpwm_timer_enable(mcpwm_timer_handle_t timer) { ESP_RETURN_ON_FALSE(timer, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); ESP_RETURN_ON_FALSE(timer->fsm == MCPWM_TIMER_FSM_INIT, ESP_ERR_INVALID_STATE, TAG, "timer not in init state"); - mcpwm_group_t *group = timer->group; + [[maybe_unused]] mcpwm_group_t *group = timer->group; if (timer->intr) { ESP_RETURN_ON_ERROR(esp_intr_enable(timer->intr), TAG, "enable interrupt failed"); } +#if CONFIG_PM_ENABLE if (group->pm_lock) { ESP_RETURN_ON_ERROR(esp_pm_lock_acquire(group->pm_lock), TAG, "acquire pm lock failed"); } +#endif timer->fsm = MCPWM_TIMER_FSM_ENABLE; return ESP_OK; } @@ -262,13 +264,15 @@ esp_err_t mcpwm_timer_disable(mcpwm_timer_handle_t timer) { ESP_RETURN_ON_FALSE(timer, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); ESP_RETURN_ON_FALSE(timer->fsm == MCPWM_TIMER_FSM_ENABLE, ESP_ERR_INVALID_STATE, TAG, "timer not in enable state"); - mcpwm_group_t *group = timer->group; + [[maybe_unused]] mcpwm_group_t *group = timer->group; if (timer->intr) { ESP_RETURN_ON_ERROR(esp_intr_disable(timer->intr), TAG, "disable interrupt failed"); } +#if CONFIG_PM_ENABLE if (group->pm_lock) { ESP_RETURN_ON_ERROR(esp_pm_lock_release(group->pm_lock), TAG, "acquire pm lock failed"); } +#endif timer->fsm = MCPWM_TIMER_FSM_INIT; return ESP_OK; }