197#define ALT_48MHZ_NO 0
198#define ALT_48MHZ_I2S 1
199#define ALT_48MHZ_SAI 2
205#define STM32F(x) [STM32F##x] = x
206#define STM32F0(x) [STM32F0##x] = x
209static const unsigned stm32_f_model[] = {
273#define STM32MP(x) [STM32MP##x] = x
276static const unsigned stm32_model_mp[] = {
281#define stm32f2_4_192_pll_cfg { \
282 .min_vco_input = 1000000U, \
283 .max_vco_input = 2000000U, \
284 .min_vco_output = 192000000U, \
285 .max_vco_output = 432000000U, \
301#define stm32f4_7_pll_cfg { \
302 .min_vco_input = 1000000U, \
303 .max_vco_input = 2000000U, \
304 .min_vco_output = 192000000U, \
305 .max_vco_output = 432000000U, \
321#define stm32mp1_pll_cfg { \
322 .min_vco_input = 4000000U, \
323 .max_vco_input = 16000000U, \
324 .min_vco_output = 400000000U, \
325 .max_vco_output = 800000000U, \
343static const clk_cfg_t stm32_f_clk_cfg[] = {
344 [STM32F030 ... STM32F098] = {
346 .max_coreclock = 48000000U,
347 .max_apb1 = 48000000U,
351 .min_vco_input = 1000000U,
352 .max_vco_input = 24000000U,
353 .min_vco_output = 16000000U,
354 .max_vco_output = 48000000U,
365 .has_pll_i2s =
false,
366 .has_pll_sai =
false,
367 .has_pll_i2s_alt_input =
false,
374 .max_coreclock = 24000000U,
375 .max_apb1 = 24000000U,
376 .max_apb2 = 24000000U,
379 .min_vco_input = 1000000U,
380 .max_vco_input = 24000000U,
381 .min_vco_output = 16000000U,
382 .max_vco_output = 24000000U,
393 .has_pll_i2s =
false,
394 .has_pll_sai =
false,
395 .has_pll_i2s_alt_input =
false,
400 [STM32F101 ... STM32F103] = {
402 .max_coreclock = 72000000U,
403 .max_apb1 = 36000000U,
404 .max_apb2 = 72000000U,
407 .min_vco_input = 1000000U,
408 .max_vco_input = 25000000U,
409 .min_vco_output = 1000000U,
410 .max_vco_output = 72000000U,
421 .has_pll_i2s =
false,
422 .has_pll_sai =
false,
423 .has_pll_i2s_alt_input =
false,
428 [STM32F205 ... STM32F217] = {
430 .max_coreclock = 120000000U,
431 .max_apb1 = 30000000U,
432 .max_apb2 = 60000000U,
434 .pll = stm32f2_4_192_pll_cfg,
436 .has_pll_sai =
false,
437 .has_pll_i2s_alt_input =
false,
441 [STM32F301 ... STM32F398] = {
443 .max_coreclock = 72000000U,
444 .max_apb1 = 36000000U,
445 .max_apb2 = 72000000U,
448 .min_vco_input = 1000000U,
449 .max_vco_input = 25000000U,
450 .min_vco_output = 1000000U,
451 .max_vco_output = 72000000U,
462 .has_pll_i2s =
false,
463 .has_pll_sai =
false,
464 .has_pll_i2s_alt_input =
false,
471 .max_coreclock = 84000000U,
472 .max_apb1 = 42000000U,
473 .max_apb2 = 84000000U,
475 .pll = stm32f2_4_192_pll_cfg,
477 .has_pll_sai =
false,
478 .has_pll_i2s_m =
false,
479 .has_pll_i2s_alt_input =
false,
483 [STM32F405 ... STM32F407] = {
485 .max_coreclock = 168000000U,
486 .max_apb1 = 42000000U,
487 .max_apb2 = 84000000U,
489 .pll = stm32f4_7_pll_cfg,
491 .has_pll_sai =
false,
492 .has_pll_i2s_m =
false,
493 .has_pll_i2s_alt_input =
false,
499 .max_coreclock = 100000000U,
500 .max_apb1 = 50000000U,
501 .max_apb2 = 100000000U,
503 .pll = stm32f4_7_pll_cfg,
504 .has_pll_i2s =
false,
505 .has_pll_sai =
false,
506 .has_pll_i2s_m =
false,
507 .has_pll_i2s_alt_input =
false,
513 .max_coreclock = 100000000U,
514 .max_apb1 = 50000000U,
515 .max_apb2 = 100000000U,
517 .pll = stm32f4_7_pll_cfg,
519 .has_pll_sai =
false,
520 .has_pll_i2s_m =
true,
521 .has_pll_i2s_alt_input =
false,
525 [STM32F412 ... STM32F413] = {
527 .max_coreclock = 100000000U,
528 .max_apb1 = 50000000U,
529 .max_apb2 = 100000000U,
531 .pll = stm32f4_7_pll_cfg,
534 .has_pll_i2s_m =
true,
535 .has_pll_sai_m =
false,
536 .has_pll_i2s_alt_input =
true,
537 .has_alt_48MHz = ALT_48MHZ_I2S,
540 [STM32F415 ... STM32F417] = {
542 .max_coreclock = 168000000U,
543 .max_apb1 = 42000000U,
544 .max_apb2 = 84000000U,
546 .pll = stm32f4_7_pll_cfg,
548 .has_pll_sai =
false,
549 .has_pll_i2s_m =
false,
550 .has_pll_i2s_alt_input =
false,
556 .max_coreclock = 100000000U,
557 .max_apb1 = 50000000U,
558 .max_apb2 = 100000000U,
560 .pll = stm32f4_7_pll_cfg,
563 .has_pll_i2s_m =
true,
564 .has_pll_sai_m =
false,
565 .has_pll_i2s_alt_input =
true,
566 .has_alt_48MHz = ALT_48MHZ_I2S,
569 [STM32F427 ... STM32F439] = {
571 .max_coreclock = 180000000U,
572 .max_apb1 = 45000000U,
573 .max_apb2 = 90000000U,
575 .pll = stm32f4_7_pll_cfg,
578 .has_pll_i2s_m =
false,
579 .has_pll_sai_m =
false,
580 .has_pll_i2s_alt_input =
false,
586 .max_coreclock = 180000000U,
587 .max_apb1 = 45000000U,
588 .max_apb2 = 90000000U,
590 .pll = stm32f4_7_pll_cfg,
593 .has_pll_i2s_m =
true,
594 .has_pll_sai_m =
true,
595 .has_pll_i2s_alt_input =
false,
596 .has_alt_48MHz = ALT_48MHZ_SAI | ALT_48MHZ_P,
599 [STM32F469 ... STM32F479] = {
601 .max_coreclock = 180000000U,
602 .max_apb1 = 45000000U,
603 .max_apb2 = 90000000U,
605 .pll = stm32f4_7_pll_cfg,
608 .has_pll_i2s_m =
false,
609 .has_pll_sai_m =
false,
610 .has_pll_i2s_alt_input =
false,
611 .has_alt_48MHz = ALT_48MHZ_SAI | ALT_48MHZ_P,
614 [STM32F722 ... STM32F779] = {
616 .max_coreclock = 216000000U,
617 .max_apb1 = 54000000U,
618 .max_apb2 = 108000000U,
620 .pll = stm32f4_7_pll_cfg,
623 .has_pll_i2s_m =
false,
624 .has_pll_sai_m =
false,
625 .has_pll_i2s_alt_input =
false,
626 .has_alt_48MHz = ALT_48MHZ_SAI | ALT_48MHZ_P,
634static const clk_cfg_t stm32_mp_clk_cfg[] = {
637 .max_coreclock = 209000000U,
638 .max_apb1 = 104500000U,
639 .max_apb2 = 104500000U,
640 .max_apb3 = 104500000U,
642 .pll = stm32mp1_pll_cfg,
643 .has_pll_i2s =
false,
644 .has_pll_sai =
false,
645 .has_pll_i2s_m =
false,
646 .has_pll_sai_m =
false,
647 .has_pll_i2s_alt_input =
false,
unsigned max_apb1
Max APB1 clock.
bool has_pll_i2s_m
PLL I2S has a M factor.
unsigned max_coreclock
Max coreclock.
unsigned hsi
HSI frequency.
bool has_pll_i2s
PLL I2S available.
unsigned max_apb3
Max APB3 clock.
pll_cfg_t pll
PLL configuration.
bool has_pll_sai
PLL SAI available.
bool has_pll_i2s_alt_input
PLL I2S has an external input available.
int has_alt_48MHz
48MHz can be generated by an alternate source
unsigned hsi_prediv
Value if HSI has a fixed prediv, 0 otherwise.
bool need_48MHz
48MHz is needed
unsigned max_apb2
Max APB2 clock.
bool has_pll_sai_m
PLL SAI has a M factor.
PLL configuration parameters.
unsigned min_vco_output
Min VCO output.
unsigned max_vco_input
Max VCO input.
unsigned min_vco_input
Min VCO input.
unsigned inc_n
Increment between two values of N.
unsigned inc_m
Increment between two values of M.
unsigned inc_p
Increment between two values of P.
unsigned max_vco_output
Max VCO output.
unsigned inc_q
Increment between two values of Q.