xref: /optee_os/core/drivers/clk/clk-stm32mp25.c (revision 1f2e0a3fd109f8fd96d2414b0695a8981fb9925b)
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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
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 
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 
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 
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)
104728c10f9eSGabriel Fernandez 			return ret;
104828c10f9eSGabriel Fernandez 
104928c10f9eSGabriel Fernandez 		if (strncmp(cchar, name, (size_t)ret) ||
105028c10f9eSGabriel Fernandez 		    fdt_get_status(fdt, subnode) == DT_STATUS_DISABLED)
105128c10f9eSGabriel Fernandez 			continue;
105228c10f9eSGabriel Fernandez 
105328c10f9eSGabriel Fernandez 		cuint = fdt_getprop(fdt, subnode, "clock-frequency", &ret);
105428c10f9eSGabriel Fernandez 		if (!cuint)
105528c10f9eSGabriel Fernandez 			return ret;
105628c10f9eSGabriel Fernandez 
105728c10f9eSGabriel Fernandez 		osci->freq = fdt32_to_cpu(*cuint);
105828c10f9eSGabriel Fernandez 
105928c10f9eSGabriel Fernandez 		if (fdt_getprop(fdt, subnode, "st,bypass", NULL))
106028c10f9eSGabriel Fernandez 			osci->bypass = true;
106128c10f9eSGabriel Fernandez 
106228c10f9eSGabriel Fernandez 		if (fdt_getprop(fdt, subnode, "st,digbypass", NULL))
106328c10f9eSGabriel Fernandez 			osci->digbyp = true;
106428c10f9eSGabriel Fernandez 
106528c10f9eSGabriel Fernandez 		if (fdt_getprop(fdt, subnode, "st,css", NULL))
106628c10f9eSGabriel Fernandez 			osci->css = true;
106728c10f9eSGabriel Fernandez 
106828c10f9eSGabriel Fernandez 		osci->drive = fdt_read_uint32_default(fdt, subnode, "st,drive",
106928c10f9eSGabriel Fernandez 						      LSEDRV_MEDIUM_HIGH);
107028c10f9eSGabriel Fernandez 
107128c10f9eSGabriel Fernandez 		return 0;
107228c10f9eSGabriel Fernandez 	}
107328c10f9eSGabriel Fernandez 
107428c10f9eSGabriel Fernandez 	return 0;
107528c10f9eSGabriel Fernandez }
107628c10f9eSGabriel Fernandez 
107728c10f9eSGabriel Fernandez static const char *stm32_clk_get_oscillator_name(enum stm32_osc id)
107828c10f9eSGabriel Fernandez {
107928c10f9eSGabriel Fernandez 	if (id < NB_OSCILLATOR)
108028c10f9eSGabriel Fernandez 		return stm32mp25_osc_data[id].name;
108128c10f9eSGabriel Fernandez 
108228c10f9eSGabriel Fernandez 	return NULL;
108328c10f9eSGabriel Fernandez }
108428c10f9eSGabriel Fernandez 
108528c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_oscillator(const void *fdt,
108628c10f9eSGabriel Fernandez 					      int node __unused,
108728c10f9eSGabriel Fernandez 					      struct stm32_clk_platdata *pdata)
108828c10f9eSGabriel Fernandez {
108928c10f9eSGabriel Fernandez 	int fdt_err = 0;
109028c10f9eSGabriel Fernandez 	size_t i = 0;
109128c10f9eSGabriel Fernandez 	int osc_node = 0;
109228c10f9eSGabriel Fernandez 
109328c10f9eSGabriel Fernandez 	osc_node = fdt_path_offset(fdt, "/clocks");
109428c10f9eSGabriel Fernandez 	if (osc_node < 0)
109528c10f9eSGabriel Fernandez 		return -FDT_ERR_NOTFOUND;
109628c10f9eSGabriel Fernandez 
109728c10f9eSGabriel Fernandez 	for (i = 0; i < pdata->nosci; i++) {
109828c10f9eSGabriel Fernandez 		const char *name = NULL;
109928c10f9eSGabriel Fernandez 
110028c10f9eSGabriel Fernandez 		name = stm32_clk_get_oscillator_name((enum stm32_osc)i);
110128c10f9eSGabriel Fernandez 		if (!name)
110228c10f9eSGabriel Fernandez 			continue;
110328c10f9eSGabriel Fernandez 
110428c10f9eSGabriel Fernandez 		fdt_err = stm32_clk_parse_oscillator_fdt(fdt, osc_node, name,
110528c10f9eSGabriel Fernandez 							 &pdata->osci[i]);
110628c10f9eSGabriel Fernandez 		if (fdt_err < 0)
110728c10f9eSGabriel Fernandez 			panic();
110828c10f9eSGabriel Fernandez 	}
110928c10f9eSGabriel Fernandez 
111028c10f9eSGabriel Fernandez 	return 0;
111128c10f9eSGabriel Fernandez }
111228c10f9eSGabriel Fernandez 
111328c10f9eSGabriel Fernandez static int clk_stm32_parse_pll_fdt(const void *fdt, int subnode,
111428c10f9eSGabriel Fernandez 				   struct stm32_pll_dt_cfg *pll)
111528c10f9eSGabriel Fernandez {
111628c10f9eSGabriel Fernandez 	const fdt32_t *cuint = NULL;
111728c10f9eSGabriel Fernandez 	int subnode_pll = 0;
111828c10f9eSGabriel Fernandez 	int err = 0;
111928c10f9eSGabriel Fernandez 
112028c10f9eSGabriel Fernandez 	cuint = fdt_getprop(fdt, subnode, "st,pll", NULL);
112128c10f9eSGabriel Fernandez 	if (!cuint)
112228c10f9eSGabriel Fernandez 		return 0;
112328c10f9eSGabriel Fernandez 
112428c10f9eSGabriel Fernandez 	subnode_pll = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*cuint));
112528c10f9eSGabriel Fernandez 	if (subnode_pll < 0)
112628c10f9eSGabriel Fernandez 		return -FDT_ERR_NOTFOUND;
112728c10f9eSGabriel Fernandez 
112828c10f9eSGabriel Fernandez 	if (fdt_read_uint32_array(fdt, subnode_pll, "cfg", pll->cfg,
112928c10f9eSGabriel Fernandez 				  PLLCFG_NB) != 0)
113028c10f9eSGabriel Fernandez 		panic("cfg property is mandatory");
113128c10f9eSGabriel Fernandez 
113228c10f9eSGabriel Fernandez 	err = fdt_read_uint32_array(fdt, subnode_pll, "csg", pll->csg,
113328c10f9eSGabriel Fernandez 				    PLLCSG_NB);
113428c10f9eSGabriel Fernandez 
113528c10f9eSGabriel Fernandez 	pll->csg_enabled = (err == 0);
113628c10f9eSGabriel Fernandez 
113728c10f9eSGabriel Fernandez 	if (err == -FDT_ERR_NOTFOUND)
113828c10f9eSGabriel Fernandez 		err = 0;
113928c10f9eSGabriel Fernandez 
114028c10f9eSGabriel Fernandez 	if (err != 0)
114128c10f9eSGabriel Fernandez 		return err;
114228c10f9eSGabriel Fernandez 
114328c10f9eSGabriel Fernandez 	pll->enabled = true;
114428c10f9eSGabriel Fernandez 
114528c10f9eSGabriel Fernandez 	pll->frac = fdt_read_uint32_default(fdt, subnode_pll, "frac", 0);
114628c10f9eSGabriel Fernandez 
114728c10f9eSGabriel Fernandez 	if (fdt_read_uint32(fdt, subnode_pll, "src", &pll->src))
114828c10f9eSGabriel Fernandez 		panic("src property is mandatory");
114928c10f9eSGabriel Fernandez 
115028c10f9eSGabriel Fernandez 	return 0;
115128c10f9eSGabriel Fernandez }
115228c10f9eSGabriel Fernandez 
115328c10f9eSGabriel Fernandez #define RCC_PLL_NAME_SIZE 20
115428c10f9eSGabriel Fernandez 
115528c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_pll(const void *fdt, int node,
115628c10f9eSGabriel Fernandez 				       struct stm32_clk_platdata *pdata)
115728c10f9eSGabriel Fernandez {
115828c10f9eSGabriel Fernandez 	unsigned int i = 0;
115928c10f9eSGabriel Fernandez 
116028c10f9eSGabriel Fernandez 	for (i = 0; i < pdata->npll; i++) {
116128c10f9eSGabriel Fernandez 		struct stm32_pll_dt_cfg *pll = pdata->pll + i;
116228c10f9eSGabriel Fernandez 		char name[RCC_PLL_NAME_SIZE] = { };
116328c10f9eSGabriel Fernandez 		int subnode = 0;
116428c10f9eSGabriel Fernandez 
116528c10f9eSGabriel Fernandez 		snprintf(name, sizeof(name), "st,pll-%u", i + 1);
116628c10f9eSGabriel Fernandez 
116728c10f9eSGabriel Fernandez 		subnode = fdt_subnode_offset(fdt, node, name);
116828c10f9eSGabriel Fernandez 		if (subnode < 0)
116928c10f9eSGabriel Fernandez 			continue;
117028c10f9eSGabriel Fernandez 
117128c10f9eSGabriel Fernandez 		if (clk_stm32_parse_pll_fdt(fdt, subnode, pll))
117228c10f9eSGabriel Fernandez 			panic();
117328c10f9eSGabriel Fernandez 	}
117428c10f9eSGabriel Fernandez 
117528c10f9eSGabriel Fernandez 	return 0;
117628c10f9eSGabriel Fernandez }
117728c10f9eSGabriel Fernandez 
117828c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_opp(const void *fdt, int node,
117928c10f9eSGabriel Fernandez 				   const char *opp_name,
118028c10f9eSGabriel Fernandez 				   struct stm32_clk_opp_cfg *opp_cfg)
118128c10f9eSGabriel Fernandez {
118228c10f9eSGabriel Fernandez 	int subnode = 0;
118328c10f9eSGabriel Fernandez 	int nb_opp = 0;
118428c10f9eSGabriel Fernandez 	int ret = 0;
118528c10f9eSGabriel Fernandez 
118628c10f9eSGabriel Fernandez 	node = fdt_subnode_offset(fdt, node, opp_name);
118728c10f9eSGabriel Fernandez 	if (node == -FDT_ERR_NOTFOUND)
118828c10f9eSGabriel Fernandez 		return 0;
118928c10f9eSGabriel Fernandez 
119028c10f9eSGabriel Fernandez 	if (node < 0)
119128c10f9eSGabriel Fernandez 		return node;
119228c10f9eSGabriel Fernandez 
119328c10f9eSGabriel Fernandez 	fdt_for_each_subnode(subnode, fdt, node) {
119428c10f9eSGabriel Fernandez 		assert(nb_opp <= MAX_OPP);
119528c10f9eSGabriel Fernandez 
119628c10f9eSGabriel Fernandez 		if (fdt_read_uint32(fdt, subnode, "hz", &opp_cfg->frq))
119728c10f9eSGabriel Fernandez 			panic("hz property is mandatory");
119828c10f9eSGabriel Fernandez 
119928c10f9eSGabriel Fernandez 		if (fdt_read_uint32(fdt, subnode, "st,clksrc", &opp_cfg->src))
120028c10f9eSGabriel Fernandez 			panic("st,clksrc property is mandatory");
120128c10f9eSGabriel Fernandez 
120228c10f9eSGabriel Fernandez 		ret = clk_stm32_parse_pll_fdt(fdt, subnode, &opp_cfg->pll_cfg);
120328c10f9eSGabriel Fernandez 		if (ret < 0)
120428c10f9eSGabriel Fernandez 			return ret;
120528c10f9eSGabriel Fernandez 
120628c10f9eSGabriel Fernandez 		opp_cfg++;
120728c10f9eSGabriel Fernandez 		nb_opp++;
120828c10f9eSGabriel Fernandez 	}
120928c10f9eSGabriel Fernandez 
121028c10f9eSGabriel Fernandez 	return 0;
121128c10f9eSGabriel Fernandez }
121228c10f9eSGabriel Fernandez 
121328c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_opp(const void *fdt, int node,
121428c10f9eSGabriel Fernandez 				       struct stm32_clk_platdata *pdata)
121528c10f9eSGabriel Fernandez {
121628c10f9eSGabriel Fernandez 	struct stm32_clk_opp_dt_cfg *opp = pdata->opp;
121728c10f9eSGabriel Fernandez 
121828c10f9eSGabriel Fernandez 	node = fdt_subnode_offset(fdt, node, "st,clk_opp");
121928c10f9eSGabriel Fernandez 	if (node == -FDT_ERR_NOTFOUND)
122028c10f9eSGabriel Fernandez 		return 0;
122128c10f9eSGabriel Fernandez 
122228c10f9eSGabriel Fernandez 	if (node < 0)
122328c10f9eSGabriel Fernandez 		return node;
122428c10f9eSGabriel Fernandez 
122528c10f9eSGabriel Fernandez 	return stm32_clk_parse_fdt_opp(fdt, node, "st,ck_cpu1", opp->cpu1_opp);
122628c10f9eSGabriel Fernandez }
122728c10f9eSGabriel Fernandez 
122828c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt(const void *fdt, int node,
122928c10f9eSGabriel Fernandez 			       struct stm32_clk_platdata *pdata)
123028c10f9eSGabriel Fernandez {
1231b5f8fc36SGatien Chevallier 	const fdt32_t *cuint = NULL;
1232b5f8fc36SGatien Chevallier 	unsigned int i = 0;
1233b5f8fc36SGatien Chevallier 	int lenp = 0;
123428c10f9eSGabriel Fernandez 	int err = 0;
123528c10f9eSGabriel Fernandez 
123628c10f9eSGabriel Fernandez 	err = stm32_clk_parse_fdt_all_oscillator(fdt, node, pdata);
123728c10f9eSGabriel Fernandez 	if (err != 0)
123828c10f9eSGabriel Fernandez 		return err;
123928c10f9eSGabriel Fernandez 
124028c10f9eSGabriel Fernandez 	err = stm32_clk_parse_fdt_all_pll(fdt, node, pdata);
124128c10f9eSGabriel Fernandez 	if (err != 0)
124228c10f9eSGabriel Fernandez 		return err;
124328c10f9eSGabriel Fernandez 
124428c10f9eSGabriel Fernandez 	err = stm32_clk_parse_fdt_all_opp(fdt, node, pdata);
124528c10f9eSGabriel Fernandez 	if (err != 0)
124628c10f9eSGabriel Fernandez 		return err;
124728c10f9eSGabriel Fernandez 
124828c10f9eSGabriel Fernandez 	err = clk_stm32_parse_fdt_by_name(fdt, node, "st,busclk",
124928c10f9eSGabriel Fernandez 					  pdata->busclk,
125028c10f9eSGabriel Fernandez 					  &pdata->nbusclk);
125128c10f9eSGabriel Fernandez 	if (err != 0)
125228c10f9eSGabriel Fernandez 		return err;
125328c10f9eSGabriel Fernandez 
125428c10f9eSGabriel Fernandez 	err = clk_stm32_parse_fdt_by_name(fdt, node, "st,flexgen",
125528c10f9eSGabriel Fernandez 					  pdata->flexgen,
125628c10f9eSGabriel Fernandez 					  &pdata->nflexgen);
125728c10f9eSGabriel Fernandez 	if (err != 0)
125828c10f9eSGabriel Fernandez 		return err;
125928c10f9eSGabriel Fernandez 
126028c10f9eSGabriel Fernandez 	err = clk_stm32_parse_fdt_by_name(fdt, node, "st,kerclk",
126128c10f9eSGabriel Fernandez 					  pdata->kernelclk,
126228c10f9eSGabriel Fernandez 					  &pdata->nkernelclk);
126328c10f9eSGabriel Fernandez 	if (err != 0)
126428c10f9eSGabriel Fernandez 		return err;
126528c10f9eSGabriel Fernandez 
126628c10f9eSGabriel Fernandez 	pdata->c1msrd = fdt_read_uint32_default(fdt, node, "st,c1msrd", 0);
126728c10f9eSGabriel Fernandez 
126828c10f9eSGabriel Fernandez 	if (fdt_getprop(fdt, node, "st,safe_rst", NULL))
126928c10f9eSGabriel Fernandez 		pdata->safe_rst = true;
127028c10f9eSGabriel Fernandez 
127128c10f9eSGabriel Fernandez 	pdata->rcc_base = stm32_rcc_base();
127228c10f9eSGabriel Fernandez 
1273b5f8fc36SGatien Chevallier 	cuint = fdt_getprop(fdt, node, "st,protreg", &lenp);
1274b5f8fc36SGatien Chevallier 	if (lenp < 0) {
1275b5f8fc36SGatien Chevallier 		if (lenp != -FDT_ERR_NOTFOUND)
1276b5f8fc36SGatien Chevallier 			return lenp;
1277b5f8fc36SGatien Chevallier 
1278b5f8fc36SGatien Chevallier 		lenp = 0;
1279b5f8fc36SGatien Chevallier 		DMSG("No RIF configuration available");
1280b5f8fc36SGatien Chevallier 	}
1281b5f8fc36SGatien Chevallier 
1282b5f8fc36SGatien Chevallier 	pdata->nb_res = (unsigned int)(lenp / sizeof(uint32_t));
1283b5f8fc36SGatien Chevallier 
1284b5f8fc36SGatien Chevallier 	assert(pdata->nb_res <= RCC_NB_RIF_RES);
1285b5f8fc36SGatien Chevallier 
1286b5f8fc36SGatien Chevallier 	pdata->conf_data.cid_confs = calloc(RCC_NB_RIF_RES, sizeof(uint32_t));
1287b5f8fc36SGatien Chevallier 	pdata->conf_data.sec_conf = calloc(RCC_NB_CONFS, sizeof(uint32_t));
1288b5f8fc36SGatien Chevallier 	pdata->conf_data.priv_conf = calloc(RCC_NB_CONFS, sizeof(uint32_t));
1289b5f8fc36SGatien Chevallier 	pdata->conf_data.lock_conf = calloc(RCC_NB_CONFS, sizeof(uint32_t));
1290b5f8fc36SGatien Chevallier 	pdata->conf_data.access_mask = calloc(RCC_NB_CONFS, sizeof(uint32_t));
1291b5f8fc36SGatien Chevallier 	if (!pdata->conf_data.cid_confs || !pdata->conf_data.sec_conf ||
1292b5f8fc36SGatien Chevallier 	    !pdata->conf_data.priv_conf || !pdata->conf_data.access_mask ||
1293b5f8fc36SGatien Chevallier 	    !pdata->conf_data.lock_conf)
1294b5f8fc36SGatien Chevallier 		panic("Missing memory capacity for RCC RIF configuration");
1295b5f8fc36SGatien Chevallier 
1296b5f8fc36SGatien Chevallier 	for (i = 0; i < pdata->nb_res; i++)
1297b5f8fc36SGatien Chevallier 		stm32_rif_parse_cfg(fdt32_to_cpu(cuint[i]), &pdata->conf_data,
1298b5f8fc36SGatien Chevallier 				    RCC_NB_RIF_RES);
1299b5f8fc36SGatien Chevallier 
130028c10f9eSGabriel Fernandez 	return 0;
130128c10f9eSGabriel Fernandez }
130228c10f9eSGabriel Fernandez 
130328c10f9eSGabriel Fernandez static void stm32mp2_a35_ss_on_hsi(void)
130428c10f9eSGabriel Fernandez {
130528c10f9eSGabriel Fernandez 	uint64_t timeout = 0;
130628c10f9eSGabriel Fernandez 
130728c10f9eSGabriel Fernandez 	/* Nothing to do if clock source is already set on bypass clock */
130828c10f9eSGabriel Fernandez 	if (stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) &
130928c10f9eSGabriel Fernandez 	    A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK)
131028c10f9eSGabriel Fernandez 		return;
131128c10f9eSGabriel Fernandez 
131228c10f9eSGabriel Fernandez 	stm32mp_syscfg_write(A35SS_SSC_CHGCLKREQ,
131328c10f9eSGabriel Fernandez 			     A35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ_EN,
131428c10f9eSGabriel Fernandez 			     A35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ_MASK);
131528c10f9eSGabriel Fernandez 
131628c10f9eSGabriel Fernandez 	timeout = timeout_init_us(CLKSRC_TIMEOUT);
131728c10f9eSGabriel Fernandez 	while (!timeout_elapsed(timeout))
131828c10f9eSGabriel Fernandez 		if (stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) &
131928c10f9eSGabriel Fernandez 		    A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK)
132028c10f9eSGabriel Fernandez 			break;
132128c10f9eSGabriel Fernandez 
132228c10f9eSGabriel Fernandez 	if (!(stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) &
132328c10f9eSGabriel Fernandez 	      A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK))
132428c10f9eSGabriel Fernandez 		panic("Cannot switch A35 to bypass clock");
132528c10f9eSGabriel Fernandez 
132628c10f9eSGabriel Fernandez 	stm32mp_syscfg_write(A35SS_SSC_PLL_EN,
132728c10f9eSGabriel Fernandez 			     0,
132828c10f9eSGabriel Fernandez 			     A35SS_SSC_PLL_ENABLE_NRESET_SWPLL_FF_MASK);
132928c10f9eSGabriel Fernandez }
133028c10f9eSGabriel Fernandez 
133128c10f9eSGabriel Fernandez static void stm32mp2_clk_xbar_on_hsi(struct clk_stm32_priv *priv)
133228c10f9eSGabriel Fernandez {
133328c10f9eSGabriel Fernandez 	uintptr_t xbar0cfgr = priv->base + RCC_XBAR0CFGR;
133428c10f9eSGabriel Fernandez 	uint32_t i = 0;
133528c10f9eSGabriel Fernandez 
133628c10f9eSGabriel Fernandez 	for (i = 0; i < XBAR_ROOT_CHANNEL_NB; i++)
133728c10f9eSGabriel Fernandez 		io_clrsetbits32(xbar0cfgr + (0x4 * i),
133828c10f9eSGabriel Fernandez 				RCC_XBAR0CFGR_XBAR0SEL_MASK, XBAR_SRC_HSI);
133928c10f9eSGabriel Fernandez }
134028c10f9eSGabriel Fernandez 
134128c10f9eSGabriel Fernandez static int stm32mp2_a35_pll1_start(void)
134228c10f9eSGabriel Fernandez {
134328c10f9eSGabriel Fernandez 	uint64_t timeout = 0;
134428c10f9eSGabriel Fernandez 
134528c10f9eSGabriel Fernandez 	stm32mp_syscfg_write(A35SS_SSC_PLL_EN,
134628c10f9eSGabriel Fernandez 			     A35SS_SSC_PLL_ENABLE_PD_EN,
134728c10f9eSGabriel Fernandez 			     A35SS_SSC_PLL_ENABLE_PD_EN);
134828c10f9eSGabriel Fernandez 
134928c10f9eSGabriel Fernandez 	/* Wait PLL lock */
135028c10f9eSGabriel Fernandez 	timeout = timeout_init_us(PLLRDY_TIMEOUT);
135128c10f9eSGabriel Fernandez 	while (!timeout_elapsed(timeout))
135228c10f9eSGabriel Fernandez 		if (stm32mp_syscfg_read(A35SS_SSC_PLL_EN) &
135328c10f9eSGabriel Fernandez 		    A35SS_SSC_PLL_ENABLE_LOCKP_MASK)
135428c10f9eSGabriel Fernandez 			break;
135528c10f9eSGabriel Fernandez 
135628c10f9eSGabriel Fernandez 	if (!(stm32mp_syscfg_read(A35SS_SSC_PLL_EN) &
135728c10f9eSGabriel Fernandez 	      A35SS_SSC_PLL_ENABLE_LOCKP_MASK)) {
135828c10f9eSGabriel Fernandez 		EMSG("PLL1 not locked");
135928c10f9eSGabriel Fernandez 		return -1;
136028c10f9eSGabriel Fernandez 	}
136128c10f9eSGabriel Fernandez 
136228c10f9eSGabriel Fernandez 	/* De-assert reset on PLL output clock path */
136328c10f9eSGabriel Fernandez 	stm32mp_syscfg_write(A35SS_SSC_PLL_EN,
136428c10f9eSGabriel Fernandez 			     A35SS_SSC_PLL_ENABLE_NRESET_SWPLL_FF_EN,
136528c10f9eSGabriel Fernandez 			     A35SS_SSC_PLL_ENABLE_NRESET_SWPLL_FF_MASK);
136628c10f9eSGabriel Fernandez 
136728c10f9eSGabriel Fernandez 	/* Switch CPU clock to PLL clock */
136828c10f9eSGabriel Fernandez 	stm32mp_syscfg_write(A35SS_SSC_CHGCLKREQ,
136928c10f9eSGabriel Fernandez 			     0,
137028c10f9eSGabriel Fernandez 			     A35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ_MASK);
137128c10f9eSGabriel Fernandez 
137228c10f9eSGabriel Fernandez 	/* Wait for clock change acknowledge */
137328c10f9eSGabriel Fernandez 	timeout = timeout_init_us(CLKSRC_TIMEOUT);
137428c10f9eSGabriel Fernandez 	while (!timeout_elapsed(timeout))
137528c10f9eSGabriel Fernandez 		if (!(stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) &
137628c10f9eSGabriel Fernandez 		      A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK))
137728c10f9eSGabriel Fernandez 			break;
137828c10f9eSGabriel Fernandez 
137928c10f9eSGabriel Fernandez 	if (stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) &
138028c10f9eSGabriel Fernandez 	    A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) {
138128c10f9eSGabriel Fernandez 		EMSG("A35 switch to PLL1 failed");
138228c10f9eSGabriel Fernandez 		return -1;
138328c10f9eSGabriel Fernandez 	}
138428c10f9eSGabriel Fernandez 
138528c10f9eSGabriel Fernandez 	return 0;
138628c10f9eSGabriel Fernandez }
138728c10f9eSGabriel Fernandez 
138828c10f9eSGabriel Fernandez static void stm32mp2_a35_pll1_config(uint32_t fbdiv, uint32_t refdiv,
138928c10f9eSGabriel Fernandez 				     uint32_t postdiv1, uint32_t postdiv2)
139028c10f9eSGabriel Fernandez {
139128c10f9eSGabriel Fernandez 	stm32mp_syscfg_write(A35SS_SSC_PLL_FREQ1,
139228c10f9eSGabriel Fernandez 			     SHIFT_U32(refdiv,
139328c10f9eSGabriel Fernandez 				       A35SS_SSC_PLL_FREQ1_REFDIV_SHIFT) |
139428c10f9eSGabriel Fernandez 			     SHIFT_U32(fbdiv, A35SS_SSC_PLL_FREQ1_FBDIV_SHIFT),
139528c10f9eSGabriel Fernandez 			     A35SS_SSC_PLL_FREQ1_MASK);
139628c10f9eSGabriel Fernandez 
139728c10f9eSGabriel Fernandez 	stm32mp_syscfg_write(A35SS_SSC_PLL_FREQ2,
139828c10f9eSGabriel Fernandez 			     SHIFT_U32(postdiv1,
139928c10f9eSGabriel Fernandez 				       A35SS_SSC_PLL_FREQ2_POSTDIV1_SHIFT) |
140028c10f9eSGabriel Fernandez 			     SHIFT_U32(postdiv2,
140128c10f9eSGabriel Fernandez 				       A35SS_SSC_PLL_FREQ2_POSTDIV2_SHIFT),
140228c10f9eSGabriel Fernandez 			     A35SS_SSC_PLL_FREQ2_MASK);
140328c10f9eSGabriel Fernandez }
140428c10f9eSGabriel Fernandez 
140528c10f9eSGabriel Fernandez static void clk_stm32_pll_config_output(struct clk_stm32_priv *priv,
140628c10f9eSGabriel Fernandez 					const struct stm32_clk_pll *pll,
140728c10f9eSGabriel Fernandez 					uint32_t pllsrc,
140828c10f9eSGabriel Fernandez 					uint32_t *pllcfg,
140928c10f9eSGabriel Fernandez 					uint32_t fracv)
141028c10f9eSGabriel Fernandez {
141128c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1;
141228c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr2 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR2;
141328c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3;
141428c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4;
141528c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr6 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR6;
141628c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr7 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR7;
141728c10f9eSGabriel Fernandez 	int sel = (pllsrc & MUX_SEL_MASK) >> MUX_SEL_SHIFT;
141828c10f9eSGabriel Fernandez 	unsigned long refclk = clk_stm32_pll_get_oscillator_rate(sel);
141928c10f9eSGabriel Fernandez 
142028c10f9eSGabriel Fernandez 	if (fracv == 0) {
142128c10f9eSGabriel Fernandez 		/* PLL in integer mode */
142228c10f9eSGabriel Fernandez 
142328c10f9eSGabriel Fernandez 		/*
142428c10f9eSGabriel Fernandez 		 * No need to check max clock, as oscillator reference clocks
142528c10f9eSGabriel Fernandez 		 * will always be less than 1.2GHz
142628c10f9eSGabriel Fernandez 		 */
142728c10f9eSGabriel Fernandez 		if (refclk < PLL_REFCLK_MIN)
142828c10f9eSGabriel Fernandez 			panic();
142928c10f9eSGabriel Fernandez 
143028c10f9eSGabriel Fernandez 		io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_FRACIN_MASK);
143128c10f9eSGabriel Fernandez 		io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN);
143228c10f9eSGabriel Fernandez 		io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_DACEN);
143328c10f9eSGabriel Fernandez 		io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS);
143428c10f9eSGabriel Fernandez 		io_setbits32(pllxcfgr1, RCC_PLLxCFGR1_SSMODRST);
143528c10f9eSGabriel Fernandez 	} else {
143628c10f9eSGabriel Fernandez 		/* PLL in frac mode */
143728c10f9eSGabriel Fernandez 
143828c10f9eSGabriel Fernandez 		/*
143928c10f9eSGabriel Fernandez 		 * No need to check max clock, as oscillator reference clocks
144028c10f9eSGabriel Fernandez 		 * will always be less than 1.2GHz
144128c10f9eSGabriel Fernandez 		 */
144228c10f9eSGabriel Fernandez 		if (refclk < PLL_FRAC_REFCLK_MIN)
144328c10f9eSGabriel Fernandez 			panic();
144428c10f9eSGabriel Fernandez 
144528c10f9eSGabriel Fernandez 		io_clrsetbits32(pllxcfgr3, RCC_PLLxCFGR3_FRACIN_MASK,
144628c10f9eSGabriel Fernandez 				fracv & RCC_PLLxCFGR3_FRACIN_MASK);
144728c10f9eSGabriel Fernandez 		io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS);
144828c10f9eSGabriel Fernandez 		io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN);
144928c10f9eSGabriel Fernandez 	}
145028c10f9eSGabriel Fernandez 
145128c10f9eSGabriel Fernandez 	assert(pllcfg[REFDIV]);
145228c10f9eSGabriel Fernandez 
145328c10f9eSGabriel Fernandez 	io_clrsetbits32(pllxcfgr2, RCC_PLLxCFGR2_FBDIV_MASK,
145428c10f9eSGabriel Fernandez 			SHIFT_U32(pllcfg[FBDIV], RCC_PLLxCFGR2_FBDIV_SHIFT) &
145528c10f9eSGabriel Fernandez 			RCC_PLLxCFGR2_FBDIV_MASK);
145628c10f9eSGabriel Fernandez 	io_clrsetbits32(pllxcfgr2, RCC_PLLxCFGR2_FREFDIV_MASK,
145728c10f9eSGabriel Fernandez 			pllcfg[REFDIV] & RCC_PLLxCFGR2_FREFDIV_MASK);
145828c10f9eSGabriel Fernandez 	io_clrsetbits32(pllxcfgr6, RCC_PLLxCFGR6_POSTDIV1_MASK,
145928c10f9eSGabriel Fernandez 			pllcfg[POSTDIV1] & RCC_PLLxCFGR6_POSTDIV1_MASK);
146028c10f9eSGabriel Fernandez 	io_clrsetbits32(pllxcfgr7, RCC_PLLxCFGR7_POSTDIV2_MASK,
146128c10f9eSGabriel Fernandez 			pllcfg[POSTDIV2] & RCC_PLLxCFGR7_POSTDIV2_MASK);
146228c10f9eSGabriel Fernandez 
146328c10f9eSGabriel Fernandez 	if (pllcfg[POSTDIV1] == 0 || pllcfg[POSTDIV2] == 0) {
146428c10f9eSGabriel Fernandez 		/* Bypass mode */
146528c10f9eSGabriel Fernandez 		io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_BYPASS);
146628c10f9eSGabriel Fernandez 		io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_FOUTPOSTDIVEN);
146728c10f9eSGabriel Fernandez 	} else {
146828c10f9eSGabriel Fernandez 		io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_BYPASS);
146928c10f9eSGabriel Fernandez 		io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_FOUTPOSTDIVEN);
147028c10f9eSGabriel Fernandez 	}
147128c10f9eSGabriel Fernandez }
147228c10f9eSGabriel Fernandez 
147328c10f9eSGabriel Fernandez static void clk_stm32_pll_config_csg(struct clk_stm32_priv *priv,
147428c10f9eSGabriel Fernandez 				     const struct stm32_clk_pll *pll,
147528c10f9eSGabriel Fernandez 				     uint32_t *csg)
147628c10f9eSGabriel Fernandez {
147728c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1;
147828c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3;
147928c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4;
148028c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr5 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR5;
148128c10f9eSGabriel Fernandez 
148228c10f9eSGabriel Fernandez 	io_clrsetbits32(pllxcfgr5, RCC_PLLxCFGR5_DIVVAL_MASK,
148328c10f9eSGabriel Fernandez 			csg[DIVVAL] & RCC_PLLxCFGR5_DIVVAL_MASK);
148428c10f9eSGabriel Fernandez 	io_clrsetbits32(pllxcfgr5, RCC_PLLxCFGR5_SPREAD_MASK,
148528c10f9eSGabriel Fernandez 			SHIFT_U32(csg[SPREAD], RCC_PLLxCFGR5_SPREAD_SHIFT) &
148628c10f9eSGabriel Fernandez 			RCC_PLLxCFGR5_SPREAD_MASK);
148728c10f9eSGabriel Fernandez 
148828c10f9eSGabriel Fernandez 	if (csg[DOWNSPREAD] != 0)
148928c10f9eSGabriel Fernandez 		io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_DOWNSPREAD);
149028c10f9eSGabriel Fernandez 	else
149128c10f9eSGabriel Fernandez 		io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_DOWNSPREAD);
149228c10f9eSGabriel Fernandez 
149328c10f9eSGabriel Fernandez 	io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS);
149428c10f9eSGabriel Fernandez 
149528c10f9eSGabriel Fernandez 	io_clrbits32(pllxcfgr1, RCC_PLLxCFGR1_PLLEN);
149628c10f9eSGabriel Fernandez 	udelay(1);
149728c10f9eSGabriel Fernandez 
149828c10f9eSGabriel Fernandez 	io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN);
149928c10f9eSGabriel Fernandez 	io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_DACEN);
150028c10f9eSGabriel Fernandez }
150128c10f9eSGabriel Fernandez 
150228c10f9eSGabriel Fernandez static struct stm32_pll_dt_cfg *clk_stm32_pll_get_pdata(unsigned int pll_idx)
150328c10f9eSGabriel Fernandez {
150428c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
150528c10f9eSGabriel Fernandez 	struct stm32_clk_platdata *pdata = priv->pdata;
150628c10f9eSGabriel Fernandez 
150728c10f9eSGabriel Fernandez 	assert(pll_idx < pdata->npll);
150828c10f9eSGabriel Fernandez 
150928c10f9eSGabriel Fernandez 	return &pdata->pll[pll_idx];
151028c10f9eSGabriel Fernandez }
151128c10f9eSGabriel Fernandez 
151228c10f9eSGabriel Fernandez static int clk_stm32_pll_set_mux(struct clk_stm32_priv *priv __unused,
151328c10f9eSGabriel Fernandez 				 uint32_t src)
151428c10f9eSGabriel Fernandez {
151528c10f9eSGabriel Fernandez 	int mux = (src & MUX_ID_MASK) >> MUX_ID_SHIFT;
151628c10f9eSGabriel Fernandez 	int sel = (src & MUX_SEL_MASK) >> MUX_SEL_SHIFT;
151728c10f9eSGabriel Fernandez 
15186efa483fSEtienne Carriere 	if (stm32_mux_set_parent(mux, sel))
15196efa483fSEtienne Carriere 		return -1;
15206efa483fSEtienne Carriere 	else
15216efa483fSEtienne Carriere 		return 0;
15226efa483fSEtienne Carriere 
152328c10f9eSGabriel Fernandez }
152428c10f9eSGabriel Fernandez 
152528c10f9eSGabriel Fernandez static void clk_stm32_pll1_init(struct clk_stm32_priv *priv,
152628c10f9eSGabriel Fernandez 				int pll_idx __unused,
152728c10f9eSGabriel Fernandez 				struct stm32_pll_dt_cfg *pll_conf)
152828c10f9eSGabriel Fernandez {
152928c10f9eSGabriel Fernandez 	int sel = (pll_conf->src & MUX_SEL_MASK) >> MUX_SEL_SHIFT;
153028c10f9eSGabriel Fernandez 	unsigned long refclk = 0;
153128c10f9eSGabriel Fernandez 
153228c10f9eSGabriel Fernandez 	/*
153328c10f9eSGabriel Fernandez 	 * TODO: check if pll has already good parameters or if we could make
153428c10f9eSGabriel Fernandez 	 * a configuration on the fly.
153528c10f9eSGabriel Fernandez 	 */
153628c10f9eSGabriel Fernandez 
153728c10f9eSGabriel Fernandez 	stm32mp2_a35_ss_on_hsi();
153828c10f9eSGabriel Fernandez 
153928c10f9eSGabriel Fernandez 	if (clk_stm32_pll_set_mux(priv, pll_conf->src))
154028c10f9eSGabriel Fernandez 		panic();
154128c10f9eSGabriel Fernandez 
154228c10f9eSGabriel Fernandez 	refclk = clk_stm32_pll_get_oscillator_rate(sel);
154328c10f9eSGabriel Fernandez 
154428c10f9eSGabriel Fernandez 	/*
154528c10f9eSGabriel Fernandez 	 * No need to check max clock, as oscillator reference clocks will
154628c10f9eSGabriel Fernandez 	 * always be less than 1.2GHz
154728c10f9eSGabriel Fernandez 	 */
154828c10f9eSGabriel Fernandez 	if (refclk < PLL_REFCLK_MIN)
154928c10f9eSGabriel Fernandez 		panic();
155028c10f9eSGabriel Fernandez 
155128c10f9eSGabriel Fernandez 	stm32mp2_a35_pll1_config(pll_conf->cfg[FBDIV],
155228c10f9eSGabriel Fernandez 				 pll_conf->cfg[REFDIV],
155328c10f9eSGabriel Fernandez 				 pll_conf->cfg[POSTDIV1],
155428c10f9eSGabriel Fernandez 				 pll_conf->cfg[POSTDIV2]);
155528c10f9eSGabriel Fernandez 
155628c10f9eSGabriel Fernandez 	if (stm32mp2_a35_pll1_start())
155728c10f9eSGabriel Fernandez 		panic();
155828c10f9eSGabriel Fernandez }
155928c10f9eSGabriel Fernandez 
156028c10f9eSGabriel Fernandez static void clk_stm32_pll_init(struct clk_stm32_priv *priv, int pll_idx,
156128c10f9eSGabriel Fernandez 			       struct stm32_pll_dt_cfg *pll_conf)
156228c10f9eSGabriel Fernandez {
156328c10f9eSGabriel Fernandez 	const struct stm32_clk_pll *pll = clk_stm32_pll_data(pll_idx);
156428c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1;
156528c10f9eSGabriel Fernandez 	bool spread_spectrum = false;
156628c10f9eSGabriel Fernandez 
156728c10f9eSGabriel Fernandez 	/*
156828c10f9eSGabriel Fernandez 	 * TODO: check if pll has already good parameters or if we could make
156928c10f9eSGabriel Fernandez 	 * a configuration on the fly.
157028c10f9eSGabriel Fernandez 	 */
157128c10f9eSGabriel Fernandez 
15722604f62dSEtienne Carriere 	if (stm32_gate_rdy_disable(pll->gate_id))
15732604f62dSEtienne Carriere 		panic();
157428c10f9eSGabriel Fernandez 
157528c10f9eSGabriel Fernandez 	if (clk_stm32_pll_set_mux(priv, pll_conf->src))
157628c10f9eSGabriel Fernandez 		panic();
157728c10f9eSGabriel Fernandez 
157828c10f9eSGabriel Fernandez 	clk_stm32_pll_config_output(priv, pll, pll_conf->src,
157928c10f9eSGabriel Fernandez 				    pll_conf->cfg, pll_conf->frac);
158028c10f9eSGabriel Fernandez 
158128c10f9eSGabriel Fernandez 	if (pll_conf->csg_enabled) {
158228c10f9eSGabriel Fernandez 		clk_stm32_pll_config_csg(priv, pll, pll_conf->csg);
158328c10f9eSGabriel Fernandez 		spread_spectrum = true;
158428c10f9eSGabriel Fernandez 	}
158528c10f9eSGabriel Fernandez 
15862604f62dSEtienne Carriere 	if (stm32_gate_rdy_enable(pll->gate_id))
15872604f62dSEtienne Carriere 		panic();
158828c10f9eSGabriel Fernandez 
158928c10f9eSGabriel Fernandez 	if (spread_spectrum)
159028c10f9eSGabriel Fernandez 		io_clrbits32(pllxcfgr1, RCC_PLLxCFGR1_SSMODRST);
159128c10f9eSGabriel Fernandez }
159228c10f9eSGabriel Fernandez 
159328c10f9eSGabriel Fernandez static int stm32_clk_pll_configure(struct clk_stm32_priv *priv)
159428c10f9eSGabriel Fernandez {
159528c10f9eSGabriel Fernandez 	struct stm32_pll_dt_cfg *pll_conf = NULL;
159628c10f9eSGabriel Fernandez 	size_t i = 0;
159728c10f9eSGabriel Fernandez 
159828c10f9eSGabriel Fernandez 	for (i = 0; i < PLL_NB; i++) {
159928c10f9eSGabriel Fernandez 		pll_conf = clk_stm32_pll_get_pdata(i);
160028c10f9eSGabriel Fernandez 
160128c10f9eSGabriel Fernandez 		if (pll_conf->enabled) {
160228c10f9eSGabriel Fernandez 			/* Skip the pll3 (need GPU regulator to configure) */
160328c10f9eSGabriel Fernandez 			if (i == PLL3_ID)
160428c10f9eSGabriel Fernandez 				continue;
160528c10f9eSGabriel Fernandez 
160628c10f9eSGabriel Fernandez 			/* Skip the pll2 (reserved to DDR) */
160728c10f9eSGabriel Fernandez 			if (i == PLL2_ID)
160828c10f9eSGabriel Fernandez 				continue;
160928c10f9eSGabriel Fernandez 
161028c10f9eSGabriel Fernandez 			if (i == PLL1_ID)
161128c10f9eSGabriel Fernandez 				clk_stm32_pll1_init(priv, i, pll_conf);
161228c10f9eSGabriel Fernandez 			else
161328c10f9eSGabriel Fernandez 				clk_stm32_pll_init(priv, i, pll_conf);
161428c10f9eSGabriel Fernandez 		}
161528c10f9eSGabriel Fernandez 	}
161628c10f9eSGabriel Fernandez 
161728c10f9eSGabriel Fernandez 	return 0;
161828c10f9eSGabriel Fernandez }
161928c10f9eSGabriel Fernandez 
162028c10f9eSGabriel Fernandez #define __WORD_BIT 32
162128c10f9eSGabriel Fernandez 
162228c10f9eSGabriel Fernandez static int wait_predivsr(uint16_t channel)
162328c10f9eSGabriel Fernandez {
162428c10f9eSGabriel Fernandez 	uintptr_t rcc_base = stm32_rcc_base();
162528c10f9eSGabriel Fernandez 	uintptr_t previvsr = 0;
162628c10f9eSGabriel Fernandez 	uint32_t channel_bit = 0;
162728c10f9eSGabriel Fernandez 	uint32_t value = 0;
162828c10f9eSGabriel Fernandez 
162928c10f9eSGabriel Fernandez 	if (channel < __WORD_BIT) {
163028c10f9eSGabriel Fernandez 		previvsr = rcc_base + RCC_PREDIVSR1;
163128c10f9eSGabriel Fernandez 		channel_bit = BIT(channel);
163228c10f9eSGabriel Fernandez 	} else {
163328c10f9eSGabriel Fernandez 		previvsr = rcc_base + RCC_PREDIVSR2;
163428c10f9eSGabriel Fernandez 		channel_bit = BIT(channel - __WORD_BIT);
163528c10f9eSGabriel Fernandez 	}
163628c10f9eSGabriel Fernandez 
163728c10f9eSGabriel Fernandez 	if (IO_READ32_POLL_TIMEOUT(previvsr, value, !(value & channel_bit), 0,
163828c10f9eSGabriel Fernandez 				   CLKDIV_TIMEOUT)) {
163928c10f9eSGabriel Fernandez 		EMSG("Pre divider status: %#"PRIx32, io_read32(previvsr));
164028c10f9eSGabriel Fernandez 		return -1;
164128c10f9eSGabriel Fernandez 	}
164228c10f9eSGabriel Fernandez 
164328c10f9eSGabriel Fernandez 	return 0;
164428c10f9eSGabriel Fernandez }
164528c10f9eSGabriel Fernandez 
164628c10f9eSGabriel Fernandez static int wait_findivsr(uint16_t channel)
164728c10f9eSGabriel Fernandez {
164828c10f9eSGabriel Fernandez 	uintptr_t rcc_base = stm32_rcc_base();
164928c10f9eSGabriel Fernandez 	uintptr_t finvivsr = 0;
165028c10f9eSGabriel Fernandez 	uint32_t channel_bit = 0;
165128c10f9eSGabriel Fernandez 	uint32_t value = 0;
165228c10f9eSGabriel Fernandez 
165328c10f9eSGabriel Fernandez 	if (channel < __WORD_BIT) {
165428c10f9eSGabriel Fernandez 		finvivsr = rcc_base + RCC_FINDIVSR1;
165528c10f9eSGabriel Fernandez 		channel_bit = BIT(channel);
165628c10f9eSGabriel Fernandez 	} else {
165728c10f9eSGabriel Fernandez 		finvivsr = rcc_base + RCC_FINDIVSR2;
165828c10f9eSGabriel Fernandez 		channel_bit = BIT(channel - __WORD_BIT);
165928c10f9eSGabriel Fernandez 	}
166028c10f9eSGabriel Fernandez 
166128c10f9eSGabriel Fernandez 	if (IO_READ32_POLL_TIMEOUT(finvivsr, value, !(value & channel_bit), 0,
166228c10f9eSGabriel Fernandez 				   CLKDIV_TIMEOUT)) {
166328c10f9eSGabriel Fernandez 		EMSG("Final divider status: %#"PRIx32, io_read32(finvivsr));
166428c10f9eSGabriel Fernandez 		return -1;
166528c10f9eSGabriel Fernandez 	}
166628c10f9eSGabriel Fernandez 
166728c10f9eSGabriel Fernandez 	return 0;
166828c10f9eSGabriel Fernandez }
166928c10f9eSGabriel Fernandez 
167028c10f9eSGabriel Fernandez static int wait_xbar_sts(uint16_t channel)
167128c10f9eSGabriel Fernandez {
167228c10f9eSGabriel Fernandez 	uintptr_t rcc_base = stm32_rcc_base();
167328c10f9eSGabriel Fernandez 	uintptr_t xbar_cfgr = rcc_base + RCC_XBAR0CFGR + (0x4 * channel);
167428c10f9eSGabriel Fernandez 	uint32_t value = 0;
167528c10f9eSGabriel Fernandez 
167628c10f9eSGabriel Fernandez 	if (IO_READ32_POLL_TIMEOUT(xbar_cfgr, value,
167728c10f9eSGabriel Fernandez 				   !(value & RCC_XBAR0CFGR_XBAR0STS), 0,
167828c10f9eSGabriel Fernandez 				   CLKDIV_TIMEOUT)) {
167928c10f9eSGabriel Fernandez 		EMSG("XBAR%"PRIu16"CFGR: %#"PRIx32, channel,
168028c10f9eSGabriel Fernandez 		     io_read32(xbar_cfgr));
168128c10f9eSGabriel Fernandez 		return -1;
168228c10f9eSGabriel Fernandez 	}
168328c10f9eSGabriel Fernandez 
168428c10f9eSGabriel Fernandez 	return 0;
168528c10f9eSGabriel Fernandez }
168628c10f9eSGabriel Fernandez 
1687*1f2e0a3fSGatien Chevallier static TEE_Result flexclkgen_search_config(uint16_t channel,
1688*1f2e0a3fSGatien Chevallier 					   unsigned int *clk_src,
1689*1f2e0a3fSGatien Chevallier 					   unsigned int *prediv,
1690*1f2e0a3fSGatien Chevallier 					   unsigned int *findiv)
1691*1f2e0a3fSGatien Chevallier {
1692*1f2e0a3fSGatien Chevallier 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
1693*1f2e0a3fSGatien Chevallier 	struct stm32_clk_platdata *pdata = priv->pdata;
1694*1f2e0a3fSGatien Chevallier 	unsigned int flex_id = U(0);
1695*1f2e0a3fSGatien Chevallier 	uint32_t dt_cfg = U(0);
1696*1f2e0a3fSGatien Chevallier 	uint32_t i = U(0);
1697*1f2e0a3fSGatien Chevallier 
1698*1f2e0a3fSGatien Chevallier 	assert(clk_src && prediv && findiv);
1699*1f2e0a3fSGatien Chevallier 
1700*1f2e0a3fSGatien Chevallier 	/*
1701*1f2e0a3fSGatien Chevallier 	 * pdata->flexgen is the array of all the flexgen configuration from
1702*1f2e0a3fSGatien Chevallier 	 * the device tree.
1703*1f2e0a3fSGatien Chevallier 	 * The binding does not enforce the description of all flexgen nor
1704*1f2e0a3fSGatien Chevallier 	 * the order it which they are listed.
1705*1f2e0a3fSGatien Chevallier 	 */
1706*1f2e0a3fSGatien Chevallier 	for (i = 0; i < pdata->nflexgen; i++) {
1707*1f2e0a3fSGatien Chevallier 		dt_cfg = pdata->flexgen[i];
1708*1f2e0a3fSGatien Chevallier 
1709*1f2e0a3fSGatien Chevallier 		flex_id = (dt_cfg & FLEX_ID_MASK) >> FLEX_ID_SHIFT;
1710*1f2e0a3fSGatien Chevallier 		if (flex_id == channel) {
1711*1f2e0a3fSGatien Chevallier 			*clk_src = (dt_cfg & FLEX_SEL_MASK) >> FLEX_SEL_SHIFT;
1712*1f2e0a3fSGatien Chevallier 			*prediv = (dt_cfg & FLEX_PDIV_MASK) >> FLEX_PDIV_SHIFT;
1713*1f2e0a3fSGatien Chevallier 			*findiv = (dt_cfg & FLEX_FDIV_MASK) >> FLEX_FDIV_SHIFT;
1714*1f2e0a3fSGatien Chevallier 
1715*1f2e0a3fSGatien Chevallier 			return TEE_SUCCESS;
1716*1f2e0a3fSGatien Chevallier 		}
1717*1f2e0a3fSGatien Chevallier 	}
1718*1f2e0a3fSGatien Chevallier 
1719*1f2e0a3fSGatien Chevallier 	return TEE_ERROR_ITEM_NOT_FOUND;
1720*1f2e0a3fSGatien Chevallier }
1721*1f2e0a3fSGatien Chevallier 
172228c10f9eSGabriel Fernandez static void flexclkgen_config_channel(uint16_t channel, unsigned int clk_src,
172328c10f9eSGabriel Fernandez 				      unsigned int prediv, unsigned int findiv)
172428c10f9eSGabriel Fernandez {
172528c10f9eSGabriel Fernandez 	uintptr_t rcc_base = stm32_rcc_base();
172628c10f9eSGabriel Fernandez 
172728c10f9eSGabriel Fernandez 	if (wait_predivsr(channel) != 0)
172828c10f9eSGabriel Fernandez 		panic();
172928c10f9eSGabriel Fernandez 
173028c10f9eSGabriel Fernandez 	io_clrsetbits32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel),
173128c10f9eSGabriel Fernandez 			RCC_PREDIV0CFGR_PREDIV0_MASK, prediv);
173228c10f9eSGabriel Fernandez 
173328c10f9eSGabriel Fernandez 	if (wait_predivsr(channel) != 0)
173428c10f9eSGabriel Fernandez 		panic();
173528c10f9eSGabriel Fernandez 
173628c10f9eSGabriel Fernandez 	if (wait_findivsr(channel) != 0)
173728c10f9eSGabriel Fernandez 		panic();
173828c10f9eSGabriel Fernandez 
173928c10f9eSGabriel Fernandez 	io_clrsetbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel),
174028c10f9eSGabriel Fernandez 			RCC_FINDIV0CFGR_FINDIV0_MASK,
174128c10f9eSGabriel Fernandez 			findiv);
174228c10f9eSGabriel Fernandez 
174328c10f9eSGabriel Fernandez 	if (wait_findivsr(channel) != 0)
174428c10f9eSGabriel Fernandez 		panic();
174528c10f9eSGabriel Fernandez 
174628c10f9eSGabriel Fernandez 	if (wait_xbar_sts(channel) != 0)
174728c10f9eSGabriel Fernandez 		panic();
174828c10f9eSGabriel Fernandez 
174928c10f9eSGabriel Fernandez 	io_clrsetbits32(rcc_base + RCC_XBAR0CFGR + (0x4 * channel),
175028c10f9eSGabriel Fernandez 			RCC_XBAR0CFGR_XBAR0SEL_MASK,
175128c10f9eSGabriel Fernandez 			clk_src);
175228c10f9eSGabriel Fernandez 
175328c10f9eSGabriel Fernandez 	io_setbits32(rcc_base + RCC_XBAR0CFGR + (0x4 * channel),
175428c10f9eSGabriel Fernandez 		     RCC_XBAR0CFGR_XBAR0EN);
175528c10f9eSGabriel Fernandez 
175628c10f9eSGabriel Fernandez 	if (wait_xbar_sts(channel) != 0)
175728c10f9eSGabriel Fernandez 		panic();
175828c10f9eSGabriel Fernandez }
175928c10f9eSGabriel Fernandez 
176028c10f9eSGabriel Fernandez static int stm32mp2_clk_flexgen_configure(struct clk_stm32_priv *priv)
176128c10f9eSGabriel Fernandez {
176228c10f9eSGabriel Fernandez 	struct stm32_clk_platdata *pdata = priv->pdata;
176328c10f9eSGabriel Fernandez 	uint32_t i = 0;
176428c10f9eSGabriel Fernandez 
176528c10f9eSGabriel Fernandez 	for (i = 0; i < pdata->nflexgen; i++) {
176628c10f9eSGabriel Fernandez 		uint32_t val = pdata->flexgen[i];
176728c10f9eSGabriel Fernandez 		uint32_t cmd = 0;
176828c10f9eSGabriel Fernandez 		uint32_t cmd_data = 0;
176928c10f9eSGabriel Fernandez 		unsigned int channel = 0;
177028c10f9eSGabriel Fernandez 		unsigned int clk_src = 0;
177128c10f9eSGabriel Fernandez 		unsigned int pdiv = 0;
177228c10f9eSGabriel Fernandez 		unsigned int fdiv = 0;
177328c10f9eSGabriel Fernandez 
177428c10f9eSGabriel Fernandez 		cmd = (val & CMD_MASK) >> CMD_SHIFT;
177528c10f9eSGabriel Fernandez 		cmd_data = val & ~CMD_MASK;
177628c10f9eSGabriel Fernandez 
177728c10f9eSGabriel Fernandez 		if (cmd != CMD_FLEXGEN)
177828c10f9eSGabriel Fernandez 			continue;
177928c10f9eSGabriel Fernandez 
178028c10f9eSGabriel Fernandez 		channel = (cmd_data & FLEX_ID_MASK) >> FLEX_ID_SHIFT;
178128c10f9eSGabriel Fernandez 
178228c10f9eSGabriel Fernandez 		/*
178328c10f9eSGabriel Fernandez 		 * Skip ck_ker_stgen configuration, will be done by
178428c10f9eSGabriel Fernandez 		 * stgen driver.
178528c10f9eSGabriel Fernandez 		 */
178628c10f9eSGabriel Fernandez 		if (channel == FLEX_STGEN)
178728c10f9eSGabriel Fernandez 			continue;
178828c10f9eSGabriel Fernandez 
178928c10f9eSGabriel Fernandez 		clk_src = (cmd_data & FLEX_SEL_MASK) >> FLEX_SEL_SHIFT;
179028c10f9eSGabriel Fernandez 		pdiv = (cmd_data & FLEX_PDIV_MASK) >> FLEX_PDIV_SHIFT;
179128c10f9eSGabriel Fernandez 		fdiv = (cmd_data & FLEX_FDIV_MASK) >> FLEX_FDIV_SHIFT;
179228c10f9eSGabriel Fernandez 
179328c10f9eSGabriel Fernandez 		flexclkgen_config_channel(channel, clk_src, pdiv, fdiv);
179428c10f9eSGabriel Fernandez 	}
179528c10f9eSGabriel Fernandez 
179628c10f9eSGabriel Fernandez 	return 0;
179728c10f9eSGabriel Fernandez }
179828c10f9eSGabriel Fernandez 
179928c10f9eSGabriel Fernandez static int stm32_clk_configure_div(struct clk_stm32_priv *priv __unused,
180028c10f9eSGabriel Fernandez 				   uint32_t data)
180128c10f9eSGabriel Fernandez {
180228c10f9eSGabriel Fernandez 	uint32_t div_id = 0;
180328c10f9eSGabriel Fernandez 	uint32_t div_n = 0;
180428c10f9eSGabriel Fernandez 
180528c10f9eSGabriel Fernandez 	div_id = (data & DIV_ID_MASK) >> DIV_ID_SHIFT;
180628c10f9eSGabriel Fernandez 	div_n = (data & DIV_DIVN_MASK) >> DIV_DIVN_SHIFT;
180728c10f9eSGabriel Fernandez 
180828c10f9eSGabriel Fernandez 	return stm32_div_set_value(div_id, div_n);
180928c10f9eSGabriel Fernandez }
181028c10f9eSGabriel Fernandez 
181128c10f9eSGabriel Fernandez static int stm32_clk_configure_mux(struct clk_stm32_priv *priv __unused,
181228c10f9eSGabriel Fernandez 				   uint32_t data)
181328c10f9eSGabriel Fernandez {
181428c10f9eSGabriel Fernandez 	int mux = (data & MUX_ID_MASK) >> MUX_ID_SHIFT;
181528c10f9eSGabriel Fernandez 	int sel = (data & MUX_SEL_MASK) >> MUX_SEL_SHIFT;
181628c10f9eSGabriel Fernandez 
18176efa483fSEtienne Carriere 	if (stm32_mux_set_parent(mux, sel))
18186efa483fSEtienne Carriere 		return -1;
18196efa483fSEtienne Carriere 	else
18206efa483fSEtienne Carriere 		return 0;
182128c10f9eSGabriel Fernandez }
182228c10f9eSGabriel Fernandez 
182328c10f9eSGabriel Fernandez static int stm32_clk_configure_by_addr_val(struct clk_stm32_priv *priv,
182428c10f9eSGabriel Fernandez 					   uint32_t data)
182528c10f9eSGabriel Fernandez {
182628c10f9eSGabriel Fernandez 	uint32_t addr = data >> CLK_ADDR_SHIFT;
182728c10f9eSGabriel Fernandez 	uint32_t val = data & CLK_ADDR_VAL_MASK;
182828c10f9eSGabriel Fernandez 
182928c10f9eSGabriel Fernandez 	io_setbits32(priv->base + addr, val);
183028c10f9eSGabriel Fernandez 
183128c10f9eSGabriel Fernandez 	return 0;
183228c10f9eSGabriel Fernandez }
183328c10f9eSGabriel Fernandez 
183428c10f9eSGabriel Fernandez static void stm32_clk_configure_obs(struct clk_stm32_priv *priv,
183528c10f9eSGabriel Fernandez 				    uint32_t data)
183628c10f9eSGabriel Fernandez {
183728c10f9eSGabriel Fernandez 	uint32_t id = (data & OBS_ID_MASK) >> OBS_ID_SHIFT;
183828c10f9eSGabriel Fernandez 	uint32_t status = (data & OBS_STATUS_MASK) >> OBS_STATUS_SHIFT;
183928c10f9eSGabriel Fernandez 	uint32_t int_ext = (data & OBS_INTEXT_MASK) >> OBS_INTEXT_SHIFT;
184028c10f9eSGabriel Fernandez 	uint32_t div = (data & OBS_DIV_MASK) >> OBS_DIV_SHIFT;
184128c10f9eSGabriel Fernandez 	uint32_t inv = (data & OBS_INV_MASK) >> OBS_INV_SHIFT;
184228c10f9eSGabriel Fernandez 	uint32_t sel = (data & OBS_SEL_MASK) >> OBS_SEL_SHIFT;
184328c10f9eSGabriel Fernandez 	uint32_t reg = 0;
184428c10f9eSGabriel Fernandez 	uint32_t val = 0;
184528c10f9eSGabriel Fernandez 
184628c10f9eSGabriel Fernandez 	if (!id)
184728c10f9eSGabriel Fernandez 		reg = RCC_FCALCOBS0CFGR;
184828c10f9eSGabriel Fernandez 	else
184928c10f9eSGabriel Fernandez 		reg = RCC_FCALCOBS1CFGR;
185028c10f9eSGabriel Fernandez 
185128c10f9eSGabriel Fernandez 	if (status)
185228c10f9eSGabriel Fernandez 		val |= RCC_FCALCOBS0CFGR_CKOBSEN;
185328c10f9eSGabriel Fernandez 
185428c10f9eSGabriel Fernandez 	if (int_ext == OBS_EXT) {
185528c10f9eSGabriel Fernandez 		val |= RCC_FCALCOBS0CFGR_CKOBSEXTSEL;
185628c10f9eSGabriel Fernandez 		val |= SHIFT_U32(sel, RCC_FCALCOBS0CFGR_CKEXTSEL_SHIFT);
185728c10f9eSGabriel Fernandez 	} else {
185828c10f9eSGabriel Fernandez 		val |= SHIFT_U32(sel, RCC_FCALCOBS0CFGR_CKINTSEL_SHIFT);
185928c10f9eSGabriel Fernandez 	}
186028c10f9eSGabriel Fernandez 
186128c10f9eSGabriel Fernandez 	if (inv)
186228c10f9eSGabriel Fernandez 		val |= RCC_FCALCOBS0CFGR_CKOBSINV;
186328c10f9eSGabriel Fernandez 
186428c10f9eSGabriel Fernandez 	val |= SHIFT_U32(div, RCC_FCALCOBS0CFGR_CKOBSDIV_SHIFT);
186528c10f9eSGabriel Fernandez 
186628c10f9eSGabriel Fernandez 	io_write32(priv->base + reg, val);
186728c10f9eSGabriel Fernandez }
186828c10f9eSGabriel Fernandez 
186928c10f9eSGabriel Fernandez static int stm32_clk_configure(struct clk_stm32_priv *priv, uint32_t val)
187028c10f9eSGabriel Fernandez {
187128c10f9eSGabriel Fernandez 	uint32_t cmd_data = 0;
187228c10f9eSGabriel Fernandez 	uint32_t cmd = 0;
187328c10f9eSGabriel Fernandez 	int ret = 0;
187428c10f9eSGabriel Fernandez 
187528c10f9eSGabriel Fernandez 	if (val & CMD_ADDR_BIT) {
187628c10f9eSGabriel Fernandez 		cmd_data = val & ~CMD_ADDR_BIT;
187728c10f9eSGabriel Fernandez 
187828c10f9eSGabriel Fernandez 		return stm32_clk_configure_by_addr_val(priv, cmd_data);
187928c10f9eSGabriel Fernandez 	}
188028c10f9eSGabriel Fernandez 
188128c10f9eSGabriel Fernandez 	cmd = (val & CMD_MASK) >> CMD_SHIFT;
188228c10f9eSGabriel Fernandez 	cmd_data = val & ~CMD_MASK;
188328c10f9eSGabriel Fernandez 
188428c10f9eSGabriel Fernandez 	switch (cmd) {
188528c10f9eSGabriel Fernandez 	case CMD_DIV:
188628c10f9eSGabriel Fernandez 		ret = stm32_clk_configure_div(priv, cmd_data);
188728c10f9eSGabriel Fernandez 		break;
188828c10f9eSGabriel Fernandez 
188928c10f9eSGabriel Fernandez 	case CMD_MUX:
189028c10f9eSGabriel Fernandez 		ret = stm32_clk_configure_mux(priv, cmd_data);
189128c10f9eSGabriel Fernandez 		break;
189228c10f9eSGabriel Fernandez 
189328c10f9eSGabriel Fernandez 	case CMD_OBS:
189428c10f9eSGabriel Fernandez 		stm32_clk_configure_obs(priv, cmd_data);
189528c10f9eSGabriel Fernandez 		break;
189628c10f9eSGabriel Fernandez 
189728c10f9eSGabriel Fernandez 	default:
189828c10f9eSGabriel Fernandez 		EMSG("cmd unknown ! : %#"PRIx32, val);
189928c10f9eSGabriel Fernandez 		ret = -1;
190028c10f9eSGabriel Fernandez 	}
190128c10f9eSGabriel Fernandez 
190228c10f9eSGabriel Fernandez 	return ret;
190328c10f9eSGabriel Fernandez }
190428c10f9eSGabriel Fernandez 
190528c10f9eSGabriel Fernandez static int stm32_clk_bus_configure(struct clk_stm32_priv *priv)
190628c10f9eSGabriel Fernandez {
190728c10f9eSGabriel Fernandez 	struct stm32_clk_platdata *pdata = priv->pdata;
190828c10f9eSGabriel Fernandez 	uint32_t i = 0;
190928c10f9eSGabriel Fernandez 
191028c10f9eSGabriel Fernandez 	for (i = 0; i < pdata->nbusclk; i++) {
191128c10f9eSGabriel Fernandez 		int ret = 0;
191228c10f9eSGabriel Fernandez 
191328c10f9eSGabriel Fernandez 		ret = stm32_clk_configure(priv, pdata->busclk[i]);
191428c10f9eSGabriel Fernandez 		if (ret != 0)
191528c10f9eSGabriel Fernandez 			return ret;
191628c10f9eSGabriel Fernandez 	}
191728c10f9eSGabriel Fernandez 
191828c10f9eSGabriel Fernandez 	return 0;
191928c10f9eSGabriel Fernandez }
192028c10f9eSGabriel Fernandez 
192128c10f9eSGabriel Fernandez static int stm32_clk_kernel_configure(struct clk_stm32_priv *priv)
192228c10f9eSGabriel Fernandez {
192328c10f9eSGabriel Fernandez 	struct stm32_clk_platdata *pdata = priv->pdata;
192428c10f9eSGabriel Fernandez 	uint32_t i = 0;
192528c10f9eSGabriel Fernandez 
192628c10f9eSGabriel Fernandez 	for (i = 0; i < pdata->nkernelclk; i++) {
192728c10f9eSGabriel Fernandez 		int ret = 0;
192828c10f9eSGabriel Fernandez 
192928c10f9eSGabriel Fernandez 		ret = stm32_clk_configure(priv, pdata->kernelclk[i]);
193028c10f9eSGabriel Fernandez 		if (ret != 0)
193128c10f9eSGabriel Fernandez 			return ret;
193228c10f9eSGabriel Fernandez 	}
193328c10f9eSGabriel Fernandez 
193428c10f9eSGabriel Fernandez 	return 0;
193528c10f9eSGabriel Fernandez }
193628c10f9eSGabriel Fernandez 
193728c10f9eSGabriel Fernandez static void stm32mp2_init_clock_tree(struct clk_stm32_priv *priv,
193828c10f9eSGabriel Fernandez 				     struct stm32_clk_platdata *pdata)
193928c10f9eSGabriel Fernandez {
194028c10f9eSGabriel Fernandez 	stm32_clk_oscillators_enable(priv, pdata);
194128c10f9eSGabriel Fernandez 
194228c10f9eSGabriel Fernandez 	/* Come back to HSI for flexgen */
194328c10f9eSGabriel Fernandez 	stm32mp2_clk_xbar_on_hsi(priv);
194428c10f9eSGabriel Fernandez 
194528c10f9eSGabriel Fernandez 	if (stm32_clk_pll_configure(priv))
194628c10f9eSGabriel Fernandez 		panic("Cannot configure plls");
194728c10f9eSGabriel Fernandez 
194828c10f9eSGabriel Fernandez 	/* Wait LSE ready before to use it */
194928c10f9eSGabriel Fernandez 	if (stm32_clk_oscillators_wait_lse_ready(priv, pdata))
195028c10f9eSGabriel Fernandez 		panic("Timeout: to enable LSE");
195128c10f9eSGabriel Fernandez 
195228c10f9eSGabriel Fernandez 	if (stm32mp2_clk_flexgen_configure(priv))
195328c10f9eSGabriel Fernandez 		panic("Cannot configure flexgen");
195428c10f9eSGabriel Fernandez 
195528c10f9eSGabriel Fernandez 	if (stm32_clk_bus_configure(priv))
195628c10f9eSGabriel Fernandez 		panic("Cannot config bus clocks");
195728c10f9eSGabriel Fernandez 
195828c10f9eSGabriel Fernandez 	if (stm32_clk_kernel_configure(priv))
195928c10f9eSGabriel Fernandez 		panic("Cannot configure kernel clocks");
196028c10f9eSGabriel Fernandez 
196128c10f9eSGabriel Fernandez 	/* Configure LSE css after RTC source configuration */
196228c10f9eSGabriel Fernandez 	stm32_clk_oscillators_lse_set_css(priv, pdata);
196328c10f9eSGabriel Fernandez }
196428c10f9eSGabriel Fernandez 
196528c10f9eSGabriel Fernandez static TEE_Result clk_stm32_osc_enable(struct clk *clk)
196628c10f9eSGabriel Fernandez {
196728c10f9eSGabriel Fernandez 	return clk_stm32_gate_ready_ops.enable(clk);
196828c10f9eSGabriel Fernandez }
196928c10f9eSGabriel Fernandez 
197028c10f9eSGabriel Fernandez static void clk_stm32_osc_disable(struct clk *clk)
197128c10f9eSGabriel Fernandez {
197228c10f9eSGabriel Fernandez 	clk_stm32_gate_ready_ops.disable(clk);
197328c10f9eSGabriel Fernandez }
197428c10f9eSGabriel Fernandez 
197528c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_osc_ops = {
197628c10f9eSGabriel Fernandez 	.enable = clk_stm32_osc_enable,
197728c10f9eSGabriel Fernandez 	.disable = clk_stm32_osc_disable,
197828c10f9eSGabriel Fernandez };
197928c10f9eSGabriel Fernandez 
198028c10f9eSGabriel Fernandez static unsigned long clk_stm32_msi_get_rate(struct clk *clk __unused,
198128c10f9eSGabriel Fernandez 					    unsigned long prate __unused)
198228c10f9eSGabriel Fernandez {
198328c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
198428c10f9eSGabriel Fernandez 	uintptr_t address = priv->base + RCC_BDCR;
198528c10f9eSGabriel Fernandez 
198628c10f9eSGabriel Fernandez 	if ((io_read32(address) & RCC_BDCR_MSIFREQSEL))
198728c10f9eSGabriel Fernandez 		return RCC_16_MHZ;
198828c10f9eSGabriel Fernandez 
198928c10f9eSGabriel Fernandez 	return RCC_4_MHZ;
199028c10f9eSGabriel Fernandez }
199128c10f9eSGabriel Fernandez 
199228c10f9eSGabriel Fernandez static TEE_Result clk_stm32_msi_set_rate(struct clk *clk __unused,
199328c10f9eSGabriel Fernandez 					 unsigned long rate,
199428c10f9eSGabriel Fernandez 					 unsigned long prate __unused)
199528c10f9eSGabriel Fernandez {
199628c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
199728c10f9eSGabriel Fernandez 
199828c10f9eSGabriel Fernandez 	return clk_stm32_osc_msi_set_rate(priv, rate);
199928c10f9eSGabriel Fernandez }
200028c10f9eSGabriel Fernandez 
200128c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_oscillator_msi_ops = {
200228c10f9eSGabriel Fernandez 	.enable = clk_stm32_osc_enable,
200328c10f9eSGabriel Fernandez 	.disable = clk_stm32_osc_disable,
200428c10f9eSGabriel Fernandez 	.get_rate = clk_stm32_msi_get_rate,
200528c10f9eSGabriel Fernandez 	.set_rate = clk_stm32_msi_set_rate,
200628c10f9eSGabriel Fernandez };
200728c10f9eSGabriel Fernandez 
200828c10f9eSGabriel Fernandez static TEE_Result clk_stm32_hse_div_set_rate(struct clk *clk,
200928c10f9eSGabriel Fernandez 					     unsigned long rate,
201028c10f9eSGabriel Fernandez 					     unsigned long parent_rate)
201128c10f9eSGabriel Fernandez {
201228c10f9eSGabriel Fernandez 	return clk_stm32_divider_set_rate(clk, rate, parent_rate);
201328c10f9eSGabriel Fernandez }
201428c10f9eSGabriel Fernandez 
201528c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_hse_div_ops = {
201628c10f9eSGabriel Fernandez 	.get_rate = clk_stm32_divider_get_rate,
201728c10f9eSGabriel Fernandez 	.set_rate = clk_stm32_hse_div_set_rate,
201828c10f9eSGabriel Fernandez };
201928c10f9eSGabriel Fernandez 
202028c10f9eSGabriel Fernandez static TEE_Result clk_stm32_hsediv2_enable(struct clk *clk)
202128c10f9eSGabriel Fernandez {
202228c10f9eSGabriel Fernandez 	return clk_stm32_gate_ops.enable(clk);
202328c10f9eSGabriel Fernandez }
202428c10f9eSGabriel Fernandez 
202528c10f9eSGabriel Fernandez static void clk_stm32_hsediv2_disable(struct clk *clk)
202628c10f9eSGabriel Fernandez {
202728c10f9eSGabriel Fernandez 	clk_stm32_gate_ops.disable(clk);
202828c10f9eSGabriel Fernandez }
202928c10f9eSGabriel Fernandez 
203028c10f9eSGabriel Fernandez static unsigned long clk_stm32_hsediv2_get_rate(struct clk *clk __unused,
203128c10f9eSGabriel Fernandez 						unsigned long prate)
203228c10f9eSGabriel Fernandez {
203328c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
203428c10f9eSGabriel Fernandez 	uintptr_t addr = priv->base + RCC_OCENSETR;
203528c10f9eSGabriel Fernandez 
203628c10f9eSGabriel Fernandez 	if (io_read32(addr) & RCC_OCENSETR_HSEDIV2BYP)
203728c10f9eSGabriel Fernandez 		return prate;
203828c10f9eSGabriel Fernandez 
203928c10f9eSGabriel Fernandez 	return prate / 2;
204028c10f9eSGabriel Fernandez }
204128c10f9eSGabriel Fernandez 
204228c10f9eSGabriel Fernandez static const struct clk_ops clk_hsediv2_ops = {
204328c10f9eSGabriel Fernandez 	.enable = clk_stm32_hsediv2_enable,
204428c10f9eSGabriel Fernandez 	.disable = clk_stm32_hsediv2_disable,
204528c10f9eSGabriel Fernandez 	.get_rate = clk_stm32_hsediv2_get_rate,
204628c10f9eSGabriel Fernandez };
204728c10f9eSGabriel Fernandez 
204828c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg {
204928c10f9eSGabriel Fernandez 	uint32_t pll_offset;
205028c10f9eSGabriel Fernandez 	int gate_id;
205128c10f9eSGabriel Fernandez 	int mux_id;
205228c10f9eSGabriel Fernandez };
205328c10f9eSGabriel Fernandez 
205428c10f9eSGabriel Fernandez static unsigned long clk_get_pll1_fvco_rate(unsigned long refclk)
205528c10f9eSGabriel Fernandez {
205628c10f9eSGabriel Fernandez 	uint32_t reg = stm32mp_syscfg_read(A35SS_SSC_PLL_FREQ1);
205728c10f9eSGabriel Fernandez 	uint32_t fbdiv = 0;
205828c10f9eSGabriel Fernandez 	uint32_t refdiv = 0;
205928c10f9eSGabriel Fernandez 	unsigned long freq = 0;
206028c10f9eSGabriel Fernandez 
206128c10f9eSGabriel Fernandez 	fbdiv = (reg & A35SS_SSC_PLL_FREQ1_FBDIV_MASK) >>
206228c10f9eSGabriel Fernandez 		A35SS_SSC_PLL_FREQ1_FBDIV_SHIFT;
206328c10f9eSGabriel Fernandez 
206428c10f9eSGabriel Fernandez 	refdiv = (reg & A35SS_SSC_PLL_FREQ1_REFDIV_MASK) >>
206528c10f9eSGabriel Fernandez 		 A35SS_SSC_PLL_FREQ1_REFDIV_SHIFT;
206628c10f9eSGabriel Fernandez 
206728c10f9eSGabriel Fernandez 	if (!refdiv || MUL_OVERFLOW(refclk, fbdiv, &freq))
206828c10f9eSGabriel Fernandez 		panic();
206928c10f9eSGabriel Fernandez 
207028c10f9eSGabriel Fernandez 	return freq / refdiv;
207128c10f9eSGabriel Fernandez }
207228c10f9eSGabriel Fernandez 
207328c10f9eSGabriel Fernandez static unsigned long clk_stm32_pll1_get_rate(struct clk *clk __unused,
207428c10f9eSGabriel Fernandez 					     unsigned long prate)
207528c10f9eSGabriel Fernandez {
207628c10f9eSGabriel Fernandez 	uint32_t reg = stm32mp_syscfg_read(A35SS_SSC_PLL_FREQ2);
207728c10f9eSGabriel Fernandez 	unsigned long dfout = 0;
207828c10f9eSGabriel Fernandez 	uint32_t postdiv1 = 0;
207928c10f9eSGabriel Fernandez 	uint32_t postdiv2 = 0;
208028c10f9eSGabriel Fernandez 
208128c10f9eSGabriel Fernandez 	postdiv1 = (reg & A35SS_SSC_PLL_FREQ2_POSTDIV1_MASK) >>
208228c10f9eSGabriel Fernandez 		   A35SS_SSC_PLL_FREQ2_POSTDIV1_SHIFT;
208328c10f9eSGabriel Fernandez 
208428c10f9eSGabriel Fernandez 	postdiv2 = (reg & A35SS_SSC_PLL_FREQ2_POSTDIV2_MASK) >>
208528c10f9eSGabriel Fernandez 		   A35SS_SSC_PLL_FREQ2_POSTDIV2_SHIFT;
208628c10f9eSGabriel Fernandez 
208728c10f9eSGabriel Fernandez 	if (postdiv1 == 0 || postdiv2 == 0)
208828c10f9eSGabriel Fernandez 		dfout = prate;
208928c10f9eSGabriel Fernandez 	else
209028c10f9eSGabriel Fernandez 		dfout = clk_get_pll1_fvco_rate(prate) / (postdiv1 * postdiv2);
209128c10f9eSGabriel Fernandez 
209228c10f9eSGabriel Fernandez 	return dfout;
209328c10f9eSGabriel Fernandez }
209428c10f9eSGabriel Fernandez 
209528c10f9eSGabriel Fernandez static struct stm32_clk_opp_cfg *
209628c10f9eSGabriel Fernandez clk_stm32_get_opp_config(struct stm32_clk_opp_cfg *opp_cfg, unsigned long rate)
209728c10f9eSGabriel Fernandez {
209828c10f9eSGabriel Fernandez 	unsigned int i = 0;
209928c10f9eSGabriel Fernandez 
210028c10f9eSGabriel Fernandez 	for (i = 0; i < MAX_OPP && opp_cfg->frq; i++, opp_cfg++)
210128c10f9eSGabriel Fernandez 		if (opp_cfg->frq == rate)
210228c10f9eSGabriel Fernandez 			return opp_cfg;
210328c10f9eSGabriel Fernandez 
210428c10f9eSGabriel Fernandez 	return NULL;
210528c10f9eSGabriel Fernandez }
210628c10f9eSGabriel Fernandez 
210728c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll1_set_rate(struct clk *clk __unused,
210828c10f9eSGabriel Fernandez 					  unsigned long rate,
210928c10f9eSGabriel Fernandez 					  unsigned long parent_rate __unused)
211028c10f9eSGabriel Fernandez {
211128c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
211228c10f9eSGabriel Fernandez 	struct stm32_clk_platdata *pdata = priv->pdata;
211328c10f9eSGabriel Fernandez 	struct stm32_pll_dt_cfg *pll_conf = NULL;
211428c10f9eSGabriel Fernandez 	struct stm32_clk_opp_cfg *opp = NULL;
211528c10f9eSGabriel Fernandez 
211628c10f9eSGabriel Fernandez 	opp = clk_stm32_get_opp_config(pdata->opp->cpu1_opp, rate);
211728c10f9eSGabriel Fernandez 	if (!opp)
211828c10f9eSGabriel Fernandez 		return TEE_ERROR_GENERIC;
211928c10f9eSGabriel Fernandez 
212028c10f9eSGabriel Fernandez 	pll_conf = &opp->pll_cfg;
212128c10f9eSGabriel Fernandez 
212228c10f9eSGabriel Fernandez 	clk_stm32_pll1_init(priv, PLL1_ID, pll_conf);
212328c10f9eSGabriel Fernandez 
212428c10f9eSGabriel Fernandez 	return TEE_SUCCESS;
212528c10f9eSGabriel Fernandez }
212628c10f9eSGabriel Fernandez 
212728c10f9eSGabriel Fernandez static size_t clk_stm32_pll_get_parent(struct clk *clk)
212828c10f9eSGabriel Fernandez {
212928c10f9eSGabriel Fernandez 	struct clk_stm32_pll_cfg *cfg = clk->priv;
213028c10f9eSGabriel Fernandez 
213128c10f9eSGabriel Fernandez 	return stm32_mux_get_parent(cfg->mux_id);
213228c10f9eSGabriel Fernandez }
213328c10f9eSGabriel Fernandez 
213428c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll1_ops = {
213528c10f9eSGabriel Fernandez 	.get_parent = clk_stm32_pll_get_parent,
213628c10f9eSGabriel Fernandez 	.get_rate = clk_stm32_pll1_get_rate,
213728c10f9eSGabriel Fernandez 	.set_rate = clk_stm32_pll1_set_rate,
213828c10f9eSGabriel Fernandez };
213928c10f9eSGabriel Fernandez 
214028c10f9eSGabriel Fernandez static unsigned long clk_get_pll_fvco(uint32_t offset_base,
214128c10f9eSGabriel Fernandez 				      unsigned long prate)
214228c10f9eSGabriel Fernandez {
214328c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
214428c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr1 = priv->base + offset_base;
214528c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr2 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR2;
214628c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3;
214728c10f9eSGabriel Fernandez 	unsigned long fvco = 0;
214828c10f9eSGabriel Fernandez 	uint32_t fracin = 0;
214928c10f9eSGabriel Fernandez 	uint32_t fbdiv = 0;
215028c10f9eSGabriel Fernandez 	uint32_t refdiv = 0;
215128c10f9eSGabriel Fernandez 
215228c10f9eSGabriel Fernandez 	fracin = io_read32(pllxcfgr3) & RCC_PLLxCFGR3_FRACIN_MASK;
215328c10f9eSGabriel Fernandez 	fbdiv = (io_read32(pllxcfgr2) & RCC_PLLxCFGR2_FBDIV_MASK) >>
215428c10f9eSGabriel Fernandez 		RCC_PLLxCFGR2_FBDIV_SHIFT;
215528c10f9eSGabriel Fernandez 
215628c10f9eSGabriel Fernandez 	refdiv = io_read32(pllxcfgr2) & RCC_PLLxCFGR2_FREFDIV_MASK;
215728c10f9eSGabriel Fernandez 
215828c10f9eSGabriel Fernandez 	assert(refdiv);
215928c10f9eSGabriel Fernandez 
216028c10f9eSGabriel Fernandez 	if (fracin) {
216128c10f9eSGabriel Fernandez 		unsigned long long numerator = 0;
216228c10f9eSGabriel Fernandez 		unsigned long long denominator = 0;
216328c10f9eSGabriel Fernandez 
216428c10f9eSGabriel Fernandez 		numerator = SHIFT_U64(fbdiv, 24) + fracin;
216528c10f9eSGabriel Fernandez 		numerator = prate * numerator;
216628c10f9eSGabriel Fernandez 		denominator = SHIFT_U64(refdiv, 24);
216728c10f9eSGabriel Fernandez 		fvco = (unsigned long)(numerator / denominator);
216828c10f9eSGabriel Fernandez 	} else {
216928c10f9eSGabriel Fernandez 		fvco = (unsigned long)(prate * fbdiv / refdiv);
217028c10f9eSGabriel Fernandez 	}
217128c10f9eSGabriel Fernandez 
217228c10f9eSGabriel Fernandez 	return fvco;
217328c10f9eSGabriel Fernandez }
217428c10f9eSGabriel Fernandez 
217528c10f9eSGabriel Fernandez static unsigned long clk_stm32_pll_get_rate(struct clk *clk __unused,
217628c10f9eSGabriel Fernandez 					    unsigned long prate)
217728c10f9eSGabriel Fernandez {
217828c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
217928c10f9eSGabriel Fernandez 	struct clk_stm32_pll_cfg *cfg = clk->priv;
218028c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr1 = priv->base + cfg->pll_offset;
218128c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4;
218228c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr6 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR6;
218328c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr7 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR7;
218428c10f9eSGabriel Fernandez 	unsigned long dfout = 0;
218528c10f9eSGabriel Fernandez 	uint32_t postdiv1 = 0;
218628c10f9eSGabriel Fernandez 	uint32_t postdiv2 = 0;
218728c10f9eSGabriel Fernandez 
218828c10f9eSGabriel Fernandez 	postdiv1 = io_read32(pllxcfgr6) & RCC_PLLxCFGR6_POSTDIV1_MASK;
218928c10f9eSGabriel Fernandez 	postdiv2 = io_read32(pllxcfgr7) & RCC_PLLxCFGR7_POSTDIV2_MASK;
219028c10f9eSGabriel Fernandez 
219128c10f9eSGabriel Fernandez 	if ((io_read32(pllxcfgr4) & RCC_PLLxCFGR4_BYPASS) ||
219228c10f9eSGabriel Fernandez 	    !postdiv1 || !postdiv2)
219328c10f9eSGabriel Fernandez 		dfout = prate;
219428c10f9eSGabriel Fernandez 	else
219528c10f9eSGabriel Fernandez 		dfout = clk_get_pll_fvco(cfg->pll_offset,
219628c10f9eSGabriel Fernandez 					 prate) / (postdiv1 * postdiv2);
219728c10f9eSGabriel Fernandez 
219828c10f9eSGabriel Fernandez 	return dfout;
219928c10f9eSGabriel Fernandez }
220028c10f9eSGabriel Fernandez 
220128c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll_enable(struct clk *clk)
220228c10f9eSGabriel Fernandez {
220328c10f9eSGabriel Fernandez 	struct clk_stm32_pll_cfg *cfg = clk->priv;
220428c10f9eSGabriel Fernandez 
220528c10f9eSGabriel Fernandez 	if (stm32_gate_rdy_enable(cfg->gate_id)) {
220628c10f9eSGabriel Fernandez 		EMSG("%s timeout", clk_get_name(clk));
220728c10f9eSGabriel Fernandez 		return TEE_ERROR_TIMEOUT;
220828c10f9eSGabriel Fernandez 	}
220928c10f9eSGabriel Fernandez 
221028c10f9eSGabriel Fernandez 	return TEE_SUCCESS;
221128c10f9eSGabriel Fernandez }
221228c10f9eSGabriel Fernandez 
221328c10f9eSGabriel Fernandez static void clk_stm32_pll_disable(struct clk *clk)
221428c10f9eSGabriel Fernandez {
221528c10f9eSGabriel Fernandez 	struct clk_stm32_pll_cfg *cfg = clk->priv;
221628c10f9eSGabriel Fernandez 
221728c10f9eSGabriel Fernandez 	if (stm32_gate_rdy_disable(cfg->gate_id)) {
221828c10f9eSGabriel Fernandez 		EMSG("%s timeout", clk_get_name(clk));
221928c10f9eSGabriel Fernandez 		panic();
222028c10f9eSGabriel Fernandez 	}
222128c10f9eSGabriel Fernandez }
222228c10f9eSGabriel Fernandez 
222328c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll_ops = {
222428c10f9eSGabriel Fernandez 	.get_parent = clk_stm32_pll_get_parent,
222528c10f9eSGabriel Fernandez 	.get_rate = clk_stm32_pll_get_rate,
222628c10f9eSGabriel Fernandez 	.enable = clk_stm32_pll_enable,
222728c10f9eSGabriel Fernandez 	.disable = clk_stm32_pll_disable,
222828c10f9eSGabriel Fernandez };
222928c10f9eSGabriel Fernandez 
223028c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll3_enable(struct clk *clk)
223128c10f9eSGabriel Fernandez {
223228c10f9eSGabriel Fernandez 	struct clk_stm32_pll_cfg *cfg = clk->priv;
223328c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
223428c10f9eSGabriel Fernandez 	struct stm32_pll_dt_cfg *pll_conf = clk_stm32_pll_get_pdata(PLL3_ID);
223528c10f9eSGabriel Fernandez 	struct clk *parent = NULL;
223628c10f9eSGabriel Fernandez 	size_t pidx = 0;
223728c10f9eSGabriel Fernandez 
223828c10f9eSGabriel Fernandez 	/* ck_icn_p_gpu activate */
223928c10f9eSGabriel Fernandez 	stm32_gate_enable(GATE_GPU);
224028c10f9eSGabriel Fernandez 
224128c10f9eSGabriel Fernandez 	clk_stm32_pll_init(priv, PLL3_ID, pll_conf);
224228c10f9eSGabriel Fernandez 
224328c10f9eSGabriel Fernandez 	if (stm32_gate_rdy_enable(cfg->gate_id)) {
224428c10f9eSGabriel Fernandez 		EMSG("%s timeout", clk_get_name(clk));
224528c10f9eSGabriel Fernandez 		return TEE_ERROR_TIMEOUT;
224628c10f9eSGabriel Fernandez 	}
224728c10f9eSGabriel Fernandez 
224828c10f9eSGabriel Fernandez 	/* Update parent */
224928c10f9eSGabriel Fernandez 	pidx = clk_stm32_pll_get_parent(clk);
225028c10f9eSGabriel Fernandez 	parent = clk_get_parent_by_index(clk, pidx);
225128c10f9eSGabriel Fernandez 
225228c10f9eSGabriel Fernandez 	clk->parent = parent;
225328c10f9eSGabriel Fernandez 
225428c10f9eSGabriel Fernandez 	return TEE_SUCCESS;
225528c10f9eSGabriel Fernandez }
225628c10f9eSGabriel Fernandez 
225728c10f9eSGabriel Fernandez static void clk_stm32_pll3_disable(struct clk *clk)
225828c10f9eSGabriel Fernandez {
225928c10f9eSGabriel Fernandez 	clk_stm32_pll_disable(clk);
226028c10f9eSGabriel Fernandez 	stm32_gate_disable(GATE_GPU);
226128c10f9eSGabriel Fernandez }
226228c10f9eSGabriel Fernandez 
226328c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll3_ops = {
226428c10f9eSGabriel Fernandez 	.get_parent = clk_stm32_pll_get_parent,
226528c10f9eSGabriel Fernandez 	.get_rate = clk_stm32_pll_get_rate,
226628c10f9eSGabriel Fernandez 	.enable = clk_stm32_pll3_enable,
226728c10f9eSGabriel Fernandez 	.disable = clk_stm32_pll3_disable,
226828c10f9eSGabriel Fernandez };
226928c10f9eSGabriel Fernandez 
227028c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg {
227128c10f9eSGabriel Fernandez 	int flex_id;
227228c10f9eSGabriel Fernandez };
227328c10f9eSGabriel Fernandez 
227428c10f9eSGabriel Fernandez static size_t clk_stm32_flexgen_get_parent(struct clk *clk)
227528c10f9eSGabriel Fernandez {
227628c10f9eSGabriel Fernandez 	struct clk_stm32_flexgen_cfg *cfg = clk->priv;
227728c10f9eSGabriel Fernandez 	uintptr_t rcc_base = clk_stm32_get_rcc_base();
227828c10f9eSGabriel Fernandez 	uint32_t address = 0;
227928c10f9eSGabriel Fernandez 
228028c10f9eSGabriel Fernandez 	address = rcc_base + RCC_XBAR0CFGR + (cfg->flex_id * 4);
228128c10f9eSGabriel Fernandez 
228228c10f9eSGabriel Fernandez 	return io_read32(address) & RCC_XBAR0CFGR_XBAR0SEL_MASK;
228328c10f9eSGabriel Fernandez }
228428c10f9eSGabriel Fernandez 
228528c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_set_parent(struct clk *clk, size_t pidx)
228628c10f9eSGabriel Fernandez {
228728c10f9eSGabriel Fernandez 	uintptr_t rcc_base = clk_stm32_get_rcc_base();
228828c10f9eSGabriel Fernandez 	struct clk_stm32_flexgen_cfg *cfg = clk->priv;
228928c10f9eSGabriel Fernandez 	uint16_t channel = cfg->flex_id * 4;
229028c10f9eSGabriel Fernandez 
229128c10f9eSGabriel Fernandez 	io_clrsetbits32(rcc_base + RCC_XBAR0CFGR + (channel),
229228c10f9eSGabriel Fernandez 			RCC_XBAR0CFGR_XBAR0SEL_MASK, pidx);
229328c10f9eSGabriel Fernandez 
229428c10f9eSGabriel Fernandez 	if (wait_xbar_sts(channel))
229528c10f9eSGabriel Fernandez 		return TEE_ERROR_GENERIC;
229628c10f9eSGabriel Fernandez 
229728c10f9eSGabriel Fernandez 	return TEE_SUCCESS;
229828c10f9eSGabriel Fernandez }
229928c10f9eSGabriel Fernandez 
230028c10f9eSGabriel Fernandez static unsigned long clk_stm32_flexgen_get_rate(struct clk *clk __unused,
230128c10f9eSGabriel Fernandez 						unsigned long prate)
230228c10f9eSGabriel Fernandez {
230328c10f9eSGabriel Fernandez 	struct clk_stm32_flexgen_cfg *cfg = clk->priv;
230428c10f9eSGabriel Fernandez 	uintptr_t rcc_base = clk_stm32_get_rcc_base();
230528c10f9eSGabriel Fernandez 	uint32_t prediv = 0;
230628c10f9eSGabriel Fernandez 	uint32_t findiv = 0;
230728c10f9eSGabriel Fernandez 	uint8_t channel = cfg->flex_id;
230828c10f9eSGabriel Fernandez 	unsigned long freq = prate;
230928c10f9eSGabriel Fernandez 
231028c10f9eSGabriel Fernandez 	prediv = io_read32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel)) &
231128c10f9eSGabriel Fernandez 		RCC_PREDIV0CFGR_PREDIV0_MASK;
231228c10f9eSGabriel Fernandez 	findiv = io_read32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel)) &
231328c10f9eSGabriel Fernandez 		RCC_FINDIV0CFGR_FINDIV0_MASK;
231428c10f9eSGabriel Fernandez 
231528c10f9eSGabriel Fernandez 	if (freq == 0)
231628c10f9eSGabriel Fernandez 		return 0;
231728c10f9eSGabriel Fernandez 
231828c10f9eSGabriel Fernandez 	switch (prediv) {
231928c10f9eSGabriel Fernandez 	case 0x0:
232028c10f9eSGabriel Fernandez 		break;
232128c10f9eSGabriel Fernandez 
232228c10f9eSGabriel Fernandez 	case 0x1:
232328c10f9eSGabriel Fernandez 		freq /= 2;
232428c10f9eSGabriel Fernandez 		break;
232528c10f9eSGabriel Fernandez 
232628c10f9eSGabriel Fernandez 	case 0x3:
232728c10f9eSGabriel Fernandez 		freq /= 4;
232828c10f9eSGabriel Fernandez 		break;
232928c10f9eSGabriel Fernandez 
233028c10f9eSGabriel Fernandez 	case 0x3FF:
233128c10f9eSGabriel Fernandez 		freq /= 1024;
233228c10f9eSGabriel Fernandez 		break;
233328c10f9eSGabriel Fernandez 
233428c10f9eSGabriel Fernandez 	default:
233528c10f9eSGabriel Fernandez 		EMSG("Unsupported PREDIV value (%#"PRIx32")", prediv);
233628c10f9eSGabriel Fernandez 		panic();
233728c10f9eSGabriel Fernandez 		break;
233828c10f9eSGabriel Fernandez 	}
233928c10f9eSGabriel Fernandez 
234028c10f9eSGabriel Fernandez 	freq /= findiv + 1;
234128c10f9eSGabriel Fernandez 
234228c10f9eSGabriel Fernandez 	return freq;
234328c10f9eSGabriel Fernandez }
234428c10f9eSGabriel Fernandez 
234528c10f9eSGabriel Fernandez static unsigned long clk_stm32_flexgen_get_round_rate(unsigned long rate,
234628c10f9eSGabriel Fernandez 						      unsigned long prate,
234728c10f9eSGabriel Fernandez 						      unsigned int *prediv,
234828c10f9eSGabriel Fernandez 						      unsigned int *findiv)
234928c10f9eSGabriel Fernandez {
235028c10f9eSGabriel Fernandez 	unsigned int pre_val[] = { 0x0, 0x1, 0x3, 0x3FF };
235128c10f9eSGabriel Fernandez 	unsigned int pre_div[] = { 1, 2, 4, 1024 };
235228c10f9eSGabriel Fernandez 	long best_diff = LONG_MAX;
235328c10f9eSGabriel Fernandez 	unsigned int i = 0;
235428c10f9eSGabriel Fernandez 
235528c10f9eSGabriel Fernandez 	*prediv = 0;
235628c10f9eSGabriel Fernandez 	*findiv = 0;
235728c10f9eSGabriel Fernandez 
235828c10f9eSGabriel Fernandez 	for (i = 0; i < ARRAY_SIZE(pre_div); i++) {
235928c10f9eSGabriel Fernandez 		unsigned long freq = 0;
236028c10f9eSGabriel Fernandez 		unsigned long ratio = 0;
236128c10f9eSGabriel Fernandez 		long diff = 0L;
236228c10f9eSGabriel Fernandez 
236328c10f9eSGabriel Fernandez 		freq = UDIV_ROUND_NEAREST((uint64_t)prate, pre_div[i]);
236428c10f9eSGabriel Fernandez 		ratio = UDIV_ROUND_NEAREST((uint64_t)freq, rate);
236528c10f9eSGabriel Fernandez 
236628c10f9eSGabriel Fernandez 		if (ratio == 0)
236728c10f9eSGabriel Fernandez 			ratio = 1;
236828c10f9eSGabriel Fernandez 		else if (ratio > 64)
236928c10f9eSGabriel Fernandez 			ratio = 64;
237028c10f9eSGabriel Fernandez 
237128c10f9eSGabriel Fernandez 		freq = UDIV_ROUND_NEAREST((uint64_t)freq, ratio);
237228c10f9eSGabriel Fernandez 		if (freq < rate)
237328c10f9eSGabriel Fernandez 			diff = rate - freq;
237428c10f9eSGabriel Fernandez 		else
237528c10f9eSGabriel Fernandez 			diff = freq - rate;
237628c10f9eSGabriel Fernandez 
237728c10f9eSGabriel Fernandez 		if (diff < best_diff) {
237828c10f9eSGabriel Fernandez 			best_diff = diff;
237928c10f9eSGabriel Fernandez 			*prediv = pre_val[i];
238028c10f9eSGabriel Fernandez 			*findiv = ratio - 1;
238128c10f9eSGabriel Fernandez 
238228c10f9eSGabriel Fernandez 			if (diff == 0)
238328c10f9eSGabriel Fernandez 				break;
238428c10f9eSGabriel Fernandez 		}
238528c10f9eSGabriel Fernandez 	}
238628c10f9eSGabriel Fernandez 
238728c10f9eSGabriel Fernandez 	return (prate / (*prediv + 1)) / (*findiv + 1);
238828c10f9eSGabriel Fernandez }
238928c10f9eSGabriel Fernandez 
239028c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_set_rate(struct clk *clk,
239128c10f9eSGabriel Fernandez 					     unsigned long rate,
239228c10f9eSGabriel Fernandez 					     unsigned long parent_rate)
239328c10f9eSGabriel Fernandez {
239428c10f9eSGabriel Fernandez 	struct clk_stm32_flexgen_cfg *cfg = clk->priv;
239528c10f9eSGabriel Fernandez 	uint8_t channel = cfg->flex_id;
239628c10f9eSGabriel Fernandez 	uintptr_t rcc_base = stm32_rcc_base();
239728c10f9eSGabriel Fernandez 	unsigned int prediv = 0;
239828c10f9eSGabriel Fernandez 	unsigned int findiv = 0;
239928c10f9eSGabriel Fernandez 
240028c10f9eSGabriel Fernandez 	clk_stm32_flexgen_get_round_rate(rate, parent_rate, &prediv, &findiv);
240128c10f9eSGabriel Fernandez 
240228c10f9eSGabriel Fernandez 	if (wait_predivsr(channel) != 0)
240328c10f9eSGabriel Fernandez 		panic();
240428c10f9eSGabriel Fernandez 
240528c10f9eSGabriel Fernandez 	io_clrsetbits32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel),
240628c10f9eSGabriel Fernandez 			RCC_PREDIV0CFGR_PREDIV0_MASK,
240728c10f9eSGabriel Fernandez 			prediv);
240828c10f9eSGabriel Fernandez 
240928c10f9eSGabriel Fernandez 	if (wait_predivsr(channel) != 0)
241028c10f9eSGabriel Fernandez 		panic();
241128c10f9eSGabriel Fernandez 
241228c10f9eSGabriel Fernandez 	if (wait_findivsr(channel) != 0)
241328c10f9eSGabriel Fernandez 		panic();
241428c10f9eSGabriel Fernandez 
241528c10f9eSGabriel Fernandez 	io_clrsetbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel),
241628c10f9eSGabriel Fernandez 			RCC_FINDIV0CFGR_FINDIV0_MASK,
241728c10f9eSGabriel Fernandez 			findiv);
241828c10f9eSGabriel Fernandez 
241928c10f9eSGabriel Fernandez 	if (wait_findivsr(channel) != 0)
242028c10f9eSGabriel Fernandez 		panic();
242128c10f9eSGabriel Fernandez 
242228c10f9eSGabriel Fernandez 	return TEE_SUCCESS;
242328c10f9eSGabriel Fernandez }
242428c10f9eSGabriel Fernandez 
242528c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_enable(struct clk *clk)
242628c10f9eSGabriel Fernandez {
242728c10f9eSGabriel Fernandez 	struct clk_stm32_flexgen_cfg *cfg = clk->priv;
242828c10f9eSGabriel Fernandez 	uintptr_t rcc_base = clk_stm32_get_rcc_base();
2429*1f2e0a3fSGatien Chevallier 	TEE_Result ret = TEE_ERROR_GENERIC;
243028c10f9eSGabriel Fernandez 	uint8_t channel = cfg->flex_id;
243128c10f9eSGabriel Fernandez 
2432*1f2e0a3fSGatien Chevallier 	/*
2433*1f2e0a3fSGatien Chevallier 	 * Configure flexgen of STGEN since it has been skipped during
2434*1f2e0a3fSGatien Chevallier 	 * flexgen configuration.
2435*1f2e0a3fSGatien Chevallier 	 */
2436*1f2e0a3fSGatien Chevallier 	if (channel == FLEX_STGEN) {
2437*1f2e0a3fSGatien Chevallier 		unsigned int clk_src = U(0);
2438*1f2e0a3fSGatien Chevallier 		unsigned int pdiv = U(0);
2439*1f2e0a3fSGatien Chevallier 		unsigned int fdiv = U(0);
2440*1f2e0a3fSGatien Chevallier 
2441*1f2e0a3fSGatien Chevallier 		ret = flexclkgen_search_config(channel, &clk_src, &pdiv, &fdiv);
2442*1f2e0a3fSGatien Chevallier 		if (ret) {
2443*1f2e0a3fSGatien Chevallier 			EMSG("Error %#"PRIx32" when getting STGEN flexgen conf",
2444*1f2e0a3fSGatien Chevallier 			     ret);
2445*1f2e0a3fSGatien Chevallier 			return ret;
2446*1f2e0a3fSGatien Chevallier 		}
2447*1f2e0a3fSGatien Chevallier 
2448*1f2e0a3fSGatien Chevallier 		flexclkgen_config_channel(channel, clk_src, pdiv, fdiv);
2449*1f2e0a3fSGatien Chevallier 
2450*1f2e0a3fSGatien Chevallier 		/* Update parent */
2451*1f2e0a3fSGatien Chevallier 		clk->parent = clk_get_parent_by_index(clk, clk_src);
2452*1f2e0a3fSGatien Chevallier 	}
2453*1f2e0a3fSGatien Chevallier 
245428c10f9eSGabriel Fernandez 	io_setbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel),
245528c10f9eSGabriel Fernandez 		     RCC_FINDIV0CFGR_FINDIV0EN);
245628c10f9eSGabriel Fernandez 
245728c10f9eSGabriel Fernandez 	return TEE_SUCCESS;
245828c10f9eSGabriel Fernandez }
245928c10f9eSGabriel Fernandez 
246028c10f9eSGabriel Fernandez static void clk_stm32_flexgen_disable(struct clk *clk)
246128c10f9eSGabriel Fernandez {
246228c10f9eSGabriel Fernandez 	struct clk_stm32_flexgen_cfg *cfg = clk->priv;
246328c10f9eSGabriel Fernandez 	uintptr_t rcc_base = clk_stm32_get_rcc_base();
246428c10f9eSGabriel Fernandez 	uint8_t channel = cfg->flex_id;
246528c10f9eSGabriel Fernandez 
246628c10f9eSGabriel Fernandez 	io_clrbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel),
246728c10f9eSGabriel Fernandez 		     RCC_FINDIV0CFGR_FINDIV0EN);
246828c10f9eSGabriel Fernandez }
246928c10f9eSGabriel Fernandez 
247028c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_flexgen_ops = {
247128c10f9eSGabriel Fernandez 	.get_rate = clk_stm32_flexgen_get_rate,
247228c10f9eSGabriel Fernandez 	.set_rate = clk_stm32_flexgen_set_rate,
247328c10f9eSGabriel Fernandez 	.get_parent = clk_stm32_flexgen_get_parent,
247428c10f9eSGabriel Fernandez 	.set_parent = clk_stm32_flexgen_set_parent,
247528c10f9eSGabriel Fernandez 	.enable = clk_stm32_flexgen_enable,
247628c10f9eSGabriel Fernandez 	.disable = clk_stm32_flexgen_disable,
247728c10f9eSGabriel Fernandez };
247828c10f9eSGabriel Fernandez 
247928c10f9eSGabriel Fernandez static size_t clk_cpu1_get_parent(struct clk *clk __unused)
248028c10f9eSGabriel Fernandez {
248128c10f9eSGabriel Fernandez 	uint32_t reg = stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ);
248228c10f9eSGabriel Fernandez 
248328c10f9eSGabriel Fernandez 	return (reg & A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) >>
248428c10f9eSGabriel Fernandez 		A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_SHIFT;
248528c10f9eSGabriel Fernandez }
248628c10f9eSGabriel Fernandez 
248728c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_cpu1_ops = {
248828c10f9eSGabriel Fernandez 	.get_parent = clk_cpu1_get_parent,
248928c10f9eSGabriel Fernandez };
249028c10f9eSGabriel Fernandez 
249128c10f9eSGabriel Fernandez #define APB_DIV_MASK	GENMASK_32(2, 0)
249228c10f9eSGabriel Fernandez #define TIM_PRE_MASK	BIT(0)
249328c10f9eSGabriel Fernandez 
249428c10f9eSGabriel Fernandez static unsigned long ck_timer_get_rate_ops(struct clk *clk, unsigned long prate)
249528c10f9eSGabriel Fernandez {
249628c10f9eSGabriel Fernandez 	struct clk_stm32_timer_cfg *cfg = clk->priv;
249728c10f9eSGabriel Fernandez 	uintptr_t rcc_base = clk_stm32_get_rcc_base();
249828c10f9eSGabriel Fernandez 	uint32_t prescaler = 0;
249928c10f9eSGabriel Fernandez 	uint32_t timpre = 0;
250028c10f9eSGabriel Fernandez 
250128c10f9eSGabriel Fernandez 	prescaler = io_read32(rcc_base + cfg->apbdiv) & APB_DIV_MASK;
250228c10f9eSGabriel Fernandez 
250328c10f9eSGabriel Fernandez 	timpre = io_read32(rcc_base + cfg->timpre) & TIM_PRE_MASK;
250428c10f9eSGabriel Fernandez 
250528c10f9eSGabriel Fernandez 	if (prescaler == 0)
250628c10f9eSGabriel Fernandez 		return prate;
250728c10f9eSGabriel Fernandez 
250828c10f9eSGabriel Fernandez 	return prate * (timpre + 1) * 2;
250928c10f9eSGabriel Fernandez };
251028c10f9eSGabriel Fernandez 
251128c10f9eSGabriel Fernandez static const struct clk_ops ck_timer_ops = {
251228c10f9eSGabriel Fernandez 	.get_rate = ck_timer_get_rate_ops,
251328c10f9eSGabriel Fernandez };
251428c10f9eSGabriel Fernandez 
251528c10f9eSGabriel Fernandez #define PLL_PARENTS	{ &ck_hsi, &ck_hse, &ck_msi }
251628c10f9eSGabriel Fernandez #define PLL_NUM_PATENTS	3
251728c10f9eSGabriel Fernandez 
251828c10f9eSGabriel Fernandez #define STM32_OSC(_name, _flags, _gate_id)\
251928c10f9eSGabriel Fernandez 	struct clk _name = {\
252028c10f9eSGabriel Fernandez 		.ops = &clk_stm32_osc_ops,\
252128c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_gate_cfg){\
252228c10f9eSGabriel Fernandez 			.gate_id = (_gate_id),\
252328c10f9eSGabriel Fernandez 		},\
252428c10f9eSGabriel Fernandez 		.name = #_name,\
252528c10f9eSGabriel Fernandez 		.flags = (_flags),\
252628c10f9eSGabriel Fernandez 		.num_parents = 1,\
252728c10f9eSGabriel Fernandez 		.parents = { NULL },\
252828c10f9eSGabriel Fernandez 	}
252928c10f9eSGabriel Fernandez 
253028c10f9eSGabriel Fernandez #define STM32_OSC_MSI(_name, _flags, _gate_id)\
253128c10f9eSGabriel Fernandez 	struct clk _name = {\
253228c10f9eSGabriel Fernandez 		.ops = &clk_stm32_oscillator_msi_ops,\
253328c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_gate_cfg){\
253428c10f9eSGabriel Fernandez 			.gate_id = (_gate_id),\
253528c10f9eSGabriel Fernandez 		},\
253628c10f9eSGabriel Fernandez 		.name = #_name,\
253728c10f9eSGabriel Fernandez 		.flags = (_flags),\
253828c10f9eSGabriel Fernandez 		.num_parents = 1,\
253928c10f9eSGabriel Fernandez 		.parents = { NULL },\
254028c10f9eSGabriel Fernandez 	}
254128c10f9eSGabriel Fernandez 
254228c10f9eSGabriel Fernandez #define STM32_HSE_DIV2(_name, _parent, _flags, _gate_id)\
254328c10f9eSGabriel Fernandez 	struct clk _name = {\
254428c10f9eSGabriel Fernandez 		.ops = &clk_hsediv2_ops,\
254528c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_gate_cfg){\
254628c10f9eSGabriel Fernandez 			.gate_id = (_gate_id),\
254728c10f9eSGabriel Fernandez 		},\
254828c10f9eSGabriel Fernandez 		.name = #_name,\
254928c10f9eSGabriel Fernandez 		.flags = (_flags),\
255028c10f9eSGabriel Fernandez 		.num_parents = 1,\
255128c10f9eSGabriel Fernandez 		.parents = { (_parent) },\
255228c10f9eSGabriel Fernandez 	}
255328c10f9eSGabriel Fernandez 
255428c10f9eSGabriel Fernandez #define STM32_HSE_RTC(_name, _parent, _flags, _div_id)\
255528c10f9eSGabriel Fernandez 	struct clk _name = {\
255628c10f9eSGabriel Fernandez 		.ops = &clk_stm32_hse_div_ops,\
255728c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_div_cfg){\
255828c10f9eSGabriel Fernandez 			.div_id = (_div_id),\
255928c10f9eSGabriel Fernandez 		},\
256028c10f9eSGabriel Fernandez 		.name = #_name,\
256128c10f9eSGabriel Fernandez 		.flags = (_flags),\
256228c10f9eSGabriel Fernandez 		.num_parents = 1,\
256328c10f9eSGabriel Fernandez 		.parents = { (_parent) },\
256428c10f9eSGabriel Fernandez 	}
256528c10f9eSGabriel Fernandez 
256628c10f9eSGabriel Fernandez #define STM32_PLL1(_name, _flags, _mux_id)\
256728c10f9eSGabriel Fernandez 	struct clk _name = {\
256828c10f9eSGabriel Fernandez 		.ops = &clk_stm32_pll1_ops,\
256928c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_pll_cfg){\
257028c10f9eSGabriel Fernandez 			.mux_id = (_mux_id),\
257128c10f9eSGabriel Fernandez 		},\
257228c10f9eSGabriel Fernandez 		.name = #_name,\
257328c10f9eSGabriel Fernandez 		.flags = (_flags),\
257428c10f9eSGabriel Fernandez 		.num_parents = PLL_NUM_PATENTS,\
257528c10f9eSGabriel Fernandez 		.parents = PLL_PARENTS,\
257628c10f9eSGabriel Fernandez 	}
257728c10f9eSGabriel Fernandez 
257828c10f9eSGabriel Fernandez #define STM32_PLL2(_name, _flags, _reg, _gate_id, _mux_id)\
257928c10f9eSGabriel Fernandez 	struct clk _name = {\
258028c10f9eSGabriel Fernandez 		.ops = &clk_stm32_pll_ops,\
258128c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_pll_cfg){\
258228c10f9eSGabriel Fernandez 			.pll_offset = (_reg),\
258328c10f9eSGabriel Fernandez 			.gate_id = (_gate_id),\
258428c10f9eSGabriel Fernandez 			.mux_id = (_mux_id),\
258528c10f9eSGabriel Fernandez 		},\
258628c10f9eSGabriel Fernandez 		.name = #_name,\
258728c10f9eSGabriel Fernandez 		.flags = (_flags),\
258828c10f9eSGabriel Fernandez 		.num_parents = PLL_NUM_PATENTS,\
258928c10f9eSGabriel Fernandez 		.parents = PLL_PARENTS,\
259028c10f9eSGabriel Fernandez 	}
259128c10f9eSGabriel Fernandez 
259228c10f9eSGabriel Fernandez #define STM32_PLL3(_name, _flags, _reg, _gate_id, _mux_id)\
259328c10f9eSGabriel Fernandez 	struct clk _name = {\
259428c10f9eSGabriel Fernandez 		.ops = &clk_stm32_pll3_ops,\
259528c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_pll_cfg){\
259628c10f9eSGabriel Fernandez 			.pll_offset = (_reg),\
259728c10f9eSGabriel Fernandez 			.gate_id = (_gate_id),\
259828c10f9eSGabriel Fernandez 			.mux_id = (_mux_id),\
259928c10f9eSGabriel Fernandez 		},\
260028c10f9eSGabriel Fernandez 		.name = #_name,\
260128c10f9eSGabriel Fernandez 		.flags = (_flags),\
260228c10f9eSGabriel Fernandez 		.num_parents = PLL_NUM_PATENTS,\
260328c10f9eSGabriel Fernandez 		.parents = PLL_PARENTS,\
260428c10f9eSGabriel Fernandez 	}
260528c10f9eSGabriel Fernandez 
260628c10f9eSGabriel Fernandez #define STM32_PLLS(_name, _flags, _reg, _gate_id, _mux_id)\
260728c10f9eSGabriel Fernandez 	struct clk _name = {\
260828c10f9eSGabriel Fernandez 		.ops = &clk_stm32_pll_ops,\
260928c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_pll_cfg){\
261028c10f9eSGabriel Fernandez 			.pll_offset = (_reg),\
261128c10f9eSGabriel Fernandez 			.gate_id = (_gate_id),\
261228c10f9eSGabriel Fernandez 			.mux_id = (_mux_id),\
261328c10f9eSGabriel Fernandez 		},\
261428c10f9eSGabriel Fernandez 		.name = #_name,\
261528c10f9eSGabriel Fernandez 		.flags = (_flags),\
261628c10f9eSGabriel Fernandez 		.num_parents = PLL_NUM_PATENTS,\
261728c10f9eSGabriel Fernandez 		.parents = PLL_PARENTS,\
261828c10f9eSGabriel Fernandez 	}
261928c10f9eSGabriel Fernandez 
262028c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_off, RCC_0_MHZ);
262128c10f9eSGabriel Fernandez 
262228c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_obser0, 0);
262328c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_obser1, 0);
262428c10f9eSGabriel Fernandez static STM32_FIXED_RATE(spdifsymb, 0);
262528c10f9eSGabriel Fernandez static STM32_FIXED_RATE(txbyteclk, 27000000);
262628c10f9eSGabriel Fernandez 
262728c10f9eSGabriel Fernandez /* Oscillator clocks */
262828c10f9eSGabriel Fernandez static STM32_OSC(ck_hsi, 0, GATE_HSI);
262928c10f9eSGabriel Fernandez static STM32_OSC(ck_hse, 0, GATE_HSE);
263028c10f9eSGabriel Fernandez static STM32_OSC_MSI(ck_msi, 0, GATE_MSI);
263128c10f9eSGabriel Fernandez static STM32_OSC(ck_lsi, 0, GATE_LSI);
263228c10f9eSGabriel Fernandez static STM32_OSC(ck_lse, 0, GATE_LSE);
263328c10f9eSGabriel Fernandez 
263428c10f9eSGabriel Fernandez static STM32_HSE_DIV2(ck_hse_div2, &ck_hse, 0, GATE_HSEDIV2);
263528c10f9eSGabriel Fernandez static STM32_HSE_RTC(ck_hse_rtc, &ck_hse, 0, DIV_RTC);
263628c10f9eSGabriel Fernandez 
263728c10f9eSGabriel Fernandez static STM32_FIXED_FACTOR(i2sckin, NULL, 0, 1, 1);
263828c10f9eSGabriel Fernandez 
263928c10f9eSGabriel Fernandez static STM32_PLL1(ck_pll1, 0, MUX_MUXSEL5);
264028c10f9eSGabriel Fernandez static STM32_PLL2(ck_pll2, 0, RCC_PLL2CFGR1, GATE_PLL2, MUX_MUXSEL6);
264128c10f9eSGabriel Fernandez static STM32_PLL3(ck_pll3, 0, RCC_PLL3CFGR1, GATE_PLL3, MUX_MUXSEL7);
264228c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll4, 0, RCC_PLL4CFGR1, GATE_PLL4, MUX_MUXSEL0);
264328c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll5, 0, RCC_PLL5CFGR1, GATE_PLL5, MUX_MUXSEL1);
264428c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll6, 0, RCC_PLL6CFGR1, GATE_PLL6, MUX_MUXSEL2);
264528c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll7, 0, RCC_PLL7CFGR1, GATE_PLL7, MUX_MUXSEL3);
264628c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll8, 0, RCC_PLL8CFGR1, GATE_PLL8, MUX_MUXSEL4);
264728c10f9eSGabriel Fernandez 
264828c10f9eSGabriel Fernandez #define STM32_FLEXGEN(_name, _flags, _flex_id)\
264928c10f9eSGabriel Fernandez 	struct clk _name = {\
265028c10f9eSGabriel Fernandez 		.ops = &clk_stm32_flexgen_ops,\
265128c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_flexgen_cfg){\
265228c10f9eSGabriel Fernandez 			.flex_id = (_flex_id),\
265328c10f9eSGabriel Fernandez 		},\
265428c10f9eSGabriel Fernandez 		.name = #_name,\
265528c10f9eSGabriel Fernandez 		.flags = (_flags) | CLK_SET_RATE_UNGATE,\
265628c10f9eSGabriel Fernandez 		.num_parents = 15,\
265728c10f9eSGabriel Fernandez 		.parents = {\
265828c10f9eSGabriel Fernandez 			&ck_pll4, &ck_pll5, &ck_pll6, &ck_pll7, &ck_pll8,\
265928c10f9eSGabriel Fernandez 			&ck_hsi, &ck_hse, &ck_msi, &ck_hsi, &ck_hse, &ck_msi,\
266028c10f9eSGabriel Fernandez 			&spdifsymb, &i2sckin, &ck_lsi, &ck_lse\
266128c10f9eSGabriel Fernandez 		},\
266228c10f9eSGabriel Fernandez 	}
266328c10f9eSGabriel Fernandez 
266428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_hs_mcu, 0, 0);
266528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_sdmmc, 0, 1);
266628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_ddr, 0, 2);
266728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_display, 0, 3);
266828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_hsl, 0, 4);
266928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_nic, 0, 5);
267028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_vid, 0, 6);
267128c10f9eSGabriel Fernandez 
267228c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_ls_mcu, &ck_icn_hs_mcu, 0, DIV_LSMCU);
267328c10f9eSGabriel Fernandez 
267428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_07, 0, 7);
267528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_08, 0, 8);
267628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_09, 0, 9);
267728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_10, 0, 10);
267828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_11, 0, 11);
267928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_12, 0, 12);
268028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_13, 0, 13);
268128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_14, 0, 14);
268228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_15, 0, 15);
268328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_16, 0, 16);
268428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_17, 0, 17);
268528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_18, 0, 18);
268628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_19, 0, 19);
268728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_20, 0, 20);
268828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_21, 0, 21);
268928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_22, 0, 22);
269028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_23, 0, 23);
269128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_24, 0, 24);
269228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_25, 0, 25);
269328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_26, 0, 26);
269428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_27, 0, 27);
269528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_28, 0, 28);
269628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_29, 0, 29);
269728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_30, 0, 30);
269828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_31, 0, 31);
269928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_32, 0, 32);
270028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_33, 0, 33);
270128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_34, 0, 34);
270228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_35, 0, 35);
270328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_36, 0, 36);
270428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_37, 0, 37);
270528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_38, 0, 38);
270628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_39, 0, 39);
270728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_40, 0, 40);
270828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_41, 0, 41);
270928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_42, 0, 42);
271028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_43, 0, 43);
271128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_44, 0, 44);
271228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_45, 0, 45);
271328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_46, 0, 46);
271428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_47, 0, 47);
271528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_48, 0, 48);
271628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_49, 0, 49);
271728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_50, 0, 50);
271828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_51, 0, 51);
271928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_52, 0, 52);
272028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_53, 0, 53);
272128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_54, 0, 54);
272228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_55, 0, 55);
272328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_56, 0, 56);
272428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_57, 0, 57);
272528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_58, 0, 58);
272628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_59, 0, 59);
272728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_60, 0, 60);
272828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_61, 0, 61);
272928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_62, 0, 62);
273028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_63, 0, 63);
273128c10f9eSGabriel Fernandez 
273228c10f9eSGabriel Fernandez static struct clk ck_cpu1 = {
273328c10f9eSGabriel Fernandez 	.ops		= &clk_stm32_cpu1_ops,
273428c10f9eSGabriel Fernandez 	.name		= "ck_cpu1",
273528c10f9eSGabriel Fernandez 	.flags		= CLK_SET_RATE_PARENT,
273628c10f9eSGabriel Fernandez 	.num_parents	= 2,
273728c10f9eSGabriel Fernandez 	.parents	= { &ck_pll1, &ck_flexgen_63 },
273828c10f9eSGabriel Fernandez };
273928c10f9eSGabriel Fernandez 
274028c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb1, &ck_icn_ls_mcu, 0, DIV_APB1);
274128c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb2, &ck_icn_ls_mcu, 0, DIV_APB2);
274228c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb3, &ck_icn_ls_mcu, 0, DIV_APB3);
274328c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb4, &ck_icn_ls_mcu, 0, DIV_APB4);
274428c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_icn_apbdbg, 1, { &ck_icn_ls_mcu }, 0,
274528c10f9eSGabriel Fernandez 		       GATE_DBG, DIV_APBDBG, NO_MUX);
274628c10f9eSGabriel Fernandez 
274728c10f9eSGabriel Fernandez #define STM32_TIMER(_name, _parent, _flags, _apbdiv, _timpre)\
274828c10f9eSGabriel Fernandez 	struct clk _name = {\
274928c10f9eSGabriel Fernandez 		.ops = &ck_timer_ops,\
275028c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_timer_cfg){\
275128c10f9eSGabriel Fernandez 			.apbdiv = (_apbdiv),\
275228c10f9eSGabriel Fernandez 			.timpre = (_timpre),\
275328c10f9eSGabriel Fernandez 		},\
275428c10f9eSGabriel Fernandez 		.name = #_name,\
275528c10f9eSGabriel Fernandez 		.flags = (_flags),\
275628c10f9eSGabriel Fernandez 		.num_parents = 1,\
275728c10f9eSGabriel Fernandez 		.parents = { _parent },\
275828c10f9eSGabriel Fernandez 	}
275928c10f9eSGabriel Fernandez 
276028c10f9eSGabriel Fernandez /* Kernel Timers */
276128c10f9eSGabriel Fernandez static STM32_TIMER(ck_timg1, &ck_icn_apb1, 0, RCC_APB1DIVR, RCC_TIMG1PRER);
276228c10f9eSGabriel Fernandez static STM32_TIMER(ck_timg2, &ck_icn_apb2, 0, RCC_APB2DIVR, RCC_TIMG2PRER);
276328c10f9eSGabriel Fernandez 
276428c10f9eSGabriel Fernandez /* Clocks under RCC RIF protection */
276528c10f9eSGabriel Fernandez static STM32_GATE(ck_sys_dbg, &ck_icn_apbdbg, 0, GATE_DBG);
276628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_stm, &ck_icn_apbdbg, 0, GATE_STM);
276728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_stm, &ck_icn_ls_mcu, 0, GATE_STM);
276828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tsdbg, &ck_flexgen_43, 0, GATE_DBG);
276928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tpiu, &ck_flexgen_44, 0, GATE_TRACE);
277028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_etr, &ck_icn_apbdbg, 0, GATE_ETR);
277128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_etr, &ck_flexgen_45, 0, GATE_ETR);
277228c10f9eSGabriel Fernandez static STM32_GATE(ck_sys_atb, &ck_flexgen_45, 0, GATE_DBG);
277328c10f9eSGabriel Fernandez 
277428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sysram, &ck_icn_hs_mcu, 0, GATE_SYSRAM);
277528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_vderam, &ck_icn_hs_mcu, 0, GATE_VDERAM);
277628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_retram, &ck_icn_hs_mcu, 0, GATE_RETRAM);
277728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_bkpsram, &ck_icn_ls_mcu, 0, GATE_BKPSRAM);
277828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sram1, &ck_icn_hs_mcu, 0, GATE_SRAM1);
277928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sram2, &ck_icn_hs_mcu, 0, GATE_SRAM2);
278028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram1, &ck_icn_ls_mcu, 0, GATE_LPSRAM1);
278128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram2, &ck_icn_ls_mcu, 0, GATE_LPSRAM2);
278228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram3, &ck_icn_ls_mcu, 0, GATE_LPSRAM3);
278328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma1, &ck_icn_ls_mcu, 0, GATE_HPDMA1);
278428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma2, &ck_icn_ls_mcu, 0, GATE_HPDMA2);
278528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma3, &ck_icn_ls_mcu, 0, GATE_HPDMA3);
278628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lpdma, &ck_icn_ls_mcu, 0, GATE_LPDMA);
278728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ipcc1, &ck_icn_ls_mcu, 0, GATE_IPCC1);
278828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ipcc2, &ck_icn_ls_mcu, 0, GATE_IPCC2);
278928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hsem, &ck_icn_ls_mcu, 0, GATE_HSEM);
279028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioa, &ck_icn_ls_mcu, 0, GATE_GPIOA);
279128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiob, &ck_icn_ls_mcu, 0, GATE_GPIOB);
279228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioc, &ck_icn_ls_mcu, 0, GATE_GPIOC);
279328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiod, &ck_icn_ls_mcu, 0, GATE_GPIOD);
279428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioe, &ck_icn_ls_mcu, 0, GATE_GPIOE);
279528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiof, &ck_icn_ls_mcu, 0, GATE_GPIOF);
279628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiog, &ck_icn_ls_mcu, 0, GATE_GPIOG);
279728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioh, &ck_icn_ls_mcu, 0, GATE_GPIOH);
279828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioi, &ck_icn_ls_mcu, 0, GATE_GPIOI);
279928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioj, &ck_icn_ls_mcu, 0, GATE_GPIOJ);
280028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiok, &ck_icn_ls_mcu, 0, GATE_GPIOK);
280128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioz, &ck_icn_ls_mcu, 0, GATE_GPIOZ);
280228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_rtc, &ck_icn_ls_mcu, 0, GATE_RTC);
280328c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_rtc, 4,
280428c10f9eSGabriel Fernandez 		       PARENT(&ck_off, &ck_lse, &ck_lsi, &ck_hse_rtc),
280528c10f9eSGabriel Fernandez 		       0, GATE_RTCCK, NO_DIV, MUX_RTC);
280628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_bsec, &ck_icn_apb3, 0, GATE_BSEC);
280728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrphyc, &ck_icn_ls_mcu, 0, GATE_DDRPHYCAPB);
280828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_risaf4, &ck_icn_ls_mcu, 0, GATE_DDRCP);
280928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ddr, &ck_icn_ddr, 0, GATE_DDRCP);
281028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrc, &ck_icn_apb4, 0, GATE_DDRCAPB);
281128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrcfg, &ck_icn_apb4, 0, GATE_DDRCFG);
281228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_syscpu1, &ck_icn_ls_mcu, 0, GATE_SYSCPU1);
281328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_is2m, &ck_icn_apb3, 0, GATE_IS2M);
281428c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_mco1, 2, PARENT(&ck_flexgen_61, &ck_obser0), 0,
281528c10f9eSGabriel Fernandez 		       GATE_MCO1, NO_DIV, MUX_MCO1);
281628c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_mco2, 2, PARENT(&ck_flexgen_62, &ck_obser1), 0,
281728c10f9eSGabriel Fernandez 		       GATE_MCO2, NO_DIV, MUX_MCO2);
281828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ospi1, &ck_icn_hs_mcu, 0, GATE_OSPI1);
281928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ospi1, &ck_flexgen_48, 0, GATE_OSPI1);
282028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ospi2, &ck_icn_hs_mcu, 0, GATE_OSPI2);
282128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ospi2, &ck_flexgen_49, 0, GATE_OSPI2);
282228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_fmc, &ck_icn_ls_mcu, 0, GATE_FMC);
282328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_fmc, &ck_flexgen_50, 0, GATE_FMC);
282428c10f9eSGabriel Fernandez 
282528c10f9eSGabriel Fernandez /* Kernel Clocks */
282628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cci, &ck_icn_ls_mcu, 0, GATE_CCI);
282728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_crc, &ck_icn_ls_mcu, 0, GATE_CRC);
282828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ospiiom, &ck_icn_ls_mcu, 0, GATE_OSPIIOM);
282928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hash, &ck_icn_ls_mcu, 0, GATE_HASH);
283028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_rng, &ck_icn_ls_mcu, 0, GATE_RNG);
283128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cryp1, &ck_icn_ls_mcu, 0, GATE_CRYP1);
283228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cryp2, &ck_icn_ls_mcu, 0, GATE_CRYP2);
283328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_saes, &ck_icn_ls_mcu, 0, GATE_SAES);
283428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_pka, &ck_icn_ls_mcu, 0, GATE_PKA);
283528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adf1, &ck_icn_ls_mcu, 0, GATE_ADF1);
283628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg5, &ck_icn_ls_mcu, 0, GATE_IWDG5);
283728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_wwdg2, &ck_icn_ls_mcu, 0, GATE_WWDG2);
283828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_eth1, &ck_icn_ls_mcu, 0, GATE_ETH1);
283928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ethsw, &ck_icn_ls_mcu, 0, GATE_ETHSWMAC);
284028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_eth2, &ck_icn_ls_mcu, 0, GATE_ETH2);
284128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_pcie, &ck_icn_ls_mcu, 0, GATE_PCIE);
284228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adc12, &ck_icn_ls_mcu, 0, GATE_ADC12);
284328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adc3, &ck_icn_ls_mcu, 0, GATE_ADC3);
284428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_mdf1, &ck_icn_ls_mcu, 0, GATE_MDF1);
284528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi8, &ck_icn_ls_mcu, 0, GATE_SPI8);
284628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lpuart1, &ck_icn_ls_mcu, 0, GATE_LPUART1);
284728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c8, &ck_icn_ls_mcu, 0, GATE_I2C8);
284828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim3, &ck_icn_ls_mcu, 0, GATE_LPTIM3);
284928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim4, &ck_icn_ls_mcu, 0, GATE_LPTIM4);
285028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim5, &ck_icn_ls_mcu, 0, GATE_LPTIM5);
285128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc1, &ck_icn_sdmmc, 0, GATE_SDMMC1);
285228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc2, &ck_icn_sdmmc, 0, GATE_SDMMC2);
285328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc3, &ck_icn_sdmmc, 0, GATE_SDMMC3);
285428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb2ohci, &ck_icn_hsl, 0, GATE_USB2);
285528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb2ehci, &ck_icn_hsl, 0, GATE_USB2);
285628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb3dr, &ck_icn_hsl, 0, GATE_USB3DR);
285728c10f9eSGabriel Fernandez 
285828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim2, &ck_icn_apb1, 0, GATE_TIM2);
285928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim3, &ck_icn_apb1, 0, GATE_TIM3);
286028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim4, &ck_icn_apb1, 0, GATE_TIM4);
286128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim5, &ck_icn_apb1, 0, GATE_TIM5);
286228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim6, &ck_icn_apb1, 0, GATE_TIM6);
286328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim7, &ck_icn_apb1, 0, GATE_TIM7);
286428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim10, &ck_icn_apb1, 0, GATE_TIM10);
286528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim11, &ck_icn_apb1, 0, GATE_TIM11);
286628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim12, &ck_icn_apb1, 0, GATE_TIM12);
286728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim13, &ck_icn_apb1, 0, GATE_TIM13);
286828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim14, &ck_icn_apb1, 0, GATE_TIM14);
286928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim1, &ck_icn_apb1, 0, GATE_LPTIM1);
287028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim2, &ck_icn_apb1, 0, GATE_LPTIM2);
287128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi2, &ck_icn_apb1, 0, GATE_SPI2);
287228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi3, &ck_icn_apb1, 0, GATE_SPI3);
287328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spdifrx, &ck_icn_apb1, 0, GATE_SPDIFRX);
287428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart2, &ck_icn_apb1, 0, GATE_USART2);
287528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart3, &ck_icn_apb1, 0, GATE_USART3);
287628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart4, &ck_icn_apb1, 0, GATE_UART4);
287728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart5, &ck_icn_apb1, 0, GATE_UART5);
287828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c1, &ck_icn_apb1, 0, GATE_I2C1);
287928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c2, &ck_icn_apb1, 0, GATE_I2C2);
288028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c3, &ck_icn_apb1, 0, GATE_I2C3);
288128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c4, &ck_icn_apb1, 0, GATE_I2C4);
288228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c5, &ck_icn_apb1, 0, GATE_I2C5);
288328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c6, &ck_icn_apb1, 0, GATE_I2C6);
288428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c7, &ck_icn_apb1, 0, GATE_I2C7);
288528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c1, &ck_icn_apb1, 0, GATE_I3C1);
288628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c2, &ck_icn_apb1, 0, GATE_I3C2);
288728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c3, &ck_icn_apb1, 0, GATE_I3C3);
288828c10f9eSGabriel Fernandez 
288928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c4, &ck_icn_ls_mcu, 0, GATE_I3C4);
289028c10f9eSGabriel Fernandez 
289128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim1, &ck_icn_apb2, 0, GATE_TIM1);
289228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim8, &ck_icn_apb2, 0, GATE_TIM8);
289328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim15, &ck_icn_apb2, 0, GATE_TIM15);
289428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim16, &ck_icn_apb2, 0, GATE_TIM16);
289528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim17, &ck_icn_apb2, 0, GATE_TIM17);
289628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim20, &ck_icn_apb2, 0, GATE_TIM20);
289728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai1, &ck_icn_apb2, 0, GATE_SAI1);
289828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai2, &ck_icn_apb2, 0, GATE_SAI2);
289928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai3, &ck_icn_apb2, 0, GATE_SAI3);
290028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai4, &ck_icn_apb2, 0, GATE_SAI4);
290128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart1, &ck_icn_apb2, 0, GATE_USART1);
290228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart6, &ck_icn_apb2, 0, GATE_USART6);
290328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart7, &ck_icn_apb2, 0, GATE_UART7);
290428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart8, &ck_icn_apb2, 0, GATE_UART8);
290528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart9, &ck_icn_apb2, 0, GATE_UART9);
290628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_fdcan, &ck_icn_apb2, 0, GATE_FDCAN);
290728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi1, &ck_icn_apb2, 0, GATE_SPI1);
290828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi4, &ck_icn_apb2, 0, GATE_SPI4);
290928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi5, &ck_icn_apb2, 0, GATE_SPI5);
291028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi6, &ck_icn_apb2, 0, GATE_SPI6);
291128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi7, &ck_icn_apb2, 0, GATE_SPI7);
291228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg1, &ck_icn_apb3, 0, GATE_IWDG1);
291328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg2, &ck_icn_apb3, 0, GATE_IWDG2);
291428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg3, &ck_icn_apb3, 0, GATE_IWDG3);
291528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg4, &ck_icn_apb3, 0, GATE_IWDG4);
291628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_wwdg1, &ck_icn_apb3, 0, GATE_WWDG1);
291728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_vref, &ck_icn_apb3, 0, GATE_VREF);
291828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dts, &ck_icn_apb3, 0, GATE_DTS);
291928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_serc, &ck_icn_apb3, 0, GATE_SERC);
292028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hdp, &ck_icn_apb3, 0, GATE_HDP);
292128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dsi, &ck_icn_apb4, 0, GATE_DSI);
292228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ltdc, &ck_icn_apb4, 0, GATE_LTDC);
292328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_csi, &ck_icn_apb4, 0, GATE_CSI);
292428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dcmipp, &ck_icn_apb4, 0, GATE_DCMIPP);
292528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lvds, &ck_icn_apb4, 0, GATE_LVDS);
292628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gicv2m, &ck_icn_apb4, 0, GATE_GICV2M);
292728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usbtc, &ck_icn_apb4, 0, GATE_USBTC);
292828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usb3pciephy, &ck_icn_apb4, 0, GATE_USB3PCIEPHY);
292928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_stgen, &ck_icn_apb4, 0, GATE_STGEN);
293028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_vdec, &ck_icn_apb4, 0, GATE_VDEC);
293128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_venc, &ck_icn_apb4, 0, GATE_VENC);
293228c10f9eSGabriel Fernandez 
293328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim2, &ck_timg1, 0, GATE_TIM2);
293428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim3, &ck_timg1, 0, GATE_TIM3);
293528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim4, &ck_timg1, 0, GATE_TIM4);
293628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim5, &ck_timg1, 0, GATE_TIM5);
293728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim6, &ck_timg1, 0, GATE_TIM6);
293828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim7, &ck_timg1, 0, GATE_TIM7);
293928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim10, &ck_timg1, 0, GATE_TIM10);
294028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim11, &ck_timg1, 0, GATE_TIM11);
294128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim12, &ck_timg1, 0, GATE_TIM12);
294228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim13, &ck_timg1, 0, GATE_TIM13);
294328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim14, &ck_timg1, 0, GATE_TIM14);
294428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim1, &ck_timg2, 0, GATE_TIM1);
294528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim8, &ck_timg2, 0, GATE_TIM8);
294628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim15, &ck_timg2, 0, GATE_TIM15);
294728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim16, &ck_timg2, 0, GATE_TIM16);
294828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim17, &ck_timg2, 0, GATE_TIM17);
294928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim20, &ck_timg2, 0, GATE_TIM20);
295028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim1, &ck_flexgen_07, 0, GATE_LPTIM1);
295128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim2, &ck_flexgen_07, 0, GATE_LPTIM2);
295228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart2, &ck_flexgen_08, 0, GATE_USART2);
295328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart4, &ck_flexgen_08, 0, GATE_UART4);
295428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart3, &ck_flexgen_09, 0, GATE_USART3);
295528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart5, &ck_flexgen_09, 0, GATE_UART5);
295628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi2, &ck_flexgen_10, 0, GATE_SPI2);
295728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi3, &ck_flexgen_10, 0, GATE_SPI3);
295828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spdifrx, &ck_flexgen_11, 0, GATE_SPDIFRX);
295928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c1, &ck_flexgen_12, 0, GATE_I2C1);
296028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c2, &ck_flexgen_12, 0, GATE_I2C2);
296128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c1, &ck_flexgen_12, 0, GATE_I3C1);
296228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c2, &ck_flexgen_12, 0, GATE_I3C2);
296328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c3, &ck_flexgen_13, 0, GATE_I2C3);
296428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c5, &ck_flexgen_13, 0, GATE_I2C5);
296528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c3, &ck_flexgen_13, 0, GATE_I3C3);
296628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c4, &ck_flexgen_14, 0, GATE_I2C4);
296728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c6, &ck_flexgen_14, 0, GATE_I2C6);
296828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c7, &ck_flexgen_15, 0, GATE_I2C7);
296928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi1, &ck_flexgen_16, 0, GATE_SPI1);
297028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi4, &ck_flexgen_17, 0, GATE_SPI4);
297128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi5, &ck_flexgen_17, 0, GATE_SPI5);
297228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi6, &ck_flexgen_18, 0, GATE_SPI6);
297328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi7, &ck_flexgen_18, 0, GATE_SPI7);
297428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart1, &ck_flexgen_19, 0, GATE_USART1);
297528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart6, &ck_flexgen_20, 0, GATE_USART6);
297628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart7, &ck_flexgen_21, 0, GATE_UART7);
297728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart8, &ck_flexgen_21, 0, GATE_UART8);
297828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart9, &ck_flexgen_22, 0, GATE_UART9);
297928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_mdf1, &ck_flexgen_23, 0, GATE_MDF1);
298028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai1, &ck_flexgen_23, 0, GATE_SAI1);
298128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai2, &ck_flexgen_24, 0, GATE_SAI2);
298228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai3, &ck_flexgen_25, 0, GATE_SAI3);
298328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai4, &ck_flexgen_25, 0, GATE_SAI4);
298428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_fdcan, &ck_flexgen_26, 0, GATE_FDCAN);
298528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csi, &ck_flexgen_29, 0, GATE_CSI);
298628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csitxesc, &ck_flexgen_30, 0, GATE_CSI);
298728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csiphy, &ck_flexgen_31, 0, GATE_CSI);
298828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_stgen, &ck_flexgen_33, CLK_SET_RATE_PARENT,
298928c10f9eSGabriel Fernandez 		  GATE_STGEN);
299028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usbtc, &ck_flexgen_35, 0, GATE_USBTC);
299128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c4, &ck_flexgen_36, 0, GATE_I3C4);
299228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi8, &ck_flexgen_37, 0, GATE_SPI8);
299328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c8, &ck_flexgen_38, 0, GATE_I2C8);
299428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lpuart1, &ck_flexgen_39, 0, GATE_LPUART1);
299528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim3, &ck_flexgen_40, 0, GATE_LPTIM3);
299628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim4, &ck_flexgen_41, 0, GATE_LPTIM4);
299728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim5, &ck_flexgen_41, 0, GATE_LPTIM5);
299828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_adf1, &ck_flexgen_42, 0, GATE_ADF1);
299928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc1, &ck_flexgen_51, 0, GATE_SDMMC1);
300028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc2, &ck_flexgen_52, 0, GATE_SDMMC2);
300128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc3, &ck_flexgen_53, 0, GATE_SDMMC3);
300228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1, &ck_flexgen_54, 0, GATE_ETH1);
300328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ethsw, &ck_flexgen_54, 0, GATE_ETHSW);
300428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2, &ck_flexgen_55, 0, GATE_ETH2);
300528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1ptp, &ck_flexgen_56, 0, GATE_ETH1);
300628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2ptp, &ck_flexgen_56, 0, GATE_ETH2);
300728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usb2phy2, &ck_flexgen_58, 0, GATE_USB3DR);
300828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_gpu, &ck_flexgen_59, 0, GATE_GPU);
300928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_gpu, &ck_pll3, 0, GATE_GPU);
301028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ethswref, &ck_flexgen_60, 0, GATE_ETHSWREF);
301128c10f9eSGabriel Fernandez 
301228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1stp, &ck_icn_ls_mcu, 0, GATE_ETH1STP);
301328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2stp, &ck_icn_ls_mcu, 0, GATE_ETH2STP);
301428c10f9eSGabriel Fernandez 
301528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ltdc, &ck_flexgen_27, CLK_SET_RATE_PARENT,
301628c10f9eSGabriel Fernandez 		  GATE_LTDC);
301728c10f9eSGabriel Fernandez 
301828c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_adc12, 2, PARENT(&ck_flexgen_46, &ck_icn_ls_mcu),
301928c10f9eSGabriel Fernandez 		       0, GATE_ADC12, NO_DIV, MUX_ADC12);
302028c10f9eSGabriel Fernandez 
302128c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_adc3, 3, PARENT(&ck_flexgen_47, &ck_icn_ls_mcu,
302228c10f9eSGabriel Fernandez 		       &ck_flexgen_46),
302328c10f9eSGabriel Fernandez 		       0, GATE_ADC3, NO_DIV, MUX_ADC3);
302428c10f9eSGabriel Fernandez 
302528c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb2phy1, 2, PARENT(&ck_flexgen_57,
302628c10f9eSGabriel Fernandez 		       &ck_hse_div2),
302728c10f9eSGabriel Fernandez 		       0, GATE_USB2PHY1, NO_DIV, MUX_USB2PHY1);
302828c10f9eSGabriel Fernandez 
302928c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb2phy2_en, 2, PARENT(&ck_flexgen_58,
303028c10f9eSGabriel Fernandez 		       &ck_hse_div2),
303128c10f9eSGabriel Fernandez 		       0, GATE_USB2PHY2, NO_DIV, MUX_USB2PHY2);
303228c10f9eSGabriel Fernandez 
303328c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb3pciephy, 2, PARENT(&ck_flexgen_34,
303428c10f9eSGabriel Fernandez 		       &ck_hse_div2),
303528c10f9eSGabriel Fernandez 		       0, GATE_USB3PCIEPHY, NO_DIV, MUX_USB3PCIEPHY);
303628c10f9eSGabriel Fernandez 
303728c10f9eSGabriel Fernandez static STM32_COMPOSITE(clk_lanebyte, 2, PARENT(&txbyteclk, &ck_ker_ltdc),
303828c10f9eSGabriel Fernandez 		       0, GATE_DSI, NO_DIV, MUX_DSIBLANE);
303928c10f9eSGabriel Fernandez 
304028c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_phy_dsi, 2, PARENT(&ck_flexgen_28, &ck_hse),
304128c10f9eSGabriel Fernandez 		       0, GATE_DSI, NO_DIV, MUX_DSIPHY);
304228c10f9eSGabriel Fernandez 
304328c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_lvdsphy, 2, PARENT(&ck_flexgen_32, &ck_hse),
304428c10f9eSGabriel Fernandez 		       0, GATE_LVDS, NO_DIV, MUX_LVDSPHY);
304528c10f9eSGabriel Fernandez 
304628c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_dts, 3, PARENT(&ck_hsi, &ck_hse, &ck_msi),
304728c10f9eSGabriel Fernandez 		       0, GATE_DTS, NO_DIV, MUX_DTS);
304828c10f9eSGabriel Fernandez 
304928c10f9eSGabriel Fernandez enum {
305028c10f9eSGabriel Fernandez 	CK_OFF = STM32MP25_LAST_CLK,
305128c10f9eSGabriel Fernandez 	I2SCKIN,
305228c10f9eSGabriel Fernandez 	SPDIFSYMB,
305328c10f9eSGabriel Fernandez 	CK_HSE_RTC,
305428c10f9eSGabriel Fernandez 	TXBYTECLK,
305528c10f9eSGabriel Fernandez 	CK_OBSER0,
305628c10f9eSGabriel Fernandez 	CK_OBSER1,
305728c10f9eSGabriel Fernandez 	STM32MP25_ALL_CLK_NB
305828c10f9eSGabriel Fernandez };
305928c10f9eSGabriel Fernandez 
306028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1mac, &ck_icn_ls_mcu, 0, GATE_ETH1MAC);
306128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1tx, &ck_icn_ls_mcu, 0, GATE_ETH1TX);
306228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1rx, &ck_icn_ls_mcu, 0, GATE_ETH1RX);
306328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2mac, &ck_icn_ls_mcu, 0, GATE_ETH2MAC);
306428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2tx, &ck_icn_ls_mcu, 0, GATE_ETH2TX);
306528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2rx, &ck_icn_ls_mcu, 0, GATE_ETH2RX);
306628c10f9eSGabriel Fernandez 
306728c10f9eSGabriel Fernandez static struct clk *stm32mp25_clk_provided[STM32MP25_ALL_CLK_NB] = {
306828c10f9eSGabriel Fernandez 	[HSI_CK]		= &ck_hsi,
306928c10f9eSGabriel Fernandez 	[HSE_CK]		= &ck_hse,
307028c10f9eSGabriel Fernandez 	[MSI_CK]		= &ck_msi,
307128c10f9eSGabriel Fernandez 	[LSI_CK]		= &ck_lsi,
307228c10f9eSGabriel Fernandez 	[LSE_CK]		= &ck_lse,
307328c10f9eSGabriel Fernandez 
307428c10f9eSGabriel Fernandez 	[HSE_DIV2_CK]		= &ck_hse_div2,
307528c10f9eSGabriel Fernandez 
307628c10f9eSGabriel Fernandez 	[PLL1_CK]		= &ck_pll1,
307728c10f9eSGabriel Fernandez 	[PLL2_CK]		= &ck_pll2,
307828c10f9eSGabriel Fernandez 	[PLL3_CK]		= &ck_pll3,
307928c10f9eSGabriel Fernandez 	[PLL4_CK]		= &ck_pll4,
308028c10f9eSGabriel Fernandez 	[PLL5_CK]		= &ck_pll5,
308128c10f9eSGabriel Fernandez 	[PLL6_CK]		= &ck_pll6,
308228c10f9eSGabriel Fernandez 	[PLL7_CK]		= &ck_pll7,
308328c10f9eSGabriel Fernandez 	[PLL8_CK]		= &ck_pll8,
308428c10f9eSGabriel Fernandez 
308528c10f9eSGabriel Fernandez 	[CK_ICN_HS_MCU]		= &ck_icn_hs_mcu,
308628c10f9eSGabriel Fernandez 	[CK_ICN_LS_MCU]		= &ck_icn_ls_mcu,
308728c10f9eSGabriel Fernandez 
308828c10f9eSGabriel Fernandez 	[CK_ICN_SDMMC]		= &ck_icn_sdmmc,
308928c10f9eSGabriel Fernandez 	[CK_ICN_DDR]		= &ck_icn_ddr,
309028c10f9eSGabriel Fernandez 	[CK_ICN_DISPLAY]	= &ck_icn_display,
309128c10f9eSGabriel Fernandez 	[CK_ICN_HSL]		= &ck_icn_hsl,
309228c10f9eSGabriel Fernandez 	[CK_ICN_NIC]		= &ck_icn_nic,
309328c10f9eSGabriel Fernandez 	[CK_ICN_VID]		= &ck_icn_vid,
309428c10f9eSGabriel Fernandez 	[CK_FLEXGEN_07]		= &ck_flexgen_07,
309528c10f9eSGabriel Fernandez 	[CK_FLEXGEN_08]		= &ck_flexgen_08,
309628c10f9eSGabriel Fernandez 	[CK_FLEXGEN_09]		= &ck_flexgen_09,
309728c10f9eSGabriel Fernandez 	[CK_FLEXGEN_10]		= &ck_flexgen_10,
309828c10f9eSGabriel Fernandez 	[CK_FLEXGEN_11]		= &ck_flexgen_11,
309928c10f9eSGabriel Fernandez 	[CK_FLEXGEN_12]		= &ck_flexgen_12,
310028c10f9eSGabriel Fernandez 	[CK_FLEXGEN_13]		= &ck_flexgen_13,
310128c10f9eSGabriel Fernandez 	[CK_FLEXGEN_14]		= &ck_flexgen_14,
310228c10f9eSGabriel Fernandez 	[CK_FLEXGEN_15]		= &ck_flexgen_15,
310328c10f9eSGabriel Fernandez 	[CK_FLEXGEN_16]		= &ck_flexgen_16,
310428c10f9eSGabriel Fernandez 	[CK_FLEXGEN_17]		= &ck_flexgen_17,
310528c10f9eSGabriel Fernandez 	[CK_FLEXGEN_18]		= &ck_flexgen_18,
310628c10f9eSGabriel Fernandez 	[CK_FLEXGEN_19]		= &ck_flexgen_19,
310728c10f9eSGabriel Fernandez 	[CK_FLEXGEN_20]		= &ck_flexgen_20,
310828c10f9eSGabriel Fernandez 	[CK_FLEXGEN_21]		= &ck_flexgen_21,
310928c10f9eSGabriel Fernandez 	[CK_FLEXGEN_22]		= &ck_flexgen_22,
311028c10f9eSGabriel Fernandez 	[CK_FLEXGEN_23]		= &ck_flexgen_23,
311128c10f9eSGabriel Fernandez 	[CK_FLEXGEN_24]		= &ck_flexgen_24,
311228c10f9eSGabriel Fernandez 	[CK_FLEXGEN_25]		= &ck_flexgen_25,
311328c10f9eSGabriel Fernandez 	[CK_FLEXGEN_26]		= &ck_flexgen_26,
311428c10f9eSGabriel Fernandez 	[CK_FLEXGEN_27]		= &ck_flexgen_27,
311528c10f9eSGabriel Fernandez 	[CK_FLEXGEN_28]		= &ck_flexgen_28,
311628c10f9eSGabriel Fernandez 	[CK_FLEXGEN_29]		= &ck_flexgen_29,
311728c10f9eSGabriel Fernandez 	[CK_FLEXGEN_30]		= &ck_flexgen_30,
311828c10f9eSGabriel Fernandez 	[CK_FLEXGEN_31]		= &ck_flexgen_31,
311928c10f9eSGabriel Fernandez 	[CK_FLEXGEN_32]		= &ck_flexgen_32,
312028c10f9eSGabriel Fernandez 	[CK_FLEXGEN_33]		= &ck_flexgen_33,
312128c10f9eSGabriel Fernandez 	[CK_FLEXGEN_34]		= &ck_flexgen_34,
312228c10f9eSGabriel Fernandez 	[CK_FLEXGEN_35]		= &ck_flexgen_35,
312328c10f9eSGabriel Fernandez 	[CK_FLEXGEN_36]		= &ck_flexgen_36,
312428c10f9eSGabriel Fernandez 	[CK_FLEXGEN_37]		= &ck_flexgen_37,
312528c10f9eSGabriel Fernandez 	[CK_FLEXGEN_38]		= &ck_flexgen_38,
312628c10f9eSGabriel Fernandez 	[CK_FLEXGEN_39]		= &ck_flexgen_39,
312728c10f9eSGabriel Fernandez 	[CK_FLEXGEN_40]		= &ck_flexgen_40,
312828c10f9eSGabriel Fernandez 	[CK_FLEXGEN_41]		= &ck_flexgen_41,
312928c10f9eSGabriel Fernandez 	[CK_FLEXGEN_42]		= &ck_flexgen_42,
313028c10f9eSGabriel Fernandez 	[CK_FLEXGEN_43]		= &ck_flexgen_43,
313128c10f9eSGabriel Fernandez 	[CK_FLEXGEN_44]		= &ck_flexgen_44,
313228c10f9eSGabriel Fernandez 	[CK_FLEXGEN_45]		= &ck_flexgen_45,
313328c10f9eSGabriel Fernandez 	[CK_FLEXGEN_46]		= &ck_flexgen_46,
313428c10f9eSGabriel Fernandez 	[CK_FLEXGEN_47]		= &ck_flexgen_47,
313528c10f9eSGabriel Fernandez 	[CK_FLEXGEN_48]		= &ck_flexgen_48,
313628c10f9eSGabriel Fernandez 	[CK_FLEXGEN_49]		= &ck_flexgen_49,
313728c10f9eSGabriel Fernandez 	[CK_FLEXGEN_50]		= &ck_flexgen_50,
313828c10f9eSGabriel Fernandez 	[CK_FLEXGEN_51]		= &ck_flexgen_51,
313928c10f9eSGabriel Fernandez 	[CK_FLEXGEN_52]		= &ck_flexgen_52,
314028c10f9eSGabriel Fernandez 	[CK_FLEXGEN_53]		= &ck_flexgen_53,
314128c10f9eSGabriel Fernandez 	[CK_FLEXGEN_54]		= &ck_flexgen_54,
314228c10f9eSGabriel Fernandez 	[CK_FLEXGEN_55]		= &ck_flexgen_55,
314328c10f9eSGabriel Fernandez 	[CK_FLEXGEN_56]		= &ck_flexgen_56,
314428c10f9eSGabriel Fernandez 	[CK_FLEXGEN_57]		= &ck_flexgen_57,
314528c10f9eSGabriel Fernandez 	[CK_FLEXGEN_58]		= &ck_flexgen_58,
314628c10f9eSGabriel Fernandez 	[CK_FLEXGEN_59]		= &ck_flexgen_59,
314728c10f9eSGabriel Fernandez 	[CK_FLEXGEN_60]		= &ck_flexgen_60,
314828c10f9eSGabriel Fernandez 	[CK_FLEXGEN_61]		= &ck_flexgen_61,
314928c10f9eSGabriel Fernandez 	[CK_FLEXGEN_62]		= &ck_flexgen_62,
315028c10f9eSGabriel Fernandez 	[CK_FLEXGEN_63]		= &ck_flexgen_63,
315128c10f9eSGabriel Fernandez 
315228c10f9eSGabriel Fernandez 	[CK_CPU1]		= &ck_cpu1,
315328c10f9eSGabriel Fernandez 
315428c10f9eSGabriel Fernandez 	[CK_ICN_APB1]		= &ck_icn_apb1,
315528c10f9eSGabriel Fernandez 	[CK_ICN_APB2]		= &ck_icn_apb2,
315628c10f9eSGabriel Fernandez 	[CK_ICN_APB3]		= &ck_icn_apb3,
315728c10f9eSGabriel Fernandez 	[CK_ICN_APB4]		= &ck_icn_apb4,
315828c10f9eSGabriel Fernandez 	[CK_ICN_APBDBG]		= &ck_icn_apbdbg,
315928c10f9eSGabriel Fernandez 
316028c10f9eSGabriel Fernandez 	[TIMG1_CK]		= &ck_timg1,
316128c10f9eSGabriel Fernandez 	[TIMG2_CK]		= &ck_timg2,
316228c10f9eSGabriel Fernandez 
316328c10f9eSGabriel Fernandez 	[CK_BUS_SYSRAM]		= &ck_icn_s_sysram,
316428c10f9eSGabriel Fernandez 	[CK_BUS_VDERAM]		= &ck_icn_s_vderam,
316528c10f9eSGabriel Fernandez 	[CK_BUS_RETRAM]		= &ck_icn_s_retram,
316628c10f9eSGabriel Fernandez 	[CK_BUS_SRAM1]		= &ck_icn_s_sram1,
316728c10f9eSGabriel Fernandez 	[CK_BUS_SRAM2]		= &ck_icn_s_sram2,
316828c10f9eSGabriel Fernandez 	[CK_BUS_OSPI1]		= &ck_icn_s_ospi1,
316928c10f9eSGabriel Fernandez 	[CK_BUS_OSPI2]		= &ck_icn_s_ospi2,
317028c10f9eSGabriel Fernandez 	[CK_BUS_BKPSRAM]	= &ck_icn_s_bkpsram,
317128c10f9eSGabriel Fernandez 	[CK_BUS_DDRPHYC]	= &ck_icn_p_ddrphyc,
317228c10f9eSGabriel Fernandez 	[CK_BUS_SYSCPU1]	= &ck_icn_p_syscpu1,
317328c10f9eSGabriel Fernandez 	[CK_BUS_HPDMA1]		= &ck_icn_p_hpdma1,
317428c10f9eSGabriel Fernandez 	[CK_BUS_HPDMA2]		= &ck_icn_p_hpdma2,
317528c10f9eSGabriel Fernandez 	[CK_BUS_HPDMA3]		= &ck_icn_p_hpdma3,
317628c10f9eSGabriel Fernandez 	[CK_BUS_IPCC1]		= &ck_icn_p_ipcc1,
317728c10f9eSGabriel Fernandez 	[CK_BUS_IPCC2]		= &ck_icn_p_ipcc2,
317828c10f9eSGabriel Fernandez 	[CK_BUS_CCI]		= &ck_icn_p_cci,
317928c10f9eSGabriel Fernandez 	[CK_BUS_CRC]		= &ck_icn_p_crc,
318028c10f9eSGabriel Fernandez 	[CK_BUS_OSPIIOM]	= &ck_icn_p_ospiiom,
318128c10f9eSGabriel Fernandez 	[CK_BUS_HASH]		= &ck_icn_p_hash,
318228c10f9eSGabriel Fernandez 	[CK_BUS_RNG]		= &ck_icn_p_rng,
318328c10f9eSGabriel Fernandez 	[CK_BUS_CRYP1]		= &ck_icn_p_cryp1,
318428c10f9eSGabriel Fernandez 	[CK_BUS_CRYP2]		= &ck_icn_p_cryp2,
318528c10f9eSGabriel Fernandez 	[CK_BUS_SAES]		= &ck_icn_p_saes,
318628c10f9eSGabriel Fernandez 	[CK_BUS_PKA]		= &ck_icn_p_pka,
318728c10f9eSGabriel Fernandez 	[CK_BUS_GPIOA]		= &ck_icn_p_gpioa,
318828c10f9eSGabriel Fernandez 	[CK_BUS_GPIOB]		= &ck_icn_p_gpiob,
318928c10f9eSGabriel Fernandez 	[CK_BUS_GPIOC]		= &ck_icn_p_gpioc,
319028c10f9eSGabriel Fernandez 	[CK_BUS_GPIOD]		= &ck_icn_p_gpiod,
319128c10f9eSGabriel Fernandez 	[CK_BUS_GPIOE]		= &ck_icn_p_gpioe,
319228c10f9eSGabriel Fernandez 	[CK_BUS_GPIOF]		= &ck_icn_p_gpiof,
319328c10f9eSGabriel Fernandez 	[CK_BUS_GPIOG]		= &ck_icn_p_gpiog,
319428c10f9eSGabriel Fernandez 	[CK_BUS_GPIOH]		= &ck_icn_p_gpioh,
319528c10f9eSGabriel Fernandez 	[CK_BUS_GPIOI]		= &ck_icn_p_gpioi,
319628c10f9eSGabriel Fernandez 	[CK_BUS_GPIOJ]		= &ck_icn_p_gpioj,
319728c10f9eSGabriel Fernandez 	[CK_BUS_GPIOK]		= &ck_icn_p_gpiok,
319828c10f9eSGabriel Fernandez 	[CK_BUS_LPSRAM1]	= &ck_icn_s_lpsram1,
319928c10f9eSGabriel Fernandez 	[CK_BUS_LPSRAM2]	= &ck_icn_s_lpsram2,
320028c10f9eSGabriel Fernandez 	[CK_BUS_LPSRAM3]	= &ck_icn_s_lpsram3,
320128c10f9eSGabriel Fernandez 	[CK_BUS_GPIOZ]		= &ck_icn_p_gpioz,
320228c10f9eSGabriel Fernandez 	[CK_BUS_LPDMA]		= &ck_icn_p_lpdma,
320328c10f9eSGabriel Fernandez 	[CK_BUS_ADF1]		= &ck_icn_p_adf1,
320428c10f9eSGabriel Fernandez 	[CK_BUS_HSEM]		= &ck_icn_p_hsem,
320528c10f9eSGabriel Fernandez 	[CK_BUS_RTC]		= &ck_icn_p_rtc,
320628c10f9eSGabriel Fernandez 	[CK_BUS_IWDG5]		= &ck_icn_p_iwdg5,
320728c10f9eSGabriel Fernandez 	[CK_BUS_WWDG2]		= &ck_icn_p_wwdg2,
320828c10f9eSGabriel Fernandez 	[CK_BUS_STM]		= &ck_icn_p_stm,
320928c10f9eSGabriel Fernandez 	[CK_KER_STM]		= &ck_icn_s_stm,
321028c10f9eSGabriel Fernandez 	[CK_BUS_FMC]		= &ck_icn_p_fmc,
321128c10f9eSGabriel Fernandez 	[CK_BUS_ETH1]		= &ck_icn_p_eth1,
321228c10f9eSGabriel Fernandez 	[CK_BUS_ETHSW]		= &ck_icn_p_ethsw,
321328c10f9eSGabriel Fernandez 	[CK_BUS_ETH2]		= &ck_icn_p_eth2,
321428c10f9eSGabriel Fernandez 	[CK_BUS_PCIE]		= &ck_icn_p_pcie,
321528c10f9eSGabriel Fernandez 	[CK_BUS_ADC12]		= &ck_icn_p_adc12,
321628c10f9eSGabriel Fernandez 	[CK_BUS_ADC3]		= &ck_icn_p_adc3,
321728c10f9eSGabriel Fernandez 	[CK_BUS_MDF1]		= &ck_icn_p_mdf1,
321828c10f9eSGabriel Fernandez 	[CK_BUS_SPI8]		= &ck_icn_p_spi8,
321928c10f9eSGabriel Fernandez 	[CK_BUS_LPUART1]	= &ck_icn_p_lpuart1,
322028c10f9eSGabriel Fernandez 	[CK_BUS_I2C8]		= &ck_icn_p_i2c8,
322128c10f9eSGabriel Fernandez 	[CK_BUS_LPTIM3]		= &ck_icn_p_lptim3,
322228c10f9eSGabriel Fernandez 	[CK_BUS_LPTIM4]		= &ck_icn_p_lptim4,
322328c10f9eSGabriel Fernandez 	[CK_BUS_LPTIM5]		= &ck_icn_p_lptim5,
322428c10f9eSGabriel Fernandez 	[CK_BUS_RISAF4]		= &ck_icn_p_risaf4,
322528c10f9eSGabriel Fernandez 	[CK_BUS_SDMMC1]		= &ck_icn_m_sdmmc1,
322628c10f9eSGabriel Fernandez 	[CK_BUS_SDMMC2]		= &ck_icn_m_sdmmc2,
322728c10f9eSGabriel Fernandez 	[CK_BUS_SDMMC3]		= &ck_icn_m_sdmmc3,
322828c10f9eSGabriel Fernandez 	[CK_BUS_DDR]		= &ck_icn_s_ddr,
322928c10f9eSGabriel Fernandez 	[CK_BUS_USB2OHCI]	= &ck_icn_m_usb2ohci,
323028c10f9eSGabriel Fernandez 	[CK_BUS_USB2EHCI]	= &ck_icn_m_usb2ehci,
323128c10f9eSGabriel Fernandez 	[CK_BUS_USB3DR]		= &ck_icn_m_usb3dr,
323228c10f9eSGabriel Fernandez 	[CK_BUS_TIM2]		= &ck_icn_p_tim2,
323328c10f9eSGabriel Fernandez 	[CK_BUS_TIM3]		= &ck_icn_p_tim3,
323428c10f9eSGabriel Fernandez 	[CK_BUS_TIM4]		= &ck_icn_p_tim4,
323528c10f9eSGabriel Fernandez 	[CK_BUS_TIM5]		= &ck_icn_p_tim5,
323628c10f9eSGabriel Fernandez 	[CK_BUS_TIM6]		= &ck_icn_p_tim6,
323728c10f9eSGabriel Fernandez 	[CK_BUS_TIM7]		= &ck_icn_p_tim7,
323828c10f9eSGabriel Fernandez 	[CK_BUS_TIM10]		= &ck_icn_p_tim10,
323928c10f9eSGabriel Fernandez 	[CK_BUS_TIM11]		= &ck_icn_p_tim11,
324028c10f9eSGabriel Fernandez 	[CK_BUS_TIM12]		= &ck_icn_p_tim12,
324128c10f9eSGabriel Fernandez 	[CK_BUS_TIM13]		= &ck_icn_p_tim13,
324228c10f9eSGabriel Fernandez 	[CK_BUS_TIM14]		= &ck_icn_p_tim14,
324328c10f9eSGabriel Fernandez 	[CK_BUS_LPTIM1]		= &ck_icn_p_lptim1,
324428c10f9eSGabriel Fernandez 	[CK_BUS_LPTIM2]		= &ck_icn_p_lptim2,
324528c10f9eSGabriel Fernandez 	[CK_BUS_SPI2]		= &ck_icn_p_spi2,
324628c10f9eSGabriel Fernandez 	[CK_BUS_SPI3]		= &ck_icn_p_spi3,
324728c10f9eSGabriel Fernandez 	[CK_BUS_SPDIFRX]	= &ck_icn_p_spdifrx,
324828c10f9eSGabriel Fernandez 	[CK_BUS_USART2]		= &ck_icn_p_usart2,
324928c10f9eSGabriel Fernandez 	[CK_BUS_USART3]		= &ck_icn_p_usart3,
325028c10f9eSGabriel Fernandez 	[CK_BUS_UART4]		= &ck_icn_p_uart4,
325128c10f9eSGabriel Fernandez 	[CK_BUS_UART5]		= &ck_icn_p_uart5,
325228c10f9eSGabriel Fernandez 	[CK_BUS_I2C1]		= &ck_icn_p_i2c1,
325328c10f9eSGabriel Fernandez 	[CK_BUS_I2C2]		= &ck_icn_p_i2c2,
325428c10f9eSGabriel Fernandez 	[CK_BUS_I2C3]		= &ck_icn_p_i2c3,
325528c10f9eSGabriel Fernandez 	[CK_BUS_I2C4]		= &ck_icn_p_i2c4,
325628c10f9eSGabriel Fernandez 	[CK_BUS_I2C5]		= &ck_icn_p_i2c5,
325728c10f9eSGabriel Fernandez 	[CK_BUS_I2C6]		= &ck_icn_p_i2c6,
325828c10f9eSGabriel Fernandez 	[CK_BUS_I2C7]		= &ck_icn_p_i2c7,
325928c10f9eSGabriel Fernandez 	[CK_BUS_I3C1]		= &ck_icn_p_i3c1,
326028c10f9eSGabriel Fernandez 	[CK_BUS_I3C2]		= &ck_icn_p_i3c2,
326128c10f9eSGabriel Fernandez 	[CK_BUS_I3C3]		= &ck_icn_p_i3c3,
326228c10f9eSGabriel Fernandez 	[CK_BUS_I3C4]		= &ck_icn_p_i3c4,
326328c10f9eSGabriel Fernandez 	[CK_BUS_TIM1]		= &ck_icn_p_tim1,
326428c10f9eSGabriel Fernandez 	[CK_BUS_TIM8]		= &ck_icn_p_tim8,
326528c10f9eSGabriel Fernandez 	[CK_BUS_TIM15]		= &ck_icn_p_tim15,
326628c10f9eSGabriel Fernandez 	[CK_BUS_TIM16]		= &ck_icn_p_tim16,
326728c10f9eSGabriel Fernandez 	[CK_BUS_TIM17]		= &ck_icn_p_tim17,
326828c10f9eSGabriel Fernandez 	[CK_BUS_TIM20]		= &ck_icn_p_tim20,
326928c10f9eSGabriel Fernandez 	[CK_BUS_SAI1]		= &ck_icn_p_sai1,
327028c10f9eSGabriel Fernandez 	[CK_BUS_SAI2]		= &ck_icn_p_sai2,
327128c10f9eSGabriel Fernandez 	[CK_BUS_SAI3]		= &ck_icn_p_sai3,
327228c10f9eSGabriel Fernandez 	[CK_BUS_SAI4]		= &ck_icn_p_sai4,
327328c10f9eSGabriel Fernandez 	[CK_BUS_USART1]		= &ck_icn_p_usart1,
327428c10f9eSGabriel Fernandez 	[CK_BUS_USART6]		= &ck_icn_p_usart6,
327528c10f9eSGabriel Fernandez 	[CK_BUS_UART7]		= &ck_icn_p_uart7,
327628c10f9eSGabriel Fernandez 	[CK_BUS_UART8]		= &ck_icn_p_uart8,
327728c10f9eSGabriel Fernandez 	[CK_BUS_UART9]		= &ck_icn_p_uart9,
327828c10f9eSGabriel Fernandez 	[CK_BUS_FDCAN]		= &ck_icn_p_fdcan,
327928c10f9eSGabriel Fernandez 	[CK_BUS_SPI1]		= &ck_icn_p_spi1,
328028c10f9eSGabriel Fernandez 	[CK_BUS_SPI4]		= &ck_icn_p_spi4,
328128c10f9eSGabriel Fernandez 	[CK_BUS_SPI5]		= &ck_icn_p_spi5,
328228c10f9eSGabriel Fernandez 	[CK_BUS_SPI6]		= &ck_icn_p_spi6,
328328c10f9eSGabriel Fernandez 	[CK_BUS_SPI7]		= &ck_icn_p_spi7,
328428c10f9eSGabriel Fernandez 	[CK_BUS_BSEC]		= &ck_icn_p_bsec,
328528c10f9eSGabriel Fernandez 	[CK_BUS_IWDG1]		= &ck_icn_p_iwdg1,
328628c10f9eSGabriel Fernandez 	[CK_BUS_IWDG2]		= &ck_icn_p_iwdg2,
328728c10f9eSGabriel Fernandez 	[CK_BUS_IWDG3]		= &ck_icn_p_iwdg3,
328828c10f9eSGabriel Fernandez 	[CK_BUS_IWDG4]		= &ck_icn_p_iwdg4,
328928c10f9eSGabriel Fernandez 	[CK_BUS_WWDG1]		= &ck_icn_p_wwdg1,
329028c10f9eSGabriel Fernandez 	[CK_BUS_VREF]		= &ck_icn_p_vref,
329128c10f9eSGabriel Fernandez 	[CK_BUS_SERC]		= &ck_icn_p_serc,
329228c10f9eSGabriel Fernandez 	[CK_BUS_DTS]		= &ck_icn_p_dts,
329328c10f9eSGabriel Fernandez 	[CK_BUS_HDP]		= &ck_icn_p_hdp,
329428c10f9eSGabriel Fernandez 	[CK_BUS_IS2M]		= &ck_icn_p_is2m,
329528c10f9eSGabriel Fernandez 	[CK_BUS_DSI]		= &ck_icn_p_dsi,
329628c10f9eSGabriel Fernandez 	[CK_BUS_LTDC]		= &ck_icn_p_ltdc,
329728c10f9eSGabriel Fernandez 	[CK_BUS_CSI]		= &ck_icn_p_csi,
329828c10f9eSGabriel Fernandez 	[CK_BUS_DCMIPP]		= &ck_icn_p_dcmipp,
329928c10f9eSGabriel Fernandez 	[CK_BUS_DDRC]		= &ck_icn_p_ddrc,
330028c10f9eSGabriel Fernandez 	[CK_BUS_DDRCFG]		= &ck_icn_p_ddrcfg,
330128c10f9eSGabriel Fernandez 	[CK_BUS_LVDS]		= &ck_icn_p_lvds,
330228c10f9eSGabriel Fernandez 	[CK_BUS_GICV2M]		= &ck_icn_p_gicv2m,
330328c10f9eSGabriel Fernandez 	[CK_BUS_USBTC]		= &ck_icn_p_usbtc,
330428c10f9eSGabriel Fernandez 	[CK_BUS_USB3PCIEPHY]	= &ck_icn_p_usb3pciephy,
330528c10f9eSGabriel Fernandez 	[CK_BUS_STGEN]		= &ck_icn_p_stgen,
330628c10f9eSGabriel Fernandez 	[CK_BUS_VDEC]		= &ck_icn_p_vdec,
330728c10f9eSGabriel Fernandez 	[CK_BUS_VENC]		= &ck_icn_p_venc,
330828c10f9eSGabriel Fernandez 	[CK_SYSDBG]		= &ck_sys_dbg,
330928c10f9eSGabriel Fernandez 	[CK_KER_TIM2]		= &ck_ker_tim2,
331028c10f9eSGabriel Fernandez 	[CK_KER_TIM3]		= &ck_ker_tim3,
331128c10f9eSGabriel Fernandez 	[CK_KER_TIM4]		= &ck_ker_tim4,
331228c10f9eSGabriel Fernandez 	[CK_KER_TIM5]		= &ck_ker_tim5,
331328c10f9eSGabriel Fernandez 	[CK_KER_TIM6]		= &ck_ker_tim6,
331428c10f9eSGabriel Fernandez 	[CK_KER_TIM7]		= &ck_ker_tim7,
331528c10f9eSGabriel Fernandez 	[CK_KER_TIM10]		= &ck_ker_tim10,
331628c10f9eSGabriel Fernandez 	[CK_KER_TIM11]		= &ck_ker_tim11,
331728c10f9eSGabriel Fernandez 	[CK_KER_TIM12]		= &ck_ker_tim12,
331828c10f9eSGabriel Fernandez 	[CK_KER_TIM13]		= &ck_ker_tim13,
331928c10f9eSGabriel Fernandez 	[CK_KER_TIM14]		= &ck_ker_tim14,
332028c10f9eSGabriel Fernandez 	[CK_KER_TIM1]		= &ck_ker_tim1,
332128c10f9eSGabriel Fernandez 	[CK_KER_TIM8]		= &ck_ker_tim8,
332228c10f9eSGabriel Fernandez 	[CK_KER_TIM15]		= &ck_ker_tim15,
332328c10f9eSGabriel Fernandez 	[CK_KER_TIM16]		= &ck_ker_tim16,
332428c10f9eSGabriel Fernandez 	[CK_KER_TIM17]		= &ck_ker_tim17,
332528c10f9eSGabriel Fernandez 	[CK_KER_TIM20]		= &ck_ker_tim20,
332628c10f9eSGabriel Fernandez 	[CK_KER_LPTIM1]		= &ck_ker_lptim1,
332728c10f9eSGabriel Fernandez 	[CK_KER_LPTIM2]		= &ck_ker_lptim2,
332828c10f9eSGabriel Fernandez 	[CK_KER_USART2]		= &ck_ker_usart2,
332928c10f9eSGabriel Fernandez 	[CK_KER_UART4]		= &ck_ker_uart4,
333028c10f9eSGabriel Fernandez 	[CK_KER_USART3]		= &ck_ker_usart3,
333128c10f9eSGabriel Fernandez 	[CK_KER_UART5]		= &ck_ker_uart5,
333228c10f9eSGabriel Fernandez 	[CK_KER_SPI2]		= &ck_ker_spi2,
333328c10f9eSGabriel Fernandez 	[CK_KER_SPI3]		= &ck_ker_spi3,
333428c10f9eSGabriel Fernandez 	[CK_KER_SPDIFRX]	= &ck_ker_spdifrx,
333528c10f9eSGabriel Fernandez 	[CK_KER_I2C1]		= &ck_ker_i2c1,
333628c10f9eSGabriel Fernandez 	[CK_KER_I2C2]		= &ck_ker_i2c2,
333728c10f9eSGabriel Fernandez 	[CK_KER_I3C1]		= &ck_ker_i3c1,
333828c10f9eSGabriel Fernandez 	[CK_KER_I3C2]		= &ck_ker_i3c2,
333928c10f9eSGabriel Fernandez 	[CK_KER_I2C3]		= &ck_ker_i2c3,
334028c10f9eSGabriel Fernandez 	[CK_KER_I2C5]		= &ck_ker_i2c5,
334128c10f9eSGabriel Fernandez 	[CK_KER_I3C3]		= &ck_ker_i3c3,
334228c10f9eSGabriel Fernandez 	[CK_KER_I2C4]		= &ck_ker_i2c4,
334328c10f9eSGabriel Fernandez 	[CK_KER_I2C6]		= &ck_ker_i2c6,
334428c10f9eSGabriel Fernandez 	[CK_KER_I2C7]		= &ck_ker_i2c7,
334528c10f9eSGabriel Fernandez 	[CK_KER_SPI1]		= &ck_ker_spi1,
334628c10f9eSGabriel Fernandez 	[CK_KER_SPI4]		= &ck_ker_spi4,
334728c10f9eSGabriel Fernandez 	[CK_KER_SPI5]		= &ck_ker_spi5,
334828c10f9eSGabriel Fernandez 	[CK_KER_SPI6]		= &ck_ker_spi6,
334928c10f9eSGabriel Fernandez 	[CK_KER_SPI7]		= &ck_ker_spi7,
335028c10f9eSGabriel Fernandez 	[CK_KER_USART1]		= &ck_ker_usart1,
335128c10f9eSGabriel Fernandez 	[CK_KER_USART6]		= &ck_ker_usart6,
335228c10f9eSGabriel Fernandez 	[CK_KER_UART7]		= &ck_ker_uart7,
335328c10f9eSGabriel Fernandez 	[CK_KER_UART8]		= &ck_ker_uart8,
335428c10f9eSGabriel Fernandez 	[CK_KER_UART9]		= &ck_ker_uart9,
335528c10f9eSGabriel Fernandez 	[CK_KER_MDF1]		= &ck_ker_mdf1,
335628c10f9eSGabriel Fernandez 	[CK_KER_SAI1]		= &ck_ker_sai1,
335728c10f9eSGabriel Fernandez 	[CK_KER_SAI2]		= &ck_ker_sai2,
335828c10f9eSGabriel Fernandez 	[CK_KER_SAI3]		= &ck_ker_sai3,
335928c10f9eSGabriel Fernandez 	[CK_KER_SAI4]		= &ck_ker_sai4,
336028c10f9eSGabriel Fernandez 	[CK_KER_FDCAN]		= &ck_ker_fdcan,
336128c10f9eSGabriel Fernandez 	[CK_KER_CSI]		= &ck_ker_csi,
336228c10f9eSGabriel Fernandez 	[CK_KER_CSITXESC]	= &ck_ker_csitxesc,
336328c10f9eSGabriel Fernandez 	[CK_KER_CSIPHY]		= &ck_ker_csiphy,
336428c10f9eSGabriel Fernandez 	[CK_KER_STGEN]		= &ck_ker_stgen,
336528c10f9eSGabriel Fernandez 	[CK_KER_USBTC]		= &ck_ker_usbtc,
336628c10f9eSGabriel Fernandez 	[CK_KER_I3C4]		= &ck_ker_i3c4,
336728c10f9eSGabriel Fernandez 	[CK_KER_SPI8]		= &ck_ker_spi8,
336828c10f9eSGabriel Fernandez 	[CK_KER_I2C8]		= &ck_ker_i2c8,
336928c10f9eSGabriel Fernandez 	[CK_KER_LPUART1]	= &ck_ker_lpuart1,
337028c10f9eSGabriel Fernandez 	[CK_KER_LPTIM3]		= &ck_ker_lptim3,
337128c10f9eSGabriel Fernandez 	[CK_KER_LPTIM4]		= &ck_ker_lptim4,
337228c10f9eSGabriel Fernandez 	[CK_KER_LPTIM5]		= &ck_ker_lptim5,
337328c10f9eSGabriel Fernandez 	[CK_KER_ADF1]		= &ck_ker_adf1,
337428c10f9eSGabriel Fernandez 	[CK_KER_TSDBG]		= &ck_ker_tsdbg,
337528c10f9eSGabriel Fernandez 	[CK_KER_TPIU]		= &ck_ker_tpiu,
337628c10f9eSGabriel Fernandez 	[CK_BUS_ETR]		= &ck_icn_p_etr,
337728c10f9eSGabriel Fernandez 	[CK_KER_ETR]		= &ck_icn_m_etr,
337828c10f9eSGabriel Fernandez 	[CK_BUS_SYSATB]		= &ck_sys_atb,
337928c10f9eSGabriel Fernandez 	[CK_KER_OSPI1]		= &ck_ker_ospi1,
338028c10f9eSGabriel Fernandez 	[CK_KER_OSPI2]		= &ck_ker_ospi2,
338128c10f9eSGabriel Fernandez 	[CK_KER_FMC]		= &ck_ker_fmc,
338228c10f9eSGabriel Fernandez 	[CK_KER_SDMMC1]		= &ck_ker_sdmmc1,
338328c10f9eSGabriel Fernandez 	[CK_KER_SDMMC2]		= &ck_ker_sdmmc2,
338428c10f9eSGabriel Fernandez 	[CK_KER_SDMMC3]		= &ck_ker_sdmmc3,
338528c10f9eSGabriel Fernandez 	[CK_KER_ETH1]		= &ck_ker_eth1,
338628c10f9eSGabriel Fernandez 	[CK_ETH1_STP]		= &ck_ker_eth1stp,
338728c10f9eSGabriel Fernandez 	[CK_KER_ETHSW]		= &ck_ker_ethsw,
338828c10f9eSGabriel Fernandez 	[CK_KER_ETH2]		= &ck_ker_eth2,
338928c10f9eSGabriel Fernandez 	[CK_ETH2_STP]		= &ck_ker_eth2stp,
339028c10f9eSGabriel Fernandez 	[CK_KER_ETH1PTP]	= &ck_ker_eth1ptp,
339128c10f9eSGabriel Fernandez 	[CK_KER_ETH2PTP]	= &ck_ker_eth2ptp,
339228c10f9eSGabriel Fernandez 	[CK_BUS_GPU]		= &ck_icn_m_gpu,
339328c10f9eSGabriel Fernandez 	[CK_KER_GPU]		= &ck_ker_gpu,
339428c10f9eSGabriel Fernandez 	[CK_KER_ETHSWREF]	= &ck_ker_ethswref,
339528c10f9eSGabriel Fernandez 
339628c10f9eSGabriel Fernandez 	[CK_MCO1]		= &ck_mco1,
339728c10f9eSGabriel Fernandez 	[CK_MCO2]		= &ck_mco2,
339828c10f9eSGabriel Fernandez 	[CK_KER_ADC12]		= &ck_ker_adc12,
339928c10f9eSGabriel Fernandez 	[CK_KER_ADC3]		= &ck_ker_adc3,
340028c10f9eSGabriel Fernandez 	[CK_KER_USB2PHY1]	= &ck_ker_usb2phy1,
340128c10f9eSGabriel Fernandez 	[CK_KER_USB2PHY2]	= &ck_ker_usb2phy2,
340228c10f9eSGabriel Fernandez 	[CK_KER_USB2PHY2EN]	= &ck_ker_usb2phy2_en,
340328c10f9eSGabriel Fernandez 	[CK_KER_USB3PCIEPHY]	= &ck_ker_usb3pciephy,
340428c10f9eSGabriel Fernandez 	[CK_KER_LTDC]		= &ck_ker_ltdc,
340528c10f9eSGabriel Fernandez 	[CK_KER_DSIBLANE]	= &clk_lanebyte,
340628c10f9eSGabriel Fernandez 	[CK_KER_DSIPHY]		= &ck_phy_dsi,
340728c10f9eSGabriel Fernandez 	[CK_KER_LVDSPHY]	= &ck_ker_lvdsphy,
340828c10f9eSGabriel Fernandez 	[CK_KER_DTS]		= &ck_ker_dts,
340928c10f9eSGabriel Fernandez 	[RTC_CK]		= &ck_rtc,
341028c10f9eSGabriel Fernandez 
341128c10f9eSGabriel Fernandez 	[CK_ETH1_MAC]		= &ck_ker_eth1mac,
341228c10f9eSGabriel Fernandez 	[CK_ETH1_TX]		= &ck_ker_eth1tx,
341328c10f9eSGabriel Fernandez 	[CK_ETH1_RX]		= &ck_ker_eth1rx,
341428c10f9eSGabriel Fernandez 	[CK_ETH2_MAC]		= &ck_ker_eth2mac,
341528c10f9eSGabriel Fernandez 	[CK_ETH2_TX]		= &ck_ker_eth2tx,
341628c10f9eSGabriel Fernandez 	[CK_ETH2_RX]		= &ck_ker_eth2rx,
341728c10f9eSGabriel Fernandez 
341828c10f9eSGabriel Fernandez 	[CK_HSE_RTC]		= &ck_hse_rtc,
341928c10f9eSGabriel Fernandez 	[CK_OBSER0]		= &ck_obser0,
342028c10f9eSGabriel Fernandez 	[CK_OBSER1]		= &ck_obser1,
342128c10f9eSGabriel Fernandez 	[CK_OFF]		= &ck_off,
342228c10f9eSGabriel Fernandez 	[I2SCKIN]		= &i2sckin,
342328c10f9eSGabriel Fernandez 	[SPDIFSYMB]		= &spdifsymb,
342428c10f9eSGabriel Fernandez 	[TXBYTECLK]		= &txbyteclk,
342528c10f9eSGabriel Fernandez };
342628c10f9eSGabriel Fernandez 
342728c10f9eSGabriel Fernandez static bool clk_stm32_clock_is_critical(struct clk *clk)
342828c10f9eSGabriel Fernandez {
342928c10f9eSGabriel Fernandez 	struct clk *clk_criticals[] = {
343028c10f9eSGabriel Fernandez 		&ck_hsi,
343128c10f9eSGabriel Fernandez 		&ck_hse,
343228c10f9eSGabriel Fernandez 		&ck_msi,
343328c10f9eSGabriel Fernandez 		&ck_lsi,
343428c10f9eSGabriel Fernandez 		&ck_lse,
343528c10f9eSGabriel Fernandez 		&ck_cpu1,
343628c10f9eSGabriel Fernandez 		&ck_icn_p_syscpu1,
343728c10f9eSGabriel Fernandez 		&ck_icn_s_ddr,
343828c10f9eSGabriel Fernandez 		&ck_icn_p_ddrc,
343928c10f9eSGabriel Fernandez 		&ck_icn_p_ddrcfg,
344028c10f9eSGabriel Fernandez 		&ck_icn_p_ddrphyc,
344128c10f9eSGabriel Fernandez 		&ck_icn_s_sysram,
344228c10f9eSGabriel Fernandez 		&ck_icn_s_bkpsram,
344328c10f9eSGabriel Fernandez 		&ck_ker_fmc,
344428c10f9eSGabriel Fernandez 		&ck_ker_ospi1,
344528c10f9eSGabriel Fernandez 		&ck_ker_ospi2,
344628c10f9eSGabriel Fernandez 		&ck_icn_s_vderam,
344728c10f9eSGabriel Fernandez 		&ck_icn_s_lpsram1,
344828c10f9eSGabriel Fernandez 		&ck_icn_s_lpsram2,
344928c10f9eSGabriel Fernandez 		&ck_icn_s_lpsram3,
345028c10f9eSGabriel Fernandez 		&ck_icn_p_hpdma1,
345128c10f9eSGabriel Fernandez 		&ck_icn_p_hpdma2,
345228c10f9eSGabriel Fernandez 		&ck_icn_p_hpdma3,
345328c10f9eSGabriel Fernandez 		&ck_icn_p_gpioa,
345428c10f9eSGabriel Fernandez 		&ck_icn_p_gpiob,
345528c10f9eSGabriel Fernandez 		&ck_icn_p_gpioc,
345628c10f9eSGabriel Fernandez 		&ck_icn_p_gpiod,
345728c10f9eSGabriel Fernandez 		&ck_icn_p_gpioe,
345828c10f9eSGabriel Fernandez 		&ck_icn_p_gpiof,
345928c10f9eSGabriel Fernandez 		&ck_icn_p_gpiog,
346028c10f9eSGabriel Fernandez 		&ck_icn_p_gpioh,
346128c10f9eSGabriel Fernandez 		&ck_icn_p_gpioi,
346228c10f9eSGabriel Fernandez 		&ck_icn_p_gpioj,
346328c10f9eSGabriel Fernandez 		&ck_icn_p_gpiok,
346428c10f9eSGabriel Fernandez 		&ck_icn_p_gpioz,
346528c10f9eSGabriel Fernandez 		&ck_icn_p_ipcc1,
346628c10f9eSGabriel Fernandez 		&ck_icn_p_ipcc2,
346728c10f9eSGabriel Fernandez 		&ck_icn_p_gicv2m,
346828c10f9eSGabriel Fernandez 		&ck_icn_p_rtc
346928c10f9eSGabriel Fernandez 	};
347028c10f9eSGabriel Fernandez 	size_t i = 0;
347128c10f9eSGabriel Fernandez 
347228c10f9eSGabriel Fernandez 	for (i = 0; i < ARRAY_SIZE(clk_criticals); i++)
347328c10f9eSGabriel Fernandez 		if (clk == clk_criticals[i])
347428c10f9eSGabriel Fernandez 			return true;
347528c10f9eSGabriel Fernandez 	return false;
347628c10f9eSGabriel Fernandez }
347728c10f9eSGabriel Fernandez 
347828c10f9eSGabriel Fernandez static void clk_stm32_init_oscillators(const void *fdt, int node)
347928c10f9eSGabriel Fernandez {
348028c10f9eSGabriel Fernandez 	size_t i = 0;
348128c10f9eSGabriel Fernandez 	static const char * const name[] = {
348228c10f9eSGabriel Fernandez 		"clk-hse", "clk-hsi", "clk-lse",
348328c10f9eSGabriel Fernandez 		"clk-lsi", "clk-msi", "clk-i2sin"
348428c10f9eSGabriel Fernandez 	};
348528c10f9eSGabriel Fernandez 	struct clk *clks[ARRAY_SIZE(name)] = {
348628c10f9eSGabriel Fernandez 		&ck_hse, &ck_hsi, &ck_lse,
348728c10f9eSGabriel Fernandez 		&ck_lsi, &ck_msi, &i2sckin
348828c10f9eSGabriel Fernandez 	};
348928c10f9eSGabriel Fernandez 
349028c10f9eSGabriel Fernandez 	for (i = 0; i < ARRAY_SIZE(clks); i++) {
349128c10f9eSGabriel Fernandez 		struct clk *clk = NULL;
349228c10f9eSGabriel Fernandez 
349328c10f9eSGabriel Fernandez 		if (clk_dt_get_by_name(fdt, node, name[i], &clk))
349428c10f9eSGabriel Fernandez 			panic();
349528c10f9eSGabriel Fernandez 
349628c10f9eSGabriel Fernandez 		clks[i]->parents[0] = clk;
349728c10f9eSGabriel Fernandez 	}
349828c10f9eSGabriel Fernandez }
349928c10f9eSGabriel Fernandez 
350028c10f9eSGabriel Fernandez static TEE_Result clk_stm32_apply_rcc_config(struct stm32_clk_platdata *pdata)
350128c10f9eSGabriel Fernandez {
350228c10f9eSGabriel Fernandez 	if (pdata->safe_rst)
350328c10f9eSGabriel Fernandez 		stm32mp25_syscfg_set_safe_reset(true);
350428c10f9eSGabriel Fernandez 
350528c10f9eSGabriel Fernandez 	return TEE_SUCCESS;
350628c10f9eSGabriel Fernandez }
350728c10f9eSGabriel Fernandez 
350828c10f9eSGabriel Fernandez static struct stm32_pll_dt_cfg mp25_pll[PLL_NB];
350928c10f9eSGabriel Fernandez static struct stm32_clk_opp_dt_cfg mp25_clk_opp;
351028c10f9eSGabriel Fernandez static struct stm32_osci_dt_cfg mp25_osci[NB_OSCILLATOR];
351128c10f9eSGabriel Fernandez 
351228c10f9eSGabriel Fernandez #define DT_FLEXGEN_CLK_MAX	64
351328c10f9eSGabriel Fernandez static uint32_t mp25_flexgen[DT_FLEXGEN_CLK_MAX];
351428c10f9eSGabriel Fernandez 
351528c10f9eSGabriel Fernandez #define DT_BUS_CLK_MAX		6
351628c10f9eSGabriel Fernandez static uint32_t mp25_busclk[DT_BUS_CLK_MAX];
351728c10f9eSGabriel Fernandez 
351828c10f9eSGabriel Fernandez #define DT_KERNEL_CLK_MAX	20
351928c10f9eSGabriel Fernandez static uint32_t mp25_kernelclk[DT_KERNEL_CLK_MAX];
352028c10f9eSGabriel Fernandez 
352128c10f9eSGabriel Fernandez static struct stm32_clk_platdata stm32mp25_clock_pdata = {
352228c10f9eSGabriel Fernandez 	.osci		= mp25_osci,
352328c10f9eSGabriel Fernandez 	.nosci		= NB_OSCILLATOR,
352428c10f9eSGabriel Fernandez 	.pll		= mp25_pll,
352528c10f9eSGabriel Fernandez 	.npll		= PLL_NB,
352628c10f9eSGabriel Fernandez 	.opp		= &mp25_clk_opp,
352728c10f9eSGabriel Fernandez 	.busclk		= mp25_busclk,
352828c10f9eSGabriel Fernandez 	.nbusclk	= DT_BUS_CLK_MAX,
352928c10f9eSGabriel Fernandez 	.kernelclk	= mp25_kernelclk,
353028c10f9eSGabriel Fernandez 	.nkernelclk	= DT_KERNEL_CLK_MAX,
353128c10f9eSGabriel Fernandez 	.flexgen	= mp25_flexgen,
353228c10f9eSGabriel Fernandez 	.nflexgen	= DT_FLEXGEN_CLK_MAX,
353328c10f9eSGabriel Fernandez };
353428c10f9eSGabriel Fernandez 
353528c10f9eSGabriel Fernandez static struct clk_stm32_priv stm32mp25_clock_data = {
353628c10f9eSGabriel Fernandez 	.muxes			= parent_mp25,
353728c10f9eSGabriel Fernandez 	.nb_muxes		= ARRAY_SIZE(parent_mp25),
353828c10f9eSGabriel Fernandez 	.gates			= gates_mp25,
353928c10f9eSGabriel Fernandez 	.nb_gates		= ARRAY_SIZE(gates_mp25),
354028c10f9eSGabriel Fernandez 	.div			= dividers_mp25,
354128c10f9eSGabriel Fernandez 	.nb_div			= ARRAY_SIZE(dividers_mp25),
354228c10f9eSGabriel Fernandez 	.pdata			= &stm32mp25_clock_pdata,
354328c10f9eSGabriel Fernandez 	.nb_clk_refs		= STM32MP25_ALL_CLK_NB,
354428c10f9eSGabriel Fernandez 	.clk_refs		= stm32mp25_clk_provided,
354528c10f9eSGabriel Fernandez 	.is_critical		= clk_stm32_clock_is_critical,
354628c10f9eSGabriel Fernandez };
354728c10f9eSGabriel Fernandez 
3548b5f8fc36SGatien Chevallier static TEE_Result handle_available_semaphores(void)
3549b5f8fc36SGatien Chevallier {
3550b5f8fc36SGatien Chevallier 	struct stm32_clk_platdata *pdata = &stm32mp25_clock_pdata;
3551b5f8fc36SGatien Chevallier 	TEE_Result res = TEE_ERROR_GENERIC;
3552b5f8fc36SGatien Chevallier 	unsigned int index = 0;
3553b5f8fc36SGatien Chevallier 	uint32_t cidcfgr = 0;
3554b5f8fc36SGatien Chevallier 	unsigned int i = 0;
3555b5f8fc36SGatien Chevallier 
3556b5f8fc36SGatien Chevallier 	for (i = 0; i < RCC_NB_RIF_RES; i++) {
3557b5f8fc36SGatien Chevallier 		vaddr_t reg_offset = pdata->rcc_base + RCC_SEMCR(i);
3558b5f8fc36SGatien Chevallier 
3559b5f8fc36SGatien Chevallier 		index = i / 32;
3560b5f8fc36SGatien Chevallier 
3561b5f8fc36SGatien Chevallier 		if (!(BIT(i % 32) & pdata->conf_data.access_mask[index]))
3562b5f8fc36SGatien Chevallier 			continue;
3563b5f8fc36SGatien Chevallier 
3564b5f8fc36SGatien Chevallier 		cidcfgr = io_read32(pdata->rcc_base + RCC_CIDCFGR(i));
3565b5f8fc36SGatien Chevallier 
3566b5f8fc36SGatien Chevallier 		if (!stm32_rif_semaphore_enabled_and_ok(cidcfgr, RIF_CID1))
3567b5f8fc36SGatien Chevallier 			continue;
3568b5f8fc36SGatien Chevallier 
3569b5f8fc36SGatien Chevallier 		if (!(io_read32(pdata->rcc_base + RCC_SECCFGR(index)) &
3570b5f8fc36SGatien Chevallier 		      BIT(i % 32))) {
3571b5f8fc36SGatien Chevallier 			res = stm32_rif_release_semaphore(reg_offset,
3572b5f8fc36SGatien Chevallier 							  MAX_CID_SUPPORTED);
3573b5f8fc36SGatien Chevallier 			if (res) {
3574b5f8fc36SGatien Chevallier 				EMSG("Cannot release semaphore for res %u", i);
3575b5f8fc36SGatien Chevallier 				return res;
3576b5f8fc36SGatien Chevallier 			}
3577b5f8fc36SGatien Chevallier 		} else {
3578b5f8fc36SGatien Chevallier 			res = stm32_rif_acquire_semaphore(reg_offset,
3579b5f8fc36SGatien Chevallier 							  MAX_CID_SUPPORTED);
3580b5f8fc36SGatien Chevallier 			if (res) {
3581b5f8fc36SGatien Chevallier 				EMSG("Cannot acquire semaphore for res %u", i);
3582b5f8fc36SGatien Chevallier 				return res;
3583b5f8fc36SGatien Chevallier 			}
3584b5f8fc36SGatien Chevallier 		}
3585b5f8fc36SGatien Chevallier 	}
3586b5f8fc36SGatien Chevallier 
3587b5f8fc36SGatien Chevallier 	return TEE_SUCCESS;
3588b5f8fc36SGatien Chevallier }
3589b5f8fc36SGatien Chevallier 
3590b5f8fc36SGatien Chevallier static TEE_Result apply_rcc_rif_config(bool is_tdcid)
3591b5f8fc36SGatien Chevallier {
3592b5f8fc36SGatien Chevallier 	TEE_Result res = TEE_ERROR_ACCESS_DENIED;
3593b5f8fc36SGatien Chevallier 	struct stm32_clk_platdata *pdata = &stm32mp25_clock_pdata;
3594b5f8fc36SGatien Chevallier 	unsigned int i = 0;
3595b5f8fc36SGatien Chevallier 	unsigned int index = 0;
3596b5f8fc36SGatien Chevallier 
3597b5f8fc36SGatien Chevallier 	if (is_tdcid) {
3598b5f8fc36SGatien Chevallier 		/*
3599b5f8fc36SGatien Chevallier 		 * When TDCID, OP-TEE should be the one to set the CID
3600b5f8fc36SGatien Chevallier 		 * filtering configuration. Clearing previous configuration
3601b5f8fc36SGatien Chevallier 		 * prevents undesired events during the only legitimate
3602b5f8fc36SGatien Chevallier 		 * configuration.
3603b5f8fc36SGatien Chevallier 		 */
3604b5f8fc36SGatien Chevallier 		for (i = 0; i < RCC_NB_RIF_RES; i++) {
3605b5f8fc36SGatien Chevallier 			if (BIT(i % 32) & pdata->conf_data.access_mask[i / 32])
3606b5f8fc36SGatien Chevallier 				io_clrbits32(pdata->rcc_base + RCC_CIDCFGR(i),
3607b5f8fc36SGatien Chevallier 					     RCC_CIDCFGR_CONF_MASK);
3608b5f8fc36SGatien Chevallier 		}
3609b5f8fc36SGatien Chevallier 	} else {
3610b5f8fc36SGatien Chevallier 		res = handle_available_semaphores();
3611b5f8fc36SGatien Chevallier 		if (res)
3612b5f8fc36SGatien Chevallier 			panic();
3613b5f8fc36SGatien Chevallier 	}
3614b5f8fc36SGatien Chevallier 
3615b5f8fc36SGatien Chevallier 	/* Security and privilege RIF configuration */
3616b5f8fc36SGatien Chevallier 	for (index = 0; index < RCC_NB_CONFS; index++) {
3617b5f8fc36SGatien Chevallier 		io_clrsetbits32(pdata->rcc_base + RCC_PRIVCFGR(index),
3618b5f8fc36SGatien Chevallier 				pdata->conf_data.access_mask[index],
3619b5f8fc36SGatien Chevallier 				pdata->conf_data.priv_conf[index]);
3620b5f8fc36SGatien Chevallier 		io_clrsetbits32(pdata->rcc_base + RCC_SECCFGR(index),
3621b5f8fc36SGatien Chevallier 				pdata->conf_data.access_mask[index],
3622b5f8fc36SGatien Chevallier 				pdata->conf_data.sec_conf[index]);
3623b5f8fc36SGatien Chevallier 	}
3624b5f8fc36SGatien Chevallier 
3625b5f8fc36SGatien Chevallier 	if (!is_tdcid)
3626b5f8fc36SGatien Chevallier 		goto end;
3627b5f8fc36SGatien Chevallier 
3628b5f8fc36SGatien Chevallier 	for (i = 0; i < RCC_NB_RIF_RES; i++) {
3629b5f8fc36SGatien Chevallier 		if (BIT(i % 32) & pdata->conf_data.access_mask[i / 32])
3630b5f8fc36SGatien Chevallier 			io_clrsetbits32(pdata->rcc_base + RCC_CIDCFGR(i),
3631b5f8fc36SGatien Chevallier 					RCC_CIDCFGR_CONF_MASK,
3632b5f8fc36SGatien Chevallier 					pdata->conf_data.cid_confs[i]);
3633b5f8fc36SGatien Chevallier 	}
3634b5f8fc36SGatien Chevallier 
3635b5f8fc36SGatien Chevallier 	for (index = 0; index < RCC_NB_CONFS; index++)
3636b5f8fc36SGatien Chevallier 		io_setbits32(pdata->rcc_base + RCC_RCFGLOCKR(index),
3637b5f8fc36SGatien Chevallier 			     pdata->conf_data.lock_conf[index]);
3638b5f8fc36SGatien Chevallier 
3639b5f8fc36SGatien Chevallier 	res = handle_available_semaphores();
3640b5f8fc36SGatien Chevallier 	if (res)
3641b5f8fc36SGatien Chevallier 		panic();
3642b5f8fc36SGatien Chevallier end:
3643b5f8fc36SGatien Chevallier 	if (IS_ENABLED(CFG_TEE_CORE_DEBUG)) {
3644b5f8fc36SGatien Chevallier 		for (index = 0; index < RCC_NB_CONFS; index++) {
3645b5f8fc36SGatien Chevallier 			/* Check that RIF config are applied, panic otherwise */
3646b5f8fc36SGatien Chevallier 			if ((io_read32(pdata->rcc_base + RCC_PRIVCFGR(index)) &
3647b5f8fc36SGatien Chevallier 			     pdata->conf_data.access_mask[index]) !=
3648b5f8fc36SGatien Chevallier 			    pdata->conf_data.priv_conf[index])
3649b5f8fc36SGatien Chevallier 				panic("rcc resource prv conf is incorrect");
3650b5f8fc36SGatien Chevallier 
3651b5f8fc36SGatien Chevallier 			if ((io_read32(pdata->rcc_base + RCC_SECCFGR(index)) &
3652b5f8fc36SGatien Chevallier 			     pdata->conf_data.access_mask[index]) !=
3653b5f8fc36SGatien Chevallier 			    pdata->conf_data.sec_conf[index])
3654b5f8fc36SGatien Chevallier 				panic("rcc resource sec conf is incorrect");
3655b5f8fc36SGatien Chevallier 		}
3656b5f8fc36SGatien Chevallier 	}
3657b5f8fc36SGatien Chevallier 
3658b5f8fc36SGatien Chevallier 	return TEE_SUCCESS;
3659b5f8fc36SGatien Chevallier }
3660b5f8fc36SGatien Chevallier 
3661b5f8fc36SGatien Chevallier static TEE_Result stm32_rcc_rif_pm_suspend(void)
3662b5f8fc36SGatien Chevallier {
3663b5f8fc36SGatien Chevallier 	struct stm32_clk_platdata *pdata = &stm32mp25_clock_pdata;
3664b5f8fc36SGatien Chevallier 	unsigned int i = 0;
3665b5f8fc36SGatien Chevallier 
3666b5f8fc36SGatien Chevallier 	if (!pdata->nb_res)
3667b5f8fc36SGatien Chevallier 		return TEE_SUCCESS;
3668b5f8fc36SGatien Chevallier 
3669b5f8fc36SGatien Chevallier 	for (i = 0; i < RCC_NB_RIF_RES; i++)
3670b5f8fc36SGatien Chevallier 		pdata->conf_data.cid_confs[i] = io_read32(pdata->rcc_base +
3671b5f8fc36SGatien Chevallier 							  RCC_CIDCFGR(i));
3672b5f8fc36SGatien Chevallier 
3673b5f8fc36SGatien Chevallier 	for (i = 0; i < RCC_NB_CONFS; i++) {
3674b5f8fc36SGatien Chevallier 		pdata->conf_data.priv_conf[i] = io_read32(pdata->rcc_base +
3675b5f8fc36SGatien Chevallier 							  RCC_PRIVCFGR(i));
3676b5f8fc36SGatien Chevallier 		pdata->conf_data.sec_conf[i] = io_read32(pdata->rcc_base +
3677b5f8fc36SGatien Chevallier 							 RCC_SECCFGR(i));
3678b5f8fc36SGatien Chevallier 		pdata->conf_data.lock_conf[i] = io_read32(pdata->rcc_base +
3679b5f8fc36SGatien Chevallier 							  RCC_RCFGLOCKR(i));
3680b5f8fc36SGatien Chevallier 		pdata->conf_data.access_mask[i] = GENMASK_32(31, 0);
3681b5f8fc36SGatien Chevallier 	}
3682b5f8fc36SGatien Chevallier 
3683b5f8fc36SGatien Chevallier 	return TEE_SUCCESS;
3684b5f8fc36SGatien Chevallier }
3685b5f8fc36SGatien Chevallier 
3686b5f8fc36SGatien Chevallier static TEE_Result stm32_rcc_rif_pm(enum pm_op op, unsigned int pm_hint,
3687b5f8fc36SGatien Chevallier 				   const struct pm_callback_handle *h __unused)
3688b5f8fc36SGatien Chevallier {
3689b5f8fc36SGatien Chevallier 	TEE_Result res = TEE_ERROR_GENERIC;
3690b5f8fc36SGatien Chevallier 	bool is_tdcid = false;
3691b5f8fc36SGatien Chevallier 
3692b5f8fc36SGatien Chevallier 	if (!PM_HINT_IS_STATE(pm_hint, CONTEXT))
3693b5f8fc36SGatien Chevallier 		return TEE_SUCCESS;
3694b5f8fc36SGatien Chevallier 
3695b5f8fc36SGatien Chevallier 	res = stm32_rifsc_check_tdcid(&is_tdcid);
3696b5f8fc36SGatien Chevallier 	if (res)
3697b5f8fc36SGatien Chevallier 		return res;
3698b5f8fc36SGatien Chevallier 
3699b5f8fc36SGatien Chevallier 	if (op == PM_OP_RESUME) {
3700b5f8fc36SGatien Chevallier 		if (is_tdcid)
3701b5f8fc36SGatien Chevallier 			res = apply_rcc_rif_config(true);
3702b5f8fc36SGatien Chevallier 		else
3703b5f8fc36SGatien Chevallier 			res = handle_available_semaphores();
3704b5f8fc36SGatien Chevallier 	} else {
3705b5f8fc36SGatien Chevallier 		if (!is_tdcid)
3706b5f8fc36SGatien Chevallier 			return TEE_SUCCESS;
3707b5f8fc36SGatien Chevallier 
3708b5f8fc36SGatien Chevallier 		res = stm32_rcc_rif_pm_suspend();
3709b5f8fc36SGatien Chevallier 	}
3710b5f8fc36SGatien Chevallier 
3711b5f8fc36SGatien Chevallier 	return res;
3712b5f8fc36SGatien Chevallier }
3713b5f8fc36SGatien Chevallier 
3714b5f8fc36SGatien Chevallier static TEE_Result rcc_rif_config(void)
3715b5f8fc36SGatien Chevallier {
3716b5f8fc36SGatien Chevallier 	TEE_Result res = TEE_ERROR_ACCESS_DENIED;
3717b5f8fc36SGatien Chevallier 	bool is_tdcid = false;
3718b5f8fc36SGatien Chevallier 
3719b5f8fc36SGatien Chevallier 	/* Not expected to fail at this stage */
3720b5f8fc36SGatien Chevallier 	res = stm32_rifsc_check_tdcid(&is_tdcid);
3721b5f8fc36SGatien Chevallier 	if (res)
3722b5f8fc36SGatien Chevallier 		panic();
3723b5f8fc36SGatien Chevallier 
3724b5f8fc36SGatien Chevallier 	res = apply_rcc_rif_config(is_tdcid);
3725b5f8fc36SGatien Chevallier 	if (res)
3726b5f8fc36SGatien Chevallier 		panic();
3727b5f8fc36SGatien Chevallier 
3728b5f8fc36SGatien Chevallier 	register_pm_core_service_cb(stm32_rcc_rif_pm, NULL, "stm32-rcc-rif");
3729b5f8fc36SGatien Chevallier 
3730b5f8fc36SGatien Chevallier 	return TEE_SUCCESS;
3731b5f8fc36SGatien Chevallier }
3732b5f8fc36SGatien Chevallier 
3733b5f8fc36SGatien Chevallier driver_init_late(rcc_rif_config);
3734b5f8fc36SGatien Chevallier 
373528c10f9eSGabriel Fernandez static TEE_Result stm32mp2_clk_probe(const void *fdt, int node,
373628c10f9eSGabriel Fernandez 				     const void *compat_data __unused)
373728c10f9eSGabriel Fernandez {
373828c10f9eSGabriel Fernandez 	TEE_Result res = TEE_ERROR_GENERIC;
373928c10f9eSGabriel Fernandez 	int fdt_rc = 0;
374028c10f9eSGabriel Fernandez 	int rc = 0;
374128c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = &stm32mp25_clock_data;
374228c10f9eSGabriel Fernandez 	struct stm32_clk_platdata *pdata = &stm32mp25_clock_pdata;
374328c10f9eSGabriel Fernandez 
374428c10f9eSGabriel Fernandez 	fdt_rc = stm32_clk_parse_fdt(fdt, node, pdata);
374528c10f9eSGabriel Fernandez 	if (fdt_rc) {
374628c10f9eSGabriel Fernandez 		EMSG("Failed to parse clock node %s: %d",
374728c10f9eSGabriel Fernandez 		     fdt_get_name(fdt, node, NULL), fdt_rc);
374828c10f9eSGabriel Fernandez 		return TEE_ERROR_GENERIC;
374928c10f9eSGabriel Fernandez 	}
375028c10f9eSGabriel Fernandez 
375128c10f9eSGabriel Fernandez 	rc = clk_stm32_init(priv, stm32_rcc_base());
375228c10f9eSGabriel Fernandez 	if (rc)
375328c10f9eSGabriel Fernandez 		return TEE_ERROR_GENERIC;
375428c10f9eSGabriel Fernandez 
375528c10f9eSGabriel Fernandez 	stm32mp2_init_clock_tree(priv, pdata);
375628c10f9eSGabriel Fernandez 
375728c10f9eSGabriel Fernandez 	clk_stm32_init_oscillators(fdt, node);
375828c10f9eSGabriel Fernandez 
375928c10f9eSGabriel Fernandez 	res = clk_stm32_apply_rcc_config(pdata);
376028c10f9eSGabriel Fernandez 	if (res)
376128c10f9eSGabriel Fernandez 		panic("Error when applying RCC config");
376228c10f9eSGabriel Fernandez 
376328c10f9eSGabriel Fernandez 	stm32mp_clk_provider_probe_final(fdt, node, priv);
376428c10f9eSGabriel Fernandez 
376528c10f9eSGabriel Fernandez 	if (IS_ENABLED(CFG_STM32_CLK_DEBUG))
376628c10f9eSGabriel Fernandez 		clk_print_tree();
376728c10f9eSGabriel Fernandez 
376828c10f9eSGabriel Fernandez 	return TEE_SUCCESS;
376928c10f9eSGabriel Fernandez }
377028c10f9eSGabriel Fernandez 
377128c10f9eSGabriel Fernandez CLK_DT_DECLARE(stm32mp25_clk, "st,stm32mp25-rcc", stm32mp2_clk_probe);
3772