diff --git a/drivers/clock_control/clock_stm32_ll_common.c b/drivers/clock_control/clock_stm32_ll_common.c index 3097af2912fc..69c825f310e0 100644 --- a/drivers/clock_control/clock_stm32_ll_common.c +++ b/drivers/clock_control/clock_stm32_ll_common.c @@ -456,7 +456,11 @@ static int stm32_clock_control_get_subsys_rate(const struct device *clock, #endif #if defined(STM32_SRC_HSI) case STM32_SRC_HSI: +#if defined(CONFIG_SOC_SERIES_STM32L0X) + *rate = STM32_HSI_FREQ / STM32_HSI_DIVISOR; +#else *rate = STM32_HSI_FREQ; +#endif break; #endif #if defined(STM32_SRC_MSI) @@ -662,7 +666,13 @@ static void set_up_fixed_clock_sources(void) } } #if STM32_HSI_DIV_ENABLED +#if defined(CONFIG_SOC_SERIES_STM32L0X) + if (STM32_HSI_DIVISOR == 4) { + LL_RCC_HSI_EnableDivider(); + } +#else LL_RCC_SetHSIDiv(hsi_divider(STM32_HSI_DIVISOR)); +#endif #endif } diff --git a/drivers/clock_control/clock_stm32l0_l1.c b/drivers/clock_control/clock_stm32l0_l1.c index d378b1285256..dc6b3adbcf35 100644 --- a/drivers/clock_control/clock_stm32l0_l1.c +++ b/drivers/clock_control/clock_stm32l0_l1.c @@ -49,7 +49,11 @@ __unused uint32_t get_pllsrc_frequency(void) { if (IS_ENABLED(STM32_PLL_SRC_HSI)) { +#if defined(CONFIG_SOC_SERIES_STM32L0X) + return STM32_HSI_FREQ / STM32_HSI_DIVISOR; +#else return STM32_HSI_FREQ; +#endif } else if (IS_ENABLED(STM32_PLL_SRC_HSE)) { return STM32_HSE_FREQ; } diff --git a/dts/arm/st/l0/stm32l0.dtsi b/dts/arm/st/l0/stm32l0.dtsi index c594d23665de..d0d82e340a81 100644 --- a/dts/arm/st/l0/stm32l0.dtsi +++ b/dts/arm/st/l0/stm32l0.dtsi @@ -56,8 +56,9 @@ clk_hsi: clk-hsi { #clock-cells = <0>; - compatible = "fixed-clock"; + compatible = "st,stm32l0-hsi-clock"; clock-frequency = ; + hsi-div = <1>; status = "disabled"; }; diff --git a/dts/bindings/clock/st,stm32l0-hsi-clock.yaml b/dts/bindings/clock/st,stm32l0-hsi-clock.yaml new file mode 100644 index 000000000000..e1e4230fdfec --- /dev/null +++ b/dts/bindings/clock/st,stm32l0-hsi-clock.yaml @@ -0,0 +1,18 @@ +# Copyright (c) 2025 STMicroelectronics +# SPDX-License-Identifier: Apache-2.0 + +description: STM32L0 HSI Clock + +compatible: "st,stm32l0-hsi-clock" + +include: [fixed-clock.yaml] + +properties: + hsi-div: + type: int + required: true + description: | + HSI clock divider. Configures the output HSI clock frequency + enum: + - 1 # hsi_clk = 16MHz + - 4 # hsi_clk = 4MHz diff --git a/include/zephyr/drivers/clock_control/stm32_clock_control.h b/include/zephyr/drivers/clock_control/stm32_clock_control.h index d6e710a89ab5..a3c236a36181 100644 --- a/include/zephyr/drivers/clock_control/stm32_clock_control.h +++ b/include/zephyr/drivers/clock_control/stm32_clock_control.h @@ -485,6 +485,7 @@ #define STM32_HSI_ENABLED 1 #define STM32_HSI_FREQ DT_PROP(DT_NODELABEL(clk_hsi), clock_frequency) #elif DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_hsi), st_stm32h7_hsi_clock, okay) \ + || DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_hsi), st_stm32l0_hsi_clock, okay) \ || DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_hsi), st_stm32g0_hsi_clock, okay) \ || DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_hsi), st_stm32c0_hsi_clock, okay) \ || DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_hsi), st_stm32n6_hsi_clock, okay)