Skip to content

Commit 2a861ea

Browse files
committed
Merge branch 'feat/support_c5_esp_perip_clk_init' into 'master'
feat: optimize esp32c5 active power consumption Closes IDF-8844 See merge request espressif/esp-idf!36414
2 parents 00038bd + 65b7e70 commit 2a861ea

File tree

55 files changed

+624
-214
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+624
-214
lines changed

components/driver/deprecated/adc_dma_legacy.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ esp_err_t adc_digi_start(void)
480480

481481
adc_hal_digi_init(&s_adc_digi_ctx->hal);
482482
#if !CONFIG_IDF_TARGET_ESP32
483-
esp_clk_tree_enable_src((soc_module_clk_t)(s_adc_digi_ctx->hal_digi_ctrlr_cfg.clk_src), true);
483+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)(s_adc_digi_ctx->hal_digi_ctrlr_cfg.clk_src), true));
484484
#endif
485485
adc_hal_digi_controller_config(&s_adc_digi_ctx->hal, &s_adc_digi_ctx->hal_digi_ctrlr_cfg);
486486

@@ -524,6 +524,7 @@ esp_err_t adc_digi_stop(void)
524524
if (s_adc_digi_ctx->use_adc1) {
525525
adc_lock_release(ADC_UNIT_1);
526526
}
527+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)(s_adc_digi_ctx->hal_digi_ctrlr_cfg.clk_src), false));
527528
sar_periph_ctrl_adc_continuous_power_release();
528529

529530
return ESP_OK;

components/driver/deprecated/adc_legacy.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,7 @@ int adc1_get_raw(adc1_channel_t channel)
756756

757757
adc_apb_periph_claim();
758758
sar_periph_ctrl_adc_oneshot_power_acquire();
759-
esp_clk_tree_enable_src((soc_module_clk_t)ADC_DIGI_CLK_SRC_DEFAULT, true);
759+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)ADC_DIGI_CLK_SRC_DEFAULT, true));
760760
adc_ll_digi_clk_sel(ADC_DIGI_CLK_SRC_DEFAULT);
761761

762762
adc_atten_t atten = s_atten1_single[channel];
@@ -775,6 +775,7 @@ int adc1_get_raw(adc1_channel_t channel)
775775
adc_hal_convert(ADC_UNIT_1, channel, clk_src_freq_hz, &raw_out);
776776
ADC_REG_LOCK_EXIT();
777777

778+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)ADC_DIGI_CLK_SRC_DEFAULT, false));
778779
sar_periph_ctrl_adc_oneshot_power_release();
779780
adc_apb_periph_free();
780781
adc_lock_release(ADC_UNIT_1);
@@ -820,7 +821,7 @@ esp_err_t adc2_get_raw(adc2_channel_t channel, adc_bits_width_t width_bit, int *
820821

821822
adc_apb_periph_claim();
822823
sar_periph_ctrl_adc_oneshot_power_acquire();
823-
esp_clk_tree_enable_src((soc_module_clk_t)ADC_DIGI_CLK_SRC_DEFAULT, true);
824+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)ADC_DIGI_CLK_SRC_DEFAULT, true));
824825
adc_ll_digi_clk_sel(ADC_DIGI_CLK_SRC_DEFAULT);
825826

826827
#if SOC_ADC_ARBITER_SUPPORTED
@@ -838,6 +839,7 @@ esp_err_t adc2_get_raw(adc2_channel_t channel, adc_bits_width_t width_bit, int *
838839
ret = adc_hal_convert(ADC_UNIT_2, channel, clk_src_freq_hz, raw_out);
839840
ADC_REG_LOCK_EXIT();
840841

842+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)ADC_DIGI_CLK_SRC_DEFAULT, false));
841843
sar_periph_ctrl_adc_oneshot_power_release();
842844
adc_apb_periph_free();
843845
adc_lock_release(ADC_UNIT_2);

components/driver/deprecated/mcpwm_legacy.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -470,7 +470,7 @@ esp_err_t mcpwm_init(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, const mcpw
470470
uint32_t group_pre_scale = clk_src_hz / group_resolution;
471471
uint32_t timer_pre_scale = group_resolution / timer_resolution;
472472

473-
esp_clk_tree_enable_src((soc_module_clk_t)MCPWM_CAPTURE_CLK_SRC_DEFAULT, true);
473+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)MCPWM_CAPTURE_CLK_SRC_DEFAULT, true));
474474
MCPWM_CLOCK_SRC_ATOMIC() {
475475
mcpwm_ll_group_set_clock_source(mcpwm_num, (soc_module_clk_t)MCPWM_CAPTURE_CLK_SRC_DEFAULT);
476476
mcpwm_ll_group_set_clock_prescale(mcpwm_num, group_pre_scale);
@@ -868,7 +868,7 @@ esp_err_t mcpwm_capture_enable_channel(mcpwm_unit_t mcpwm_num, mcpwm_capture_cha
868868
uint32_t group_resolution = mcpwm_group_get_resolution(mcpwm_num);
869869
uint32_t group_pre_scale = clk_src_hz / group_resolution;
870870

871-
esp_clk_tree_enable_src((soc_module_clk_t)MCPWM_CAPTURE_CLK_SRC_DEFAULT, true);
871+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)MCPWM_CAPTURE_CLK_SRC_DEFAULT, true));
872872
MCPWM_CLOCK_SRC_ATOMIC() {
873873
mcpwm_ll_group_set_clock_source(mcpwm_num, (soc_module_clk_t)MCPWM_CAPTURE_CLK_SRC_DEFAULT);
874874
mcpwm_ll_group_set_clock_prescale(mcpwm_num, group_pre_scale);
@@ -910,6 +910,7 @@ esp_err_t mcpwm_capture_disable_channel(mcpwm_unit_t mcpwm_num, mcpwm_capture_ch
910910
mcpwm_ll_capture_enable_channel(hal->dev, cap_channel, false);
911911
mcpwm_ll_intr_enable(hal->dev, MCPWM_LL_EVENT_CAPTURE(cap_channel), false);
912912
mcpwm_critical_exit(mcpwm_num);
913+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)MCPWM_CAPTURE_CLK_SRC_DEFAULT, false));
913914

914915
mcpwm_mutex_lock(mcpwm_num);
915916
context[mcpwm_num].cap_isr_func[cap_channel].fn = NULL;

components/driver/deprecated/rmt_legacy.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ esp_err_t rmt_set_source_clk(rmt_channel_t channel, rmt_source_clk_t base_clk)
440440
{
441441
ESP_RETURN_ON_FALSE(channel < RMT_CHANNEL_MAX, ESP_ERR_INVALID_ARG, TAG, RMT_CHANNEL_ERROR_STR);
442442
RMT_ENTER_CRITICAL();
443-
esp_clk_tree_enable_src((soc_module_clk_t)base_clk, true);
443+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)base_clk, true));
444444
// `rmt_clock_source_t` and `rmt_source_clk_t` are binary compatible, as the underlying enum entries come from the same `soc_module_clk_t`
445445
RMT_CLOCK_SRC_ATOMIC() {
446446
rmt_ll_set_group_clock_src(rmt_contex.hal.regs, channel, (rmt_clock_source_t)base_clk, 1, 0, 0);
@@ -606,7 +606,7 @@ static esp_err_t rmt_internal_config(rmt_dev_t *dev, const rmt_config_t *rmt_par
606606
#endif
607607
}
608608
esp_clk_tree_src_get_freq_hz((soc_module_clk_t)clk_src, ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &rmt_source_clk_hz);
609-
esp_clk_tree_enable_src((soc_module_clk_t)clk_src, true);
609+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)clk_src, true));
610610
RMT_CLOCK_SRC_ATOMIC() {
611611
rmt_ll_set_group_clock_src(dev, channel, clk_src, 1, 0, 0);
612612
rmt_ll_enable_group_clock(dev, true);

components/driver/deprecated/timer_legacy.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ esp_err_t timer_init(timer_group_t group_num, timer_idx_t timer_num, const timer
328328
if (config->clk_src) {
329329
clk_src = config->clk_src;
330330
}
331-
esp_clk_tree_enable_src((soc_module_clk_t)clk_src, true);
331+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)clk_src, true));
332332
GPTIMER_CLOCK_SRC_ATOMIC() {
333333
// although `clk_src` is of `timer_src_clk_t` type, but it's binary compatible with `gptimer_clock_source_t`,
334334
// as the underlying enum entries come from the same `soc_module_clk_t`
@@ -364,6 +364,7 @@ esp_err_t timer_deinit(timer_group_t group_num, timer_idx_t timer_num)
364364
GPTIMER_CLOCK_SRC_ATOMIC() {
365365
timer_ll_enable_clock(group_num, hal->timer_id, false);
366366
}
367+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)p_timer_obj[group_num][timer_num]->clk_src, false));
367368
TIMER_ENTER_CRITICAL(&timer_spinlock[group_num]);
368369
timer_ll_enable_intr(hal->dev, TIMER_LL_EVENT_ALARM(timer_num), false);
369370
timer_ll_clear_intr_status(hal->dev, TIMER_LL_EVENT_ALARM(timer_num));

components/esp_adc/adc_continuous.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -321,10 +321,10 @@ esp_err_t adc_continuous_start(adc_continuous_handle_t handle)
321321
adc_hal_set_controller(ADC_UNIT_2, ADC_HAL_CONTINUOUS_READ_MODE);
322322
}
323323

324-
adc_hal_digi_init(&handle->hal);
325324
#if !CONFIG_IDF_TARGET_ESP32
326-
esp_clk_tree_enable_src((soc_module_clk_t)(handle->hal_digi_ctrlr_cfg.clk_src), true);
325+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)(handle->hal_digi_ctrlr_cfg.clk_src), true));
327326
#endif
327+
adc_hal_digi_init(&handle->hal);
328328
adc_hal_digi_controller_config(&handle->hal, &handle->hal_digi_ctrlr_cfg);
329329
adc_hal_digi_enable(false);
330330

@@ -362,7 +362,9 @@ esp_err_t adc_continuous_stop(adc_continuous_handle_t handle)
362362
#endif
363363

364364
adc_hal_digi_deinit();
365-
365+
#if !CONFIG_IDF_TARGET_ESP32
366+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)(handle->hal_digi_ctrlr_cfg.clk_src), false));
367+
#endif
366368
if (handle->use_adc2) {
367369
adc_lock_release(ADC_UNIT_2);
368370
}
@@ -377,7 +379,6 @@ esp_err_t adc_continuous_stop(adc_continuous_handle_t handle)
377379
ESP_RETURN_ON_ERROR(esp_pm_lock_release(handle->pm_lock), ADC_TAG, "release pm_lock failed");
378380
}
379381
#endif
380-
381382
ANALOG_CLOCK_DISABLE();
382383

383384
return ESP_OK;

components/esp_adc/adc_oneshot.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,9 @@ esp_err_t adc_oneshot_new_unit(const adc_oneshot_unit_init_cfg_t *init_config, a
156156
if (init_config->ulp_mode == ADC_ULP_MODE_DISABLE) {
157157
sar_periph_ctrl_adc_oneshot_power_acquire();
158158
} else {
159+
#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
160+
ESP_GOTO_ON_ERROR(esp_clk_tree_enable_src((soc_module_clk_t)(unit->hal.clk_src), true), err, TAG, "clock source enable failed");
161+
#endif
159162
#if SOC_LIGHT_SLEEP_SUPPORTED || SOC_DEEP_SLEEP_SUPPORTED
160163
esp_sleep_sub_mode_config(ESP_SLEEP_USE_ADC_TSEN_MONITOR_MODE, true);
161164
#endif
@@ -189,9 +192,6 @@ esp_err_t adc_oneshot_config_channel(adc_oneshot_unit_handle_t handle, adc_chann
189192
portENTER_CRITICAL(&rtc_spinlock);
190193
adc_oneshot_hal_channel_config(hal, &cfg, channel);
191194
if (handle->ulp_mode) {
192-
#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
193-
esp_clk_tree_enable_src((soc_module_clk_t)(hal->clk_src), true);
194-
#endif
195195
adc_oneshot_hal_setup(hal, channel);
196196
}
197197
portEXIT_CRITICAL(&rtc_spinlock);
@@ -210,7 +210,7 @@ esp_err_t adc_oneshot_read(adc_oneshot_unit_handle_t handle, adc_channel_t chan,
210210
portENTER_CRITICAL(&rtc_spinlock);
211211

212212
#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
213-
esp_clk_tree_enable_src((soc_module_clk_t)(handle->hal.clk_src), true);
213+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)(handle->hal.clk_src), true));
214214
#endif
215215
ANALOG_CLOCK_ENABLE();
216216
adc_oneshot_hal_setup(&(handle->hal), chan);
@@ -222,6 +222,9 @@ esp_err_t adc_oneshot_read(adc_oneshot_unit_handle_t handle, adc_channel_t chan,
222222
bool valid = false;
223223
valid = adc_oneshot_hal_convert(&(handle->hal), out_raw);
224224
ANALOG_CLOCK_DISABLE();
225+
#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
226+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)(handle->hal.clk_src), false));
227+
#endif
225228

226229
portEXIT_CRITICAL(&rtc_spinlock);
227230
adc_lock_release(handle->unit_id);
@@ -238,7 +241,7 @@ esp_err_t adc_oneshot_read_isr(adc_oneshot_unit_handle_t handle, adc_channel_t c
238241
portENTER_CRITICAL_SAFE(&rtc_spinlock);
239242

240243
#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
241-
esp_clk_tree_enable_src((soc_module_clk_t)(handle->hal.clk_src), true);
244+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)(handle->hal.clk_src), true));
242245
#endif
243246
ANALOG_CLOCK_ENABLE();
244247
adc_oneshot_hal_setup(&(handle->hal), chan);
@@ -249,6 +252,9 @@ esp_err_t adc_oneshot_read_isr(adc_oneshot_unit_handle_t handle, adc_channel_t c
249252
#endif
250253
adc_oneshot_hal_convert(&(handle->hal), out_raw);
251254
ANALOG_CLOCK_DISABLE();
255+
#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
256+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)(handle->hal.clk_src), false));
257+
#endif
252258

253259
portEXIT_CRITICAL_SAFE(&rtc_spinlock);
254260

@@ -271,15 +277,16 @@ esp_err_t adc_oneshot_del_unit(adc_oneshot_unit_handle_t handle)
271277
_lock_release(&s_ctx.mutex);
272278

273279
ESP_LOGD(TAG, "adc unit%"PRId32" is deleted", handle->unit_id);
274-
free(handle);
275280

276281
if (ulp_mode == ADC_ULP_MODE_DISABLE) {
277282
sar_periph_ctrl_adc_oneshot_power_release();
278283
} else {
279284
#if SOC_LIGHT_SLEEP_SUPPORTED || SOC_DEEP_SLEEP_SUPPORTED
280285
esp_sleep_sub_mode_config(ESP_SLEEP_USE_ADC_TSEN_MONITOR_MODE, false);
281286
#endif
287+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)(handle->hal.clk_src), false));
282288
}
289+
free(handle);
283290

284291
#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
285292
//To free the APB_SARADC periph if needed

components/esp_driver_cam/csi/src/esp_cam_ctlr_csi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ esp_err_t esp_cam_new_csi_ctlr(const esp_cam_ctlr_csi_config_t *config, esp_cam_
119119
#endif
120120

121121
mipi_csi_phy_clock_source_t clk_src = !config->clk_src ? MIPI_CSI_PHY_CLK_SRC_DEFAULT : config->clk_src;
122-
esp_clk_tree_enable_src((soc_module_clk_t)clk_src, true);
122+
ESP_GOTO_ON_ERROR(esp_clk_tree_enable_src((soc_module_clk_t)clk_src, true), err, TAG, "clock source enable failed");
123123
PERIPH_RCC_ATOMIC() {
124124
// phy clock source setting
125125
mipi_csi_ll_set_phy_clock_source(ctlr->csi_id, clk_src);

components/esp_driver_cam/dvp/src/esp_cam_ctlr_dvp_cam.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ esp_err_t esp_cam_ctlr_dvp_init(int ctlr_id, cam_clock_source_t clk_src, const e
332332
}
333333
}
334334

335-
esp_clk_tree_enable_src((soc_module_clk_t)clk_src, true);
335+
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)clk_src, true));
336336
PERIPH_RCC_ATOMIC() {
337337
cam_ll_enable_clk(ctlr_id, true);
338338
cam_ll_select_clk_src(ctlr_id, clk_src);

components/esp_driver_gptimer/src/gptimer.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ static void gptimer_unregister_from_group(gptimer_t *timer)
108108

109109
static esp_err_t gptimer_destroy(gptimer_t *timer)
110110
{
111+
if (timer->clk_src) {
112+
ESP_RETURN_ON_ERROR(esp_clk_tree_enable_src((soc_module_clk_t)(timer->clk_src), false), TAG, "clock source disable failed");
113+
}
111114
#if CONFIG_PM_ENABLE
112115
if (timer->pm_lock) {
113116
ESP_RETURN_ON_ERROR(esp_pm_lock_delete(timer->pm_lock), TAG, "delete pm_lock failed");
@@ -157,6 +160,7 @@ esp_err_t gptimer_new_timer(const gptimer_config_t *config, gptimer_handle_t *re
157160
// initialize HAL layer
158161
timer_hal_init(&timer->hal, group_id, timer_id);
159162
// select clock source, set clock resolution
163+
ESP_GOTO_ON_ERROR(esp_clk_tree_enable_src((soc_module_clk_t)config->clk_src, true), err, TAG, "clock source enable failed");
160164
ESP_GOTO_ON_ERROR(gptimer_select_periph_clock(timer, config->clk_src, config->resolution_hz), err, TAG, "set periph clock failed");
161165
// initialize counter value to zero
162166
timer_hal_set_counter_value(&timer->hal, 0);

0 commit comments

Comments
 (0)