Skip to content

Commit 6787566

Browse files
erwangocfriedt
authored andcommitted
drivers/clock_control: u5: Add utility to set voltage scaling
Voltage scaling computation should be done in multiple cases. Add a function that takes into account all cases. Signed-off-by: Erwan Gouriou <[email protected]>
1 parent f7f67de commit 6787566

File tree

1 file changed

+21
-11
lines changed

1 file changed

+21
-11
lines changed

drivers/clock_control/clock_stm32_ll_u5.c

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,21 @@ static struct clock_control_driver_api stm32_clock_control_api = {
211211
.get_rate = stm32_clock_control_get_subsys_rate,
212212
};
213213

214+
static void set_regu_voltage(uint32_t hclk_freq)
215+
{
216+
if (hclk_freq < MHZ(25)) {
217+
LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE4);
218+
} else if (hclk_freq < MHZ(55)) {
219+
LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE3);
220+
} else if (hclk_freq < MHZ(110)) {
221+
LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE2);
222+
} else {
223+
LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
224+
}
225+
while (LL_PWR_IsActiveFlag_VOS() == 0) {
226+
}
227+
}
228+
214229
/*
215230
* Unconditionally switch the system clock source to HSI.
216231
*/
@@ -310,9 +325,7 @@ void config_src_sysclk_pll(LL_UTILS_ClkInitTypeDef s_ClkInitStruct)
310325
STM32_PLL_N_MULTIPLIER,
311326
STM32_PLL_R_DIVISOR);
312327

313-
LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
314-
while (LL_PWR_IsActiveFlag_VOS() == 0) {
315-
}
328+
set_regu_voltage(CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC);
316329

317330
if (CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC >= 55) {
318331
/*
@@ -364,6 +377,8 @@ void config_src_sysclk_pll(LL_UTILS_ClkInitTypeDef s_ClkInitStruct)
364377
LL_RCC_HSE_Disable();
365378

366379
#elif STM32_PLL_SRC_HSI
380+
set_regu_voltage(CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC);
381+
367382
/* Switch to PLL with HSI as clock source */
368383
LL_PLL_ConfigSystemClock_HSI(&s_PLLInitStruct, &s_ClkInitStruct);
369384

@@ -374,6 +389,8 @@ void config_src_sysclk_pll(LL_UTILS_ClkInitTypeDef s_ClkInitStruct)
374389
#elif STM32_PLL_SRC_HSE
375390
int hse_bypass;
376391

392+
set_regu_voltage(CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC);
393+
377394
if (IS_ENABLED(STM32_HSE_BYPASS)) {
378395
hse_bypass = LL_UTILS_HSEBYPASS_ON;
379396
} else {
@@ -487,14 +504,7 @@ void config_src_sysclk_msis(LL_UTILS_ClkInitTypeDef s_ClkInitStruct)
487504
LL_SetFlashLatency(new_hclk_freq);
488505
}
489506

490-
if (new_hclk_freq > MHZ(24)) {
491-
/* when freq > 24MHz it is necessary to set voltage scaling
492-
* to range3
493-
*/
494-
LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE3);
495-
while (LL_PWR_IsActiveFlag_VOS() == 0) {
496-
}
497-
}
507+
set_regu_voltage(CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC);
498508

499509
/* Set MSIS as SYSCLCK source */
500510
set_up_clk_msis();

0 commit comments

Comments
 (0)