128c10f9eSGabriel Fernandez // SPDX-License-Identifier: BSD-2-Clause
228c10f9eSGabriel Fernandez /*
328c10f9eSGabriel Fernandez * Copyright (C) 2024, STMicroelectronics
428c10f9eSGabriel Fernandez */
528c10f9eSGabriel Fernandez
628c10f9eSGabriel Fernandez #include <assert.h>
728c10f9eSGabriel Fernandez #include <config.h>
828c10f9eSGabriel Fernandez #include <drivers/clk_dt.h>
9b5f8fc36SGatien Chevallier #include <drivers/stm32_rif.h>
1028c10f9eSGabriel Fernandez #include <drivers/stm32_shared_io.h>
1128c10f9eSGabriel Fernandez #include <drivers/stm32mp25_rcc.h>
1228c10f9eSGabriel Fernandez #include <drivers/stm32mp_dt_bindings.h>
13b5f8fc36SGatien Chevallier #include <initcall.h>
1428c10f9eSGabriel Fernandez #include <io.h>
1528c10f9eSGabriel Fernandez #include <kernel/dt.h>
1628c10f9eSGabriel Fernandez #include <kernel/panic.h>
17b5f8fc36SGatien Chevallier #include <kernel/pm.h>
1828c10f9eSGabriel Fernandez #include <libfdt.h>
1928c10f9eSGabriel Fernandez #include <stdbool.h>
2028c10f9eSGabriel Fernandez #include <stdio.h>
2128c10f9eSGabriel Fernandez #include <stm32_sysconf.h>
2228c10f9eSGabriel Fernandez #include <stm32_util.h>
2328c10f9eSGabriel Fernandez #include <trace.h>
2428c10f9eSGabriel Fernandez #include <util.h>
2528c10f9eSGabriel Fernandez
2628c10f9eSGabriel Fernandez #include "clk-stm32-core.h"
2728c10f9eSGabriel Fernandez
2828c10f9eSGabriel Fernandez #define MAX_OPP CFG_STM32MP_OPP_COUNT
2928c10f9eSGabriel Fernandez
30b5f8fc36SGatien Chevallier #define RCC_SECCFGR(x) (U(0x0) + U(0x4) * (x))
31b5f8fc36SGatien Chevallier #define RCC_PRIVCFGR(x) (U(0x10) + U(0x4) * (x))
32b5f8fc36SGatien Chevallier #define RCC_RCFGLOCKR(x) (U(0x20) + U(0x4) * (x))
33b5f8fc36SGatien Chevallier #define RCC_CIDCFGR(x) (U(0x030) + U(0x08) * (x))
34b5f8fc36SGatien Chevallier #define RCC_SEMCR(x) (U(0x034) + U(0x08) * (x))
35b5f8fc36SGatien Chevallier
3628c10f9eSGabriel Fernandez #define TIMEOUT_US_100MS U(100000)
3728c10f9eSGabriel Fernandez #define TIMEOUT_US_200MS U(200000)
3828c10f9eSGabriel Fernandez #define TIMEOUT_US_1S U(1000000)
3928c10f9eSGabriel Fernandez
4028c10f9eSGabriel Fernandez #define PLLRDY_TIMEOUT TIMEOUT_US_200MS
4128c10f9eSGabriel Fernandez #define CLKSRC_TIMEOUT TIMEOUT_US_200MS
4228c10f9eSGabriel Fernandez #define CLKDIV_TIMEOUT TIMEOUT_US_200MS
4328c10f9eSGabriel Fernandez #define OSCRDY_TIMEOUT TIMEOUT_US_1S
4428c10f9eSGabriel Fernandez
4528c10f9eSGabriel Fernandez /* PLL minimal frequencies for clock sources */
4628c10f9eSGabriel Fernandez #define PLL_REFCLK_MIN UL(5000000)
4728c10f9eSGabriel Fernandez #define PLL_FRAC_REFCLK_MIN UL(10000000)
4828c10f9eSGabriel Fernandez
4928c10f9eSGabriel Fernandez /* Parameters from XBAR_CFG in st,cksrc field */
5028c10f9eSGabriel Fernandez #define XBAR_CKSRC_CHANNEL GENMASK_32(5, 0)
5128c10f9eSGabriel Fernandez #define XBAR_CKSRC_SRC GENMASK_32(9, 6)
5228c10f9eSGabriel Fernandez #define XBAR_CKSRC_SRC_OFFSET U(6)
5328c10f9eSGabriel Fernandez #define XBAR_CKSRC_PREDIV GENMASK_32(19, 10)
5428c10f9eSGabriel Fernandez #define XBAR_CKSRC_PREDIV_OFFSET U(10)
5528c10f9eSGabriel Fernandez #define XBAR_CKSRC_FINDIV GENMASK_32(25, 20)
5628c10f9eSGabriel Fernandez #define XBAR_CKSRC_FINDIV_OFFSET U(20)
5728c10f9eSGabriel Fernandez
5828c10f9eSGabriel Fernandez #define XBAR_CHANNEL_NB U(64)
5928c10f9eSGabriel Fernandez #define XBAR_ROOT_CHANNEL_NB U(7)
6028c10f9eSGabriel Fernandez
6128c10f9eSGabriel Fernandez #define FLEX_STGEN U(33)
6228c10f9eSGabriel Fernandez
6328c10f9eSGabriel Fernandez #define RCC_0_MHZ UL(0)
6428c10f9eSGabriel Fernandez #define RCC_4_MHZ UL(4000000)
6528c10f9eSGabriel Fernandez #define RCC_16_MHZ UL(16000000)
6628c10f9eSGabriel Fernandez
67b5f8fc36SGatien Chevallier /* CIDCFGR register bitfields */
68b5f8fc36SGatien Chevallier #define RCC_CIDCFGR_SEMWL_MASK GENMASK_32(23, 16)
69b5f8fc36SGatien Chevallier #define RCC_CIDCFGR_SCID_MASK GENMASK_32(6, 4)
70b5f8fc36SGatien Chevallier #define RCC_CIDCFGR_CONF_MASK (_CIDCFGR_CFEN | \
71b5f8fc36SGatien Chevallier _CIDCFGR_SEMEN | \
72b5f8fc36SGatien Chevallier RCC_CIDCFGR_SCID_MASK |\
73b5f8fc36SGatien Chevallier RCC_CIDCFGR_SEMWL_MASK)
74b5f8fc36SGatien Chevallier
75b5f8fc36SGatien Chevallier /* SECCFGR register bitfields */
76b5f8fc36SGatien Chevallier #define RCC_SECCFGR_EN BIT(0)
77b5f8fc36SGatien Chevallier
78b5f8fc36SGatien Chevallier /* SEMCR register bitfields */
79b5f8fc36SGatien Chevallier #define RCC_SEMCR_SCID_MASK GENMASK_32(6, 4)
80b5f8fc36SGatien Chevallier #define RCC_SEMCR_SCID_SHIFT U(4)
81b5f8fc36SGatien Chevallier
82b5f8fc36SGatien Chevallier /* RIF miscellaneous */
83b5f8fc36SGatien Chevallier #define RCC_NB_RIF_RES U(114)
84b5f8fc36SGatien Chevallier #define RCC_NB_CONFS ROUNDUP_DIV(RCC_NB_RIF_RES, 32)
85b5f8fc36SGatien Chevallier
8628c10f9eSGabriel Fernandez enum pll_cfg {
8728c10f9eSGabriel Fernandez FBDIV,
8828c10f9eSGabriel Fernandez REFDIV,
8928c10f9eSGabriel Fernandez POSTDIV1,
9028c10f9eSGabriel Fernandez POSTDIV2,
9128c10f9eSGabriel Fernandez PLLCFG_NB
9228c10f9eSGabriel Fernandez };
9328c10f9eSGabriel Fernandez
9428c10f9eSGabriel Fernandez enum pll_csg {
9528c10f9eSGabriel Fernandez DIVVAL,
9628c10f9eSGabriel Fernandez SPREAD,
9728c10f9eSGabriel Fernandez DOWNSPREAD,
9828c10f9eSGabriel Fernandez PLLCSG_NB
9928c10f9eSGabriel Fernandez };
10028c10f9eSGabriel Fernandez
10128c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg {
10228c10f9eSGabriel Fernandez bool enabled;
10328c10f9eSGabriel Fernandez uint32_t cfg[PLLCFG_NB];
10428c10f9eSGabriel Fernandez uint32_t csg[PLLCSG_NB];
10528c10f9eSGabriel Fernandez uint32_t frac;
10628c10f9eSGabriel Fernandez bool csg_enabled;
10728c10f9eSGabriel Fernandez uint32_t src;
10828c10f9eSGabriel Fernandez };
10928c10f9eSGabriel Fernandez
11028c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg {
11128c10f9eSGabriel Fernandez unsigned long freq;
11228c10f9eSGabriel Fernandez bool bypass;
11328c10f9eSGabriel Fernandez bool digbyp;
11428c10f9eSGabriel Fernandez bool css;
11528c10f9eSGabriel Fernandez uint32_t drive;
11628c10f9eSGabriel Fernandez };
11728c10f9eSGabriel Fernandez
11828c10f9eSGabriel Fernandez struct stm32_clk_opp_cfg {
11928c10f9eSGabriel Fernandez uint32_t frq;
12028c10f9eSGabriel Fernandez uint32_t src;
12128c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg pll_cfg;
12228c10f9eSGabriel Fernandez };
12328c10f9eSGabriel Fernandez
12428c10f9eSGabriel Fernandez struct stm32_clk_opp_dt_cfg {
12528c10f9eSGabriel Fernandez struct stm32_clk_opp_cfg cpu1_opp[MAX_OPP];
12628c10f9eSGabriel Fernandez };
12728c10f9eSGabriel Fernandez
12828c10f9eSGabriel Fernandez struct stm32_clk_platdata {
12928c10f9eSGabriel Fernandez uintptr_t rcc_base;
13028c10f9eSGabriel Fernandez uint32_t nosci;
13128c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci;
13228c10f9eSGabriel Fernandez uint32_t npll;
13328c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll;
13428c10f9eSGabriel Fernandez struct stm32_clk_opp_dt_cfg *opp;
135b5f8fc36SGatien Chevallier struct rif_conf_data conf_data;
136b5f8fc36SGatien Chevallier unsigned int nb_res;
13728c10f9eSGabriel Fernandez uint32_t nbusclk;
13828c10f9eSGabriel Fernandez uint32_t *busclk;
13928c10f9eSGabriel Fernandez uint32_t nkernelclk;
14028c10f9eSGabriel Fernandez uint32_t *kernelclk;
14128c10f9eSGabriel Fernandez uint32_t nflexgen;
14228c10f9eSGabriel Fernandez uint32_t *flexgen;
14328c10f9eSGabriel Fernandez uint32_t c1msrd;
14428c10f9eSGabriel Fernandez bool safe_rst;
14528c10f9eSGabriel Fernandez };
14628c10f9eSGabriel Fernandez
14728c10f9eSGabriel Fernandez /*
14828c10f9eSGabriel Fernandez * GATE CONFIG
14928c10f9eSGabriel Fernandez */
15028c10f9eSGabriel Fernandez
15128c10f9eSGabriel Fernandez /* WARNING GATE_XXX_RDY MUST FOLLOW GATE_XXX */
15228c10f9eSGabriel Fernandez
15328c10f9eSGabriel Fernandez enum enum_gate_cfg {
15428c10f9eSGabriel Fernandez GATE_HSI,
15528c10f9eSGabriel Fernandez GATE_HSI_RDY,
15628c10f9eSGabriel Fernandez GATE_HSE,
15728c10f9eSGabriel Fernandez GATE_HSE_RDY,
15828c10f9eSGabriel Fernandez GATE_LSE,
15928c10f9eSGabriel Fernandez GATE_LSE_RDY,
16028c10f9eSGabriel Fernandez GATE_LSI,
16128c10f9eSGabriel Fernandez GATE_LSI_RDY,
16228c10f9eSGabriel Fernandez GATE_MSI,
16328c10f9eSGabriel Fernandez GATE_MSI_RDY,
16428c10f9eSGabriel Fernandez GATE_PLL1,
16528c10f9eSGabriel Fernandez GATE_PLL1_RDY,
16628c10f9eSGabriel Fernandez GATE_PLL2,
16728c10f9eSGabriel Fernandez GATE_PLL2_RDY,
16828c10f9eSGabriel Fernandez GATE_PLL3,
16928c10f9eSGabriel Fernandez GATE_PLL3_RDY,
17028c10f9eSGabriel Fernandez GATE_PLL4,
17128c10f9eSGabriel Fernandez GATE_PLL4_RDY,
17228c10f9eSGabriel Fernandez GATE_PLL5,
17328c10f9eSGabriel Fernandez GATE_PLL5_RDY,
17428c10f9eSGabriel Fernandez GATE_PLL6,
17528c10f9eSGabriel Fernandez GATE_PLL6_RDY,
17628c10f9eSGabriel Fernandez GATE_PLL7,
17728c10f9eSGabriel Fernandez GATE_PLL7_RDY,
17828c10f9eSGabriel Fernandez GATE_PLL8,
17928c10f9eSGabriel Fernandez GATE_PLL8_RDY,
18028c10f9eSGabriel Fernandez GATE_PLL4_CKREFST,
18128c10f9eSGabriel Fernandez GATE_PLL5_CKREFST,
18228c10f9eSGabriel Fernandez GATE_PLL6_CKREFST,
18328c10f9eSGabriel Fernandez GATE_PLL7_CKREFST,
18428c10f9eSGabriel Fernandez GATE_PLL8_CKREFST,
18528c10f9eSGabriel Fernandez GATE_HSEDIV2,
18628c10f9eSGabriel Fernandez GATE_APB1DIV_RDY,
18728c10f9eSGabriel Fernandez GATE_APB2DIV_RDY,
18828c10f9eSGabriel Fernandez GATE_APB3DIV_RDY,
18928c10f9eSGabriel Fernandez GATE_APB4DIV_RDY,
19028c10f9eSGabriel Fernandez GATE_APBDBGDIV_RDY,
19128c10f9eSGabriel Fernandez GATE_TIMG1PRE_RDY,
19228c10f9eSGabriel Fernandez GATE_TIMG2PRE_RDY,
19328c10f9eSGabriel Fernandez GATE_LSMCUDIV_RDY,
19428c10f9eSGabriel Fernandez GATE_RTCCK,
19528c10f9eSGabriel Fernandez GATE_C3,
19628c10f9eSGabriel Fernandez GATE_LPTIM3C3,
19728c10f9eSGabriel Fernandez GATE_LPTIM4C3,
19828c10f9eSGabriel Fernandez GATE_LPTIM5C3,
19928c10f9eSGabriel Fernandez GATE_SPI8C3,
20028c10f9eSGabriel Fernandez GATE_LPUART1C3,
20128c10f9eSGabriel Fernandez GATE_I2C8C3,
20228c10f9eSGabriel Fernandez GATE_ADF1C3,
20328c10f9eSGabriel Fernandez GATE_GPIOZC3,
20428c10f9eSGabriel Fernandez GATE_LPDMAC3,
20528c10f9eSGabriel Fernandez GATE_RTCC3,
20628c10f9eSGabriel Fernandez GATE_I3C4C3,
20728c10f9eSGabriel Fernandez GATE_MCO1,
20828c10f9eSGabriel Fernandez GATE_MCO2,
20928c10f9eSGabriel Fernandez GATE_DDRCP,
21028c10f9eSGabriel Fernandez GATE_DDRCAPB,
21128c10f9eSGabriel Fernandez GATE_DDRPHYCAPB,
21228c10f9eSGabriel Fernandez GATE_DDRPHYC,
21328c10f9eSGabriel Fernandez GATE_DDRCFG,
21428c10f9eSGabriel Fernandez GATE_SYSRAM,
21528c10f9eSGabriel Fernandez GATE_VDERAM,
21628c10f9eSGabriel Fernandez GATE_SRAM1,
21728c10f9eSGabriel Fernandez GATE_SRAM2,
21828c10f9eSGabriel Fernandez GATE_RETRAM,
21928c10f9eSGabriel Fernandez GATE_BKPSRAM,
22028c10f9eSGabriel Fernandez GATE_LPSRAM1,
22128c10f9eSGabriel Fernandez GATE_LPSRAM2,
22228c10f9eSGabriel Fernandez GATE_LPSRAM3,
22328c10f9eSGabriel Fernandez GATE_OSPI1,
22428c10f9eSGabriel Fernandez GATE_OSPI2,
22528c10f9eSGabriel Fernandez GATE_FMC,
22628c10f9eSGabriel Fernandez GATE_DBG,
22728c10f9eSGabriel Fernandez GATE_TRACE,
22828c10f9eSGabriel Fernandez GATE_STM,
22928c10f9eSGabriel Fernandez GATE_ETR,
23028c10f9eSGabriel Fernandez GATE_GPIOA,
23128c10f9eSGabriel Fernandez GATE_GPIOB,
23228c10f9eSGabriel Fernandez GATE_GPIOC,
23328c10f9eSGabriel Fernandez GATE_GPIOD,
23428c10f9eSGabriel Fernandez GATE_GPIOE,
23528c10f9eSGabriel Fernandez GATE_GPIOF,
23628c10f9eSGabriel Fernandez GATE_GPIOG,
23728c10f9eSGabriel Fernandez GATE_GPIOH,
23828c10f9eSGabriel Fernandez GATE_GPIOI,
23928c10f9eSGabriel Fernandez GATE_GPIOJ,
24028c10f9eSGabriel Fernandez GATE_GPIOK,
24128c10f9eSGabriel Fernandez GATE_GPIOZ,
24228c10f9eSGabriel Fernandez GATE_HPDMA1,
24328c10f9eSGabriel Fernandez GATE_HPDMA2,
24428c10f9eSGabriel Fernandez GATE_HPDMA3,
24528c10f9eSGabriel Fernandez GATE_LPDMA,
24628c10f9eSGabriel Fernandez GATE_HSEM,
24728c10f9eSGabriel Fernandez GATE_IPCC1,
24828c10f9eSGabriel Fernandez GATE_IPCC2,
24928c10f9eSGabriel Fernandez GATE_RTC,
25028c10f9eSGabriel Fernandez GATE_SYSCPU1,
25128c10f9eSGabriel Fernandez GATE_BSEC,
25228c10f9eSGabriel Fernandez GATE_IS2M,
25328c10f9eSGabriel Fernandez GATE_HSIMON,
25428c10f9eSGabriel Fernandez GATE_TIM1,
25528c10f9eSGabriel Fernandez GATE_TIM2,
25628c10f9eSGabriel Fernandez GATE_TIM3,
25728c10f9eSGabriel Fernandez GATE_TIM4,
25828c10f9eSGabriel Fernandez GATE_TIM5,
25928c10f9eSGabriel Fernandez GATE_TIM6,
26028c10f9eSGabriel Fernandez GATE_TIM7,
26128c10f9eSGabriel Fernandez GATE_TIM8,
26228c10f9eSGabriel Fernandez GATE_TIM10,
26328c10f9eSGabriel Fernandez GATE_TIM11,
26428c10f9eSGabriel Fernandez GATE_TIM12,
26528c10f9eSGabriel Fernandez GATE_TIM13,
26628c10f9eSGabriel Fernandez GATE_TIM14,
26728c10f9eSGabriel Fernandez GATE_TIM15,
26828c10f9eSGabriel Fernandez GATE_TIM16,
26928c10f9eSGabriel Fernandez GATE_TIM17,
27028c10f9eSGabriel Fernandez GATE_TIM20,
27128c10f9eSGabriel Fernandez GATE_LPTIM1,
27228c10f9eSGabriel Fernandez GATE_LPTIM2,
27328c10f9eSGabriel Fernandez GATE_LPTIM3,
27428c10f9eSGabriel Fernandez GATE_LPTIM4,
27528c10f9eSGabriel Fernandez GATE_LPTIM5,
27628c10f9eSGabriel Fernandez GATE_SPI1,
27728c10f9eSGabriel Fernandez GATE_SPI2,
27828c10f9eSGabriel Fernandez GATE_SPI3,
27928c10f9eSGabriel Fernandez GATE_SPI4,
28028c10f9eSGabriel Fernandez GATE_SPI5,
28128c10f9eSGabriel Fernandez GATE_SPI6,
28228c10f9eSGabriel Fernandez GATE_SPI7,
28328c10f9eSGabriel Fernandez GATE_SPI8,
28428c10f9eSGabriel Fernandez GATE_SPDIFRX,
28528c10f9eSGabriel Fernandez GATE_USART1,
28628c10f9eSGabriel Fernandez GATE_USART2,
28728c10f9eSGabriel Fernandez GATE_USART3,
28828c10f9eSGabriel Fernandez GATE_UART4,
28928c10f9eSGabriel Fernandez GATE_UART5,
29028c10f9eSGabriel Fernandez GATE_USART6,
29128c10f9eSGabriel Fernandez GATE_UART7,
29228c10f9eSGabriel Fernandez GATE_UART8,
29328c10f9eSGabriel Fernandez GATE_UART9,
29428c10f9eSGabriel Fernandez GATE_LPUART1,
29528c10f9eSGabriel Fernandez GATE_I2C1,
29628c10f9eSGabriel Fernandez GATE_I2C2,
29728c10f9eSGabriel Fernandez GATE_I2C3,
29828c10f9eSGabriel Fernandez GATE_I2C4,
29928c10f9eSGabriel Fernandez GATE_I2C5,
30028c10f9eSGabriel Fernandez GATE_I2C6,
30128c10f9eSGabriel Fernandez GATE_I2C7,
30228c10f9eSGabriel Fernandez GATE_I2C8,
30328c10f9eSGabriel Fernandez GATE_SAI1,
30428c10f9eSGabriel Fernandez GATE_SAI2,
30528c10f9eSGabriel Fernandez GATE_SAI3,
30628c10f9eSGabriel Fernandez GATE_SAI4,
30728c10f9eSGabriel Fernandez GATE_MDF1,
30828c10f9eSGabriel Fernandez GATE_ADF1,
30928c10f9eSGabriel Fernandez GATE_FDCAN,
31028c10f9eSGabriel Fernandez GATE_HDP,
31128c10f9eSGabriel Fernandez GATE_ADC12,
31228c10f9eSGabriel Fernandez GATE_ADC3,
31328c10f9eSGabriel Fernandez GATE_ETH1MAC,
31428c10f9eSGabriel Fernandez GATE_ETH1,
31528c10f9eSGabriel Fernandez GATE_ETH1TX,
31628c10f9eSGabriel Fernandez GATE_ETH1RX,
31728c10f9eSGabriel Fernandez GATE_ETH1STP,
31828c10f9eSGabriel Fernandez GATE_ETH2MAC,
31928c10f9eSGabriel Fernandez GATE_ETH2,
32028c10f9eSGabriel Fernandez GATE_ETH2STP,
32128c10f9eSGabriel Fernandez GATE_ETH2TX,
32228c10f9eSGabriel Fernandez GATE_ETH2RX,
32328c10f9eSGabriel Fernandez GATE_USB2,
32428c10f9eSGabriel Fernandez GATE_USB2PHY1,
32528c10f9eSGabriel Fernandez GATE_USB2PHY2,
32628c10f9eSGabriel Fernandez GATE_USB3DR,
32728c10f9eSGabriel Fernandez GATE_USB3PCIEPHY,
32828c10f9eSGabriel Fernandez GATE_PCIE,
32928c10f9eSGabriel Fernandez GATE_USBTC,
33028c10f9eSGabriel Fernandez GATE_ETHSWMAC,
33128c10f9eSGabriel Fernandez GATE_ETHSW,
33228c10f9eSGabriel Fernandez GATE_ETHSWREF,
33328c10f9eSGabriel Fernandez GATE_STGEN,
33428c10f9eSGabriel Fernandez GATE_SDMMC1,
33528c10f9eSGabriel Fernandez GATE_SDMMC2,
33628c10f9eSGabriel Fernandez GATE_SDMMC3,
33728c10f9eSGabriel Fernandez GATE_GPU,
33828c10f9eSGabriel Fernandez GATE_LTDC,
33928c10f9eSGabriel Fernandez GATE_DSI,
34028c10f9eSGabriel Fernandez GATE_LVDS,
34128c10f9eSGabriel Fernandez GATE_CSI,
34228c10f9eSGabriel Fernandez GATE_DCMIPP,
34328c10f9eSGabriel Fernandez GATE_CCI,
34428c10f9eSGabriel Fernandez GATE_VDEC,
34528c10f9eSGabriel Fernandez GATE_VENC,
34628c10f9eSGabriel Fernandez GATE_RNG,
34728c10f9eSGabriel Fernandez GATE_PKA,
34828c10f9eSGabriel Fernandez GATE_SAES,
34928c10f9eSGabriel Fernandez GATE_HASH,
35028c10f9eSGabriel Fernandez GATE_CRYP1,
35128c10f9eSGabriel Fernandez GATE_CRYP2,
35228c10f9eSGabriel Fernandez GATE_IWDG1,
35328c10f9eSGabriel Fernandez GATE_IWDG2,
35428c10f9eSGabriel Fernandez GATE_IWDG3,
35528c10f9eSGabriel Fernandez GATE_IWDG4,
35628c10f9eSGabriel Fernandez GATE_IWDG5,
35728c10f9eSGabriel Fernandez GATE_WWDG1,
35828c10f9eSGabriel Fernandez GATE_WWDG2,
35928c10f9eSGabriel Fernandez GATE_VREF,
36028c10f9eSGabriel Fernandez GATE_DTS,
36128c10f9eSGabriel Fernandez GATE_CRC,
36228c10f9eSGabriel Fernandez GATE_SERC,
36328c10f9eSGabriel Fernandez GATE_OSPIIOM,
36428c10f9eSGabriel Fernandez GATE_GICV2M,
36528c10f9eSGabriel Fernandez GATE_I3C1,
36628c10f9eSGabriel Fernandez GATE_I3C2,
36728c10f9eSGabriel Fernandez GATE_I3C3,
36828c10f9eSGabriel Fernandez GATE_I3C4,
36928c10f9eSGabriel Fernandez GATE_NB
37028c10f9eSGabriel Fernandez };
37128c10f9eSGabriel Fernandez
37228c10f9eSGabriel Fernandez #define GATE_CFG(_id, _offset, _bit_idx, _offset_clr)\
37328c10f9eSGabriel Fernandez [(_id)] = {\
37428c10f9eSGabriel Fernandez .offset = (_offset),\
37528c10f9eSGabriel Fernandez .bit_idx = (_bit_idx),\
37628c10f9eSGabriel Fernandez .set_clr = (_offset_clr),\
37728c10f9eSGabriel Fernandez }
37828c10f9eSGabriel Fernandez
37928c10f9eSGabriel Fernandez static const struct gate_cfg gates_mp25[GATE_NB] = {
38028c10f9eSGabriel Fernandez GATE_CFG(GATE_LSE, RCC_BDCR, 0, 0),
38128c10f9eSGabriel Fernandez GATE_CFG(GATE_LSE_RDY, RCC_BDCR, 2, 0),
38228c10f9eSGabriel Fernandez GATE_CFG(GATE_LSI, RCC_BDCR, 9, 0),
38328c10f9eSGabriel Fernandez GATE_CFG(GATE_LSI_RDY, RCC_BDCR, 10, 0),
38428c10f9eSGabriel Fernandez GATE_CFG(GATE_RTCCK, RCC_BDCR, 20, 0),
38528c10f9eSGabriel Fernandez GATE_CFG(GATE_MSI, RCC_D3DCR, 0, 0),
38628c10f9eSGabriel Fernandez GATE_CFG(GATE_MSI_RDY, RCC_D3DCR, 2, 0),
38728c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL1, RCC_PLL2CFGR1, 8, 0),
38828c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL1_RDY, RCC_PLL2CFGR1, 24, 0),
38928c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL2, RCC_PLL2CFGR1, 8, 0),
39028c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL2_RDY, RCC_PLL2CFGR1, 24, 0),
39128c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL3, RCC_PLL3CFGR1, 8, 0),
39228c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL3_RDY, RCC_PLL3CFGR1, 24, 0),
39328c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL4, RCC_PLL4CFGR1, 8, 0),
39428c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL4_RDY, RCC_PLL4CFGR1, 24, 0),
39528c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL5, RCC_PLL5CFGR1, 8, 0),
39628c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL5_RDY, RCC_PLL5CFGR1, 24, 0),
39728c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL6, RCC_PLL6CFGR1, 8, 0),
39828c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL6_RDY, RCC_PLL6CFGR1, 24, 0),
39928c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL7, RCC_PLL7CFGR1, 8, 0),
40028c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL7_RDY, RCC_PLL7CFGR1, 24, 0),
40128c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL8, RCC_PLL8CFGR1, 8, 0),
40228c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL8_RDY, RCC_PLL8CFGR1, 24, 0),
40328c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL4_CKREFST, RCC_PLL4CFGR1, 28, 0),
40428c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL5_CKREFST, RCC_PLL5CFGR1, 28, 0),
40528c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL6_CKREFST, RCC_PLL6CFGR1, 28, 0),
40628c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL7_CKREFST, RCC_PLL7CFGR1, 28, 0),
40728c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL8_CKREFST, RCC_PLL8CFGR1, 28, 0),
40828c10f9eSGabriel Fernandez GATE_CFG(GATE_C3, RCC_C3CFGR, 1, 0),
40928c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM3C3, RCC_C3CFGR, 16, 0),
41028c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM4C3, RCC_C3CFGR, 17, 0),
41128c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM5C3, RCC_C3CFGR, 18, 0),
41228c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI8C3, RCC_C3CFGR, 19, 0),
41328c10f9eSGabriel Fernandez GATE_CFG(GATE_LPUART1C3, RCC_C3CFGR, 20, 0),
41428c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C8C3, RCC_C3CFGR, 21, 0),
41528c10f9eSGabriel Fernandez GATE_CFG(GATE_ADF1C3, RCC_C3CFGR, 23, 0),
41628c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOZC3, RCC_C3CFGR, 24, 0),
41728c10f9eSGabriel Fernandez GATE_CFG(GATE_LPDMAC3, RCC_C3CFGR, 25, 0),
41828c10f9eSGabriel Fernandez GATE_CFG(GATE_RTCC3, RCC_C3CFGR, 26, 0),
41928c10f9eSGabriel Fernandez GATE_CFG(GATE_I3C4C3, RCC_C3CFGR, 27, 0),
42028c10f9eSGabriel Fernandez GATE_CFG(GATE_MCO1, RCC_MCO1CFGR, 8, 0),
42128c10f9eSGabriel Fernandez GATE_CFG(GATE_MCO2, RCC_MCO2CFGR, 8, 0),
42228c10f9eSGabriel Fernandez GATE_CFG(GATE_HSI, RCC_OCENSETR, 0, 1),
42328c10f9eSGabriel Fernandez GATE_CFG(GATE_HSEDIV2, RCC_OCENSETR, 5, 1),
42428c10f9eSGabriel Fernandez GATE_CFG(GATE_HSE, RCC_OCENSETR, 8, 1),
42528c10f9eSGabriel Fernandez GATE_CFG(GATE_HSI_RDY, RCC_OCRDYR, 0, 0),
42628c10f9eSGabriel Fernandez GATE_CFG(GATE_HSE_RDY, RCC_OCRDYR, 8, 0),
42728c10f9eSGabriel Fernandez GATE_CFG(GATE_APB1DIV_RDY, RCC_APB1DIVR, 31, 0),
42828c10f9eSGabriel Fernandez GATE_CFG(GATE_APB2DIV_RDY, RCC_APB2DIVR, 31, 0),
42928c10f9eSGabriel Fernandez GATE_CFG(GATE_APB3DIV_RDY, RCC_APB3DIVR, 31, 0),
43028c10f9eSGabriel Fernandez GATE_CFG(GATE_APB4DIV_RDY, RCC_APB4DIVR, 31, 0),
43128c10f9eSGabriel Fernandez GATE_CFG(GATE_APBDBGDIV_RDY, RCC_APBDBGDIVR, 31, 0),
43228c10f9eSGabriel Fernandez GATE_CFG(GATE_TIMG1PRE_RDY, RCC_TIMG1PRER, 31, 0),
43328c10f9eSGabriel Fernandez GATE_CFG(GATE_TIMG2PRE_RDY, RCC_TIMG2PRER, 31, 0),
43428c10f9eSGabriel Fernandez GATE_CFG(GATE_LSMCUDIV_RDY, RCC_LSMCUDIVR, 31, 0),
43528c10f9eSGabriel Fernandez GATE_CFG(GATE_DDRCP, RCC_DDRCPCFGR, 1, 0),
43628c10f9eSGabriel Fernandez GATE_CFG(GATE_DDRCAPB, RCC_DDRCAPBCFGR, 1, 0),
43728c10f9eSGabriel Fernandez GATE_CFG(GATE_DDRPHYCAPB, RCC_DDRPHYCAPBCFGR, 1, 0),
43828c10f9eSGabriel Fernandez GATE_CFG(GATE_DDRPHYC, RCC_DDRPHYCCFGR, 1, 0),
43928c10f9eSGabriel Fernandez GATE_CFG(GATE_DDRCFG, RCC_DDRCFGR, 1, 0),
44028c10f9eSGabriel Fernandez GATE_CFG(GATE_SYSRAM, RCC_SYSRAMCFGR, 1, 0),
44128c10f9eSGabriel Fernandez GATE_CFG(GATE_VDERAM, RCC_VDERAMCFGR, 1, 0),
44228c10f9eSGabriel Fernandez GATE_CFG(GATE_SRAM1, RCC_SRAM1CFGR, 1, 0),
44328c10f9eSGabriel Fernandez GATE_CFG(GATE_SRAM2, RCC_SRAM2CFGR, 1, 0),
44428c10f9eSGabriel Fernandez GATE_CFG(GATE_RETRAM, RCC_RETRAMCFGR, 1, 0),
44528c10f9eSGabriel Fernandez GATE_CFG(GATE_BKPSRAM, RCC_BKPSRAMCFGR, 1, 0),
44628c10f9eSGabriel Fernandez GATE_CFG(GATE_LPSRAM1, RCC_LPSRAM1CFGR, 1, 0),
44728c10f9eSGabriel Fernandez GATE_CFG(GATE_LPSRAM2, RCC_LPSRAM2CFGR, 1, 0),
44828c10f9eSGabriel Fernandez GATE_CFG(GATE_LPSRAM3, RCC_LPSRAM3CFGR, 1, 0),
44928c10f9eSGabriel Fernandez GATE_CFG(GATE_OSPI1, RCC_OSPI1CFGR, 1, 0),
45028c10f9eSGabriel Fernandez GATE_CFG(GATE_OSPI2, RCC_OSPI2CFGR, 1, 0),
45128c10f9eSGabriel Fernandez GATE_CFG(GATE_FMC, RCC_FMCCFGR, 1, 0),
45228c10f9eSGabriel Fernandez GATE_CFG(GATE_DBG, RCC_DBGCFGR, 8, 0),
45328c10f9eSGabriel Fernandez GATE_CFG(GATE_TRACE, RCC_DBGCFGR, 9, 0),
45428c10f9eSGabriel Fernandez GATE_CFG(GATE_STM, RCC_STMCFGR, 1, 0),
45528c10f9eSGabriel Fernandez GATE_CFG(GATE_ETR, RCC_ETRCFGR, 1, 0),
45628c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOA, RCC_GPIOACFGR, 1, 0),
45728c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOB, RCC_GPIOBCFGR, 1, 0),
45828c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOC, RCC_GPIOCCFGR, 1, 0),
45928c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOD, RCC_GPIODCFGR, 1, 0),
46028c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOE, RCC_GPIOECFGR, 1, 0),
46128c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOF, RCC_GPIOFCFGR, 1, 0),
46228c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOG, RCC_GPIOGCFGR, 1, 0),
46328c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOH, RCC_GPIOHCFGR, 1, 0),
46428c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOI, RCC_GPIOICFGR, 1, 0),
46528c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOJ, RCC_GPIOJCFGR, 1, 0),
46628c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOK, RCC_GPIOKCFGR, 1, 0),
46728c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOZ, RCC_GPIOZCFGR, 1, 0),
46828c10f9eSGabriel Fernandez GATE_CFG(GATE_HPDMA1, RCC_HPDMA1CFGR, 1, 0),
46928c10f9eSGabriel Fernandez GATE_CFG(GATE_HPDMA2, RCC_HPDMA2CFGR, 1, 0),
47028c10f9eSGabriel Fernandez GATE_CFG(GATE_HPDMA3, RCC_HPDMA3CFGR, 1, 0),
47128c10f9eSGabriel Fernandez GATE_CFG(GATE_LPDMA, RCC_LPDMACFGR, 1, 0),
47228c10f9eSGabriel Fernandez GATE_CFG(GATE_HSEM, RCC_HSEMCFGR, 1, 0),
47328c10f9eSGabriel Fernandez GATE_CFG(GATE_IPCC1, RCC_IPCC1CFGR, 1, 0),
47428c10f9eSGabriel Fernandez GATE_CFG(GATE_IPCC2, RCC_IPCC2CFGR, 1, 0),
47528c10f9eSGabriel Fernandez GATE_CFG(GATE_RTC, RCC_RTCCFGR, 1, 0),
47628c10f9eSGabriel Fernandez GATE_CFG(GATE_SYSCPU1, RCC_SYSCPU1CFGR, 1, 0),
47728c10f9eSGabriel Fernandez GATE_CFG(GATE_BSEC, RCC_BSECCFGR, 1, 0),
47828c10f9eSGabriel Fernandez GATE_CFG(GATE_IS2M, RCC_IS2MCFGR, 1, 0),
47928c10f9eSGabriel Fernandez GATE_CFG(GATE_HSIMON, RCC_HSIFMONCR, 15, 0),
48028c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM1, RCC_TIM1CFGR, 1, 0),
48128c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM2, RCC_TIM2CFGR, 1, 0),
48228c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM3, RCC_TIM3CFGR, 1, 0),
48328c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM4, RCC_TIM4CFGR, 1, 0),
48428c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM5, RCC_TIM5CFGR, 1, 0),
48528c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM6, RCC_TIM6CFGR, 1, 0),
48628c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM7, RCC_TIM7CFGR, 1, 0),
48728c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM8, RCC_TIM8CFGR, 1, 0),
48828c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM10, RCC_TIM10CFGR, 1, 0),
48928c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM11, RCC_TIM11CFGR, 1, 0),
49028c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM12, RCC_TIM12CFGR, 1, 0),
49128c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM13, RCC_TIM13CFGR, 1, 0),
49228c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM14, RCC_TIM14CFGR, 1, 0),
49328c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM15, RCC_TIM15CFGR, 1, 0),
49428c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM16, RCC_TIM16CFGR, 1, 0),
49528c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM17, RCC_TIM17CFGR, 1, 0),
49628c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM20, RCC_TIM20CFGR, 1, 0),
49728c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM1, RCC_LPTIM1CFGR, 1, 0),
49828c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM2, RCC_LPTIM2CFGR, 1, 0),
49928c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM3, RCC_LPTIM3CFGR, 1, 0),
50028c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM4, RCC_LPTIM4CFGR, 1, 0),
50128c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM5, RCC_LPTIM5CFGR, 1, 0),
50228c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI1, RCC_SPI1CFGR, 1, 0),
50328c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI2, RCC_SPI2CFGR, 1, 0),
50428c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI3, RCC_SPI3CFGR, 1, 0),
50528c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI4, RCC_SPI4CFGR, 1, 0),
50628c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI5, RCC_SPI5CFGR, 1, 0),
50728c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI6, RCC_SPI6CFGR, 1, 0),
50828c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI7, RCC_SPI7CFGR, 1, 0),
50928c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI8, RCC_SPI8CFGR, 1, 0),
51028c10f9eSGabriel Fernandez GATE_CFG(GATE_SPDIFRX, RCC_SPDIFRXCFGR, 1, 0),
51128c10f9eSGabriel Fernandez GATE_CFG(GATE_USART1, RCC_USART1CFGR, 1, 0),
51228c10f9eSGabriel Fernandez GATE_CFG(GATE_USART2, RCC_USART2CFGR, 1, 0),
51328c10f9eSGabriel Fernandez GATE_CFG(GATE_USART3, RCC_USART3CFGR, 1, 0),
51428c10f9eSGabriel Fernandez GATE_CFG(GATE_UART4, RCC_UART4CFGR, 1, 0),
51528c10f9eSGabriel Fernandez GATE_CFG(GATE_UART5, RCC_UART5CFGR, 1, 0),
51628c10f9eSGabriel Fernandez GATE_CFG(GATE_USART6, RCC_USART6CFGR, 1, 0),
51728c10f9eSGabriel Fernandez GATE_CFG(GATE_UART7, RCC_UART7CFGR, 1, 0),
51828c10f9eSGabriel Fernandez GATE_CFG(GATE_UART8, RCC_UART8CFGR, 1, 0),
51928c10f9eSGabriel Fernandez GATE_CFG(GATE_UART9, RCC_UART9CFGR, 1, 0),
52028c10f9eSGabriel Fernandez GATE_CFG(GATE_LPUART1, RCC_LPUART1CFGR, 1, 0),
52128c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C1, RCC_I2C1CFGR, 1, 0),
52228c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C2, RCC_I2C2CFGR, 1, 0),
52328c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C3, RCC_I2C3CFGR, 1, 0),
52428c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C4, RCC_I2C4CFGR, 1, 0),
52528c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C5, RCC_I2C5CFGR, 1, 0),
52628c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C6, RCC_I2C6CFGR, 1, 0),
52728c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C7, RCC_I2C7CFGR, 1, 0),
52828c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C8, RCC_I2C8CFGR, 1, 0),
52928c10f9eSGabriel Fernandez GATE_CFG(GATE_SAI1, RCC_SAI1CFGR, 1, 0),
53028c10f9eSGabriel Fernandez GATE_CFG(GATE_SAI2, RCC_SAI2CFGR, 1, 0),
53128c10f9eSGabriel Fernandez GATE_CFG(GATE_SAI3, RCC_SAI3CFGR, 1, 0),
53228c10f9eSGabriel Fernandez GATE_CFG(GATE_SAI4, RCC_SAI4CFGR, 1, 0),
53328c10f9eSGabriel Fernandez GATE_CFG(GATE_MDF1, RCC_MDF1CFGR, 1, 0),
53428c10f9eSGabriel Fernandez GATE_CFG(GATE_ADF1, RCC_ADF1CFGR, 1, 0),
53528c10f9eSGabriel Fernandez GATE_CFG(GATE_FDCAN, RCC_FDCANCFGR, 1, 0),
53628c10f9eSGabriel Fernandez GATE_CFG(GATE_HDP, RCC_HDPCFGR, 1, 0),
53728c10f9eSGabriel Fernandez GATE_CFG(GATE_ADC12, RCC_ADC12CFGR, 1, 0),
53828c10f9eSGabriel Fernandez GATE_CFG(GATE_ADC3, RCC_ADC3CFGR, 1, 0),
53928c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH1MAC, RCC_ETH1CFGR, 1, 0),
54028c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH1STP, RCC_ETH1CFGR, 4, 0),
54128c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH1, RCC_ETH1CFGR, 5, 0),
54228c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH1TX, RCC_ETH1CFGR, 8, 0),
54328c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH1RX, RCC_ETH1CFGR, 10, 0),
54428c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH2MAC, RCC_ETH2CFGR, 1, 0),
54528c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH2STP, RCC_ETH2CFGR, 4, 0),
54628c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH2, RCC_ETH2CFGR, 5, 0),
54728c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH2TX, RCC_ETH2CFGR, 8, 0),
54828c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH2RX, RCC_ETH2CFGR, 10, 0),
54928c10f9eSGabriel Fernandez GATE_CFG(GATE_USB2, RCC_USB2CFGR, 1, 0),
55028c10f9eSGabriel Fernandez GATE_CFG(GATE_USB2PHY1, RCC_USB2PHY1CFGR, 1, 0),
55128c10f9eSGabriel Fernandez GATE_CFG(GATE_USB2PHY2, RCC_USB2PHY2CFGR, 1, 0),
55228c10f9eSGabriel Fernandez GATE_CFG(GATE_USB3DR, RCC_USB3DRCFGR, 1, 0),
55328c10f9eSGabriel Fernandez GATE_CFG(GATE_USB3PCIEPHY, RCC_USB3PCIEPHYCFGR, 1, 0),
55428c10f9eSGabriel Fernandez GATE_CFG(GATE_PCIE, RCC_PCIECFGR, 1, 0),
55528c10f9eSGabriel Fernandez GATE_CFG(GATE_USBTC, RCC_USBTCCFGR, 1, 0),
55628c10f9eSGabriel Fernandez GATE_CFG(GATE_ETHSWMAC, RCC_ETHSWCFGR, 1, 0),
55728c10f9eSGabriel Fernandez GATE_CFG(GATE_ETHSW, RCC_ETHSWCFGR, 5, 0),
55828c10f9eSGabriel Fernandez GATE_CFG(GATE_ETHSWREF, RCC_ETHSWCFGR, 21, 0),
55928c10f9eSGabriel Fernandez GATE_CFG(GATE_STGEN, RCC_STGENCFGR, 1, 0),
56028c10f9eSGabriel Fernandez GATE_CFG(GATE_SDMMC1, RCC_SDMMC1CFGR, 1, 0),
56128c10f9eSGabriel Fernandez GATE_CFG(GATE_SDMMC2, RCC_SDMMC2CFGR, 1, 0),
56228c10f9eSGabriel Fernandez GATE_CFG(GATE_SDMMC3, RCC_SDMMC3CFGR, 1, 0),
56328c10f9eSGabriel Fernandez GATE_CFG(GATE_GPU, RCC_GPUCFGR, 1, 0),
56428c10f9eSGabriel Fernandez GATE_CFG(GATE_LTDC, RCC_LTDCCFGR, 1, 0),
56528c10f9eSGabriel Fernandez GATE_CFG(GATE_DSI, RCC_DSICFGR, 1, 0),
56628c10f9eSGabriel Fernandez GATE_CFG(GATE_LVDS, RCC_LVDSCFGR, 1, 0),
56728c10f9eSGabriel Fernandez GATE_CFG(GATE_CSI, RCC_CSICFGR, 1, 0),
56828c10f9eSGabriel Fernandez GATE_CFG(GATE_DCMIPP, RCC_DCMIPPCFGR, 1, 0),
56928c10f9eSGabriel Fernandez GATE_CFG(GATE_CCI, RCC_CCICFGR, 1, 0),
57028c10f9eSGabriel Fernandez GATE_CFG(GATE_VDEC, RCC_VDECCFGR, 1, 0),
57128c10f9eSGabriel Fernandez GATE_CFG(GATE_VENC, RCC_VENCCFGR, 1, 0),
57228c10f9eSGabriel Fernandez GATE_CFG(GATE_RNG, RCC_RNGCFGR, 1, 0),
57328c10f9eSGabriel Fernandez GATE_CFG(GATE_PKA, RCC_PKACFGR, 1, 0),
57428c10f9eSGabriel Fernandez GATE_CFG(GATE_SAES, RCC_SAESCFGR, 1, 0),
57528c10f9eSGabriel Fernandez GATE_CFG(GATE_HASH, RCC_HASHCFGR, 1, 0),
57628c10f9eSGabriel Fernandez GATE_CFG(GATE_CRYP1, RCC_CRYP1CFGR, 1, 0),
57728c10f9eSGabriel Fernandez GATE_CFG(GATE_CRYP2, RCC_CRYP2CFGR, 1, 0),
57828c10f9eSGabriel Fernandez GATE_CFG(GATE_IWDG1, RCC_IWDG1CFGR, 1, 0),
57928c10f9eSGabriel Fernandez GATE_CFG(GATE_IWDG2, RCC_IWDG2CFGR, 1, 0),
58028c10f9eSGabriel Fernandez GATE_CFG(GATE_IWDG3, RCC_IWDG3CFGR, 1, 0),
58128c10f9eSGabriel Fernandez GATE_CFG(GATE_IWDG4, RCC_IWDG4CFGR, 1, 0),
58228c10f9eSGabriel Fernandez GATE_CFG(GATE_IWDG5, RCC_IWDG5CFGR, 1, 0),
58328c10f9eSGabriel Fernandez GATE_CFG(GATE_WWDG1, RCC_WWDG1CFGR, 1, 0),
58428c10f9eSGabriel Fernandez GATE_CFG(GATE_WWDG2, RCC_WWDG2CFGR, 1, 0),
58528c10f9eSGabriel Fernandez GATE_CFG(GATE_VREF, RCC_VREFCFGR, 1, 0),
58628c10f9eSGabriel Fernandez GATE_CFG(GATE_DTS, RCC_DTSCFGR, 1, 0),
58728c10f9eSGabriel Fernandez GATE_CFG(GATE_CRC, RCC_CRCCFGR, 1, 0),
58828c10f9eSGabriel Fernandez GATE_CFG(GATE_SERC, RCC_SERCCFGR, 1, 0),
58928c10f9eSGabriel Fernandez GATE_CFG(GATE_OSPIIOM, RCC_OSPIIOMCFGR, 1, 0),
59028c10f9eSGabriel Fernandez GATE_CFG(GATE_GICV2M, RCC_GICV2MCFGR, 1, 0),
59128c10f9eSGabriel Fernandez GATE_CFG(GATE_I3C1, RCC_I3C1CFGR, 1, 0),
59228c10f9eSGabriel Fernandez GATE_CFG(GATE_I3C2, RCC_I3C2CFGR, 1, 0),
59328c10f9eSGabriel Fernandez GATE_CFG(GATE_I3C3, RCC_I3C3CFGR, 1, 0),
59428c10f9eSGabriel Fernandez GATE_CFG(GATE_I3C4, RCC_I3C4CFGR, 1, 0),
59528c10f9eSGabriel Fernandez };
59628c10f9eSGabriel Fernandez
59728c10f9eSGabriel Fernandez /*
59828c10f9eSGabriel Fernandez * MUX CONFIG
59928c10f9eSGabriel Fernandez */
60028c10f9eSGabriel Fernandez
60128c10f9eSGabriel Fernandez #define _MUX_CFG(_id, _offset, _shift, _width, _rdy)\
60228c10f9eSGabriel Fernandez [(_id)] = {\
60328c10f9eSGabriel Fernandez .offset = (_offset),\
60428c10f9eSGabriel Fernandez .shift = (_shift),\
60528c10f9eSGabriel Fernandez .width = (_width),\
60628c10f9eSGabriel Fernandez .ready = (_rdy),\
60728c10f9eSGabriel Fernandez }
60828c10f9eSGabriel Fernandez
60928c10f9eSGabriel Fernandez static const struct mux_cfg parent_mp25[MUX_NB] = {
61028c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL0, RCC_MUXSELCFGR, 0, 2, GATE_PLL4_CKREFST),
61128c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL1, RCC_MUXSELCFGR, 4, 2, GATE_PLL5_CKREFST),
61228c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL2, RCC_MUXSELCFGR, 8, 2, GATE_PLL6_CKREFST),
61328c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL3, RCC_MUXSELCFGR, 12, 2, GATE_PLL7_CKREFST),
61428c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL4, RCC_MUXSELCFGR, 16, 2, GATE_PLL8_CKREFST),
61528c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL5, RCC_MUXSELCFGR, 20, 2, MUX_NO_RDY),
61628c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL6, RCC_MUXSELCFGR, 24, 2, MUX_NO_RDY),
61728c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL7, RCC_MUXSELCFGR, 28, 2, MUX_NO_RDY),
61828c10f9eSGabriel Fernandez _MUX_CFG(MUX_XBARSEL, RCC_XBAR0CFGR, 0, 4, MUX_NO_RDY),
61928c10f9eSGabriel Fernandez _MUX_CFG(MUX_RTC, RCC_BDCR, 16, 2, MUX_NO_RDY),
62028c10f9eSGabriel Fernandez _MUX_CFG(MUX_D3PER, RCC_D3DCR, 16, 2, MUX_NO_RDY),
62128c10f9eSGabriel Fernandez _MUX_CFG(MUX_MCO1, RCC_MCO1CFGR, 0, 1, MUX_NO_RDY),
62228c10f9eSGabriel Fernandez _MUX_CFG(MUX_MCO2, RCC_MCO2CFGR, 0, 1, MUX_NO_RDY),
62328c10f9eSGabriel Fernandez _MUX_CFG(MUX_ADC12, RCC_ADC12CFGR, 12, 1, MUX_NO_RDY),
62428c10f9eSGabriel Fernandez _MUX_CFG(MUX_ADC3, RCC_ADC3CFGR, 12, 2, MUX_NO_RDY),
62528c10f9eSGabriel Fernandez _MUX_CFG(MUX_USB2PHY1, RCC_USB2PHY1CFGR, 15, 1, MUX_NO_RDY),
62628c10f9eSGabriel Fernandez _MUX_CFG(MUX_USB2PHY2, RCC_USB2PHY2CFGR, 15, 1, MUX_NO_RDY),
62728c10f9eSGabriel Fernandez _MUX_CFG(MUX_USB3PCIEPHY, RCC_USB3PCIEPHYCFGR, 15, 1, MUX_NO_RDY),
62828c10f9eSGabriel Fernandez _MUX_CFG(MUX_DSIBLANE, RCC_DSICFGR, 12, 1, MUX_NO_RDY),
62928c10f9eSGabriel Fernandez _MUX_CFG(MUX_DSIPHY, RCC_DSICFGR, 15, 1, MUX_NO_RDY),
63028c10f9eSGabriel Fernandez _MUX_CFG(MUX_LVDSPHY, RCC_LVDSCFGR, 15, 1, MUX_NO_RDY),
63128c10f9eSGabriel Fernandez _MUX_CFG(MUX_DTS, RCC_DTSCFGR, 12, 2, MUX_NO_RDY),
63228c10f9eSGabriel Fernandez };
63328c10f9eSGabriel Fernandez
63428c10f9eSGabriel Fernandez /*
63528c10f9eSGabriel Fernandez * DIV CONFIG
63628c10f9eSGabriel Fernandez */
63728c10f9eSGabriel Fernandez
63828c10f9eSGabriel Fernandez static const struct div_table_cfg apb_div_table[] = {
63928c10f9eSGabriel Fernandez { .val = 0, .div = 1 },
64028c10f9eSGabriel Fernandez { .val = 1, .div = 2 },
64128c10f9eSGabriel Fernandez { .val = 2, .div = 4 },
64228c10f9eSGabriel Fernandez { .val = 3, .div = 8 },
64328c10f9eSGabriel Fernandez { .val = 4, .div = 16 },
64428c10f9eSGabriel Fernandez { .val = 5, .div = 16 },
64528c10f9eSGabriel Fernandez { .val = 6, .div = 16 },
64628c10f9eSGabriel Fernandez { .val = 7, .div = 16 },
64728c10f9eSGabriel Fernandez /* .div = 0 termination cell */
64828c10f9eSGabriel Fernandez { }
64928c10f9eSGabriel Fernandez };
65028c10f9eSGabriel Fernandez
65128c10f9eSGabriel Fernandez #define _DIV_CFG(_id, _offset, _shift, _width, _flags, _table, _ready)\
65228c10f9eSGabriel Fernandez [(_id)] = {\
65328c10f9eSGabriel Fernandez .offset = (_offset),\
65428c10f9eSGabriel Fernandez .shift = (_shift),\
65528c10f9eSGabriel Fernandez .width = (_width),\
65628c10f9eSGabriel Fernandez .flags = (_flags),\
65728c10f9eSGabriel Fernandez .table = (_table),\
65828c10f9eSGabriel Fernandez .ready = (_ready),\
65928c10f9eSGabriel Fernandez }
66028c10f9eSGabriel Fernandez
66128c10f9eSGabriel Fernandez static const struct div_cfg dividers_mp25[DIV_NB] = {
66228c10f9eSGabriel Fernandez _DIV_CFG(DIV_RTC, RCC_RTCDIVR, 0, 6, 0, NULL, DIV_NO_RDY),
66328c10f9eSGabriel Fernandez _DIV_CFG(DIV_APB1, RCC_APB1DIVR, 0, 3, 0, apb_div_table,
66428c10f9eSGabriel Fernandez GATE_APB1DIV_RDY),
66528c10f9eSGabriel Fernandez _DIV_CFG(DIV_APB2, RCC_APB2DIVR, 0, 3, 0, apb_div_table,
66628c10f9eSGabriel Fernandez GATE_APB2DIV_RDY),
66728c10f9eSGabriel Fernandez _DIV_CFG(DIV_APB3, RCC_APB3DIVR, 0, 3, 0, apb_div_table,
66828c10f9eSGabriel Fernandez GATE_APB3DIV_RDY),
66928c10f9eSGabriel Fernandez _DIV_CFG(DIV_APB4, RCC_APB4DIVR, 0, 3, 0, apb_div_table,
67028c10f9eSGabriel Fernandez GATE_APB4DIV_RDY),
67128c10f9eSGabriel Fernandez _DIV_CFG(DIV_APBDBG, RCC_APBDBGDIVR, 0, 3, 0, apb_div_table,
67228c10f9eSGabriel Fernandez GATE_APBDBGDIV_RDY),
67328c10f9eSGabriel Fernandez _DIV_CFG(DIV_LSMCU, RCC_LSMCUDIVR, 0, 1, 0, NULL, GATE_LSMCUDIV_RDY),
67428c10f9eSGabriel Fernandez };
67528c10f9eSGabriel Fernandez
67628c10f9eSGabriel Fernandez enum stm32_osc {
67728c10f9eSGabriel Fernandez OSC_HSI,
67828c10f9eSGabriel Fernandez OSC_HSE,
67928c10f9eSGabriel Fernandez OSC_MSI,
68028c10f9eSGabriel Fernandez OSC_LSI,
68128c10f9eSGabriel Fernandez OSC_LSE,
68228c10f9eSGabriel Fernandez NB_OSCILLATOR
68328c10f9eSGabriel Fernandez };
68428c10f9eSGabriel Fernandez
68528c10f9eSGabriel Fernandez struct clk_stm32_bypass {
68628c10f9eSGabriel Fernandez uint16_t offset;
68728c10f9eSGabriel Fernandez uint8_t bit_byp;
68828c10f9eSGabriel Fernandez uint8_t bit_digbyp;
68928c10f9eSGabriel Fernandez };
69028c10f9eSGabriel Fernandez
69128c10f9eSGabriel Fernandez struct clk_stm32_css {
69228c10f9eSGabriel Fernandez uint16_t offset;
69328c10f9eSGabriel Fernandez uint8_t bit_css;
69428c10f9eSGabriel Fernandez };
69528c10f9eSGabriel Fernandez
69628c10f9eSGabriel Fernandez struct clk_stm32_drive {
69728c10f9eSGabriel Fernandez uint16_t offset;
69828c10f9eSGabriel Fernandez uint8_t drv_shift;
69928c10f9eSGabriel Fernandez uint8_t drv_width;
70028c10f9eSGabriel Fernandez uint8_t drv_default;
70128c10f9eSGabriel Fernandez };
70228c10f9eSGabriel Fernandez
70328c10f9eSGabriel Fernandez struct clk_oscillator_data {
70428c10f9eSGabriel Fernandez const char *name;
70528c10f9eSGabriel Fernandez unsigned long frequency;
70628c10f9eSGabriel Fernandez uint16_t gate_id;
70728c10f9eSGabriel Fernandez struct clk_stm32_bypass *bypass;
70828c10f9eSGabriel Fernandez struct clk_stm32_css *css;
70928c10f9eSGabriel Fernandez struct clk_stm32_drive *drive;
71028c10f9eSGabriel Fernandez };
71128c10f9eSGabriel Fernandez
71228c10f9eSGabriel Fernandez #define BYPASS(_offset, _bit_byp, _bit_digbyp) \
71328c10f9eSGabriel Fernandez (&(struct clk_stm32_bypass){\
71428c10f9eSGabriel Fernandez .offset = (_offset),\
71528c10f9eSGabriel Fernandez .bit_byp = (_bit_byp),\
71628c10f9eSGabriel Fernandez .bit_digbyp = (_bit_digbyp),\
71728c10f9eSGabriel Fernandez })
71828c10f9eSGabriel Fernandez
71928c10f9eSGabriel Fernandez #define CSS(_offset, _bit_css) \
72028c10f9eSGabriel Fernandez (&(struct clk_stm32_css){\
72128c10f9eSGabriel Fernandez .offset = (_offset),\
72228c10f9eSGabriel Fernandez .bit_css = (_bit_css),\
72328c10f9eSGabriel Fernandez })
72428c10f9eSGabriel Fernandez
72528c10f9eSGabriel Fernandez #define DRIVE(_offset, _shift, _width, _default) \
72628c10f9eSGabriel Fernandez (&(struct clk_stm32_drive){\
72728c10f9eSGabriel Fernandez .offset = (_offset),\
72828c10f9eSGabriel Fernandez .drv_shift = (_shift),\
72928c10f9eSGabriel Fernandez .drv_width = (_width),\
73028c10f9eSGabriel Fernandez .drv_default = (_default),\
73128c10f9eSGabriel Fernandez })
73228c10f9eSGabriel Fernandez
73328c10f9eSGabriel Fernandez #define OSCILLATOR(idx_osc, _name, _gate_id, _bypass, _css, _drive) \
73428c10f9eSGabriel Fernandez [(idx_osc)] = (struct clk_oscillator_data){\
73528c10f9eSGabriel Fernandez .name = (_name),\
73628c10f9eSGabriel Fernandez .gate_id = (_gate_id),\
73728c10f9eSGabriel Fernandez .bypass = (_bypass),\
73828c10f9eSGabriel Fernandez .css = (_css),\
73928c10f9eSGabriel Fernandez .drive = (_drive),\
74028c10f9eSGabriel Fernandez }
74128c10f9eSGabriel Fernandez
74228c10f9eSGabriel Fernandez static struct clk_oscillator_data stm32mp25_osc_data[NB_OSCILLATOR] = {
74328c10f9eSGabriel Fernandez OSCILLATOR(OSC_HSI, "clk-hsi", GATE_HSI,
74428c10f9eSGabriel Fernandez NULL, NULL, NULL),
74528c10f9eSGabriel Fernandez
74628c10f9eSGabriel Fernandez OSCILLATOR(OSC_LSI, "clk-lsi", GATE_LSI,
74728c10f9eSGabriel Fernandez NULL, NULL, NULL),
74828c10f9eSGabriel Fernandez
74928c10f9eSGabriel Fernandez OSCILLATOR(OSC_MSI, "clk-msi", GATE_MSI,
75028c10f9eSGabriel Fernandez NULL, NULL, NULL),
75128c10f9eSGabriel Fernandez
75228c10f9eSGabriel Fernandez OSCILLATOR(OSC_LSE, "clk-lse", GATE_LSE,
75328c10f9eSGabriel Fernandez BYPASS(RCC_BDCR, RCC_BDCR_LSEBYP_BIT,
75428c10f9eSGabriel Fernandez RCC_BDCR_LSEDIGBYP_BIT),
75528c10f9eSGabriel Fernandez CSS(RCC_BDCR, RCC_BDCR_LSECSSON_BIT),
75628c10f9eSGabriel Fernandez DRIVE(RCC_BDCR, RCC_BDCR_LSEDRV_SHIFT,
75728c10f9eSGabriel Fernandez RCC_BDCR_LSEDRV_WIDTH, LSEDRV_MEDIUM_HIGH)),
75828c10f9eSGabriel Fernandez
75928c10f9eSGabriel Fernandez OSCILLATOR(OSC_HSE, "clk-hse", GATE_HSE,
76028c10f9eSGabriel Fernandez BYPASS(RCC_OCENSETR, RCC_OCENSETR_HSEBYP_BIT,
76128c10f9eSGabriel Fernandez RCC_OCENSETR_HSEDIGBYP_BIT),
76228c10f9eSGabriel Fernandez CSS(RCC_OCENSETR, RCC_OCENSETR_HSECSSON_BIT),
76328c10f9eSGabriel Fernandez NULL),
76428c10f9eSGabriel Fernandez };
76528c10f9eSGabriel Fernandez
clk_oscillator_get_data(unsigned int osc_id)76628c10f9eSGabriel Fernandez static struct clk_oscillator_data *clk_oscillator_get_data(unsigned int osc_id)
76728c10f9eSGabriel Fernandez {
76828c10f9eSGabriel Fernandez assert(osc_id < ARRAY_SIZE(stm32mp25_osc_data));
76928c10f9eSGabriel Fernandez
77028c10f9eSGabriel Fernandez return &stm32mp25_osc_data[osc_id];
77128c10f9eSGabriel Fernandez }
77228c10f9eSGabriel Fernandez
clk_stm32_get_rate_oscillator(unsigned int osc_id)77328c10f9eSGabriel Fernandez static unsigned long clk_stm32_get_rate_oscillator(unsigned int osc_id)
77428c10f9eSGabriel Fernandez {
77528c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv();
77628c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata;
77728c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[osc_id];
77828c10f9eSGabriel Fernandez
77928c10f9eSGabriel Fernandez return osci->freq;
78028c10f9eSGabriel Fernandez }
78128c10f9eSGabriel Fernandez
clk_stm32_pll_get_oscillator_rate(unsigned int sel)78228c10f9eSGabriel Fernandez static unsigned long clk_stm32_pll_get_oscillator_rate(unsigned int sel)
78328c10f9eSGabriel Fernandez {
78428c10f9eSGabriel Fernandez unsigned int osc[] = { OSC_HSI, OSC_HSE, OSC_MSI };
78528c10f9eSGabriel Fernandez
78628c10f9eSGabriel Fernandez assert(sel < ARRAY_SIZE(osc));
78728c10f9eSGabriel Fernandez
78828c10f9eSGabriel Fernandez return clk_stm32_get_rate_oscillator(osc[sel]);
78928c10f9eSGabriel Fernandez }
79028c10f9eSGabriel Fernandez
clk_oscillator_set_bypass(struct clk_stm32_priv * priv,struct clk_oscillator_data * osc_data,bool digbyp,bool bypass)79128c10f9eSGabriel Fernandez static void clk_oscillator_set_bypass(struct clk_stm32_priv *priv,
79228c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data,
79328c10f9eSGabriel Fernandez bool digbyp, bool bypass)
79428c10f9eSGabriel Fernandez {
79528c10f9eSGabriel Fernandez struct clk_stm32_bypass *bypass_data = osc_data->bypass;
79628c10f9eSGabriel Fernandez uintptr_t address = 0;
79728c10f9eSGabriel Fernandez
79828c10f9eSGabriel Fernandez if (!bypass_data)
79928c10f9eSGabriel Fernandez return;
80028c10f9eSGabriel Fernandez
80128c10f9eSGabriel Fernandez address = priv->base + bypass_data->offset;
80228c10f9eSGabriel Fernandez
80328c10f9eSGabriel Fernandez if (digbyp)
80428c10f9eSGabriel Fernandez io_setbits32(address, BIT(bypass_data->bit_digbyp));
80528c10f9eSGabriel Fernandez
80628c10f9eSGabriel Fernandez if (bypass || digbyp)
80728c10f9eSGabriel Fernandez io_setbits32(address, BIT(bypass_data->bit_byp));
80828c10f9eSGabriel Fernandez }
80928c10f9eSGabriel Fernandez
clk_oscillator_set_css(struct clk_stm32_priv * priv,struct clk_oscillator_data * osc_data,bool css)81028c10f9eSGabriel Fernandez static void clk_oscillator_set_css(struct clk_stm32_priv *priv,
81128c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data,
81228c10f9eSGabriel Fernandez bool css)
81328c10f9eSGabriel Fernandez {
81428c10f9eSGabriel Fernandez struct clk_stm32_css *css_data = osc_data->css;
81528c10f9eSGabriel Fernandez
81628c10f9eSGabriel Fernandez if (css_data && css)
81728c10f9eSGabriel Fernandez io_setbits32(priv->base + css_data->offset,
81828c10f9eSGabriel Fernandez BIT(css_data->bit_css));
81928c10f9eSGabriel Fernandez }
82028c10f9eSGabriel Fernandez
clk_oscillator_set_drive(struct clk_stm32_priv * priv,struct clk_oscillator_data * osc_data,uint8_t lsedrv)82128c10f9eSGabriel Fernandez static void clk_oscillator_set_drive(struct clk_stm32_priv *priv,
82228c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data,
82328c10f9eSGabriel Fernandez uint8_t lsedrv)
82428c10f9eSGabriel Fernandez {
82528c10f9eSGabriel Fernandez struct clk_stm32_drive *drive_data = osc_data->drive;
82628c10f9eSGabriel Fernandez uintptr_t address = 0;
82728c10f9eSGabriel Fernandez uint32_t mask = 0;
82828c10f9eSGabriel Fernandez uint32_t value = 0;
82928c10f9eSGabriel Fernandez
83028c10f9eSGabriel Fernandez if (!drive_data)
83128c10f9eSGabriel Fernandez return;
83228c10f9eSGabriel Fernandez
83328c10f9eSGabriel Fernandez address = priv->base + drive_data->offset;
83428c10f9eSGabriel Fernandez
83528c10f9eSGabriel Fernandez mask = SHIFT_U32(BIT(drive_data->drv_width) - 1, drive_data->drv_shift);
83628c10f9eSGabriel Fernandez
83728c10f9eSGabriel Fernandez /*
83828c10f9eSGabriel Fernandez * Warning: not recommended to switch directly from "high drive"
83928c10f9eSGabriel Fernandez * to "medium low drive", and vice-versa.
84028c10f9eSGabriel Fernandez */
84128c10f9eSGabriel Fernandez value = (io_read32(address) & mask) >> drive_data->drv_shift;
84228c10f9eSGabriel Fernandez
84328c10f9eSGabriel Fernandez while (value != lsedrv) {
84428c10f9eSGabriel Fernandez if (value > lsedrv)
84528c10f9eSGabriel Fernandez value--;
84628c10f9eSGabriel Fernandez else
84728c10f9eSGabriel Fernandez value++;
84828c10f9eSGabriel Fernandez
84928c10f9eSGabriel Fernandez io_clrsetbits32(address, mask,
85028c10f9eSGabriel Fernandez SHIFT_U32(value, drive_data->drv_shift));
85128c10f9eSGabriel Fernandez }
85228c10f9eSGabriel Fernandez }
85328c10f9eSGabriel Fernandez
stm32_enable_oscillator_hse(struct clk_stm32_priv * priv,struct stm32_clk_platdata * pdata)85428c10f9eSGabriel Fernandez static void stm32_enable_oscillator_hse(struct clk_stm32_priv *priv,
85528c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata)
85628c10f9eSGabriel Fernandez {
85728c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_HSE);
85828c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_HSE];
85928c10f9eSGabriel Fernandez
86028c10f9eSGabriel Fernandez if (!osci->freq)
86128c10f9eSGabriel Fernandez return;
86228c10f9eSGabriel Fernandez
86328c10f9eSGabriel Fernandez clk_oscillator_set_bypass(priv, osc_data, osci->digbyp, osci->bypass);
86428c10f9eSGabriel Fernandez
86528c10f9eSGabriel Fernandez /* Enable clock and wait ready bit */
86628c10f9eSGabriel Fernandez if (stm32_gate_rdy_enable(osc_data->gate_id))
86728c10f9eSGabriel Fernandez panic("timeout to enable hse clock");
86828c10f9eSGabriel Fernandez
86928c10f9eSGabriel Fernandez clk_oscillator_set_css(priv, osc_data, osci->css);
87028c10f9eSGabriel Fernandez }
87128c10f9eSGabriel Fernandez
stm32_enable_oscillator_lse(struct clk_stm32_priv * priv,struct stm32_clk_platdata * pdata)87228c10f9eSGabriel Fernandez static void stm32_enable_oscillator_lse(struct clk_stm32_priv *priv,
87328c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata)
87428c10f9eSGabriel Fernandez {
87528c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_LSE);
87628c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSE];
87728c10f9eSGabriel Fernandez
87828c10f9eSGabriel Fernandez if (!osci->freq)
87928c10f9eSGabriel Fernandez return;
88028c10f9eSGabriel Fernandez
88128c10f9eSGabriel Fernandez if (stm32_gate_is_enabled(osc_data->gate_id))
88228c10f9eSGabriel Fernandez return;
88328c10f9eSGabriel Fernandez
88428c10f9eSGabriel Fernandez clk_oscillator_set_bypass(priv, osc_data, osci->digbyp, osci->bypass);
88528c10f9eSGabriel Fernandez
88628c10f9eSGabriel Fernandez clk_oscillator_set_drive(priv, osc_data, osci->drive);
88728c10f9eSGabriel Fernandez
88828c10f9eSGabriel Fernandez /* Enable LSE clock, but don't wait ready bit */
88928c10f9eSGabriel Fernandez stm32_gate_enable(osc_data->gate_id);
89028c10f9eSGabriel Fernandez }
89128c10f9eSGabriel Fernandez
stm32_enable_oscillator_lsi(struct clk_stm32_priv * priv __unused,struct stm32_clk_platdata * pdata)89228c10f9eSGabriel Fernandez static void stm32_enable_oscillator_lsi(struct clk_stm32_priv *priv __unused,
89328c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata)
89428c10f9eSGabriel Fernandez {
89528c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_LSI);
89628c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSI];
89728c10f9eSGabriel Fernandez
89828c10f9eSGabriel Fernandez if (!osci->freq)
89928c10f9eSGabriel Fernandez return;
90028c10f9eSGabriel Fernandez
90128c10f9eSGabriel Fernandez /* Enable clock and wait ready bit */
90228c10f9eSGabriel Fernandez if (stm32_gate_rdy_enable(osc_data->gate_id))
90328c10f9eSGabriel Fernandez panic("timeout to enable lsi clock");
90428c10f9eSGabriel Fernandez }
90528c10f9eSGabriel Fernandez
clk_stm32_osc_msi_set_rate(struct clk_stm32_priv * priv,unsigned long rate)90628c10f9eSGabriel Fernandez static TEE_Result clk_stm32_osc_msi_set_rate(struct clk_stm32_priv *priv,
90728c10f9eSGabriel Fernandez unsigned long rate)
90828c10f9eSGabriel Fernandez {
90928c10f9eSGabriel Fernandez uintptr_t address = priv->base + RCC_BDCR;
91028c10f9eSGabriel Fernandez uint32_t mask = RCC_BDCR_MSIFREQSEL;
91128c10f9eSGabriel Fernandez
91228c10f9eSGabriel Fernandez switch (rate) {
91328c10f9eSGabriel Fernandez case RCC_4_MHZ:
91428c10f9eSGabriel Fernandez io_clrbits32_stm32shregs(address, mask);
91528c10f9eSGabriel Fernandez break;
91628c10f9eSGabriel Fernandez case RCC_16_MHZ:
91728c10f9eSGabriel Fernandez io_setbits32_stm32shregs(address, mask);
91828c10f9eSGabriel Fernandez break;
91928c10f9eSGabriel Fernandez default:
92028c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC;
92128c10f9eSGabriel Fernandez }
92228c10f9eSGabriel Fernandez
92328c10f9eSGabriel Fernandez return TEE_SUCCESS;
92428c10f9eSGabriel Fernandez }
92528c10f9eSGabriel Fernandez
stm32_enable_oscillator_msi(struct clk_stm32_priv * priv,struct stm32_clk_platdata * pdata)92628c10f9eSGabriel Fernandez static void stm32_enable_oscillator_msi(struct clk_stm32_priv *priv,
92728c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata)
92828c10f9eSGabriel Fernandez {
92928c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_MSI);
93028c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_MSI];
93128c10f9eSGabriel Fernandez
93228c10f9eSGabriel Fernandez if (!osci->freq)
93328c10f9eSGabriel Fernandez return;
93428c10f9eSGabriel Fernandez
9352604f62dSEtienne Carriere if (clk_stm32_osc_msi_set_rate(priv, osci->freq) != TEE_SUCCESS) {
93628c10f9eSGabriel Fernandez EMSG("invalid rate %ld Hz for MSI ! (4000000 or 16000000 only)",
93728c10f9eSGabriel Fernandez osci->freq);
9382604f62dSEtienne Carriere panic();
9392604f62dSEtienne Carriere }
94028c10f9eSGabriel Fernandez
94128c10f9eSGabriel Fernandez /* Enable clock and wait ready bit */
94228c10f9eSGabriel Fernandez if (stm32_gate_rdy_enable(osc_data->gate_id))
94328c10f9eSGabriel Fernandez panic("timeout to enable msi clock");
94428c10f9eSGabriel Fernandez }
94528c10f9eSGabriel Fernandez
stm32_clk_oscillators_lse_set_css(struct clk_stm32_priv * priv,struct stm32_clk_platdata * pdata)94628c10f9eSGabriel Fernandez static void stm32_clk_oscillators_lse_set_css(struct clk_stm32_priv *priv,
94728c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata)
94828c10f9eSGabriel Fernandez
94928c10f9eSGabriel Fernandez {
95028c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_LSE);
95128c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSE];
95228c10f9eSGabriel Fernandez
95328c10f9eSGabriel Fernandez clk_oscillator_set_css(priv, osc_data, osci->css);
95428c10f9eSGabriel Fernandez }
95528c10f9eSGabriel Fernandez
95628c10f9eSGabriel Fernandez static int
stm32_clk_oscillators_wait_lse_ready(struct clk_stm32_priv * priv __unused,struct stm32_clk_platdata * pdata)95728c10f9eSGabriel Fernandez stm32_clk_oscillators_wait_lse_ready(struct clk_stm32_priv *priv __unused,
95828c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata)
95928c10f9eSGabriel Fernandez {
96028c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_LSE);
96128c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSE];
96228c10f9eSGabriel Fernandez int ret = 0;
96328c10f9eSGabriel Fernandez
9646efa483fSEtienne Carriere if (osci->freq && stm32_gate_wait_ready(osc_data->gate_id, true))
9656efa483fSEtienne Carriere ret = -1;
96628c10f9eSGabriel Fernandez
96728c10f9eSGabriel Fernandez return ret;
96828c10f9eSGabriel Fernandez }
96928c10f9eSGabriel Fernandez
stm32_clk_oscillators_enable(struct clk_stm32_priv * priv,struct stm32_clk_platdata * pdata)97028c10f9eSGabriel Fernandez static void stm32_clk_oscillators_enable(struct clk_stm32_priv *priv,
97128c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata)
97228c10f9eSGabriel Fernandez {
97328c10f9eSGabriel Fernandez stm32_enable_oscillator_hse(priv, pdata);
97428c10f9eSGabriel Fernandez stm32_enable_oscillator_lse(priv, pdata);
97528c10f9eSGabriel Fernandez stm32_enable_oscillator_lsi(priv, pdata);
97628c10f9eSGabriel Fernandez stm32_enable_oscillator_msi(priv, pdata);
97728c10f9eSGabriel Fernandez }
97828c10f9eSGabriel Fernandez
97928c10f9eSGabriel Fernandez enum stm32_pll_id {
98028c10f9eSGabriel Fernandez PLL1_ID,
98128c10f9eSGabriel Fernandez PLL2_ID,
98228c10f9eSGabriel Fernandez PLL3_ID,
98328c10f9eSGabriel Fernandez PLL4_ID,
98428c10f9eSGabriel Fernandez PLL5_ID,
98528c10f9eSGabriel Fernandez PLL6_ID,
98628c10f9eSGabriel Fernandez PLL7_ID,
98728c10f9eSGabriel Fernandez PLL8_ID,
98828c10f9eSGabriel Fernandez PLL_NB
98928c10f9eSGabriel Fernandez };
99028c10f9eSGabriel Fernandez
99128c10f9eSGabriel Fernandez /* PLL configuration registers offsets from RCC_PLLxCFGR1 */
99228c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR1 0x00
99328c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR2 0x04
99428c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR3 0x08
99528c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR4 0x0C
99628c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR5 0x10
99728c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR6 0x18
99828c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR7 0x1C
99928c10f9eSGabriel Fernandez
100028c10f9eSGabriel Fernandez struct stm32_clk_pll {
100128c10f9eSGabriel Fernandez uint16_t gate_id;
100228c10f9eSGabriel Fernandez uint16_t mux_id;
100328c10f9eSGabriel Fernandez uint16_t reg_pllxcfgr1;
100428c10f9eSGabriel Fernandez };
100528c10f9eSGabriel Fernandez
100628c10f9eSGabriel Fernandez #define CLK_PLL_CFG(_idx, _gate_id, _mux_id, _reg)\
100728c10f9eSGabriel Fernandez [(_idx)] = {\
100828c10f9eSGabriel Fernandez .gate_id = (_gate_id),\
100928c10f9eSGabriel Fernandez .mux_id = (_mux_id),\
101028c10f9eSGabriel Fernandez .reg_pllxcfgr1 = (_reg),\
101128c10f9eSGabriel Fernandez }
101228c10f9eSGabriel Fernandez
101328c10f9eSGabriel Fernandez static const struct stm32_clk_pll stm32mp25_clk_pll[PLL_NB] = {
101428c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL1_ID, GATE_PLL1, MUX_MUXSEL5, 0),
101528c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL2_ID, GATE_PLL2, MUX_MUXSEL6, RCC_PLL2CFGR1),
101628c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL3_ID, GATE_PLL3, MUX_MUXSEL7, RCC_PLL3CFGR1),
101728c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL4_ID, GATE_PLL4, MUX_MUXSEL0, RCC_PLL4CFGR1),
101828c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL5_ID, GATE_PLL5, MUX_MUXSEL1, RCC_PLL5CFGR1),
101928c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL6_ID, GATE_PLL6, MUX_MUXSEL2, RCC_PLL6CFGR1),
102028c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL7_ID, GATE_PLL7, MUX_MUXSEL3, RCC_PLL7CFGR1),
102128c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL8_ID, GATE_PLL8, MUX_MUXSEL4, RCC_PLL8CFGR1),
102228c10f9eSGabriel Fernandez };
102328c10f9eSGabriel Fernandez
clk_stm32_pll_data(unsigned int idx)102428c10f9eSGabriel Fernandez static const struct stm32_clk_pll *clk_stm32_pll_data(unsigned int idx)
102528c10f9eSGabriel Fernandez {
102628c10f9eSGabriel Fernandez assert(idx < ARRAY_SIZE(stm32mp25_clk_pll));
102728c10f9eSGabriel Fernandez
102828c10f9eSGabriel Fernandez return &stm32mp25_clk_pll[idx];
102928c10f9eSGabriel Fernandez }
103028c10f9eSGabriel Fernandez
stm32_clk_parse_oscillator_fdt(const void * fdt,int node,const char * name,struct stm32_osci_dt_cfg * osci)103128c10f9eSGabriel Fernandez static int stm32_clk_parse_oscillator_fdt(const void *fdt, int node,
103228c10f9eSGabriel Fernandez const char *name,
103328c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci)
103428c10f9eSGabriel Fernandez {
103528c10f9eSGabriel Fernandez int subnode = 0;
103628c10f9eSGabriel Fernandez
103728c10f9eSGabriel Fernandez /* default value when oscillator is not found */
103828c10f9eSGabriel Fernandez osci->freq = 0;
103928c10f9eSGabriel Fernandez
104028c10f9eSGabriel Fernandez fdt_for_each_subnode(subnode, fdt, node) {
104128c10f9eSGabriel Fernandez const char *cchar = NULL;
104228c10f9eSGabriel Fernandez const fdt32_t *cuint = NULL;
104328c10f9eSGabriel Fernandez int ret = 0;
104428c10f9eSGabriel Fernandez
104528c10f9eSGabriel Fernandez cchar = fdt_get_name(fdt, subnode, &ret);
104628c10f9eSGabriel Fernandez if (!cchar)
1047636e1d3cSGabriel Fernandez return -1;
104828c10f9eSGabriel Fernandez
1049636e1d3cSGabriel Fernandez if (strncmp(cchar, name, (size_t)ret))
105028c10f9eSGabriel Fernandez continue;
105128c10f9eSGabriel Fernandez
1052636e1d3cSGabriel Fernandez if (fdt_get_status(fdt, subnode) == DT_STATUS_DISABLED)
1053636e1d3cSGabriel Fernandez return 0;
1054636e1d3cSGabriel Fernandez
105528c10f9eSGabriel Fernandez cuint = fdt_getprop(fdt, subnode, "clock-frequency", &ret);
105628c10f9eSGabriel Fernandez if (!cuint)
1057636e1d3cSGabriel Fernandez return -1;
105828c10f9eSGabriel Fernandez
105928c10f9eSGabriel Fernandez osci->freq = fdt32_to_cpu(*cuint);
106028c10f9eSGabriel Fernandez
106128c10f9eSGabriel Fernandez if (fdt_getprop(fdt, subnode, "st,bypass", NULL))
106228c10f9eSGabriel Fernandez osci->bypass = true;
106328c10f9eSGabriel Fernandez
106428c10f9eSGabriel Fernandez if (fdt_getprop(fdt, subnode, "st,digbypass", NULL))
106528c10f9eSGabriel Fernandez osci->digbyp = true;
106628c10f9eSGabriel Fernandez
106728c10f9eSGabriel Fernandez if (fdt_getprop(fdt, subnode, "st,css", NULL))
106828c10f9eSGabriel Fernandez osci->css = true;
106928c10f9eSGabriel Fernandez
107028c10f9eSGabriel Fernandez osci->drive = fdt_read_uint32_default(fdt, subnode, "st,drive",
107128c10f9eSGabriel Fernandez LSEDRV_MEDIUM_HIGH);
107228c10f9eSGabriel Fernandez
107328c10f9eSGabriel Fernandez return 0;
107428c10f9eSGabriel Fernandez }
107528c10f9eSGabriel Fernandez
107628c10f9eSGabriel Fernandez return 0;
107728c10f9eSGabriel Fernandez }
107828c10f9eSGabriel Fernandez
stm32_clk_get_oscillator_name(enum stm32_osc id)107928c10f9eSGabriel Fernandez static const char *stm32_clk_get_oscillator_name(enum stm32_osc id)
108028c10f9eSGabriel Fernandez {
108128c10f9eSGabriel Fernandez if (id < NB_OSCILLATOR)
108228c10f9eSGabriel Fernandez return stm32mp25_osc_data[id].name;
108328c10f9eSGabriel Fernandez
108428c10f9eSGabriel Fernandez return NULL;
108528c10f9eSGabriel Fernandez }
108628c10f9eSGabriel Fernandez
stm32_clk_parse_fdt_all_oscillator(const void * fdt,int node __unused,struct stm32_clk_platdata * pdata)108728c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_oscillator(const void *fdt,
108828c10f9eSGabriel Fernandez int node __unused,
108928c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata)
109028c10f9eSGabriel Fernandez {
109128c10f9eSGabriel Fernandez int fdt_err = 0;
109228c10f9eSGabriel Fernandez size_t i = 0;
109328c10f9eSGabriel Fernandez int osc_node = 0;
109428c10f9eSGabriel Fernandez
109528c10f9eSGabriel Fernandez osc_node = fdt_path_offset(fdt, "/clocks");
109628c10f9eSGabriel Fernandez if (osc_node < 0)
109728c10f9eSGabriel Fernandez return -FDT_ERR_NOTFOUND;
109828c10f9eSGabriel Fernandez
109928c10f9eSGabriel Fernandez for (i = 0; i < pdata->nosci; i++) {
110028c10f9eSGabriel Fernandez const char *name = NULL;
110128c10f9eSGabriel Fernandez
110228c10f9eSGabriel Fernandez name = stm32_clk_get_oscillator_name((enum stm32_osc)i);
110328c10f9eSGabriel Fernandez if (!name)
110428c10f9eSGabriel Fernandez continue;
110528c10f9eSGabriel Fernandez
110628c10f9eSGabriel Fernandez fdt_err = stm32_clk_parse_oscillator_fdt(fdt, osc_node, name,
110728c10f9eSGabriel Fernandez &pdata->osci[i]);
110828c10f9eSGabriel Fernandez if (fdt_err < 0)
110928c10f9eSGabriel Fernandez panic();
111028c10f9eSGabriel Fernandez }
111128c10f9eSGabriel Fernandez
111228c10f9eSGabriel Fernandez return 0;
111328c10f9eSGabriel Fernandez }
111428c10f9eSGabriel Fernandez
clk_stm32_parse_pll_fdt(const void * fdt,int subnode,struct stm32_pll_dt_cfg * pll)111528c10f9eSGabriel Fernandez static int clk_stm32_parse_pll_fdt(const void *fdt, int subnode,
111628c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll)
111728c10f9eSGabriel Fernandez {
111828c10f9eSGabriel Fernandez const fdt32_t *cuint = NULL;
111928c10f9eSGabriel Fernandez int subnode_pll = 0;
112028c10f9eSGabriel Fernandez int err = 0;
112128c10f9eSGabriel Fernandez
112228c10f9eSGabriel Fernandez cuint = fdt_getprop(fdt, subnode, "st,pll", NULL);
112328c10f9eSGabriel Fernandez if (!cuint)
112428c10f9eSGabriel Fernandez return 0;
112528c10f9eSGabriel Fernandez
112628c10f9eSGabriel Fernandez subnode_pll = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*cuint));
112728c10f9eSGabriel Fernandez if (subnode_pll < 0)
112828c10f9eSGabriel Fernandez return -FDT_ERR_NOTFOUND;
112928c10f9eSGabriel Fernandez
1130636e1d3cSGabriel Fernandez if (fdt_read_uint32_array(fdt, subnode_pll, "cfg", pll->cfg, PLLCFG_NB))
113128c10f9eSGabriel Fernandez panic("cfg property is mandatory");
113228c10f9eSGabriel Fernandez
113328c10f9eSGabriel Fernandez err = fdt_read_uint32_array(fdt, subnode_pll, "csg", pll->csg,
113428c10f9eSGabriel Fernandez PLLCSG_NB);
113528c10f9eSGabriel Fernandez
113628c10f9eSGabriel Fernandez pll->csg_enabled = (err == 0);
113728c10f9eSGabriel Fernandez
113828c10f9eSGabriel Fernandez if (err == -FDT_ERR_NOTFOUND)
113928c10f9eSGabriel Fernandez err = 0;
114028c10f9eSGabriel Fernandez
1141636e1d3cSGabriel Fernandez if (err)
114228c10f9eSGabriel Fernandez return err;
114328c10f9eSGabriel Fernandez
114428c10f9eSGabriel Fernandez pll->enabled = true;
114528c10f9eSGabriel Fernandez
114628c10f9eSGabriel Fernandez pll->frac = fdt_read_uint32_default(fdt, subnode_pll, "frac", 0);
114728c10f9eSGabriel Fernandez
114828c10f9eSGabriel Fernandez if (fdt_read_uint32(fdt, subnode_pll, "src", &pll->src))
114928c10f9eSGabriel Fernandez panic("src property is mandatory");
115028c10f9eSGabriel Fernandez
115128c10f9eSGabriel Fernandez return 0;
115228c10f9eSGabriel Fernandez }
115328c10f9eSGabriel Fernandez
115428c10f9eSGabriel Fernandez #define RCC_PLL_NAME_SIZE 20
115528c10f9eSGabriel Fernandez
stm32_clk_parse_fdt_all_pll(const void * fdt,int node,struct stm32_clk_platdata * pdata)115628c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_pll(const void *fdt, int node,
115728c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata)
115828c10f9eSGabriel Fernandez {
115928c10f9eSGabriel Fernandez unsigned int i = 0;
116028c10f9eSGabriel Fernandez
116128c10f9eSGabriel Fernandez for (i = 0; i < pdata->npll; i++) {
116228c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll = pdata->pll + i;
116328c10f9eSGabriel Fernandez char name[RCC_PLL_NAME_SIZE] = { };
116428c10f9eSGabriel Fernandez int subnode = 0;
116528c10f9eSGabriel Fernandez
116628c10f9eSGabriel Fernandez snprintf(name, sizeof(name), "st,pll-%u", i + 1);
116728c10f9eSGabriel Fernandez
116828c10f9eSGabriel Fernandez subnode = fdt_subnode_offset(fdt, node, name);
116928c10f9eSGabriel Fernandez if (subnode < 0)
117028c10f9eSGabriel Fernandez continue;
117128c10f9eSGabriel Fernandez
117228c10f9eSGabriel Fernandez if (clk_stm32_parse_pll_fdt(fdt, subnode, pll))
117328c10f9eSGabriel Fernandez panic();
117428c10f9eSGabriel Fernandez }
117528c10f9eSGabriel Fernandez
117628c10f9eSGabriel Fernandez return 0;
117728c10f9eSGabriel Fernandez }
117828c10f9eSGabriel Fernandez
stm32_clk_parse_fdt_opp(const void * fdt,int node,const char * opp_name,struct stm32_clk_opp_cfg * opp_cfg)117928c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_opp(const void *fdt, int node,
118028c10f9eSGabriel Fernandez const char *opp_name,
118128c10f9eSGabriel Fernandez struct stm32_clk_opp_cfg *opp_cfg)
118228c10f9eSGabriel Fernandez {
118328c10f9eSGabriel Fernandez int subnode = 0;
118428c10f9eSGabriel Fernandez int nb_opp = 0;
118528c10f9eSGabriel Fernandez int ret = 0;
118628c10f9eSGabriel Fernandez
118728c10f9eSGabriel Fernandez node = fdt_subnode_offset(fdt, node, opp_name);
118828c10f9eSGabriel Fernandez if (node == -FDT_ERR_NOTFOUND)
118928c10f9eSGabriel Fernandez return 0;
119028c10f9eSGabriel Fernandez
119128c10f9eSGabriel Fernandez if (node < 0)
119228c10f9eSGabriel Fernandez return node;
119328c10f9eSGabriel Fernandez
119428c10f9eSGabriel Fernandez fdt_for_each_subnode(subnode, fdt, node) {
119528c10f9eSGabriel Fernandez assert(nb_opp <= MAX_OPP);
119628c10f9eSGabriel Fernandez
119728c10f9eSGabriel Fernandez if (fdt_read_uint32(fdt, subnode, "hz", &opp_cfg->frq))
119828c10f9eSGabriel Fernandez panic("hz property is mandatory");
119928c10f9eSGabriel Fernandez
120028c10f9eSGabriel Fernandez if (fdt_read_uint32(fdt, subnode, "st,clksrc", &opp_cfg->src))
120128c10f9eSGabriel Fernandez panic("st,clksrc property is mandatory");
120228c10f9eSGabriel Fernandez
120328c10f9eSGabriel Fernandez ret = clk_stm32_parse_pll_fdt(fdt, subnode, &opp_cfg->pll_cfg);
120428c10f9eSGabriel Fernandez if (ret < 0)
120528c10f9eSGabriel Fernandez return ret;
120628c10f9eSGabriel Fernandez
120728c10f9eSGabriel Fernandez opp_cfg++;
120828c10f9eSGabriel Fernandez nb_opp++;
120928c10f9eSGabriel Fernandez }
121028c10f9eSGabriel Fernandez
121128c10f9eSGabriel Fernandez return 0;
121228c10f9eSGabriel Fernandez }
121328c10f9eSGabriel Fernandez
stm32_clk_parse_fdt_all_opp(const void * fdt,int node,struct stm32_clk_platdata * pdata)121428c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_opp(const void *fdt, int node,
121528c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata)
121628c10f9eSGabriel Fernandez {
121728c10f9eSGabriel Fernandez struct stm32_clk_opp_dt_cfg *opp = pdata->opp;
121828c10f9eSGabriel Fernandez
121928c10f9eSGabriel Fernandez node = fdt_subnode_offset(fdt, node, "st,clk_opp");
122028c10f9eSGabriel Fernandez if (node == -FDT_ERR_NOTFOUND)
122128c10f9eSGabriel Fernandez return 0;
122228c10f9eSGabriel Fernandez
122328c10f9eSGabriel Fernandez if (node < 0)
122428c10f9eSGabriel Fernandez return node;
122528c10f9eSGabriel Fernandez
122628c10f9eSGabriel Fernandez return stm32_clk_parse_fdt_opp(fdt, node, "st,ck_cpu1", opp->cpu1_opp);
122728c10f9eSGabriel Fernandez }
122828c10f9eSGabriel Fernandez
stm32_clk_parse_fdt(const void * fdt,int node,struct stm32_clk_platdata * pdata)122928c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt(const void *fdt, int node,
123028c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata)
123128c10f9eSGabriel Fernandez {
1232b5f8fc36SGatien Chevallier const fdt32_t *cuint = NULL;
1233b5f8fc36SGatien Chevallier unsigned int i = 0;
1234b5f8fc36SGatien Chevallier int lenp = 0;
123528c10f9eSGabriel Fernandez int err = 0;
123628c10f9eSGabriel Fernandez
123728c10f9eSGabriel Fernandez err = stm32_clk_parse_fdt_all_oscillator(fdt, node, pdata);
1238636e1d3cSGabriel Fernandez if (err)
123928c10f9eSGabriel Fernandez return err;
124028c10f9eSGabriel Fernandez
124128c10f9eSGabriel Fernandez err = stm32_clk_parse_fdt_all_pll(fdt, node, pdata);
1242636e1d3cSGabriel Fernandez if (err)
124328c10f9eSGabriel Fernandez return err;
124428c10f9eSGabriel Fernandez
124528c10f9eSGabriel Fernandez err = stm32_clk_parse_fdt_all_opp(fdt, node, pdata);
1246636e1d3cSGabriel Fernandez if (err)
124728c10f9eSGabriel Fernandez return err;
124828c10f9eSGabriel Fernandez
124928c10f9eSGabriel Fernandez err = clk_stm32_parse_fdt_by_name(fdt, node, "st,busclk",
125028c10f9eSGabriel Fernandez pdata->busclk,
125128c10f9eSGabriel Fernandez &pdata->nbusclk);
1252636e1d3cSGabriel Fernandez if (err)
125328c10f9eSGabriel Fernandez return err;
125428c10f9eSGabriel Fernandez
125528c10f9eSGabriel Fernandez err = clk_stm32_parse_fdt_by_name(fdt, node, "st,flexgen",
125628c10f9eSGabriel Fernandez pdata->flexgen,
125728c10f9eSGabriel Fernandez &pdata->nflexgen);
1258636e1d3cSGabriel Fernandez if (err)
125928c10f9eSGabriel Fernandez return err;
126028c10f9eSGabriel Fernandez
126128c10f9eSGabriel Fernandez err = clk_stm32_parse_fdt_by_name(fdt, node, "st,kerclk",
126228c10f9eSGabriel Fernandez pdata->kernelclk,
126328c10f9eSGabriel Fernandez &pdata->nkernelclk);
1264636e1d3cSGabriel Fernandez if (err)
126528c10f9eSGabriel Fernandez return err;
126628c10f9eSGabriel Fernandez
126728c10f9eSGabriel Fernandez pdata->c1msrd = fdt_read_uint32_default(fdt, node, "st,c1msrd", 0);
126828c10f9eSGabriel Fernandez
126928c10f9eSGabriel Fernandez if (fdt_getprop(fdt, node, "st,safe_rst", NULL))
127028c10f9eSGabriel Fernandez pdata->safe_rst = true;
127128c10f9eSGabriel Fernandez
127228c10f9eSGabriel Fernandez pdata->rcc_base = stm32_rcc_base();
127328c10f9eSGabriel Fernandez
1274b5f8fc36SGatien Chevallier cuint = fdt_getprop(fdt, node, "st,protreg", &lenp);
1275b5f8fc36SGatien Chevallier if (lenp < 0) {
1276b5f8fc36SGatien Chevallier if (lenp != -FDT_ERR_NOTFOUND)
1277b5f8fc36SGatien Chevallier return lenp;
1278b5f8fc36SGatien Chevallier
1279b5f8fc36SGatien Chevallier lenp = 0;
1280b5f8fc36SGatien Chevallier DMSG("No RIF configuration available");
1281b5f8fc36SGatien Chevallier }
1282b5f8fc36SGatien Chevallier
1283b5f8fc36SGatien Chevallier pdata->nb_res = (unsigned int)(lenp / sizeof(uint32_t));
1284b5f8fc36SGatien Chevallier
1285b5f8fc36SGatien Chevallier assert(pdata->nb_res <= RCC_NB_RIF_RES);
1286b5f8fc36SGatien Chevallier
1287b5f8fc36SGatien Chevallier pdata->conf_data.cid_confs = calloc(RCC_NB_RIF_RES, sizeof(uint32_t));
1288b5f8fc36SGatien Chevallier pdata->conf_data.sec_conf = calloc(RCC_NB_CONFS, sizeof(uint32_t));
1289b5f8fc36SGatien Chevallier pdata->conf_data.priv_conf = calloc(RCC_NB_CONFS, sizeof(uint32_t));
1290b5f8fc36SGatien Chevallier pdata->conf_data.lock_conf = calloc(RCC_NB_CONFS, sizeof(uint32_t));
1291b5f8fc36SGatien Chevallier pdata->conf_data.access_mask = calloc(RCC_NB_CONFS, sizeof(uint32_t));
1292b5f8fc36SGatien Chevallier if (!pdata->conf_data.cid_confs || !pdata->conf_data.sec_conf ||
1293b5f8fc36SGatien Chevallier !pdata->conf_data.priv_conf || !pdata->conf_data.access_mask ||
1294b5f8fc36SGatien Chevallier !pdata->conf_data.lock_conf)
1295b5f8fc36SGatien Chevallier panic("Missing memory capacity for RCC RIF configuration");
1296b5f8fc36SGatien Chevallier
1297b5f8fc36SGatien Chevallier for (i = 0; i < pdata->nb_res; i++)
1298b5f8fc36SGatien Chevallier stm32_rif_parse_cfg(fdt32_to_cpu(cuint[i]), &pdata->conf_data,
1299b5f8fc36SGatien Chevallier RCC_NB_RIF_RES);
1300b5f8fc36SGatien Chevallier
130128c10f9eSGabriel Fernandez return 0;
130228c10f9eSGabriel Fernandez }
130328c10f9eSGabriel Fernandez
stm32mp2_a35_ss_on_bypass(void)13047b8c7554SGabriel Fernandez static void stm32mp2_a35_ss_on_bypass(void)
130528c10f9eSGabriel Fernandez {
130628c10f9eSGabriel Fernandez uint64_t timeout = 0;
1307*d8bfc12aSThomas Bourgoin uint32_t chgclkreq = stm32mp_syscfg_read(CA35SS_SSC_CHGCLKREQ);
130828c10f9eSGabriel Fernandez
1309*d8bfc12aSThomas Bourgoin if (chgclkreq & CA35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) {
13107b8c7554SGabriel Fernandez /* Nothing to do, clock source is already set on bypass clock */
131128c10f9eSGabriel Fernandez return;
13127b8c7554SGabriel Fernandez }
13137b8c7554SGabriel Fernandez
13147b8c7554SGabriel Fernandez /*
13157b8c7554SGabriel Fernandez * for clkext2f frequency at 400MHZ, the default flexgen63 config,
13167b8c7554SGabriel Fernandez * divider by 2 is required with ARM_DIVSEL=0
13177b8c7554SGabriel Fernandez */
1318*d8bfc12aSThomas Bourgoin if (chgclkreq & CA35SS_SSC_CHGCLKREQ_ARM_DIVSEL) {
1319*d8bfc12aSThomas Bourgoin stm32mp_syscfg_write(CA35SS_SSC_CHGCLKREQ,
13207b8c7554SGabriel Fernandez 0U,
1321*d8bfc12aSThomas Bourgoin CA35SS_SSC_CHGCLKREQ_ARM_DIVSEL);
13227b8c7554SGabriel Fernandez timeout = timeout_init_us(CLKSRC_TIMEOUT);
13237b8c7554SGabriel Fernandez while (!timeout_elapsed(timeout))
1324*d8bfc12aSThomas Bourgoin if (!(stm32mp_syscfg_read(CA35SS_SSC_CHGCLKREQ) &
1325*d8bfc12aSThomas Bourgoin CA35SS_SSC_CHGCLKREQ_ARM_DIVSELACK))
13267b8c7554SGabriel Fernandez break;
1327*d8bfc12aSThomas Bourgoin if (stm32mp_syscfg_read(CA35SS_SSC_CHGCLKREQ) &
1328*d8bfc12aSThomas Bourgoin CA35SS_SSC_CHGCLKREQ_ARM_DIVSELACK)
13297b8c7554SGabriel Fernandez panic("Cannot set div on A35 bypass clock");
13307b8c7554SGabriel Fernandez }
133128c10f9eSGabriel Fernandez
1332*d8bfc12aSThomas Bourgoin stm32mp_syscfg_write(CA35SS_SSC_CHGCLKREQ,
1333*d8bfc12aSThomas Bourgoin CA35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ,
1334*d8bfc12aSThomas Bourgoin CA35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ_MASK);
133528c10f9eSGabriel Fernandez
133628c10f9eSGabriel Fernandez timeout = timeout_init_us(CLKSRC_TIMEOUT);
133728c10f9eSGabriel Fernandez while (!timeout_elapsed(timeout))
1338*d8bfc12aSThomas Bourgoin if (stm32mp_syscfg_read(CA35SS_SSC_CHGCLKREQ) &
1339*d8bfc12aSThomas Bourgoin CA35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK)
134028c10f9eSGabriel Fernandez break;
134128c10f9eSGabriel Fernandez
1342*d8bfc12aSThomas Bourgoin if (!(stm32mp_syscfg_read(CA35SS_SSC_CHGCLKREQ) &
1343*d8bfc12aSThomas Bourgoin CA35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK))
134428c10f9eSGabriel Fernandez panic("Cannot switch A35 to bypass clock");
134528c10f9eSGabriel Fernandez
1346*d8bfc12aSThomas Bourgoin stm32mp_syscfg_write(CA35SS_SSC_PLL_EN,
134728c10f9eSGabriel Fernandez 0,
1348*d8bfc12aSThomas Bourgoin CA35SS_SSC_PLL_EN_NRESET_SWPLL_MASK);
134928c10f9eSGabriel Fernandez }
135028c10f9eSGabriel Fernandez
stm32mp2_clk_xbar_on_hsi(struct clk_stm32_priv * priv)135128c10f9eSGabriel Fernandez static void stm32mp2_clk_xbar_on_hsi(struct clk_stm32_priv *priv)
135228c10f9eSGabriel Fernandez {
135328c10f9eSGabriel Fernandez uintptr_t xbar0cfgr = priv->base + RCC_XBAR0CFGR;
135428c10f9eSGabriel Fernandez uint32_t i = 0;
135528c10f9eSGabriel Fernandez
135628c10f9eSGabriel Fernandez for (i = 0; i < XBAR_ROOT_CHANNEL_NB; i++)
135728c10f9eSGabriel Fernandez io_clrsetbits32(xbar0cfgr + (0x4 * i),
135828c10f9eSGabriel Fernandez RCC_XBAR0CFGR_XBAR0SEL_MASK, XBAR_SRC_HSI);
135928c10f9eSGabriel Fernandez }
136028c10f9eSGabriel Fernandez
stm32mp2_a35_pll1_start(void)136128c10f9eSGabriel Fernandez static int stm32mp2_a35_pll1_start(void)
136228c10f9eSGabriel Fernandez {
136328c10f9eSGabriel Fernandez uint64_t timeout = 0;
136428c10f9eSGabriel Fernandez
1365*d8bfc12aSThomas Bourgoin stm32mp_syscfg_write(CA35SS_SSC_PLL_EN,
1366*d8bfc12aSThomas Bourgoin CA35SS_SSC_PLL_EN_PLL_EN,
1367*d8bfc12aSThomas Bourgoin CA35SS_SSC_PLL_EN_PLL_EN);
136828c10f9eSGabriel Fernandez
136928c10f9eSGabriel Fernandez /* Wait PLL lock */
137028c10f9eSGabriel Fernandez timeout = timeout_init_us(PLLRDY_TIMEOUT);
137128c10f9eSGabriel Fernandez while (!timeout_elapsed(timeout))
1372*d8bfc12aSThomas Bourgoin if (stm32mp_syscfg_read(CA35SS_SSC_PLL_EN) &
1373*d8bfc12aSThomas Bourgoin CA35SS_SSC_PLL_EN_LOCKP_MASK)
137428c10f9eSGabriel Fernandez break;
137528c10f9eSGabriel Fernandez
1376*d8bfc12aSThomas Bourgoin if (!(stm32mp_syscfg_read(CA35SS_SSC_PLL_EN) &
1377*d8bfc12aSThomas Bourgoin CA35SS_SSC_PLL_EN_LOCKP_MASK)) {
137828c10f9eSGabriel Fernandez EMSG("PLL1 not locked");
137928c10f9eSGabriel Fernandez return -1;
138028c10f9eSGabriel Fernandez }
138128c10f9eSGabriel Fernandez
138228c10f9eSGabriel Fernandez /* De-assert reset on PLL output clock path */
1383*d8bfc12aSThomas Bourgoin stm32mp_syscfg_write(CA35SS_SSC_PLL_EN,
1384*d8bfc12aSThomas Bourgoin CA35SS_SSC_PLL_EN_NRESET_SWPLL,
1385*d8bfc12aSThomas Bourgoin CA35SS_SSC_PLL_EN_NRESET_SWPLL_MASK);
138628c10f9eSGabriel Fernandez
138728c10f9eSGabriel Fernandez /* Switch CPU clock to PLL clock */
1388*d8bfc12aSThomas Bourgoin stm32mp_syscfg_write(CA35SS_SSC_CHGCLKREQ,
138928c10f9eSGabriel Fernandez 0,
1390*d8bfc12aSThomas Bourgoin CA35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ_MASK);
139128c10f9eSGabriel Fernandez
139228c10f9eSGabriel Fernandez /* Wait for clock change acknowledge */
139328c10f9eSGabriel Fernandez timeout = timeout_init_us(CLKSRC_TIMEOUT);
139428c10f9eSGabriel Fernandez while (!timeout_elapsed(timeout))
1395*d8bfc12aSThomas Bourgoin if (!(stm32mp_syscfg_read(CA35SS_SSC_CHGCLKREQ) &
1396*d8bfc12aSThomas Bourgoin CA35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK))
139728c10f9eSGabriel Fernandez break;
139828c10f9eSGabriel Fernandez
1399*d8bfc12aSThomas Bourgoin if (stm32mp_syscfg_read(CA35SS_SSC_CHGCLKREQ) &
1400*d8bfc12aSThomas Bourgoin CA35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) {
140128c10f9eSGabriel Fernandez EMSG("A35 switch to PLL1 failed");
140228c10f9eSGabriel Fernandez return -1;
140328c10f9eSGabriel Fernandez }
140428c10f9eSGabriel Fernandez
140528c10f9eSGabriel Fernandez return 0;
140628c10f9eSGabriel Fernandez }
140728c10f9eSGabriel Fernandez
stm32mp2_a35_pll1_config(uint32_t fbdiv,uint32_t refdiv,uint32_t postdiv1,uint32_t postdiv2)140828c10f9eSGabriel Fernandez static void stm32mp2_a35_pll1_config(uint32_t fbdiv, uint32_t refdiv,
140928c10f9eSGabriel Fernandez uint32_t postdiv1, uint32_t postdiv2)
141028c10f9eSGabriel Fernandez {
1411*d8bfc12aSThomas Bourgoin stm32mp_syscfg_write(CA35SS_SSC_PLL_FREQ1,
141228c10f9eSGabriel Fernandez SHIFT_U32(refdiv,
1413*d8bfc12aSThomas Bourgoin CA35SS_SSC_PLL_FREQ1_REFDIV_SHIFT) |
1414*d8bfc12aSThomas Bourgoin SHIFT_U32(fbdiv, CA35SS_SSC_PLL_FREQ1_FBDIV_SHIFT),
1415*d8bfc12aSThomas Bourgoin CA35SS_SSC_PLL_FREQ1_MASK);
141628c10f9eSGabriel Fernandez
1417*d8bfc12aSThomas Bourgoin stm32mp_syscfg_write(CA35SS_SSC_PLL_FREQ2,
141828c10f9eSGabriel Fernandez SHIFT_U32(postdiv1,
1419*d8bfc12aSThomas Bourgoin CA35SS_SSC_PLL_FREQ2_POSTDIV1_SHIFT) |
142028c10f9eSGabriel Fernandez SHIFT_U32(postdiv2,
1421*d8bfc12aSThomas Bourgoin CA35SS_SSC_PLL_FREQ2_POSTDIV2_SHIFT),
1422*d8bfc12aSThomas Bourgoin CA35SS_SSC_PLL_FREQ2_MASK);
142328c10f9eSGabriel Fernandez }
142428c10f9eSGabriel Fernandez
clk_stm32_pll_config_output(struct clk_stm32_priv * priv,const struct stm32_clk_pll * pll,uint32_t pllsrc,uint32_t * pllcfg,uint32_t fracv)142528c10f9eSGabriel Fernandez static void clk_stm32_pll_config_output(struct clk_stm32_priv *priv,
142628c10f9eSGabriel Fernandez const struct stm32_clk_pll *pll,
142728c10f9eSGabriel Fernandez uint32_t pllsrc,
142828c10f9eSGabriel Fernandez uint32_t *pllcfg,
142928c10f9eSGabriel Fernandez uint32_t fracv)
143028c10f9eSGabriel Fernandez {
143128c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1;
143228c10f9eSGabriel Fernandez uintptr_t pllxcfgr2 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR2;
143328c10f9eSGabriel Fernandez uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3;
143428c10f9eSGabriel Fernandez uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4;
143528c10f9eSGabriel Fernandez uintptr_t pllxcfgr6 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR6;
143628c10f9eSGabriel Fernandez uintptr_t pllxcfgr7 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR7;
143728c10f9eSGabriel Fernandez int sel = (pllsrc & MUX_SEL_MASK) >> MUX_SEL_SHIFT;
143828c10f9eSGabriel Fernandez unsigned long refclk = clk_stm32_pll_get_oscillator_rate(sel);
143928c10f9eSGabriel Fernandez
1440636e1d3cSGabriel Fernandez if (!fracv) {
144128c10f9eSGabriel Fernandez /* PLL in integer mode */
144228c10f9eSGabriel Fernandez
144328c10f9eSGabriel Fernandez /*
144428c10f9eSGabriel Fernandez * No need to check max clock, as oscillator reference clocks
144528c10f9eSGabriel Fernandez * will always be less than 1.2GHz
144628c10f9eSGabriel Fernandez */
144728c10f9eSGabriel Fernandez if (refclk < PLL_REFCLK_MIN)
144828c10f9eSGabriel Fernandez panic();
144928c10f9eSGabriel Fernandez
145028c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_FRACIN_MASK);
145128c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN);
145228c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_DACEN);
145328c10f9eSGabriel Fernandez io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS);
145428c10f9eSGabriel Fernandez io_setbits32(pllxcfgr1, RCC_PLLxCFGR1_SSMODRST);
145528c10f9eSGabriel Fernandez } else {
145628c10f9eSGabriel Fernandez /* PLL in frac mode */
145728c10f9eSGabriel Fernandez
145828c10f9eSGabriel Fernandez /*
145928c10f9eSGabriel Fernandez * No need to check max clock, as oscillator reference clocks
146028c10f9eSGabriel Fernandez * will always be less than 1.2GHz
146128c10f9eSGabriel Fernandez */
146228c10f9eSGabriel Fernandez if (refclk < PLL_FRAC_REFCLK_MIN)
146328c10f9eSGabriel Fernandez panic();
146428c10f9eSGabriel Fernandez
146528c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr3, RCC_PLLxCFGR3_FRACIN_MASK,
146628c10f9eSGabriel Fernandez fracv & RCC_PLLxCFGR3_FRACIN_MASK);
146728c10f9eSGabriel Fernandez io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS);
146828c10f9eSGabriel Fernandez io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN);
146928c10f9eSGabriel Fernandez }
147028c10f9eSGabriel Fernandez
147128c10f9eSGabriel Fernandez assert(pllcfg[REFDIV]);
147228c10f9eSGabriel Fernandez
147328c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr2, RCC_PLLxCFGR2_FBDIV_MASK,
147428c10f9eSGabriel Fernandez SHIFT_U32(pllcfg[FBDIV], RCC_PLLxCFGR2_FBDIV_SHIFT) &
147528c10f9eSGabriel Fernandez RCC_PLLxCFGR2_FBDIV_MASK);
147628c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr2, RCC_PLLxCFGR2_FREFDIV_MASK,
147728c10f9eSGabriel Fernandez pllcfg[REFDIV] & RCC_PLLxCFGR2_FREFDIV_MASK);
147828c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr6, RCC_PLLxCFGR6_POSTDIV1_MASK,
147928c10f9eSGabriel Fernandez pllcfg[POSTDIV1] & RCC_PLLxCFGR6_POSTDIV1_MASK);
148028c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr7, RCC_PLLxCFGR7_POSTDIV2_MASK,
148128c10f9eSGabriel Fernandez pllcfg[POSTDIV2] & RCC_PLLxCFGR7_POSTDIV2_MASK);
148228c10f9eSGabriel Fernandez
1483636e1d3cSGabriel Fernandez if (!pllcfg[POSTDIV1] || !pllcfg[POSTDIV2]) {
148428c10f9eSGabriel Fernandez /* Bypass mode */
148528c10f9eSGabriel Fernandez io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_BYPASS);
148628c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_FOUTPOSTDIVEN);
148728c10f9eSGabriel Fernandez } else {
148828c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_BYPASS);
148928c10f9eSGabriel Fernandez io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_FOUTPOSTDIVEN);
149028c10f9eSGabriel Fernandez }
149128c10f9eSGabriel Fernandez }
149228c10f9eSGabriel Fernandez
clk_stm32_pll_config_csg(struct clk_stm32_priv * priv,const struct stm32_clk_pll * pll,uint32_t * csg)149328c10f9eSGabriel Fernandez static void clk_stm32_pll_config_csg(struct clk_stm32_priv *priv,
149428c10f9eSGabriel Fernandez const struct stm32_clk_pll *pll,
149528c10f9eSGabriel Fernandez uint32_t *csg)
149628c10f9eSGabriel Fernandez {
149728c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1;
149828c10f9eSGabriel Fernandez uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3;
149928c10f9eSGabriel Fernandez uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4;
150028c10f9eSGabriel Fernandez uintptr_t pllxcfgr5 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR5;
150128c10f9eSGabriel Fernandez
150228c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr5, RCC_PLLxCFGR5_DIVVAL_MASK,
150328c10f9eSGabriel Fernandez csg[DIVVAL] & RCC_PLLxCFGR5_DIVVAL_MASK);
150428c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr5, RCC_PLLxCFGR5_SPREAD_MASK,
150528c10f9eSGabriel Fernandez SHIFT_U32(csg[SPREAD], RCC_PLLxCFGR5_SPREAD_SHIFT) &
150628c10f9eSGabriel Fernandez RCC_PLLxCFGR5_SPREAD_MASK);
150728c10f9eSGabriel Fernandez
1508636e1d3cSGabriel Fernandez if (csg[DOWNSPREAD])
150928c10f9eSGabriel Fernandez io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_DOWNSPREAD);
151028c10f9eSGabriel Fernandez else
151128c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_DOWNSPREAD);
151228c10f9eSGabriel Fernandez
151328c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS);
151428c10f9eSGabriel Fernandez
151528c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr1, RCC_PLLxCFGR1_PLLEN);
151628c10f9eSGabriel Fernandez udelay(1);
151728c10f9eSGabriel Fernandez
151828c10f9eSGabriel Fernandez io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN);
151928c10f9eSGabriel Fernandez io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_DACEN);
152028c10f9eSGabriel Fernandez }
152128c10f9eSGabriel Fernandez
clk_stm32_pll_get_pdata(unsigned int pll_idx)152228c10f9eSGabriel Fernandez static struct stm32_pll_dt_cfg *clk_stm32_pll_get_pdata(unsigned int pll_idx)
152328c10f9eSGabriel Fernandez {
152428c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv();
152528c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata;
152628c10f9eSGabriel Fernandez
152728c10f9eSGabriel Fernandez assert(pll_idx < pdata->npll);
152828c10f9eSGabriel Fernandez
152928c10f9eSGabriel Fernandez return &pdata->pll[pll_idx];
153028c10f9eSGabriel Fernandez }
153128c10f9eSGabriel Fernandez
clk_stm32_pll_set_mux(struct clk_stm32_priv * priv __unused,uint32_t src)153228c10f9eSGabriel Fernandez static int clk_stm32_pll_set_mux(struct clk_stm32_priv *priv __unused,
153328c10f9eSGabriel Fernandez uint32_t src)
153428c10f9eSGabriel Fernandez {
153528c10f9eSGabriel Fernandez int mux = (src & MUX_ID_MASK) >> MUX_ID_SHIFT;
153628c10f9eSGabriel Fernandez int sel = (src & MUX_SEL_MASK) >> MUX_SEL_SHIFT;
153728c10f9eSGabriel Fernandez
15386efa483fSEtienne Carriere if (stm32_mux_set_parent(mux, sel))
15396efa483fSEtienne Carriere return -1;
15406efa483fSEtienne Carriere else
15416efa483fSEtienne Carriere return 0;
15426efa483fSEtienne Carriere
154328c10f9eSGabriel Fernandez }
154428c10f9eSGabriel Fernandez
clk_stm32_pll1_init(struct clk_stm32_priv * priv,int pll_idx __unused,struct stm32_pll_dt_cfg * pll_conf)154528c10f9eSGabriel Fernandez static void clk_stm32_pll1_init(struct clk_stm32_priv *priv,
154628c10f9eSGabriel Fernandez int pll_idx __unused,
154728c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf)
154828c10f9eSGabriel Fernandez {
154928c10f9eSGabriel Fernandez int sel = (pll_conf->src & MUX_SEL_MASK) >> MUX_SEL_SHIFT;
155028c10f9eSGabriel Fernandez unsigned long refclk = 0;
155128c10f9eSGabriel Fernandez
15527b8c7554SGabriel Fernandez stm32mp2_a35_ss_on_bypass();
155328c10f9eSGabriel Fernandez
155428c10f9eSGabriel Fernandez if (clk_stm32_pll_set_mux(priv, pll_conf->src))
155528c10f9eSGabriel Fernandez panic();
155628c10f9eSGabriel Fernandez
155728c10f9eSGabriel Fernandez refclk = clk_stm32_pll_get_oscillator_rate(sel);
155828c10f9eSGabriel Fernandez
155928c10f9eSGabriel Fernandez /*
156028c10f9eSGabriel Fernandez * No need to check max clock, as oscillator reference clocks will
156128c10f9eSGabriel Fernandez * always be less than 1.2GHz
156228c10f9eSGabriel Fernandez */
156328c10f9eSGabriel Fernandez if (refclk < PLL_REFCLK_MIN)
156428c10f9eSGabriel Fernandez panic();
156528c10f9eSGabriel Fernandez
156628c10f9eSGabriel Fernandez stm32mp2_a35_pll1_config(pll_conf->cfg[FBDIV],
156728c10f9eSGabriel Fernandez pll_conf->cfg[REFDIV],
156828c10f9eSGabriel Fernandez pll_conf->cfg[POSTDIV1],
156928c10f9eSGabriel Fernandez pll_conf->cfg[POSTDIV2]);
157028c10f9eSGabriel Fernandez
157128c10f9eSGabriel Fernandez if (stm32mp2_a35_pll1_start())
157228c10f9eSGabriel Fernandez panic();
157328c10f9eSGabriel Fernandez }
157428c10f9eSGabriel Fernandez
clk_stm32_pll_init(struct clk_stm32_priv * priv,int pll_idx,struct stm32_pll_dt_cfg * pll_conf)157528c10f9eSGabriel Fernandez static void clk_stm32_pll_init(struct clk_stm32_priv *priv, int pll_idx,
157628c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf)
157728c10f9eSGabriel Fernandez {
157828c10f9eSGabriel Fernandez const struct stm32_clk_pll *pll = clk_stm32_pll_data(pll_idx);
157928c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1;
158028c10f9eSGabriel Fernandez bool spread_spectrum = false;
158128c10f9eSGabriel Fernandez
15822604f62dSEtienne Carriere if (stm32_gate_rdy_disable(pll->gate_id))
15832604f62dSEtienne Carriere panic();
158428c10f9eSGabriel Fernandez
158528c10f9eSGabriel Fernandez if (clk_stm32_pll_set_mux(priv, pll_conf->src))
158628c10f9eSGabriel Fernandez panic();
158728c10f9eSGabriel Fernandez
158828c10f9eSGabriel Fernandez clk_stm32_pll_config_output(priv, pll, pll_conf->src,
158928c10f9eSGabriel Fernandez pll_conf->cfg, pll_conf->frac);
159028c10f9eSGabriel Fernandez
159128c10f9eSGabriel Fernandez if (pll_conf->csg_enabled) {
159228c10f9eSGabriel Fernandez clk_stm32_pll_config_csg(priv, pll, pll_conf->csg);
159328c10f9eSGabriel Fernandez spread_spectrum = true;
159428c10f9eSGabriel Fernandez }
159528c10f9eSGabriel Fernandez
15962604f62dSEtienne Carriere if (stm32_gate_rdy_enable(pll->gate_id))
15972604f62dSEtienne Carriere panic();
159828c10f9eSGabriel Fernandez
159928c10f9eSGabriel Fernandez if (spread_spectrum)
160028c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr1, RCC_PLLxCFGR1_SSMODRST);
160128c10f9eSGabriel Fernandez }
160228c10f9eSGabriel Fernandez
stm32_clk_pll_configure(struct clk_stm32_priv * priv)160328c10f9eSGabriel Fernandez static int stm32_clk_pll_configure(struct clk_stm32_priv *priv)
160428c10f9eSGabriel Fernandez {
160528c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf = NULL;
160628c10f9eSGabriel Fernandez size_t i = 0;
160728c10f9eSGabriel Fernandez
160828c10f9eSGabriel Fernandez for (i = 0; i < PLL_NB; i++) {
160928c10f9eSGabriel Fernandez pll_conf = clk_stm32_pll_get_pdata(i);
161028c10f9eSGabriel Fernandez
161128c10f9eSGabriel Fernandez if (pll_conf->enabled) {
1612636e1d3cSGabriel Fernandez /* Skip the PLL3 (need GPU regulator to configure) */
161328c10f9eSGabriel Fernandez if (i == PLL3_ID)
161428c10f9eSGabriel Fernandez continue;
161528c10f9eSGabriel Fernandez
1616636e1d3cSGabriel Fernandez /* Skip the PLL2 (reserved to DDR) */
161728c10f9eSGabriel Fernandez if (i == PLL2_ID)
161828c10f9eSGabriel Fernandez continue;
161928c10f9eSGabriel Fernandez
162028c10f9eSGabriel Fernandez if (i == PLL1_ID)
162128c10f9eSGabriel Fernandez clk_stm32_pll1_init(priv, i, pll_conf);
162228c10f9eSGabriel Fernandez else
162328c10f9eSGabriel Fernandez clk_stm32_pll_init(priv, i, pll_conf);
162428c10f9eSGabriel Fernandez }
162528c10f9eSGabriel Fernandez }
162628c10f9eSGabriel Fernandez
162728c10f9eSGabriel Fernandez return 0;
162828c10f9eSGabriel Fernandez }
162928c10f9eSGabriel Fernandez
163028c10f9eSGabriel Fernandez #define __WORD_BIT 32
163128c10f9eSGabriel Fernandez
wait_predivsr(uint16_t channel)163228c10f9eSGabriel Fernandez static int wait_predivsr(uint16_t channel)
163328c10f9eSGabriel Fernandez {
163428c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base();
163528c10f9eSGabriel Fernandez uintptr_t previvsr = 0;
163628c10f9eSGabriel Fernandez uint32_t channel_bit = 0;
163728c10f9eSGabriel Fernandez uint32_t value = 0;
163828c10f9eSGabriel Fernandez
163928c10f9eSGabriel Fernandez if (channel < __WORD_BIT) {
164028c10f9eSGabriel Fernandez previvsr = rcc_base + RCC_PREDIVSR1;
164128c10f9eSGabriel Fernandez channel_bit = BIT(channel);
164228c10f9eSGabriel Fernandez } else {
164328c10f9eSGabriel Fernandez previvsr = rcc_base + RCC_PREDIVSR2;
164428c10f9eSGabriel Fernandez channel_bit = BIT(channel - __WORD_BIT);
164528c10f9eSGabriel Fernandez }
164628c10f9eSGabriel Fernandez
164728c10f9eSGabriel Fernandez if (IO_READ32_POLL_TIMEOUT(previvsr, value, !(value & channel_bit), 0,
164828c10f9eSGabriel Fernandez CLKDIV_TIMEOUT)) {
164928c10f9eSGabriel Fernandez EMSG("Pre divider status: %#"PRIx32, io_read32(previvsr));
165028c10f9eSGabriel Fernandez return -1;
165128c10f9eSGabriel Fernandez }
165228c10f9eSGabriel Fernandez
165328c10f9eSGabriel Fernandez return 0;
165428c10f9eSGabriel Fernandez }
165528c10f9eSGabriel Fernandez
wait_findivsr(uint16_t channel)165628c10f9eSGabriel Fernandez static int wait_findivsr(uint16_t channel)
165728c10f9eSGabriel Fernandez {
165828c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base();
165928c10f9eSGabriel Fernandez uintptr_t finvivsr = 0;
166028c10f9eSGabriel Fernandez uint32_t channel_bit = 0;
166128c10f9eSGabriel Fernandez uint32_t value = 0;
166228c10f9eSGabriel Fernandez
166328c10f9eSGabriel Fernandez if (channel < __WORD_BIT) {
166428c10f9eSGabriel Fernandez finvivsr = rcc_base + RCC_FINDIVSR1;
166528c10f9eSGabriel Fernandez channel_bit = BIT(channel);
166628c10f9eSGabriel Fernandez } else {
166728c10f9eSGabriel Fernandez finvivsr = rcc_base + RCC_FINDIVSR2;
166828c10f9eSGabriel Fernandez channel_bit = BIT(channel - __WORD_BIT);
166928c10f9eSGabriel Fernandez }
167028c10f9eSGabriel Fernandez
167128c10f9eSGabriel Fernandez if (IO_READ32_POLL_TIMEOUT(finvivsr, value, !(value & channel_bit), 0,
167228c10f9eSGabriel Fernandez CLKDIV_TIMEOUT)) {
167328c10f9eSGabriel Fernandez EMSG("Final divider status: %#"PRIx32, io_read32(finvivsr));
167428c10f9eSGabriel Fernandez return -1;
167528c10f9eSGabriel Fernandez }
167628c10f9eSGabriel Fernandez
167728c10f9eSGabriel Fernandez return 0;
167828c10f9eSGabriel Fernandez }
167928c10f9eSGabriel Fernandez
wait_xbar_sts(uint16_t channel)168028c10f9eSGabriel Fernandez static int wait_xbar_sts(uint16_t channel)
168128c10f9eSGabriel Fernandez {
168228c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base();
168328c10f9eSGabriel Fernandez uintptr_t xbar_cfgr = rcc_base + RCC_XBAR0CFGR + (0x4 * channel);
168428c10f9eSGabriel Fernandez uint32_t value = 0;
168528c10f9eSGabriel Fernandez
168628c10f9eSGabriel Fernandez if (IO_READ32_POLL_TIMEOUT(xbar_cfgr, value,
168728c10f9eSGabriel Fernandez !(value & RCC_XBAR0CFGR_XBAR0STS), 0,
168828c10f9eSGabriel Fernandez CLKDIV_TIMEOUT)) {
168928c10f9eSGabriel Fernandez EMSG("XBAR%"PRIu16"CFGR: %#"PRIx32, channel,
169028c10f9eSGabriel Fernandez io_read32(xbar_cfgr));
169128c10f9eSGabriel Fernandez return -1;
169228c10f9eSGabriel Fernandez }
169328c10f9eSGabriel Fernandez
169428c10f9eSGabriel Fernandez return 0;
169528c10f9eSGabriel Fernandez }
169628c10f9eSGabriel Fernandez
flexclkgen_search_config(uint16_t channel,unsigned int * clk_src,unsigned int * prediv,unsigned int * findiv)16971f2e0a3fSGatien Chevallier static TEE_Result flexclkgen_search_config(uint16_t channel,
16981f2e0a3fSGatien Chevallier unsigned int *clk_src,
16991f2e0a3fSGatien Chevallier unsigned int *prediv,
17001f2e0a3fSGatien Chevallier unsigned int *findiv)
17011f2e0a3fSGatien Chevallier {
17021f2e0a3fSGatien Chevallier struct clk_stm32_priv *priv = clk_stm32_get_priv();
17031f2e0a3fSGatien Chevallier struct stm32_clk_platdata *pdata = priv->pdata;
17041f2e0a3fSGatien Chevallier unsigned int flex_id = U(0);
17051f2e0a3fSGatien Chevallier uint32_t dt_cfg = U(0);
17061f2e0a3fSGatien Chevallier uint32_t i = U(0);
17071f2e0a3fSGatien Chevallier
17081f2e0a3fSGatien Chevallier assert(clk_src && prediv && findiv);
17091f2e0a3fSGatien Chevallier
17101f2e0a3fSGatien Chevallier /*
17111f2e0a3fSGatien Chevallier * pdata->flexgen is the array of all the flexgen configuration from
17121f2e0a3fSGatien Chevallier * the device tree.
17131f2e0a3fSGatien Chevallier * The binding does not enforce the description of all flexgen nor
17141f2e0a3fSGatien Chevallier * the order it which they are listed.
17151f2e0a3fSGatien Chevallier */
17161f2e0a3fSGatien Chevallier for (i = 0; i < pdata->nflexgen; i++) {
17171f2e0a3fSGatien Chevallier dt_cfg = pdata->flexgen[i];
17181f2e0a3fSGatien Chevallier
17191f2e0a3fSGatien Chevallier flex_id = (dt_cfg & FLEX_ID_MASK) >> FLEX_ID_SHIFT;
17201f2e0a3fSGatien Chevallier if (flex_id == channel) {
17211f2e0a3fSGatien Chevallier *clk_src = (dt_cfg & FLEX_SEL_MASK) >> FLEX_SEL_SHIFT;
17221f2e0a3fSGatien Chevallier *prediv = (dt_cfg & FLEX_PDIV_MASK) >> FLEX_PDIV_SHIFT;
17231f2e0a3fSGatien Chevallier *findiv = (dt_cfg & FLEX_FDIV_MASK) >> FLEX_FDIV_SHIFT;
17241f2e0a3fSGatien Chevallier
17251f2e0a3fSGatien Chevallier return TEE_SUCCESS;
17261f2e0a3fSGatien Chevallier }
17271f2e0a3fSGatien Chevallier }
17281f2e0a3fSGatien Chevallier
17291f2e0a3fSGatien Chevallier return TEE_ERROR_ITEM_NOT_FOUND;
17301f2e0a3fSGatien Chevallier }
17311f2e0a3fSGatien Chevallier
flexclkgen_config_channel(uint16_t channel,unsigned int clk_src,unsigned int prediv,unsigned int findiv)173228c10f9eSGabriel Fernandez static void flexclkgen_config_channel(uint16_t channel, unsigned int clk_src,
173328c10f9eSGabriel Fernandez unsigned int prediv, unsigned int findiv)
173428c10f9eSGabriel Fernandez {
173528c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base();
173628c10f9eSGabriel Fernandez
1737636e1d3cSGabriel Fernandez if (wait_predivsr(channel))
173828c10f9eSGabriel Fernandez panic();
173928c10f9eSGabriel Fernandez
174028c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel),
174128c10f9eSGabriel Fernandez RCC_PREDIV0CFGR_PREDIV0_MASK, prediv);
174228c10f9eSGabriel Fernandez
1743636e1d3cSGabriel Fernandez if (wait_predivsr(channel))
174428c10f9eSGabriel Fernandez panic();
174528c10f9eSGabriel Fernandez
1746636e1d3cSGabriel Fernandez if (wait_findivsr(channel))
174728c10f9eSGabriel Fernandez panic();
174828c10f9eSGabriel Fernandez
174928c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel),
175028c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0_MASK,
175128c10f9eSGabriel Fernandez findiv);
175228c10f9eSGabriel Fernandez
1753636e1d3cSGabriel Fernandez if (wait_findivsr(channel))
175428c10f9eSGabriel Fernandez panic();
175528c10f9eSGabriel Fernandez
1756636e1d3cSGabriel Fernandez if (wait_xbar_sts(channel))
175728c10f9eSGabriel Fernandez panic();
175828c10f9eSGabriel Fernandez
175928c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_XBAR0CFGR + (0x4 * channel),
176028c10f9eSGabriel Fernandez RCC_XBAR0CFGR_XBAR0SEL_MASK,
176128c10f9eSGabriel Fernandez clk_src);
176228c10f9eSGabriel Fernandez
176328c10f9eSGabriel Fernandez io_setbits32(rcc_base + RCC_XBAR0CFGR + (0x4 * channel),
176428c10f9eSGabriel Fernandez RCC_XBAR0CFGR_XBAR0EN);
176528c10f9eSGabriel Fernandez
1766636e1d3cSGabriel Fernandez if (wait_xbar_sts(channel))
176728c10f9eSGabriel Fernandez panic();
176828c10f9eSGabriel Fernandez }
176928c10f9eSGabriel Fernandez
stm32mp2_clk_flexgen_configure(struct clk_stm32_priv * priv)177028c10f9eSGabriel Fernandez static int stm32mp2_clk_flexgen_configure(struct clk_stm32_priv *priv)
177128c10f9eSGabriel Fernandez {
177228c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata;
177328c10f9eSGabriel Fernandez uint32_t i = 0;
177428c10f9eSGabriel Fernandez
177528c10f9eSGabriel Fernandez for (i = 0; i < pdata->nflexgen; i++) {
177628c10f9eSGabriel Fernandez uint32_t val = pdata->flexgen[i];
177728c10f9eSGabriel Fernandez uint32_t cmd = 0;
177828c10f9eSGabriel Fernandez uint32_t cmd_data = 0;
177928c10f9eSGabriel Fernandez unsigned int channel = 0;
178028c10f9eSGabriel Fernandez unsigned int clk_src = 0;
178128c10f9eSGabriel Fernandez unsigned int pdiv = 0;
178228c10f9eSGabriel Fernandez unsigned int fdiv = 0;
178328c10f9eSGabriel Fernandez
178428c10f9eSGabriel Fernandez cmd = (val & CMD_MASK) >> CMD_SHIFT;
178528c10f9eSGabriel Fernandez cmd_data = val & ~CMD_MASK;
178628c10f9eSGabriel Fernandez
178728c10f9eSGabriel Fernandez if (cmd != CMD_FLEXGEN)
178828c10f9eSGabriel Fernandez continue;
178928c10f9eSGabriel Fernandez
179028c10f9eSGabriel Fernandez channel = (cmd_data & FLEX_ID_MASK) >> FLEX_ID_SHIFT;
179128c10f9eSGabriel Fernandez
179228c10f9eSGabriel Fernandez /*
179328c10f9eSGabriel Fernandez * Skip ck_ker_stgen configuration, will be done by
179428c10f9eSGabriel Fernandez * stgen driver.
179528c10f9eSGabriel Fernandez */
179628c10f9eSGabriel Fernandez if (channel == FLEX_STGEN)
179728c10f9eSGabriel Fernandez continue;
179828c10f9eSGabriel Fernandez
179928c10f9eSGabriel Fernandez clk_src = (cmd_data & FLEX_SEL_MASK) >> FLEX_SEL_SHIFT;
180028c10f9eSGabriel Fernandez pdiv = (cmd_data & FLEX_PDIV_MASK) >> FLEX_PDIV_SHIFT;
180128c10f9eSGabriel Fernandez fdiv = (cmd_data & FLEX_FDIV_MASK) >> FLEX_FDIV_SHIFT;
180228c10f9eSGabriel Fernandez
180328c10f9eSGabriel Fernandez flexclkgen_config_channel(channel, clk_src, pdiv, fdiv);
180428c10f9eSGabriel Fernandez }
180528c10f9eSGabriel Fernandez
180628c10f9eSGabriel Fernandez return 0;
180728c10f9eSGabriel Fernandez }
180828c10f9eSGabriel Fernandez
stm32_clk_configure_div(struct clk_stm32_priv * priv __unused,uint32_t data)180928c10f9eSGabriel Fernandez static int stm32_clk_configure_div(struct clk_stm32_priv *priv __unused,
181028c10f9eSGabriel Fernandez uint32_t data)
181128c10f9eSGabriel Fernandez {
181228c10f9eSGabriel Fernandez uint32_t div_id = 0;
181328c10f9eSGabriel Fernandez uint32_t div_n = 0;
181428c10f9eSGabriel Fernandez
181528c10f9eSGabriel Fernandez div_id = (data & DIV_ID_MASK) >> DIV_ID_SHIFT;
181628c10f9eSGabriel Fernandez div_n = (data & DIV_DIVN_MASK) >> DIV_DIVN_SHIFT;
181728c10f9eSGabriel Fernandez
181828c10f9eSGabriel Fernandez return stm32_div_set_value(div_id, div_n);
181928c10f9eSGabriel Fernandez }
182028c10f9eSGabriel Fernandez
stm32_clk_configure_mux(struct clk_stm32_priv * priv __unused,uint32_t data)182128c10f9eSGabriel Fernandez static int stm32_clk_configure_mux(struct clk_stm32_priv *priv __unused,
182228c10f9eSGabriel Fernandez uint32_t data)
182328c10f9eSGabriel Fernandez {
182428c10f9eSGabriel Fernandez int mux = (data & MUX_ID_MASK) >> MUX_ID_SHIFT;
182528c10f9eSGabriel Fernandez int sel = (data & MUX_SEL_MASK) >> MUX_SEL_SHIFT;
182628c10f9eSGabriel Fernandez
18276efa483fSEtienne Carriere if (stm32_mux_set_parent(mux, sel))
18286efa483fSEtienne Carriere return -1;
18296efa483fSEtienne Carriere else
18306efa483fSEtienne Carriere return 0;
183128c10f9eSGabriel Fernandez }
183228c10f9eSGabriel Fernandez
stm32_clk_configure_by_addr_val(struct clk_stm32_priv * priv,uint32_t data)183328c10f9eSGabriel Fernandez static int stm32_clk_configure_by_addr_val(struct clk_stm32_priv *priv,
183428c10f9eSGabriel Fernandez uint32_t data)
183528c10f9eSGabriel Fernandez {
183628c10f9eSGabriel Fernandez uint32_t addr = data >> CLK_ADDR_SHIFT;
183728c10f9eSGabriel Fernandez uint32_t val = data & CLK_ADDR_VAL_MASK;
183828c10f9eSGabriel Fernandez
183928c10f9eSGabriel Fernandez io_setbits32(priv->base + addr, val);
184028c10f9eSGabriel Fernandez
184128c10f9eSGabriel Fernandez return 0;
184228c10f9eSGabriel Fernandez }
184328c10f9eSGabriel Fernandez
stm32_clk_configure_obs(struct clk_stm32_priv * priv,uint32_t data)184428c10f9eSGabriel Fernandez static void stm32_clk_configure_obs(struct clk_stm32_priv *priv,
184528c10f9eSGabriel Fernandez uint32_t data)
184628c10f9eSGabriel Fernandez {
184728c10f9eSGabriel Fernandez uint32_t id = (data & OBS_ID_MASK) >> OBS_ID_SHIFT;
184828c10f9eSGabriel Fernandez uint32_t status = (data & OBS_STATUS_MASK) >> OBS_STATUS_SHIFT;
184928c10f9eSGabriel Fernandez uint32_t int_ext = (data & OBS_INTEXT_MASK) >> OBS_INTEXT_SHIFT;
185028c10f9eSGabriel Fernandez uint32_t div = (data & OBS_DIV_MASK) >> OBS_DIV_SHIFT;
185128c10f9eSGabriel Fernandez uint32_t inv = (data & OBS_INV_MASK) >> OBS_INV_SHIFT;
185228c10f9eSGabriel Fernandez uint32_t sel = (data & OBS_SEL_MASK) >> OBS_SEL_SHIFT;
185328c10f9eSGabriel Fernandez uint32_t reg = 0;
185428c10f9eSGabriel Fernandez uint32_t val = 0;
185528c10f9eSGabriel Fernandez
185628c10f9eSGabriel Fernandez if (!id)
185728c10f9eSGabriel Fernandez reg = RCC_FCALCOBS0CFGR;
185828c10f9eSGabriel Fernandez else
185928c10f9eSGabriel Fernandez reg = RCC_FCALCOBS1CFGR;
186028c10f9eSGabriel Fernandez
186128c10f9eSGabriel Fernandez if (status)
186228c10f9eSGabriel Fernandez val |= RCC_FCALCOBS0CFGR_CKOBSEN;
186328c10f9eSGabriel Fernandez
186428c10f9eSGabriel Fernandez if (int_ext == OBS_EXT) {
186528c10f9eSGabriel Fernandez val |= RCC_FCALCOBS0CFGR_CKOBSEXTSEL;
186628c10f9eSGabriel Fernandez val |= SHIFT_U32(sel, RCC_FCALCOBS0CFGR_CKEXTSEL_SHIFT);
186728c10f9eSGabriel Fernandez } else {
186828c10f9eSGabriel Fernandez val |= SHIFT_U32(sel, RCC_FCALCOBS0CFGR_CKINTSEL_SHIFT);
186928c10f9eSGabriel Fernandez }
187028c10f9eSGabriel Fernandez
187128c10f9eSGabriel Fernandez if (inv)
187228c10f9eSGabriel Fernandez val |= RCC_FCALCOBS0CFGR_CKOBSINV;
187328c10f9eSGabriel Fernandez
187428c10f9eSGabriel Fernandez val |= SHIFT_U32(div, RCC_FCALCOBS0CFGR_CKOBSDIV_SHIFT);
187528c10f9eSGabriel Fernandez
187628c10f9eSGabriel Fernandez io_write32(priv->base + reg, val);
187728c10f9eSGabriel Fernandez }
187828c10f9eSGabriel Fernandez
stm32_clk_configure(struct clk_stm32_priv * priv,uint32_t val)187928c10f9eSGabriel Fernandez static int stm32_clk_configure(struct clk_stm32_priv *priv, uint32_t val)
188028c10f9eSGabriel Fernandez {
188128c10f9eSGabriel Fernandez uint32_t cmd_data = 0;
188228c10f9eSGabriel Fernandez uint32_t cmd = 0;
188328c10f9eSGabriel Fernandez int ret = 0;
188428c10f9eSGabriel Fernandez
188528c10f9eSGabriel Fernandez if (val & CMD_ADDR_BIT) {
188628c10f9eSGabriel Fernandez cmd_data = val & ~CMD_ADDR_BIT;
188728c10f9eSGabriel Fernandez
188828c10f9eSGabriel Fernandez return stm32_clk_configure_by_addr_val(priv, cmd_data);
188928c10f9eSGabriel Fernandez }
189028c10f9eSGabriel Fernandez
189128c10f9eSGabriel Fernandez cmd = (val & CMD_MASK) >> CMD_SHIFT;
189228c10f9eSGabriel Fernandez cmd_data = val & ~CMD_MASK;
189328c10f9eSGabriel Fernandez
189428c10f9eSGabriel Fernandez switch (cmd) {
189528c10f9eSGabriel Fernandez case CMD_DIV:
189628c10f9eSGabriel Fernandez ret = stm32_clk_configure_div(priv, cmd_data);
189728c10f9eSGabriel Fernandez break;
189828c10f9eSGabriel Fernandez
189928c10f9eSGabriel Fernandez case CMD_MUX:
190028c10f9eSGabriel Fernandez ret = stm32_clk_configure_mux(priv, cmd_data);
190128c10f9eSGabriel Fernandez break;
190228c10f9eSGabriel Fernandez
190328c10f9eSGabriel Fernandez case CMD_OBS:
190428c10f9eSGabriel Fernandez stm32_clk_configure_obs(priv, cmd_data);
190528c10f9eSGabriel Fernandez break;
190628c10f9eSGabriel Fernandez
190728c10f9eSGabriel Fernandez default:
190828c10f9eSGabriel Fernandez EMSG("cmd unknown ! : %#"PRIx32, val);
190928c10f9eSGabriel Fernandez ret = -1;
191028c10f9eSGabriel Fernandez }
191128c10f9eSGabriel Fernandez
191228c10f9eSGabriel Fernandez return ret;
191328c10f9eSGabriel Fernandez }
191428c10f9eSGabriel Fernandez
stm32_clk_bus_configure(struct clk_stm32_priv * priv)191528c10f9eSGabriel Fernandez static int stm32_clk_bus_configure(struct clk_stm32_priv *priv)
191628c10f9eSGabriel Fernandez {
191728c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata;
191828c10f9eSGabriel Fernandez uint32_t i = 0;
191928c10f9eSGabriel Fernandez
192028c10f9eSGabriel Fernandez for (i = 0; i < pdata->nbusclk; i++) {
192128c10f9eSGabriel Fernandez int ret = 0;
192228c10f9eSGabriel Fernandez
192328c10f9eSGabriel Fernandez ret = stm32_clk_configure(priv, pdata->busclk[i]);
1924636e1d3cSGabriel Fernandez if (ret)
192528c10f9eSGabriel Fernandez return ret;
192628c10f9eSGabriel Fernandez }
192728c10f9eSGabriel Fernandez
192828c10f9eSGabriel Fernandez return 0;
192928c10f9eSGabriel Fernandez }
193028c10f9eSGabriel Fernandez
stm32_clk_kernel_configure(struct clk_stm32_priv * priv)193128c10f9eSGabriel Fernandez static int stm32_clk_kernel_configure(struct clk_stm32_priv *priv)
193228c10f9eSGabriel Fernandez {
193328c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata;
193428c10f9eSGabriel Fernandez uint32_t i = 0;
193528c10f9eSGabriel Fernandez
193628c10f9eSGabriel Fernandez for (i = 0; i < pdata->nkernelclk; i++) {
193728c10f9eSGabriel Fernandez int ret = 0;
193828c10f9eSGabriel Fernandez
193928c10f9eSGabriel Fernandez ret = stm32_clk_configure(priv, pdata->kernelclk[i]);
1940636e1d3cSGabriel Fernandez if (ret)
194128c10f9eSGabriel Fernandez return ret;
194228c10f9eSGabriel Fernandez }
194328c10f9eSGabriel Fernandez
194428c10f9eSGabriel Fernandez return 0;
194528c10f9eSGabriel Fernandez }
194628c10f9eSGabriel Fernandez
stm32mp2_init_clock_tree(struct clk_stm32_priv * priv,struct stm32_clk_platdata * pdata)194728c10f9eSGabriel Fernandez static void stm32mp2_init_clock_tree(struct clk_stm32_priv *priv,
194828c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata)
194928c10f9eSGabriel Fernandez {
195028c10f9eSGabriel Fernandez stm32_clk_oscillators_enable(priv, pdata);
195128c10f9eSGabriel Fernandez
195228c10f9eSGabriel Fernandez /* Come back to HSI for flexgen */
195328c10f9eSGabriel Fernandez stm32mp2_clk_xbar_on_hsi(priv);
195428c10f9eSGabriel Fernandez
195528c10f9eSGabriel Fernandez if (stm32_clk_pll_configure(priv))
195628c10f9eSGabriel Fernandez panic("Cannot configure plls");
195728c10f9eSGabriel Fernandez
195828c10f9eSGabriel Fernandez /* Wait LSE ready before to use it */
195928c10f9eSGabriel Fernandez if (stm32_clk_oscillators_wait_lse_ready(priv, pdata))
196028c10f9eSGabriel Fernandez panic("Timeout: to enable LSE");
196128c10f9eSGabriel Fernandez
196228c10f9eSGabriel Fernandez if (stm32mp2_clk_flexgen_configure(priv))
196328c10f9eSGabriel Fernandez panic("Cannot configure flexgen");
196428c10f9eSGabriel Fernandez
196528c10f9eSGabriel Fernandez if (stm32_clk_bus_configure(priv))
196628c10f9eSGabriel Fernandez panic("Cannot config bus clocks");
196728c10f9eSGabriel Fernandez
196828c10f9eSGabriel Fernandez if (stm32_clk_kernel_configure(priv))
196928c10f9eSGabriel Fernandez panic("Cannot configure kernel clocks");
197028c10f9eSGabriel Fernandez
197128c10f9eSGabriel Fernandez /* Configure LSE css after RTC source configuration */
197228c10f9eSGabriel Fernandez stm32_clk_oscillators_lse_set_css(priv, pdata);
197328c10f9eSGabriel Fernandez }
197428c10f9eSGabriel Fernandez
clk_stm32_osc_enable(struct clk * clk)197528c10f9eSGabriel Fernandez static TEE_Result clk_stm32_osc_enable(struct clk *clk)
197628c10f9eSGabriel Fernandez {
197728c10f9eSGabriel Fernandez return clk_stm32_gate_ready_ops.enable(clk);
197828c10f9eSGabriel Fernandez }
197928c10f9eSGabriel Fernandez
clk_stm32_osc_disable(struct clk * clk)198028c10f9eSGabriel Fernandez static void clk_stm32_osc_disable(struct clk *clk)
198128c10f9eSGabriel Fernandez {
198228c10f9eSGabriel Fernandez clk_stm32_gate_ready_ops.disable(clk);
198328c10f9eSGabriel Fernandez }
198428c10f9eSGabriel Fernandez
198528c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_osc_ops = {
198628c10f9eSGabriel Fernandez .enable = clk_stm32_osc_enable,
198728c10f9eSGabriel Fernandez .disable = clk_stm32_osc_disable,
198828c10f9eSGabriel Fernandez };
198928c10f9eSGabriel Fernandez
clk_stm32_msi_get_rate(struct clk * clk __unused,unsigned long prate __unused)199028c10f9eSGabriel Fernandez static unsigned long clk_stm32_msi_get_rate(struct clk *clk __unused,
199128c10f9eSGabriel Fernandez unsigned long prate __unused)
199228c10f9eSGabriel Fernandez {
199328c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv();
199428c10f9eSGabriel Fernandez uintptr_t address = priv->base + RCC_BDCR;
199528c10f9eSGabriel Fernandez
199628c10f9eSGabriel Fernandez if ((io_read32(address) & RCC_BDCR_MSIFREQSEL))
199728c10f9eSGabriel Fernandez return RCC_16_MHZ;
199828c10f9eSGabriel Fernandez
199928c10f9eSGabriel Fernandez return RCC_4_MHZ;
200028c10f9eSGabriel Fernandez }
200128c10f9eSGabriel Fernandez
clk_stm32_msi_set_rate(struct clk * clk __unused,unsigned long rate,unsigned long prate __unused)200228c10f9eSGabriel Fernandez static TEE_Result clk_stm32_msi_set_rate(struct clk *clk __unused,
200328c10f9eSGabriel Fernandez unsigned long rate,
200428c10f9eSGabriel Fernandez unsigned long prate __unused)
200528c10f9eSGabriel Fernandez {
200628c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv();
200728c10f9eSGabriel Fernandez
200828c10f9eSGabriel Fernandez return clk_stm32_osc_msi_set_rate(priv, rate);
200928c10f9eSGabriel Fernandez }
201028c10f9eSGabriel Fernandez
201128c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_oscillator_msi_ops = {
201228c10f9eSGabriel Fernandez .enable = clk_stm32_osc_enable,
201328c10f9eSGabriel Fernandez .disable = clk_stm32_osc_disable,
201428c10f9eSGabriel Fernandez .get_rate = clk_stm32_msi_get_rate,
201528c10f9eSGabriel Fernandez .set_rate = clk_stm32_msi_set_rate,
201628c10f9eSGabriel Fernandez };
201728c10f9eSGabriel Fernandez
clk_stm32_hse_div_set_rate(struct clk * clk,unsigned long rate,unsigned long parent_rate)201828c10f9eSGabriel Fernandez static TEE_Result clk_stm32_hse_div_set_rate(struct clk *clk,
201928c10f9eSGabriel Fernandez unsigned long rate,
202028c10f9eSGabriel Fernandez unsigned long parent_rate)
202128c10f9eSGabriel Fernandez {
202228c10f9eSGabriel Fernandez return clk_stm32_divider_set_rate(clk, rate, parent_rate);
202328c10f9eSGabriel Fernandez }
202428c10f9eSGabriel Fernandez
202528c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_hse_div_ops = {
202628c10f9eSGabriel Fernandez .get_rate = clk_stm32_divider_get_rate,
202728c10f9eSGabriel Fernandez .set_rate = clk_stm32_hse_div_set_rate,
202828c10f9eSGabriel Fernandez };
202928c10f9eSGabriel Fernandez
clk_stm32_hsediv2_enable(struct clk * clk)203028c10f9eSGabriel Fernandez static TEE_Result clk_stm32_hsediv2_enable(struct clk *clk)
203128c10f9eSGabriel Fernandez {
203228c10f9eSGabriel Fernandez return clk_stm32_gate_ops.enable(clk);
203328c10f9eSGabriel Fernandez }
203428c10f9eSGabriel Fernandez
clk_stm32_hsediv2_disable(struct clk * clk)203528c10f9eSGabriel Fernandez static void clk_stm32_hsediv2_disable(struct clk *clk)
203628c10f9eSGabriel Fernandez {
203728c10f9eSGabriel Fernandez clk_stm32_gate_ops.disable(clk);
203828c10f9eSGabriel Fernandez }
203928c10f9eSGabriel Fernandez
clk_stm32_hsediv2_get_rate(struct clk * clk __unused,unsigned long prate)204028c10f9eSGabriel Fernandez static unsigned long clk_stm32_hsediv2_get_rate(struct clk *clk __unused,
204128c10f9eSGabriel Fernandez unsigned long prate)
204228c10f9eSGabriel Fernandez {
204328c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv();
204428c10f9eSGabriel Fernandez uintptr_t addr = priv->base + RCC_OCENSETR;
204528c10f9eSGabriel Fernandez
204628c10f9eSGabriel Fernandez if (io_read32(addr) & RCC_OCENSETR_HSEDIV2BYP)
204728c10f9eSGabriel Fernandez return prate;
204828c10f9eSGabriel Fernandez
204928c10f9eSGabriel Fernandez return prate / 2;
205028c10f9eSGabriel Fernandez }
205128c10f9eSGabriel Fernandez
205228c10f9eSGabriel Fernandez static const struct clk_ops clk_hsediv2_ops = {
205328c10f9eSGabriel Fernandez .enable = clk_stm32_hsediv2_enable,
205428c10f9eSGabriel Fernandez .disable = clk_stm32_hsediv2_disable,
205528c10f9eSGabriel Fernandez .get_rate = clk_stm32_hsediv2_get_rate,
205628c10f9eSGabriel Fernandez };
205728c10f9eSGabriel Fernandez
205828c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg {
205928c10f9eSGabriel Fernandez uint32_t pll_offset;
206028c10f9eSGabriel Fernandez int gate_id;
206128c10f9eSGabriel Fernandez int mux_id;
206228c10f9eSGabriel Fernandez };
206328c10f9eSGabriel Fernandez
clk_get_pll1_fvco_rate(unsigned long refclk)206428c10f9eSGabriel Fernandez static unsigned long clk_get_pll1_fvco_rate(unsigned long refclk)
206528c10f9eSGabriel Fernandez {
2066*d8bfc12aSThomas Bourgoin uint32_t reg = stm32mp_syscfg_read(CA35SS_SSC_PLL_FREQ1);
206728c10f9eSGabriel Fernandez uint32_t fbdiv = 0;
206828c10f9eSGabriel Fernandez uint32_t refdiv = 0;
206928c10f9eSGabriel Fernandez unsigned long freq = 0;
207028c10f9eSGabriel Fernandez
2071*d8bfc12aSThomas Bourgoin fbdiv = (reg & CA35SS_SSC_PLL_FREQ1_FBDIV_MASK) >>
2072*d8bfc12aSThomas Bourgoin CA35SS_SSC_PLL_FREQ1_FBDIV_SHIFT;
207328c10f9eSGabriel Fernandez
2074*d8bfc12aSThomas Bourgoin refdiv = (reg & CA35SS_SSC_PLL_FREQ1_REFDIV_MASK) >>
2075*d8bfc12aSThomas Bourgoin CA35SS_SSC_PLL_FREQ1_REFDIV_SHIFT;
207628c10f9eSGabriel Fernandez
207728c10f9eSGabriel Fernandez if (!refdiv || MUL_OVERFLOW(refclk, fbdiv, &freq))
207828c10f9eSGabriel Fernandez panic();
207928c10f9eSGabriel Fernandez
208028c10f9eSGabriel Fernandez return freq / refdiv;
208128c10f9eSGabriel Fernandez }
208228c10f9eSGabriel Fernandez
clk_stm32_pll1_get_rate(struct clk * clk __unused,unsigned long prate)208328c10f9eSGabriel Fernandez static unsigned long clk_stm32_pll1_get_rate(struct clk *clk __unused,
208428c10f9eSGabriel Fernandez unsigned long prate)
208528c10f9eSGabriel Fernandez {
2086*d8bfc12aSThomas Bourgoin uint32_t reg = stm32mp_syscfg_read(CA35SS_SSC_PLL_FREQ2);
208728c10f9eSGabriel Fernandez unsigned long dfout = 0;
208828c10f9eSGabriel Fernandez uint32_t postdiv1 = 0;
208928c10f9eSGabriel Fernandez uint32_t postdiv2 = 0;
209028c10f9eSGabriel Fernandez
2091*d8bfc12aSThomas Bourgoin postdiv1 = (reg & CA35SS_SSC_PLL_FREQ2_POSTDIV1_MASK) >>
2092*d8bfc12aSThomas Bourgoin CA35SS_SSC_PLL_FREQ2_POSTDIV1_SHIFT;
209328c10f9eSGabriel Fernandez
2094*d8bfc12aSThomas Bourgoin postdiv2 = (reg & CA35SS_SSC_PLL_FREQ2_POSTDIV2_MASK) >>
2095*d8bfc12aSThomas Bourgoin CA35SS_SSC_PLL_FREQ2_POSTDIV2_SHIFT;
209628c10f9eSGabriel Fernandez
2097636e1d3cSGabriel Fernandez if (!postdiv1 || !postdiv2)
209828c10f9eSGabriel Fernandez dfout = prate;
209928c10f9eSGabriel Fernandez else
210028c10f9eSGabriel Fernandez dfout = clk_get_pll1_fvco_rate(prate) / (postdiv1 * postdiv2);
210128c10f9eSGabriel Fernandez
210228c10f9eSGabriel Fernandez return dfout;
210328c10f9eSGabriel Fernandez }
210428c10f9eSGabriel Fernandez
210528c10f9eSGabriel Fernandez static struct stm32_clk_opp_cfg *
clk_stm32_get_opp_config(struct stm32_clk_opp_cfg * opp_cfg,unsigned long rate)210628c10f9eSGabriel Fernandez clk_stm32_get_opp_config(struct stm32_clk_opp_cfg *opp_cfg, unsigned long rate)
210728c10f9eSGabriel Fernandez {
210828c10f9eSGabriel Fernandez unsigned int i = 0;
210928c10f9eSGabriel Fernandez
211028c10f9eSGabriel Fernandez for (i = 0; i < MAX_OPP && opp_cfg->frq; i++, opp_cfg++)
211128c10f9eSGabriel Fernandez if (opp_cfg->frq == rate)
211228c10f9eSGabriel Fernandez return opp_cfg;
211328c10f9eSGabriel Fernandez
211428c10f9eSGabriel Fernandez return NULL;
211528c10f9eSGabriel Fernandez }
211628c10f9eSGabriel Fernandez
clk_stm32_pll1_set_rate(struct clk * clk __unused,unsigned long rate,unsigned long parent_rate __unused)211728c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll1_set_rate(struct clk *clk __unused,
211828c10f9eSGabriel Fernandez unsigned long rate,
211928c10f9eSGabriel Fernandez unsigned long parent_rate __unused)
212028c10f9eSGabriel Fernandez {
212128c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv();
212228c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata;
212328c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf = NULL;
212428c10f9eSGabriel Fernandez struct stm32_clk_opp_cfg *opp = NULL;
212528c10f9eSGabriel Fernandez
212628c10f9eSGabriel Fernandez opp = clk_stm32_get_opp_config(pdata->opp->cpu1_opp, rate);
212728c10f9eSGabriel Fernandez if (!opp)
212828c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC;
212928c10f9eSGabriel Fernandez
213028c10f9eSGabriel Fernandez pll_conf = &opp->pll_cfg;
213128c10f9eSGabriel Fernandez
213228c10f9eSGabriel Fernandez clk_stm32_pll1_init(priv, PLL1_ID, pll_conf);
213328c10f9eSGabriel Fernandez
213428c10f9eSGabriel Fernandez return TEE_SUCCESS;
213528c10f9eSGabriel Fernandez }
213628c10f9eSGabriel Fernandez
clk_stm32_pll_get_parent(struct clk * clk)213728c10f9eSGabriel Fernandez static size_t clk_stm32_pll_get_parent(struct clk *clk)
213828c10f9eSGabriel Fernandez {
213928c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv;
214028c10f9eSGabriel Fernandez
214128c10f9eSGabriel Fernandez return stm32_mux_get_parent(cfg->mux_id);
214228c10f9eSGabriel Fernandez }
214328c10f9eSGabriel Fernandez
214428c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll1_ops = {
214528c10f9eSGabriel Fernandez .get_parent = clk_stm32_pll_get_parent,
214628c10f9eSGabriel Fernandez .get_rate = clk_stm32_pll1_get_rate,
214728c10f9eSGabriel Fernandez .set_rate = clk_stm32_pll1_set_rate,
214828c10f9eSGabriel Fernandez };
214928c10f9eSGabriel Fernandez
clk_get_pll_fvco(uint32_t offset_base,unsigned long prate)215028c10f9eSGabriel Fernandez static unsigned long clk_get_pll_fvco(uint32_t offset_base,
215128c10f9eSGabriel Fernandez unsigned long prate)
215228c10f9eSGabriel Fernandez {
215328c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv();
215428c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + offset_base;
215528c10f9eSGabriel Fernandez uintptr_t pllxcfgr2 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR2;
215628c10f9eSGabriel Fernandez uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3;
215728c10f9eSGabriel Fernandez unsigned long fvco = 0;
215828c10f9eSGabriel Fernandez uint32_t fracin = 0;
215928c10f9eSGabriel Fernandez uint32_t fbdiv = 0;
216028c10f9eSGabriel Fernandez uint32_t refdiv = 0;
216128c10f9eSGabriel Fernandez
216228c10f9eSGabriel Fernandez fracin = io_read32(pllxcfgr3) & RCC_PLLxCFGR3_FRACIN_MASK;
216328c10f9eSGabriel Fernandez fbdiv = (io_read32(pllxcfgr2) & RCC_PLLxCFGR2_FBDIV_MASK) >>
216428c10f9eSGabriel Fernandez RCC_PLLxCFGR2_FBDIV_SHIFT;
216528c10f9eSGabriel Fernandez
216628c10f9eSGabriel Fernandez refdiv = io_read32(pllxcfgr2) & RCC_PLLxCFGR2_FREFDIV_MASK;
216728c10f9eSGabriel Fernandez
216828c10f9eSGabriel Fernandez assert(refdiv);
216928c10f9eSGabriel Fernandez
217028c10f9eSGabriel Fernandez if (fracin) {
217128c10f9eSGabriel Fernandez unsigned long long numerator = 0;
217228c10f9eSGabriel Fernandez unsigned long long denominator = 0;
217328c10f9eSGabriel Fernandez
217428c10f9eSGabriel Fernandez numerator = SHIFT_U64(fbdiv, 24) + fracin;
217528c10f9eSGabriel Fernandez numerator = prate * numerator;
217628c10f9eSGabriel Fernandez denominator = SHIFT_U64(refdiv, 24);
217728c10f9eSGabriel Fernandez fvco = (unsigned long)(numerator / denominator);
217828c10f9eSGabriel Fernandez } else {
217928c10f9eSGabriel Fernandez fvco = (unsigned long)(prate * fbdiv / refdiv);
218028c10f9eSGabriel Fernandez }
218128c10f9eSGabriel Fernandez
218228c10f9eSGabriel Fernandez return fvco;
218328c10f9eSGabriel Fernandez }
218428c10f9eSGabriel Fernandez
clk_stm32_pll_get_rate(struct clk * clk __unused,unsigned long prate)218528c10f9eSGabriel Fernandez static unsigned long clk_stm32_pll_get_rate(struct clk *clk __unused,
218628c10f9eSGabriel Fernandez unsigned long prate)
218728c10f9eSGabriel Fernandez {
218828c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv();
218928c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv;
219028c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + cfg->pll_offset;
219128c10f9eSGabriel Fernandez uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4;
219228c10f9eSGabriel Fernandez uintptr_t pllxcfgr6 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR6;
219328c10f9eSGabriel Fernandez uintptr_t pllxcfgr7 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR7;
219428c10f9eSGabriel Fernandez unsigned long dfout = 0;
219528c10f9eSGabriel Fernandez uint32_t postdiv1 = 0;
219628c10f9eSGabriel Fernandez uint32_t postdiv2 = 0;
219728c10f9eSGabriel Fernandez
219828c10f9eSGabriel Fernandez postdiv1 = io_read32(pllxcfgr6) & RCC_PLLxCFGR6_POSTDIV1_MASK;
219928c10f9eSGabriel Fernandez postdiv2 = io_read32(pllxcfgr7) & RCC_PLLxCFGR7_POSTDIV2_MASK;
220028c10f9eSGabriel Fernandez
220128c10f9eSGabriel Fernandez if ((io_read32(pllxcfgr4) & RCC_PLLxCFGR4_BYPASS) ||
220228c10f9eSGabriel Fernandez !postdiv1 || !postdiv2)
220328c10f9eSGabriel Fernandez dfout = prate;
220428c10f9eSGabriel Fernandez else
220528c10f9eSGabriel Fernandez dfout = clk_get_pll_fvco(cfg->pll_offset,
220628c10f9eSGabriel Fernandez prate) / (postdiv1 * postdiv2);
220728c10f9eSGabriel Fernandez
220828c10f9eSGabriel Fernandez return dfout;
220928c10f9eSGabriel Fernandez }
221028c10f9eSGabriel Fernandez
clk_stm32_pll_enable(struct clk * clk)221128c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll_enable(struct clk *clk)
221228c10f9eSGabriel Fernandez {
221328c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv;
221428c10f9eSGabriel Fernandez
221528c10f9eSGabriel Fernandez if (stm32_gate_rdy_enable(cfg->gate_id)) {
221628c10f9eSGabriel Fernandez EMSG("%s timeout", clk_get_name(clk));
221728c10f9eSGabriel Fernandez return TEE_ERROR_TIMEOUT;
221828c10f9eSGabriel Fernandez }
221928c10f9eSGabriel Fernandez
222028c10f9eSGabriel Fernandez return TEE_SUCCESS;
222128c10f9eSGabriel Fernandez }
222228c10f9eSGabriel Fernandez
clk_stm32_pll_disable(struct clk * clk)222328c10f9eSGabriel Fernandez static void clk_stm32_pll_disable(struct clk *clk)
222428c10f9eSGabriel Fernandez {
222528c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv;
222628c10f9eSGabriel Fernandez
222728c10f9eSGabriel Fernandez if (stm32_gate_rdy_disable(cfg->gate_id)) {
222828c10f9eSGabriel Fernandez EMSG("%s timeout", clk_get_name(clk));
222928c10f9eSGabriel Fernandez panic();
223028c10f9eSGabriel Fernandez }
223128c10f9eSGabriel Fernandez }
223228c10f9eSGabriel Fernandez
223328c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll_ops = {
223428c10f9eSGabriel Fernandez .get_parent = clk_stm32_pll_get_parent,
223528c10f9eSGabriel Fernandez .get_rate = clk_stm32_pll_get_rate,
223628c10f9eSGabriel Fernandez .enable = clk_stm32_pll_enable,
223728c10f9eSGabriel Fernandez .disable = clk_stm32_pll_disable,
223828c10f9eSGabriel Fernandez };
223928c10f9eSGabriel Fernandez
clk_stm32_pll3_enable(struct clk * clk)224028c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll3_enable(struct clk *clk)
224128c10f9eSGabriel Fernandez {
224228c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv;
224328c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv();
224428c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf = clk_stm32_pll_get_pdata(PLL3_ID);
224528c10f9eSGabriel Fernandez struct clk *parent = NULL;
224628c10f9eSGabriel Fernandez size_t pidx = 0;
224728c10f9eSGabriel Fernandez
224828c10f9eSGabriel Fernandez /* ck_icn_p_gpu activate */
224928c10f9eSGabriel Fernandez stm32_gate_enable(GATE_GPU);
225028c10f9eSGabriel Fernandez
225128c10f9eSGabriel Fernandez clk_stm32_pll_init(priv, PLL3_ID, pll_conf);
225228c10f9eSGabriel Fernandez
225328c10f9eSGabriel Fernandez if (stm32_gate_rdy_enable(cfg->gate_id)) {
225428c10f9eSGabriel Fernandez EMSG("%s timeout", clk_get_name(clk));
225528c10f9eSGabriel Fernandez return TEE_ERROR_TIMEOUT;
225628c10f9eSGabriel Fernandez }
225728c10f9eSGabriel Fernandez
225828c10f9eSGabriel Fernandez /* Update parent */
225928c10f9eSGabriel Fernandez pidx = clk_stm32_pll_get_parent(clk);
226028c10f9eSGabriel Fernandez parent = clk_get_parent_by_index(clk, pidx);
226128c10f9eSGabriel Fernandez
226228c10f9eSGabriel Fernandez clk->parent = parent;
226328c10f9eSGabriel Fernandez
226428c10f9eSGabriel Fernandez return TEE_SUCCESS;
226528c10f9eSGabriel Fernandez }
226628c10f9eSGabriel Fernandez
clk_stm32_pll3_disable(struct clk * clk)226728c10f9eSGabriel Fernandez static void clk_stm32_pll3_disable(struct clk *clk)
226828c10f9eSGabriel Fernandez {
226928c10f9eSGabriel Fernandez clk_stm32_pll_disable(clk);
227028c10f9eSGabriel Fernandez stm32_gate_disable(GATE_GPU);
227128c10f9eSGabriel Fernandez }
227228c10f9eSGabriel Fernandez
227328c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll3_ops = {
227428c10f9eSGabriel Fernandez .get_parent = clk_stm32_pll_get_parent,
227528c10f9eSGabriel Fernandez .get_rate = clk_stm32_pll_get_rate,
227628c10f9eSGabriel Fernandez .enable = clk_stm32_pll3_enable,
227728c10f9eSGabriel Fernandez .disable = clk_stm32_pll3_disable,
227828c10f9eSGabriel Fernandez };
227928c10f9eSGabriel Fernandez
228028c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg {
228128c10f9eSGabriel Fernandez int flex_id;
228228c10f9eSGabriel Fernandez };
228328c10f9eSGabriel Fernandez
clk_stm32_flexgen_get_parent(struct clk * clk)228428c10f9eSGabriel Fernandez static size_t clk_stm32_flexgen_get_parent(struct clk *clk)
228528c10f9eSGabriel Fernandez {
228628c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv;
228728c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base();
228828c10f9eSGabriel Fernandez uint32_t address = 0;
228928c10f9eSGabriel Fernandez
229028c10f9eSGabriel Fernandez address = rcc_base + RCC_XBAR0CFGR + (cfg->flex_id * 4);
229128c10f9eSGabriel Fernandez
229228c10f9eSGabriel Fernandez return io_read32(address) & RCC_XBAR0CFGR_XBAR0SEL_MASK;
229328c10f9eSGabriel Fernandez }
229428c10f9eSGabriel Fernandez
clk_stm32_flexgen_set_parent(struct clk * clk,size_t pidx)229528c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_set_parent(struct clk *clk, size_t pidx)
229628c10f9eSGabriel Fernandez {
229728c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base();
229828c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv;
229928c10f9eSGabriel Fernandez uint16_t channel = cfg->flex_id * 4;
230028c10f9eSGabriel Fernandez
230128c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_XBAR0CFGR + (channel),
230228c10f9eSGabriel Fernandez RCC_XBAR0CFGR_XBAR0SEL_MASK, pidx);
230328c10f9eSGabriel Fernandez
230428c10f9eSGabriel Fernandez if (wait_xbar_sts(channel))
230528c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC;
230628c10f9eSGabriel Fernandez
230728c10f9eSGabriel Fernandez return TEE_SUCCESS;
230828c10f9eSGabriel Fernandez }
230928c10f9eSGabriel Fernandez
clk_stm32_flexgen_get_rate(struct clk * clk,unsigned long prate)2310636e1d3cSGabriel Fernandez static unsigned long clk_stm32_flexgen_get_rate(struct clk *clk,
231128c10f9eSGabriel Fernandez unsigned long prate)
231228c10f9eSGabriel Fernandez {
231328c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv;
231428c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base();
231528c10f9eSGabriel Fernandez uint32_t prediv = 0;
231628c10f9eSGabriel Fernandez uint32_t findiv = 0;
231728c10f9eSGabriel Fernandez uint8_t channel = cfg->flex_id;
231828c10f9eSGabriel Fernandez unsigned long freq = prate;
231928c10f9eSGabriel Fernandez
232028c10f9eSGabriel Fernandez prediv = io_read32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel)) &
232128c10f9eSGabriel Fernandez RCC_PREDIV0CFGR_PREDIV0_MASK;
232228c10f9eSGabriel Fernandez findiv = io_read32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel)) &
232328c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0_MASK;
232428c10f9eSGabriel Fernandez
2325636e1d3cSGabriel Fernandez if (!freq)
232628c10f9eSGabriel Fernandez return 0;
232728c10f9eSGabriel Fernandez
232828c10f9eSGabriel Fernandez switch (prediv) {
232928c10f9eSGabriel Fernandez case 0x0:
233028c10f9eSGabriel Fernandez break;
233128c10f9eSGabriel Fernandez
233228c10f9eSGabriel Fernandez case 0x1:
233328c10f9eSGabriel Fernandez freq /= 2;
233428c10f9eSGabriel Fernandez break;
233528c10f9eSGabriel Fernandez
233628c10f9eSGabriel Fernandez case 0x3:
233728c10f9eSGabriel Fernandez freq /= 4;
233828c10f9eSGabriel Fernandez break;
233928c10f9eSGabriel Fernandez
234028c10f9eSGabriel Fernandez case 0x3FF:
234128c10f9eSGabriel Fernandez freq /= 1024;
234228c10f9eSGabriel Fernandez break;
234328c10f9eSGabriel Fernandez
234428c10f9eSGabriel Fernandez default:
234528c10f9eSGabriel Fernandez EMSG("Unsupported PREDIV value (%#"PRIx32")", prediv);
234628c10f9eSGabriel Fernandez panic();
234728c10f9eSGabriel Fernandez break;
234828c10f9eSGabriel Fernandez }
234928c10f9eSGabriel Fernandez
235028c10f9eSGabriel Fernandez freq /= findiv + 1;
235128c10f9eSGabriel Fernandez
235228c10f9eSGabriel Fernandez return freq;
235328c10f9eSGabriel Fernandez }
235428c10f9eSGabriel Fernandez
clk_stm32_flexgen_get_round_rate(unsigned long rate,unsigned long prate,unsigned int * prediv,unsigned int * findiv)235528c10f9eSGabriel Fernandez static unsigned long clk_stm32_flexgen_get_round_rate(unsigned long rate,
235628c10f9eSGabriel Fernandez unsigned long prate,
235728c10f9eSGabriel Fernandez unsigned int *prediv,
235828c10f9eSGabriel Fernandez unsigned int *findiv)
235928c10f9eSGabriel Fernandez {
236028c10f9eSGabriel Fernandez unsigned int pre_val[] = { 0x0, 0x1, 0x3, 0x3FF };
236128c10f9eSGabriel Fernandez unsigned int pre_div[] = { 1, 2, 4, 1024 };
236228c10f9eSGabriel Fernandez long best_diff = LONG_MAX;
236328c10f9eSGabriel Fernandez unsigned int i = 0;
236428c10f9eSGabriel Fernandez
236528c10f9eSGabriel Fernandez *prediv = 0;
236628c10f9eSGabriel Fernandez *findiv = 0;
236728c10f9eSGabriel Fernandez
236828c10f9eSGabriel Fernandez for (i = 0; i < ARRAY_SIZE(pre_div); i++) {
236928c10f9eSGabriel Fernandez unsigned long freq = 0;
237028c10f9eSGabriel Fernandez unsigned long ratio = 0;
237128c10f9eSGabriel Fernandez long diff = 0L;
237228c10f9eSGabriel Fernandez
237328c10f9eSGabriel Fernandez freq = UDIV_ROUND_NEAREST((uint64_t)prate, pre_div[i]);
237428c10f9eSGabriel Fernandez ratio = UDIV_ROUND_NEAREST((uint64_t)freq, rate);
237528c10f9eSGabriel Fernandez
2376636e1d3cSGabriel Fernandez if (!ratio)
237728c10f9eSGabriel Fernandez ratio = 1;
237828c10f9eSGabriel Fernandez else if (ratio > 64)
237928c10f9eSGabriel Fernandez ratio = 64;
238028c10f9eSGabriel Fernandez
238128c10f9eSGabriel Fernandez freq = UDIV_ROUND_NEAREST((uint64_t)freq, ratio);
238228c10f9eSGabriel Fernandez if (freq < rate)
238328c10f9eSGabriel Fernandez diff = rate - freq;
238428c10f9eSGabriel Fernandez else
238528c10f9eSGabriel Fernandez diff = freq - rate;
238628c10f9eSGabriel Fernandez
238728c10f9eSGabriel Fernandez if (diff < best_diff) {
238828c10f9eSGabriel Fernandez best_diff = diff;
238928c10f9eSGabriel Fernandez *prediv = pre_val[i];
239028c10f9eSGabriel Fernandez *findiv = ratio - 1;
239128c10f9eSGabriel Fernandez
2392636e1d3cSGabriel Fernandez if (!diff)
239328c10f9eSGabriel Fernandez break;
239428c10f9eSGabriel Fernandez }
239528c10f9eSGabriel Fernandez }
239628c10f9eSGabriel Fernandez
239728c10f9eSGabriel Fernandez return (prate / (*prediv + 1)) / (*findiv + 1);
239828c10f9eSGabriel Fernandez }
239928c10f9eSGabriel Fernandez
clk_stm32_flexgen_set_rate(struct clk * clk,unsigned long rate,unsigned long parent_rate)240028c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_set_rate(struct clk *clk,
240128c10f9eSGabriel Fernandez unsigned long rate,
240228c10f9eSGabriel Fernandez unsigned long parent_rate)
240328c10f9eSGabriel Fernandez {
240428c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv;
240528c10f9eSGabriel Fernandez uint8_t channel = cfg->flex_id;
240628c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base();
240728c10f9eSGabriel Fernandez unsigned int prediv = 0;
240828c10f9eSGabriel Fernandez unsigned int findiv = 0;
240928c10f9eSGabriel Fernandez
241028c10f9eSGabriel Fernandez clk_stm32_flexgen_get_round_rate(rate, parent_rate, &prediv, &findiv);
241128c10f9eSGabriel Fernandez
2412636e1d3cSGabriel Fernandez if (wait_predivsr(channel))
241328c10f9eSGabriel Fernandez panic();
241428c10f9eSGabriel Fernandez
241528c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel),
241628c10f9eSGabriel Fernandez RCC_PREDIV0CFGR_PREDIV0_MASK,
241728c10f9eSGabriel Fernandez prediv);
241828c10f9eSGabriel Fernandez
2419636e1d3cSGabriel Fernandez if (wait_predivsr(channel))
242028c10f9eSGabriel Fernandez panic();
242128c10f9eSGabriel Fernandez
2422636e1d3cSGabriel Fernandez if (wait_findivsr(channel))
242328c10f9eSGabriel Fernandez panic();
242428c10f9eSGabriel Fernandez
242528c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel),
242628c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0_MASK,
242728c10f9eSGabriel Fernandez findiv);
242828c10f9eSGabriel Fernandez
2429636e1d3cSGabriel Fernandez if (wait_findivsr(channel))
243028c10f9eSGabriel Fernandez panic();
243128c10f9eSGabriel Fernandez
243228c10f9eSGabriel Fernandez return TEE_SUCCESS;
243328c10f9eSGabriel Fernandez }
243428c10f9eSGabriel Fernandez
clk_stm32_flexgen_enable(struct clk * clk)243528c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_enable(struct clk *clk)
243628c10f9eSGabriel Fernandez {
243728c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv;
243828c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base();
24391f2e0a3fSGatien Chevallier TEE_Result ret = TEE_ERROR_GENERIC;
244028c10f9eSGabriel Fernandez uint8_t channel = cfg->flex_id;
244128c10f9eSGabriel Fernandez
24421f2e0a3fSGatien Chevallier /*
24431f2e0a3fSGatien Chevallier * Configure flexgen of STGEN since it has been skipped during
24441f2e0a3fSGatien Chevallier * flexgen configuration.
24451f2e0a3fSGatien Chevallier */
24461f2e0a3fSGatien Chevallier if (channel == FLEX_STGEN) {
24471f2e0a3fSGatien Chevallier unsigned int clk_src = U(0);
24481f2e0a3fSGatien Chevallier unsigned int pdiv = U(0);
24491f2e0a3fSGatien Chevallier unsigned int fdiv = U(0);
24501f2e0a3fSGatien Chevallier
24511f2e0a3fSGatien Chevallier ret = flexclkgen_search_config(channel, &clk_src, &pdiv, &fdiv);
24521f2e0a3fSGatien Chevallier if (ret) {
24531f2e0a3fSGatien Chevallier EMSG("Error %#"PRIx32" when getting STGEN flexgen conf",
24541f2e0a3fSGatien Chevallier ret);
24551f2e0a3fSGatien Chevallier return ret;
24561f2e0a3fSGatien Chevallier }
24571f2e0a3fSGatien Chevallier
24581f2e0a3fSGatien Chevallier flexclkgen_config_channel(channel, clk_src, pdiv, fdiv);
24591f2e0a3fSGatien Chevallier
24601f2e0a3fSGatien Chevallier /* Update parent */
24611f2e0a3fSGatien Chevallier clk->parent = clk_get_parent_by_index(clk, clk_src);
24621f2e0a3fSGatien Chevallier }
24631f2e0a3fSGatien Chevallier
246428c10f9eSGabriel Fernandez io_setbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel),
246528c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0EN);
246628c10f9eSGabriel Fernandez
246728c10f9eSGabriel Fernandez return TEE_SUCCESS;
246828c10f9eSGabriel Fernandez }
246928c10f9eSGabriel Fernandez
clk_stm32_flexgen_disable(struct clk * clk)247028c10f9eSGabriel Fernandez static void clk_stm32_flexgen_disable(struct clk *clk)
247128c10f9eSGabriel Fernandez {
247228c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv;
247328c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base();
247428c10f9eSGabriel Fernandez uint8_t channel = cfg->flex_id;
247528c10f9eSGabriel Fernandez
247628c10f9eSGabriel Fernandez io_clrbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel),
247728c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0EN);
247828c10f9eSGabriel Fernandez }
247928c10f9eSGabriel Fernandez
248028c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_flexgen_ops = {
248128c10f9eSGabriel Fernandez .get_rate = clk_stm32_flexgen_get_rate,
248228c10f9eSGabriel Fernandez .set_rate = clk_stm32_flexgen_set_rate,
248328c10f9eSGabriel Fernandez .get_parent = clk_stm32_flexgen_get_parent,
248428c10f9eSGabriel Fernandez .set_parent = clk_stm32_flexgen_set_parent,
248528c10f9eSGabriel Fernandez .enable = clk_stm32_flexgen_enable,
248628c10f9eSGabriel Fernandez .disable = clk_stm32_flexgen_disable,
248728c10f9eSGabriel Fernandez };
248828c10f9eSGabriel Fernandez
clk_cpu1_get_parent(struct clk * clk __unused)248928c10f9eSGabriel Fernandez static size_t clk_cpu1_get_parent(struct clk *clk __unused)
249028c10f9eSGabriel Fernandez {
2491*d8bfc12aSThomas Bourgoin uint32_t reg = stm32mp_syscfg_read(CA35SS_SSC_CHGCLKREQ);
249228c10f9eSGabriel Fernandez
2493*d8bfc12aSThomas Bourgoin return (reg & CA35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) >>
2494*d8bfc12aSThomas Bourgoin CA35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_SHIFT;
249528c10f9eSGabriel Fernandez }
249628c10f9eSGabriel Fernandez
249728c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_cpu1_ops = {
249828c10f9eSGabriel Fernandez .get_parent = clk_cpu1_get_parent,
249928c10f9eSGabriel Fernandez };
250028c10f9eSGabriel Fernandez
250128c10f9eSGabriel Fernandez #define APB_DIV_MASK GENMASK_32(2, 0)
250228c10f9eSGabriel Fernandez #define TIM_PRE_MASK BIT(0)
250328c10f9eSGabriel Fernandez
ck_timer_get_rate_ops(struct clk * clk,unsigned long prate)250428c10f9eSGabriel Fernandez static unsigned long ck_timer_get_rate_ops(struct clk *clk, unsigned long prate)
250528c10f9eSGabriel Fernandez {
250628c10f9eSGabriel Fernandez struct clk_stm32_timer_cfg *cfg = clk->priv;
250728c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base();
250828c10f9eSGabriel Fernandez uint32_t prescaler = 0;
250928c10f9eSGabriel Fernandez uint32_t timpre = 0;
251028c10f9eSGabriel Fernandez
251128c10f9eSGabriel Fernandez prescaler = io_read32(rcc_base + cfg->apbdiv) & APB_DIV_MASK;
251228c10f9eSGabriel Fernandez
251328c10f9eSGabriel Fernandez timpre = io_read32(rcc_base + cfg->timpre) & TIM_PRE_MASK;
251428c10f9eSGabriel Fernandez
2515636e1d3cSGabriel Fernandez if (!prescaler)
251628c10f9eSGabriel Fernandez return prate;
251728c10f9eSGabriel Fernandez
251828c10f9eSGabriel Fernandez return prate * (timpre + 1) * 2;
251928c10f9eSGabriel Fernandez };
252028c10f9eSGabriel Fernandez
252128c10f9eSGabriel Fernandez static const struct clk_ops ck_timer_ops = {
252228c10f9eSGabriel Fernandez .get_rate = ck_timer_get_rate_ops,
252328c10f9eSGabriel Fernandez };
252428c10f9eSGabriel Fernandez
252528c10f9eSGabriel Fernandez #define PLL_PARENTS { &ck_hsi, &ck_hse, &ck_msi }
252628c10f9eSGabriel Fernandez #define PLL_NUM_PATENTS 3
252728c10f9eSGabriel Fernandez
252828c10f9eSGabriel Fernandez #define STM32_OSC(_name, _flags, _gate_id)\
252928c10f9eSGabriel Fernandez struct clk _name = {\
253028c10f9eSGabriel Fernandez .ops = &clk_stm32_osc_ops,\
253128c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_gate_cfg){\
253228c10f9eSGabriel Fernandez .gate_id = (_gate_id),\
253328c10f9eSGabriel Fernandez },\
253428c10f9eSGabriel Fernandez .name = #_name,\
253528c10f9eSGabriel Fernandez .flags = (_flags),\
253628c10f9eSGabriel Fernandez .num_parents = 1,\
253728c10f9eSGabriel Fernandez .parents = { NULL },\
253828c10f9eSGabriel Fernandez }
253928c10f9eSGabriel Fernandez
254028c10f9eSGabriel Fernandez #define STM32_OSC_MSI(_name, _flags, _gate_id)\
254128c10f9eSGabriel Fernandez struct clk _name = {\
254228c10f9eSGabriel Fernandez .ops = &clk_stm32_oscillator_msi_ops,\
254328c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_gate_cfg){\
254428c10f9eSGabriel Fernandez .gate_id = (_gate_id),\
254528c10f9eSGabriel Fernandez },\
254628c10f9eSGabriel Fernandez .name = #_name,\
254728c10f9eSGabriel Fernandez .flags = (_flags),\
254828c10f9eSGabriel Fernandez .num_parents = 1,\
254928c10f9eSGabriel Fernandez .parents = { NULL },\
255028c10f9eSGabriel Fernandez }
255128c10f9eSGabriel Fernandez
255228c10f9eSGabriel Fernandez #define STM32_HSE_DIV2(_name, _parent, _flags, _gate_id)\
255328c10f9eSGabriel Fernandez struct clk _name = {\
255428c10f9eSGabriel Fernandez .ops = &clk_hsediv2_ops,\
255528c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_gate_cfg){\
255628c10f9eSGabriel Fernandez .gate_id = (_gate_id),\
255728c10f9eSGabriel Fernandez },\
255828c10f9eSGabriel Fernandez .name = #_name,\
255928c10f9eSGabriel Fernandez .flags = (_flags),\
256028c10f9eSGabriel Fernandez .num_parents = 1,\
256128c10f9eSGabriel Fernandez .parents = { (_parent) },\
256228c10f9eSGabriel Fernandez }
256328c10f9eSGabriel Fernandez
256428c10f9eSGabriel Fernandez #define STM32_HSE_RTC(_name, _parent, _flags, _div_id)\
256528c10f9eSGabriel Fernandez struct clk _name = {\
256628c10f9eSGabriel Fernandez .ops = &clk_stm32_hse_div_ops,\
256728c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_div_cfg){\
256828c10f9eSGabriel Fernandez .div_id = (_div_id),\
256928c10f9eSGabriel Fernandez },\
257028c10f9eSGabriel Fernandez .name = #_name,\
257128c10f9eSGabriel Fernandez .flags = (_flags),\
257228c10f9eSGabriel Fernandez .num_parents = 1,\
257328c10f9eSGabriel Fernandez .parents = { (_parent) },\
257428c10f9eSGabriel Fernandez }
257528c10f9eSGabriel Fernandez
257628c10f9eSGabriel Fernandez #define STM32_PLL1(_name, _flags, _mux_id)\
257728c10f9eSGabriel Fernandez struct clk _name = {\
257828c10f9eSGabriel Fernandez .ops = &clk_stm32_pll1_ops,\
257928c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_pll_cfg){\
258028c10f9eSGabriel Fernandez .mux_id = (_mux_id),\
258128c10f9eSGabriel Fernandez },\
258228c10f9eSGabriel Fernandez .name = #_name,\
258328c10f9eSGabriel Fernandez .flags = (_flags),\
258428c10f9eSGabriel Fernandez .num_parents = PLL_NUM_PATENTS,\
258528c10f9eSGabriel Fernandez .parents = PLL_PARENTS,\
258628c10f9eSGabriel Fernandez }
258728c10f9eSGabriel Fernandez
258828c10f9eSGabriel Fernandez #define STM32_PLL2(_name, _flags, _reg, _gate_id, _mux_id)\
258928c10f9eSGabriel Fernandez struct clk _name = {\
259028c10f9eSGabriel Fernandez .ops = &clk_stm32_pll_ops,\
259128c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_pll_cfg){\
259228c10f9eSGabriel Fernandez .pll_offset = (_reg),\
259328c10f9eSGabriel Fernandez .gate_id = (_gate_id),\
259428c10f9eSGabriel Fernandez .mux_id = (_mux_id),\
259528c10f9eSGabriel Fernandez },\
259628c10f9eSGabriel Fernandez .name = #_name,\
259728c10f9eSGabriel Fernandez .flags = (_flags),\
259828c10f9eSGabriel Fernandez .num_parents = PLL_NUM_PATENTS,\
259928c10f9eSGabriel Fernandez .parents = PLL_PARENTS,\
260028c10f9eSGabriel Fernandez }
260128c10f9eSGabriel Fernandez
260228c10f9eSGabriel Fernandez #define STM32_PLL3(_name, _flags, _reg, _gate_id, _mux_id)\
260328c10f9eSGabriel Fernandez struct clk _name = {\
260428c10f9eSGabriel Fernandez .ops = &clk_stm32_pll3_ops,\
260528c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_pll_cfg){\
260628c10f9eSGabriel Fernandez .pll_offset = (_reg),\
260728c10f9eSGabriel Fernandez .gate_id = (_gate_id),\
260828c10f9eSGabriel Fernandez .mux_id = (_mux_id),\
260928c10f9eSGabriel Fernandez },\
261028c10f9eSGabriel Fernandez .name = #_name,\
261128c10f9eSGabriel Fernandez .flags = (_flags),\
261228c10f9eSGabriel Fernandez .num_parents = PLL_NUM_PATENTS,\
261328c10f9eSGabriel Fernandez .parents = PLL_PARENTS,\
261428c10f9eSGabriel Fernandez }
261528c10f9eSGabriel Fernandez
261628c10f9eSGabriel Fernandez #define STM32_PLLS(_name, _flags, _reg, _gate_id, _mux_id)\
261728c10f9eSGabriel Fernandez struct clk _name = {\
261828c10f9eSGabriel Fernandez .ops = &clk_stm32_pll_ops,\
261928c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_pll_cfg){\
262028c10f9eSGabriel Fernandez .pll_offset = (_reg),\
262128c10f9eSGabriel Fernandez .gate_id = (_gate_id),\
262228c10f9eSGabriel Fernandez .mux_id = (_mux_id),\
262328c10f9eSGabriel Fernandez },\
262428c10f9eSGabriel Fernandez .name = #_name,\
262528c10f9eSGabriel Fernandez .flags = (_flags),\
262628c10f9eSGabriel Fernandez .num_parents = PLL_NUM_PATENTS,\
262728c10f9eSGabriel Fernandez .parents = PLL_PARENTS,\
262828c10f9eSGabriel Fernandez }
262928c10f9eSGabriel Fernandez
263028c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_off, RCC_0_MHZ);
263128c10f9eSGabriel Fernandez
263228c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_obser0, 0);
263328c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_obser1, 0);
263428c10f9eSGabriel Fernandez static STM32_FIXED_RATE(spdifsymb, 0);
263528c10f9eSGabriel Fernandez static STM32_FIXED_RATE(txbyteclk, 27000000);
263628c10f9eSGabriel Fernandez
263728c10f9eSGabriel Fernandez /* Oscillator clocks */
263828c10f9eSGabriel Fernandez static STM32_OSC(ck_hsi, 0, GATE_HSI);
263928c10f9eSGabriel Fernandez static STM32_OSC(ck_hse, 0, GATE_HSE);
264028c10f9eSGabriel Fernandez static STM32_OSC_MSI(ck_msi, 0, GATE_MSI);
264128c10f9eSGabriel Fernandez static STM32_OSC(ck_lsi, 0, GATE_LSI);
264228c10f9eSGabriel Fernandez static STM32_OSC(ck_lse, 0, GATE_LSE);
264328c10f9eSGabriel Fernandez
264428c10f9eSGabriel Fernandez static STM32_HSE_DIV2(ck_hse_div2, &ck_hse, 0, GATE_HSEDIV2);
264528c10f9eSGabriel Fernandez static STM32_HSE_RTC(ck_hse_rtc, &ck_hse, 0, DIV_RTC);
264628c10f9eSGabriel Fernandez
264728c10f9eSGabriel Fernandez static STM32_FIXED_FACTOR(i2sckin, NULL, 0, 1, 1);
264828c10f9eSGabriel Fernandez
264928c10f9eSGabriel Fernandez static STM32_PLL1(ck_pll1, 0, MUX_MUXSEL5);
265028c10f9eSGabriel Fernandez static STM32_PLL2(ck_pll2, 0, RCC_PLL2CFGR1, GATE_PLL2, MUX_MUXSEL6);
265128c10f9eSGabriel Fernandez static STM32_PLL3(ck_pll3, 0, RCC_PLL3CFGR1, GATE_PLL3, MUX_MUXSEL7);
265228c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll4, 0, RCC_PLL4CFGR1, GATE_PLL4, MUX_MUXSEL0);
265328c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll5, 0, RCC_PLL5CFGR1, GATE_PLL5, MUX_MUXSEL1);
265428c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll6, 0, RCC_PLL6CFGR1, GATE_PLL6, MUX_MUXSEL2);
265528c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll7, 0, RCC_PLL7CFGR1, GATE_PLL7, MUX_MUXSEL3);
265628c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll8, 0, RCC_PLL8CFGR1, GATE_PLL8, MUX_MUXSEL4);
265728c10f9eSGabriel Fernandez
265828c10f9eSGabriel Fernandez #define STM32_FLEXGEN(_name, _flags, _flex_id)\
265928c10f9eSGabriel Fernandez struct clk _name = {\
266028c10f9eSGabriel Fernandez .ops = &clk_stm32_flexgen_ops,\
266128c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_flexgen_cfg){\
266228c10f9eSGabriel Fernandez .flex_id = (_flex_id),\
266328c10f9eSGabriel Fernandez },\
266428c10f9eSGabriel Fernandez .name = #_name,\
266528c10f9eSGabriel Fernandez .flags = (_flags) | CLK_SET_RATE_UNGATE,\
266628c10f9eSGabriel Fernandez .num_parents = 15,\
266728c10f9eSGabriel Fernandez .parents = {\
266828c10f9eSGabriel Fernandez &ck_pll4, &ck_pll5, &ck_pll6, &ck_pll7, &ck_pll8,\
266928c10f9eSGabriel Fernandez &ck_hsi, &ck_hse, &ck_msi, &ck_hsi, &ck_hse, &ck_msi,\
267028c10f9eSGabriel Fernandez &spdifsymb, &i2sckin, &ck_lsi, &ck_lse\
267128c10f9eSGabriel Fernandez },\
267228c10f9eSGabriel Fernandez }
267328c10f9eSGabriel Fernandez
267428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_hs_mcu, 0, 0);
267528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_sdmmc, 0, 1);
267628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_ddr, 0, 2);
267728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_display, 0, 3);
267828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_hsl, 0, 4);
267928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_nic, 0, 5);
268028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_vid, 0, 6);
268128c10f9eSGabriel Fernandez
268228c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_ls_mcu, &ck_icn_hs_mcu, 0, DIV_LSMCU);
268328c10f9eSGabriel Fernandez
268428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_07, 0, 7);
268528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_08, 0, 8);
268628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_09, 0, 9);
268728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_10, 0, 10);
268828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_11, 0, 11);
268928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_12, 0, 12);
269028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_13, 0, 13);
269128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_14, 0, 14);
269228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_15, 0, 15);
269328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_16, 0, 16);
269428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_17, 0, 17);
269528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_18, 0, 18);
269628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_19, 0, 19);
269728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_20, 0, 20);
269828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_21, 0, 21);
269928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_22, 0, 22);
270028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_23, 0, 23);
270128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_24, 0, 24);
270228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_25, 0, 25);
270328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_26, 0, 26);
270428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_27, 0, 27);
270528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_28, 0, 28);
270628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_29, 0, 29);
270728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_30, 0, 30);
270828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_31, 0, 31);
270928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_32, 0, 32);
271028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_33, 0, 33);
271128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_34, 0, 34);
271228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_35, 0, 35);
271328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_36, 0, 36);
271428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_37, 0, 37);
271528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_38, 0, 38);
271628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_39, 0, 39);
271728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_40, 0, 40);
271828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_41, 0, 41);
271928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_42, 0, 42);
272028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_43, 0, 43);
272128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_44, 0, 44);
272228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_45, 0, 45);
272328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_46, 0, 46);
272428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_47, 0, 47);
272528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_48, 0, 48);
272628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_49, 0, 49);
272728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_50, 0, 50);
272828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_51, 0, 51);
272928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_52, 0, 52);
273028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_53, 0, 53);
273128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_54, 0, 54);
273228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_55, 0, 55);
273328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_56, 0, 56);
273428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_57, 0, 57);
273528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_58, 0, 58);
273628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_59, 0, 59);
273728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_60, 0, 60);
273828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_61, 0, 61);
273928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_62, 0, 62);
274028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_63, 0, 63);
274128c10f9eSGabriel Fernandez
274228c10f9eSGabriel Fernandez static struct clk ck_cpu1 = {
274328c10f9eSGabriel Fernandez .ops = &clk_stm32_cpu1_ops,
274428c10f9eSGabriel Fernandez .name = "ck_cpu1",
274528c10f9eSGabriel Fernandez .flags = CLK_SET_RATE_PARENT,
274628c10f9eSGabriel Fernandez .num_parents = 2,
274728c10f9eSGabriel Fernandez .parents = { &ck_pll1, &ck_flexgen_63 },
274828c10f9eSGabriel Fernandez };
274928c10f9eSGabriel Fernandez
275028c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb1, &ck_icn_ls_mcu, 0, DIV_APB1);
275128c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb2, &ck_icn_ls_mcu, 0, DIV_APB2);
275228c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb3, &ck_icn_ls_mcu, 0, DIV_APB3);
275328c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb4, &ck_icn_ls_mcu, 0, DIV_APB4);
275428c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_icn_apbdbg, 1, { &ck_icn_ls_mcu }, 0,
275528c10f9eSGabriel Fernandez GATE_DBG, DIV_APBDBG, NO_MUX);
275628c10f9eSGabriel Fernandez
275728c10f9eSGabriel Fernandez #define STM32_TIMER(_name, _parent, _flags, _apbdiv, _timpre)\
275828c10f9eSGabriel Fernandez struct clk _name = {\
275928c10f9eSGabriel Fernandez .ops = &ck_timer_ops,\
276028c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_timer_cfg){\
276128c10f9eSGabriel Fernandez .apbdiv = (_apbdiv),\
276228c10f9eSGabriel Fernandez .timpre = (_timpre),\
276328c10f9eSGabriel Fernandez },\
276428c10f9eSGabriel Fernandez .name = #_name,\
276528c10f9eSGabriel Fernandez .flags = (_flags),\
276628c10f9eSGabriel Fernandez .num_parents = 1,\
276728c10f9eSGabriel Fernandez .parents = { _parent },\
276828c10f9eSGabriel Fernandez }
276928c10f9eSGabriel Fernandez
277028c10f9eSGabriel Fernandez /* Kernel Timers */
277128c10f9eSGabriel Fernandez static STM32_TIMER(ck_timg1, &ck_icn_apb1, 0, RCC_APB1DIVR, RCC_TIMG1PRER);
277228c10f9eSGabriel Fernandez static STM32_TIMER(ck_timg2, &ck_icn_apb2, 0, RCC_APB2DIVR, RCC_TIMG2PRER);
277328c10f9eSGabriel Fernandez
277428c10f9eSGabriel Fernandez /* Clocks under RCC RIF protection */
277528c10f9eSGabriel Fernandez static STM32_GATE(ck_sys_dbg, &ck_icn_apbdbg, 0, GATE_DBG);
277628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_stm, &ck_icn_apbdbg, 0, GATE_STM);
277728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_stm, &ck_icn_ls_mcu, 0, GATE_STM);
277828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tsdbg, &ck_flexgen_43, 0, GATE_DBG);
277928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tpiu, &ck_flexgen_44, 0, GATE_TRACE);
278028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_etr, &ck_icn_apbdbg, 0, GATE_ETR);
278128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_etr, &ck_flexgen_45, 0, GATE_ETR);
278228c10f9eSGabriel Fernandez static STM32_GATE(ck_sys_atb, &ck_flexgen_45, 0, GATE_DBG);
278328c10f9eSGabriel Fernandez
278428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sysram, &ck_icn_hs_mcu, 0, GATE_SYSRAM);
278528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_vderam, &ck_icn_hs_mcu, 0, GATE_VDERAM);
278628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_retram, &ck_icn_hs_mcu, 0, GATE_RETRAM);
278728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_bkpsram, &ck_icn_ls_mcu, 0, GATE_BKPSRAM);
278828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sram1, &ck_icn_hs_mcu, 0, GATE_SRAM1);
278928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sram2, &ck_icn_hs_mcu, 0, GATE_SRAM2);
279028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram1, &ck_icn_ls_mcu, 0, GATE_LPSRAM1);
279128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram2, &ck_icn_ls_mcu, 0, GATE_LPSRAM2);
279228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram3, &ck_icn_ls_mcu, 0, GATE_LPSRAM3);
279328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma1, &ck_icn_ls_mcu, 0, GATE_HPDMA1);
279428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma2, &ck_icn_ls_mcu, 0, GATE_HPDMA2);
279528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma3, &ck_icn_ls_mcu, 0, GATE_HPDMA3);
279628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lpdma, &ck_icn_ls_mcu, 0, GATE_LPDMA);
279728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ipcc1, &ck_icn_ls_mcu, 0, GATE_IPCC1);
279828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ipcc2, &ck_icn_ls_mcu, 0, GATE_IPCC2);
279928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hsem, &ck_icn_ls_mcu, 0, GATE_HSEM);
280028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioa, &ck_icn_ls_mcu, 0, GATE_GPIOA);
280128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiob, &ck_icn_ls_mcu, 0, GATE_GPIOB);
280228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioc, &ck_icn_ls_mcu, 0, GATE_GPIOC);
280328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiod, &ck_icn_ls_mcu, 0, GATE_GPIOD);
280428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioe, &ck_icn_ls_mcu, 0, GATE_GPIOE);
280528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiof, &ck_icn_ls_mcu, 0, GATE_GPIOF);
280628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiog, &ck_icn_ls_mcu, 0, GATE_GPIOG);
280728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioh, &ck_icn_ls_mcu, 0, GATE_GPIOH);
280828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioi, &ck_icn_ls_mcu, 0, GATE_GPIOI);
280928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioj, &ck_icn_ls_mcu, 0, GATE_GPIOJ);
281028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiok, &ck_icn_ls_mcu, 0, GATE_GPIOK);
281128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioz, &ck_icn_ls_mcu, 0, GATE_GPIOZ);
281228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_rtc, &ck_icn_ls_mcu, 0, GATE_RTC);
281328c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_rtc, 4,
281428c10f9eSGabriel Fernandez PARENT(&ck_off, &ck_lse, &ck_lsi, &ck_hse_rtc),
281528c10f9eSGabriel Fernandez 0, GATE_RTCCK, NO_DIV, MUX_RTC);
281628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_bsec, &ck_icn_apb3, 0, GATE_BSEC);
281728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrphyc, &ck_icn_ls_mcu, 0, GATE_DDRPHYCAPB);
281828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_risaf4, &ck_icn_ls_mcu, 0, GATE_DDRCP);
281928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ddr, &ck_icn_ddr, 0, GATE_DDRCP);
282028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrc, &ck_icn_apb4, 0, GATE_DDRCAPB);
282128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrcfg, &ck_icn_apb4, 0, GATE_DDRCFG);
282228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_syscpu1, &ck_icn_ls_mcu, 0, GATE_SYSCPU1);
282328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_is2m, &ck_icn_apb3, 0, GATE_IS2M);
282428c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_mco1, 2, PARENT(&ck_flexgen_61, &ck_obser0), 0,
282528c10f9eSGabriel Fernandez GATE_MCO1, NO_DIV, MUX_MCO1);
282628c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_mco2, 2, PARENT(&ck_flexgen_62, &ck_obser1), 0,
282728c10f9eSGabriel Fernandez GATE_MCO2, NO_DIV, MUX_MCO2);
282828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ospi1, &ck_icn_hs_mcu, 0, GATE_OSPI1);
282928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ospi1, &ck_flexgen_48, 0, GATE_OSPI1);
283028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ospi2, &ck_icn_hs_mcu, 0, GATE_OSPI2);
283128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ospi2, &ck_flexgen_49, 0, GATE_OSPI2);
283228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_fmc, &ck_icn_ls_mcu, 0, GATE_FMC);
283328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_fmc, &ck_flexgen_50, 0, GATE_FMC);
283428c10f9eSGabriel Fernandez
283528c10f9eSGabriel Fernandez /* Kernel Clocks */
283628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cci, &ck_icn_ls_mcu, 0, GATE_CCI);
283728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_crc, &ck_icn_ls_mcu, 0, GATE_CRC);
283828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ospiiom, &ck_icn_ls_mcu, 0, GATE_OSPIIOM);
283928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hash, &ck_icn_ls_mcu, 0, GATE_HASH);
284028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_rng, &ck_icn_ls_mcu, 0, GATE_RNG);
284128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cryp1, &ck_icn_ls_mcu, 0, GATE_CRYP1);
284228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cryp2, &ck_icn_ls_mcu, 0, GATE_CRYP2);
284328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_saes, &ck_icn_ls_mcu, 0, GATE_SAES);
284428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_pka, &ck_icn_ls_mcu, 0, GATE_PKA);
284528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adf1, &ck_icn_ls_mcu, 0, GATE_ADF1);
284628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg5, &ck_icn_ls_mcu, 0, GATE_IWDG5);
284728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_wwdg2, &ck_icn_ls_mcu, 0, GATE_WWDG2);
284828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_eth1, &ck_icn_ls_mcu, 0, GATE_ETH1);
284928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ethsw, &ck_icn_ls_mcu, 0, GATE_ETHSWMAC);
285028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_eth2, &ck_icn_ls_mcu, 0, GATE_ETH2);
285128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_pcie, &ck_icn_ls_mcu, 0, GATE_PCIE);
285228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adc12, &ck_icn_ls_mcu, 0, GATE_ADC12);
285328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adc3, &ck_icn_ls_mcu, 0, GATE_ADC3);
285428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_mdf1, &ck_icn_ls_mcu, 0, GATE_MDF1);
285528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi8, &ck_icn_ls_mcu, 0, GATE_SPI8);
285628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lpuart1, &ck_icn_ls_mcu, 0, GATE_LPUART1);
285728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c8, &ck_icn_ls_mcu, 0, GATE_I2C8);
285828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim3, &ck_icn_ls_mcu, 0, GATE_LPTIM3);
285928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim4, &ck_icn_ls_mcu, 0, GATE_LPTIM4);
286028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim5, &ck_icn_ls_mcu, 0, GATE_LPTIM5);
286128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc1, &ck_icn_sdmmc, 0, GATE_SDMMC1);
286228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc2, &ck_icn_sdmmc, 0, GATE_SDMMC2);
286328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc3, &ck_icn_sdmmc, 0, GATE_SDMMC3);
286428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb2ohci, &ck_icn_hsl, 0, GATE_USB2);
286528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb2ehci, &ck_icn_hsl, 0, GATE_USB2);
286628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb3dr, &ck_icn_hsl, 0, GATE_USB3DR);
286728c10f9eSGabriel Fernandez
286828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim2, &ck_icn_apb1, 0, GATE_TIM2);
286928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim3, &ck_icn_apb1, 0, GATE_TIM3);
287028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim4, &ck_icn_apb1, 0, GATE_TIM4);
287128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim5, &ck_icn_apb1, 0, GATE_TIM5);
287228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim6, &ck_icn_apb1, 0, GATE_TIM6);
287328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim7, &ck_icn_apb1, 0, GATE_TIM7);
287428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim10, &ck_icn_apb1, 0, GATE_TIM10);
287528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim11, &ck_icn_apb1, 0, GATE_TIM11);
287628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim12, &ck_icn_apb1, 0, GATE_TIM12);
287728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim13, &ck_icn_apb1, 0, GATE_TIM13);
287828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim14, &ck_icn_apb1, 0, GATE_TIM14);
287928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim1, &ck_icn_apb1, 0, GATE_LPTIM1);
288028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim2, &ck_icn_apb1, 0, GATE_LPTIM2);
288128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi2, &ck_icn_apb1, 0, GATE_SPI2);
288228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi3, &ck_icn_apb1, 0, GATE_SPI3);
288328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spdifrx, &ck_icn_apb1, 0, GATE_SPDIFRX);
288428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart2, &ck_icn_apb1, 0, GATE_USART2);
288528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart3, &ck_icn_apb1, 0, GATE_USART3);
288628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart4, &ck_icn_apb1, 0, GATE_UART4);
288728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart5, &ck_icn_apb1, 0, GATE_UART5);
288828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c1, &ck_icn_apb1, 0, GATE_I2C1);
288928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c2, &ck_icn_apb1, 0, GATE_I2C2);
289028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c3, &ck_icn_apb1, 0, GATE_I2C3);
289128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c4, &ck_icn_apb1, 0, GATE_I2C4);
289228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c5, &ck_icn_apb1, 0, GATE_I2C5);
289328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c6, &ck_icn_apb1, 0, GATE_I2C6);
289428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c7, &ck_icn_apb1, 0, GATE_I2C7);
289528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c1, &ck_icn_apb1, 0, GATE_I3C1);
289628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c2, &ck_icn_apb1, 0, GATE_I3C2);
289728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c3, &ck_icn_apb1, 0, GATE_I3C3);
289828c10f9eSGabriel Fernandez
289928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c4, &ck_icn_ls_mcu, 0, GATE_I3C4);
290028c10f9eSGabriel Fernandez
290128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim1, &ck_icn_apb2, 0, GATE_TIM1);
290228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim8, &ck_icn_apb2, 0, GATE_TIM8);
290328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim15, &ck_icn_apb2, 0, GATE_TIM15);
290428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim16, &ck_icn_apb2, 0, GATE_TIM16);
290528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim17, &ck_icn_apb2, 0, GATE_TIM17);
290628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim20, &ck_icn_apb2, 0, GATE_TIM20);
290728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai1, &ck_icn_apb2, 0, GATE_SAI1);
290828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai2, &ck_icn_apb2, 0, GATE_SAI2);
290928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai3, &ck_icn_apb2, 0, GATE_SAI3);
291028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai4, &ck_icn_apb2, 0, GATE_SAI4);
291128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart1, &ck_icn_apb2, 0, GATE_USART1);
291228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart6, &ck_icn_apb2, 0, GATE_USART6);
291328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart7, &ck_icn_apb2, 0, GATE_UART7);
291428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart8, &ck_icn_apb2, 0, GATE_UART8);
291528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart9, &ck_icn_apb2, 0, GATE_UART9);
291628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_fdcan, &ck_icn_apb2, 0, GATE_FDCAN);
291728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi1, &ck_icn_apb2, 0, GATE_SPI1);
291828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi4, &ck_icn_apb2, 0, GATE_SPI4);
291928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi5, &ck_icn_apb2, 0, GATE_SPI5);
292028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi6, &ck_icn_apb2, 0, GATE_SPI6);
292128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi7, &ck_icn_apb2, 0, GATE_SPI7);
292228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg1, &ck_icn_apb3, 0, GATE_IWDG1);
292328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg2, &ck_icn_apb3, 0, GATE_IWDG2);
292428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg3, &ck_icn_apb3, 0, GATE_IWDG3);
292528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg4, &ck_icn_apb3, 0, GATE_IWDG4);
292628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_wwdg1, &ck_icn_apb3, 0, GATE_WWDG1);
292728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_vref, &ck_icn_apb3, 0, GATE_VREF);
292828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dts, &ck_icn_apb3, 0, GATE_DTS);
292928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_serc, &ck_icn_apb3, 0, GATE_SERC);
293028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hdp, &ck_icn_apb3, 0, GATE_HDP);
293128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dsi, &ck_icn_apb4, 0, GATE_DSI);
293228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ltdc, &ck_icn_apb4, 0, GATE_LTDC);
293328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_csi, &ck_icn_apb4, 0, GATE_CSI);
293428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dcmipp, &ck_icn_apb4, 0, GATE_DCMIPP);
293528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lvds, &ck_icn_apb4, 0, GATE_LVDS);
293628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gicv2m, &ck_icn_apb4, 0, GATE_GICV2M);
293728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usbtc, &ck_icn_apb4, 0, GATE_USBTC);
293828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usb3pciephy, &ck_icn_apb4, 0, GATE_USB3PCIEPHY);
293928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_stgen, &ck_icn_apb4, 0, GATE_STGEN);
294028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_vdec, &ck_icn_apb4, 0, GATE_VDEC);
294128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_venc, &ck_icn_apb4, 0, GATE_VENC);
294228c10f9eSGabriel Fernandez
294328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim2, &ck_timg1, 0, GATE_TIM2);
294428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim3, &ck_timg1, 0, GATE_TIM3);
294528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim4, &ck_timg1, 0, GATE_TIM4);
294628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim5, &ck_timg1, 0, GATE_TIM5);
294728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim6, &ck_timg1, 0, GATE_TIM6);
294828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim7, &ck_timg1, 0, GATE_TIM7);
294928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim10, &ck_timg1, 0, GATE_TIM10);
295028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim11, &ck_timg1, 0, GATE_TIM11);
295128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim12, &ck_timg1, 0, GATE_TIM12);
295228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim13, &ck_timg1, 0, GATE_TIM13);
295328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim14, &ck_timg1, 0, GATE_TIM14);
295428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim1, &ck_timg2, 0, GATE_TIM1);
295528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim8, &ck_timg2, 0, GATE_TIM8);
295628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim15, &ck_timg2, 0, GATE_TIM15);
295728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim16, &ck_timg2, 0, GATE_TIM16);
295828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim17, &ck_timg2, 0, GATE_TIM17);
295928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim20, &ck_timg2, 0, GATE_TIM20);
296028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim1, &ck_flexgen_07, 0, GATE_LPTIM1);
296128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim2, &ck_flexgen_07, 0, GATE_LPTIM2);
296228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart2, &ck_flexgen_08, 0, GATE_USART2);
296328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart4, &ck_flexgen_08, 0, GATE_UART4);
296428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart3, &ck_flexgen_09, 0, GATE_USART3);
296528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart5, &ck_flexgen_09, 0, GATE_UART5);
296628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi2, &ck_flexgen_10, 0, GATE_SPI2);
296728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi3, &ck_flexgen_10, 0, GATE_SPI3);
296828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spdifrx, &ck_flexgen_11, 0, GATE_SPDIFRX);
296928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c1, &ck_flexgen_12, 0, GATE_I2C1);
297028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c2, &ck_flexgen_12, 0, GATE_I2C2);
297128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c1, &ck_flexgen_12, 0, GATE_I3C1);
297228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c2, &ck_flexgen_12, 0, GATE_I3C2);
297328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c3, &ck_flexgen_13, 0, GATE_I2C3);
297428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c5, &ck_flexgen_13, 0, GATE_I2C5);
297528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c3, &ck_flexgen_13, 0, GATE_I3C3);
297628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c4, &ck_flexgen_14, 0, GATE_I2C4);
297728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c6, &ck_flexgen_14, 0, GATE_I2C6);
297828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c7, &ck_flexgen_15, 0, GATE_I2C7);
297928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi1, &ck_flexgen_16, 0, GATE_SPI1);
298028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi4, &ck_flexgen_17, 0, GATE_SPI4);
298128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi5, &ck_flexgen_17, 0, GATE_SPI5);
298228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi6, &ck_flexgen_18, 0, GATE_SPI6);
298328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi7, &ck_flexgen_18, 0, GATE_SPI7);
298428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart1, &ck_flexgen_19, 0, GATE_USART1);
298528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart6, &ck_flexgen_20, 0, GATE_USART6);
298628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart7, &ck_flexgen_21, 0, GATE_UART7);
298728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart8, &ck_flexgen_21, 0, GATE_UART8);
298828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart9, &ck_flexgen_22, 0, GATE_UART9);
298928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_mdf1, &ck_flexgen_23, 0, GATE_MDF1);
299028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai1, &ck_flexgen_23, 0, GATE_SAI1);
299128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai2, &ck_flexgen_24, 0, GATE_SAI2);
299228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai3, &ck_flexgen_25, 0, GATE_SAI3);
299328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai4, &ck_flexgen_25, 0, GATE_SAI4);
299428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_fdcan, &ck_flexgen_26, 0, GATE_FDCAN);
299528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csi, &ck_flexgen_29, 0, GATE_CSI);
299628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csitxesc, &ck_flexgen_30, 0, GATE_CSI);
299728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csiphy, &ck_flexgen_31, 0, GATE_CSI);
299828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_stgen, &ck_flexgen_33, CLK_SET_RATE_PARENT,
299928c10f9eSGabriel Fernandez GATE_STGEN);
300028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usbtc, &ck_flexgen_35, 0, GATE_USBTC);
300128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c4, &ck_flexgen_36, 0, GATE_I3C4);
300228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi8, &ck_flexgen_37, 0, GATE_SPI8);
300328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c8, &ck_flexgen_38, 0, GATE_I2C8);
300428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lpuart1, &ck_flexgen_39, 0, GATE_LPUART1);
300528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim3, &ck_flexgen_40, 0, GATE_LPTIM3);
300628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim4, &ck_flexgen_41, 0, GATE_LPTIM4);
300728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim5, &ck_flexgen_41, 0, GATE_LPTIM5);
300828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_adf1, &ck_flexgen_42, 0, GATE_ADF1);
300928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc1, &ck_flexgen_51, 0, GATE_SDMMC1);
301028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc2, &ck_flexgen_52, 0, GATE_SDMMC2);
301128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc3, &ck_flexgen_53, 0, GATE_SDMMC3);
301228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1, &ck_flexgen_54, 0, GATE_ETH1);
301328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ethsw, &ck_flexgen_54, 0, GATE_ETHSW);
301428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2, &ck_flexgen_55, 0, GATE_ETH2);
301528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1ptp, &ck_flexgen_56, 0, GATE_ETH1);
301628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2ptp, &ck_flexgen_56, 0, GATE_ETH2);
301728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usb2phy2, &ck_flexgen_58, 0, GATE_USB3DR);
301828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_gpu, &ck_flexgen_59, 0, GATE_GPU);
301928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_gpu, &ck_pll3, 0, GATE_GPU);
302028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ethswref, &ck_flexgen_60, 0, GATE_ETHSWREF);
302128c10f9eSGabriel Fernandez
302228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1stp, &ck_icn_ls_mcu, 0, GATE_ETH1STP);
302328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2stp, &ck_icn_ls_mcu, 0, GATE_ETH2STP);
302428c10f9eSGabriel Fernandez
302528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ltdc, &ck_flexgen_27, CLK_SET_RATE_PARENT,
302628c10f9eSGabriel Fernandez GATE_LTDC);
302728c10f9eSGabriel Fernandez
302828c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_adc12, 2, PARENT(&ck_flexgen_46, &ck_icn_ls_mcu),
302928c10f9eSGabriel Fernandez 0, GATE_ADC12, NO_DIV, MUX_ADC12);
303028c10f9eSGabriel Fernandez
303128c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_adc3, 3, PARENT(&ck_flexgen_47, &ck_icn_ls_mcu,
303228c10f9eSGabriel Fernandez &ck_flexgen_46),
303328c10f9eSGabriel Fernandez 0, GATE_ADC3, NO_DIV, MUX_ADC3);
303428c10f9eSGabriel Fernandez
303528c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb2phy1, 2, PARENT(&ck_flexgen_57,
303628c10f9eSGabriel Fernandez &ck_hse_div2),
303728c10f9eSGabriel Fernandez 0, GATE_USB2PHY1, NO_DIV, MUX_USB2PHY1);
303828c10f9eSGabriel Fernandez
303928c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb2phy2_en, 2, PARENT(&ck_flexgen_58,
304028c10f9eSGabriel Fernandez &ck_hse_div2),
304128c10f9eSGabriel Fernandez 0, GATE_USB2PHY2, NO_DIV, MUX_USB2PHY2);
304228c10f9eSGabriel Fernandez
304328c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb3pciephy, 2, PARENT(&ck_flexgen_34,
304428c10f9eSGabriel Fernandez &ck_hse_div2),
304528c10f9eSGabriel Fernandez 0, GATE_USB3PCIEPHY, NO_DIV, MUX_USB3PCIEPHY);
304628c10f9eSGabriel Fernandez
304728c10f9eSGabriel Fernandez static STM32_COMPOSITE(clk_lanebyte, 2, PARENT(&txbyteclk, &ck_ker_ltdc),
304828c10f9eSGabriel Fernandez 0, GATE_DSI, NO_DIV, MUX_DSIBLANE);
304928c10f9eSGabriel Fernandez
305028c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_phy_dsi, 2, PARENT(&ck_flexgen_28, &ck_hse),
305128c10f9eSGabriel Fernandez 0, GATE_DSI, NO_DIV, MUX_DSIPHY);
305228c10f9eSGabriel Fernandez
305328c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_lvdsphy, 2, PARENT(&ck_flexgen_32, &ck_hse),
305428c10f9eSGabriel Fernandez 0, GATE_LVDS, NO_DIV, MUX_LVDSPHY);
305528c10f9eSGabriel Fernandez
305628c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_dts, 3, PARENT(&ck_hsi, &ck_hse, &ck_msi),
305728c10f9eSGabriel Fernandez 0, GATE_DTS, NO_DIV, MUX_DTS);
305828c10f9eSGabriel Fernandez
305928c10f9eSGabriel Fernandez enum {
306028c10f9eSGabriel Fernandez CK_OFF = STM32MP25_LAST_CLK,
306128c10f9eSGabriel Fernandez I2SCKIN,
306228c10f9eSGabriel Fernandez SPDIFSYMB,
306328c10f9eSGabriel Fernandez CK_HSE_RTC,
306428c10f9eSGabriel Fernandez TXBYTECLK,
306528c10f9eSGabriel Fernandez CK_OBSER0,
306628c10f9eSGabriel Fernandez CK_OBSER1,
306728c10f9eSGabriel Fernandez STM32MP25_ALL_CLK_NB
306828c10f9eSGabriel Fernandez };
306928c10f9eSGabriel Fernandez
307028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1mac, &ck_icn_ls_mcu, 0, GATE_ETH1MAC);
307128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1tx, &ck_icn_ls_mcu, 0, GATE_ETH1TX);
307228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1rx, &ck_icn_ls_mcu, 0, GATE_ETH1RX);
307328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2mac, &ck_icn_ls_mcu, 0, GATE_ETH2MAC);
307428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2tx, &ck_icn_ls_mcu, 0, GATE_ETH2TX);
307528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2rx, &ck_icn_ls_mcu, 0, GATE_ETH2RX);
307628c10f9eSGabriel Fernandez
307728c10f9eSGabriel Fernandez static struct clk *stm32mp25_clk_provided[STM32MP25_ALL_CLK_NB] = {
307828c10f9eSGabriel Fernandez [HSI_CK] = &ck_hsi,
307928c10f9eSGabriel Fernandez [HSE_CK] = &ck_hse,
308028c10f9eSGabriel Fernandez [MSI_CK] = &ck_msi,
308128c10f9eSGabriel Fernandez [LSI_CK] = &ck_lsi,
308228c10f9eSGabriel Fernandez [LSE_CK] = &ck_lse,
308328c10f9eSGabriel Fernandez
308428c10f9eSGabriel Fernandez [HSE_DIV2_CK] = &ck_hse_div2,
308528c10f9eSGabriel Fernandez
308628c10f9eSGabriel Fernandez [PLL1_CK] = &ck_pll1,
308728c10f9eSGabriel Fernandez [PLL2_CK] = &ck_pll2,
308828c10f9eSGabriel Fernandez [PLL3_CK] = &ck_pll3,
308928c10f9eSGabriel Fernandez [PLL4_CK] = &ck_pll4,
309028c10f9eSGabriel Fernandez [PLL5_CK] = &ck_pll5,
309128c10f9eSGabriel Fernandez [PLL6_CK] = &ck_pll6,
309228c10f9eSGabriel Fernandez [PLL7_CK] = &ck_pll7,
309328c10f9eSGabriel Fernandez [PLL8_CK] = &ck_pll8,
309428c10f9eSGabriel Fernandez
309528c10f9eSGabriel Fernandez [CK_ICN_HS_MCU] = &ck_icn_hs_mcu,
309628c10f9eSGabriel Fernandez [CK_ICN_LS_MCU] = &ck_icn_ls_mcu,
309728c10f9eSGabriel Fernandez
309828c10f9eSGabriel Fernandez [CK_ICN_SDMMC] = &ck_icn_sdmmc,
309928c10f9eSGabriel Fernandez [CK_ICN_DDR] = &ck_icn_ddr,
310028c10f9eSGabriel Fernandez [CK_ICN_DISPLAY] = &ck_icn_display,
310128c10f9eSGabriel Fernandez [CK_ICN_HSL] = &ck_icn_hsl,
310228c10f9eSGabriel Fernandez [CK_ICN_NIC] = &ck_icn_nic,
310328c10f9eSGabriel Fernandez [CK_ICN_VID] = &ck_icn_vid,
310428c10f9eSGabriel Fernandez [CK_FLEXGEN_07] = &ck_flexgen_07,
310528c10f9eSGabriel Fernandez [CK_FLEXGEN_08] = &ck_flexgen_08,
310628c10f9eSGabriel Fernandez [CK_FLEXGEN_09] = &ck_flexgen_09,
310728c10f9eSGabriel Fernandez [CK_FLEXGEN_10] = &ck_flexgen_10,
310828c10f9eSGabriel Fernandez [CK_FLEXGEN_11] = &ck_flexgen_11,
310928c10f9eSGabriel Fernandez [CK_FLEXGEN_12] = &ck_flexgen_12,
311028c10f9eSGabriel Fernandez [CK_FLEXGEN_13] = &ck_flexgen_13,
311128c10f9eSGabriel Fernandez [CK_FLEXGEN_14] = &ck_flexgen_14,
311228c10f9eSGabriel Fernandez [CK_FLEXGEN_15] = &ck_flexgen_15,
311328c10f9eSGabriel Fernandez [CK_FLEXGEN_16] = &ck_flexgen_16,
311428c10f9eSGabriel Fernandez [CK_FLEXGEN_17] = &ck_flexgen_17,
311528c10f9eSGabriel Fernandez [CK_FLEXGEN_18] = &ck_flexgen_18,
311628c10f9eSGabriel Fernandez [CK_FLEXGEN_19] = &ck_flexgen_19,
311728c10f9eSGabriel Fernandez [CK_FLEXGEN_20] = &ck_flexgen_20,
311828c10f9eSGabriel Fernandez [CK_FLEXGEN_21] = &ck_flexgen_21,
311928c10f9eSGabriel Fernandez [CK_FLEXGEN_22] = &ck_flexgen_22,
312028c10f9eSGabriel Fernandez [CK_FLEXGEN_23] = &ck_flexgen_23,
312128c10f9eSGabriel Fernandez [CK_FLEXGEN_24] = &ck_flexgen_24,
312228c10f9eSGabriel Fernandez [CK_FLEXGEN_25] = &ck_flexgen_25,
312328c10f9eSGabriel Fernandez [CK_FLEXGEN_26] = &ck_flexgen_26,
312428c10f9eSGabriel Fernandez [CK_FLEXGEN_27] = &ck_flexgen_27,
312528c10f9eSGabriel Fernandez [CK_FLEXGEN_28] = &ck_flexgen_28,
312628c10f9eSGabriel Fernandez [CK_FLEXGEN_29] = &ck_flexgen_29,
312728c10f9eSGabriel Fernandez [CK_FLEXGEN_30] = &ck_flexgen_30,
312828c10f9eSGabriel Fernandez [CK_FLEXGEN_31] = &ck_flexgen_31,
312928c10f9eSGabriel Fernandez [CK_FLEXGEN_32] = &ck_flexgen_32,
313028c10f9eSGabriel Fernandez [CK_FLEXGEN_33] = &ck_flexgen_33,
313128c10f9eSGabriel Fernandez [CK_FLEXGEN_34] = &ck_flexgen_34,
313228c10f9eSGabriel Fernandez [CK_FLEXGEN_35] = &ck_flexgen_35,
313328c10f9eSGabriel Fernandez [CK_FLEXGEN_36] = &ck_flexgen_36,
313428c10f9eSGabriel Fernandez [CK_FLEXGEN_37] = &ck_flexgen_37,
313528c10f9eSGabriel Fernandez [CK_FLEXGEN_38] = &ck_flexgen_38,
313628c10f9eSGabriel Fernandez [CK_FLEXGEN_39] = &ck_flexgen_39,
313728c10f9eSGabriel Fernandez [CK_FLEXGEN_40] = &ck_flexgen_40,
313828c10f9eSGabriel Fernandez [CK_FLEXGEN_41] = &ck_flexgen_41,
313928c10f9eSGabriel Fernandez [CK_FLEXGEN_42] = &ck_flexgen_42,
314028c10f9eSGabriel Fernandez [CK_FLEXGEN_43] = &ck_flexgen_43,
314128c10f9eSGabriel Fernandez [CK_FLEXGEN_44] = &ck_flexgen_44,
314228c10f9eSGabriel Fernandez [CK_FLEXGEN_45] = &ck_flexgen_45,
314328c10f9eSGabriel Fernandez [CK_FLEXGEN_46] = &ck_flexgen_46,
314428c10f9eSGabriel Fernandez [CK_FLEXGEN_47] = &ck_flexgen_47,
314528c10f9eSGabriel Fernandez [CK_FLEXGEN_48] = &ck_flexgen_48,
314628c10f9eSGabriel Fernandez [CK_FLEXGEN_49] = &ck_flexgen_49,
314728c10f9eSGabriel Fernandez [CK_FLEXGEN_50] = &ck_flexgen_50,
314828c10f9eSGabriel Fernandez [CK_FLEXGEN_51] = &ck_flexgen_51,
314928c10f9eSGabriel Fernandez [CK_FLEXGEN_52] = &ck_flexgen_52,
315028c10f9eSGabriel Fernandez [CK_FLEXGEN_53] = &ck_flexgen_53,
315128c10f9eSGabriel Fernandez [CK_FLEXGEN_54] = &ck_flexgen_54,
315228c10f9eSGabriel Fernandez [CK_FLEXGEN_55] = &ck_flexgen_55,
315328c10f9eSGabriel Fernandez [CK_FLEXGEN_56] = &ck_flexgen_56,
315428c10f9eSGabriel Fernandez [CK_FLEXGEN_57] = &ck_flexgen_57,
315528c10f9eSGabriel Fernandez [CK_FLEXGEN_58] = &ck_flexgen_58,
315628c10f9eSGabriel Fernandez [CK_FLEXGEN_59] = &ck_flexgen_59,
315728c10f9eSGabriel Fernandez [CK_FLEXGEN_60] = &ck_flexgen_60,
315828c10f9eSGabriel Fernandez [CK_FLEXGEN_61] = &ck_flexgen_61,
315928c10f9eSGabriel Fernandez [CK_FLEXGEN_62] = &ck_flexgen_62,
316028c10f9eSGabriel Fernandez [CK_FLEXGEN_63] = &ck_flexgen_63,
316128c10f9eSGabriel Fernandez
316228c10f9eSGabriel Fernandez [CK_CPU1] = &ck_cpu1,
316328c10f9eSGabriel Fernandez
316428c10f9eSGabriel Fernandez [CK_ICN_APB1] = &ck_icn_apb1,
316528c10f9eSGabriel Fernandez [CK_ICN_APB2] = &ck_icn_apb2,
316628c10f9eSGabriel Fernandez [CK_ICN_APB3] = &ck_icn_apb3,
316728c10f9eSGabriel Fernandez [CK_ICN_APB4] = &ck_icn_apb4,
316828c10f9eSGabriel Fernandez [CK_ICN_APBDBG] = &ck_icn_apbdbg,
316928c10f9eSGabriel Fernandez
317028c10f9eSGabriel Fernandez [TIMG1_CK] = &ck_timg1,
317128c10f9eSGabriel Fernandez [TIMG2_CK] = &ck_timg2,
317228c10f9eSGabriel Fernandez
317328c10f9eSGabriel Fernandez [CK_BUS_SYSRAM] = &ck_icn_s_sysram,
317428c10f9eSGabriel Fernandez [CK_BUS_VDERAM] = &ck_icn_s_vderam,
317528c10f9eSGabriel Fernandez [CK_BUS_RETRAM] = &ck_icn_s_retram,
317628c10f9eSGabriel Fernandez [CK_BUS_SRAM1] = &ck_icn_s_sram1,
317728c10f9eSGabriel Fernandez [CK_BUS_SRAM2] = &ck_icn_s_sram2,
317828c10f9eSGabriel Fernandez [CK_BUS_OSPI1] = &ck_icn_s_ospi1,
317928c10f9eSGabriel Fernandez [CK_BUS_OSPI2] = &ck_icn_s_ospi2,
318028c10f9eSGabriel Fernandez [CK_BUS_BKPSRAM] = &ck_icn_s_bkpsram,
318128c10f9eSGabriel Fernandez [CK_BUS_DDRPHYC] = &ck_icn_p_ddrphyc,
318228c10f9eSGabriel Fernandez [CK_BUS_SYSCPU1] = &ck_icn_p_syscpu1,
318328c10f9eSGabriel Fernandez [CK_BUS_HPDMA1] = &ck_icn_p_hpdma1,
318428c10f9eSGabriel Fernandez [CK_BUS_HPDMA2] = &ck_icn_p_hpdma2,
318528c10f9eSGabriel Fernandez [CK_BUS_HPDMA3] = &ck_icn_p_hpdma3,
318628c10f9eSGabriel Fernandez [CK_BUS_IPCC1] = &ck_icn_p_ipcc1,
318728c10f9eSGabriel Fernandez [CK_BUS_IPCC2] = &ck_icn_p_ipcc2,
318828c10f9eSGabriel Fernandez [CK_BUS_CCI] = &ck_icn_p_cci,
318928c10f9eSGabriel Fernandez [CK_BUS_CRC] = &ck_icn_p_crc,
319028c10f9eSGabriel Fernandez [CK_BUS_OSPIIOM] = &ck_icn_p_ospiiom,
319128c10f9eSGabriel Fernandez [CK_BUS_HASH] = &ck_icn_p_hash,
319228c10f9eSGabriel Fernandez [CK_BUS_RNG] = &ck_icn_p_rng,
319328c10f9eSGabriel Fernandez [CK_BUS_CRYP1] = &ck_icn_p_cryp1,
319428c10f9eSGabriel Fernandez [CK_BUS_CRYP2] = &ck_icn_p_cryp2,
319528c10f9eSGabriel Fernandez [CK_BUS_SAES] = &ck_icn_p_saes,
319628c10f9eSGabriel Fernandez [CK_BUS_PKA] = &ck_icn_p_pka,
319728c10f9eSGabriel Fernandez [CK_BUS_GPIOA] = &ck_icn_p_gpioa,
319828c10f9eSGabriel Fernandez [CK_BUS_GPIOB] = &ck_icn_p_gpiob,
319928c10f9eSGabriel Fernandez [CK_BUS_GPIOC] = &ck_icn_p_gpioc,
320028c10f9eSGabriel Fernandez [CK_BUS_GPIOD] = &ck_icn_p_gpiod,
320128c10f9eSGabriel Fernandez [CK_BUS_GPIOE] = &ck_icn_p_gpioe,
320228c10f9eSGabriel Fernandez [CK_BUS_GPIOF] = &ck_icn_p_gpiof,
320328c10f9eSGabriel Fernandez [CK_BUS_GPIOG] = &ck_icn_p_gpiog,
320428c10f9eSGabriel Fernandez [CK_BUS_GPIOH] = &ck_icn_p_gpioh,
320528c10f9eSGabriel Fernandez [CK_BUS_GPIOI] = &ck_icn_p_gpioi,
320628c10f9eSGabriel Fernandez [CK_BUS_GPIOJ] = &ck_icn_p_gpioj,
320728c10f9eSGabriel Fernandez [CK_BUS_GPIOK] = &ck_icn_p_gpiok,
320828c10f9eSGabriel Fernandez [CK_BUS_LPSRAM1] = &ck_icn_s_lpsram1,
320928c10f9eSGabriel Fernandez [CK_BUS_LPSRAM2] = &ck_icn_s_lpsram2,
321028c10f9eSGabriel Fernandez [CK_BUS_LPSRAM3] = &ck_icn_s_lpsram3,
321128c10f9eSGabriel Fernandez [CK_BUS_GPIOZ] = &ck_icn_p_gpioz,
321228c10f9eSGabriel Fernandez [CK_BUS_LPDMA] = &ck_icn_p_lpdma,
321328c10f9eSGabriel Fernandez [CK_BUS_ADF1] = &ck_icn_p_adf1,
321428c10f9eSGabriel Fernandez [CK_BUS_HSEM] = &ck_icn_p_hsem,
321528c10f9eSGabriel Fernandez [CK_BUS_RTC] = &ck_icn_p_rtc,
321628c10f9eSGabriel Fernandez [CK_BUS_IWDG5] = &ck_icn_p_iwdg5,
321728c10f9eSGabriel Fernandez [CK_BUS_WWDG2] = &ck_icn_p_wwdg2,
321828c10f9eSGabriel Fernandez [CK_BUS_STM] = &ck_icn_p_stm,
321928c10f9eSGabriel Fernandez [CK_KER_STM] = &ck_icn_s_stm,
322028c10f9eSGabriel Fernandez [CK_BUS_FMC] = &ck_icn_p_fmc,
322128c10f9eSGabriel Fernandez [CK_BUS_ETH1] = &ck_icn_p_eth1,
322228c10f9eSGabriel Fernandez [CK_BUS_ETHSW] = &ck_icn_p_ethsw,
322328c10f9eSGabriel Fernandez [CK_BUS_ETH2] = &ck_icn_p_eth2,
322428c10f9eSGabriel Fernandez [CK_BUS_PCIE] = &ck_icn_p_pcie,
322528c10f9eSGabriel Fernandez [CK_BUS_ADC12] = &ck_icn_p_adc12,
322628c10f9eSGabriel Fernandez [CK_BUS_ADC3] = &ck_icn_p_adc3,
322728c10f9eSGabriel Fernandez [CK_BUS_MDF1] = &ck_icn_p_mdf1,
322828c10f9eSGabriel Fernandez [CK_BUS_SPI8] = &ck_icn_p_spi8,
322928c10f9eSGabriel Fernandez [CK_BUS_LPUART1] = &ck_icn_p_lpuart1,
323028c10f9eSGabriel Fernandez [CK_BUS_I2C8] = &ck_icn_p_i2c8,
323128c10f9eSGabriel Fernandez [CK_BUS_LPTIM3] = &ck_icn_p_lptim3,
323228c10f9eSGabriel Fernandez [CK_BUS_LPTIM4] = &ck_icn_p_lptim4,
323328c10f9eSGabriel Fernandez [CK_BUS_LPTIM5] = &ck_icn_p_lptim5,
323428c10f9eSGabriel Fernandez [CK_BUS_RISAF4] = &ck_icn_p_risaf4,
323528c10f9eSGabriel Fernandez [CK_BUS_SDMMC1] = &ck_icn_m_sdmmc1,
323628c10f9eSGabriel Fernandez [CK_BUS_SDMMC2] = &ck_icn_m_sdmmc2,
323728c10f9eSGabriel Fernandez [CK_BUS_SDMMC3] = &ck_icn_m_sdmmc3,
323828c10f9eSGabriel Fernandez [CK_BUS_DDR] = &ck_icn_s_ddr,
323928c10f9eSGabriel Fernandez [CK_BUS_USB2OHCI] = &ck_icn_m_usb2ohci,
324028c10f9eSGabriel Fernandez [CK_BUS_USB2EHCI] = &ck_icn_m_usb2ehci,
324128c10f9eSGabriel Fernandez [CK_BUS_USB3DR] = &ck_icn_m_usb3dr,
324228c10f9eSGabriel Fernandez [CK_BUS_TIM2] = &ck_icn_p_tim2,
324328c10f9eSGabriel Fernandez [CK_BUS_TIM3] = &ck_icn_p_tim3,
324428c10f9eSGabriel Fernandez [CK_BUS_TIM4] = &ck_icn_p_tim4,
324528c10f9eSGabriel Fernandez [CK_BUS_TIM5] = &ck_icn_p_tim5,
324628c10f9eSGabriel Fernandez [CK_BUS_TIM6] = &ck_icn_p_tim6,
324728c10f9eSGabriel Fernandez [CK_BUS_TIM7] = &ck_icn_p_tim7,
324828c10f9eSGabriel Fernandez [CK_BUS_TIM10] = &ck_icn_p_tim10,
324928c10f9eSGabriel Fernandez [CK_BUS_TIM11] = &ck_icn_p_tim11,
325028c10f9eSGabriel Fernandez [CK_BUS_TIM12] = &ck_icn_p_tim12,
325128c10f9eSGabriel Fernandez [CK_BUS_TIM13] = &ck_icn_p_tim13,
325228c10f9eSGabriel Fernandez [CK_BUS_TIM14] = &ck_icn_p_tim14,
325328c10f9eSGabriel Fernandez [CK_BUS_LPTIM1] = &ck_icn_p_lptim1,
325428c10f9eSGabriel Fernandez [CK_BUS_LPTIM2] = &ck_icn_p_lptim2,
325528c10f9eSGabriel Fernandez [CK_BUS_SPI2] = &ck_icn_p_spi2,
325628c10f9eSGabriel Fernandez [CK_BUS_SPI3] = &ck_icn_p_spi3,
325728c10f9eSGabriel Fernandez [CK_BUS_SPDIFRX] = &ck_icn_p_spdifrx,
325828c10f9eSGabriel Fernandez [CK_BUS_USART2] = &ck_icn_p_usart2,
325928c10f9eSGabriel Fernandez [CK_BUS_USART3] = &ck_icn_p_usart3,
326028c10f9eSGabriel Fernandez [CK_BUS_UART4] = &ck_icn_p_uart4,
326128c10f9eSGabriel Fernandez [CK_BUS_UART5] = &ck_icn_p_uart5,
326228c10f9eSGabriel Fernandez [CK_BUS_I2C1] = &ck_icn_p_i2c1,
326328c10f9eSGabriel Fernandez [CK_BUS_I2C2] = &ck_icn_p_i2c2,
326428c10f9eSGabriel Fernandez [CK_BUS_I2C3] = &ck_icn_p_i2c3,
326528c10f9eSGabriel Fernandez [CK_BUS_I2C4] = &ck_icn_p_i2c4,
326628c10f9eSGabriel Fernandez [CK_BUS_I2C5] = &ck_icn_p_i2c5,
326728c10f9eSGabriel Fernandez [CK_BUS_I2C6] = &ck_icn_p_i2c6,
326828c10f9eSGabriel Fernandez [CK_BUS_I2C7] = &ck_icn_p_i2c7,
326928c10f9eSGabriel Fernandez [CK_BUS_I3C1] = &ck_icn_p_i3c1,
327028c10f9eSGabriel Fernandez [CK_BUS_I3C2] = &ck_icn_p_i3c2,
327128c10f9eSGabriel Fernandez [CK_BUS_I3C3] = &ck_icn_p_i3c3,
327228c10f9eSGabriel Fernandez [CK_BUS_I3C4] = &ck_icn_p_i3c4,
327328c10f9eSGabriel Fernandez [CK_BUS_TIM1] = &ck_icn_p_tim1,
327428c10f9eSGabriel Fernandez [CK_BUS_TIM8] = &ck_icn_p_tim8,
327528c10f9eSGabriel Fernandez [CK_BUS_TIM15] = &ck_icn_p_tim15,
327628c10f9eSGabriel Fernandez [CK_BUS_TIM16] = &ck_icn_p_tim16,
327728c10f9eSGabriel Fernandez [CK_BUS_TIM17] = &ck_icn_p_tim17,
327828c10f9eSGabriel Fernandez [CK_BUS_TIM20] = &ck_icn_p_tim20,
327928c10f9eSGabriel Fernandez [CK_BUS_SAI1] = &ck_icn_p_sai1,
328028c10f9eSGabriel Fernandez [CK_BUS_SAI2] = &ck_icn_p_sai2,
328128c10f9eSGabriel Fernandez [CK_BUS_SAI3] = &ck_icn_p_sai3,
328228c10f9eSGabriel Fernandez [CK_BUS_SAI4] = &ck_icn_p_sai4,
328328c10f9eSGabriel Fernandez [CK_BUS_USART1] = &ck_icn_p_usart1,
328428c10f9eSGabriel Fernandez [CK_BUS_USART6] = &ck_icn_p_usart6,
328528c10f9eSGabriel Fernandez [CK_BUS_UART7] = &ck_icn_p_uart7,
328628c10f9eSGabriel Fernandez [CK_BUS_UART8] = &ck_icn_p_uart8,
328728c10f9eSGabriel Fernandez [CK_BUS_UART9] = &ck_icn_p_uart9,
328828c10f9eSGabriel Fernandez [CK_BUS_FDCAN] = &ck_icn_p_fdcan,
328928c10f9eSGabriel Fernandez [CK_BUS_SPI1] = &ck_icn_p_spi1,
329028c10f9eSGabriel Fernandez [CK_BUS_SPI4] = &ck_icn_p_spi4,
329128c10f9eSGabriel Fernandez [CK_BUS_SPI5] = &ck_icn_p_spi5,
329228c10f9eSGabriel Fernandez [CK_BUS_SPI6] = &ck_icn_p_spi6,
329328c10f9eSGabriel Fernandez [CK_BUS_SPI7] = &ck_icn_p_spi7,
329428c10f9eSGabriel Fernandez [CK_BUS_BSEC] = &ck_icn_p_bsec,
329528c10f9eSGabriel Fernandez [CK_BUS_IWDG1] = &ck_icn_p_iwdg1,
329628c10f9eSGabriel Fernandez [CK_BUS_IWDG2] = &ck_icn_p_iwdg2,
329728c10f9eSGabriel Fernandez [CK_BUS_IWDG3] = &ck_icn_p_iwdg3,
329828c10f9eSGabriel Fernandez [CK_BUS_IWDG4] = &ck_icn_p_iwdg4,
329928c10f9eSGabriel Fernandez [CK_BUS_WWDG1] = &ck_icn_p_wwdg1,
330028c10f9eSGabriel Fernandez [CK_BUS_VREF] = &ck_icn_p_vref,
330128c10f9eSGabriel Fernandez [CK_BUS_SERC] = &ck_icn_p_serc,
330228c10f9eSGabriel Fernandez [CK_BUS_DTS] = &ck_icn_p_dts,
330328c10f9eSGabriel Fernandez [CK_BUS_HDP] = &ck_icn_p_hdp,
330428c10f9eSGabriel Fernandez [CK_BUS_IS2M] = &ck_icn_p_is2m,
330528c10f9eSGabriel Fernandez [CK_BUS_DSI] = &ck_icn_p_dsi,
330628c10f9eSGabriel Fernandez [CK_BUS_LTDC] = &ck_icn_p_ltdc,
330728c10f9eSGabriel Fernandez [CK_BUS_CSI] = &ck_icn_p_csi,
330828c10f9eSGabriel Fernandez [CK_BUS_DCMIPP] = &ck_icn_p_dcmipp,
330928c10f9eSGabriel Fernandez [CK_BUS_DDRC] = &ck_icn_p_ddrc,
331028c10f9eSGabriel Fernandez [CK_BUS_DDRCFG] = &ck_icn_p_ddrcfg,
331128c10f9eSGabriel Fernandez [CK_BUS_LVDS] = &ck_icn_p_lvds,
331228c10f9eSGabriel Fernandez [CK_BUS_GICV2M] = &ck_icn_p_gicv2m,
331328c10f9eSGabriel Fernandez [CK_BUS_USBTC] = &ck_icn_p_usbtc,
331428c10f9eSGabriel Fernandez [CK_BUS_USB3PCIEPHY] = &ck_icn_p_usb3pciephy,
331528c10f9eSGabriel Fernandez [CK_BUS_STGEN] = &ck_icn_p_stgen,
331628c10f9eSGabriel Fernandez [CK_BUS_VDEC] = &ck_icn_p_vdec,
331728c10f9eSGabriel Fernandez [CK_BUS_VENC] = &ck_icn_p_venc,
331828c10f9eSGabriel Fernandez [CK_SYSDBG] = &ck_sys_dbg,
331928c10f9eSGabriel Fernandez [CK_KER_TIM2] = &ck_ker_tim2,
332028c10f9eSGabriel Fernandez [CK_KER_TIM3] = &ck_ker_tim3,
332128c10f9eSGabriel Fernandez [CK_KER_TIM4] = &ck_ker_tim4,
332228c10f9eSGabriel Fernandez [CK_KER_TIM5] = &ck_ker_tim5,
332328c10f9eSGabriel Fernandez [CK_KER_TIM6] = &ck_ker_tim6,
332428c10f9eSGabriel Fernandez [CK_KER_TIM7] = &ck_ker_tim7,
332528c10f9eSGabriel Fernandez [CK_KER_TIM10] = &ck_ker_tim10,
332628c10f9eSGabriel Fernandez [CK_KER_TIM11] = &ck_ker_tim11,
332728c10f9eSGabriel Fernandez [CK_KER_TIM12] = &ck_ker_tim12,
332828c10f9eSGabriel Fernandez [CK_KER_TIM13] = &ck_ker_tim13,
332928c10f9eSGabriel Fernandez [CK_KER_TIM14] = &ck_ker_tim14,
333028c10f9eSGabriel Fernandez [CK_KER_TIM1] = &ck_ker_tim1,
333128c10f9eSGabriel Fernandez [CK_KER_TIM8] = &ck_ker_tim8,
333228c10f9eSGabriel Fernandez [CK_KER_TIM15] = &ck_ker_tim15,
333328c10f9eSGabriel Fernandez [CK_KER_TIM16] = &ck_ker_tim16,
333428c10f9eSGabriel Fernandez [CK_KER_TIM17] = &ck_ker_tim17,
333528c10f9eSGabriel Fernandez [CK_KER_TIM20] = &ck_ker_tim20,
333628c10f9eSGabriel Fernandez [CK_KER_LPTIM1] = &ck_ker_lptim1,
333728c10f9eSGabriel Fernandez [CK_KER_LPTIM2] = &ck_ker_lptim2,
333828c10f9eSGabriel Fernandez [CK_KER_USART2] = &ck_ker_usart2,
333928c10f9eSGabriel Fernandez [CK_KER_UART4] = &ck_ker_uart4,
334028c10f9eSGabriel Fernandez [CK_KER_USART3] = &ck_ker_usart3,
334128c10f9eSGabriel Fernandez [CK_KER_UART5] = &ck_ker_uart5,
334228c10f9eSGabriel Fernandez [CK_KER_SPI2] = &ck_ker_spi2,
334328c10f9eSGabriel Fernandez [CK_KER_SPI3] = &ck_ker_spi3,
334428c10f9eSGabriel Fernandez [CK_KER_SPDIFRX] = &ck_ker_spdifrx,
334528c10f9eSGabriel Fernandez [CK_KER_I2C1] = &ck_ker_i2c1,
334628c10f9eSGabriel Fernandez [CK_KER_I2C2] = &ck_ker_i2c2,
334728c10f9eSGabriel Fernandez [CK_KER_I3C1] = &ck_ker_i3c1,
334828c10f9eSGabriel Fernandez [CK_KER_I3C2] = &ck_ker_i3c2,
334928c10f9eSGabriel Fernandez [CK_KER_I2C3] = &ck_ker_i2c3,
335028c10f9eSGabriel Fernandez [CK_KER_I2C5] = &ck_ker_i2c5,
335128c10f9eSGabriel Fernandez [CK_KER_I3C3] = &ck_ker_i3c3,
335228c10f9eSGabriel Fernandez [CK_KER_I2C4] = &ck_ker_i2c4,
335328c10f9eSGabriel Fernandez [CK_KER_I2C6] = &ck_ker_i2c6,
335428c10f9eSGabriel Fernandez [CK_KER_I2C7] = &ck_ker_i2c7,
335528c10f9eSGabriel Fernandez [CK_KER_SPI1] = &ck_ker_spi1,
335628c10f9eSGabriel Fernandez [CK_KER_SPI4] = &ck_ker_spi4,
335728c10f9eSGabriel Fernandez [CK_KER_SPI5] = &ck_ker_spi5,
335828c10f9eSGabriel Fernandez [CK_KER_SPI6] = &ck_ker_spi6,
335928c10f9eSGabriel Fernandez [CK_KER_SPI7] = &ck_ker_spi7,
336028c10f9eSGabriel Fernandez [CK_KER_USART1] = &ck_ker_usart1,
336128c10f9eSGabriel Fernandez [CK_KER_USART6] = &ck_ker_usart6,
336228c10f9eSGabriel Fernandez [CK_KER_UART7] = &ck_ker_uart7,
336328c10f9eSGabriel Fernandez [CK_KER_UART8] = &ck_ker_uart8,
336428c10f9eSGabriel Fernandez [CK_KER_UART9] = &ck_ker_uart9,
336528c10f9eSGabriel Fernandez [CK_KER_MDF1] = &ck_ker_mdf1,
336628c10f9eSGabriel Fernandez [CK_KER_SAI1] = &ck_ker_sai1,
336728c10f9eSGabriel Fernandez [CK_KER_SAI2] = &ck_ker_sai2,
336828c10f9eSGabriel Fernandez [CK_KER_SAI3] = &ck_ker_sai3,
336928c10f9eSGabriel Fernandez [CK_KER_SAI4] = &ck_ker_sai4,
337028c10f9eSGabriel Fernandez [CK_KER_FDCAN] = &ck_ker_fdcan,
337128c10f9eSGabriel Fernandez [CK_KER_CSI] = &ck_ker_csi,
337228c10f9eSGabriel Fernandez [CK_KER_CSITXESC] = &ck_ker_csitxesc,
337328c10f9eSGabriel Fernandez [CK_KER_CSIPHY] = &ck_ker_csiphy,
337428c10f9eSGabriel Fernandez [CK_KER_STGEN] = &ck_ker_stgen,
337528c10f9eSGabriel Fernandez [CK_KER_USBTC] = &ck_ker_usbtc,
337628c10f9eSGabriel Fernandez [CK_KER_I3C4] = &ck_ker_i3c4,
337728c10f9eSGabriel Fernandez [CK_KER_SPI8] = &ck_ker_spi8,
337828c10f9eSGabriel Fernandez [CK_KER_I2C8] = &ck_ker_i2c8,
337928c10f9eSGabriel Fernandez [CK_KER_LPUART1] = &ck_ker_lpuart1,
338028c10f9eSGabriel Fernandez [CK_KER_LPTIM3] = &ck_ker_lptim3,
338128c10f9eSGabriel Fernandez [CK_KER_LPTIM4] = &ck_ker_lptim4,
338228c10f9eSGabriel Fernandez [CK_KER_LPTIM5] = &ck_ker_lptim5,
338328c10f9eSGabriel Fernandez [CK_KER_ADF1] = &ck_ker_adf1,
338428c10f9eSGabriel Fernandez [CK_KER_TSDBG] = &ck_ker_tsdbg,
338528c10f9eSGabriel Fernandez [CK_KER_TPIU] = &ck_ker_tpiu,
338628c10f9eSGabriel Fernandez [CK_BUS_ETR] = &ck_icn_p_etr,
338728c10f9eSGabriel Fernandez [CK_KER_ETR] = &ck_icn_m_etr,
338828c10f9eSGabriel Fernandez [CK_BUS_SYSATB] = &ck_sys_atb,
338928c10f9eSGabriel Fernandez [CK_KER_OSPI1] = &ck_ker_ospi1,
339028c10f9eSGabriel Fernandez [CK_KER_OSPI2] = &ck_ker_ospi2,
339128c10f9eSGabriel Fernandez [CK_KER_FMC] = &ck_ker_fmc,
339228c10f9eSGabriel Fernandez [CK_KER_SDMMC1] = &ck_ker_sdmmc1,
339328c10f9eSGabriel Fernandez [CK_KER_SDMMC2] = &ck_ker_sdmmc2,
339428c10f9eSGabriel Fernandez [CK_KER_SDMMC3] = &ck_ker_sdmmc3,
339528c10f9eSGabriel Fernandez [CK_KER_ETH1] = &ck_ker_eth1,
339628c10f9eSGabriel Fernandez [CK_ETH1_STP] = &ck_ker_eth1stp,
339728c10f9eSGabriel Fernandez [CK_KER_ETHSW] = &ck_ker_ethsw,
339828c10f9eSGabriel Fernandez [CK_KER_ETH2] = &ck_ker_eth2,
339928c10f9eSGabriel Fernandez [CK_ETH2_STP] = &ck_ker_eth2stp,
340028c10f9eSGabriel Fernandez [CK_KER_ETH1PTP] = &ck_ker_eth1ptp,
340128c10f9eSGabriel Fernandez [CK_KER_ETH2PTP] = &ck_ker_eth2ptp,
340228c10f9eSGabriel Fernandez [CK_BUS_GPU] = &ck_icn_m_gpu,
340328c10f9eSGabriel Fernandez [CK_KER_GPU] = &ck_ker_gpu,
340428c10f9eSGabriel Fernandez [CK_KER_ETHSWREF] = &ck_ker_ethswref,
340528c10f9eSGabriel Fernandez
340628c10f9eSGabriel Fernandez [CK_MCO1] = &ck_mco1,
340728c10f9eSGabriel Fernandez [CK_MCO2] = &ck_mco2,
340828c10f9eSGabriel Fernandez [CK_KER_ADC12] = &ck_ker_adc12,
340928c10f9eSGabriel Fernandez [CK_KER_ADC3] = &ck_ker_adc3,
341028c10f9eSGabriel Fernandez [CK_KER_USB2PHY1] = &ck_ker_usb2phy1,
341128c10f9eSGabriel Fernandez [CK_KER_USB2PHY2] = &ck_ker_usb2phy2,
341228c10f9eSGabriel Fernandez [CK_KER_USB2PHY2EN] = &ck_ker_usb2phy2_en,
341328c10f9eSGabriel Fernandez [CK_KER_USB3PCIEPHY] = &ck_ker_usb3pciephy,
341428c10f9eSGabriel Fernandez [CK_KER_LTDC] = &ck_ker_ltdc,
341528c10f9eSGabriel Fernandez [CK_KER_DSIBLANE] = &clk_lanebyte,
341628c10f9eSGabriel Fernandez [CK_KER_DSIPHY] = &ck_phy_dsi,
341728c10f9eSGabriel Fernandez [CK_KER_LVDSPHY] = &ck_ker_lvdsphy,
341828c10f9eSGabriel Fernandez [CK_KER_DTS] = &ck_ker_dts,
341928c10f9eSGabriel Fernandez [RTC_CK] = &ck_rtc,
342028c10f9eSGabriel Fernandez
342128c10f9eSGabriel Fernandez [CK_ETH1_MAC] = &ck_ker_eth1mac,
342228c10f9eSGabriel Fernandez [CK_ETH1_TX] = &ck_ker_eth1tx,
342328c10f9eSGabriel Fernandez [CK_ETH1_RX] = &ck_ker_eth1rx,
342428c10f9eSGabriel Fernandez [CK_ETH2_MAC] = &ck_ker_eth2mac,
342528c10f9eSGabriel Fernandez [CK_ETH2_TX] = &ck_ker_eth2tx,
342628c10f9eSGabriel Fernandez [CK_ETH2_RX] = &ck_ker_eth2rx,
342728c10f9eSGabriel Fernandez
342828c10f9eSGabriel Fernandez [CK_HSE_RTC] = &ck_hse_rtc,
342928c10f9eSGabriel Fernandez [CK_OBSER0] = &ck_obser0,
343028c10f9eSGabriel Fernandez [CK_OBSER1] = &ck_obser1,
343128c10f9eSGabriel Fernandez [CK_OFF] = &ck_off,
343228c10f9eSGabriel Fernandez [I2SCKIN] = &i2sckin,
343328c10f9eSGabriel Fernandez [SPDIFSYMB] = &spdifsymb,
343428c10f9eSGabriel Fernandez [TXBYTECLK] = &txbyteclk,
343528c10f9eSGabriel Fernandez };
343628c10f9eSGabriel Fernandez
clk_stm32_clock_is_critical(struct clk * clk)343728c10f9eSGabriel Fernandez static bool clk_stm32_clock_is_critical(struct clk *clk)
343828c10f9eSGabriel Fernandez {
343928c10f9eSGabriel Fernandez struct clk *clk_criticals[] = {
344028c10f9eSGabriel Fernandez &ck_hsi,
344128c10f9eSGabriel Fernandez &ck_hse,
344228c10f9eSGabriel Fernandez &ck_msi,
344328c10f9eSGabriel Fernandez &ck_lsi,
344428c10f9eSGabriel Fernandez &ck_lse,
344528c10f9eSGabriel Fernandez &ck_cpu1,
344628c10f9eSGabriel Fernandez &ck_icn_p_syscpu1,
344728c10f9eSGabriel Fernandez &ck_icn_s_ddr,
344828c10f9eSGabriel Fernandez &ck_icn_p_ddrc,
344928c10f9eSGabriel Fernandez &ck_icn_p_ddrcfg,
345028c10f9eSGabriel Fernandez &ck_icn_p_ddrphyc,
345128c10f9eSGabriel Fernandez &ck_icn_s_sysram,
345228c10f9eSGabriel Fernandez &ck_icn_s_bkpsram,
345328c10f9eSGabriel Fernandez &ck_ker_fmc,
345428c10f9eSGabriel Fernandez &ck_ker_ospi1,
345528c10f9eSGabriel Fernandez &ck_ker_ospi2,
345628c10f9eSGabriel Fernandez &ck_icn_s_vderam,
345728c10f9eSGabriel Fernandez &ck_icn_s_lpsram1,
345828c10f9eSGabriel Fernandez &ck_icn_s_lpsram2,
345928c10f9eSGabriel Fernandez &ck_icn_s_lpsram3,
346028c10f9eSGabriel Fernandez &ck_icn_p_hpdma1,
346128c10f9eSGabriel Fernandez &ck_icn_p_hpdma2,
346228c10f9eSGabriel Fernandez &ck_icn_p_hpdma3,
346328c10f9eSGabriel Fernandez &ck_icn_p_gpioa,
346428c10f9eSGabriel Fernandez &ck_icn_p_gpiob,
346528c10f9eSGabriel Fernandez &ck_icn_p_gpioc,
346628c10f9eSGabriel Fernandez &ck_icn_p_gpiod,
346728c10f9eSGabriel Fernandez &ck_icn_p_gpioe,
346828c10f9eSGabriel Fernandez &ck_icn_p_gpiof,
346928c10f9eSGabriel Fernandez &ck_icn_p_gpiog,
347028c10f9eSGabriel Fernandez &ck_icn_p_gpioh,
347128c10f9eSGabriel Fernandez &ck_icn_p_gpioi,
347228c10f9eSGabriel Fernandez &ck_icn_p_gpioj,
347328c10f9eSGabriel Fernandez &ck_icn_p_gpiok,
347428c10f9eSGabriel Fernandez &ck_icn_p_gpioz,
347528c10f9eSGabriel Fernandez &ck_icn_p_ipcc1,
347628c10f9eSGabriel Fernandez &ck_icn_p_ipcc2,
347728c10f9eSGabriel Fernandez &ck_icn_p_gicv2m,
347828c10f9eSGabriel Fernandez &ck_icn_p_rtc
347928c10f9eSGabriel Fernandez };
348028c10f9eSGabriel Fernandez size_t i = 0;
348128c10f9eSGabriel Fernandez
348228c10f9eSGabriel Fernandez for (i = 0; i < ARRAY_SIZE(clk_criticals); i++)
348328c10f9eSGabriel Fernandez if (clk == clk_criticals[i])
348428c10f9eSGabriel Fernandez return true;
348528c10f9eSGabriel Fernandez return false;
348628c10f9eSGabriel Fernandez }
348728c10f9eSGabriel Fernandez
clk_stm32_init_oscillators(const void * fdt,int node)348828c10f9eSGabriel Fernandez static void clk_stm32_init_oscillators(const void *fdt, int node)
348928c10f9eSGabriel Fernandez {
349028c10f9eSGabriel Fernandez size_t i = 0;
349128c10f9eSGabriel Fernandez static const char * const name[] = {
349228c10f9eSGabriel Fernandez "clk-hse", "clk-hsi", "clk-lse",
349328c10f9eSGabriel Fernandez "clk-lsi", "clk-msi", "clk-i2sin"
349428c10f9eSGabriel Fernandez };
349528c10f9eSGabriel Fernandez struct clk *clks[ARRAY_SIZE(name)] = {
349628c10f9eSGabriel Fernandez &ck_hse, &ck_hsi, &ck_lse,
349728c10f9eSGabriel Fernandez &ck_lsi, &ck_msi, &i2sckin
349828c10f9eSGabriel Fernandez };
349928c10f9eSGabriel Fernandez
350028c10f9eSGabriel Fernandez for (i = 0; i < ARRAY_SIZE(clks); i++) {
350128c10f9eSGabriel Fernandez struct clk *clk = NULL;
350228c10f9eSGabriel Fernandez
350328c10f9eSGabriel Fernandez if (clk_dt_get_by_name(fdt, node, name[i], &clk))
350428c10f9eSGabriel Fernandez panic();
350528c10f9eSGabriel Fernandez
350628c10f9eSGabriel Fernandez clks[i]->parents[0] = clk;
350728c10f9eSGabriel Fernandez }
350828c10f9eSGabriel Fernandez }
350928c10f9eSGabriel Fernandez
clk_stm32_apply_rcc_config(struct stm32_clk_platdata * pdata)351028c10f9eSGabriel Fernandez static TEE_Result clk_stm32_apply_rcc_config(struct stm32_clk_platdata *pdata)
351128c10f9eSGabriel Fernandez {
351228c10f9eSGabriel Fernandez if (pdata->safe_rst)
351328c10f9eSGabriel Fernandez stm32mp25_syscfg_set_safe_reset(true);
351428c10f9eSGabriel Fernandez
351528c10f9eSGabriel Fernandez return TEE_SUCCESS;
351628c10f9eSGabriel Fernandez }
351728c10f9eSGabriel Fernandez
351828c10f9eSGabriel Fernandez static struct stm32_pll_dt_cfg mp25_pll[PLL_NB];
351928c10f9eSGabriel Fernandez static struct stm32_clk_opp_dt_cfg mp25_clk_opp;
352028c10f9eSGabriel Fernandez static struct stm32_osci_dt_cfg mp25_osci[NB_OSCILLATOR];
352128c10f9eSGabriel Fernandez
352228c10f9eSGabriel Fernandez #define DT_FLEXGEN_CLK_MAX 64
352328c10f9eSGabriel Fernandez static uint32_t mp25_flexgen[DT_FLEXGEN_CLK_MAX];
352428c10f9eSGabriel Fernandez
352528c10f9eSGabriel Fernandez #define DT_BUS_CLK_MAX 6
352628c10f9eSGabriel Fernandez static uint32_t mp25_busclk[DT_BUS_CLK_MAX];
352728c10f9eSGabriel Fernandez
352828c10f9eSGabriel Fernandez #define DT_KERNEL_CLK_MAX 20
352928c10f9eSGabriel Fernandez static uint32_t mp25_kernelclk[DT_KERNEL_CLK_MAX];
353028c10f9eSGabriel Fernandez
353128c10f9eSGabriel Fernandez static struct stm32_clk_platdata stm32mp25_clock_pdata = {
353228c10f9eSGabriel Fernandez .osci = mp25_osci,
353328c10f9eSGabriel Fernandez .nosci = NB_OSCILLATOR,
353428c10f9eSGabriel Fernandez .pll = mp25_pll,
353528c10f9eSGabriel Fernandez .npll = PLL_NB,
353628c10f9eSGabriel Fernandez .opp = &mp25_clk_opp,
353728c10f9eSGabriel Fernandez .busclk = mp25_busclk,
353828c10f9eSGabriel Fernandez .nbusclk = DT_BUS_CLK_MAX,
353928c10f9eSGabriel Fernandez .kernelclk = mp25_kernelclk,
354028c10f9eSGabriel Fernandez .nkernelclk = DT_KERNEL_CLK_MAX,
354128c10f9eSGabriel Fernandez .flexgen = mp25_flexgen,
354228c10f9eSGabriel Fernandez .nflexgen = DT_FLEXGEN_CLK_MAX,
354328c10f9eSGabriel Fernandez };
354428c10f9eSGabriel Fernandez
354528c10f9eSGabriel Fernandez static struct clk_stm32_priv stm32mp25_clock_data = {
354628c10f9eSGabriel Fernandez .muxes = parent_mp25,
354728c10f9eSGabriel Fernandez .nb_muxes = ARRAY_SIZE(parent_mp25),
354828c10f9eSGabriel Fernandez .gates = gates_mp25,
354928c10f9eSGabriel Fernandez .nb_gates = ARRAY_SIZE(gates_mp25),
355028c10f9eSGabriel Fernandez .div = dividers_mp25,
355128c10f9eSGabriel Fernandez .nb_div = ARRAY_SIZE(dividers_mp25),
355228c10f9eSGabriel Fernandez .pdata = &stm32mp25_clock_pdata,
355328c10f9eSGabriel Fernandez .nb_clk_refs = STM32MP25_ALL_CLK_NB,
355428c10f9eSGabriel Fernandez .clk_refs = stm32mp25_clk_provided,
355528c10f9eSGabriel Fernandez .is_critical = clk_stm32_clock_is_critical,
355628c10f9eSGabriel Fernandez };
355728c10f9eSGabriel Fernandez
handle_available_semaphores(void)3558b5f8fc36SGatien Chevallier static TEE_Result handle_available_semaphores(void)
3559b5f8fc36SGatien Chevallier {
3560b5f8fc36SGatien Chevallier struct stm32_clk_platdata *pdata = &stm32mp25_clock_pdata;
3561b5f8fc36SGatien Chevallier TEE_Result res = TEE_ERROR_GENERIC;
3562b5f8fc36SGatien Chevallier unsigned int index = 0;
3563b5f8fc36SGatien Chevallier uint32_t cidcfgr = 0;
3564b5f8fc36SGatien Chevallier unsigned int i = 0;
3565b5f8fc36SGatien Chevallier
3566b5f8fc36SGatien Chevallier for (i = 0; i < RCC_NB_RIF_RES; i++) {
3567b5f8fc36SGatien Chevallier vaddr_t reg_offset = pdata->rcc_base + RCC_SEMCR(i);
3568b5f8fc36SGatien Chevallier
3569b5f8fc36SGatien Chevallier index = i / 32;
3570b5f8fc36SGatien Chevallier
3571b5f8fc36SGatien Chevallier if (!(BIT(i % 32) & pdata->conf_data.access_mask[index]))
3572b5f8fc36SGatien Chevallier continue;
3573b5f8fc36SGatien Chevallier
3574b5f8fc36SGatien Chevallier cidcfgr = io_read32(pdata->rcc_base + RCC_CIDCFGR(i));
3575b5f8fc36SGatien Chevallier
3576b5f8fc36SGatien Chevallier if (!stm32_rif_semaphore_enabled_and_ok(cidcfgr, RIF_CID1))
3577b5f8fc36SGatien Chevallier continue;
3578b5f8fc36SGatien Chevallier
3579b5f8fc36SGatien Chevallier if (!(io_read32(pdata->rcc_base + RCC_SECCFGR(index)) &
3580b5f8fc36SGatien Chevallier BIT(i % 32))) {
3581b5f8fc36SGatien Chevallier res = stm32_rif_release_semaphore(reg_offset,
3582b5f8fc36SGatien Chevallier MAX_CID_SUPPORTED);
3583b5f8fc36SGatien Chevallier if (res) {
3584b5f8fc36SGatien Chevallier EMSG("Cannot release semaphore for res %u", i);
3585b5f8fc36SGatien Chevallier return res;
3586b5f8fc36SGatien Chevallier }
3587b5f8fc36SGatien Chevallier } else {
3588b5f8fc36SGatien Chevallier res = stm32_rif_acquire_semaphore(reg_offset,
3589b5f8fc36SGatien Chevallier MAX_CID_SUPPORTED);
3590b5f8fc36SGatien Chevallier if (res) {
3591b5f8fc36SGatien Chevallier EMSG("Cannot acquire semaphore for res %u", i);
3592b5f8fc36SGatien Chevallier return res;
3593b5f8fc36SGatien Chevallier }
3594b5f8fc36SGatien Chevallier }
3595b5f8fc36SGatien Chevallier }
3596b5f8fc36SGatien Chevallier
3597b5f8fc36SGatien Chevallier return TEE_SUCCESS;
3598b5f8fc36SGatien Chevallier }
3599b5f8fc36SGatien Chevallier
apply_rcc_rif_config(bool is_tdcid)3600b5f8fc36SGatien Chevallier static TEE_Result apply_rcc_rif_config(bool is_tdcid)
3601b5f8fc36SGatien Chevallier {
3602b5f8fc36SGatien Chevallier TEE_Result res = TEE_ERROR_ACCESS_DENIED;
3603b5f8fc36SGatien Chevallier struct stm32_clk_platdata *pdata = &stm32mp25_clock_pdata;
3604b5f8fc36SGatien Chevallier unsigned int i = 0;
3605b5f8fc36SGatien Chevallier unsigned int index = 0;
3606b5f8fc36SGatien Chevallier
3607b5f8fc36SGatien Chevallier if (is_tdcid) {
3608b5f8fc36SGatien Chevallier /*
3609b5f8fc36SGatien Chevallier * When TDCID, OP-TEE should be the one to set the CID
3610b5f8fc36SGatien Chevallier * filtering configuration. Clearing previous configuration
3611b5f8fc36SGatien Chevallier * prevents undesired events during the only legitimate
3612b5f8fc36SGatien Chevallier * configuration.
3613b5f8fc36SGatien Chevallier */
3614b5f8fc36SGatien Chevallier for (i = 0; i < RCC_NB_RIF_RES; i++) {
3615b5f8fc36SGatien Chevallier if (BIT(i % 32) & pdata->conf_data.access_mask[i / 32])
3616b5f8fc36SGatien Chevallier io_clrbits32(pdata->rcc_base + RCC_CIDCFGR(i),
3617b5f8fc36SGatien Chevallier RCC_CIDCFGR_CONF_MASK);
3618b5f8fc36SGatien Chevallier }
3619b5f8fc36SGatien Chevallier } else {
3620b5f8fc36SGatien Chevallier res = handle_available_semaphores();
3621b5f8fc36SGatien Chevallier if (res)
3622b5f8fc36SGatien Chevallier panic();
3623b5f8fc36SGatien Chevallier }
3624b5f8fc36SGatien Chevallier
3625b5f8fc36SGatien Chevallier /* Security and privilege RIF configuration */
3626b5f8fc36SGatien Chevallier for (index = 0; index < RCC_NB_CONFS; index++) {
3627b5f8fc36SGatien Chevallier io_clrsetbits32(pdata->rcc_base + RCC_PRIVCFGR(index),
3628b5f8fc36SGatien Chevallier pdata->conf_data.access_mask[index],
3629b5f8fc36SGatien Chevallier pdata->conf_data.priv_conf[index]);
3630b5f8fc36SGatien Chevallier io_clrsetbits32(pdata->rcc_base + RCC_SECCFGR(index),
3631b5f8fc36SGatien Chevallier pdata->conf_data.access_mask[index],
3632b5f8fc36SGatien Chevallier pdata->conf_data.sec_conf[index]);
3633b5f8fc36SGatien Chevallier }
3634b5f8fc36SGatien Chevallier
3635b5f8fc36SGatien Chevallier if (!is_tdcid)
3636b5f8fc36SGatien Chevallier goto end;
3637b5f8fc36SGatien Chevallier
3638b5f8fc36SGatien Chevallier for (i = 0; i < RCC_NB_RIF_RES; i++) {
3639b5f8fc36SGatien Chevallier if (BIT(i % 32) & pdata->conf_data.access_mask[i / 32])
3640b5f8fc36SGatien Chevallier io_clrsetbits32(pdata->rcc_base + RCC_CIDCFGR(i),
3641b5f8fc36SGatien Chevallier RCC_CIDCFGR_CONF_MASK,
3642b5f8fc36SGatien Chevallier pdata->conf_data.cid_confs[i]);
3643b5f8fc36SGatien Chevallier }
3644b5f8fc36SGatien Chevallier
3645b5f8fc36SGatien Chevallier for (index = 0; index < RCC_NB_CONFS; index++)
3646b5f8fc36SGatien Chevallier io_setbits32(pdata->rcc_base + RCC_RCFGLOCKR(index),
3647b5f8fc36SGatien Chevallier pdata->conf_data.lock_conf[index]);
3648b5f8fc36SGatien Chevallier
3649b5f8fc36SGatien Chevallier res = handle_available_semaphores();
3650b5f8fc36SGatien Chevallier if (res)
3651b5f8fc36SGatien Chevallier panic();
3652b5f8fc36SGatien Chevallier end:
3653b5f8fc36SGatien Chevallier if (IS_ENABLED(CFG_TEE_CORE_DEBUG)) {
3654b5f8fc36SGatien Chevallier for (index = 0; index < RCC_NB_CONFS; index++) {
3655b5f8fc36SGatien Chevallier /* Check that RIF config are applied, panic otherwise */
3656b5f8fc36SGatien Chevallier if ((io_read32(pdata->rcc_base + RCC_PRIVCFGR(index)) &
3657b5f8fc36SGatien Chevallier pdata->conf_data.access_mask[index]) !=
3658b5f8fc36SGatien Chevallier pdata->conf_data.priv_conf[index])
3659b5f8fc36SGatien Chevallier panic("rcc resource prv conf is incorrect");
3660b5f8fc36SGatien Chevallier
3661b5f8fc36SGatien Chevallier if ((io_read32(pdata->rcc_base + RCC_SECCFGR(index)) &
3662b5f8fc36SGatien Chevallier pdata->conf_data.access_mask[index]) !=
3663b5f8fc36SGatien Chevallier pdata->conf_data.sec_conf[index])
3664b5f8fc36SGatien Chevallier panic("rcc resource sec conf is incorrect");
3665b5f8fc36SGatien Chevallier }
3666b5f8fc36SGatien Chevallier }
3667b5f8fc36SGatien Chevallier
3668b5f8fc36SGatien Chevallier return TEE_SUCCESS;
3669b5f8fc36SGatien Chevallier }
3670b5f8fc36SGatien Chevallier
stm32_rcc_rif_pm_suspend(void)3671b5f8fc36SGatien Chevallier static TEE_Result stm32_rcc_rif_pm_suspend(void)
3672b5f8fc36SGatien Chevallier {
3673b5f8fc36SGatien Chevallier struct stm32_clk_platdata *pdata = &stm32mp25_clock_pdata;
3674b5f8fc36SGatien Chevallier unsigned int i = 0;
3675b5f8fc36SGatien Chevallier
3676b5f8fc36SGatien Chevallier if (!pdata->nb_res)
3677b5f8fc36SGatien Chevallier return TEE_SUCCESS;
3678b5f8fc36SGatien Chevallier
3679b5f8fc36SGatien Chevallier for (i = 0; i < RCC_NB_RIF_RES; i++)
3680b5f8fc36SGatien Chevallier pdata->conf_data.cid_confs[i] = io_read32(pdata->rcc_base +
3681b5f8fc36SGatien Chevallier RCC_CIDCFGR(i));
3682b5f8fc36SGatien Chevallier
3683b5f8fc36SGatien Chevallier for (i = 0; i < RCC_NB_CONFS; i++) {
3684b5f8fc36SGatien Chevallier pdata->conf_data.priv_conf[i] = io_read32(pdata->rcc_base +
3685b5f8fc36SGatien Chevallier RCC_PRIVCFGR(i));
3686b5f8fc36SGatien Chevallier pdata->conf_data.sec_conf[i] = io_read32(pdata->rcc_base +
3687b5f8fc36SGatien Chevallier RCC_SECCFGR(i));
3688b5f8fc36SGatien Chevallier pdata->conf_data.lock_conf[i] = io_read32(pdata->rcc_base +
3689b5f8fc36SGatien Chevallier RCC_RCFGLOCKR(i));
3690b5f8fc36SGatien Chevallier pdata->conf_data.access_mask[i] = GENMASK_32(31, 0);
3691b5f8fc36SGatien Chevallier }
3692b5f8fc36SGatien Chevallier
3693b5f8fc36SGatien Chevallier return TEE_SUCCESS;
3694b5f8fc36SGatien Chevallier }
3695b5f8fc36SGatien Chevallier
stm32_rcc_rif_pm(enum pm_op op,unsigned int pm_hint,const struct pm_callback_handle * h __unused)3696b5f8fc36SGatien Chevallier static TEE_Result stm32_rcc_rif_pm(enum pm_op op, unsigned int pm_hint,
3697b5f8fc36SGatien Chevallier const struct pm_callback_handle *h __unused)
3698b5f8fc36SGatien Chevallier {
3699b5f8fc36SGatien Chevallier TEE_Result res = TEE_ERROR_GENERIC;
3700b5f8fc36SGatien Chevallier bool is_tdcid = false;
3701b5f8fc36SGatien Chevallier
3702b5f8fc36SGatien Chevallier if (!PM_HINT_IS_STATE(pm_hint, CONTEXT))
3703b5f8fc36SGatien Chevallier return TEE_SUCCESS;
3704b5f8fc36SGatien Chevallier
3705b5f8fc36SGatien Chevallier res = stm32_rifsc_check_tdcid(&is_tdcid);
3706b5f8fc36SGatien Chevallier if (res)
3707b5f8fc36SGatien Chevallier return res;
3708b5f8fc36SGatien Chevallier
3709b5f8fc36SGatien Chevallier if (op == PM_OP_RESUME) {
3710b5f8fc36SGatien Chevallier if (is_tdcid)
3711b5f8fc36SGatien Chevallier res = apply_rcc_rif_config(true);
3712b5f8fc36SGatien Chevallier else
3713b5f8fc36SGatien Chevallier res = handle_available_semaphores();
3714b5f8fc36SGatien Chevallier } else {
3715b5f8fc36SGatien Chevallier if (!is_tdcid)
3716b5f8fc36SGatien Chevallier return TEE_SUCCESS;
3717b5f8fc36SGatien Chevallier
3718b5f8fc36SGatien Chevallier res = stm32_rcc_rif_pm_suspend();
3719b5f8fc36SGatien Chevallier }
3720b5f8fc36SGatien Chevallier
3721b5f8fc36SGatien Chevallier return res;
3722b5f8fc36SGatien Chevallier }
3723b5f8fc36SGatien Chevallier
rcc_rif_config(void)3724b5f8fc36SGatien Chevallier static TEE_Result rcc_rif_config(void)
3725b5f8fc36SGatien Chevallier {
3726b5f8fc36SGatien Chevallier TEE_Result res = TEE_ERROR_ACCESS_DENIED;
3727b5f8fc36SGatien Chevallier bool is_tdcid = false;
3728b5f8fc36SGatien Chevallier
3729b5f8fc36SGatien Chevallier /* Not expected to fail at this stage */
3730b5f8fc36SGatien Chevallier res = stm32_rifsc_check_tdcid(&is_tdcid);
3731b5f8fc36SGatien Chevallier if (res)
3732b5f8fc36SGatien Chevallier panic();
3733b5f8fc36SGatien Chevallier
3734b5f8fc36SGatien Chevallier res = apply_rcc_rif_config(is_tdcid);
3735b5f8fc36SGatien Chevallier if (res)
3736b5f8fc36SGatien Chevallier panic();
3737b5f8fc36SGatien Chevallier
3738b5f8fc36SGatien Chevallier register_pm_core_service_cb(stm32_rcc_rif_pm, NULL, "stm32-rcc-rif");
3739b5f8fc36SGatien Chevallier
3740b5f8fc36SGatien Chevallier return TEE_SUCCESS;
3741b5f8fc36SGatien Chevallier }
3742b5f8fc36SGatien Chevallier
3743b5f8fc36SGatien Chevallier driver_init_late(rcc_rif_config);
3744b5f8fc36SGatien Chevallier
stm32mp25_clk_probe(const void * fdt,int node,const void * compat_data __unused)3745636e1d3cSGabriel Fernandez static TEE_Result stm32mp25_clk_probe(const void *fdt, int node,
374628c10f9eSGabriel Fernandez const void *compat_data __unused)
374728c10f9eSGabriel Fernandez {
374828c10f9eSGabriel Fernandez TEE_Result res = TEE_ERROR_GENERIC;
374928c10f9eSGabriel Fernandez int fdt_rc = 0;
375028c10f9eSGabriel Fernandez int rc = 0;
375128c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = &stm32mp25_clock_data;
375228c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = &stm32mp25_clock_pdata;
375328c10f9eSGabriel Fernandez
375428c10f9eSGabriel Fernandez fdt_rc = stm32_clk_parse_fdt(fdt, node, pdata);
375528c10f9eSGabriel Fernandez if (fdt_rc) {
375628c10f9eSGabriel Fernandez EMSG("Failed to parse clock node %s: %d",
375728c10f9eSGabriel Fernandez fdt_get_name(fdt, node, NULL), fdt_rc);
375828c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC;
375928c10f9eSGabriel Fernandez }
376028c10f9eSGabriel Fernandez
376128c10f9eSGabriel Fernandez rc = clk_stm32_init(priv, stm32_rcc_base());
376228c10f9eSGabriel Fernandez if (rc)
376328c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC;
376428c10f9eSGabriel Fernandez
376528c10f9eSGabriel Fernandez stm32mp2_init_clock_tree(priv, pdata);
376628c10f9eSGabriel Fernandez
376728c10f9eSGabriel Fernandez clk_stm32_init_oscillators(fdt, node);
376828c10f9eSGabriel Fernandez
376928c10f9eSGabriel Fernandez res = clk_stm32_apply_rcc_config(pdata);
377028c10f9eSGabriel Fernandez if (res)
377128c10f9eSGabriel Fernandez panic("Error when applying RCC config");
377228c10f9eSGabriel Fernandez
377328c10f9eSGabriel Fernandez stm32mp_clk_provider_probe_final(fdt, node, priv);
377428c10f9eSGabriel Fernandez
377528c10f9eSGabriel Fernandez if (IS_ENABLED(CFG_STM32_CLK_DEBUG))
377628c10f9eSGabriel Fernandez clk_print_tree();
377728c10f9eSGabriel Fernandez
377828c10f9eSGabriel Fernandez return TEE_SUCCESS;
377928c10f9eSGabriel Fernandez }
378028c10f9eSGabriel Fernandez
3781636e1d3cSGabriel Fernandez CLK_DT_DECLARE(stm32mp25_clk, "st,stm32mp25-rcc", stm32mp25_clk_probe);
3782