194#define ALT_48MHZ_NO 0
195#define ALT_48MHZ_I2S 1
196#define ALT_48MHZ_SAI 2
202#define STM32F(x) [STM32F##x] = x
203#define STM32F0(x) [STM32F0##x] = x
206static const unsigned stm32_f_model[] = {
270#define STM32MP(x) [STM32MP##x] = x
273static const unsigned stm32_model_mp[] = {
278#define stm32f2_4_192_pll_cfg { \
279 .min_vco_input = 1000000U, \
280 .max_vco_input = 2000000U, \
281 .min_vco_output = 192000000U, \
282 .max_vco_output = 432000000U, \
298#define stm32f4_7_pll_cfg { \
299 .min_vco_input = 1000000U, \
300 .max_vco_input = 2000000U, \
301 .min_vco_output = 192000000U, \
302 .max_vco_output = 432000000U, \
318#define stm32mp1_pll_cfg { \
319 .min_vco_input = 4000000U, \
320 .max_vco_input = 16000000U, \
321 .min_vco_output = 400000000U, \
322 .max_vco_output = 800000000U, \
340static const clk_cfg_t stm32_f_clk_cfg[] = {
341 [STM32F030 ... STM32F098] = {
343 .max_coreclock = 48000000U,
344 .max_apb1 = 48000000U,
348 .min_vco_input = 1000000U,
349 .max_vco_input = 24000000U,
350 .min_vco_output = 16000000U,
351 .max_vco_output = 48000000U,
362 .has_pll_i2s =
false,
363 .has_pll_sai =
false,
364 .has_pll_i2s_alt_input =
false,
371 .max_coreclock = 24000000U,
372 .max_apb1 = 24000000U,
373 .max_apb2 = 24000000U,
376 .min_vco_input = 1000000U,
377 .max_vco_input = 24000000U,
378 .min_vco_output = 16000000U,
379 .max_vco_output = 24000000U,
390 .has_pll_i2s =
false,
391 .has_pll_sai =
false,
392 .has_pll_i2s_alt_input =
false,
397 [STM32F101 ... STM32F103] = {
399 .max_coreclock = 72000000U,
400 .max_apb1 = 36000000U,
401 .max_apb2 = 72000000U,
404 .min_vco_input = 1000000U,
405 .max_vco_input = 25000000U,
406 .min_vco_output = 1000000U,
407 .max_vco_output = 72000000U,
418 .has_pll_i2s =
false,
419 .has_pll_sai =
false,
420 .has_pll_i2s_alt_input =
false,
425 [STM32F205 ... STM32F217] = {
427 .max_coreclock = 120000000U,
428 .max_apb1 = 30000000U,
429 .max_apb2 = 60000000U,
431 .pll = stm32f2_4_192_pll_cfg,
433 .has_pll_sai =
false,
434 .has_pll_i2s_alt_input =
false,
438 [STM32F301 ... STM32F398] = {
440 .max_coreclock = 72000000U,
441 .max_apb1 = 36000000U,
442 .max_apb2 = 72000000U,
445 .min_vco_input = 1000000U,
446 .max_vco_input = 25000000U,
447 .min_vco_output = 1000000U,
448 .max_vco_output = 72000000U,
459 .has_pll_i2s =
false,
460 .has_pll_sai =
false,
461 .has_pll_i2s_alt_input =
false,
468 .max_coreclock = 84000000U,
469 .max_apb1 = 42000000U,
470 .max_apb2 = 84000000U,
472 .pll = stm32f2_4_192_pll_cfg,
474 .has_pll_sai =
false,
475 .has_pll_i2s_m =
false,
476 .has_pll_i2s_alt_input =
false,
480 [STM32F405 ... STM32F407] = {
482 .max_coreclock = 168000000U,
483 .max_apb1 = 42000000U,
484 .max_apb2 = 84000000U,
486 .pll = stm32f4_7_pll_cfg,
488 .has_pll_sai =
false,
489 .has_pll_i2s_m =
false,
490 .has_pll_i2s_alt_input =
false,
496 .max_coreclock = 100000000U,
497 .max_apb1 = 50000000U,
498 .max_apb2 = 100000000U,
500 .pll = stm32f4_7_pll_cfg,
501 .has_pll_i2s =
false,
502 .has_pll_sai =
false,
503 .has_pll_i2s_m =
false,
504 .has_pll_i2s_alt_input =
false,
510 .max_coreclock = 100000000U,
511 .max_apb1 = 50000000U,
512 .max_apb2 = 100000000U,
514 .pll = stm32f4_7_pll_cfg,
516 .has_pll_sai =
false,
517 .has_pll_i2s_m =
true,
518 .has_pll_i2s_alt_input =
false,
522 [STM32F412 ... STM32F413] = {
524 .max_coreclock = 100000000U,
525 .max_apb1 = 50000000U,
526 .max_apb2 = 100000000U,
528 .pll = stm32f4_7_pll_cfg,
531 .has_pll_i2s_m =
true,
532 .has_pll_sai_m =
false,
533 .has_pll_i2s_alt_input =
true,
534 .has_alt_48MHz = ALT_48MHZ_I2S,
537 [STM32F415 ... STM32F417] = {
539 .max_coreclock = 168000000U,
540 .max_apb1 = 42000000U,
541 .max_apb2 = 84000000U,
543 .pll = stm32f4_7_pll_cfg,
545 .has_pll_sai =
false,
546 .has_pll_i2s_m =
false,
547 .has_pll_i2s_alt_input =
false,
553 .max_coreclock = 100000000U,
554 .max_apb1 = 50000000U,
555 .max_apb2 = 100000000U,
557 .pll = stm32f4_7_pll_cfg,
560 .has_pll_i2s_m =
true,
561 .has_pll_sai_m =
false,
562 .has_pll_i2s_alt_input =
true,
563 .has_alt_48MHz = ALT_48MHZ_I2S,
566 [STM32F427 ... STM32F439] = {
568 .max_coreclock = 180000000U,
569 .max_apb1 = 45000000U,
570 .max_apb2 = 90000000U,
572 .pll = stm32f4_7_pll_cfg,
575 .has_pll_i2s_m =
false,
576 .has_pll_sai_m =
false,
577 .has_pll_i2s_alt_input =
false,
583 .max_coreclock = 180000000U,
584 .max_apb1 = 45000000U,
585 .max_apb2 = 90000000U,
587 .pll = stm32f4_7_pll_cfg,
590 .has_pll_i2s_m =
true,
591 .has_pll_sai_m =
true,
592 .has_pll_i2s_alt_input =
false,
593 .has_alt_48MHz = ALT_48MHZ_SAI | ALT_48MHZ_P,
596 [STM32F469 ... STM32F479] = {
598 .max_coreclock = 180000000U,
599 .max_apb1 = 45000000U,
600 .max_apb2 = 90000000U,
602 .pll = stm32f4_7_pll_cfg,
605 .has_pll_i2s_m =
false,
606 .has_pll_sai_m =
false,
607 .has_pll_i2s_alt_input =
false,
608 .has_alt_48MHz = ALT_48MHZ_SAI | ALT_48MHZ_P,
611 [STM32F722 ... STM32F779] = {
613 .max_coreclock = 216000000U,
614 .max_apb1 = 54000000U,
615 .max_apb2 = 108000000U,
617 .pll = stm32f4_7_pll_cfg,
620 .has_pll_i2s_m =
false,
621 .has_pll_sai_m =
false,
622 .has_pll_i2s_alt_input =
false,
623 .has_alt_48MHz = ALT_48MHZ_SAI | ALT_48MHZ_P,
631static const clk_cfg_t stm32_mp_clk_cfg[] = {
634 .max_coreclock = 209000000U,
635 .max_apb1 = 104500000U,
636 .max_apb2 = 104500000U,
637 .max_apb3 = 104500000U,
639 .pll = stm32mp1_pll_cfg,
640 .has_pll_i2s =
false,
641 .has_pll_sai =
false,
642 .has_pll_i2s_m =
false,
643 .has_pll_sai_m =
false,
644 .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.