Skip to content

Commit 15bdefe

Browse files
FRASTMkartben
authored andcommitted
drivers: clock control: stm32F412 has PLL48MHz
Add the configuration of the PLL Q divider of main PLL and I2S_Q of the PLLI2S toset the PLL48MHz clock which feeds the USB, SDMMC, RNG through the RCC_DCKCFGR2 register. Signed-off-by: Francois Ramu <[email protected]>
1 parent 3651725 commit 15bdefe

File tree

4 files changed

+44
-0
lines changed

4 files changed

+44
-0
lines changed

drivers/clock_control/clock_stm32_ll_common.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,13 @@ int enabled_clock(uint32_t src_clk)
214214
}
215215
break;
216216
#endif /* STM32_SRC_PLL_R */
217+
#if defined(STM32_SRC_PLLI2S_Q)
218+
case STM32_SRC_PLLI2S_Q:
219+
if (!IS_ENABLED(STM32_PLLI2S_Q_ENABLED)) {
220+
r = -ENOTSUP;
221+
}
222+
break;
223+
#endif /* STM32_SRC_PLLI2S_Q */
217224
#if defined(STM32_SRC_PLLI2S_R)
218225
case STM32_SRC_PLLI2S_R:
219226
if (!IS_ENABLED(STM32_PLLI2S_R_ENABLED)) {
@@ -425,6 +432,14 @@ static int stm32_clock_control_get_subsys_rate(const struct device *clock,
425432
STM32_PLL_R_DIVISOR);
426433
break;
427434
#endif
435+
#if defined(STM32_SRC_PLLI2S_Q) & STM32_PLLI2S_ENABLED
436+
case STM32_SRC_PLLI2S_Q:
437+
*rate = get_pll_div_frequency(get_pllsrc_frequency(),
438+
STM32_PLLI2S_M_DIVISOR,
439+
STM32_PLLI2S_N_MULTIPLIER,
440+
STM32_PLLI2S_Q_DIVISOR);
441+
break;
442+
#endif /* STM32_SRC_PLLI2S_Q */
428443
#if defined(STM32_SRC_PLLI2S_R) & STM32_PLLI2S_ENABLED
429444
case STM32_SRC_PLLI2S_R:
430445
*rate = get_pll_div_frequency(get_pllsrc_frequency(),
@@ -433,6 +448,7 @@ static int stm32_clock_control_get_subsys_rate(const struct device *clock,
433448
STM32_PLLI2S_R_DIVISOR);
434449
break;
435450
#endif /* STM32_SRC_PLLI2S_R */
451+
436452
/* PLLSAI1x not supported yet */
437453
/* PLLSAI2x not supported yet */
438454
#if defined(STM32_SRC_LSE)
@@ -465,6 +481,12 @@ static int stm32_clock_control_get_subsys_rate(const struct device *clock,
465481
*rate = STM32_HSI48_FREQ;
466482
break;
467483
#endif /* STM32_HSI48_ENABLED */
484+
#if defined(STM32_CK48_ENABLED)
485+
case STM32_SRC_CK48:
486+
*rate = STM32_CK48_FREQ;
487+
break;
488+
#endif /* STM32_CK48_ENABLED */
489+
468490
default:
469491
return -ENOTSUP;
470492
}

drivers/clock_control/clock_stm32_ll_common.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@
3636
#endif /* RCC_PLLI2SCFGR_PLLI2SM */
3737
#define plli2sm(v) z_plli2s_m(v)
3838

39+
#define z_plli2s_q(v) LL_RCC_PLLI2SQ_DIV_ ## v
40+
#define plli2sq(v) z_plli2s_q(v)
41+
3942
#define z_plli2s_r(v) LL_RCC_PLLI2SR_DIV_ ## v
4043
#define plli2sr(v) z_plli2s_r(v)
4144

drivers/clock_control/clock_stm32f2_f4_f7.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,14 @@ void config_pll_sysclock(void)
6464
STM32_PLL_N_MULTIPLIER,
6565
pllp(STM32_PLL_P_DIVISOR));
6666

67+
#if STM32_PLL_Q_ENABLED
68+
/* There is a Q divider on the PLL to configure the PLL48CK */
69+
LL_RCC_PLL_ConfigDomain_48M(get_pll_source(),
70+
pllm(STM32_PLL_M_DIVISOR),
71+
STM32_PLL_N_MULTIPLIER,
72+
pllq(STM32_PLL_Q_DIVISOR));
73+
#endif /* STM32_PLLI2S_Q_ENABLED */
74+
6775
#if defined(CONFIG_SOC_SERIES_STM32F7X)
6876
/* Assuming we stay on Power Scale default value: Power Scale 1 */
6977
if (CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC > 180000000) {
@@ -108,6 +116,14 @@ void config_plli2s(void)
108116
plli2sm(STM32_PLLI2S_M_DIVISOR),
109117
STM32_PLLI2S_N_MULTIPLIER,
110118
plli2sr(STM32_PLLI2S_R_DIVISOR));
119+
120+
#if STM32_PLLI2S_Q_ENABLED
121+
/* There is a Q divider on the PLLI2S to configure the PLL48CK */
122+
LL_RCC_PLLI2S_ConfigDomain_48M(get_pll_source(),
123+
plli2sm(STM32_PLLI2S_M_DIVISOR),
124+
STM32_PLLI2S_N_MULTIPLIER,
125+
plli2sq(STM32_PLLI2S_Q_DIVISOR));
126+
#endif /* STM32_PLLI2S_Q_ENABLED */
111127
}
112128

113129
#endif /* STM32_PLLI2S_ENABLED */

include/zephyr/drivers/clock_control/stm32_clock_control.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#elif defined(CONFIG_SOC_SERIES_STM32F2X) || \
2828
defined(CONFIG_SOC_SERIES_STM32F4X)
2929
#include <zephyr/dt-bindings/clock/stm32f4_clock.h>
30+
#include <zephyr/dt-bindings/clock/stm32f410_clock.h>
3031
#elif defined(CONFIG_SOC_SERIES_STM32F7X)
3132
#include <zephyr/dt-bindings/clock/stm32f7_clock.h>
3233
#elif defined(CONFIG_SOC_SERIES_STM32G0X)
@@ -183,6 +184,8 @@
183184
#define STM32_PLLI2S_ENABLED 1
184185
#define STM32_PLLI2S_M_DIVISOR DT_PROP(DT_NODELABEL(plli2s), div_m)
185186
#define STM32_PLLI2S_N_MULTIPLIER DT_PROP(DT_NODELABEL(plli2s), mul_n)
187+
#define STM32_PLLI2S_Q_ENABLED DT_NODE_HAS_PROP(DT_NODELABEL(plli2s), div_q)
188+
#define STM32_PLLI2S_Q_DIVISOR DT_PROP_OR(DT_NODELABEL(plli2s), div_q, 1)
186189
#define STM32_PLLI2S_R_ENABLED DT_NODE_HAS_PROP(DT_NODELABEL(plli2s), div_r)
187190
#define STM32_PLLI2S_R_DIVISOR DT_PROP_OR(DT_NODELABEL(plli2s), div_r, 1)
188191
#endif

0 commit comments

Comments
 (0)