xref: /optee_os/core/drivers/clk/clk-stm32mp25.c (revision 28c10f9efa6a96905e0f72989ecdfb45c8358984)
1*28c10f9eSGabriel Fernandez // SPDX-License-Identifier: BSD-2-Clause
2*28c10f9eSGabriel Fernandez /*
3*28c10f9eSGabriel Fernandez  * Copyright (C) 2024, STMicroelectronics
4*28c10f9eSGabriel Fernandez  */
5*28c10f9eSGabriel Fernandez 
6*28c10f9eSGabriel Fernandez #include <assert.h>
7*28c10f9eSGabriel Fernandez #include <config.h>
8*28c10f9eSGabriel Fernandez #include <drivers/clk_dt.h>
9*28c10f9eSGabriel Fernandez #include <drivers/stm32_shared_io.h>
10*28c10f9eSGabriel Fernandez #include <drivers/stm32mp25_rcc.h>
11*28c10f9eSGabriel Fernandez #include <drivers/stm32mp_dt_bindings.h>
12*28c10f9eSGabriel Fernandez #include <io.h>
13*28c10f9eSGabriel Fernandez #include <kernel/dt.h>
14*28c10f9eSGabriel Fernandez #include <kernel/panic.h>
15*28c10f9eSGabriel Fernandez #include <libfdt.h>
16*28c10f9eSGabriel Fernandez #include <stdbool.h>
17*28c10f9eSGabriel Fernandez #include <stdio.h>
18*28c10f9eSGabriel Fernandez #include <stm32_sysconf.h>
19*28c10f9eSGabriel Fernandez #include <stm32_util.h>
20*28c10f9eSGabriel Fernandez #include <trace.h>
21*28c10f9eSGabriel Fernandez #include <util.h>
22*28c10f9eSGabriel Fernandez 
23*28c10f9eSGabriel Fernandez #include "clk-stm32-core.h"
24*28c10f9eSGabriel Fernandez 
25*28c10f9eSGabriel Fernandez #define MAX_OPP			CFG_STM32MP_OPP_COUNT
26*28c10f9eSGabriel Fernandez 
27*28c10f9eSGabriel Fernandez #define TIMEOUT_US_100MS	U(100000)
28*28c10f9eSGabriel Fernandez #define TIMEOUT_US_200MS	U(200000)
29*28c10f9eSGabriel Fernandez #define TIMEOUT_US_1S		U(1000000)
30*28c10f9eSGabriel Fernandez 
31*28c10f9eSGabriel Fernandez #define PLLRDY_TIMEOUT		TIMEOUT_US_200MS
32*28c10f9eSGabriel Fernandez #define CLKSRC_TIMEOUT		TIMEOUT_US_200MS
33*28c10f9eSGabriel Fernandez #define CLKDIV_TIMEOUT		TIMEOUT_US_200MS
34*28c10f9eSGabriel Fernandez #define OSCRDY_TIMEOUT		TIMEOUT_US_1S
35*28c10f9eSGabriel Fernandez 
36*28c10f9eSGabriel Fernandez /* PLL minimal frequencies for clock sources */
37*28c10f9eSGabriel Fernandez #define PLL_REFCLK_MIN			UL(5000000)
38*28c10f9eSGabriel Fernandez #define PLL_FRAC_REFCLK_MIN		UL(10000000)
39*28c10f9eSGabriel Fernandez 
40*28c10f9eSGabriel Fernandez /* Parameters from XBAR_CFG in st,cksrc field */
41*28c10f9eSGabriel Fernandez #define XBAR_CKSRC_CHANNEL		GENMASK_32(5, 0)
42*28c10f9eSGabriel Fernandez #define XBAR_CKSRC_SRC			GENMASK_32(9, 6)
43*28c10f9eSGabriel Fernandez #define XBAR_CKSRC_SRC_OFFSET		U(6)
44*28c10f9eSGabriel Fernandez #define XBAR_CKSRC_PREDIV		GENMASK_32(19, 10)
45*28c10f9eSGabriel Fernandez #define XBAR_CKSRC_PREDIV_OFFSET	U(10)
46*28c10f9eSGabriel Fernandez #define XBAR_CKSRC_FINDIV		GENMASK_32(25, 20)
47*28c10f9eSGabriel Fernandez #define XBAR_CKSRC_FINDIV_OFFSET	U(20)
48*28c10f9eSGabriel Fernandez 
49*28c10f9eSGabriel Fernandez #define XBAR_CHANNEL_NB			U(64)
50*28c10f9eSGabriel Fernandez #define XBAR_ROOT_CHANNEL_NB		U(7)
51*28c10f9eSGabriel Fernandez 
52*28c10f9eSGabriel Fernandez #define FLEX_STGEN			U(33)
53*28c10f9eSGabriel Fernandez 
54*28c10f9eSGabriel Fernandez #define RCC_0_MHZ	UL(0)
55*28c10f9eSGabriel Fernandez #define RCC_4_MHZ	UL(4000000)
56*28c10f9eSGabriel Fernandez #define RCC_16_MHZ	UL(16000000)
57*28c10f9eSGabriel Fernandez 
58*28c10f9eSGabriel Fernandez enum pll_cfg {
59*28c10f9eSGabriel Fernandez 	FBDIV,
60*28c10f9eSGabriel Fernandez 	REFDIV,
61*28c10f9eSGabriel Fernandez 	POSTDIV1,
62*28c10f9eSGabriel Fernandez 	POSTDIV2,
63*28c10f9eSGabriel Fernandez 	PLLCFG_NB
64*28c10f9eSGabriel Fernandez };
65*28c10f9eSGabriel Fernandez 
66*28c10f9eSGabriel Fernandez enum pll_csg {
67*28c10f9eSGabriel Fernandez 	DIVVAL,
68*28c10f9eSGabriel Fernandez 	SPREAD,
69*28c10f9eSGabriel Fernandez 	DOWNSPREAD,
70*28c10f9eSGabriel Fernandez 	PLLCSG_NB
71*28c10f9eSGabriel Fernandez };
72*28c10f9eSGabriel Fernandez 
73*28c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg {
74*28c10f9eSGabriel Fernandez 	bool enabled;
75*28c10f9eSGabriel Fernandez 	uint32_t cfg[PLLCFG_NB];
76*28c10f9eSGabriel Fernandez 	uint32_t csg[PLLCSG_NB];
77*28c10f9eSGabriel Fernandez 	uint32_t frac;
78*28c10f9eSGabriel Fernandez 	bool csg_enabled;
79*28c10f9eSGabriel Fernandez 	uint32_t src;
80*28c10f9eSGabriel Fernandez };
81*28c10f9eSGabriel Fernandez 
82*28c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg {
83*28c10f9eSGabriel Fernandez 	unsigned long freq;
84*28c10f9eSGabriel Fernandez 	bool bypass;
85*28c10f9eSGabriel Fernandez 	bool digbyp;
86*28c10f9eSGabriel Fernandez 	bool css;
87*28c10f9eSGabriel Fernandez 	uint32_t drive;
88*28c10f9eSGabriel Fernandez };
89*28c10f9eSGabriel Fernandez 
90*28c10f9eSGabriel Fernandez struct stm32_clk_opp_cfg {
91*28c10f9eSGabriel Fernandez 	uint32_t frq;
92*28c10f9eSGabriel Fernandez 	uint32_t src;
93*28c10f9eSGabriel Fernandez 	struct stm32_pll_dt_cfg pll_cfg;
94*28c10f9eSGabriel Fernandez };
95*28c10f9eSGabriel Fernandez 
96*28c10f9eSGabriel Fernandez struct stm32_clk_opp_dt_cfg {
97*28c10f9eSGabriel Fernandez 	struct stm32_clk_opp_cfg cpu1_opp[MAX_OPP];
98*28c10f9eSGabriel Fernandez };
99*28c10f9eSGabriel Fernandez 
100*28c10f9eSGabriel Fernandez struct stm32_clk_platdata {
101*28c10f9eSGabriel Fernandez 	uintptr_t rcc_base;
102*28c10f9eSGabriel Fernandez 	uint32_t nosci;
103*28c10f9eSGabriel Fernandez 	struct stm32_osci_dt_cfg *osci;
104*28c10f9eSGabriel Fernandez 	uint32_t npll;
105*28c10f9eSGabriel Fernandez 	struct stm32_pll_dt_cfg *pll;
106*28c10f9eSGabriel Fernandez 	struct stm32_clk_opp_dt_cfg *opp;
107*28c10f9eSGabriel Fernandez 	uint32_t nbusclk;
108*28c10f9eSGabriel Fernandez 	uint32_t *busclk;
109*28c10f9eSGabriel Fernandez 	uint32_t nkernelclk;
110*28c10f9eSGabriel Fernandez 	uint32_t *kernelclk;
111*28c10f9eSGabriel Fernandez 	uint32_t nflexgen;
112*28c10f9eSGabriel Fernandez 	uint32_t *flexgen;
113*28c10f9eSGabriel Fernandez 	uint32_t c1msrd;
114*28c10f9eSGabriel Fernandez 	bool safe_rst;
115*28c10f9eSGabriel Fernandez };
116*28c10f9eSGabriel Fernandez 
117*28c10f9eSGabriel Fernandez /*
118*28c10f9eSGabriel Fernandez  * GATE CONFIG
119*28c10f9eSGabriel Fernandez  */
120*28c10f9eSGabriel Fernandez 
121*28c10f9eSGabriel Fernandez /* WARNING GATE_XXX_RDY MUST FOLLOW GATE_XXX */
122*28c10f9eSGabriel Fernandez 
123*28c10f9eSGabriel Fernandez enum enum_gate_cfg {
124*28c10f9eSGabriel Fernandez 	GATE_HSI,
125*28c10f9eSGabriel Fernandez 	GATE_HSI_RDY,
126*28c10f9eSGabriel Fernandez 	GATE_HSE,
127*28c10f9eSGabriel Fernandez 	GATE_HSE_RDY,
128*28c10f9eSGabriel Fernandez 	GATE_LSE,
129*28c10f9eSGabriel Fernandez 	GATE_LSE_RDY,
130*28c10f9eSGabriel Fernandez 	GATE_LSI,
131*28c10f9eSGabriel Fernandez 	GATE_LSI_RDY,
132*28c10f9eSGabriel Fernandez 	GATE_MSI,
133*28c10f9eSGabriel Fernandez 	GATE_MSI_RDY,
134*28c10f9eSGabriel Fernandez 	GATE_PLL1,
135*28c10f9eSGabriel Fernandez 	GATE_PLL1_RDY,
136*28c10f9eSGabriel Fernandez 	GATE_PLL2,
137*28c10f9eSGabriel Fernandez 	GATE_PLL2_RDY,
138*28c10f9eSGabriel Fernandez 	GATE_PLL3,
139*28c10f9eSGabriel Fernandez 	GATE_PLL3_RDY,
140*28c10f9eSGabriel Fernandez 	GATE_PLL4,
141*28c10f9eSGabriel Fernandez 	GATE_PLL4_RDY,
142*28c10f9eSGabriel Fernandez 	GATE_PLL5,
143*28c10f9eSGabriel Fernandez 	GATE_PLL5_RDY,
144*28c10f9eSGabriel Fernandez 	GATE_PLL6,
145*28c10f9eSGabriel Fernandez 	GATE_PLL6_RDY,
146*28c10f9eSGabriel Fernandez 	GATE_PLL7,
147*28c10f9eSGabriel Fernandez 	GATE_PLL7_RDY,
148*28c10f9eSGabriel Fernandez 	GATE_PLL8,
149*28c10f9eSGabriel Fernandez 	GATE_PLL8_RDY,
150*28c10f9eSGabriel Fernandez 	GATE_PLL4_CKREFST,
151*28c10f9eSGabriel Fernandez 	GATE_PLL5_CKREFST,
152*28c10f9eSGabriel Fernandez 	GATE_PLL6_CKREFST,
153*28c10f9eSGabriel Fernandez 	GATE_PLL7_CKREFST,
154*28c10f9eSGabriel Fernandez 	GATE_PLL8_CKREFST,
155*28c10f9eSGabriel Fernandez 	GATE_HSEDIV2,
156*28c10f9eSGabriel Fernandez 	GATE_APB1DIV_RDY,
157*28c10f9eSGabriel Fernandez 	GATE_APB2DIV_RDY,
158*28c10f9eSGabriel Fernandez 	GATE_APB3DIV_RDY,
159*28c10f9eSGabriel Fernandez 	GATE_APB4DIV_RDY,
160*28c10f9eSGabriel Fernandez 	GATE_APBDBGDIV_RDY,
161*28c10f9eSGabriel Fernandez 	GATE_TIMG1PRE_RDY,
162*28c10f9eSGabriel Fernandez 	GATE_TIMG2PRE_RDY,
163*28c10f9eSGabriel Fernandez 	GATE_LSMCUDIV_RDY,
164*28c10f9eSGabriel Fernandez 	GATE_RTCCK,
165*28c10f9eSGabriel Fernandez 	GATE_C3,
166*28c10f9eSGabriel Fernandez 	GATE_LPTIM3C3,
167*28c10f9eSGabriel Fernandez 	GATE_LPTIM4C3,
168*28c10f9eSGabriel Fernandez 	GATE_LPTIM5C3,
169*28c10f9eSGabriel Fernandez 	GATE_SPI8C3,
170*28c10f9eSGabriel Fernandez 	GATE_LPUART1C3,
171*28c10f9eSGabriel Fernandez 	GATE_I2C8C3,
172*28c10f9eSGabriel Fernandez 	GATE_ADF1C3,
173*28c10f9eSGabriel Fernandez 	GATE_GPIOZC3,
174*28c10f9eSGabriel Fernandez 	GATE_LPDMAC3,
175*28c10f9eSGabriel Fernandez 	GATE_RTCC3,
176*28c10f9eSGabriel Fernandez 	GATE_I3C4C3,
177*28c10f9eSGabriel Fernandez 	GATE_MCO1,
178*28c10f9eSGabriel Fernandez 	GATE_MCO2,
179*28c10f9eSGabriel Fernandez 	GATE_DDRCP,
180*28c10f9eSGabriel Fernandez 	GATE_DDRCAPB,
181*28c10f9eSGabriel Fernandez 	GATE_DDRPHYCAPB,
182*28c10f9eSGabriel Fernandez 	GATE_DDRPHYC,
183*28c10f9eSGabriel Fernandez 	GATE_DDRCFG,
184*28c10f9eSGabriel Fernandez 	GATE_SYSRAM,
185*28c10f9eSGabriel Fernandez 	GATE_VDERAM,
186*28c10f9eSGabriel Fernandez 	GATE_SRAM1,
187*28c10f9eSGabriel Fernandez 	GATE_SRAM2,
188*28c10f9eSGabriel Fernandez 	GATE_RETRAM,
189*28c10f9eSGabriel Fernandez 	GATE_BKPSRAM,
190*28c10f9eSGabriel Fernandez 	GATE_LPSRAM1,
191*28c10f9eSGabriel Fernandez 	GATE_LPSRAM2,
192*28c10f9eSGabriel Fernandez 	GATE_LPSRAM3,
193*28c10f9eSGabriel Fernandez 	GATE_OSPI1,
194*28c10f9eSGabriel Fernandez 	GATE_OSPI2,
195*28c10f9eSGabriel Fernandez 	GATE_FMC,
196*28c10f9eSGabriel Fernandez 	GATE_DBG,
197*28c10f9eSGabriel Fernandez 	GATE_TRACE,
198*28c10f9eSGabriel Fernandez 	GATE_STM,
199*28c10f9eSGabriel Fernandez 	GATE_ETR,
200*28c10f9eSGabriel Fernandez 	GATE_GPIOA,
201*28c10f9eSGabriel Fernandez 	GATE_GPIOB,
202*28c10f9eSGabriel Fernandez 	GATE_GPIOC,
203*28c10f9eSGabriel Fernandez 	GATE_GPIOD,
204*28c10f9eSGabriel Fernandez 	GATE_GPIOE,
205*28c10f9eSGabriel Fernandez 	GATE_GPIOF,
206*28c10f9eSGabriel Fernandez 	GATE_GPIOG,
207*28c10f9eSGabriel Fernandez 	GATE_GPIOH,
208*28c10f9eSGabriel Fernandez 	GATE_GPIOI,
209*28c10f9eSGabriel Fernandez 	GATE_GPIOJ,
210*28c10f9eSGabriel Fernandez 	GATE_GPIOK,
211*28c10f9eSGabriel Fernandez 	GATE_GPIOZ,
212*28c10f9eSGabriel Fernandez 	GATE_HPDMA1,
213*28c10f9eSGabriel Fernandez 	GATE_HPDMA2,
214*28c10f9eSGabriel Fernandez 	GATE_HPDMA3,
215*28c10f9eSGabriel Fernandez 	GATE_LPDMA,
216*28c10f9eSGabriel Fernandez 	GATE_HSEM,
217*28c10f9eSGabriel Fernandez 	GATE_IPCC1,
218*28c10f9eSGabriel Fernandez 	GATE_IPCC2,
219*28c10f9eSGabriel Fernandez 	GATE_RTC,
220*28c10f9eSGabriel Fernandez 	GATE_SYSCPU1,
221*28c10f9eSGabriel Fernandez 	GATE_BSEC,
222*28c10f9eSGabriel Fernandez 	GATE_IS2M,
223*28c10f9eSGabriel Fernandez 	GATE_HSIMON,
224*28c10f9eSGabriel Fernandez 	GATE_TIM1,
225*28c10f9eSGabriel Fernandez 	GATE_TIM2,
226*28c10f9eSGabriel Fernandez 	GATE_TIM3,
227*28c10f9eSGabriel Fernandez 	GATE_TIM4,
228*28c10f9eSGabriel Fernandez 	GATE_TIM5,
229*28c10f9eSGabriel Fernandez 	GATE_TIM6,
230*28c10f9eSGabriel Fernandez 	GATE_TIM7,
231*28c10f9eSGabriel Fernandez 	GATE_TIM8,
232*28c10f9eSGabriel Fernandez 	GATE_TIM10,
233*28c10f9eSGabriel Fernandez 	GATE_TIM11,
234*28c10f9eSGabriel Fernandez 	GATE_TIM12,
235*28c10f9eSGabriel Fernandez 	GATE_TIM13,
236*28c10f9eSGabriel Fernandez 	GATE_TIM14,
237*28c10f9eSGabriel Fernandez 	GATE_TIM15,
238*28c10f9eSGabriel Fernandez 	GATE_TIM16,
239*28c10f9eSGabriel Fernandez 	GATE_TIM17,
240*28c10f9eSGabriel Fernandez 	GATE_TIM20,
241*28c10f9eSGabriel Fernandez 	GATE_LPTIM1,
242*28c10f9eSGabriel Fernandez 	GATE_LPTIM2,
243*28c10f9eSGabriel Fernandez 	GATE_LPTIM3,
244*28c10f9eSGabriel Fernandez 	GATE_LPTIM4,
245*28c10f9eSGabriel Fernandez 	GATE_LPTIM5,
246*28c10f9eSGabriel Fernandez 	GATE_SPI1,
247*28c10f9eSGabriel Fernandez 	GATE_SPI2,
248*28c10f9eSGabriel Fernandez 	GATE_SPI3,
249*28c10f9eSGabriel Fernandez 	GATE_SPI4,
250*28c10f9eSGabriel Fernandez 	GATE_SPI5,
251*28c10f9eSGabriel Fernandez 	GATE_SPI6,
252*28c10f9eSGabriel Fernandez 	GATE_SPI7,
253*28c10f9eSGabriel Fernandez 	GATE_SPI8,
254*28c10f9eSGabriel Fernandez 	GATE_SPDIFRX,
255*28c10f9eSGabriel Fernandez 	GATE_USART1,
256*28c10f9eSGabriel Fernandez 	GATE_USART2,
257*28c10f9eSGabriel Fernandez 	GATE_USART3,
258*28c10f9eSGabriel Fernandez 	GATE_UART4,
259*28c10f9eSGabriel Fernandez 	GATE_UART5,
260*28c10f9eSGabriel Fernandez 	GATE_USART6,
261*28c10f9eSGabriel Fernandez 	GATE_UART7,
262*28c10f9eSGabriel Fernandez 	GATE_UART8,
263*28c10f9eSGabriel Fernandez 	GATE_UART9,
264*28c10f9eSGabriel Fernandez 	GATE_LPUART1,
265*28c10f9eSGabriel Fernandez 	GATE_I2C1,
266*28c10f9eSGabriel Fernandez 	GATE_I2C2,
267*28c10f9eSGabriel Fernandez 	GATE_I2C3,
268*28c10f9eSGabriel Fernandez 	GATE_I2C4,
269*28c10f9eSGabriel Fernandez 	GATE_I2C5,
270*28c10f9eSGabriel Fernandez 	GATE_I2C6,
271*28c10f9eSGabriel Fernandez 	GATE_I2C7,
272*28c10f9eSGabriel Fernandez 	GATE_I2C8,
273*28c10f9eSGabriel Fernandez 	GATE_SAI1,
274*28c10f9eSGabriel Fernandez 	GATE_SAI2,
275*28c10f9eSGabriel Fernandez 	GATE_SAI3,
276*28c10f9eSGabriel Fernandez 	GATE_SAI4,
277*28c10f9eSGabriel Fernandez 	GATE_MDF1,
278*28c10f9eSGabriel Fernandez 	GATE_ADF1,
279*28c10f9eSGabriel Fernandez 	GATE_FDCAN,
280*28c10f9eSGabriel Fernandez 	GATE_HDP,
281*28c10f9eSGabriel Fernandez 	GATE_ADC12,
282*28c10f9eSGabriel Fernandez 	GATE_ADC3,
283*28c10f9eSGabriel Fernandez 	GATE_ETH1MAC,
284*28c10f9eSGabriel Fernandez 	GATE_ETH1,
285*28c10f9eSGabriel Fernandez 	GATE_ETH1TX,
286*28c10f9eSGabriel Fernandez 	GATE_ETH1RX,
287*28c10f9eSGabriel Fernandez 	GATE_ETH1STP,
288*28c10f9eSGabriel Fernandez 	GATE_ETH2MAC,
289*28c10f9eSGabriel Fernandez 	GATE_ETH2,
290*28c10f9eSGabriel Fernandez 	GATE_ETH2STP,
291*28c10f9eSGabriel Fernandez 	GATE_ETH2TX,
292*28c10f9eSGabriel Fernandez 	GATE_ETH2RX,
293*28c10f9eSGabriel Fernandez 	GATE_USB2,
294*28c10f9eSGabriel Fernandez 	GATE_USB2PHY1,
295*28c10f9eSGabriel Fernandez 	GATE_USB2PHY2,
296*28c10f9eSGabriel Fernandez 	GATE_USB3DR,
297*28c10f9eSGabriel Fernandez 	GATE_USB3PCIEPHY,
298*28c10f9eSGabriel Fernandez 	GATE_PCIE,
299*28c10f9eSGabriel Fernandez 	GATE_USBTC,
300*28c10f9eSGabriel Fernandez 	GATE_ETHSWMAC,
301*28c10f9eSGabriel Fernandez 	GATE_ETHSW,
302*28c10f9eSGabriel Fernandez 	GATE_ETHSWREF,
303*28c10f9eSGabriel Fernandez 	GATE_STGEN,
304*28c10f9eSGabriel Fernandez 	GATE_SDMMC1,
305*28c10f9eSGabriel Fernandez 	GATE_SDMMC2,
306*28c10f9eSGabriel Fernandez 	GATE_SDMMC3,
307*28c10f9eSGabriel Fernandez 	GATE_GPU,
308*28c10f9eSGabriel Fernandez 	GATE_LTDC,
309*28c10f9eSGabriel Fernandez 	GATE_DSI,
310*28c10f9eSGabriel Fernandez 	GATE_LVDS,
311*28c10f9eSGabriel Fernandez 	GATE_CSI,
312*28c10f9eSGabriel Fernandez 	GATE_DCMIPP,
313*28c10f9eSGabriel Fernandez 	GATE_CCI,
314*28c10f9eSGabriel Fernandez 	GATE_VDEC,
315*28c10f9eSGabriel Fernandez 	GATE_VENC,
316*28c10f9eSGabriel Fernandez 	GATE_RNG,
317*28c10f9eSGabriel Fernandez 	GATE_PKA,
318*28c10f9eSGabriel Fernandez 	GATE_SAES,
319*28c10f9eSGabriel Fernandez 	GATE_HASH,
320*28c10f9eSGabriel Fernandez 	GATE_CRYP1,
321*28c10f9eSGabriel Fernandez 	GATE_CRYP2,
322*28c10f9eSGabriel Fernandez 	GATE_IWDG1,
323*28c10f9eSGabriel Fernandez 	GATE_IWDG2,
324*28c10f9eSGabriel Fernandez 	GATE_IWDG3,
325*28c10f9eSGabriel Fernandez 	GATE_IWDG4,
326*28c10f9eSGabriel Fernandez 	GATE_IWDG5,
327*28c10f9eSGabriel Fernandez 	GATE_WWDG1,
328*28c10f9eSGabriel Fernandez 	GATE_WWDG2,
329*28c10f9eSGabriel Fernandez 	GATE_VREF,
330*28c10f9eSGabriel Fernandez 	GATE_DTS,
331*28c10f9eSGabriel Fernandez 	GATE_CRC,
332*28c10f9eSGabriel Fernandez 	GATE_SERC,
333*28c10f9eSGabriel Fernandez 	GATE_OSPIIOM,
334*28c10f9eSGabriel Fernandez 	GATE_GICV2M,
335*28c10f9eSGabriel Fernandez 	GATE_I3C1,
336*28c10f9eSGabriel Fernandez 	GATE_I3C2,
337*28c10f9eSGabriel Fernandez 	GATE_I3C3,
338*28c10f9eSGabriel Fernandez 	GATE_I3C4,
339*28c10f9eSGabriel Fernandez 	GATE_NB
340*28c10f9eSGabriel Fernandez };
341*28c10f9eSGabriel Fernandez 
342*28c10f9eSGabriel Fernandez #define GATE_CFG(_id, _offset, _bit_idx, _offset_clr)\
343*28c10f9eSGabriel Fernandez 	[(_id)] = {\
344*28c10f9eSGabriel Fernandez 		.offset = (_offset),\
345*28c10f9eSGabriel Fernandez 		.bit_idx = (_bit_idx),\
346*28c10f9eSGabriel Fernandez 		.set_clr = (_offset_clr),\
347*28c10f9eSGabriel Fernandez 	}
348*28c10f9eSGabriel Fernandez 
349*28c10f9eSGabriel Fernandez static const struct gate_cfg gates_mp25[GATE_NB] = {
350*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LSE,		RCC_BDCR,		0,	0),
351*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LSE_RDY,		RCC_BDCR,		2,	0),
352*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LSI,		RCC_BDCR,		9,	0),
353*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LSI_RDY,		RCC_BDCR,		10,	0),
354*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_RTCCK,		RCC_BDCR,		20,	0),
355*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_MSI,		RCC_D3DCR,		0,	0),
356*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_MSI_RDY,		RCC_D3DCR,		2,	0),
357*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL1,		RCC_PLL2CFGR1,		8,	0),
358*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL1_RDY,		RCC_PLL2CFGR1,		24,	0),
359*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL2,		RCC_PLL2CFGR1,		8,	0),
360*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL2_RDY,		RCC_PLL2CFGR1,		24,	0),
361*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL3,		RCC_PLL3CFGR1,		8,	0),
362*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL3_RDY,		RCC_PLL3CFGR1,		24,	0),
363*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL4,		RCC_PLL4CFGR1,		8,	0),
364*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL4_RDY,		RCC_PLL4CFGR1,		24,	0),
365*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL5,		RCC_PLL5CFGR1,		8,	0),
366*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL5_RDY,		RCC_PLL5CFGR1,		24,	0),
367*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL6,		RCC_PLL6CFGR1,		8,	0),
368*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL6_RDY,		RCC_PLL6CFGR1,		24,	0),
369*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL7,		RCC_PLL7CFGR1,		8,	0),
370*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL7_RDY,		RCC_PLL7CFGR1,		24,	0),
371*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL8,		RCC_PLL8CFGR1,		8,	0),
372*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL8_RDY,		RCC_PLL8CFGR1,		24,	0),
373*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL4_CKREFST,	RCC_PLL4CFGR1,		28,	0),
374*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL5_CKREFST,	RCC_PLL5CFGR1,		28,	0),
375*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL6_CKREFST,	RCC_PLL6CFGR1,		28,	0),
376*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL7_CKREFST,	RCC_PLL7CFGR1,		28,	0),
377*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PLL8_CKREFST,	RCC_PLL8CFGR1,		28,	0),
378*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_C3,		RCC_C3CFGR,		1,	0),
379*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LPTIM3C3,		RCC_C3CFGR,		16,	0),
380*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LPTIM4C3,		RCC_C3CFGR,		17,	0),
381*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LPTIM5C3,		RCC_C3CFGR,		18,	0),
382*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SPI8C3,		RCC_C3CFGR,		19,	0),
383*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LPUART1C3,	RCC_C3CFGR,		20,	0),
384*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_I2C8C3,		RCC_C3CFGR,		21,	0),
385*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ADF1C3,		RCC_C3CFGR,		23,	0),
386*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_GPIOZC3,		RCC_C3CFGR,		24,	0),
387*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LPDMAC3,		RCC_C3CFGR,		25,	0),
388*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_RTCC3,		RCC_C3CFGR,		26,	0),
389*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_I3C4C3,		RCC_C3CFGR,		27,	0),
390*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_MCO1,		RCC_MCO1CFGR,		8,	0),
391*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_MCO2,		RCC_MCO2CFGR,		8,	0),
392*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_HSI,		RCC_OCENSETR,		0,	1),
393*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_HSEDIV2,		RCC_OCENSETR,		5,	1),
394*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_HSE,		RCC_OCENSETR,		8,	1),
395*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_HSI_RDY,		RCC_OCRDYR,		0,	0),
396*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_HSE_RDY,		RCC_OCRDYR,		8,	0),
397*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_APB1DIV_RDY,	RCC_APB1DIVR,		31,	0),
398*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_APB2DIV_RDY,	RCC_APB2DIVR,		31,	0),
399*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_APB3DIV_RDY,	RCC_APB3DIVR,		31,	0),
400*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_APB4DIV_RDY,	RCC_APB4DIVR,		31,	0),
401*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_APBDBGDIV_RDY,	RCC_APBDBGDIVR,		31,	0),
402*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIMG1PRE_RDY,	RCC_TIMG1PRER,		31,	0),
403*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIMG2PRE_RDY,	RCC_TIMG2PRER,		31,	0),
404*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LSMCUDIV_RDY,	RCC_LSMCUDIVR,		31,	0),
405*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_DDRCP,		RCC_DDRCPCFGR,		1,	0),
406*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_DDRCAPB,		RCC_DDRCAPBCFGR,	1,	0),
407*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_DDRPHYCAPB,	RCC_DDRPHYCAPBCFGR,	1,	0),
408*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_DDRPHYC,		RCC_DDRPHYCCFGR,	1,	0),
409*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_DDRCFG,		RCC_DDRCFGR,		1,	0),
410*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SYSRAM,		RCC_SYSRAMCFGR,		1,	0),
411*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_VDERAM,		RCC_VDERAMCFGR,		1,	0),
412*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SRAM1,		RCC_SRAM1CFGR,		1,	0),
413*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SRAM2,		RCC_SRAM2CFGR,		1,	0),
414*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_RETRAM,		RCC_RETRAMCFGR,		1,	0),
415*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_BKPSRAM,		RCC_BKPSRAMCFGR,	1,	0),
416*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LPSRAM1,		RCC_LPSRAM1CFGR,	1,	0),
417*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LPSRAM2,		RCC_LPSRAM2CFGR,	1,	0),
418*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LPSRAM3,		RCC_LPSRAM3CFGR,	1,	0),
419*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_OSPI1,		RCC_OSPI1CFGR,		1,	0),
420*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_OSPI2,		RCC_OSPI2CFGR,		1,	0),
421*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_FMC,		RCC_FMCCFGR,		1,	0),
422*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_DBG,		RCC_DBGCFGR,		8,	0),
423*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TRACE,		RCC_DBGCFGR,		9,	0),
424*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_STM,		RCC_STMCFGR,		1,	0),
425*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ETR,		RCC_ETRCFGR,		1,	0),
426*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_GPIOA,		RCC_GPIOACFGR,		1,	0),
427*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_GPIOB,		RCC_GPIOBCFGR,		1,	0),
428*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_GPIOC,		RCC_GPIOCCFGR,		1,	0),
429*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_GPIOD,		RCC_GPIODCFGR,		1,	0),
430*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_GPIOE,		RCC_GPIOECFGR,		1,	0),
431*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_GPIOF,		RCC_GPIOFCFGR,		1,	0),
432*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_GPIOG,		RCC_GPIOGCFGR,		1,	0),
433*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_GPIOH,		RCC_GPIOHCFGR,		1,	0),
434*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_GPIOI,		RCC_GPIOICFGR,		1,	0),
435*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_GPIOJ,		RCC_GPIOJCFGR,		1,	0),
436*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_GPIOK,		RCC_GPIOKCFGR,		1,	0),
437*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_GPIOZ,		RCC_GPIOZCFGR,		1,	0),
438*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_HPDMA1,		RCC_HPDMA1CFGR,		1,	0),
439*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_HPDMA2,		RCC_HPDMA2CFGR,		1,	0),
440*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_HPDMA3,		RCC_HPDMA3CFGR,		1,	0),
441*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LPDMA,		RCC_LPDMACFGR,		1,	0),
442*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_HSEM,		RCC_HSEMCFGR,		1,	0),
443*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_IPCC1,		RCC_IPCC1CFGR,		1,	0),
444*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_IPCC2,		RCC_IPCC2CFGR,		1,	0),
445*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_RTC,		RCC_RTCCFGR,		1,	0),
446*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SYSCPU1,		RCC_SYSCPU1CFGR,	1,	0),
447*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_BSEC,		RCC_BSECCFGR,		1,	0),
448*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_IS2M,		RCC_IS2MCFGR,		1,	0),
449*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_HSIMON,		RCC_HSIFMONCR,		15,	0),
450*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIM1,		RCC_TIM1CFGR,		1,	0),
451*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIM2,		RCC_TIM2CFGR,		1,	0),
452*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIM3,		RCC_TIM3CFGR,		1,	0),
453*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIM4,		RCC_TIM4CFGR,		1,	0),
454*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIM5,		RCC_TIM5CFGR,		1,	0),
455*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIM6,		RCC_TIM6CFGR,		1,	0),
456*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIM7,		RCC_TIM7CFGR,		1,	0),
457*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIM8,		RCC_TIM8CFGR,		1,	0),
458*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIM10,		RCC_TIM10CFGR,		1,	0),
459*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIM11,		RCC_TIM11CFGR,		1,	0),
460*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIM12,		RCC_TIM12CFGR,		1,	0),
461*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIM13,		RCC_TIM13CFGR,		1,	0),
462*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIM14,		RCC_TIM14CFGR,		1,	0),
463*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIM15,		RCC_TIM15CFGR,		1,	0),
464*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIM16,		RCC_TIM16CFGR,		1,	0),
465*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIM17,		RCC_TIM17CFGR,		1,	0),
466*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_TIM20,		RCC_TIM20CFGR,		1,	0),
467*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LPTIM1,		RCC_LPTIM1CFGR,		1,	0),
468*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LPTIM2,		RCC_LPTIM2CFGR,		1,	0),
469*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LPTIM3,		RCC_LPTIM3CFGR,		1,	0),
470*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LPTIM4,		RCC_LPTIM4CFGR,		1,	0),
471*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LPTIM5,		RCC_LPTIM5CFGR,		1,	0),
472*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SPI1,		RCC_SPI1CFGR,		1,	0),
473*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SPI2,		RCC_SPI2CFGR,		1,	0),
474*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SPI3,		RCC_SPI3CFGR,		1,	0),
475*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SPI4,		RCC_SPI4CFGR,		1,	0),
476*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SPI5,		RCC_SPI5CFGR,		1,	0),
477*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SPI6,		RCC_SPI6CFGR,		1,	0),
478*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SPI7,		RCC_SPI7CFGR,		1,	0),
479*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SPI8,		RCC_SPI8CFGR,		1,	0),
480*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SPDIFRX,		RCC_SPDIFRXCFGR,	1,	0),
481*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_USART1,		RCC_USART1CFGR,		1,	0),
482*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_USART2,		RCC_USART2CFGR,		1,	0),
483*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_USART3,		RCC_USART3CFGR,		1,	0),
484*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_UART4,		RCC_UART4CFGR,		1,	0),
485*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_UART5,		RCC_UART5CFGR,		1,	0),
486*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_USART6,		RCC_USART6CFGR,		1,	0),
487*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_UART7,		RCC_UART7CFGR,		1,	0),
488*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_UART8,		RCC_UART8CFGR,		1,	0),
489*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_UART9,		RCC_UART9CFGR,		1,	0),
490*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LPUART1,		RCC_LPUART1CFGR,	1,	0),
491*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_I2C1,		RCC_I2C1CFGR,		1,	0),
492*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_I2C2,		RCC_I2C2CFGR,		1,	0),
493*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_I2C3,		RCC_I2C3CFGR,		1,	0),
494*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_I2C4,		RCC_I2C4CFGR,		1,	0),
495*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_I2C5,		RCC_I2C5CFGR,		1,	0),
496*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_I2C6,		RCC_I2C6CFGR,		1,	0),
497*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_I2C7,		RCC_I2C7CFGR,		1,	0),
498*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_I2C8,		RCC_I2C8CFGR,		1,	0),
499*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SAI1,		RCC_SAI1CFGR,		1,	0),
500*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SAI2,		RCC_SAI2CFGR,		1,	0),
501*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SAI3,		RCC_SAI3CFGR,		1,	0),
502*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SAI4,		RCC_SAI4CFGR,		1,	0),
503*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_MDF1,		RCC_MDF1CFGR,		1,	0),
504*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ADF1,		RCC_ADF1CFGR,		1,	0),
505*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_FDCAN,		RCC_FDCANCFGR,		1,	0),
506*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_HDP,		RCC_HDPCFGR,		1,	0),
507*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ADC12,		RCC_ADC12CFGR,		1,	0),
508*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ADC3,		RCC_ADC3CFGR,		1,	0),
509*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ETH1MAC,		RCC_ETH1CFGR,		1,	0),
510*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ETH1STP,		RCC_ETH1CFGR,		4,	0),
511*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ETH1,		RCC_ETH1CFGR,		5,	0),
512*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ETH1TX,		RCC_ETH1CFGR,		8,	0),
513*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ETH1RX,		RCC_ETH1CFGR,		10,	0),
514*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ETH2MAC,		RCC_ETH2CFGR,		1,	0),
515*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ETH2STP,		RCC_ETH2CFGR,		4,	0),
516*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ETH2,		RCC_ETH2CFGR,		5,	0),
517*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ETH2TX,		RCC_ETH2CFGR,		8,	0),
518*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ETH2RX,		RCC_ETH2CFGR,		10,	0),
519*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_USB2,		RCC_USB2CFGR,		1,	0),
520*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_USB2PHY1,		RCC_USB2PHY1CFGR,	1,	0),
521*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_USB2PHY2,		RCC_USB2PHY2CFGR,	1,	0),
522*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_USB3DR,		RCC_USB3DRCFGR,		1,	0),
523*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_USB3PCIEPHY,	RCC_USB3PCIEPHYCFGR,	1,	0),
524*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PCIE,		RCC_PCIECFGR,		1,	0),
525*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_USBTC,		RCC_USBTCCFGR,		1,	0),
526*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ETHSWMAC,		RCC_ETHSWCFGR,		1,	0),
527*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ETHSW,		RCC_ETHSWCFGR,		5,	0),
528*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_ETHSWREF,		RCC_ETHSWCFGR,		21,	0),
529*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_STGEN,		RCC_STGENCFGR,		1,	0),
530*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SDMMC1,		RCC_SDMMC1CFGR,		1,	0),
531*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SDMMC2,		RCC_SDMMC2CFGR,		1,	0),
532*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SDMMC3,		RCC_SDMMC3CFGR,		1,	0),
533*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_GPU,		RCC_GPUCFGR,		1,	0),
534*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LTDC,		RCC_LTDCCFGR,		1,	0),
535*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_DSI,		RCC_DSICFGR,		1,	0),
536*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_LVDS,		RCC_LVDSCFGR,		1,	0),
537*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_CSI,		RCC_CSICFGR,		1,	0),
538*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_DCMIPP,		RCC_DCMIPPCFGR,		1,	0),
539*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_CCI,		RCC_CCICFGR,		1,	0),
540*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_VDEC,		RCC_VDECCFGR,		1,	0),
541*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_VENC,		RCC_VENCCFGR,		1,	0),
542*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_RNG,		RCC_RNGCFGR,		1,	0),
543*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_PKA,		RCC_PKACFGR,		1,	0),
544*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SAES,		RCC_SAESCFGR,		1,	0),
545*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_HASH,		RCC_HASHCFGR,		1,	0),
546*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_CRYP1,		RCC_CRYP1CFGR,		1,	0),
547*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_CRYP2,		RCC_CRYP2CFGR,		1,	0),
548*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_IWDG1,		RCC_IWDG1CFGR,		1,	0),
549*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_IWDG2,		RCC_IWDG2CFGR,		1,	0),
550*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_IWDG3,		RCC_IWDG3CFGR,		1,	0),
551*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_IWDG4,		RCC_IWDG4CFGR,		1,	0),
552*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_IWDG5,		RCC_IWDG5CFGR,		1,	0),
553*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_WWDG1,		RCC_WWDG1CFGR,		1,	0),
554*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_WWDG2,		RCC_WWDG2CFGR,		1,	0),
555*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_VREF,		RCC_VREFCFGR,		1,	0),
556*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_DTS,		RCC_DTSCFGR,		1,	0),
557*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_CRC,		RCC_CRCCFGR,		1,	0),
558*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_SERC,		RCC_SERCCFGR,		1,	0),
559*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_OSPIIOM,		RCC_OSPIIOMCFGR,	1,	0),
560*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_GICV2M,		RCC_GICV2MCFGR,		1,	0),
561*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_I3C1,		RCC_I3C1CFGR,		1,	0),
562*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_I3C2,		RCC_I3C2CFGR,		1,	0),
563*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_I3C3,		RCC_I3C3CFGR,		1,	0),
564*28c10f9eSGabriel Fernandez 	GATE_CFG(GATE_I3C4,		RCC_I3C4CFGR,		1,	0),
565*28c10f9eSGabriel Fernandez };
566*28c10f9eSGabriel Fernandez 
567*28c10f9eSGabriel Fernandez /*
568*28c10f9eSGabriel Fernandez  * MUX CONFIG
569*28c10f9eSGabriel Fernandez  */
570*28c10f9eSGabriel Fernandez 
571*28c10f9eSGabriel Fernandez #define _MUX_CFG(_id, _offset, _shift, _width, _rdy)\
572*28c10f9eSGabriel Fernandez 	[(_id)] = {\
573*28c10f9eSGabriel Fernandez 		.offset = (_offset),\
574*28c10f9eSGabriel Fernandez 		.shift = (_shift),\
575*28c10f9eSGabriel Fernandez 		.width = (_width),\
576*28c10f9eSGabriel Fernandez 		.ready = (_rdy),\
577*28c10f9eSGabriel Fernandez 	}
578*28c10f9eSGabriel Fernandez 
579*28c10f9eSGabriel Fernandez static const struct mux_cfg parent_mp25[MUX_NB] = {
580*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_MUXSEL0, RCC_MUXSELCFGR, 0, 2, GATE_PLL4_CKREFST),
581*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_MUXSEL1, RCC_MUXSELCFGR, 4, 2, GATE_PLL5_CKREFST),
582*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_MUXSEL2, RCC_MUXSELCFGR, 8, 2, GATE_PLL6_CKREFST),
583*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_MUXSEL3, RCC_MUXSELCFGR, 12, 2, GATE_PLL7_CKREFST),
584*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_MUXSEL4, RCC_MUXSELCFGR, 16, 2, GATE_PLL8_CKREFST),
585*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_MUXSEL5, RCC_MUXSELCFGR, 20, 2, MUX_NO_RDY),
586*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_MUXSEL6, RCC_MUXSELCFGR, 24, 2, MUX_NO_RDY),
587*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_MUXSEL7, RCC_MUXSELCFGR, 28, 2, MUX_NO_RDY),
588*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_XBARSEL, RCC_XBAR0CFGR, 0, 4, MUX_NO_RDY),
589*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_RTC, RCC_BDCR, 16, 2, MUX_NO_RDY),
590*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_D3PER, RCC_D3DCR, 16, 2, MUX_NO_RDY),
591*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_MCO1, RCC_MCO1CFGR, 0, 1, MUX_NO_RDY),
592*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_MCO2, RCC_MCO2CFGR, 0, 1, MUX_NO_RDY),
593*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_ADC12, RCC_ADC12CFGR, 12, 1, MUX_NO_RDY),
594*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_ADC3, RCC_ADC3CFGR, 12, 2, MUX_NO_RDY),
595*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_USB2PHY1, RCC_USB2PHY1CFGR, 15, 1, MUX_NO_RDY),
596*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_USB2PHY2, RCC_USB2PHY2CFGR, 15, 1, MUX_NO_RDY),
597*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_USB3PCIEPHY, RCC_USB3PCIEPHYCFGR, 15, 1, MUX_NO_RDY),
598*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_DSIBLANE, RCC_DSICFGR, 12, 1, MUX_NO_RDY),
599*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_DSIPHY, RCC_DSICFGR, 15, 1, MUX_NO_RDY),
600*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_LVDSPHY, RCC_LVDSCFGR, 15, 1, MUX_NO_RDY),
601*28c10f9eSGabriel Fernandez 	_MUX_CFG(MUX_DTS, RCC_DTSCFGR, 12, 2, MUX_NO_RDY),
602*28c10f9eSGabriel Fernandez };
603*28c10f9eSGabriel Fernandez 
604*28c10f9eSGabriel Fernandez /*
605*28c10f9eSGabriel Fernandez  * DIV CONFIG
606*28c10f9eSGabriel Fernandez  */
607*28c10f9eSGabriel Fernandez 
608*28c10f9eSGabriel Fernandez static const struct div_table_cfg apb_div_table[] = {
609*28c10f9eSGabriel Fernandez 	{ .val = 0, .div = 1 },
610*28c10f9eSGabriel Fernandez 	{ .val = 1, .div = 2 },
611*28c10f9eSGabriel Fernandez 	{ .val = 2, .div = 4 },
612*28c10f9eSGabriel Fernandez 	{ .val = 3, .div = 8 },
613*28c10f9eSGabriel Fernandez 	{ .val = 4, .div = 16 },
614*28c10f9eSGabriel Fernandez 	{ .val = 5, .div = 16 },
615*28c10f9eSGabriel Fernandez 	{ .val = 6, .div = 16 },
616*28c10f9eSGabriel Fernandez 	{ .val = 7, .div = 16 },
617*28c10f9eSGabriel Fernandez 	/* .div = 0 termination cell */
618*28c10f9eSGabriel Fernandez 	{ }
619*28c10f9eSGabriel Fernandez };
620*28c10f9eSGabriel Fernandez 
621*28c10f9eSGabriel Fernandez #define _DIV_CFG(_id, _offset, _shift, _width, _flags, _table, _ready)\
622*28c10f9eSGabriel Fernandez 	[(_id)] = {\
623*28c10f9eSGabriel Fernandez 		.offset = (_offset),\
624*28c10f9eSGabriel Fernandez 		.shift = (_shift),\
625*28c10f9eSGabriel Fernandez 		.width = (_width),\
626*28c10f9eSGabriel Fernandez 		.flags = (_flags),\
627*28c10f9eSGabriel Fernandez 		.table = (_table),\
628*28c10f9eSGabriel Fernandez 		.ready = (_ready),\
629*28c10f9eSGabriel Fernandez 	}
630*28c10f9eSGabriel Fernandez 
631*28c10f9eSGabriel Fernandez static const struct div_cfg dividers_mp25[DIV_NB] = {
632*28c10f9eSGabriel Fernandez 	_DIV_CFG(DIV_RTC, RCC_RTCDIVR, 0, 6, 0, NULL, DIV_NO_RDY),
633*28c10f9eSGabriel Fernandez 	_DIV_CFG(DIV_APB1, RCC_APB1DIVR, 0, 3, 0, apb_div_table,
634*28c10f9eSGabriel Fernandez 		 GATE_APB1DIV_RDY),
635*28c10f9eSGabriel Fernandez 	_DIV_CFG(DIV_APB2, RCC_APB2DIVR, 0, 3, 0, apb_div_table,
636*28c10f9eSGabriel Fernandez 		 GATE_APB2DIV_RDY),
637*28c10f9eSGabriel Fernandez 	_DIV_CFG(DIV_APB3, RCC_APB3DIVR, 0, 3, 0, apb_div_table,
638*28c10f9eSGabriel Fernandez 		 GATE_APB3DIV_RDY),
639*28c10f9eSGabriel Fernandez 	_DIV_CFG(DIV_APB4, RCC_APB4DIVR, 0, 3, 0, apb_div_table,
640*28c10f9eSGabriel Fernandez 		 GATE_APB4DIV_RDY),
641*28c10f9eSGabriel Fernandez 	_DIV_CFG(DIV_APBDBG, RCC_APBDBGDIVR, 0, 3, 0, apb_div_table,
642*28c10f9eSGabriel Fernandez 		 GATE_APBDBGDIV_RDY),
643*28c10f9eSGabriel Fernandez 	_DIV_CFG(DIV_LSMCU, RCC_LSMCUDIVR, 0, 1, 0, NULL, GATE_LSMCUDIV_RDY),
644*28c10f9eSGabriel Fernandez };
645*28c10f9eSGabriel Fernandez 
646*28c10f9eSGabriel Fernandez enum stm32_osc {
647*28c10f9eSGabriel Fernandez 	OSC_HSI,
648*28c10f9eSGabriel Fernandez 	OSC_HSE,
649*28c10f9eSGabriel Fernandez 	OSC_MSI,
650*28c10f9eSGabriel Fernandez 	OSC_LSI,
651*28c10f9eSGabriel Fernandez 	OSC_LSE,
652*28c10f9eSGabriel Fernandez 	NB_OSCILLATOR
653*28c10f9eSGabriel Fernandez };
654*28c10f9eSGabriel Fernandez 
655*28c10f9eSGabriel Fernandez struct clk_stm32_bypass {
656*28c10f9eSGabriel Fernandez 	uint16_t offset;
657*28c10f9eSGabriel Fernandez 	uint8_t bit_byp;
658*28c10f9eSGabriel Fernandez 	uint8_t bit_digbyp;
659*28c10f9eSGabriel Fernandez };
660*28c10f9eSGabriel Fernandez 
661*28c10f9eSGabriel Fernandez struct clk_stm32_css {
662*28c10f9eSGabriel Fernandez 	uint16_t offset;
663*28c10f9eSGabriel Fernandez 	uint8_t bit_css;
664*28c10f9eSGabriel Fernandez };
665*28c10f9eSGabriel Fernandez 
666*28c10f9eSGabriel Fernandez struct clk_stm32_drive {
667*28c10f9eSGabriel Fernandez 	uint16_t offset;
668*28c10f9eSGabriel Fernandez 	uint8_t drv_shift;
669*28c10f9eSGabriel Fernandez 	uint8_t drv_width;
670*28c10f9eSGabriel Fernandez 	uint8_t drv_default;
671*28c10f9eSGabriel Fernandez };
672*28c10f9eSGabriel Fernandez 
673*28c10f9eSGabriel Fernandez struct clk_oscillator_data {
674*28c10f9eSGabriel Fernandez 	const char *name;
675*28c10f9eSGabriel Fernandez 	unsigned long frequency;
676*28c10f9eSGabriel Fernandez 	uint16_t gate_id;
677*28c10f9eSGabriel Fernandez 	struct clk_stm32_bypass *bypass;
678*28c10f9eSGabriel Fernandez 	struct clk_stm32_css *css;
679*28c10f9eSGabriel Fernandez 	struct clk_stm32_drive *drive;
680*28c10f9eSGabriel Fernandez };
681*28c10f9eSGabriel Fernandez 
682*28c10f9eSGabriel Fernandez #define BYPASS(_offset, _bit_byp, _bit_digbyp) \
683*28c10f9eSGabriel Fernandez 	(&(struct clk_stm32_bypass){\
684*28c10f9eSGabriel Fernandez 		.offset = (_offset),\
685*28c10f9eSGabriel Fernandez 		.bit_byp = (_bit_byp),\
686*28c10f9eSGabriel Fernandez 		.bit_digbyp = (_bit_digbyp),\
687*28c10f9eSGabriel Fernandez 	})
688*28c10f9eSGabriel Fernandez 
689*28c10f9eSGabriel Fernandez #define CSS(_offset, _bit_css) \
690*28c10f9eSGabriel Fernandez 	(&(struct clk_stm32_css){\
691*28c10f9eSGabriel Fernandez 		.offset = (_offset),\
692*28c10f9eSGabriel Fernandez 		.bit_css = (_bit_css),\
693*28c10f9eSGabriel Fernandez 	})
694*28c10f9eSGabriel Fernandez 
695*28c10f9eSGabriel Fernandez #define DRIVE(_offset, _shift, _width, _default) \
696*28c10f9eSGabriel Fernandez 	(&(struct clk_stm32_drive){\
697*28c10f9eSGabriel Fernandez 		.offset = (_offset),\
698*28c10f9eSGabriel Fernandez 		.drv_shift = (_shift),\
699*28c10f9eSGabriel Fernandez 		.drv_width = (_width),\
700*28c10f9eSGabriel Fernandez 		.drv_default = (_default),\
701*28c10f9eSGabriel Fernandez 	})
702*28c10f9eSGabriel Fernandez 
703*28c10f9eSGabriel Fernandez #define OSCILLATOR(idx_osc, _name, _gate_id, _bypass, _css, _drive) \
704*28c10f9eSGabriel Fernandez 	[(idx_osc)] = (struct clk_oscillator_data){\
705*28c10f9eSGabriel Fernandez 		.name = (_name),\
706*28c10f9eSGabriel Fernandez 		.gate_id = (_gate_id),\
707*28c10f9eSGabriel Fernandez 		.bypass = (_bypass),\
708*28c10f9eSGabriel Fernandez 		.css = (_css),\
709*28c10f9eSGabriel Fernandez 		.drive = (_drive),\
710*28c10f9eSGabriel Fernandez 	}
711*28c10f9eSGabriel Fernandez 
712*28c10f9eSGabriel Fernandez static struct clk_oscillator_data stm32mp25_osc_data[NB_OSCILLATOR] = {
713*28c10f9eSGabriel Fernandez 	OSCILLATOR(OSC_HSI, "clk-hsi", GATE_HSI,
714*28c10f9eSGabriel Fernandez 		   NULL, NULL, NULL),
715*28c10f9eSGabriel Fernandez 
716*28c10f9eSGabriel Fernandez 	OSCILLATOR(OSC_LSI, "clk-lsi", GATE_LSI,
717*28c10f9eSGabriel Fernandez 		   NULL, NULL, NULL),
718*28c10f9eSGabriel Fernandez 
719*28c10f9eSGabriel Fernandez 	OSCILLATOR(OSC_MSI, "clk-msi", GATE_MSI,
720*28c10f9eSGabriel Fernandez 		   NULL, NULL, NULL),
721*28c10f9eSGabriel Fernandez 
722*28c10f9eSGabriel Fernandez 	OSCILLATOR(OSC_LSE, "clk-lse", GATE_LSE,
723*28c10f9eSGabriel Fernandez 		   BYPASS(RCC_BDCR, RCC_BDCR_LSEBYP_BIT,
724*28c10f9eSGabriel Fernandez 			  RCC_BDCR_LSEDIGBYP_BIT),
725*28c10f9eSGabriel Fernandez 		   CSS(RCC_BDCR, RCC_BDCR_LSECSSON_BIT),
726*28c10f9eSGabriel Fernandez 		   DRIVE(RCC_BDCR, RCC_BDCR_LSEDRV_SHIFT,
727*28c10f9eSGabriel Fernandez 			 RCC_BDCR_LSEDRV_WIDTH, LSEDRV_MEDIUM_HIGH)),
728*28c10f9eSGabriel Fernandez 
729*28c10f9eSGabriel Fernandez 	OSCILLATOR(OSC_HSE, "clk-hse", GATE_HSE,
730*28c10f9eSGabriel Fernandez 		   BYPASS(RCC_OCENSETR, RCC_OCENSETR_HSEBYP_BIT,
731*28c10f9eSGabriel Fernandez 			  RCC_OCENSETR_HSEDIGBYP_BIT),
732*28c10f9eSGabriel Fernandez 		   CSS(RCC_OCENSETR, RCC_OCENSETR_HSECSSON_BIT),
733*28c10f9eSGabriel Fernandez 		   NULL),
734*28c10f9eSGabriel Fernandez };
735*28c10f9eSGabriel Fernandez 
736*28c10f9eSGabriel Fernandez static struct clk_oscillator_data *clk_oscillator_get_data(unsigned int osc_id)
737*28c10f9eSGabriel Fernandez {
738*28c10f9eSGabriel Fernandez 	assert(osc_id < ARRAY_SIZE(stm32mp25_osc_data));
739*28c10f9eSGabriel Fernandez 
740*28c10f9eSGabriel Fernandez 	return &stm32mp25_osc_data[osc_id];
741*28c10f9eSGabriel Fernandez }
742*28c10f9eSGabriel Fernandez 
743*28c10f9eSGabriel Fernandez static unsigned long clk_stm32_get_rate_oscillator(unsigned int osc_id)
744*28c10f9eSGabriel Fernandez {
745*28c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
746*28c10f9eSGabriel Fernandez 	struct stm32_clk_platdata *pdata = priv->pdata;
747*28c10f9eSGabriel Fernandez 	struct stm32_osci_dt_cfg *osci = &pdata->osci[osc_id];
748*28c10f9eSGabriel Fernandez 
749*28c10f9eSGabriel Fernandez 	return osci->freq;
750*28c10f9eSGabriel Fernandez }
751*28c10f9eSGabriel Fernandez 
752*28c10f9eSGabriel Fernandez static unsigned long clk_stm32_pll_get_oscillator_rate(unsigned int sel)
753*28c10f9eSGabriel Fernandez {
754*28c10f9eSGabriel Fernandez 	unsigned int osc[] = { OSC_HSI, OSC_HSE, OSC_MSI };
755*28c10f9eSGabriel Fernandez 
756*28c10f9eSGabriel Fernandez 	assert(sel < ARRAY_SIZE(osc));
757*28c10f9eSGabriel Fernandez 
758*28c10f9eSGabriel Fernandez 	return clk_stm32_get_rate_oscillator(osc[sel]);
759*28c10f9eSGabriel Fernandez }
760*28c10f9eSGabriel Fernandez 
761*28c10f9eSGabriel Fernandez static void clk_oscillator_set_bypass(struct clk_stm32_priv *priv,
762*28c10f9eSGabriel Fernandez 				      struct clk_oscillator_data *osc_data,
763*28c10f9eSGabriel Fernandez 				      bool digbyp, bool bypass)
764*28c10f9eSGabriel Fernandez {
765*28c10f9eSGabriel Fernandez 	struct clk_stm32_bypass *bypass_data = osc_data->bypass;
766*28c10f9eSGabriel Fernandez 	uintptr_t address = 0;
767*28c10f9eSGabriel Fernandez 
768*28c10f9eSGabriel Fernandez 	if (!bypass_data)
769*28c10f9eSGabriel Fernandez 		return;
770*28c10f9eSGabriel Fernandez 
771*28c10f9eSGabriel Fernandez 	address = priv->base + bypass_data->offset;
772*28c10f9eSGabriel Fernandez 
773*28c10f9eSGabriel Fernandez 	if (digbyp)
774*28c10f9eSGabriel Fernandez 		io_setbits32(address, BIT(bypass_data->bit_digbyp));
775*28c10f9eSGabriel Fernandez 
776*28c10f9eSGabriel Fernandez 	if (bypass || digbyp)
777*28c10f9eSGabriel Fernandez 		io_setbits32(address, BIT(bypass_data->bit_byp));
778*28c10f9eSGabriel Fernandez }
779*28c10f9eSGabriel Fernandez 
780*28c10f9eSGabriel Fernandez static void clk_oscillator_set_css(struct clk_stm32_priv *priv,
781*28c10f9eSGabriel Fernandez 				   struct clk_oscillator_data *osc_data,
782*28c10f9eSGabriel Fernandez 				   bool css)
783*28c10f9eSGabriel Fernandez {
784*28c10f9eSGabriel Fernandez 	struct clk_stm32_css *css_data = osc_data->css;
785*28c10f9eSGabriel Fernandez 
786*28c10f9eSGabriel Fernandez 	if (css_data && css)
787*28c10f9eSGabriel Fernandez 		io_setbits32(priv->base + css_data->offset,
788*28c10f9eSGabriel Fernandez 			     BIT(css_data->bit_css));
789*28c10f9eSGabriel Fernandez }
790*28c10f9eSGabriel Fernandez 
791*28c10f9eSGabriel Fernandez static void clk_oscillator_set_drive(struct clk_stm32_priv *priv,
792*28c10f9eSGabriel Fernandez 				     struct clk_oscillator_data *osc_data,
793*28c10f9eSGabriel Fernandez 				     uint8_t lsedrv)
794*28c10f9eSGabriel Fernandez {
795*28c10f9eSGabriel Fernandez 	struct clk_stm32_drive *drive_data = osc_data->drive;
796*28c10f9eSGabriel Fernandez 	uintptr_t address = 0;
797*28c10f9eSGabriel Fernandez 	uint32_t mask = 0;
798*28c10f9eSGabriel Fernandez 	uint32_t value = 0;
799*28c10f9eSGabriel Fernandez 
800*28c10f9eSGabriel Fernandez 	if (!drive_data)
801*28c10f9eSGabriel Fernandez 		return;
802*28c10f9eSGabriel Fernandez 
803*28c10f9eSGabriel Fernandez 	address = priv->base + drive_data->offset;
804*28c10f9eSGabriel Fernandez 
805*28c10f9eSGabriel Fernandez 	mask = SHIFT_U32(BIT(drive_data->drv_width) - 1, drive_data->drv_shift);
806*28c10f9eSGabriel Fernandez 
807*28c10f9eSGabriel Fernandez 	/*
808*28c10f9eSGabriel Fernandez 	 * Warning: not recommended to switch directly from "high drive"
809*28c10f9eSGabriel Fernandez 	 * to "medium low drive", and vice-versa.
810*28c10f9eSGabriel Fernandez 	 */
811*28c10f9eSGabriel Fernandez 	value = (io_read32(address) & mask) >> drive_data->drv_shift;
812*28c10f9eSGabriel Fernandez 
813*28c10f9eSGabriel Fernandez 	while (value != lsedrv) {
814*28c10f9eSGabriel Fernandez 		if (value > lsedrv)
815*28c10f9eSGabriel Fernandez 			value--;
816*28c10f9eSGabriel Fernandez 		else
817*28c10f9eSGabriel Fernandez 			value++;
818*28c10f9eSGabriel Fernandez 
819*28c10f9eSGabriel Fernandez 		io_clrsetbits32(address, mask,
820*28c10f9eSGabriel Fernandez 				SHIFT_U32(value, drive_data->drv_shift));
821*28c10f9eSGabriel Fernandez 	}
822*28c10f9eSGabriel Fernandez }
823*28c10f9eSGabriel Fernandez 
824*28c10f9eSGabriel Fernandez static void stm32_enable_oscillator_hse(struct clk_stm32_priv *priv,
825*28c10f9eSGabriel Fernandez 					struct stm32_clk_platdata *pdata)
826*28c10f9eSGabriel Fernandez {
827*28c10f9eSGabriel Fernandez 	struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_HSE);
828*28c10f9eSGabriel Fernandez 	struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_HSE];
829*28c10f9eSGabriel Fernandez 
830*28c10f9eSGabriel Fernandez 	if (!osci->freq)
831*28c10f9eSGabriel Fernandez 		return;
832*28c10f9eSGabriel Fernandez 
833*28c10f9eSGabriel Fernandez 	clk_oscillator_set_bypass(priv, osc_data, osci->digbyp, osci->bypass);
834*28c10f9eSGabriel Fernandez 
835*28c10f9eSGabriel Fernandez 	/* Enable clock and wait ready bit */
836*28c10f9eSGabriel Fernandez 	if (stm32_gate_rdy_enable(osc_data->gate_id))
837*28c10f9eSGabriel Fernandez 		panic("timeout to enable hse clock");
838*28c10f9eSGabriel Fernandez 
839*28c10f9eSGabriel Fernandez 	clk_oscillator_set_css(priv, osc_data, osci->css);
840*28c10f9eSGabriel Fernandez }
841*28c10f9eSGabriel Fernandez 
842*28c10f9eSGabriel Fernandez static void stm32_enable_oscillator_lse(struct clk_stm32_priv *priv,
843*28c10f9eSGabriel Fernandez 					struct stm32_clk_platdata *pdata)
844*28c10f9eSGabriel Fernandez {
845*28c10f9eSGabriel Fernandez 	struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_LSE);
846*28c10f9eSGabriel Fernandez 	struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSE];
847*28c10f9eSGabriel Fernandez 
848*28c10f9eSGabriel Fernandez 	if (!osci->freq)
849*28c10f9eSGabriel Fernandez 		return;
850*28c10f9eSGabriel Fernandez 
851*28c10f9eSGabriel Fernandez 	if (stm32_gate_is_enabled(osc_data->gate_id))
852*28c10f9eSGabriel Fernandez 		return;
853*28c10f9eSGabriel Fernandez 
854*28c10f9eSGabriel Fernandez 	clk_oscillator_set_bypass(priv, osc_data, osci->digbyp, osci->bypass);
855*28c10f9eSGabriel Fernandez 
856*28c10f9eSGabriel Fernandez 	clk_oscillator_set_drive(priv, osc_data, osci->drive);
857*28c10f9eSGabriel Fernandez 
858*28c10f9eSGabriel Fernandez 	/* Enable LSE clock, but don't wait ready bit */
859*28c10f9eSGabriel Fernandez 	stm32_gate_enable(osc_data->gate_id);
860*28c10f9eSGabriel Fernandez }
861*28c10f9eSGabriel Fernandez 
862*28c10f9eSGabriel Fernandez static void stm32_enable_oscillator_lsi(struct clk_stm32_priv *priv __unused,
863*28c10f9eSGabriel Fernandez 					struct stm32_clk_platdata *pdata)
864*28c10f9eSGabriel Fernandez {
865*28c10f9eSGabriel Fernandez 	struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_LSI);
866*28c10f9eSGabriel Fernandez 	struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSI];
867*28c10f9eSGabriel Fernandez 
868*28c10f9eSGabriel Fernandez 	if (!osci->freq)
869*28c10f9eSGabriel Fernandez 		return;
870*28c10f9eSGabriel Fernandez 
871*28c10f9eSGabriel Fernandez 	/* Enable clock and wait ready bit */
872*28c10f9eSGabriel Fernandez 	if (stm32_gate_rdy_enable(osc_data->gate_id))
873*28c10f9eSGabriel Fernandez 		panic("timeout to enable lsi clock");
874*28c10f9eSGabriel Fernandez }
875*28c10f9eSGabriel Fernandez 
876*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_osc_msi_set_rate(struct clk_stm32_priv *priv,
877*28c10f9eSGabriel Fernandez 					     unsigned long rate)
878*28c10f9eSGabriel Fernandez {
879*28c10f9eSGabriel Fernandez 	uintptr_t address = priv->base + RCC_BDCR;
880*28c10f9eSGabriel Fernandez 	uint32_t mask = RCC_BDCR_MSIFREQSEL;
881*28c10f9eSGabriel Fernandez 
882*28c10f9eSGabriel Fernandez 	switch (rate) {
883*28c10f9eSGabriel Fernandez 	case RCC_4_MHZ:
884*28c10f9eSGabriel Fernandez 		io_clrbits32_stm32shregs(address, mask);
885*28c10f9eSGabriel Fernandez 		break;
886*28c10f9eSGabriel Fernandez 	case RCC_16_MHZ:
887*28c10f9eSGabriel Fernandez 		io_setbits32_stm32shregs(address, mask);
888*28c10f9eSGabriel Fernandez 		break;
889*28c10f9eSGabriel Fernandez 	default:
890*28c10f9eSGabriel Fernandez 		return TEE_ERROR_GENERIC;
891*28c10f9eSGabriel Fernandez 	}
892*28c10f9eSGabriel Fernandez 
893*28c10f9eSGabriel Fernandez 	return TEE_SUCCESS;
894*28c10f9eSGabriel Fernandez }
895*28c10f9eSGabriel Fernandez 
896*28c10f9eSGabriel Fernandez static void stm32_enable_oscillator_msi(struct clk_stm32_priv *priv,
897*28c10f9eSGabriel Fernandez 					struct stm32_clk_platdata *pdata)
898*28c10f9eSGabriel Fernandez {
899*28c10f9eSGabriel Fernandez 	struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_MSI);
900*28c10f9eSGabriel Fernandez 	struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_MSI];
901*28c10f9eSGabriel Fernandez 
902*28c10f9eSGabriel Fernandez 	if (!osci->freq)
903*28c10f9eSGabriel Fernandez 		return;
904*28c10f9eSGabriel Fernandez 
905*28c10f9eSGabriel Fernandez 	if (clk_stm32_osc_msi_set_rate(priv, osci->freq) != TEE_SUCCESS)
906*28c10f9eSGabriel Fernandez 		EMSG("invalid rate %ld Hz for MSI ! (4000000 or 16000000 only)",
907*28c10f9eSGabriel Fernandez 		     osci->freq);
908*28c10f9eSGabriel Fernandez 
909*28c10f9eSGabriel Fernandez 	/* Enable clock and wait ready bit */
910*28c10f9eSGabriel Fernandez 	if (stm32_gate_rdy_enable(osc_data->gate_id))
911*28c10f9eSGabriel Fernandez 		panic("timeout to enable msi clock");
912*28c10f9eSGabriel Fernandez }
913*28c10f9eSGabriel Fernandez 
914*28c10f9eSGabriel Fernandez static void stm32_clk_oscillators_lse_set_css(struct clk_stm32_priv  *priv,
915*28c10f9eSGabriel Fernandez 					      struct stm32_clk_platdata *pdata)
916*28c10f9eSGabriel Fernandez 
917*28c10f9eSGabriel Fernandez {
918*28c10f9eSGabriel Fernandez 	struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_LSE);
919*28c10f9eSGabriel Fernandez 	struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSE];
920*28c10f9eSGabriel Fernandez 
921*28c10f9eSGabriel Fernandez 	clk_oscillator_set_css(priv, osc_data, osci->css);
922*28c10f9eSGabriel Fernandez }
923*28c10f9eSGabriel Fernandez 
924*28c10f9eSGabriel Fernandez static int
925*28c10f9eSGabriel Fernandez stm32_clk_oscillators_wait_lse_ready(struct clk_stm32_priv *priv __unused,
926*28c10f9eSGabriel Fernandez 				     struct stm32_clk_platdata *pdata)
927*28c10f9eSGabriel Fernandez {
928*28c10f9eSGabriel Fernandez 	struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_LSE);
929*28c10f9eSGabriel Fernandez 	struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSE];
930*28c10f9eSGabriel Fernandez 	int ret = 0;
931*28c10f9eSGabriel Fernandez 
932*28c10f9eSGabriel Fernandez 	if (osci->freq)
933*28c10f9eSGabriel Fernandez 		ret = stm32_gate_wait_ready(osc_data->gate_id, true);
934*28c10f9eSGabriel Fernandez 
935*28c10f9eSGabriel Fernandez 	return ret;
936*28c10f9eSGabriel Fernandez }
937*28c10f9eSGabriel Fernandez 
938*28c10f9eSGabriel Fernandez static void stm32_clk_oscillators_enable(struct clk_stm32_priv *priv,
939*28c10f9eSGabriel Fernandez 					 struct stm32_clk_platdata *pdata)
940*28c10f9eSGabriel Fernandez {
941*28c10f9eSGabriel Fernandez 	stm32_enable_oscillator_hse(priv, pdata);
942*28c10f9eSGabriel Fernandez 	stm32_enable_oscillator_lse(priv, pdata);
943*28c10f9eSGabriel Fernandez 	stm32_enable_oscillator_lsi(priv, pdata);
944*28c10f9eSGabriel Fernandez 	stm32_enable_oscillator_msi(priv, pdata);
945*28c10f9eSGabriel Fernandez }
946*28c10f9eSGabriel Fernandez 
947*28c10f9eSGabriel Fernandez enum stm32_pll_id {
948*28c10f9eSGabriel Fernandez 	PLL1_ID,
949*28c10f9eSGabriel Fernandez 	PLL2_ID,
950*28c10f9eSGabriel Fernandez 	PLL3_ID,
951*28c10f9eSGabriel Fernandez 	PLL4_ID,
952*28c10f9eSGabriel Fernandez 	PLL5_ID,
953*28c10f9eSGabriel Fernandez 	PLL6_ID,
954*28c10f9eSGabriel Fernandez 	PLL7_ID,
955*28c10f9eSGabriel Fernandez 	PLL8_ID,
956*28c10f9eSGabriel Fernandez 	PLL_NB
957*28c10f9eSGabriel Fernandez };
958*28c10f9eSGabriel Fernandez 
959*28c10f9eSGabriel Fernandez /* PLL configuration registers offsets from RCC_PLLxCFGR1 */
960*28c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR1		0x00
961*28c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR2		0x04
962*28c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR3		0x08
963*28c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR4		0x0C
964*28c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR5		0x10
965*28c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR6		0x18
966*28c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR7		0x1C
967*28c10f9eSGabriel Fernandez 
968*28c10f9eSGabriel Fernandez struct stm32_clk_pll {
969*28c10f9eSGabriel Fernandez 	uint16_t gate_id;
970*28c10f9eSGabriel Fernandez 	uint16_t mux_id;
971*28c10f9eSGabriel Fernandez 	uint16_t reg_pllxcfgr1;
972*28c10f9eSGabriel Fernandez };
973*28c10f9eSGabriel Fernandez 
974*28c10f9eSGabriel Fernandez #define CLK_PLL_CFG(_idx, _gate_id, _mux_id, _reg)\
975*28c10f9eSGabriel Fernandez 	[(_idx)] = {\
976*28c10f9eSGabriel Fernandez 		.gate_id = (_gate_id),\
977*28c10f9eSGabriel Fernandez 		.mux_id = (_mux_id),\
978*28c10f9eSGabriel Fernandez 		.reg_pllxcfgr1 = (_reg),\
979*28c10f9eSGabriel Fernandez 	}
980*28c10f9eSGabriel Fernandez 
981*28c10f9eSGabriel Fernandez static const struct stm32_clk_pll stm32mp25_clk_pll[PLL_NB] = {
982*28c10f9eSGabriel Fernandez 	CLK_PLL_CFG(PLL1_ID, GATE_PLL1, MUX_MUXSEL5, 0),
983*28c10f9eSGabriel Fernandez 	CLK_PLL_CFG(PLL2_ID, GATE_PLL2, MUX_MUXSEL6, RCC_PLL2CFGR1),
984*28c10f9eSGabriel Fernandez 	CLK_PLL_CFG(PLL3_ID, GATE_PLL3, MUX_MUXSEL7, RCC_PLL3CFGR1),
985*28c10f9eSGabriel Fernandez 	CLK_PLL_CFG(PLL4_ID, GATE_PLL4, MUX_MUXSEL0, RCC_PLL4CFGR1),
986*28c10f9eSGabriel Fernandez 	CLK_PLL_CFG(PLL5_ID, GATE_PLL5, MUX_MUXSEL1, RCC_PLL5CFGR1),
987*28c10f9eSGabriel Fernandez 	CLK_PLL_CFG(PLL6_ID, GATE_PLL6, MUX_MUXSEL2, RCC_PLL6CFGR1),
988*28c10f9eSGabriel Fernandez 	CLK_PLL_CFG(PLL7_ID, GATE_PLL7, MUX_MUXSEL3, RCC_PLL7CFGR1),
989*28c10f9eSGabriel Fernandez 	CLK_PLL_CFG(PLL8_ID, GATE_PLL8, MUX_MUXSEL4, RCC_PLL8CFGR1),
990*28c10f9eSGabriel Fernandez };
991*28c10f9eSGabriel Fernandez 
992*28c10f9eSGabriel Fernandez static const struct stm32_clk_pll *clk_stm32_pll_data(unsigned int idx)
993*28c10f9eSGabriel Fernandez {
994*28c10f9eSGabriel Fernandez 	assert(idx < ARRAY_SIZE(stm32mp25_clk_pll));
995*28c10f9eSGabriel Fernandez 
996*28c10f9eSGabriel Fernandez 	return &stm32mp25_clk_pll[idx];
997*28c10f9eSGabriel Fernandez }
998*28c10f9eSGabriel Fernandez 
999*28c10f9eSGabriel Fernandez static int stm32_clk_parse_oscillator_fdt(const void *fdt, int node,
1000*28c10f9eSGabriel Fernandez 					  const char *name,
1001*28c10f9eSGabriel Fernandez 					  struct stm32_osci_dt_cfg *osci)
1002*28c10f9eSGabriel Fernandez {
1003*28c10f9eSGabriel Fernandez 	int subnode = 0;
1004*28c10f9eSGabriel Fernandez 
1005*28c10f9eSGabriel Fernandez 	/* default value when oscillator is not found */
1006*28c10f9eSGabriel Fernandez 	osci->freq = 0;
1007*28c10f9eSGabriel Fernandez 
1008*28c10f9eSGabriel Fernandez 	fdt_for_each_subnode(subnode, fdt, node) {
1009*28c10f9eSGabriel Fernandez 		const char *cchar = NULL;
1010*28c10f9eSGabriel Fernandez 		const fdt32_t *cuint = NULL;
1011*28c10f9eSGabriel Fernandez 		int ret = 0;
1012*28c10f9eSGabriel Fernandez 
1013*28c10f9eSGabriel Fernandez 		cchar = fdt_get_name(fdt, subnode, &ret);
1014*28c10f9eSGabriel Fernandez 		if (!cchar)
1015*28c10f9eSGabriel Fernandez 			return ret;
1016*28c10f9eSGabriel Fernandez 
1017*28c10f9eSGabriel Fernandez 		if (strncmp(cchar, name, (size_t)ret) ||
1018*28c10f9eSGabriel Fernandez 		    fdt_get_status(fdt, subnode) == DT_STATUS_DISABLED)
1019*28c10f9eSGabriel Fernandez 			continue;
1020*28c10f9eSGabriel Fernandez 
1021*28c10f9eSGabriel Fernandez 		cuint = fdt_getprop(fdt, subnode, "clock-frequency", &ret);
1022*28c10f9eSGabriel Fernandez 		if (!cuint)
1023*28c10f9eSGabriel Fernandez 			return ret;
1024*28c10f9eSGabriel Fernandez 
1025*28c10f9eSGabriel Fernandez 		osci->freq = fdt32_to_cpu(*cuint);
1026*28c10f9eSGabriel Fernandez 
1027*28c10f9eSGabriel Fernandez 		if (fdt_getprop(fdt, subnode, "st,bypass", NULL))
1028*28c10f9eSGabriel Fernandez 			osci->bypass = true;
1029*28c10f9eSGabriel Fernandez 
1030*28c10f9eSGabriel Fernandez 		if (fdt_getprop(fdt, subnode, "st,digbypass", NULL))
1031*28c10f9eSGabriel Fernandez 			osci->digbyp = true;
1032*28c10f9eSGabriel Fernandez 
1033*28c10f9eSGabriel Fernandez 		if (fdt_getprop(fdt, subnode, "st,css", NULL))
1034*28c10f9eSGabriel Fernandez 			osci->css = true;
1035*28c10f9eSGabriel Fernandez 
1036*28c10f9eSGabriel Fernandez 		osci->drive = fdt_read_uint32_default(fdt, subnode, "st,drive",
1037*28c10f9eSGabriel Fernandez 						      LSEDRV_MEDIUM_HIGH);
1038*28c10f9eSGabriel Fernandez 
1039*28c10f9eSGabriel Fernandez 		return 0;
1040*28c10f9eSGabriel Fernandez 	}
1041*28c10f9eSGabriel Fernandez 
1042*28c10f9eSGabriel Fernandez 	return 0;
1043*28c10f9eSGabriel Fernandez }
1044*28c10f9eSGabriel Fernandez 
1045*28c10f9eSGabriel Fernandez static const char *stm32_clk_get_oscillator_name(enum stm32_osc id)
1046*28c10f9eSGabriel Fernandez {
1047*28c10f9eSGabriel Fernandez 	if (id < NB_OSCILLATOR)
1048*28c10f9eSGabriel Fernandez 		return stm32mp25_osc_data[id].name;
1049*28c10f9eSGabriel Fernandez 
1050*28c10f9eSGabriel Fernandez 	return NULL;
1051*28c10f9eSGabriel Fernandez }
1052*28c10f9eSGabriel Fernandez 
1053*28c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_oscillator(const void *fdt,
1054*28c10f9eSGabriel Fernandez 					      int node __unused,
1055*28c10f9eSGabriel Fernandez 					      struct stm32_clk_platdata *pdata)
1056*28c10f9eSGabriel Fernandez {
1057*28c10f9eSGabriel Fernandez 	int fdt_err = 0;
1058*28c10f9eSGabriel Fernandez 	size_t i = 0;
1059*28c10f9eSGabriel Fernandez 	int osc_node = 0;
1060*28c10f9eSGabriel Fernandez 
1061*28c10f9eSGabriel Fernandez 	osc_node = fdt_path_offset(fdt, "/clocks");
1062*28c10f9eSGabriel Fernandez 	if (osc_node < 0)
1063*28c10f9eSGabriel Fernandez 		return -FDT_ERR_NOTFOUND;
1064*28c10f9eSGabriel Fernandez 
1065*28c10f9eSGabriel Fernandez 	for (i = 0; i < pdata->nosci; i++) {
1066*28c10f9eSGabriel Fernandez 		const char *name = NULL;
1067*28c10f9eSGabriel Fernandez 
1068*28c10f9eSGabriel Fernandez 		name = stm32_clk_get_oscillator_name((enum stm32_osc)i);
1069*28c10f9eSGabriel Fernandez 		if (!name)
1070*28c10f9eSGabriel Fernandez 			continue;
1071*28c10f9eSGabriel Fernandez 
1072*28c10f9eSGabriel Fernandez 		fdt_err = stm32_clk_parse_oscillator_fdt(fdt, osc_node, name,
1073*28c10f9eSGabriel Fernandez 							 &pdata->osci[i]);
1074*28c10f9eSGabriel Fernandez 		if (fdt_err < 0)
1075*28c10f9eSGabriel Fernandez 			panic();
1076*28c10f9eSGabriel Fernandez 	}
1077*28c10f9eSGabriel Fernandez 
1078*28c10f9eSGabriel Fernandez 	return 0;
1079*28c10f9eSGabriel Fernandez }
1080*28c10f9eSGabriel Fernandez 
1081*28c10f9eSGabriel Fernandez static int clk_stm32_parse_pll_fdt(const void *fdt, int subnode,
1082*28c10f9eSGabriel Fernandez 				   struct stm32_pll_dt_cfg *pll)
1083*28c10f9eSGabriel Fernandez {
1084*28c10f9eSGabriel Fernandez 	const fdt32_t *cuint = NULL;
1085*28c10f9eSGabriel Fernandez 	int subnode_pll = 0;
1086*28c10f9eSGabriel Fernandez 	int err = 0;
1087*28c10f9eSGabriel Fernandez 
1088*28c10f9eSGabriel Fernandez 	cuint = fdt_getprop(fdt, subnode, "st,pll", NULL);
1089*28c10f9eSGabriel Fernandez 	if (!cuint)
1090*28c10f9eSGabriel Fernandez 		return 0;
1091*28c10f9eSGabriel Fernandez 
1092*28c10f9eSGabriel Fernandez 	subnode_pll = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*cuint));
1093*28c10f9eSGabriel Fernandez 	if (subnode_pll < 0)
1094*28c10f9eSGabriel Fernandez 		return -FDT_ERR_NOTFOUND;
1095*28c10f9eSGabriel Fernandez 
1096*28c10f9eSGabriel Fernandez 	if (fdt_read_uint32_array(fdt, subnode_pll, "cfg", pll->cfg,
1097*28c10f9eSGabriel Fernandez 				  PLLCFG_NB) != 0)
1098*28c10f9eSGabriel Fernandez 		panic("cfg property is mandatory");
1099*28c10f9eSGabriel Fernandez 
1100*28c10f9eSGabriel Fernandez 	err = fdt_read_uint32_array(fdt, subnode_pll, "csg", pll->csg,
1101*28c10f9eSGabriel Fernandez 				    PLLCSG_NB);
1102*28c10f9eSGabriel Fernandez 
1103*28c10f9eSGabriel Fernandez 	pll->csg_enabled = (err == 0);
1104*28c10f9eSGabriel Fernandez 
1105*28c10f9eSGabriel Fernandez 	if (err == -FDT_ERR_NOTFOUND)
1106*28c10f9eSGabriel Fernandez 		err = 0;
1107*28c10f9eSGabriel Fernandez 
1108*28c10f9eSGabriel Fernandez 	if (err != 0)
1109*28c10f9eSGabriel Fernandez 		return err;
1110*28c10f9eSGabriel Fernandez 
1111*28c10f9eSGabriel Fernandez 	pll->enabled = true;
1112*28c10f9eSGabriel Fernandez 
1113*28c10f9eSGabriel Fernandez 	pll->frac = fdt_read_uint32_default(fdt, subnode_pll, "frac", 0);
1114*28c10f9eSGabriel Fernandez 
1115*28c10f9eSGabriel Fernandez 	if (fdt_read_uint32(fdt, subnode_pll, "src", &pll->src))
1116*28c10f9eSGabriel Fernandez 		panic("src property is mandatory");
1117*28c10f9eSGabriel Fernandez 
1118*28c10f9eSGabriel Fernandez 	return 0;
1119*28c10f9eSGabriel Fernandez }
1120*28c10f9eSGabriel Fernandez 
1121*28c10f9eSGabriel Fernandez #define RCC_PLL_NAME_SIZE 20
1122*28c10f9eSGabriel Fernandez 
1123*28c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_pll(const void *fdt, int node,
1124*28c10f9eSGabriel Fernandez 				       struct stm32_clk_platdata *pdata)
1125*28c10f9eSGabriel Fernandez {
1126*28c10f9eSGabriel Fernandez 	unsigned int i = 0;
1127*28c10f9eSGabriel Fernandez 
1128*28c10f9eSGabriel Fernandez 	for (i = 0; i < pdata->npll; i++) {
1129*28c10f9eSGabriel Fernandez 		struct stm32_pll_dt_cfg *pll = pdata->pll + i;
1130*28c10f9eSGabriel Fernandez 		char name[RCC_PLL_NAME_SIZE] = { };
1131*28c10f9eSGabriel Fernandez 		int subnode = 0;
1132*28c10f9eSGabriel Fernandez 
1133*28c10f9eSGabriel Fernandez 		snprintf(name, sizeof(name), "st,pll-%u", i + 1);
1134*28c10f9eSGabriel Fernandez 
1135*28c10f9eSGabriel Fernandez 		subnode = fdt_subnode_offset(fdt, node, name);
1136*28c10f9eSGabriel Fernandez 		if (subnode < 0)
1137*28c10f9eSGabriel Fernandez 			continue;
1138*28c10f9eSGabriel Fernandez 
1139*28c10f9eSGabriel Fernandez 		if (clk_stm32_parse_pll_fdt(fdt, subnode, pll))
1140*28c10f9eSGabriel Fernandez 			panic();
1141*28c10f9eSGabriel Fernandez 	}
1142*28c10f9eSGabriel Fernandez 
1143*28c10f9eSGabriel Fernandez 	return 0;
1144*28c10f9eSGabriel Fernandez }
1145*28c10f9eSGabriel Fernandez 
1146*28c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_opp(const void *fdt, int node,
1147*28c10f9eSGabriel Fernandez 				   const char *opp_name,
1148*28c10f9eSGabriel Fernandez 				   struct stm32_clk_opp_cfg *opp_cfg)
1149*28c10f9eSGabriel Fernandez {
1150*28c10f9eSGabriel Fernandez 	int subnode = 0;
1151*28c10f9eSGabriel Fernandez 	int nb_opp = 0;
1152*28c10f9eSGabriel Fernandez 	int ret = 0;
1153*28c10f9eSGabriel Fernandez 
1154*28c10f9eSGabriel Fernandez 	node = fdt_subnode_offset(fdt, node, opp_name);
1155*28c10f9eSGabriel Fernandez 	if (node == -FDT_ERR_NOTFOUND)
1156*28c10f9eSGabriel Fernandez 		return 0;
1157*28c10f9eSGabriel Fernandez 
1158*28c10f9eSGabriel Fernandez 	if (node < 0)
1159*28c10f9eSGabriel Fernandez 		return node;
1160*28c10f9eSGabriel Fernandez 
1161*28c10f9eSGabriel Fernandez 	fdt_for_each_subnode(subnode, fdt, node) {
1162*28c10f9eSGabriel Fernandez 		assert(nb_opp <= MAX_OPP);
1163*28c10f9eSGabriel Fernandez 
1164*28c10f9eSGabriel Fernandez 		if (fdt_read_uint32(fdt, subnode, "hz", &opp_cfg->frq))
1165*28c10f9eSGabriel Fernandez 			panic("hz property is mandatory");
1166*28c10f9eSGabriel Fernandez 
1167*28c10f9eSGabriel Fernandez 		if (fdt_read_uint32(fdt, subnode, "st,clksrc", &opp_cfg->src))
1168*28c10f9eSGabriel Fernandez 			panic("st,clksrc property is mandatory");
1169*28c10f9eSGabriel Fernandez 
1170*28c10f9eSGabriel Fernandez 		ret = clk_stm32_parse_pll_fdt(fdt, subnode, &opp_cfg->pll_cfg);
1171*28c10f9eSGabriel Fernandez 		if (ret < 0)
1172*28c10f9eSGabriel Fernandez 			return ret;
1173*28c10f9eSGabriel Fernandez 
1174*28c10f9eSGabriel Fernandez 		opp_cfg++;
1175*28c10f9eSGabriel Fernandez 		nb_opp++;
1176*28c10f9eSGabriel Fernandez 	}
1177*28c10f9eSGabriel Fernandez 
1178*28c10f9eSGabriel Fernandez 	return 0;
1179*28c10f9eSGabriel Fernandez }
1180*28c10f9eSGabriel Fernandez 
1181*28c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_opp(const void *fdt, int node,
1182*28c10f9eSGabriel Fernandez 				       struct stm32_clk_platdata *pdata)
1183*28c10f9eSGabriel Fernandez {
1184*28c10f9eSGabriel Fernandez 	struct stm32_clk_opp_dt_cfg *opp = pdata->opp;
1185*28c10f9eSGabriel Fernandez 
1186*28c10f9eSGabriel Fernandez 	node = fdt_subnode_offset(fdt, node, "st,clk_opp");
1187*28c10f9eSGabriel Fernandez 	if (node == -FDT_ERR_NOTFOUND)
1188*28c10f9eSGabriel Fernandez 		return 0;
1189*28c10f9eSGabriel Fernandez 
1190*28c10f9eSGabriel Fernandez 	if (node < 0)
1191*28c10f9eSGabriel Fernandez 		return node;
1192*28c10f9eSGabriel Fernandez 
1193*28c10f9eSGabriel Fernandez 	return stm32_clk_parse_fdt_opp(fdt, node, "st,ck_cpu1", opp->cpu1_opp);
1194*28c10f9eSGabriel Fernandez }
1195*28c10f9eSGabriel Fernandez 
1196*28c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt(const void *fdt, int node,
1197*28c10f9eSGabriel Fernandez 			       struct stm32_clk_platdata *pdata)
1198*28c10f9eSGabriel Fernandez {
1199*28c10f9eSGabriel Fernandez 	int err = 0;
1200*28c10f9eSGabriel Fernandez 
1201*28c10f9eSGabriel Fernandez 	err = stm32_clk_parse_fdt_all_oscillator(fdt, node, pdata);
1202*28c10f9eSGabriel Fernandez 	if (err != 0)
1203*28c10f9eSGabriel Fernandez 		return err;
1204*28c10f9eSGabriel Fernandez 
1205*28c10f9eSGabriel Fernandez 	err = stm32_clk_parse_fdt_all_pll(fdt, node, pdata);
1206*28c10f9eSGabriel Fernandez 	if (err != 0)
1207*28c10f9eSGabriel Fernandez 		return err;
1208*28c10f9eSGabriel Fernandez 
1209*28c10f9eSGabriel Fernandez 	err = stm32_clk_parse_fdt_all_opp(fdt, node, pdata);
1210*28c10f9eSGabriel Fernandez 	if (err != 0)
1211*28c10f9eSGabriel Fernandez 		return err;
1212*28c10f9eSGabriel Fernandez 
1213*28c10f9eSGabriel Fernandez 	err = clk_stm32_parse_fdt_by_name(fdt, node, "st,busclk",
1214*28c10f9eSGabriel Fernandez 					  pdata->busclk,
1215*28c10f9eSGabriel Fernandez 					  &pdata->nbusclk);
1216*28c10f9eSGabriel Fernandez 	if (err != 0)
1217*28c10f9eSGabriel Fernandez 		return err;
1218*28c10f9eSGabriel Fernandez 
1219*28c10f9eSGabriel Fernandez 	err = clk_stm32_parse_fdt_by_name(fdt, node, "st,flexgen",
1220*28c10f9eSGabriel Fernandez 					  pdata->flexgen,
1221*28c10f9eSGabriel Fernandez 					  &pdata->nflexgen);
1222*28c10f9eSGabriel Fernandez 	if (err != 0)
1223*28c10f9eSGabriel Fernandez 		return err;
1224*28c10f9eSGabriel Fernandez 
1225*28c10f9eSGabriel Fernandez 	err = clk_stm32_parse_fdt_by_name(fdt, node, "st,kerclk",
1226*28c10f9eSGabriel Fernandez 					  pdata->kernelclk,
1227*28c10f9eSGabriel Fernandez 					  &pdata->nkernelclk);
1228*28c10f9eSGabriel Fernandez 	if (err != 0)
1229*28c10f9eSGabriel Fernandez 		return err;
1230*28c10f9eSGabriel Fernandez 
1231*28c10f9eSGabriel Fernandez 	pdata->c1msrd = fdt_read_uint32_default(fdt, node, "st,c1msrd", 0);
1232*28c10f9eSGabriel Fernandez 
1233*28c10f9eSGabriel Fernandez 	if (fdt_getprop(fdt, node, "st,safe_rst", NULL))
1234*28c10f9eSGabriel Fernandez 		pdata->safe_rst = true;
1235*28c10f9eSGabriel Fernandez 
1236*28c10f9eSGabriel Fernandez 	pdata->rcc_base = stm32_rcc_base();
1237*28c10f9eSGabriel Fernandez 
1238*28c10f9eSGabriel Fernandez 	return 0;
1239*28c10f9eSGabriel Fernandez }
1240*28c10f9eSGabriel Fernandez 
1241*28c10f9eSGabriel Fernandez static void stm32mp2_a35_ss_on_hsi(void)
1242*28c10f9eSGabriel Fernandez {
1243*28c10f9eSGabriel Fernandez 	uint64_t timeout = 0;
1244*28c10f9eSGabriel Fernandez 
1245*28c10f9eSGabriel Fernandez 	/* Nothing to do if clock source is already set on bypass clock */
1246*28c10f9eSGabriel Fernandez 	if (stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) &
1247*28c10f9eSGabriel Fernandez 	    A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK)
1248*28c10f9eSGabriel Fernandez 		return;
1249*28c10f9eSGabriel Fernandez 
1250*28c10f9eSGabriel Fernandez 	stm32mp_syscfg_write(A35SS_SSC_CHGCLKREQ,
1251*28c10f9eSGabriel Fernandez 			     A35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ_EN,
1252*28c10f9eSGabriel Fernandez 			     A35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ_MASK);
1253*28c10f9eSGabriel Fernandez 
1254*28c10f9eSGabriel Fernandez 	timeout = timeout_init_us(CLKSRC_TIMEOUT);
1255*28c10f9eSGabriel Fernandez 	while (!timeout_elapsed(timeout))
1256*28c10f9eSGabriel Fernandez 		if (stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) &
1257*28c10f9eSGabriel Fernandez 		    A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK)
1258*28c10f9eSGabriel Fernandez 			break;
1259*28c10f9eSGabriel Fernandez 
1260*28c10f9eSGabriel Fernandez 	if (!(stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) &
1261*28c10f9eSGabriel Fernandez 	      A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK))
1262*28c10f9eSGabriel Fernandez 		panic("Cannot switch A35 to bypass clock");
1263*28c10f9eSGabriel Fernandez 
1264*28c10f9eSGabriel Fernandez 	stm32mp_syscfg_write(A35SS_SSC_PLL_EN,
1265*28c10f9eSGabriel Fernandez 			     0,
1266*28c10f9eSGabriel Fernandez 			     A35SS_SSC_PLL_ENABLE_NRESET_SWPLL_FF_MASK);
1267*28c10f9eSGabriel Fernandez }
1268*28c10f9eSGabriel Fernandez 
1269*28c10f9eSGabriel Fernandez static void stm32mp2_clk_xbar_on_hsi(struct clk_stm32_priv *priv)
1270*28c10f9eSGabriel Fernandez {
1271*28c10f9eSGabriel Fernandez 	uintptr_t xbar0cfgr = priv->base + RCC_XBAR0CFGR;
1272*28c10f9eSGabriel Fernandez 	uint32_t i = 0;
1273*28c10f9eSGabriel Fernandez 
1274*28c10f9eSGabriel Fernandez 	for (i = 0; i < XBAR_ROOT_CHANNEL_NB; i++)
1275*28c10f9eSGabriel Fernandez 		io_clrsetbits32(xbar0cfgr + (0x4 * i),
1276*28c10f9eSGabriel Fernandez 				RCC_XBAR0CFGR_XBAR0SEL_MASK, XBAR_SRC_HSI);
1277*28c10f9eSGabriel Fernandez }
1278*28c10f9eSGabriel Fernandez 
1279*28c10f9eSGabriel Fernandez static int stm32mp2_a35_pll1_start(void)
1280*28c10f9eSGabriel Fernandez {
1281*28c10f9eSGabriel Fernandez 	uint64_t timeout = 0;
1282*28c10f9eSGabriel Fernandez 
1283*28c10f9eSGabriel Fernandez 	stm32mp_syscfg_write(A35SS_SSC_PLL_EN,
1284*28c10f9eSGabriel Fernandez 			     A35SS_SSC_PLL_ENABLE_PD_EN,
1285*28c10f9eSGabriel Fernandez 			     A35SS_SSC_PLL_ENABLE_PD_EN);
1286*28c10f9eSGabriel Fernandez 
1287*28c10f9eSGabriel Fernandez 	/* Wait PLL lock */
1288*28c10f9eSGabriel Fernandez 	timeout = timeout_init_us(PLLRDY_TIMEOUT);
1289*28c10f9eSGabriel Fernandez 	while (!timeout_elapsed(timeout))
1290*28c10f9eSGabriel Fernandez 		if (stm32mp_syscfg_read(A35SS_SSC_PLL_EN) &
1291*28c10f9eSGabriel Fernandez 		    A35SS_SSC_PLL_ENABLE_LOCKP_MASK)
1292*28c10f9eSGabriel Fernandez 			break;
1293*28c10f9eSGabriel Fernandez 
1294*28c10f9eSGabriel Fernandez 	if (!(stm32mp_syscfg_read(A35SS_SSC_PLL_EN) &
1295*28c10f9eSGabriel Fernandez 	      A35SS_SSC_PLL_ENABLE_LOCKP_MASK)) {
1296*28c10f9eSGabriel Fernandez 		EMSG("PLL1 not locked");
1297*28c10f9eSGabriel Fernandez 		return -1;
1298*28c10f9eSGabriel Fernandez 	}
1299*28c10f9eSGabriel Fernandez 
1300*28c10f9eSGabriel Fernandez 	/* De-assert reset on PLL output clock path */
1301*28c10f9eSGabriel Fernandez 	stm32mp_syscfg_write(A35SS_SSC_PLL_EN,
1302*28c10f9eSGabriel Fernandez 			     A35SS_SSC_PLL_ENABLE_NRESET_SWPLL_FF_EN,
1303*28c10f9eSGabriel Fernandez 			     A35SS_SSC_PLL_ENABLE_NRESET_SWPLL_FF_MASK);
1304*28c10f9eSGabriel Fernandez 
1305*28c10f9eSGabriel Fernandez 	/* Switch CPU clock to PLL clock */
1306*28c10f9eSGabriel Fernandez 	stm32mp_syscfg_write(A35SS_SSC_CHGCLKREQ,
1307*28c10f9eSGabriel Fernandez 			     0,
1308*28c10f9eSGabriel Fernandez 			     A35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ_MASK);
1309*28c10f9eSGabriel Fernandez 
1310*28c10f9eSGabriel Fernandez 	/* Wait for clock change acknowledge */
1311*28c10f9eSGabriel Fernandez 	timeout = timeout_init_us(CLKSRC_TIMEOUT);
1312*28c10f9eSGabriel Fernandez 	while (!timeout_elapsed(timeout))
1313*28c10f9eSGabriel Fernandez 		if (!(stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) &
1314*28c10f9eSGabriel Fernandez 		      A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK))
1315*28c10f9eSGabriel Fernandez 			break;
1316*28c10f9eSGabriel Fernandez 
1317*28c10f9eSGabriel Fernandez 	if (stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) &
1318*28c10f9eSGabriel Fernandez 	    A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) {
1319*28c10f9eSGabriel Fernandez 		EMSG("A35 switch to PLL1 failed");
1320*28c10f9eSGabriel Fernandez 		return -1;
1321*28c10f9eSGabriel Fernandez 	}
1322*28c10f9eSGabriel Fernandez 
1323*28c10f9eSGabriel Fernandez 	return 0;
1324*28c10f9eSGabriel Fernandez }
1325*28c10f9eSGabriel Fernandez 
1326*28c10f9eSGabriel Fernandez static void stm32mp2_a35_pll1_config(uint32_t fbdiv, uint32_t refdiv,
1327*28c10f9eSGabriel Fernandez 				     uint32_t postdiv1, uint32_t postdiv2)
1328*28c10f9eSGabriel Fernandez {
1329*28c10f9eSGabriel Fernandez 	stm32mp_syscfg_write(A35SS_SSC_PLL_FREQ1,
1330*28c10f9eSGabriel Fernandez 			     SHIFT_U32(refdiv,
1331*28c10f9eSGabriel Fernandez 				       A35SS_SSC_PLL_FREQ1_REFDIV_SHIFT) |
1332*28c10f9eSGabriel Fernandez 			     SHIFT_U32(fbdiv, A35SS_SSC_PLL_FREQ1_FBDIV_SHIFT),
1333*28c10f9eSGabriel Fernandez 			     A35SS_SSC_PLL_FREQ1_MASK);
1334*28c10f9eSGabriel Fernandez 
1335*28c10f9eSGabriel Fernandez 	stm32mp_syscfg_write(A35SS_SSC_PLL_FREQ2,
1336*28c10f9eSGabriel Fernandez 			     SHIFT_U32(postdiv1,
1337*28c10f9eSGabriel Fernandez 				       A35SS_SSC_PLL_FREQ2_POSTDIV1_SHIFT) |
1338*28c10f9eSGabriel Fernandez 			     SHIFT_U32(postdiv2,
1339*28c10f9eSGabriel Fernandez 				       A35SS_SSC_PLL_FREQ2_POSTDIV2_SHIFT),
1340*28c10f9eSGabriel Fernandez 			     A35SS_SSC_PLL_FREQ2_MASK);
1341*28c10f9eSGabriel Fernandez }
1342*28c10f9eSGabriel Fernandez 
1343*28c10f9eSGabriel Fernandez static void clk_stm32_pll_config_output(struct clk_stm32_priv *priv,
1344*28c10f9eSGabriel Fernandez 					const struct stm32_clk_pll *pll,
1345*28c10f9eSGabriel Fernandez 					uint32_t pllsrc,
1346*28c10f9eSGabriel Fernandez 					uint32_t *pllcfg,
1347*28c10f9eSGabriel Fernandez 					uint32_t fracv)
1348*28c10f9eSGabriel Fernandez {
1349*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1;
1350*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr2 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR2;
1351*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3;
1352*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4;
1353*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr6 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR6;
1354*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr7 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR7;
1355*28c10f9eSGabriel Fernandez 	int sel = (pllsrc & MUX_SEL_MASK) >> MUX_SEL_SHIFT;
1356*28c10f9eSGabriel Fernandez 	unsigned long refclk = clk_stm32_pll_get_oscillator_rate(sel);
1357*28c10f9eSGabriel Fernandez 
1358*28c10f9eSGabriel Fernandez 	if (fracv == 0) {
1359*28c10f9eSGabriel Fernandez 		/* PLL in integer mode */
1360*28c10f9eSGabriel Fernandez 
1361*28c10f9eSGabriel Fernandez 		/*
1362*28c10f9eSGabriel Fernandez 		 * No need to check max clock, as oscillator reference clocks
1363*28c10f9eSGabriel Fernandez 		 * will always be less than 1.2GHz
1364*28c10f9eSGabriel Fernandez 		 */
1365*28c10f9eSGabriel Fernandez 		if (refclk < PLL_REFCLK_MIN)
1366*28c10f9eSGabriel Fernandez 			panic();
1367*28c10f9eSGabriel Fernandez 
1368*28c10f9eSGabriel Fernandez 		io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_FRACIN_MASK);
1369*28c10f9eSGabriel Fernandez 		io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN);
1370*28c10f9eSGabriel Fernandez 		io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_DACEN);
1371*28c10f9eSGabriel Fernandez 		io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS);
1372*28c10f9eSGabriel Fernandez 		io_setbits32(pllxcfgr1, RCC_PLLxCFGR1_SSMODRST);
1373*28c10f9eSGabriel Fernandez 	} else {
1374*28c10f9eSGabriel Fernandez 		/* PLL in frac mode */
1375*28c10f9eSGabriel Fernandez 
1376*28c10f9eSGabriel Fernandez 		/*
1377*28c10f9eSGabriel Fernandez 		 * No need to check max clock, as oscillator reference clocks
1378*28c10f9eSGabriel Fernandez 		 * will always be less than 1.2GHz
1379*28c10f9eSGabriel Fernandez 		 */
1380*28c10f9eSGabriel Fernandez 		if (refclk < PLL_FRAC_REFCLK_MIN)
1381*28c10f9eSGabriel Fernandez 			panic();
1382*28c10f9eSGabriel Fernandez 
1383*28c10f9eSGabriel Fernandez 		io_clrsetbits32(pllxcfgr3, RCC_PLLxCFGR3_FRACIN_MASK,
1384*28c10f9eSGabriel Fernandez 				fracv & RCC_PLLxCFGR3_FRACIN_MASK);
1385*28c10f9eSGabriel Fernandez 		io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS);
1386*28c10f9eSGabriel Fernandez 		io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN);
1387*28c10f9eSGabriel Fernandez 	}
1388*28c10f9eSGabriel Fernandez 
1389*28c10f9eSGabriel Fernandez 	assert(pllcfg[REFDIV]);
1390*28c10f9eSGabriel Fernandez 
1391*28c10f9eSGabriel Fernandez 	io_clrsetbits32(pllxcfgr2, RCC_PLLxCFGR2_FBDIV_MASK,
1392*28c10f9eSGabriel Fernandez 			SHIFT_U32(pllcfg[FBDIV], RCC_PLLxCFGR2_FBDIV_SHIFT) &
1393*28c10f9eSGabriel Fernandez 			RCC_PLLxCFGR2_FBDIV_MASK);
1394*28c10f9eSGabriel Fernandez 	io_clrsetbits32(pllxcfgr2, RCC_PLLxCFGR2_FREFDIV_MASK,
1395*28c10f9eSGabriel Fernandez 			pllcfg[REFDIV] & RCC_PLLxCFGR2_FREFDIV_MASK);
1396*28c10f9eSGabriel Fernandez 	io_clrsetbits32(pllxcfgr6, RCC_PLLxCFGR6_POSTDIV1_MASK,
1397*28c10f9eSGabriel Fernandez 			pllcfg[POSTDIV1] & RCC_PLLxCFGR6_POSTDIV1_MASK);
1398*28c10f9eSGabriel Fernandez 	io_clrsetbits32(pllxcfgr7, RCC_PLLxCFGR7_POSTDIV2_MASK,
1399*28c10f9eSGabriel Fernandez 			pllcfg[POSTDIV2] & RCC_PLLxCFGR7_POSTDIV2_MASK);
1400*28c10f9eSGabriel Fernandez 
1401*28c10f9eSGabriel Fernandez 	if (pllcfg[POSTDIV1] == 0 || pllcfg[POSTDIV2] == 0) {
1402*28c10f9eSGabriel Fernandez 		/* Bypass mode */
1403*28c10f9eSGabriel Fernandez 		io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_BYPASS);
1404*28c10f9eSGabriel Fernandez 		io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_FOUTPOSTDIVEN);
1405*28c10f9eSGabriel Fernandez 	} else {
1406*28c10f9eSGabriel Fernandez 		io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_BYPASS);
1407*28c10f9eSGabriel Fernandez 		io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_FOUTPOSTDIVEN);
1408*28c10f9eSGabriel Fernandez 	}
1409*28c10f9eSGabriel Fernandez }
1410*28c10f9eSGabriel Fernandez 
1411*28c10f9eSGabriel Fernandez static void clk_stm32_pll_config_csg(struct clk_stm32_priv *priv,
1412*28c10f9eSGabriel Fernandez 				     const struct stm32_clk_pll *pll,
1413*28c10f9eSGabriel Fernandez 				     uint32_t *csg)
1414*28c10f9eSGabriel Fernandez {
1415*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1;
1416*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3;
1417*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4;
1418*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr5 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR5;
1419*28c10f9eSGabriel Fernandez 
1420*28c10f9eSGabriel Fernandez 	io_clrsetbits32(pllxcfgr5, RCC_PLLxCFGR5_DIVVAL_MASK,
1421*28c10f9eSGabriel Fernandez 			csg[DIVVAL] & RCC_PLLxCFGR5_DIVVAL_MASK);
1422*28c10f9eSGabriel Fernandez 	io_clrsetbits32(pllxcfgr5, RCC_PLLxCFGR5_SPREAD_MASK,
1423*28c10f9eSGabriel Fernandez 			SHIFT_U32(csg[SPREAD], RCC_PLLxCFGR5_SPREAD_SHIFT) &
1424*28c10f9eSGabriel Fernandez 			RCC_PLLxCFGR5_SPREAD_MASK);
1425*28c10f9eSGabriel Fernandez 
1426*28c10f9eSGabriel Fernandez 	if (csg[DOWNSPREAD] != 0)
1427*28c10f9eSGabriel Fernandez 		io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_DOWNSPREAD);
1428*28c10f9eSGabriel Fernandez 	else
1429*28c10f9eSGabriel Fernandez 		io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_DOWNSPREAD);
1430*28c10f9eSGabriel Fernandez 
1431*28c10f9eSGabriel Fernandez 	io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS);
1432*28c10f9eSGabriel Fernandez 
1433*28c10f9eSGabriel Fernandez 	io_clrbits32(pllxcfgr1, RCC_PLLxCFGR1_PLLEN);
1434*28c10f9eSGabriel Fernandez 	udelay(1);
1435*28c10f9eSGabriel Fernandez 
1436*28c10f9eSGabriel Fernandez 	io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN);
1437*28c10f9eSGabriel Fernandez 	io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_DACEN);
1438*28c10f9eSGabriel Fernandez }
1439*28c10f9eSGabriel Fernandez 
1440*28c10f9eSGabriel Fernandez static struct stm32_pll_dt_cfg *clk_stm32_pll_get_pdata(unsigned int pll_idx)
1441*28c10f9eSGabriel Fernandez {
1442*28c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
1443*28c10f9eSGabriel Fernandez 	struct stm32_clk_platdata *pdata = priv->pdata;
1444*28c10f9eSGabriel Fernandez 
1445*28c10f9eSGabriel Fernandez 	assert(pll_idx < pdata->npll);
1446*28c10f9eSGabriel Fernandez 
1447*28c10f9eSGabriel Fernandez 	return &pdata->pll[pll_idx];
1448*28c10f9eSGabriel Fernandez }
1449*28c10f9eSGabriel Fernandez 
1450*28c10f9eSGabriel Fernandez static int clk_stm32_pll_set_mux(struct clk_stm32_priv *priv __unused,
1451*28c10f9eSGabriel Fernandez 				 uint32_t src)
1452*28c10f9eSGabriel Fernandez {
1453*28c10f9eSGabriel Fernandez 	int mux = (src & MUX_ID_MASK) >> MUX_ID_SHIFT;
1454*28c10f9eSGabriel Fernandez 	int sel = (src & MUX_SEL_MASK) >> MUX_SEL_SHIFT;
1455*28c10f9eSGabriel Fernandez 
1456*28c10f9eSGabriel Fernandez 	return stm32_mux_set_parent(mux, sel);
1457*28c10f9eSGabriel Fernandez }
1458*28c10f9eSGabriel Fernandez 
1459*28c10f9eSGabriel Fernandez static void clk_stm32_pll1_init(struct clk_stm32_priv *priv,
1460*28c10f9eSGabriel Fernandez 				int pll_idx __unused,
1461*28c10f9eSGabriel Fernandez 				struct stm32_pll_dt_cfg *pll_conf)
1462*28c10f9eSGabriel Fernandez {
1463*28c10f9eSGabriel Fernandez 	int sel = (pll_conf->src & MUX_SEL_MASK) >> MUX_SEL_SHIFT;
1464*28c10f9eSGabriel Fernandez 	unsigned long refclk = 0;
1465*28c10f9eSGabriel Fernandez 
1466*28c10f9eSGabriel Fernandez 	/*
1467*28c10f9eSGabriel Fernandez 	 * TODO: check if pll has already good parameters or if we could make
1468*28c10f9eSGabriel Fernandez 	 * a configuration on the fly.
1469*28c10f9eSGabriel Fernandez 	 */
1470*28c10f9eSGabriel Fernandez 
1471*28c10f9eSGabriel Fernandez 	stm32mp2_a35_ss_on_hsi();
1472*28c10f9eSGabriel Fernandez 
1473*28c10f9eSGabriel Fernandez 	if (clk_stm32_pll_set_mux(priv, pll_conf->src))
1474*28c10f9eSGabriel Fernandez 		panic();
1475*28c10f9eSGabriel Fernandez 
1476*28c10f9eSGabriel Fernandez 	refclk = clk_stm32_pll_get_oscillator_rate(sel);
1477*28c10f9eSGabriel Fernandez 
1478*28c10f9eSGabriel Fernandez 	/*
1479*28c10f9eSGabriel Fernandez 	 * No need to check max clock, as oscillator reference clocks will
1480*28c10f9eSGabriel Fernandez 	 * always be less than 1.2GHz
1481*28c10f9eSGabriel Fernandez 	 */
1482*28c10f9eSGabriel Fernandez 	if (refclk < PLL_REFCLK_MIN)
1483*28c10f9eSGabriel Fernandez 		panic();
1484*28c10f9eSGabriel Fernandez 
1485*28c10f9eSGabriel Fernandez 	stm32mp2_a35_pll1_config(pll_conf->cfg[FBDIV],
1486*28c10f9eSGabriel Fernandez 				 pll_conf->cfg[REFDIV],
1487*28c10f9eSGabriel Fernandez 				 pll_conf->cfg[POSTDIV1],
1488*28c10f9eSGabriel Fernandez 				 pll_conf->cfg[POSTDIV2]);
1489*28c10f9eSGabriel Fernandez 
1490*28c10f9eSGabriel Fernandez 	if (stm32mp2_a35_pll1_start())
1491*28c10f9eSGabriel Fernandez 		panic();
1492*28c10f9eSGabriel Fernandez }
1493*28c10f9eSGabriel Fernandez 
1494*28c10f9eSGabriel Fernandez static void clk_stm32_pll_init(struct clk_stm32_priv *priv, int pll_idx,
1495*28c10f9eSGabriel Fernandez 			       struct stm32_pll_dt_cfg *pll_conf)
1496*28c10f9eSGabriel Fernandez {
1497*28c10f9eSGabriel Fernandez 	const struct stm32_clk_pll *pll = clk_stm32_pll_data(pll_idx);
1498*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1;
1499*28c10f9eSGabriel Fernandez 	bool spread_spectrum = false;
1500*28c10f9eSGabriel Fernandez 
1501*28c10f9eSGabriel Fernandez 	/*
1502*28c10f9eSGabriel Fernandez 	 * TODO: check if pll has already good parameters or if we could make
1503*28c10f9eSGabriel Fernandez 	 * a configuration on the fly.
1504*28c10f9eSGabriel Fernandez 	 */
1505*28c10f9eSGabriel Fernandez 
1506*28c10f9eSGabriel Fernandez 	stm32_gate_rdy_disable(pll->gate_id);
1507*28c10f9eSGabriel Fernandez 
1508*28c10f9eSGabriel Fernandez 	if (clk_stm32_pll_set_mux(priv, pll_conf->src))
1509*28c10f9eSGabriel Fernandez 		panic();
1510*28c10f9eSGabriel Fernandez 
1511*28c10f9eSGabriel Fernandez 	clk_stm32_pll_config_output(priv, pll, pll_conf->src,
1512*28c10f9eSGabriel Fernandez 				    pll_conf->cfg, pll_conf->frac);
1513*28c10f9eSGabriel Fernandez 
1514*28c10f9eSGabriel Fernandez 	if (pll_conf->csg_enabled) {
1515*28c10f9eSGabriel Fernandez 		clk_stm32_pll_config_csg(priv, pll, pll_conf->csg);
1516*28c10f9eSGabriel Fernandez 		spread_spectrum = true;
1517*28c10f9eSGabriel Fernandez 	}
1518*28c10f9eSGabriel Fernandez 
1519*28c10f9eSGabriel Fernandez 	stm32_gate_rdy_enable(pll->gate_id);
1520*28c10f9eSGabriel Fernandez 
1521*28c10f9eSGabriel Fernandez 	if (spread_spectrum)
1522*28c10f9eSGabriel Fernandez 		io_clrbits32(pllxcfgr1, RCC_PLLxCFGR1_SSMODRST);
1523*28c10f9eSGabriel Fernandez }
1524*28c10f9eSGabriel Fernandez 
1525*28c10f9eSGabriel Fernandez static int stm32_clk_pll_configure(struct clk_stm32_priv *priv)
1526*28c10f9eSGabriel Fernandez {
1527*28c10f9eSGabriel Fernandez 	struct stm32_pll_dt_cfg *pll_conf = NULL;
1528*28c10f9eSGabriel Fernandez 	size_t i = 0;
1529*28c10f9eSGabriel Fernandez 
1530*28c10f9eSGabriel Fernandez 	for (i = 0; i < PLL_NB; i++) {
1531*28c10f9eSGabriel Fernandez 		pll_conf = clk_stm32_pll_get_pdata(i);
1532*28c10f9eSGabriel Fernandez 
1533*28c10f9eSGabriel Fernandez 		if (pll_conf->enabled) {
1534*28c10f9eSGabriel Fernandez 			/* Skip the pll3 (need GPU regulator to configure) */
1535*28c10f9eSGabriel Fernandez 			if (i == PLL3_ID)
1536*28c10f9eSGabriel Fernandez 				continue;
1537*28c10f9eSGabriel Fernandez 
1538*28c10f9eSGabriel Fernandez 			/* Skip the pll2 (reserved to DDR) */
1539*28c10f9eSGabriel Fernandez 			if (i == PLL2_ID)
1540*28c10f9eSGabriel Fernandez 				continue;
1541*28c10f9eSGabriel Fernandez 
1542*28c10f9eSGabriel Fernandez 			if (i == PLL1_ID)
1543*28c10f9eSGabriel Fernandez 				clk_stm32_pll1_init(priv, i, pll_conf);
1544*28c10f9eSGabriel Fernandez 			else
1545*28c10f9eSGabriel Fernandez 				clk_stm32_pll_init(priv, i, pll_conf);
1546*28c10f9eSGabriel Fernandez 		}
1547*28c10f9eSGabriel Fernandez 	}
1548*28c10f9eSGabriel Fernandez 
1549*28c10f9eSGabriel Fernandez 	return 0;
1550*28c10f9eSGabriel Fernandez }
1551*28c10f9eSGabriel Fernandez 
1552*28c10f9eSGabriel Fernandez #define __WORD_BIT 32
1553*28c10f9eSGabriel Fernandez 
1554*28c10f9eSGabriel Fernandez static int wait_predivsr(uint16_t channel)
1555*28c10f9eSGabriel Fernandez {
1556*28c10f9eSGabriel Fernandez 	uintptr_t rcc_base = stm32_rcc_base();
1557*28c10f9eSGabriel Fernandez 	uintptr_t previvsr = 0;
1558*28c10f9eSGabriel Fernandez 	uint32_t channel_bit = 0;
1559*28c10f9eSGabriel Fernandez 	uint32_t value = 0;
1560*28c10f9eSGabriel Fernandez 
1561*28c10f9eSGabriel Fernandez 	if (channel < __WORD_BIT) {
1562*28c10f9eSGabriel Fernandez 		previvsr = rcc_base + RCC_PREDIVSR1;
1563*28c10f9eSGabriel Fernandez 		channel_bit = BIT(channel);
1564*28c10f9eSGabriel Fernandez 	} else {
1565*28c10f9eSGabriel Fernandez 		previvsr = rcc_base + RCC_PREDIVSR2;
1566*28c10f9eSGabriel Fernandez 		channel_bit = BIT(channel - __WORD_BIT);
1567*28c10f9eSGabriel Fernandez 	}
1568*28c10f9eSGabriel Fernandez 
1569*28c10f9eSGabriel Fernandez 	if (IO_READ32_POLL_TIMEOUT(previvsr, value, !(value & channel_bit), 0,
1570*28c10f9eSGabriel Fernandez 				   CLKDIV_TIMEOUT)) {
1571*28c10f9eSGabriel Fernandez 		EMSG("Pre divider status: %#"PRIx32, io_read32(previvsr));
1572*28c10f9eSGabriel Fernandez 		return -1;
1573*28c10f9eSGabriel Fernandez 	}
1574*28c10f9eSGabriel Fernandez 
1575*28c10f9eSGabriel Fernandez 	return 0;
1576*28c10f9eSGabriel Fernandez }
1577*28c10f9eSGabriel Fernandez 
1578*28c10f9eSGabriel Fernandez static int wait_findivsr(uint16_t channel)
1579*28c10f9eSGabriel Fernandez {
1580*28c10f9eSGabriel Fernandez 	uintptr_t rcc_base = stm32_rcc_base();
1581*28c10f9eSGabriel Fernandez 	uintptr_t finvivsr = 0;
1582*28c10f9eSGabriel Fernandez 	uint32_t channel_bit = 0;
1583*28c10f9eSGabriel Fernandez 	uint32_t value = 0;
1584*28c10f9eSGabriel Fernandez 
1585*28c10f9eSGabriel Fernandez 	if (channel < __WORD_BIT) {
1586*28c10f9eSGabriel Fernandez 		finvivsr = rcc_base + RCC_FINDIVSR1;
1587*28c10f9eSGabriel Fernandez 		channel_bit = BIT(channel);
1588*28c10f9eSGabriel Fernandez 	} else {
1589*28c10f9eSGabriel Fernandez 		finvivsr = rcc_base + RCC_FINDIVSR2;
1590*28c10f9eSGabriel Fernandez 		channel_bit = BIT(channel - __WORD_BIT);
1591*28c10f9eSGabriel Fernandez 	}
1592*28c10f9eSGabriel Fernandez 
1593*28c10f9eSGabriel Fernandez 	if (IO_READ32_POLL_TIMEOUT(finvivsr, value, !(value & channel_bit), 0,
1594*28c10f9eSGabriel Fernandez 				   CLKDIV_TIMEOUT)) {
1595*28c10f9eSGabriel Fernandez 		EMSG("Final divider status: %#"PRIx32, io_read32(finvivsr));
1596*28c10f9eSGabriel Fernandez 		return -1;
1597*28c10f9eSGabriel Fernandez 	}
1598*28c10f9eSGabriel Fernandez 
1599*28c10f9eSGabriel Fernandez 	return 0;
1600*28c10f9eSGabriel Fernandez }
1601*28c10f9eSGabriel Fernandez 
1602*28c10f9eSGabriel Fernandez static int wait_xbar_sts(uint16_t channel)
1603*28c10f9eSGabriel Fernandez {
1604*28c10f9eSGabriel Fernandez 	uintptr_t rcc_base = stm32_rcc_base();
1605*28c10f9eSGabriel Fernandez 	uintptr_t xbar_cfgr = rcc_base + RCC_XBAR0CFGR + (0x4 * channel);
1606*28c10f9eSGabriel Fernandez 	uint32_t value = 0;
1607*28c10f9eSGabriel Fernandez 
1608*28c10f9eSGabriel Fernandez 	if (IO_READ32_POLL_TIMEOUT(xbar_cfgr, value,
1609*28c10f9eSGabriel Fernandez 				   !(value & RCC_XBAR0CFGR_XBAR0STS), 0,
1610*28c10f9eSGabriel Fernandez 				   CLKDIV_TIMEOUT)) {
1611*28c10f9eSGabriel Fernandez 		EMSG("XBAR%"PRIu16"CFGR: %#"PRIx32, channel,
1612*28c10f9eSGabriel Fernandez 		     io_read32(xbar_cfgr));
1613*28c10f9eSGabriel Fernandez 		return -1;
1614*28c10f9eSGabriel Fernandez 	}
1615*28c10f9eSGabriel Fernandez 
1616*28c10f9eSGabriel Fernandez 	return 0;
1617*28c10f9eSGabriel Fernandez }
1618*28c10f9eSGabriel Fernandez 
1619*28c10f9eSGabriel Fernandez static void flexclkgen_config_channel(uint16_t channel, unsigned int clk_src,
1620*28c10f9eSGabriel Fernandez 				      unsigned int prediv, unsigned int findiv)
1621*28c10f9eSGabriel Fernandez {
1622*28c10f9eSGabriel Fernandez 	uintptr_t rcc_base = stm32_rcc_base();
1623*28c10f9eSGabriel Fernandez 
1624*28c10f9eSGabriel Fernandez 	if (wait_predivsr(channel) != 0)
1625*28c10f9eSGabriel Fernandez 		panic();
1626*28c10f9eSGabriel Fernandez 
1627*28c10f9eSGabriel Fernandez 	io_clrsetbits32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel),
1628*28c10f9eSGabriel Fernandez 			RCC_PREDIV0CFGR_PREDIV0_MASK, prediv);
1629*28c10f9eSGabriel Fernandez 
1630*28c10f9eSGabriel Fernandez 	if (wait_predivsr(channel) != 0)
1631*28c10f9eSGabriel Fernandez 		panic();
1632*28c10f9eSGabriel Fernandez 
1633*28c10f9eSGabriel Fernandez 	if (wait_findivsr(channel) != 0)
1634*28c10f9eSGabriel Fernandez 		panic();
1635*28c10f9eSGabriel Fernandez 
1636*28c10f9eSGabriel Fernandez 	io_clrsetbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel),
1637*28c10f9eSGabriel Fernandez 			RCC_FINDIV0CFGR_FINDIV0_MASK,
1638*28c10f9eSGabriel Fernandez 			findiv);
1639*28c10f9eSGabriel Fernandez 
1640*28c10f9eSGabriel Fernandez 	if (wait_findivsr(channel) != 0)
1641*28c10f9eSGabriel Fernandez 		panic();
1642*28c10f9eSGabriel Fernandez 
1643*28c10f9eSGabriel Fernandez 	if (wait_xbar_sts(channel) != 0)
1644*28c10f9eSGabriel Fernandez 		panic();
1645*28c10f9eSGabriel Fernandez 
1646*28c10f9eSGabriel Fernandez 	io_clrsetbits32(rcc_base + RCC_XBAR0CFGR + (0x4 * channel),
1647*28c10f9eSGabriel Fernandez 			RCC_XBAR0CFGR_XBAR0SEL_MASK,
1648*28c10f9eSGabriel Fernandez 			clk_src);
1649*28c10f9eSGabriel Fernandez 
1650*28c10f9eSGabriel Fernandez 	io_setbits32(rcc_base + RCC_XBAR0CFGR + (0x4 * channel),
1651*28c10f9eSGabriel Fernandez 		     RCC_XBAR0CFGR_XBAR0EN);
1652*28c10f9eSGabriel Fernandez 
1653*28c10f9eSGabriel Fernandez 	if (wait_xbar_sts(channel) != 0)
1654*28c10f9eSGabriel Fernandez 		panic();
1655*28c10f9eSGabriel Fernandez }
1656*28c10f9eSGabriel Fernandez 
1657*28c10f9eSGabriel Fernandez static int stm32mp2_clk_flexgen_configure(struct clk_stm32_priv *priv)
1658*28c10f9eSGabriel Fernandez {
1659*28c10f9eSGabriel Fernandez 	struct stm32_clk_platdata *pdata = priv->pdata;
1660*28c10f9eSGabriel Fernandez 	uint32_t i = 0;
1661*28c10f9eSGabriel Fernandez 
1662*28c10f9eSGabriel Fernandez 	for (i = 0; i < pdata->nflexgen; i++) {
1663*28c10f9eSGabriel Fernandez 		uint32_t val = pdata->flexgen[i];
1664*28c10f9eSGabriel Fernandez 		uint32_t cmd = 0;
1665*28c10f9eSGabriel Fernandez 		uint32_t cmd_data = 0;
1666*28c10f9eSGabriel Fernandez 		unsigned int channel = 0;
1667*28c10f9eSGabriel Fernandez 		unsigned int clk_src = 0;
1668*28c10f9eSGabriel Fernandez 		unsigned int pdiv = 0;
1669*28c10f9eSGabriel Fernandez 		unsigned int fdiv = 0;
1670*28c10f9eSGabriel Fernandez 
1671*28c10f9eSGabriel Fernandez 		cmd = (val & CMD_MASK) >> CMD_SHIFT;
1672*28c10f9eSGabriel Fernandez 		cmd_data = val & ~CMD_MASK;
1673*28c10f9eSGabriel Fernandez 
1674*28c10f9eSGabriel Fernandez 		if (cmd != CMD_FLEXGEN)
1675*28c10f9eSGabriel Fernandez 			continue;
1676*28c10f9eSGabriel Fernandez 
1677*28c10f9eSGabriel Fernandez 		channel = (cmd_data & FLEX_ID_MASK) >> FLEX_ID_SHIFT;
1678*28c10f9eSGabriel Fernandez 
1679*28c10f9eSGabriel Fernandez 		/*
1680*28c10f9eSGabriel Fernandez 		 * Skip ck_ker_stgen configuration, will be done by
1681*28c10f9eSGabriel Fernandez 		 * stgen driver.
1682*28c10f9eSGabriel Fernandez 		 */
1683*28c10f9eSGabriel Fernandez 		if (channel == FLEX_STGEN)
1684*28c10f9eSGabriel Fernandez 			continue;
1685*28c10f9eSGabriel Fernandez 
1686*28c10f9eSGabriel Fernandez 		clk_src = (cmd_data & FLEX_SEL_MASK) >> FLEX_SEL_SHIFT;
1687*28c10f9eSGabriel Fernandez 		pdiv = (cmd_data & FLEX_PDIV_MASK) >> FLEX_PDIV_SHIFT;
1688*28c10f9eSGabriel Fernandez 		fdiv = (cmd_data & FLEX_FDIV_MASK) >> FLEX_FDIV_SHIFT;
1689*28c10f9eSGabriel Fernandez 
1690*28c10f9eSGabriel Fernandez 		flexclkgen_config_channel(channel, clk_src, pdiv, fdiv);
1691*28c10f9eSGabriel Fernandez 	}
1692*28c10f9eSGabriel Fernandez 
1693*28c10f9eSGabriel Fernandez 	return 0;
1694*28c10f9eSGabriel Fernandez }
1695*28c10f9eSGabriel Fernandez 
1696*28c10f9eSGabriel Fernandez static int stm32_clk_configure_div(struct clk_stm32_priv *priv __unused,
1697*28c10f9eSGabriel Fernandez 				   uint32_t data)
1698*28c10f9eSGabriel Fernandez {
1699*28c10f9eSGabriel Fernandez 	uint32_t div_id = 0;
1700*28c10f9eSGabriel Fernandez 	uint32_t div_n = 0;
1701*28c10f9eSGabriel Fernandez 
1702*28c10f9eSGabriel Fernandez 	div_id = (data & DIV_ID_MASK) >> DIV_ID_SHIFT;
1703*28c10f9eSGabriel Fernandez 	div_n = (data & DIV_DIVN_MASK) >> DIV_DIVN_SHIFT;
1704*28c10f9eSGabriel Fernandez 
1705*28c10f9eSGabriel Fernandez 	return stm32_div_set_value(div_id, div_n);
1706*28c10f9eSGabriel Fernandez }
1707*28c10f9eSGabriel Fernandez 
1708*28c10f9eSGabriel Fernandez static int stm32_clk_configure_mux(struct clk_stm32_priv *priv __unused,
1709*28c10f9eSGabriel Fernandez 				   uint32_t data)
1710*28c10f9eSGabriel Fernandez {
1711*28c10f9eSGabriel Fernandez 	int mux = (data & MUX_ID_MASK) >> MUX_ID_SHIFT;
1712*28c10f9eSGabriel Fernandez 	int sel = (data & MUX_SEL_MASK) >> MUX_SEL_SHIFT;
1713*28c10f9eSGabriel Fernandez 
1714*28c10f9eSGabriel Fernandez 	return stm32_mux_set_parent(mux, sel);
1715*28c10f9eSGabriel Fernandez }
1716*28c10f9eSGabriel Fernandez 
1717*28c10f9eSGabriel Fernandez static int stm32_clk_configure_by_addr_val(struct clk_stm32_priv *priv,
1718*28c10f9eSGabriel Fernandez 					   uint32_t data)
1719*28c10f9eSGabriel Fernandez {
1720*28c10f9eSGabriel Fernandez 	uint32_t addr = data >> CLK_ADDR_SHIFT;
1721*28c10f9eSGabriel Fernandez 	uint32_t val = data & CLK_ADDR_VAL_MASK;
1722*28c10f9eSGabriel Fernandez 
1723*28c10f9eSGabriel Fernandez 	io_setbits32(priv->base + addr, val);
1724*28c10f9eSGabriel Fernandez 
1725*28c10f9eSGabriel Fernandez 	return 0;
1726*28c10f9eSGabriel Fernandez }
1727*28c10f9eSGabriel Fernandez 
1728*28c10f9eSGabriel Fernandez static void stm32_clk_configure_obs(struct clk_stm32_priv *priv,
1729*28c10f9eSGabriel Fernandez 				    uint32_t data)
1730*28c10f9eSGabriel Fernandez {
1731*28c10f9eSGabriel Fernandez 	uint32_t id = (data & OBS_ID_MASK) >> OBS_ID_SHIFT;
1732*28c10f9eSGabriel Fernandez 	uint32_t status = (data & OBS_STATUS_MASK) >> OBS_STATUS_SHIFT;
1733*28c10f9eSGabriel Fernandez 	uint32_t int_ext = (data & OBS_INTEXT_MASK) >> OBS_INTEXT_SHIFT;
1734*28c10f9eSGabriel Fernandez 	uint32_t div = (data & OBS_DIV_MASK) >> OBS_DIV_SHIFT;
1735*28c10f9eSGabriel Fernandez 	uint32_t inv = (data & OBS_INV_MASK) >> OBS_INV_SHIFT;
1736*28c10f9eSGabriel Fernandez 	uint32_t sel = (data & OBS_SEL_MASK) >> OBS_SEL_SHIFT;
1737*28c10f9eSGabriel Fernandez 	uint32_t reg = 0;
1738*28c10f9eSGabriel Fernandez 	uint32_t val = 0;
1739*28c10f9eSGabriel Fernandez 
1740*28c10f9eSGabriel Fernandez 	if (!id)
1741*28c10f9eSGabriel Fernandez 		reg = RCC_FCALCOBS0CFGR;
1742*28c10f9eSGabriel Fernandez 	else
1743*28c10f9eSGabriel Fernandez 		reg = RCC_FCALCOBS1CFGR;
1744*28c10f9eSGabriel Fernandez 
1745*28c10f9eSGabriel Fernandez 	if (status)
1746*28c10f9eSGabriel Fernandez 		val |= RCC_FCALCOBS0CFGR_CKOBSEN;
1747*28c10f9eSGabriel Fernandez 
1748*28c10f9eSGabriel Fernandez 	if (int_ext == OBS_EXT) {
1749*28c10f9eSGabriel Fernandez 		val |= RCC_FCALCOBS0CFGR_CKOBSEXTSEL;
1750*28c10f9eSGabriel Fernandez 		val |= SHIFT_U32(sel, RCC_FCALCOBS0CFGR_CKEXTSEL_SHIFT);
1751*28c10f9eSGabriel Fernandez 	} else {
1752*28c10f9eSGabriel Fernandez 		val |= SHIFT_U32(sel, RCC_FCALCOBS0CFGR_CKINTSEL_SHIFT);
1753*28c10f9eSGabriel Fernandez 	}
1754*28c10f9eSGabriel Fernandez 
1755*28c10f9eSGabriel Fernandez 	if (inv)
1756*28c10f9eSGabriel Fernandez 		val |= RCC_FCALCOBS0CFGR_CKOBSINV;
1757*28c10f9eSGabriel Fernandez 
1758*28c10f9eSGabriel Fernandez 	val |= SHIFT_U32(div, RCC_FCALCOBS0CFGR_CKOBSDIV_SHIFT);
1759*28c10f9eSGabriel Fernandez 
1760*28c10f9eSGabriel Fernandez 	io_write32(priv->base + reg, val);
1761*28c10f9eSGabriel Fernandez }
1762*28c10f9eSGabriel Fernandez 
1763*28c10f9eSGabriel Fernandez static int stm32_clk_configure(struct clk_stm32_priv *priv, uint32_t val)
1764*28c10f9eSGabriel Fernandez {
1765*28c10f9eSGabriel Fernandez 	uint32_t cmd_data = 0;
1766*28c10f9eSGabriel Fernandez 	uint32_t cmd = 0;
1767*28c10f9eSGabriel Fernandez 	int ret = 0;
1768*28c10f9eSGabriel Fernandez 
1769*28c10f9eSGabriel Fernandez 	if (val & CMD_ADDR_BIT) {
1770*28c10f9eSGabriel Fernandez 		cmd_data = val & ~CMD_ADDR_BIT;
1771*28c10f9eSGabriel Fernandez 
1772*28c10f9eSGabriel Fernandez 		return stm32_clk_configure_by_addr_val(priv, cmd_data);
1773*28c10f9eSGabriel Fernandez 	}
1774*28c10f9eSGabriel Fernandez 
1775*28c10f9eSGabriel Fernandez 	cmd = (val & CMD_MASK) >> CMD_SHIFT;
1776*28c10f9eSGabriel Fernandez 	cmd_data = val & ~CMD_MASK;
1777*28c10f9eSGabriel Fernandez 
1778*28c10f9eSGabriel Fernandez 	switch (cmd) {
1779*28c10f9eSGabriel Fernandez 	case CMD_DIV:
1780*28c10f9eSGabriel Fernandez 		ret = stm32_clk_configure_div(priv, cmd_data);
1781*28c10f9eSGabriel Fernandez 		break;
1782*28c10f9eSGabriel Fernandez 
1783*28c10f9eSGabriel Fernandez 	case CMD_MUX:
1784*28c10f9eSGabriel Fernandez 		ret = stm32_clk_configure_mux(priv, cmd_data);
1785*28c10f9eSGabriel Fernandez 		break;
1786*28c10f9eSGabriel Fernandez 
1787*28c10f9eSGabriel Fernandez 	case CMD_OBS:
1788*28c10f9eSGabriel Fernandez 		stm32_clk_configure_obs(priv, cmd_data);
1789*28c10f9eSGabriel Fernandez 		break;
1790*28c10f9eSGabriel Fernandez 
1791*28c10f9eSGabriel Fernandez 	default:
1792*28c10f9eSGabriel Fernandez 		EMSG("cmd unknown ! : %#"PRIx32, val);
1793*28c10f9eSGabriel Fernandez 		ret = -1;
1794*28c10f9eSGabriel Fernandez 	}
1795*28c10f9eSGabriel Fernandez 
1796*28c10f9eSGabriel Fernandez 	return ret;
1797*28c10f9eSGabriel Fernandez }
1798*28c10f9eSGabriel Fernandez 
1799*28c10f9eSGabriel Fernandez static int stm32_clk_bus_configure(struct clk_stm32_priv *priv)
1800*28c10f9eSGabriel Fernandez {
1801*28c10f9eSGabriel Fernandez 	struct stm32_clk_platdata *pdata = priv->pdata;
1802*28c10f9eSGabriel Fernandez 	uint32_t i = 0;
1803*28c10f9eSGabriel Fernandez 
1804*28c10f9eSGabriel Fernandez 	for (i = 0; i < pdata->nbusclk; i++) {
1805*28c10f9eSGabriel Fernandez 		int ret = 0;
1806*28c10f9eSGabriel Fernandez 
1807*28c10f9eSGabriel Fernandez 		ret = stm32_clk_configure(priv, pdata->busclk[i]);
1808*28c10f9eSGabriel Fernandez 		if (ret != 0)
1809*28c10f9eSGabriel Fernandez 			return ret;
1810*28c10f9eSGabriel Fernandez 	}
1811*28c10f9eSGabriel Fernandez 
1812*28c10f9eSGabriel Fernandez 	return 0;
1813*28c10f9eSGabriel Fernandez }
1814*28c10f9eSGabriel Fernandez 
1815*28c10f9eSGabriel Fernandez static int stm32_clk_kernel_configure(struct clk_stm32_priv *priv)
1816*28c10f9eSGabriel Fernandez {
1817*28c10f9eSGabriel Fernandez 	struct stm32_clk_platdata *pdata = priv->pdata;
1818*28c10f9eSGabriel Fernandez 	uint32_t i = 0;
1819*28c10f9eSGabriel Fernandez 
1820*28c10f9eSGabriel Fernandez 	for (i = 0; i < pdata->nkernelclk; i++) {
1821*28c10f9eSGabriel Fernandez 		int ret = 0;
1822*28c10f9eSGabriel Fernandez 
1823*28c10f9eSGabriel Fernandez 		ret = stm32_clk_configure(priv, pdata->kernelclk[i]);
1824*28c10f9eSGabriel Fernandez 		if (ret != 0)
1825*28c10f9eSGabriel Fernandez 			return ret;
1826*28c10f9eSGabriel Fernandez 	}
1827*28c10f9eSGabriel Fernandez 
1828*28c10f9eSGabriel Fernandez 	return 0;
1829*28c10f9eSGabriel Fernandez }
1830*28c10f9eSGabriel Fernandez 
1831*28c10f9eSGabriel Fernandez static void stm32mp2_init_clock_tree(struct clk_stm32_priv *priv,
1832*28c10f9eSGabriel Fernandez 				     struct stm32_clk_platdata *pdata)
1833*28c10f9eSGabriel Fernandez {
1834*28c10f9eSGabriel Fernandez 	stm32_clk_oscillators_enable(priv, pdata);
1835*28c10f9eSGabriel Fernandez 
1836*28c10f9eSGabriel Fernandez 	/* Come back to HSI for flexgen */
1837*28c10f9eSGabriel Fernandez 	stm32mp2_clk_xbar_on_hsi(priv);
1838*28c10f9eSGabriel Fernandez 
1839*28c10f9eSGabriel Fernandez 	if (stm32_clk_pll_configure(priv))
1840*28c10f9eSGabriel Fernandez 		panic("Cannot configure plls");
1841*28c10f9eSGabriel Fernandez 
1842*28c10f9eSGabriel Fernandez 	/* Wait LSE ready before to use it */
1843*28c10f9eSGabriel Fernandez 	if (stm32_clk_oscillators_wait_lse_ready(priv, pdata))
1844*28c10f9eSGabriel Fernandez 		panic("Timeout: to enable LSE");
1845*28c10f9eSGabriel Fernandez 
1846*28c10f9eSGabriel Fernandez 	if (stm32mp2_clk_flexgen_configure(priv))
1847*28c10f9eSGabriel Fernandez 		panic("Cannot configure flexgen");
1848*28c10f9eSGabriel Fernandez 
1849*28c10f9eSGabriel Fernandez 	if (stm32_clk_bus_configure(priv))
1850*28c10f9eSGabriel Fernandez 		panic("Cannot config bus clocks");
1851*28c10f9eSGabriel Fernandez 
1852*28c10f9eSGabriel Fernandez 	if (stm32_clk_kernel_configure(priv))
1853*28c10f9eSGabriel Fernandez 		panic("Cannot configure kernel clocks");
1854*28c10f9eSGabriel Fernandez 
1855*28c10f9eSGabriel Fernandez 	/* Configure LSE css after RTC source configuration */
1856*28c10f9eSGabriel Fernandez 	stm32_clk_oscillators_lse_set_css(priv, pdata);
1857*28c10f9eSGabriel Fernandez }
1858*28c10f9eSGabriel Fernandez 
1859*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_osc_enable(struct clk *clk)
1860*28c10f9eSGabriel Fernandez {
1861*28c10f9eSGabriel Fernandez 	return clk_stm32_gate_ready_ops.enable(clk);
1862*28c10f9eSGabriel Fernandez }
1863*28c10f9eSGabriel Fernandez 
1864*28c10f9eSGabriel Fernandez static void clk_stm32_osc_disable(struct clk *clk)
1865*28c10f9eSGabriel Fernandez {
1866*28c10f9eSGabriel Fernandez 	clk_stm32_gate_ready_ops.disable(clk);
1867*28c10f9eSGabriel Fernandez }
1868*28c10f9eSGabriel Fernandez 
1869*28c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_osc_ops = {
1870*28c10f9eSGabriel Fernandez 	.enable = clk_stm32_osc_enable,
1871*28c10f9eSGabriel Fernandez 	.disable = clk_stm32_osc_disable,
1872*28c10f9eSGabriel Fernandez };
1873*28c10f9eSGabriel Fernandez 
1874*28c10f9eSGabriel Fernandez static unsigned long clk_stm32_msi_get_rate(struct clk *clk __unused,
1875*28c10f9eSGabriel Fernandez 					    unsigned long prate __unused)
1876*28c10f9eSGabriel Fernandez {
1877*28c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
1878*28c10f9eSGabriel Fernandez 	uintptr_t address = priv->base + RCC_BDCR;
1879*28c10f9eSGabriel Fernandez 
1880*28c10f9eSGabriel Fernandez 	if ((io_read32(address) & RCC_BDCR_MSIFREQSEL))
1881*28c10f9eSGabriel Fernandez 		return RCC_16_MHZ;
1882*28c10f9eSGabriel Fernandez 
1883*28c10f9eSGabriel Fernandez 	return RCC_4_MHZ;
1884*28c10f9eSGabriel Fernandez }
1885*28c10f9eSGabriel Fernandez 
1886*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_msi_set_rate(struct clk *clk __unused,
1887*28c10f9eSGabriel Fernandez 					 unsigned long rate,
1888*28c10f9eSGabriel Fernandez 					 unsigned long prate __unused)
1889*28c10f9eSGabriel Fernandez {
1890*28c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
1891*28c10f9eSGabriel Fernandez 
1892*28c10f9eSGabriel Fernandez 	return clk_stm32_osc_msi_set_rate(priv, rate);
1893*28c10f9eSGabriel Fernandez }
1894*28c10f9eSGabriel Fernandez 
1895*28c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_oscillator_msi_ops = {
1896*28c10f9eSGabriel Fernandez 	.enable = clk_stm32_osc_enable,
1897*28c10f9eSGabriel Fernandez 	.disable = clk_stm32_osc_disable,
1898*28c10f9eSGabriel Fernandez 	.get_rate = clk_stm32_msi_get_rate,
1899*28c10f9eSGabriel Fernandez 	.set_rate = clk_stm32_msi_set_rate,
1900*28c10f9eSGabriel Fernandez };
1901*28c10f9eSGabriel Fernandez 
1902*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_hse_div_set_rate(struct clk *clk,
1903*28c10f9eSGabriel Fernandez 					     unsigned long rate,
1904*28c10f9eSGabriel Fernandez 					     unsigned long parent_rate)
1905*28c10f9eSGabriel Fernandez {
1906*28c10f9eSGabriel Fernandez 	return clk_stm32_divider_set_rate(clk, rate, parent_rate);
1907*28c10f9eSGabriel Fernandez }
1908*28c10f9eSGabriel Fernandez 
1909*28c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_hse_div_ops = {
1910*28c10f9eSGabriel Fernandez 	.get_rate = clk_stm32_divider_get_rate,
1911*28c10f9eSGabriel Fernandez 	.set_rate = clk_stm32_hse_div_set_rate,
1912*28c10f9eSGabriel Fernandez };
1913*28c10f9eSGabriel Fernandez 
1914*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_hsediv2_enable(struct clk *clk)
1915*28c10f9eSGabriel Fernandez {
1916*28c10f9eSGabriel Fernandez 	return clk_stm32_gate_ops.enable(clk);
1917*28c10f9eSGabriel Fernandez }
1918*28c10f9eSGabriel Fernandez 
1919*28c10f9eSGabriel Fernandez static void clk_stm32_hsediv2_disable(struct clk *clk)
1920*28c10f9eSGabriel Fernandez {
1921*28c10f9eSGabriel Fernandez 	clk_stm32_gate_ops.disable(clk);
1922*28c10f9eSGabriel Fernandez }
1923*28c10f9eSGabriel Fernandez 
1924*28c10f9eSGabriel Fernandez static unsigned long clk_stm32_hsediv2_get_rate(struct clk *clk __unused,
1925*28c10f9eSGabriel Fernandez 						unsigned long prate)
1926*28c10f9eSGabriel Fernandez {
1927*28c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
1928*28c10f9eSGabriel Fernandez 	uintptr_t addr = priv->base + RCC_OCENSETR;
1929*28c10f9eSGabriel Fernandez 
1930*28c10f9eSGabriel Fernandez 	if (io_read32(addr) & RCC_OCENSETR_HSEDIV2BYP)
1931*28c10f9eSGabriel Fernandez 		return prate;
1932*28c10f9eSGabriel Fernandez 
1933*28c10f9eSGabriel Fernandez 	return prate / 2;
1934*28c10f9eSGabriel Fernandez }
1935*28c10f9eSGabriel Fernandez 
1936*28c10f9eSGabriel Fernandez static const struct clk_ops clk_hsediv2_ops = {
1937*28c10f9eSGabriel Fernandez 	.enable = clk_stm32_hsediv2_enable,
1938*28c10f9eSGabriel Fernandez 	.disable = clk_stm32_hsediv2_disable,
1939*28c10f9eSGabriel Fernandez 	.get_rate = clk_stm32_hsediv2_get_rate,
1940*28c10f9eSGabriel Fernandez };
1941*28c10f9eSGabriel Fernandez 
1942*28c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg {
1943*28c10f9eSGabriel Fernandez 	uint32_t pll_offset;
1944*28c10f9eSGabriel Fernandez 	int gate_id;
1945*28c10f9eSGabriel Fernandez 	int mux_id;
1946*28c10f9eSGabriel Fernandez };
1947*28c10f9eSGabriel Fernandez 
1948*28c10f9eSGabriel Fernandez static unsigned long clk_get_pll1_fvco_rate(unsigned long refclk)
1949*28c10f9eSGabriel Fernandez {
1950*28c10f9eSGabriel Fernandez 	uint32_t reg = stm32mp_syscfg_read(A35SS_SSC_PLL_FREQ1);
1951*28c10f9eSGabriel Fernandez 	uint32_t fbdiv = 0;
1952*28c10f9eSGabriel Fernandez 	uint32_t refdiv = 0;
1953*28c10f9eSGabriel Fernandez 	unsigned long freq = 0;
1954*28c10f9eSGabriel Fernandez 
1955*28c10f9eSGabriel Fernandez 	fbdiv = (reg & A35SS_SSC_PLL_FREQ1_FBDIV_MASK) >>
1956*28c10f9eSGabriel Fernandez 		A35SS_SSC_PLL_FREQ1_FBDIV_SHIFT;
1957*28c10f9eSGabriel Fernandez 
1958*28c10f9eSGabriel Fernandez 	refdiv = (reg & A35SS_SSC_PLL_FREQ1_REFDIV_MASK) >>
1959*28c10f9eSGabriel Fernandez 		 A35SS_SSC_PLL_FREQ1_REFDIV_SHIFT;
1960*28c10f9eSGabriel Fernandez 
1961*28c10f9eSGabriel Fernandez 	if (!refdiv || MUL_OVERFLOW(refclk, fbdiv, &freq))
1962*28c10f9eSGabriel Fernandez 		panic();
1963*28c10f9eSGabriel Fernandez 
1964*28c10f9eSGabriel Fernandez 	return freq / refdiv;
1965*28c10f9eSGabriel Fernandez }
1966*28c10f9eSGabriel Fernandez 
1967*28c10f9eSGabriel Fernandez static unsigned long clk_stm32_pll1_get_rate(struct clk *clk __unused,
1968*28c10f9eSGabriel Fernandez 					     unsigned long prate)
1969*28c10f9eSGabriel Fernandez {
1970*28c10f9eSGabriel Fernandez 	uint32_t reg = stm32mp_syscfg_read(A35SS_SSC_PLL_FREQ2);
1971*28c10f9eSGabriel Fernandez 	unsigned long dfout = 0;
1972*28c10f9eSGabriel Fernandez 	uint32_t postdiv1 = 0;
1973*28c10f9eSGabriel Fernandez 	uint32_t postdiv2 = 0;
1974*28c10f9eSGabriel Fernandez 
1975*28c10f9eSGabriel Fernandez 	postdiv1 = (reg & A35SS_SSC_PLL_FREQ2_POSTDIV1_MASK) >>
1976*28c10f9eSGabriel Fernandez 		   A35SS_SSC_PLL_FREQ2_POSTDIV1_SHIFT;
1977*28c10f9eSGabriel Fernandez 
1978*28c10f9eSGabriel Fernandez 	postdiv2 = (reg & A35SS_SSC_PLL_FREQ2_POSTDIV2_MASK) >>
1979*28c10f9eSGabriel Fernandez 		   A35SS_SSC_PLL_FREQ2_POSTDIV2_SHIFT;
1980*28c10f9eSGabriel Fernandez 
1981*28c10f9eSGabriel Fernandez 	if (postdiv1 == 0 || postdiv2 == 0)
1982*28c10f9eSGabriel Fernandez 		dfout = prate;
1983*28c10f9eSGabriel Fernandez 	else
1984*28c10f9eSGabriel Fernandez 		dfout = clk_get_pll1_fvco_rate(prate) / (postdiv1 * postdiv2);
1985*28c10f9eSGabriel Fernandez 
1986*28c10f9eSGabriel Fernandez 	return dfout;
1987*28c10f9eSGabriel Fernandez }
1988*28c10f9eSGabriel Fernandez 
1989*28c10f9eSGabriel Fernandez static struct stm32_clk_opp_cfg *
1990*28c10f9eSGabriel Fernandez clk_stm32_get_opp_config(struct stm32_clk_opp_cfg *opp_cfg, unsigned long rate)
1991*28c10f9eSGabriel Fernandez {
1992*28c10f9eSGabriel Fernandez 	unsigned int i = 0;
1993*28c10f9eSGabriel Fernandez 
1994*28c10f9eSGabriel Fernandez 	for (i = 0; i < MAX_OPP && opp_cfg->frq; i++, opp_cfg++)
1995*28c10f9eSGabriel Fernandez 		if (opp_cfg->frq == rate)
1996*28c10f9eSGabriel Fernandez 			return opp_cfg;
1997*28c10f9eSGabriel Fernandez 
1998*28c10f9eSGabriel Fernandez 	return NULL;
1999*28c10f9eSGabriel Fernandez }
2000*28c10f9eSGabriel Fernandez 
2001*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll1_set_rate(struct clk *clk __unused,
2002*28c10f9eSGabriel Fernandez 					  unsigned long rate,
2003*28c10f9eSGabriel Fernandez 					  unsigned long parent_rate __unused)
2004*28c10f9eSGabriel Fernandez {
2005*28c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
2006*28c10f9eSGabriel Fernandez 	struct stm32_clk_platdata *pdata = priv->pdata;
2007*28c10f9eSGabriel Fernandez 	struct stm32_pll_dt_cfg *pll_conf = NULL;
2008*28c10f9eSGabriel Fernandez 	struct stm32_clk_opp_cfg *opp = NULL;
2009*28c10f9eSGabriel Fernandez 
2010*28c10f9eSGabriel Fernandez 	opp = clk_stm32_get_opp_config(pdata->opp->cpu1_opp, rate);
2011*28c10f9eSGabriel Fernandez 	if (!opp)
2012*28c10f9eSGabriel Fernandez 		return TEE_ERROR_GENERIC;
2013*28c10f9eSGabriel Fernandez 
2014*28c10f9eSGabriel Fernandez 	pll_conf = &opp->pll_cfg;
2015*28c10f9eSGabriel Fernandez 
2016*28c10f9eSGabriel Fernandez 	clk_stm32_pll1_init(priv, PLL1_ID, pll_conf);
2017*28c10f9eSGabriel Fernandez 
2018*28c10f9eSGabriel Fernandez 	return TEE_SUCCESS;
2019*28c10f9eSGabriel Fernandez }
2020*28c10f9eSGabriel Fernandez 
2021*28c10f9eSGabriel Fernandez static size_t clk_stm32_pll_get_parent(struct clk *clk)
2022*28c10f9eSGabriel Fernandez {
2023*28c10f9eSGabriel Fernandez 	struct clk_stm32_pll_cfg *cfg = clk->priv;
2024*28c10f9eSGabriel Fernandez 
2025*28c10f9eSGabriel Fernandez 	return stm32_mux_get_parent(cfg->mux_id);
2026*28c10f9eSGabriel Fernandez }
2027*28c10f9eSGabriel Fernandez 
2028*28c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll1_ops = {
2029*28c10f9eSGabriel Fernandez 	.get_parent = clk_stm32_pll_get_parent,
2030*28c10f9eSGabriel Fernandez 	.get_rate = clk_stm32_pll1_get_rate,
2031*28c10f9eSGabriel Fernandez 	.set_rate = clk_stm32_pll1_set_rate,
2032*28c10f9eSGabriel Fernandez };
2033*28c10f9eSGabriel Fernandez 
2034*28c10f9eSGabriel Fernandez static unsigned long clk_get_pll_fvco(uint32_t offset_base,
2035*28c10f9eSGabriel Fernandez 				      unsigned long prate)
2036*28c10f9eSGabriel Fernandez {
2037*28c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
2038*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr1 = priv->base + offset_base;
2039*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr2 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR2;
2040*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3;
2041*28c10f9eSGabriel Fernandez 	unsigned long fvco = 0;
2042*28c10f9eSGabriel Fernandez 	uint32_t fracin = 0;
2043*28c10f9eSGabriel Fernandez 	uint32_t fbdiv = 0;
2044*28c10f9eSGabriel Fernandez 	uint32_t refdiv = 0;
2045*28c10f9eSGabriel Fernandez 
2046*28c10f9eSGabriel Fernandez 	fracin = io_read32(pllxcfgr3) & RCC_PLLxCFGR3_FRACIN_MASK;
2047*28c10f9eSGabriel Fernandez 	fbdiv = (io_read32(pllxcfgr2) & RCC_PLLxCFGR2_FBDIV_MASK) >>
2048*28c10f9eSGabriel Fernandez 		RCC_PLLxCFGR2_FBDIV_SHIFT;
2049*28c10f9eSGabriel Fernandez 
2050*28c10f9eSGabriel Fernandez 	refdiv = io_read32(pllxcfgr2) & RCC_PLLxCFGR2_FREFDIV_MASK;
2051*28c10f9eSGabriel Fernandez 
2052*28c10f9eSGabriel Fernandez 	assert(refdiv);
2053*28c10f9eSGabriel Fernandez 
2054*28c10f9eSGabriel Fernandez 	if (fracin) {
2055*28c10f9eSGabriel Fernandez 		unsigned long long numerator = 0;
2056*28c10f9eSGabriel Fernandez 		unsigned long long denominator = 0;
2057*28c10f9eSGabriel Fernandez 
2058*28c10f9eSGabriel Fernandez 		numerator = SHIFT_U64(fbdiv, 24) + fracin;
2059*28c10f9eSGabriel Fernandez 		numerator = prate * numerator;
2060*28c10f9eSGabriel Fernandez 		denominator = SHIFT_U64(refdiv, 24);
2061*28c10f9eSGabriel Fernandez 		fvco = (unsigned long)(numerator / denominator);
2062*28c10f9eSGabriel Fernandez 	} else {
2063*28c10f9eSGabriel Fernandez 		fvco = (unsigned long)(prate * fbdiv / refdiv);
2064*28c10f9eSGabriel Fernandez 	}
2065*28c10f9eSGabriel Fernandez 
2066*28c10f9eSGabriel Fernandez 	return fvco;
2067*28c10f9eSGabriel Fernandez }
2068*28c10f9eSGabriel Fernandez 
2069*28c10f9eSGabriel Fernandez static unsigned long clk_stm32_pll_get_rate(struct clk *clk __unused,
2070*28c10f9eSGabriel Fernandez 					    unsigned long prate)
2071*28c10f9eSGabriel Fernandez {
2072*28c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
2073*28c10f9eSGabriel Fernandez 	struct clk_stm32_pll_cfg *cfg = clk->priv;
2074*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr1 = priv->base + cfg->pll_offset;
2075*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4;
2076*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr6 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR6;
2077*28c10f9eSGabriel Fernandez 	uintptr_t pllxcfgr7 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR7;
2078*28c10f9eSGabriel Fernandez 	unsigned long dfout = 0;
2079*28c10f9eSGabriel Fernandez 	uint32_t postdiv1 = 0;
2080*28c10f9eSGabriel Fernandez 	uint32_t postdiv2 = 0;
2081*28c10f9eSGabriel Fernandez 
2082*28c10f9eSGabriel Fernandez 	postdiv1 = io_read32(pllxcfgr6) & RCC_PLLxCFGR6_POSTDIV1_MASK;
2083*28c10f9eSGabriel Fernandez 	postdiv2 = io_read32(pllxcfgr7) & RCC_PLLxCFGR7_POSTDIV2_MASK;
2084*28c10f9eSGabriel Fernandez 
2085*28c10f9eSGabriel Fernandez 	if ((io_read32(pllxcfgr4) & RCC_PLLxCFGR4_BYPASS) ||
2086*28c10f9eSGabriel Fernandez 	    !postdiv1 || !postdiv2)
2087*28c10f9eSGabriel Fernandez 		dfout = prate;
2088*28c10f9eSGabriel Fernandez 	else
2089*28c10f9eSGabriel Fernandez 		dfout = clk_get_pll_fvco(cfg->pll_offset,
2090*28c10f9eSGabriel Fernandez 					 prate) / (postdiv1 * postdiv2);
2091*28c10f9eSGabriel Fernandez 
2092*28c10f9eSGabriel Fernandez 	return dfout;
2093*28c10f9eSGabriel Fernandez }
2094*28c10f9eSGabriel Fernandez 
2095*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll_enable(struct clk *clk)
2096*28c10f9eSGabriel Fernandez {
2097*28c10f9eSGabriel Fernandez 	struct clk_stm32_pll_cfg *cfg = clk->priv;
2098*28c10f9eSGabriel Fernandez 
2099*28c10f9eSGabriel Fernandez 	if (stm32_gate_rdy_enable(cfg->gate_id)) {
2100*28c10f9eSGabriel Fernandez 		EMSG("%s timeout", clk_get_name(clk));
2101*28c10f9eSGabriel Fernandez 		return TEE_ERROR_TIMEOUT;
2102*28c10f9eSGabriel Fernandez 	}
2103*28c10f9eSGabriel Fernandez 
2104*28c10f9eSGabriel Fernandez 	return TEE_SUCCESS;
2105*28c10f9eSGabriel Fernandez }
2106*28c10f9eSGabriel Fernandez 
2107*28c10f9eSGabriel Fernandez static void clk_stm32_pll_disable(struct clk *clk)
2108*28c10f9eSGabriel Fernandez {
2109*28c10f9eSGabriel Fernandez 	struct clk_stm32_pll_cfg *cfg = clk->priv;
2110*28c10f9eSGabriel Fernandez 
2111*28c10f9eSGabriel Fernandez 	if (stm32_gate_rdy_disable(cfg->gate_id)) {
2112*28c10f9eSGabriel Fernandez 		EMSG("%s timeout", clk_get_name(clk));
2113*28c10f9eSGabriel Fernandez 		panic();
2114*28c10f9eSGabriel Fernandez 	}
2115*28c10f9eSGabriel Fernandez }
2116*28c10f9eSGabriel Fernandez 
2117*28c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll_ops = {
2118*28c10f9eSGabriel Fernandez 	.get_parent = clk_stm32_pll_get_parent,
2119*28c10f9eSGabriel Fernandez 	.get_rate = clk_stm32_pll_get_rate,
2120*28c10f9eSGabriel Fernandez 	.enable = clk_stm32_pll_enable,
2121*28c10f9eSGabriel Fernandez 	.disable = clk_stm32_pll_disable,
2122*28c10f9eSGabriel Fernandez };
2123*28c10f9eSGabriel Fernandez 
2124*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll3_enable(struct clk *clk)
2125*28c10f9eSGabriel Fernandez {
2126*28c10f9eSGabriel Fernandez 	struct clk_stm32_pll_cfg *cfg = clk->priv;
2127*28c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = clk_stm32_get_priv();
2128*28c10f9eSGabriel Fernandez 	struct stm32_pll_dt_cfg *pll_conf = clk_stm32_pll_get_pdata(PLL3_ID);
2129*28c10f9eSGabriel Fernandez 	struct clk *parent = NULL;
2130*28c10f9eSGabriel Fernandez 	size_t pidx = 0;
2131*28c10f9eSGabriel Fernandez 
2132*28c10f9eSGabriel Fernandez 	/* ck_icn_p_gpu activate */
2133*28c10f9eSGabriel Fernandez 	stm32_gate_enable(GATE_GPU);
2134*28c10f9eSGabriel Fernandez 
2135*28c10f9eSGabriel Fernandez 	clk_stm32_pll_init(priv, PLL3_ID, pll_conf);
2136*28c10f9eSGabriel Fernandez 
2137*28c10f9eSGabriel Fernandez 	if (stm32_gate_rdy_enable(cfg->gate_id)) {
2138*28c10f9eSGabriel Fernandez 		EMSG("%s timeout", clk_get_name(clk));
2139*28c10f9eSGabriel Fernandez 		return TEE_ERROR_TIMEOUT;
2140*28c10f9eSGabriel Fernandez 	}
2141*28c10f9eSGabriel Fernandez 
2142*28c10f9eSGabriel Fernandez 	/* Update parent */
2143*28c10f9eSGabriel Fernandez 	pidx = clk_stm32_pll_get_parent(clk);
2144*28c10f9eSGabriel Fernandez 	parent = clk_get_parent_by_index(clk, pidx);
2145*28c10f9eSGabriel Fernandez 
2146*28c10f9eSGabriel Fernandez 	clk->parent = parent;
2147*28c10f9eSGabriel Fernandez 
2148*28c10f9eSGabriel Fernandez 	return TEE_SUCCESS;
2149*28c10f9eSGabriel Fernandez }
2150*28c10f9eSGabriel Fernandez 
2151*28c10f9eSGabriel Fernandez static void clk_stm32_pll3_disable(struct clk *clk)
2152*28c10f9eSGabriel Fernandez {
2153*28c10f9eSGabriel Fernandez 	clk_stm32_pll_disable(clk);
2154*28c10f9eSGabriel Fernandez 	stm32_gate_disable(GATE_GPU);
2155*28c10f9eSGabriel Fernandez }
2156*28c10f9eSGabriel Fernandez 
2157*28c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll3_ops = {
2158*28c10f9eSGabriel Fernandez 	.get_parent = clk_stm32_pll_get_parent,
2159*28c10f9eSGabriel Fernandez 	.get_rate = clk_stm32_pll_get_rate,
2160*28c10f9eSGabriel Fernandez 	.enable = clk_stm32_pll3_enable,
2161*28c10f9eSGabriel Fernandez 	.disable = clk_stm32_pll3_disable,
2162*28c10f9eSGabriel Fernandez };
2163*28c10f9eSGabriel Fernandez 
2164*28c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg {
2165*28c10f9eSGabriel Fernandez 	int flex_id;
2166*28c10f9eSGabriel Fernandez };
2167*28c10f9eSGabriel Fernandez 
2168*28c10f9eSGabriel Fernandez static size_t clk_stm32_flexgen_get_parent(struct clk *clk)
2169*28c10f9eSGabriel Fernandez {
2170*28c10f9eSGabriel Fernandez 	struct clk_stm32_flexgen_cfg *cfg = clk->priv;
2171*28c10f9eSGabriel Fernandez 	uintptr_t rcc_base = clk_stm32_get_rcc_base();
2172*28c10f9eSGabriel Fernandez 	uint32_t address = 0;
2173*28c10f9eSGabriel Fernandez 
2174*28c10f9eSGabriel Fernandez 	address = rcc_base + RCC_XBAR0CFGR + (cfg->flex_id * 4);
2175*28c10f9eSGabriel Fernandez 
2176*28c10f9eSGabriel Fernandez 	return io_read32(address) & RCC_XBAR0CFGR_XBAR0SEL_MASK;
2177*28c10f9eSGabriel Fernandez }
2178*28c10f9eSGabriel Fernandez 
2179*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_set_parent(struct clk *clk, size_t pidx)
2180*28c10f9eSGabriel Fernandez {
2181*28c10f9eSGabriel Fernandez 	uintptr_t rcc_base = clk_stm32_get_rcc_base();
2182*28c10f9eSGabriel Fernandez 	struct clk_stm32_flexgen_cfg *cfg = clk->priv;
2183*28c10f9eSGabriel Fernandez 	uint16_t channel = cfg->flex_id * 4;
2184*28c10f9eSGabriel Fernandez 
2185*28c10f9eSGabriel Fernandez 	io_clrsetbits32(rcc_base + RCC_XBAR0CFGR + (channel),
2186*28c10f9eSGabriel Fernandez 			RCC_XBAR0CFGR_XBAR0SEL_MASK, pidx);
2187*28c10f9eSGabriel Fernandez 
2188*28c10f9eSGabriel Fernandez 	if (wait_xbar_sts(channel))
2189*28c10f9eSGabriel Fernandez 		return TEE_ERROR_GENERIC;
2190*28c10f9eSGabriel Fernandez 
2191*28c10f9eSGabriel Fernandez 	return TEE_SUCCESS;
2192*28c10f9eSGabriel Fernandez }
2193*28c10f9eSGabriel Fernandez 
2194*28c10f9eSGabriel Fernandez static unsigned long clk_stm32_flexgen_get_rate(struct clk *clk __unused,
2195*28c10f9eSGabriel Fernandez 						unsigned long prate)
2196*28c10f9eSGabriel Fernandez {
2197*28c10f9eSGabriel Fernandez 	struct clk_stm32_flexgen_cfg *cfg = clk->priv;
2198*28c10f9eSGabriel Fernandez 	uintptr_t rcc_base = clk_stm32_get_rcc_base();
2199*28c10f9eSGabriel Fernandez 	uint32_t prediv = 0;
2200*28c10f9eSGabriel Fernandez 	uint32_t findiv = 0;
2201*28c10f9eSGabriel Fernandez 	uint8_t channel = cfg->flex_id;
2202*28c10f9eSGabriel Fernandez 	unsigned long freq = prate;
2203*28c10f9eSGabriel Fernandez 
2204*28c10f9eSGabriel Fernandez 	prediv = io_read32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel)) &
2205*28c10f9eSGabriel Fernandez 		RCC_PREDIV0CFGR_PREDIV0_MASK;
2206*28c10f9eSGabriel Fernandez 	findiv = io_read32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel)) &
2207*28c10f9eSGabriel Fernandez 		RCC_FINDIV0CFGR_FINDIV0_MASK;
2208*28c10f9eSGabriel Fernandez 
2209*28c10f9eSGabriel Fernandez 	if (freq == 0)
2210*28c10f9eSGabriel Fernandez 		return 0;
2211*28c10f9eSGabriel Fernandez 
2212*28c10f9eSGabriel Fernandez 	switch (prediv) {
2213*28c10f9eSGabriel Fernandez 	case 0x0:
2214*28c10f9eSGabriel Fernandez 		break;
2215*28c10f9eSGabriel Fernandez 
2216*28c10f9eSGabriel Fernandez 	case 0x1:
2217*28c10f9eSGabriel Fernandez 		freq /= 2;
2218*28c10f9eSGabriel Fernandez 		break;
2219*28c10f9eSGabriel Fernandez 
2220*28c10f9eSGabriel Fernandez 	case 0x3:
2221*28c10f9eSGabriel Fernandez 		freq /= 4;
2222*28c10f9eSGabriel Fernandez 		break;
2223*28c10f9eSGabriel Fernandez 
2224*28c10f9eSGabriel Fernandez 	case 0x3FF:
2225*28c10f9eSGabriel Fernandez 		freq /= 1024;
2226*28c10f9eSGabriel Fernandez 		break;
2227*28c10f9eSGabriel Fernandez 
2228*28c10f9eSGabriel Fernandez 	default:
2229*28c10f9eSGabriel Fernandez 		EMSG("Unsupported PREDIV value (%#"PRIx32")", prediv);
2230*28c10f9eSGabriel Fernandez 		panic();
2231*28c10f9eSGabriel Fernandez 		break;
2232*28c10f9eSGabriel Fernandez 	}
2233*28c10f9eSGabriel Fernandez 
2234*28c10f9eSGabriel Fernandez 	freq /= findiv + 1;
2235*28c10f9eSGabriel Fernandez 
2236*28c10f9eSGabriel Fernandez 	return freq;
2237*28c10f9eSGabriel Fernandez }
2238*28c10f9eSGabriel Fernandez 
2239*28c10f9eSGabriel Fernandez static unsigned long clk_stm32_flexgen_get_round_rate(unsigned long rate,
2240*28c10f9eSGabriel Fernandez 						      unsigned long prate,
2241*28c10f9eSGabriel Fernandez 						      unsigned int *prediv,
2242*28c10f9eSGabriel Fernandez 						      unsigned int *findiv)
2243*28c10f9eSGabriel Fernandez {
2244*28c10f9eSGabriel Fernandez 	unsigned int pre_val[] = { 0x0, 0x1, 0x3, 0x3FF };
2245*28c10f9eSGabriel Fernandez 	unsigned int pre_div[] = { 1, 2, 4, 1024 };
2246*28c10f9eSGabriel Fernandez 	long best_diff = LONG_MAX;
2247*28c10f9eSGabriel Fernandez 	unsigned int i = 0;
2248*28c10f9eSGabriel Fernandez 
2249*28c10f9eSGabriel Fernandez 	*prediv = 0;
2250*28c10f9eSGabriel Fernandez 	*findiv = 0;
2251*28c10f9eSGabriel Fernandez 
2252*28c10f9eSGabriel Fernandez 	for (i = 0; i < ARRAY_SIZE(pre_div); i++) {
2253*28c10f9eSGabriel Fernandez 		unsigned long freq = 0;
2254*28c10f9eSGabriel Fernandez 		unsigned long ratio = 0;
2255*28c10f9eSGabriel Fernandez 		long diff = 0L;
2256*28c10f9eSGabriel Fernandez 
2257*28c10f9eSGabriel Fernandez 		freq = UDIV_ROUND_NEAREST((uint64_t)prate, pre_div[i]);
2258*28c10f9eSGabriel Fernandez 		ratio = UDIV_ROUND_NEAREST((uint64_t)freq, rate);
2259*28c10f9eSGabriel Fernandez 
2260*28c10f9eSGabriel Fernandez 		if (ratio == 0)
2261*28c10f9eSGabriel Fernandez 			ratio = 1;
2262*28c10f9eSGabriel Fernandez 		else if (ratio > 64)
2263*28c10f9eSGabriel Fernandez 			ratio = 64;
2264*28c10f9eSGabriel Fernandez 
2265*28c10f9eSGabriel Fernandez 		freq = UDIV_ROUND_NEAREST((uint64_t)freq, ratio);
2266*28c10f9eSGabriel Fernandez 		if (freq < rate)
2267*28c10f9eSGabriel Fernandez 			diff = rate - freq;
2268*28c10f9eSGabriel Fernandez 		else
2269*28c10f9eSGabriel Fernandez 			diff = freq - rate;
2270*28c10f9eSGabriel Fernandez 
2271*28c10f9eSGabriel Fernandez 		if (diff < best_diff) {
2272*28c10f9eSGabriel Fernandez 			best_diff = diff;
2273*28c10f9eSGabriel Fernandez 			*prediv = pre_val[i];
2274*28c10f9eSGabriel Fernandez 			*findiv = ratio - 1;
2275*28c10f9eSGabriel Fernandez 
2276*28c10f9eSGabriel Fernandez 			if (diff == 0)
2277*28c10f9eSGabriel Fernandez 				break;
2278*28c10f9eSGabriel Fernandez 		}
2279*28c10f9eSGabriel Fernandez 	}
2280*28c10f9eSGabriel Fernandez 
2281*28c10f9eSGabriel Fernandez 	return (prate / (*prediv + 1)) / (*findiv + 1);
2282*28c10f9eSGabriel Fernandez }
2283*28c10f9eSGabriel Fernandez 
2284*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_set_rate(struct clk *clk,
2285*28c10f9eSGabriel Fernandez 					     unsigned long rate,
2286*28c10f9eSGabriel Fernandez 					     unsigned long parent_rate)
2287*28c10f9eSGabriel Fernandez {
2288*28c10f9eSGabriel Fernandez 	struct clk_stm32_flexgen_cfg *cfg = clk->priv;
2289*28c10f9eSGabriel Fernandez 	uint8_t channel = cfg->flex_id;
2290*28c10f9eSGabriel Fernandez 	uintptr_t rcc_base = stm32_rcc_base();
2291*28c10f9eSGabriel Fernandez 	unsigned int prediv = 0;
2292*28c10f9eSGabriel Fernandez 	unsigned int findiv = 0;
2293*28c10f9eSGabriel Fernandez 
2294*28c10f9eSGabriel Fernandez 	clk_stm32_flexgen_get_round_rate(rate, parent_rate, &prediv, &findiv);
2295*28c10f9eSGabriel Fernandez 
2296*28c10f9eSGabriel Fernandez 	if (wait_predivsr(channel) != 0)
2297*28c10f9eSGabriel Fernandez 		panic();
2298*28c10f9eSGabriel Fernandez 
2299*28c10f9eSGabriel Fernandez 	io_clrsetbits32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel),
2300*28c10f9eSGabriel Fernandez 			RCC_PREDIV0CFGR_PREDIV0_MASK,
2301*28c10f9eSGabriel Fernandez 			prediv);
2302*28c10f9eSGabriel Fernandez 
2303*28c10f9eSGabriel Fernandez 	if (wait_predivsr(channel) != 0)
2304*28c10f9eSGabriel Fernandez 		panic();
2305*28c10f9eSGabriel Fernandez 
2306*28c10f9eSGabriel Fernandez 	if (wait_findivsr(channel) != 0)
2307*28c10f9eSGabriel Fernandez 		panic();
2308*28c10f9eSGabriel Fernandez 
2309*28c10f9eSGabriel Fernandez 	io_clrsetbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel),
2310*28c10f9eSGabriel Fernandez 			RCC_FINDIV0CFGR_FINDIV0_MASK,
2311*28c10f9eSGabriel Fernandez 			findiv);
2312*28c10f9eSGabriel Fernandez 
2313*28c10f9eSGabriel Fernandez 	if (wait_findivsr(channel) != 0)
2314*28c10f9eSGabriel Fernandez 		panic();
2315*28c10f9eSGabriel Fernandez 
2316*28c10f9eSGabriel Fernandez 	return TEE_SUCCESS;
2317*28c10f9eSGabriel Fernandez }
2318*28c10f9eSGabriel Fernandez 
2319*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_enable(struct clk *clk)
2320*28c10f9eSGabriel Fernandez {
2321*28c10f9eSGabriel Fernandez 	struct clk_stm32_flexgen_cfg *cfg = clk->priv;
2322*28c10f9eSGabriel Fernandez 	uintptr_t rcc_base = clk_stm32_get_rcc_base();
2323*28c10f9eSGabriel Fernandez 	uint8_t channel = cfg->flex_id;
2324*28c10f9eSGabriel Fernandez 
2325*28c10f9eSGabriel Fernandez 	io_setbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel),
2326*28c10f9eSGabriel Fernandez 		     RCC_FINDIV0CFGR_FINDIV0EN);
2327*28c10f9eSGabriel Fernandez 
2328*28c10f9eSGabriel Fernandez 	return TEE_SUCCESS;
2329*28c10f9eSGabriel Fernandez }
2330*28c10f9eSGabriel Fernandez 
2331*28c10f9eSGabriel Fernandez static void clk_stm32_flexgen_disable(struct clk *clk)
2332*28c10f9eSGabriel Fernandez {
2333*28c10f9eSGabriel Fernandez 	struct clk_stm32_flexgen_cfg *cfg = clk->priv;
2334*28c10f9eSGabriel Fernandez 	uintptr_t rcc_base = clk_stm32_get_rcc_base();
2335*28c10f9eSGabriel Fernandez 	uint8_t channel = cfg->flex_id;
2336*28c10f9eSGabriel Fernandez 
2337*28c10f9eSGabriel Fernandez 	io_clrbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel),
2338*28c10f9eSGabriel Fernandez 		     RCC_FINDIV0CFGR_FINDIV0EN);
2339*28c10f9eSGabriel Fernandez }
2340*28c10f9eSGabriel Fernandez 
2341*28c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_flexgen_ops = {
2342*28c10f9eSGabriel Fernandez 	.get_rate = clk_stm32_flexgen_get_rate,
2343*28c10f9eSGabriel Fernandez 	.set_rate = clk_stm32_flexgen_set_rate,
2344*28c10f9eSGabriel Fernandez 	.get_parent = clk_stm32_flexgen_get_parent,
2345*28c10f9eSGabriel Fernandez 	.set_parent = clk_stm32_flexgen_set_parent,
2346*28c10f9eSGabriel Fernandez 	.enable = clk_stm32_flexgen_enable,
2347*28c10f9eSGabriel Fernandez 	.disable = clk_stm32_flexgen_disable,
2348*28c10f9eSGabriel Fernandez };
2349*28c10f9eSGabriel Fernandez 
2350*28c10f9eSGabriel Fernandez static size_t clk_cpu1_get_parent(struct clk *clk __unused)
2351*28c10f9eSGabriel Fernandez {
2352*28c10f9eSGabriel Fernandez 	uint32_t reg = stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ);
2353*28c10f9eSGabriel Fernandez 
2354*28c10f9eSGabriel Fernandez 	return (reg & A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) >>
2355*28c10f9eSGabriel Fernandez 		A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_SHIFT;
2356*28c10f9eSGabriel Fernandez }
2357*28c10f9eSGabriel Fernandez 
2358*28c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_cpu1_ops = {
2359*28c10f9eSGabriel Fernandez 	.get_parent = clk_cpu1_get_parent,
2360*28c10f9eSGabriel Fernandez };
2361*28c10f9eSGabriel Fernandez 
2362*28c10f9eSGabriel Fernandez #define APB_DIV_MASK	GENMASK_32(2, 0)
2363*28c10f9eSGabriel Fernandez #define TIM_PRE_MASK	BIT(0)
2364*28c10f9eSGabriel Fernandez 
2365*28c10f9eSGabriel Fernandez static unsigned long ck_timer_get_rate_ops(struct clk *clk, unsigned long prate)
2366*28c10f9eSGabriel Fernandez {
2367*28c10f9eSGabriel Fernandez 	struct clk_stm32_timer_cfg *cfg = clk->priv;
2368*28c10f9eSGabriel Fernandez 	uintptr_t rcc_base = clk_stm32_get_rcc_base();
2369*28c10f9eSGabriel Fernandez 	uint32_t prescaler = 0;
2370*28c10f9eSGabriel Fernandez 	uint32_t timpre = 0;
2371*28c10f9eSGabriel Fernandez 
2372*28c10f9eSGabriel Fernandez 	prescaler = io_read32(rcc_base + cfg->apbdiv) & APB_DIV_MASK;
2373*28c10f9eSGabriel Fernandez 
2374*28c10f9eSGabriel Fernandez 	timpre = io_read32(rcc_base + cfg->timpre) & TIM_PRE_MASK;
2375*28c10f9eSGabriel Fernandez 
2376*28c10f9eSGabriel Fernandez 	if (prescaler == 0)
2377*28c10f9eSGabriel Fernandez 		return prate;
2378*28c10f9eSGabriel Fernandez 
2379*28c10f9eSGabriel Fernandez 	return prate * (timpre + 1) * 2;
2380*28c10f9eSGabriel Fernandez };
2381*28c10f9eSGabriel Fernandez 
2382*28c10f9eSGabriel Fernandez static const struct clk_ops ck_timer_ops = {
2383*28c10f9eSGabriel Fernandez 	.get_rate = ck_timer_get_rate_ops,
2384*28c10f9eSGabriel Fernandez };
2385*28c10f9eSGabriel Fernandez 
2386*28c10f9eSGabriel Fernandez #define PLL_PARENTS	{ &ck_hsi, &ck_hse, &ck_msi }
2387*28c10f9eSGabriel Fernandez #define PLL_NUM_PATENTS	3
2388*28c10f9eSGabriel Fernandez 
2389*28c10f9eSGabriel Fernandez #define STM32_OSC(_name, _flags, _gate_id)\
2390*28c10f9eSGabriel Fernandez 	struct clk _name = {\
2391*28c10f9eSGabriel Fernandez 		.ops = &clk_stm32_osc_ops,\
2392*28c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_gate_cfg){\
2393*28c10f9eSGabriel Fernandez 			.gate_id = (_gate_id),\
2394*28c10f9eSGabriel Fernandez 		},\
2395*28c10f9eSGabriel Fernandez 		.name = #_name,\
2396*28c10f9eSGabriel Fernandez 		.flags = (_flags),\
2397*28c10f9eSGabriel Fernandez 		.num_parents = 1,\
2398*28c10f9eSGabriel Fernandez 		.parents = { NULL },\
2399*28c10f9eSGabriel Fernandez 	}
2400*28c10f9eSGabriel Fernandez 
2401*28c10f9eSGabriel Fernandez #define STM32_OSC_MSI(_name, _flags, _gate_id)\
2402*28c10f9eSGabriel Fernandez 	struct clk _name = {\
2403*28c10f9eSGabriel Fernandez 		.ops = &clk_stm32_oscillator_msi_ops,\
2404*28c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_gate_cfg){\
2405*28c10f9eSGabriel Fernandez 			.gate_id = (_gate_id),\
2406*28c10f9eSGabriel Fernandez 		},\
2407*28c10f9eSGabriel Fernandez 		.name = #_name,\
2408*28c10f9eSGabriel Fernandez 		.flags = (_flags),\
2409*28c10f9eSGabriel Fernandez 		.num_parents = 1,\
2410*28c10f9eSGabriel Fernandez 		.parents = { NULL },\
2411*28c10f9eSGabriel Fernandez 	}
2412*28c10f9eSGabriel Fernandez 
2413*28c10f9eSGabriel Fernandez #define STM32_HSE_DIV2(_name, _parent, _flags, _gate_id)\
2414*28c10f9eSGabriel Fernandez 	struct clk _name = {\
2415*28c10f9eSGabriel Fernandez 		.ops = &clk_hsediv2_ops,\
2416*28c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_gate_cfg){\
2417*28c10f9eSGabriel Fernandez 			.gate_id = (_gate_id),\
2418*28c10f9eSGabriel Fernandez 		},\
2419*28c10f9eSGabriel Fernandez 		.name = #_name,\
2420*28c10f9eSGabriel Fernandez 		.flags = (_flags),\
2421*28c10f9eSGabriel Fernandez 		.num_parents = 1,\
2422*28c10f9eSGabriel Fernandez 		.parents = { (_parent) },\
2423*28c10f9eSGabriel Fernandez 	}
2424*28c10f9eSGabriel Fernandez 
2425*28c10f9eSGabriel Fernandez #define STM32_HSE_RTC(_name, _parent, _flags, _div_id)\
2426*28c10f9eSGabriel Fernandez 	struct clk _name = {\
2427*28c10f9eSGabriel Fernandez 		.ops = &clk_stm32_hse_div_ops,\
2428*28c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_div_cfg){\
2429*28c10f9eSGabriel Fernandez 			.div_id = (_div_id),\
2430*28c10f9eSGabriel Fernandez 		},\
2431*28c10f9eSGabriel Fernandez 		.name = #_name,\
2432*28c10f9eSGabriel Fernandez 		.flags = (_flags),\
2433*28c10f9eSGabriel Fernandez 		.num_parents = 1,\
2434*28c10f9eSGabriel Fernandez 		.parents = { (_parent) },\
2435*28c10f9eSGabriel Fernandez 	}
2436*28c10f9eSGabriel Fernandez 
2437*28c10f9eSGabriel Fernandez #define STM32_PLL1(_name, _flags, _mux_id)\
2438*28c10f9eSGabriel Fernandez 	struct clk _name = {\
2439*28c10f9eSGabriel Fernandez 		.ops = &clk_stm32_pll1_ops,\
2440*28c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_pll_cfg){\
2441*28c10f9eSGabriel Fernandez 			.mux_id = (_mux_id),\
2442*28c10f9eSGabriel Fernandez 		},\
2443*28c10f9eSGabriel Fernandez 		.name = #_name,\
2444*28c10f9eSGabriel Fernandez 		.flags = (_flags),\
2445*28c10f9eSGabriel Fernandez 		.num_parents = PLL_NUM_PATENTS,\
2446*28c10f9eSGabriel Fernandez 		.parents = PLL_PARENTS,\
2447*28c10f9eSGabriel Fernandez 	}
2448*28c10f9eSGabriel Fernandez 
2449*28c10f9eSGabriel Fernandez #define STM32_PLL2(_name, _flags, _reg, _gate_id, _mux_id)\
2450*28c10f9eSGabriel Fernandez 	struct clk _name = {\
2451*28c10f9eSGabriel Fernandez 		.ops = &clk_stm32_pll_ops,\
2452*28c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_pll_cfg){\
2453*28c10f9eSGabriel Fernandez 			.pll_offset = (_reg),\
2454*28c10f9eSGabriel Fernandez 			.gate_id = (_gate_id),\
2455*28c10f9eSGabriel Fernandez 			.mux_id = (_mux_id),\
2456*28c10f9eSGabriel Fernandez 		},\
2457*28c10f9eSGabriel Fernandez 		.name = #_name,\
2458*28c10f9eSGabriel Fernandez 		.flags = (_flags),\
2459*28c10f9eSGabriel Fernandez 		.num_parents = PLL_NUM_PATENTS,\
2460*28c10f9eSGabriel Fernandez 		.parents = PLL_PARENTS,\
2461*28c10f9eSGabriel Fernandez 	}
2462*28c10f9eSGabriel Fernandez 
2463*28c10f9eSGabriel Fernandez #define STM32_PLL3(_name, _flags, _reg, _gate_id, _mux_id)\
2464*28c10f9eSGabriel Fernandez 	struct clk _name = {\
2465*28c10f9eSGabriel Fernandez 		.ops = &clk_stm32_pll3_ops,\
2466*28c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_pll_cfg){\
2467*28c10f9eSGabriel Fernandez 			.pll_offset = (_reg),\
2468*28c10f9eSGabriel Fernandez 			.gate_id = (_gate_id),\
2469*28c10f9eSGabriel Fernandez 			.mux_id = (_mux_id),\
2470*28c10f9eSGabriel Fernandez 		},\
2471*28c10f9eSGabriel Fernandez 		.name = #_name,\
2472*28c10f9eSGabriel Fernandez 		.flags = (_flags),\
2473*28c10f9eSGabriel Fernandez 		.num_parents = PLL_NUM_PATENTS,\
2474*28c10f9eSGabriel Fernandez 		.parents = PLL_PARENTS,\
2475*28c10f9eSGabriel Fernandez 	}
2476*28c10f9eSGabriel Fernandez 
2477*28c10f9eSGabriel Fernandez #define STM32_PLLS(_name, _flags, _reg, _gate_id, _mux_id)\
2478*28c10f9eSGabriel Fernandez 	struct clk _name = {\
2479*28c10f9eSGabriel Fernandez 		.ops = &clk_stm32_pll_ops,\
2480*28c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_pll_cfg){\
2481*28c10f9eSGabriel Fernandez 			.pll_offset = (_reg),\
2482*28c10f9eSGabriel Fernandez 			.gate_id = (_gate_id),\
2483*28c10f9eSGabriel Fernandez 			.mux_id = (_mux_id),\
2484*28c10f9eSGabriel Fernandez 		},\
2485*28c10f9eSGabriel Fernandez 		.name = #_name,\
2486*28c10f9eSGabriel Fernandez 		.flags = (_flags),\
2487*28c10f9eSGabriel Fernandez 		.num_parents = PLL_NUM_PATENTS,\
2488*28c10f9eSGabriel Fernandez 		.parents = PLL_PARENTS,\
2489*28c10f9eSGabriel Fernandez 	}
2490*28c10f9eSGabriel Fernandez 
2491*28c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_off, RCC_0_MHZ);
2492*28c10f9eSGabriel Fernandez 
2493*28c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_obser0, 0);
2494*28c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_obser1, 0);
2495*28c10f9eSGabriel Fernandez static STM32_FIXED_RATE(spdifsymb, 0);
2496*28c10f9eSGabriel Fernandez static STM32_FIXED_RATE(txbyteclk, 27000000);
2497*28c10f9eSGabriel Fernandez 
2498*28c10f9eSGabriel Fernandez /* Oscillator clocks */
2499*28c10f9eSGabriel Fernandez static STM32_OSC(ck_hsi, 0, GATE_HSI);
2500*28c10f9eSGabriel Fernandez static STM32_OSC(ck_hse, 0, GATE_HSE);
2501*28c10f9eSGabriel Fernandez static STM32_OSC_MSI(ck_msi, 0, GATE_MSI);
2502*28c10f9eSGabriel Fernandez static STM32_OSC(ck_lsi, 0, GATE_LSI);
2503*28c10f9eSGabriel Fernandez static STM32_OSC(ck_lse, 0, GATE_LSE);
2504*28c10f9eSGabriel Fernandez 
2505*28c10f9eSGabriel Fernandez static STM32_HSE_DIV2(ck_hse_div2, &ck_hse, 0, GATE_HSEDIV2);
2506*28c10f9eSGabriel Fernandez static STM32_HSE_RTC(ck_hse_rtc, &ck_hse, 0, DIV_RTC);
2507*28c10f9eSGabriel Fernandez 
2508*28c10f9eSGabriel Fernandez static STM32_FIXED_FACTOR(i2sckin, NULL, 0, 1, 1);
2509*28c10f9eSGabriel Fernandez 
2510*28c10f9eSGabriel Fernandez static STM32_PLL1(ck_pll1, 0, MUX_MUXSEL5);
2511*28c10f9eSGabriel Fernandez static STM32_PLL2(ck_pll2, 0, RCC_PLL2CFGR1, GATE_PLL2, MUX_MUXSEL6);
2512*28c10f9eSGabriel Fernandez static STM32_PLL3(ck_pll3, 0, RCC_PLL3CFGR1, GATE_PLL3, MUX_MUXSEL7);
2513*28c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll4, 0, RCC_PLL4CFGR1, GATE_PLL4, MUX_MUXSEL0);
2514*28c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll5, 0, RCC_PLL5CFGR1, GATE_PLL5, MUX_MUXSEL1);
2515*28c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll6, 0, RCC_PLL6CFGR1, GATE_PLL6, MUX_MUXSEL2);
2516*28c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll7, 0, RCC_PLL7CFGR1, GATE_PLL7, MUX_MUXSEL3);
2517*28c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll8, 0, RCC_PLL8CFGR1, GATE_PLL8, MUX_MUXSEL4);
2518*28c10f9eSGabriel Fernandez 
2519*28c10f9eSGabriel Fernandez #define STM32_FLEXGEN(_name, _flags, _flex_id)\
2520*28c10f9eSGabriel Fernandez 	struct clk _name = {\
2521*28c10f9eSGabriel Fernandez 		.ops = &clk_stm32_flexgen_ops,\
2522*28c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_flexgen_cfg){\
2523*28c10f9eSGabriel Fernandez 			.flex_id = (_flex_id),\
2524*28c10f9eSGabriel Fernandez 		},\
2525*28c10f9eSGabriel Fernandez 		.name = #_name,\
2526*28c10f9eSGabriel Fernandez 		.flags = (_flags) | CLK_SET_RATE_UNGATE,\
2527*28c10f9eSGabriel Fernandez 		.num_parents = 15,\
2528*28c10f9eSGabriel Fernandez 		.parents = {\
2529*28c10f9eSGabriel Fernandez 			&ck_pll4, &ck_pll5, &ck_pll6, &ck_pll7, &ck_pll8,\
2530*28c10f9eSGabriel Fernandez 			&ck_hsi, &ck_hse, &ck_msi, &ck_hsi, &ck_hse, &ck_msi,\
2531*28c10f9eSGabriel Fernandez 			&spdifsymb, &i2sckin, &ck_lsi, &ck_lse\
2532*28c10f9eSGabriel Fernandez 		},\
2533*28c10f9eSGabriel Fernandez 	}
2534*28c10f9eSGabriel Fernandez 
2535*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_hs_mcu, 0, 0);
2536*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_sdmmc, 0, 1);
2537*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_ddr, 0, 2);
2538*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_display, 0, 3);
2539*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_hsl, 0, 4);
2540*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_nic, 0, 5);
2541*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_vid, 0, 6);
2542*28c10f9eSGabriel Fernandez 
2543*28c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_ls_mcu, &ck_icn_hs_mcu, 0, DIV_LSMCU);
2544*28c10f9eSGabriel Fernandez 
2545*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_07, 0, 7);
2546*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_08, 0, 8);
2547*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_09, 0, 9);
2548*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_10, 0, 10);
2549*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_11, 0, 11);
2550*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_12, 0, 12);
2551*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_13, 0, 13);
2552*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_14, 0, 14);
2553*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_15, 0, 15);
2554*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_16, 0, 16);
2555*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_17, 0, 17);
2556*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_18, 0, 18);
2557*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_19, 0, 19);
2558*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_20, 0, 20);
2559*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_21, 0, 21);
2560*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_22, 0, 22);
2561*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_23, 0, 23);
2562*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_24, 0, 24);
2563*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_25, 0, 25);
2564*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_26, 0, 26);
2565*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_27, 0, 27);
2566*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_28, 0, 28);
2567*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_29, 0, 29);
2568*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_30, 0, 30);
2569*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_31, 0, 31);
2570*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_32, 0, 32);
2571*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_33, 0, 33);
2572*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_34, 0, 34);
2573*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_35, 0, 35);
2574*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_36, 0, 36);
2575*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_37, 0, 37);
2576*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_38, 0, 38);
2577*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_39, 0, 39);
2578*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_40, 0, 40);
2579*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_41, 0, 41);
2580*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_42, 0, 42);
2581*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_43, 0, 43);
2582*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_44, 0, 44);
2583*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_45, 0, 45);
2584*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_46, 0, 46);
2585*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_47, 0, 47);
2586*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_48, 0, 48);
2587*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_49, 0, 49);
2588*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_50, 0, 50);
2589*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_51, 0, 51);
2590*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_52, 0, 52);
2591*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_53, 0, 53);
2592*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_54, 0, 54);
2593*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_55, 0, 55);
2594*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_56, 0, 56);
2595*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_57, 0, 57);
2596*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_58, 0, 58);
2597*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_59, 0, 59);
2598*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_60, 0, 60);
2599*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_61, 0, 61);
2600*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_62, 0, 62);
2601*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_63, 0, 63);
2602*28c10f9eSGabriel Fernandez 
2603*28c10f9eSGabriel Fernandez static struct clk ck_cpu1 = {
2604*28c10f9eSGabriel Fernandez 	.ops		= &clk_stm32_cpu1_ops,
2605*28c10f9eSGabriel Fernandez 	.name		= "ck_cpu1",
2606*28c10f9eSGabriel Fernandez 	.flags		= CLK_SET_RATE_PARENT,
2607*28c10f9eSGabriel Fernandez 	.num_parents	= 2,
2608*28c10f9eSGabriel Fernandez 	.parents	= { &ck_pll1, &ck_flexgen_63 },
2609*28c10f9eSGabriel Fernandez };
2610*28c10f9eSGabriel Fernandez 
2611*28c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb1, &ck_icn_ls_mcu, 0, DIV_APB1);
2612*28c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb2, &ck_icn_ls_mcu, 0, DIV_APB2);
2613*28c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb3, &ck_icn_ls_mcu, 0, DIV_APB3);
2614*28c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb4, &ck_icn_ls_mcu, 0, DIV_APB4);
2615*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_icn_apbdbg, 1, { &ck_icn_ls_mcu }, 0,
2616*28c10f9eSGabriel Fernandez 		       GATE_DBG, DIV_APBDBG, NO_MUX);
2617*28c10f9eSGabriel Fernandez 
2618*28c10f9eSGabriel Fernandez #define STM32_TIMER(_name, _parent, _flags, _apbdiv, _timpre)\
2619*28c10f9eSGabriel Fernandez 	struct clk _name = {\
2620*28c10f9eSGabriel Fernandez 		.ops = &ck_timer_ops,\
2621*28c10f9eSGabriel Fernandez 		.priv = &(struct clk_stm32_timer_cfg){\
2622*28c10f9eSGabriel Fernandez 			.apbdiv = (_apbdiv),\
2623*28c10f9eSGabriel Fernandez 			.timpre = (_timpre),\
2624*28c10f9eSGabriel Fernandez 		},\
2625*28c10f9eSGabriel Fernandez 		.name = #_name,\
2626*28c10f9eSGabriel Fernandez 		.flags = (_flags),\
2627*28c10f9eSGabriel Fernandez 		.num_parents = 1,\
2628*28c10f9eSGabriel Fernandez 		.parents = { _parent },\
2629*28c10f9eSGabriel Fernandez 	}
2630*28c10f9eSGabriel Fernandez 
2631*28c10f9eSGabriel Fernandez /* Kernel Timers */
2632*28c10f9eSGabriel Fernandez static STM32_TIMER(ck_timg1, &ck_icn_apb1, 0, RCC_APB1DIVR, RCC_TIMG1PRER);
2633*28c10f9eSGabriel Fernandez static STM32_TIMER(ck_timg2, &ck_icn_apb2, 0, RCC_APB2DIVR, RCC_TIMG2PRER);
2634*28c10f9eSGabriel Fernandez 
2635*28c10f9eSGabriel Fernandez /* Clocks under RCC RIF protection */
2636*28c10f9eSGabriel Fernandez static STM32_GATE(ck_sys_dbg, &ck_icn_apbdbg, 0, GATE_DBG);
2637*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_stm, &ck_icn_apbdbg, 0, GATE_STM);
2638*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_stm, &ck_icn_ls_mcu, 0, GATE_STM);
2639*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tsdbg, &ck_flexgen_43, 0, GATE_DBG);
2640*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tpiu, &ck_flexgen_44, 0, GATE_TRACE);
2641*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_etr, &ck_icn_apbdbg, 0, GATE_ETR);
2642*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_etr, &ck_flexgen_45, 0, GATE_ETR);
2643*28c10f9eSGabriel Fernandez static STM32_GATE(ck_sys_atb, &ck_flexgen_45, 0, GATE_DBG);
2644*28c10f9eSGabriel Fernandez 
2645*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sysram, &ck_icn_hs_mcu, 0, GATE_SYSRAM);
2646*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_vderam, &ck_icn_hs_mcu, 0, GATE_VDERAM);
2647*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_retram, &ck_icn_hs_mcu, 0, GATE_RETRAM);
2648*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_bkpsram, &ck_icn_ls_mcu, 0, GATE_BKPSRAM);
2649*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sram1, &ck_icn_hs_mcu, 0, GATE_SRAM1);
2650*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sram2, &ck_icn_hs_mcu, 0, GATE_SRAM2);
2651*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram1, &ck_icn_ls_mcu, 0, GATE_LPSRAM1);
2652*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram2, &ck_icn_ls_mcu, 0, GATE_LPSRAM2);
2653*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram3, &ck_icn_ls_mcu, 0, GATE_LPSRAM3);
2654*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma1, &ck_icn_ls_mcu, 0, GATE_HPDMA1);
2655*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma2, &ck_icn_ls_mcu, 0, GATE_HPDMA2);
2656*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma3, &ck_icn_ls_mcu, 0, GATE_HPDMA3);
2657*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lpdma, &ck_icn_ls_mcu, 0, GATE_LPDMA);
2658*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ipcc1, &ck_icn_ls_mcu, 0, GATE_IPCC1);
2659*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ipcc2, &ck_icn_ls_mcu, 0, GATE_IPCC2);
2660*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hsem, &ck_icn_ls_mcu, 0, GATE_HSEM);
2661*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioa, &ck_icn_ls_mcu, 0, GATE_GPIOA);
2662*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiob, &ck_icn_ls_mcu, 0, GATE_GPIOB);
2663*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioc, &ck_icn_ls_mcu, 0, GATE_GPIOC);
2664*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiod, &ck_icn_ls_mcu, 0, GATE_GPIOD);
2665*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioe, &ck_icn_ls_mcu, 0, GATE_GPIOE);
2666*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiof, &ck_icn_ls_mcu, 0, GATE_GPIOF);
2667*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiog, &ck_icn_ls_mcu, 0, GATE_GPIOG);
2668*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioh, &ck_icn_ls_mcu, 0, GATE_GPIOH);
2669*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioi, &ck_icn_ls_mcu, 0, GATE_GPIOI);
2670*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioj, &ck_icn_ls_mcu, 0, GATE_GPIOJ);
2671*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiok, &ck_icn_ls_mcu, 0, GATE_GPIOK);
2672*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioz, &ck_icn_ls_mcu, 0, GATE_GPIOZ);
2673*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_rtc, &ck_icn_ls_mcu, 0, GATE_RTC);
2674*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_rtc, 4,
2675*28c10f9eSGabriel Fernandez 		       PARENT(&ck_off, &ck_lse, &ck_lsi, &ck_hse_rtc),
2676*28c10f9eSGabriel Fernandez 		       0, GATE_RTCCK, NO_DIV, MUX_RTC);
2677*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_bsec, &ck_icn_apb3, 0, GATE_BSEC);
2678*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrphyc, &ck_icn_ls_mcu, 0, GATE_DDRPHYCAPB);
2679*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_risaf4, &ck_icn_ls_mcu, 0, GATE_DDRCP);
2680*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ddr, &ck_icn_ddr, 0, GATE_DDRCP);
2681*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrc, &ck_icn_apb4, 0, GATE_DDRCAPB);
2682*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrcfg, &ck_icn_apb4, 0, GATE_DDRCFG);
2683*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_syscpu1, &ck_icn_ls_mcu, 0, GATE_SYSCPU1);
2684*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_is2m, &ck_icn_apb3, 0, GATE_IS2M);
2685*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_mco1, 2, PARENT(&ck_flexgen_61, &ck_obser0), 0,
2686*28c10f9eSGabriel Fernandez 		       GATE_MCO1, NO_DIV, MUX_MCO1);
2687*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_mco2, 2, PARENT(&ck_flexgen_62, &ck_obser1), 0,
2688*28c10f9eSGabriel Fernandez 		       GATE_MCO2, NO_DIV, MUX_MCO2);
2689*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ospi1, &ck_icn_hs_mcu, 0, GATE_OSPI1);
2690*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ospi1, &ck_flexgen_48, 0, GATE_OSPI1);
2691*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ospi2, &ck_icn_hs_mcu, 0, GATE_OSPI2);
2692*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ospi2, &ck_flexgen_49, 0, GATE_OSPI2);
2693*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_fmc, &ck_icn_ls_mcu, 0, GATE_FMC);
2694*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_fmc, &ck_flexgen_50, 0, GATE_FMC);
2695*28c10f9eSGabriel Fernandez 
2696*28c10f9eSGabriel Fernandez /* Kernel Clocks */
2697*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cci, &ck_icn_ls_mcu, 0, GATE_CCI);
2698*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_crc, &ck_icn_ls_mcu, 0, GATE_CRC);
2699*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ospiiom, &ck_icn_ls_mcu, 0, GATE_OSPIIOM);
2700*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hash, &ck_icn_ls_mcu, 0, GATE_HASH);
2701*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_rng, &ck_icn_ls_mcu, 0, GATE_RNG);
2702*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cryp1, &ck_icn_ls_mcu, 0, GATE_CRYP1);
2703*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cryp2, &ck_icn_ls_mcu, 0, GATE_CRYP2);
2704*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_saes, &ck_icn_ls_mcu, 0, GATE_SAES);
2705*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_pka, &ck_icn_ls_mcu, 0, GATE_PKA);
2706*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adf1, &ck_icn_ls_mcu, 0, GATE_ADF1);
2707*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg5, &ck_icn_ls_mcu, 0, GATE_IWDG5);
2708*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_wwdg2, &ck_icn_ls_mcu, 0, GATE_WWDG2);
2709*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_eth1, &ck_icn_ls_mcu, 0, GATE_ETH1);
2710*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ethsw, &ck_icn_ls_mcu, 0, GATE_ETHSWMAC);
2711*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_eth2, &ck_icn_ls_mcu, 0, GATE_ETH2);
2712*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_pcie, &ck_icn_ls_mcu, 0, GATE_PCIE);
2713*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adc12, &ck_icn_ls_mcu, 0, GATE_ADC12);
2714*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adc3, &ck_icn_ls_mcu, 0, GATE_ADC3);
2715*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_mdf1, &ck_icn_ls_mcu, 0, GATE_MDF1);
2716*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi8, &ck_icn_ls_mcu, 0, GATE_SPI8);
2717*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lpuart1, &ck_icn_ls_mcu, 0, GATE_LPUART1);
2718*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c8, &ck_icn_ls_mcu, 0, GATE_I2C8);
2719*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim3, &ck_icn_ls_mcu, 0, GATE_LPTIM3);
2720*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim4, &ck_icn_ls_mcu, 0, GATE_LPTIM4);
2721*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim5, &ck_icn_ls_mcu, 0, GATE_LPTIM5);
2722*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc1, &ck_icn_sdmmc, 0, GATE_SDMMC1);
2723*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc2, &ck_icn_sdmmc, 0, GATE_SDMMC2);
2724*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc3, &ck_icn_sdmmc, 0, GATE_SDMMC3);
2725*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb2ohci, &ck_icn_hsl, 0, GATE_USB2);
2726*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb2ehci, &ck_icn_hsl, 0, GATE_USB2);
2727*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb3dr, &ck_icn_hsl, 0, GATE_USB3DR);
2728*28c10f9eSGabriel Fernandez 
2729*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim2, &ck_icn_apb1, 0, GATE_TIM2);
2730*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim3, &ck_icn_apb1, 0, GATE_TIM3);
2731*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim4, &ck_icn_apb1, 0, GATE_TIM4);
2732*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim5, &ck_icn_apb1, 0, GATE_TIM5);
2733*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim6, &ck_icn_apb1, 0, GATE_TIM6);
2734*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim7, &ck_icn_apb1, 0, GATE_TIM7);
2735*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim10, &ck_icn_apb1, 0, GATE_TIM10);
2736*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim11, &ck_icn_apb1, 0, GATE_TIM11);
2737*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim12, &ck_icn_apb1, 0, GATE_TIM12);
2738*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim13, &ck_icn_apb1, 0, GATE_TIM13);
2739*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim14, &ck_icn_apb1, 0, GATE_TIM14);
2740*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim1, &ck_icn_apb1, 0, GATE_LPTIM1);
2741*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim2, &ck_icn_apb1, 0, GATE_LPTIM2);
2742*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi2, &ck_icn_apb1, 0, GATE_SPI2);
2743*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi3, &ck_icn_apb1, 0, GATE_SPI3);
2744*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spdifrx, &ck_icn_apb1, 0, GATE_SPDIFRX);
2745*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart2, &ck_icn_apb1, 0, GATE_USART2);
2746*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart3, &ck_icn_apb1, 0, GATE_USART3);
2747*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart4, &ck_icn_apb1, 0, GATE_UART4);
2748*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart5, &ck_icn_apb1, 0, GATE_UART5);
2749*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c1, &ck_icn_apb1, 0, GATE_I2C1);
2750*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c2, &ck_icn_apb1, 0, GATE_I2C2);
2751*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c3, &ck_icn_apb1, 0, GATE_I2C3);
2752*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c4, &ck_icn_apb1, 0, GATE_I2C4);
2753*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c5, &ck_icn_apb1, 0, GATE_I2C5);
2754*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c6, &ck_icn_apb1, 0, GATE_I2C6);
2755*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c7, &ck_icn_apb1, 0, GATE_I2C7);
2756*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c1, &ck_icn_apb1, 0, GATE_I3C1);
2757*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c2, &ck_icn_apb1, 0, GATE_I3C2);
2758*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c3, &ck_icn_apb1, 0, GATE_I3C3);
2759*28c10f9eSGabriel Fernandez 
2760*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c4, &ck_icn_ls_mcu, 0, GATE_I3C4);
2761*28c10f9eSGabriel Fernandez 
2762*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim1, &ck_icn_apb2, 0, GATE_TIM1);
2763*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim8, &ck_icn_apb2, 0, GATE_TIM8);
2764*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim15, &ck_icn_apb2, 0, GATE_TIM15);
2765*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim16, &ck_icn_apb2, 0, GATE_TIM16);
2766*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim17, &ck_icn_apb2, 0, GATE_TIM17);
2767*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim20, &ck_icn_apb2, 0, GATE_TIM20);
2768*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai1, &ck_icn_apb2, 0, GATE_SAI1);
2769*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai2, &ck_icn_apb2, 0, GATE_SAI2);
2770*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai3, &ck_icn_apb2, 0, GATE_SAI3);
2771*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai4, &ck_icn_apb2, 0, GATE_SAI4);
2772*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart1, &ck_icn_apb2, 0, GATE_USART1);
2773*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart6, &ck_icn_apb2, 0, GATE_USART6);
2774*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart7, &ck_icn_apb2, 0, GATE_UART7);
2775*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart8, &ck_icn_apb2, 0, GATE_UART8);
2776*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart9, &ck_icn_apb2, 0, GATE_UART9);
2777*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_fdcan, &ck_icn_apb2, 0, GATE_FDCAN);
2778*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi1, &ck_icn_apb2, 0, GATE_SPI1);
2779*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi4, &ck_icn_apb2, 0, GATE_SPI4);
2780*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi5, &ck_icn_apb2, 0, GATE_SPI5);
2781*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi6, &ck_icn_apb2, 0, GATE_SPI6);
2782*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi7, &ck_icn_apb2, 0, GATE_SPI7);
2783*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg1, &ck_icn_apb3, 0, GATE_IWDG1);
2784*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg2, &ck_icn_apb3, 0, GATE_IWDG2);
2785*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg3, &ck_icn_apb3, 0, GATE_IWDG3);
2786*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg4, &ck_icn_apb3, 0, GATE_IWDG4);
2787*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_wwdg1, &ck_icn_apb3, 0, GATE_WWDG1);
2788*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_vref, &ck_icn_apb3, 0, GATE_VREF);
2789*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dts, &ck_icn_apb3, 0, GATE_DTS);
2790*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_serc, &ck_icn_apb3, 0, GATE_SERC);
2791*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hdp, &ck_icn_apb3, 0, GATE_HDP);
2792*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dsi, &ck_icn_apb4, 0, GATE_DSI);
2793*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ltdc, &ck_icn_apb4, 0, GATE_LTDC);
2794*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_csi, &ck_icn_apb4, 0, GATE_CSI);
2795*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dcmipp, &ck_icn_apb4, 0, GATE_DCMIPP);
2796*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lvds, &ck_icn_apb4, 0, GATE_LVDS);
2797*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gicv2m, &ck_icn_apb4, 0, GATE_GICV2M);
2798*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usbtc, &ck_icn_apb4, 0, GATE_USBTC);
2799*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usb3pciephy, &ck_icn_apb4, 0, GATE_USB3PCIEPHY);
2800*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_stgen, &ck_icn_apb4, 0, GATE_STGEN);
2801*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_vdec, &ck_icn_apb4, 0, GATE_VDEC);
2802*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_venc, &ck_icn_apb4, 0, GATE_VENC);
2803*28c10f9eSGabriel Fernandez 
2804*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim2, &ck_timg1, 0, GATE_TIM2);
2805*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim3, &ck_timg1, 0, GATE_TIM3);
2806*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim4, &ck_timg1, 0, GATE_TIM4);
2807*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim5, &ck_timg1, 0, GATE_TIM5);
2808*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim6, &ck_timg1, 0, GATE_TIM6);
2809*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim7, &ck_timg1, 0, GATE_TIM7);
2810*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim10, &ck_timg1, 0, GATE_TIM10);
2811*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim11, &ck_timg1, 0, GATE_TIM11);
2812*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim12, &ck_timg1, 0, GATE_TIM12);
2813*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim13, &ck_timg1, 0, GATE_TIM13);
2814*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim14, &ck_timg1, 0, GATE_TIM14);
2815*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim1, &ck_timg2, 0, GATE_TIM1);
2816*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim8, &ck_timg2, 0, GATE_TIM8);
2817*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim15, &ck_timg2, 0, GATE_TIM15);
2818*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim16, &ck_timg2, 0, GATE_TIM16);
2819*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim17, &ck_timg2, 0, GATE_TIM17);
2820*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim20, &ck_timg2, 0, GATE_TIM20);
2821*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim1, &ck_flexgen_07, 0, GATE_LPTIM1);
2822*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim2, &ck_flexgen_07, 0, GATE_LPTIM2);
2823*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart2, &ck_flexgen_08, 0, GATE_USART2);
2824*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart4, &ck_flexgen_08, 0, GATE_UART4);
2825*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart3, &ck_flexgen_09, 0, GATE_USART3);
2826*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart5, &ck_flexgen_09, 0, GATE_UART5);
2827*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi2, &ck_flexgen_10, 0, GATE_SPI2);
2828*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi3, &ck_flexgen_10, 0, GATE_SPI3);
2829*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spdifrx, &ck_flexgen_11, 0, GATE_SPDIFRX);
2830*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c1, &ck_flexgen_12, 0, GATE_I2C1);
2831*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c2, &ck_flexgen_12, 0, GATE_I2C2);
2832*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c1, &ck_flexgen_12, 0, GATE_I3C1);
2833*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c2, &ck_flexgen_12, 0, GATE_I3C2);
2834*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c3, &ck_flexgen_13, 0, GATE_I2C3);
2835*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c5, &ck_flexgen_13, 0, GATE_I2C5);
2836*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c3, &ck_flexgen_13, 0, GATE_I3C3);
2837*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c4, &ck_flexgen_14, 0, GATE_I2C4);
2838*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c6, &ck_flexgen_14, 0, GATE_I2C6);
2839*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c7, &ck_flexgen_15, 0, GATE_I2C7);
2840*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi1, &ck_flexgen_16, 0, GATE_SPI1);
2841*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi4, &ck_flexgen_17, 0, GATE_SPI4);
2842*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi5, &ck_flexgen_17, 0, GATE_SPI5);
2843*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi6, &ck_flexgen_18, 0, GATE_SPI6);
2844*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi7, &ck_flexgen_18, 0, GATE_SPI7);
2845*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart1, &ck_flexgen_19, 0, GATE_USART1);
2846*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart6, &ck_flexgen_20, 0, GATE_USART6);
2847*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart7, &ck_flexgen_21, 0, GATE_UART7);
2848*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart8, &ck_flexgen_21, 0, GATE_UART8);
2849*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart9, &ck_flexgen_22, 0, GATE_UART9);
2850*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_mdf1, &ck_flexgen_23, 0, GATE_MDF1);
2851*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai1, &ck_flexgen_23, 0, GATE_SAI1);
2852*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai2, &ck_flexgen_24, 0, GATE_SAI2);
2853*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai3, &ck_flexgen_25, 0, GATE_SAI3);
2854*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai4, &ck_flexgen_25, 0, GATE_SAI4);
2855*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_fdcan, &ck_flexgen_26, 0, GATE_FDCAN);
2856*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csi, &ck_flexgen_29, 0, GATE_CSI);
2857*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csitxesc, &ck_flexgen_30, 0, GATE_CSI);
2858*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csiphy, &ck_flexgen_31, 0, GATE_CSI);
2859*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_stgen, &ck_flexgen_33, CLK_SET_RATE_PARENT,
2860*28c10f9eSGabriel Fernandez 		  GATE_STGEN);
2861*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usbtc, &ck_flexgen_35, 0, GATE_USBTC);
2862*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c4, &ck_flexgen_36, 0, GATE_I3C4);
2863*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi8, &ck_flexgen_37, 0, GATE_SPI8);
2864*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c8, &ck_flexgen_38, 0, GATE_I2C8);
2865*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lpuart1, &ck_flexgen_39, 0, GATE_LPUART1);
2866*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim3, &ck_flexgen_40, 0, GATE_LPTIM3);
2867*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim4, &ck_flexgen_41, 0, GATE_LPTIM4);
2868*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim5, &ck_flexgen_41, 0, GATE_LPTIM5);
2869*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_adf1, &ck_flexgen_42, 0, GATE_ADF1);
2870*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc1, &ck_flexgen_51, 0, GATE_SDMMC1);
2871*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc2, &ck_flexgen_52, 0, GATE_SDMMC2);
2872*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc3, &ck_flexgen_53, 0, GATE_SDMMC3);
2873*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1, &ck_flexgen_54, 0, GATE_ETH1);
2874*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ethsw, &ck_flexgen_54, 0, GATE_ETHSW);
2875*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2, &ck_flexgen_55, 0, GATE_ETH2);
2876*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1ptp, &ck_flexgen_56, 0, GATE_ETH1);
2877*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2ptp, &ck_flexgen_56, 0, GATE_ETH2);
2878*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usb2phy2, &ck_flexgen_58, 0, GATE_USB3DR);
2879*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_gpu, &ck_flexgen_59, 0, GATE_GPU);
2880*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_gpu, &ck_pll3, 0, GATE_GPU);
2881*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ethswref, &ck_flexgen_60, 0, GATE_ETHSWREF);
2882*28c10f9eSGabriel Fernandez 
2883*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1stp, &ck_icn_ls_mcu, 0, GATE_ETH1STP);
2884*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2stp, &ck_icn_ls_mcu, 0, GATE_ETH2STP);
2885*28c10f9eSGabriel Fernandez 
2886*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ltdc, &ck_flexgen_27, CLK_SET_RATE_PARENT,
2887*28c10f9eSGabriel Fernandez 		  GATE_LTDC);
2888*28c10f9eSGabriel Fernandez 
2889*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_adc12, 2, PARENT(&ck_flexgen_46, &ck_icn_ls_mcu),
2890*28c10f9eSGabriel Fernandez 		       0, GATE_ADC12, NO_DIV, MUX_ADC12);
2891*28c10f9eSGabriel Fernandez 
2892*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_adc3, 3, PARENT(&ck_flexgen_47, &ck_icn_ls_mcu,
2893*28c10f9eSGabriel Fernandez 		       &ck_flexgen_46),
2894*28c10f9eSGabriel Fernandez 		       0, GATE_ADC3, NO_DIV, MUX_ADC3);
2895*28c10f9eSGabriel Fernandez 
2896*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb2phy1, 2, PARENT(&ck_flexgen_57,
2897*28c10f9eSGabriel Fernandez 		       &ck_hse_div2),
2898*28c10f9eSGabriel Fernandez 		       0, GATE_USB2PHY1, NO_DIV, MUX_USB2PHY1);
2899*28c10f9eSGabriel Fernandez 
2900*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb2phy2_en, 2, PARENT(&ck_flexgen_58,
2901*28c10f9eSGabriel Fernandez 		       &ck_hse_div2),
2902*28c10f9eSGabriel Fernandez 		       0, GATE_USB2PHY2, NO_DIV, MUX_USB2PHY2);
2903*28c10f9eSGabriel Fernandez 
2904*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb3pciephy, 2, PARENT(&ck_flexgen_34,
2905*28c10f9eSGabriel Fernandez 		       &ck_hse_div2),
2906*28c10f9eSGabriel Fernandez 		       0, GATE_USB3PCIEPHY, NO_DIV, MUX_USB3PCIEPHY);
2907*28c10f9eSGabriel Fernandez 
2908*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(clk_lanebyte, 2, PARENT(&txbyteclk, &ck_ker_ltdc),
2909*28c10f9eSGabriel Fernandez 		       0, GATE_DSI, NO_DIV, MUX_DSIBLANE);
2910*28c10f9eSGabriel Fernandez 
2911*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_phy_dsi, 2, PARENT(&ck_flexgen_28, &ck_hse),
2912*28c10f9eSGabriel Fernandez 		       0, GATE_DSI, NO_DIV, MUX_DSIPHY);
2913*28c10f9eSGabriel Fernandez 
2914*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_lvdsphy, 2, PARENT(&ck_flexgen_32, &ck_hse),
2915*28c10f9eSGabriel Fernandez 		       0, GATE_LVDS, NO_DIV, MUX_LVDSPHY);
2916*28c10f9eSGabriel Fernandez 
2917*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_dts, 3, PARENT(&ck_hsi, &ck_hse, &ck_msi),
2918*28c10f9eSGabriel Fernandez 		       0, GATE_DTS, NO_DIV, MUX_DTS);
2919*28c10f9eSGabriel Fernandez 
2920*28c10f9eSGabriel Fernandez enum {
2921*28c10f9eSGabriel Fernandez 	CK_OFF = STM32MP25_LAST_CLK,
2922*28c10f9eSGabriel Fernandez 	I2SCKIN,
2923*28c10f9eSGabriel Fernandez 	SPDIFSYMB,
2924*28c10f9eSGabriel Fernandez 	CK_HSE_RTC,
2925*28c10f9eSGabriel Fernandez 	TXBYTECLK,
2926*28c10f9eSGabriel Fernandez 	CK_OBSER0,
2927*28c10f9eSGabriel Fernandez 	CK_OBSER1,
2928*28c10f9eSGabriel Fernandez 	STM32MP25_ALL_CLK_NB
2929*28c10f9eSGabriel Fernandez };
2930*28c10f9eSGabriel Fernandez 
2931*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1mac, &ck_icn_ls_mcu, 0, GATE_ETH1MAC);
2932*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1tx, &ck_icn_ls_mcu, 0, GATE_ETH1TX);
2933*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1rx, &ck_icn_ls_mcu, 0, GATE_ETH1RX);
2934*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2mac, &ck_icn_ls_mcu, 0, GATE_ETH2MAC);
2935*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2tx, &ck_icn_ls_mcu, 0, GATE_ETH2TX);
2936*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2rx, &ck_icn_ls_mcu, 0, GATE_ETH2RX);
2937*28c10f9eSGabriel Fernandez 
2938*28c10f9eSGabriel Fernandez static struct clk *stm32mp25_clk_provided[STM32MP25_ALL_CLK_NB] = {
2939*28c10f9eSGabriel Fernandez 	[HSI_CK]		= &ck_hsi,
2940*28c10f9eSGabriel Fernandez 	[HSE_CK]		= &ck_hse,
2941*28c10f9eSGabriel Fernandez 	[MSI_CK]		= &ck_msi,
2942*28c10f9eSGabriel Fernandez 	[LSI_CK]		= &ck_lsi,
2943*28c10f9eSGabriel Fernandez 	[LSE_CK]		= &ck_lse,
2944*28c10f9eSGabriel Fernandez 
2945*28c10f9eSGabriel Fernandez 	[HSE_DIV2_CK]		= &ck_hse_div2,
2946*28c10f9eSGabriel Fernandez 
2947*28c10f9eSGabriel Fernandez 	[PLL1_CK]		= &ck_pll1,
2948*28c10f9eSGabriel Fernandez 	[PLL2_CK]		= &ck_pll2,
2949*28c10f9eSGabriel Fernandez 	[PLL3_CK]		= &ck_pll3,
2950*28c10f9eSGabriel Fernandez 	[PLL4_CK]		= &ck_pll4,
2951*28c10f9eSGabriel Fernandez 	[PLL5_CK]		= &ck_pll5,
2952*28c10f9eSGabriel Fernandez 	[PLL6_CK]		= &ck_pll6,
2953*28c10f9eSGabriel Fernandez 	[PLL7_CK]		= &ck_pll7,
2954*28c10f9eSGabriel Fernandez 	[PLL8_CK]		= &ck_pll8,
2955*28c10f9eSGabriel Fernandez 
2956*28c10f9eSGabriel Fernandez 	[CK_ICN_HS_MCU]		= &ck_icn_hs_mcu,
2957*28c10f9eSGabriel Fernandez 	[CK_ICN_LS_MCU]		= &ck_icn_ls_mcu,
2958*28c10f9eSGabriel Fernandez 
2959*28c10f9eSGabriel Fernandez 	[CK_ICN_SDMMC]		= &ck_icn_sdmmc,
2960*28c10f9eSGabriel Fernandez 	[CK_ICN_DDR]		= &ck_icn_ddr,
2961*28c10f9eSGabriel Fernandez 	[CK_ICN_DISPLAY]	= &ck_icn_display,
2962*28c10f9eSGabriel Fernandez 	[CK_ICN_HSL]		= &ck_icn_hsl,
2963*28c10f9eSGabriel Fernandez 	[CK_ICN_NIC]		= &ck_icn_nic,
2964*28c10f9eSGabriel Fernandez 	[CK_ICN_VID]		= &ck_icn_vid,
2965*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_07]		= &ck_flexgen_07,
2966*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_08]		= &ck_flexgen_08,
2967*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_09]		= &ck_flexgen_09,
2968*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_10]		= &ck_flexgen_10,
2969*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_11]		= &ck_flexgen_11,
2970*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_12]		= &ck_flexgen_12,
2971*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_13]		= &ck_flexgen_13,
2972*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_14]		= &ck_flexgen_14,
2973*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_15]		= &ck_flexgen_15,
2974*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_16]		= &ck_flexgen_16,
2975*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_17]		= &ck_flexgen_17,
2976*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_18]		= &ck_flexgen_18,
2977*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_19]		= &ck_flexgen_19,
2978*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_20]		= &ck_flexgen_20,
2979*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_21]		= &ck_flexgen_21,
2980*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_22]		= &ck_flexgen_22,
2981*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_23]		= &ck_flexgen_23,
2982*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_24]		= &ck_flexgen_24,
2983*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_25]		= &ck_flexgen_25,
2984*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_26]		= &ck_flexgen_26,
2985*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_27]		= &ck_flexgen_27,
2986*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_28]		= &ck_flexgen_28,
2987*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_29]		= &ck_flexgen_29,
2988*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_30]		= &ck_flexgen_30,
2989*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_31]		= &ck_flexgen_31,
2990*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_32]		= &ck_flexgen_32,
2991*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_33]		= &ck_flexgen_33,
2992*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_34]		= &ck_flexgen_34,
2993*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_35]		= &ck_flexgen_35,
2994*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_36]		= &ck_flexgen_36,
2995*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_37]		= &ck_flexgen_37,
2996*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_38]		= &ck_flexgen_38,
2997*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_39]		= &ck_flexgen_39,
2998*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_40]		= &ck_flexgen_40,
2999*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_41]		= &ck_flexgen_41,
3000*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_42]		= &ck_flexgen_42,
3001*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_43]		= &ck_flexgen_43,
3002*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_44]		= &ck_flexgen_44,
3003*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_45]		= &ck_flexgen_45,
3004*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_46]		= &ck_flexgen_46,
3005*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_47]		= &ck_flexgen_47,
3006*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_48]		= &ck_flexgen_48,
3007*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_49]		= &ck_flexgen_49,
3008*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_50]		= &ck_flexgen_50,
3009*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_51]		= &ck_flexgen_51,
3010*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_52]		= &ck_flexgen_52,
3011*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_53]		= &ck_flexgen_53,
3012*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_54]		= &ck_flexgen_54,
3013*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_55]		= &ck_flexgen_55,
3014*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_56]		= &ck_flexgen_56,
3015*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_57]		= &ck_flexgen_57,
3016*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_58]		= &ck_flexgen_58,
3017*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_59]		= &ck_flexgen_59,
3018*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_60]		= &ck_flexgen_60,
3019*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_61]		= &ck_flexgen_61,
3020*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_62]		= &ck_flexgen_62,
3021*28c10f9eSGabriel Fernandez 	[CK_FLEXGEN_63]		= &ck_flexgen_63,
3022*28c10f9eSGabriel Fernandez 
3023*28c10f9eSGabriel Fernandez 	[CK_CPU1]		= &ck_cpu1,
3024*28c10f9eSGabriel Fernandez 
3025*28c10f9eSGabriel Fernandez 	[CK_ICN_APB1]		= &ck_icn_apb1,
3026*28c10f9eSGabriel Fernandez 	[CK_ICN_APB2]		= &ck_icn_apb2,
3027*28c10f9eSGabriel Fernandez 	[CK_ICN_APB3]		= &ck_icn_apb3,
3028*28c10f9eSGabriel Fernandez 	[CK_ICN_APB4]		= &ck_icn_apb4,
3029*28c10f9eSGabriel Fernandez 	[CK_ICN_APBDBG]		= &ck_icn_apbdbg,
3030*28c10f9eSGabriel Fernandez 
3031*28c10f9eSGabriel Fernandez 	[TIMG1_CK]		= &ck_timg1,
3032*28c10f9eSGabriel Fernandez 	[TIMG2_CK]		= &ck_timg2,
3033*28c10f9eSGabriel Fernandez 
3034*28c10f9eSGabriel Fernandez 	[CK_BUS_SYSRAM]		= &ck_icn_s_sysram,
3035*28c10f9eSGabriel Fernandez 	[CK_BUS_VDERAM]		= &ck_icn_s_vderam,
3036*28c10f9eSGabriel Fernandez 	[CK_BUS_RETRAM]		= &ck_icn_s_retram,
3037*28c10f9eSGabriel Fernandez 	[CK_BUS_SRAM1]		= &ck_icn_s_sram1,
3038*28c10f9eSGabriel Fernandez 	[CK_BUS_SRAM2]		= &ck_icn_s_sram2,
3039*28c10f9eSGabriel Fernandez 	[CK_BUS_OSPI1]		= &ck_icn_s_ospi1,
3040*28c10f9eSGabriel Fernandez 	[CK_BUS_OSPI2]		= &ck_icn_s_ospi2,
3041*28c10f9eSGabriel Fernandez 	[CK_BUS_BKPSRAM]	= &ck_icn_s_bkpsram,
3042*28c10f9eSGabriel Fernandez 	[CK_BUS_DDRPHYC]	= &ck_icn_p_ddrphyc,
3043*28c10f9eSGabriel Fernandez 	[CK_BUS_SYSCPU1]	= &ck_icn_p_syscpu1,
3044*28c10f9eSGabriel Fernandez 	[CK_BUS_HPDMA1]		= &ck_icn_p_hpdma1,
3045*28c10f9eSGabriel Fernandez 	[CK_BUS_HPDMA2]		= &ck_icn_p_hpdma2,
3046*28c10f9eSGabriel Fernandez 	[CK_BUS_HPDMA3]		= &ck_icn_p_hpdma3,
3047*28c10f9eSGabriel Fernandez 	[CK_BUS_IPCC1]		= &ck_icn_p_ipcc1,
3048*28c10f9eSGabriel Fernandez 	[CK_BUS_IPCC2]		= &ck_icn_p_ipcc2,
3049*28c10f9eSGabriel Fernandez 	[CK_BUS_CCI]		= &ck_icn_p_cci,
3050*28c10f9eSGabriel Fernandez 	[CK_BUS_CRC]		= &ck_icn_p_crc,
3051*28c10f9eSGabriel Fernandez 	[CK_BUS_OSPIIOM]	= &ck_icn_p_ospiiom,
3052*28c10f9eSGabriel Fernandez 	[CK_BUS_HASH]		= &ck_icn_p_hash,
3053*28c10f9eSGabriel Fernandez 	[CK_BUS_RNG]		= &ck_icn_p_rng,
3054*28c10f9eSGabriel Fernandez 	[CK_BUS_CRYP1]		= &ck_icn_p_cryp1,
3055*28c10f9eSGabriel Fernandez 	[CK_BUS_CRYP2]		= &ck_icn_p_cryp2,
3056*28c10f9eSGabriel Fernandez 	[CK_BUS_SAES]		= &ck_icn_p_saes,
3057*28c10f9eSGabriel Fernandez 	[CK_BUS_PKA]		= &ck_icn_p_pka,
3058*28c10f9eSGabriel Fernandez 	[CK_BUS_GPIOA]		= &ck_icn_p_gpioa,
3059*28c10f9eSGabriel Fernandez 	[CK_BUS_GPIOB]		= &ck_icn_p_gpiob,
3060*28c10f9eSGabriel Fernandez 	[CK_BUS_GPIOC]		= &ck_icn_p_gpioc,
3061*28c10f9eSGabriel Fernandez 	[CK_BUS_GPIOD]		= &ck_icn_p_gpiod,
3062*28c10f9eSGabriel Fernandez 	[CK_BUS_GPIOE]		= &ck_icn_p_gpioe,
3063*28c10f9eSGabriel Fernandez 	[CK_BUS_GPIOF]		= &ck_icn_p_gpiof,
3064*28c10f9eSGabriel Fernandez 	[CK_BUS_GPIOG]		= &ck_icn_p_gpiog,
3065*28c10f9eSGabriel Fernandez 	[CK_BUS_GPIOH]		= &ck_icn_p_gpioh,
3066*28c10f9eSGabriel Fernandez 	[CK_BUS_GPIOI]		= &ck_icn_p_gpioi,
3067*28c10f9eSGabriel Fernandez 	[CK_BUS_GPIOJ]		= &ck_icn_p_gpioj,
3068*28c10f9eSGabriel Fernandez 	[CK_BUS_GPIOK]		= &ck_icn_p_gpiok,
3069*28c10f9eSGabriel Fernandez 	[CK_BUS_LPSRAM1]	= &ck_icn_s_lpsram1,
3070*28c10f9eSGabriel Fernandez 	[CK_BUS_LPSRAM2]	= &ck_icn_s_lpsram2,
3071*28c10f9eSGabriel Fernandez 	[CK_BUS_LPSRAM3]	= &ck_icn_s_lpsram3,
3072*28c10f9eSGabriel Fernandez 	[CK_BUS_GPIOZ]		= &ck_icn_p_gpioz,
3073*28c10f9eSGabriel Fernandez 	[CK_BUS_LPDMA]		= &ck_icn_p_lpdma,
3074*28c10f9eSGabriel Fernandez 	[CK_BUS_ADF1]		= &ck_icn_p_adf1,
3075*28c10f9eSGabriel Fernandez 	[CK_BUS_HSEM]		= &ck_icn_p_hsem,
3076*28c10f9eSGabriel Fernandez 	[CK_BUS_RTC]		= &ck_icn_p_rtc,
3077*28c10f9eSGabriel Fernandez 	[CK_BUS_IWDG5]		= &ck_icn_p_iwdg5,
3078*28c10f9eSGabriel Fernandez 	[CK_BUS_WWDG2]		= &ck_icn_p_wwdg2,
3079*28c10f9eSGabriel Fernandez 	[CK_BUS_STM]		= &ck_icn_p_stm,
3080*28c10f9eSGabriel Fernandez 	[CK_KER_STM]		= &ck_icn_s_stm,
3081*28c10f9eSGabriel Fernandez 	[CK_BUS_FMC]		= &ck_icn_p_fmc,
3082*28c10f9eSGabriel Fernandez 	[CK_BUS_ETH1]		= &ck_icn_p_eth1,
3083*28c10f9eSGabriel Fernandez 	[CK_BUS_ETHSW]		= &ck_icn_p_ethsw,
3084*28c10f9eSGabriel Fernandez 	[CK_BUS_ETH2]		= &ck_icn_p_eth2,
3085*28c10f9eSGabriel Fernandez 	[CK_BUS_PCIE]		= &ck_icn_p_pcie,
3086*28c10f9eSGabriel Fernandez 	[CK_BUS_ADC12]		= &ck_icn_p_adc12,
3087*28c10f9eSGabriel Fernandez 	[CK_BUS_ADC3]		= &ck_icn_p_adc3,
3088*28c10f9eSGabriel Fernandez 	[CK_BUS_MDF1]		= &ck_icn_p_mdf1,
3089*28c10f9eSGabriel Fernandez 	[CK_BUS_SPI8]		= &ck_icn_p_spi8,
3090*28c10f9eSGabriel Fernandez 	[CK_BUS_LPUART1]	= &ck_icn_p_lpuart1,
3091*28c10f9eSGabriel Fernandez 	[CK_BUS_I2C8]		= &ck_icn_p_i2c8,
3092*28c10f9eSGabriel Fernandez 	[CK_BUS_LPTIM3]		= &ck_icn_p_lptim3,
3093*28c10f9eSGabriel Fernandez 	[CK_BUS_LPTIM4]		= &ck_icn_p_lptim4,
3094*28c10f9eSGabriel Fernandez 	[CK_BUS_LPTIM5]		= &ck_icn_p_lptim5,
3095*28c10f9eSGabriel Fernandez 	[CK_BUS_RISAF4]		= &ck_icn_p_risaf4,
3096*28c10f9eSGabriel Fernandez 	[CK_BUS_SDMMC1]		= &ck_icn_m_sdmmc1,
3097*28c10f9eSGabriel Fernandez 	[CK_BUS_SDMMC2]		= &ck_icn_m_sdmmc2,
3098*28c10f9eSGabriel Fernandez 	[CK_BUS_SDMMC3]		= &ck_icn_m_sdmmc3,
3099*28c10f9eSGabriel Fernandez 	[CK_BUS_DDR]		= &ck_icn_s_ddr,
3100*28c10f9eSGabriel Fernandez 	[CK_BUS_USB2OHCI]	= &ck_icn_m_usb2ohci,
3101*28c10f9eSGabriel Fernandez 	[CK_BUS_USB2EHCI]	= &ck_icn_m_usb2ehci,
3102*28c10f9eSGabriel Fernandez 	[CK_BUS_USB3DR]		= &ck_icn_m_usb3dr,
3103*28c10f9eSGabriel Fernandez 	[CK_BUS_TIM2]		= &ck_icn_p_tim2,
3104*28c10f9eSGabriel Fernandez 	[CK_BUS_TIM3]		= &ck_icn_p_tim3,
3105*28c10f9eSGabriel Fernandez 	[CK_BUS_TIM4]		= &ck_icn_p_tim4,
3106*28c10f9eSGabriel Fernandez 	[CK_BUS_TIM5]		= &ck_icn_p_tim5,
3107*28c10f9eSGabriel Fernandez 	[CK_BUS_TIM6]		= &ck_icn_p_tim6,
3108*28c10f9eSGabriel Fernandez 	[CK_BUS_TIM7]		= &ck_icn_p_tim7,
3109*28c10f9eSGabriel Fernandez 	[CK_BUS_TIM10]		= &ck_icn_p_tim10,
3110*28c10f9eSGabriel Fernandez 	[CK_BUS_TIM11]		= &ck_icn_p_tim11,
3111*28c10f9eSGabriel Fernandez 	[CK_BUS_TIM12]		= &ck_icn_p_tim12,
3112*28c10f9eSGabriel Fernandez 	[CK_BUS_TIM13]		= &ck_icn_p_tim13,
3113*28c10f9eSGabriel Fernandez 	[CK_BUS_TIM14]		= &ck_icn_p_tim14,
3114*28c10f9eSGabriel Fernandez 	[CK_BUS_LPTIM1]		= &ck_icn_p_lptim1,
3115*28c10f9eSGabriel Fernandez 	[CK_BUS_LPTIM2]		= &ck_icn_p_lptim2,
3116*28c10f9eSGabriel Fernandez 	[CK_BUS_SPI2]		= &ck_icn_p_spi2,
3117*28c10f9eSGabriel Fernandez 	[CK_BUS_SPI3]		= &ck_icn_p_spi3,
3118*28c10f9eSGabriel Fernandez 	[CK_BUS_SPDIFRX]	= &ck_icn_p_spdifrx,
3119*28c10f9eSGabriel Fernandez 	[CK_BUS_USART2]		= &ck_icn_p_usart2,
3120*28c10f9eSGabriel Fernandez 	[CK_BUS_USART3]		= &ck_icn_p_usart3,
3121*28c10f9eSGabriel Fernandez 	[CK_BUS_UART4]		= &ck_icn_p_uart4,
3122*28c10f9eSGabriel Fernandez 	[CK_BUS_UART5]		= &ck_icn_p_uart5,
3123*28c10f9eSGabriel Fernandez 	[CK_BUS_I2C1]		= &ck_icn_p_i2c1,
3124*28c10f9eSGabriel Fernandez 	[CK_BUS_I2C2]		= &ck_icn_p_i2c2,
3125*28c10f9eSGabriel Fernandez 	[CK_BUS_I2C3]		= &ck_icn_p_i2c3,
3126*28c10f9eSGabriel Fernandez 	[CK_BUS_I2C4]		= &ck_icn_p_i2c4,
3127*28c10f9eSGabriel Fernandez 	[CK_BUS_I2C5]		= &ck_icn_p_i2c5,
3128*28c10f9eSGabriel Fernandez 	[CK_BUS_I2C6]		= &ck_icn_p_i2c6,
3129*28c10f9eSGabriel Fernandez 	[CK_BUS_I2C7]		= &ck_icn_p_i2c7,
3130*28c10f9eSGabriel Fernandez 	[CK_BUS_I3C1]		= &ck_icn_p_i3c1,
3131*28c10f9eSGabriel Fernandez 	[CK_BUS_I3C2]		= &ck_icn_p_i3c2,
3132*28c10f9eSGabriel Fernandez 	[CK_BUS_I3C3]		= &ck_icn_p_i3c3,
3133*28c10f9eSGabriel Fernandez 	[CK_BUS_I3C4]		= &ck_icn_p_i3c4,
3134*28c10f9eSGabriel Fernandez 	[CK_BUS_TIM1]		= &ck_icn_p_tim1,
3135*28c10f9eSGabriel Fernandez 	[CK_BUS_TIM8]		= &ck_icn_p_tim8,
3136*28c10f9eSGabriel Fernandez 	[CK_BUS_TIM15]		= &ck_icn_p_tim15,
3137*28c10f9eSGabriel Fernandez 	[CK_BUS_TIM16]		= &ck_icn_p_tim16,
3138*28c10f9eSGabriel Fernandez 	[CK_BUS_TIM17]		= &ck_icn_p_tim17,
3139*28c10f9eSGabriel Fernandez 	[CK_BUS_TIM20]		= &ck_icn_p_tim20,
3140*28c10f9eSGabriel Fernandez 	[CK_BUS_SAI1]		= &ck_icn_p_sai1,
3141*28c10f9eSGabriel Fernandez 	[CK_BUS_SAI2]		= &ck_icn_p_sai2,
3142*28c10f9eSGabriel Fernandez 	[CK_BUS_SAI3]		= &ck_icn_p_sai3,
3143*28c10f9eSGabriel Fernandez 	[CK_BUS_SAI4]		= &ck_icn_p_sai4,
3144*28c10f9eSGabriel Fernandez 	[CK_BUS_USART1]		= &ck_icn_p_usart1,
3145*28c10f9eSGabriel Fernandez 	[CK_BUS_USART6]		= &ck_icn_p_usart6,
3146*28c10f9eSGabriel Fernandez 	[CK_BUS_UART7]		= &ck_icn_p_uart7,
3147*28c10f9eSGabriel Fernandez 	[CK_BUS_UART8]		= &ck_icn_p_uart8,
3148*28c10f9eSGabriel Fernandez 	[CK_BUS_UART9]		= &ck_icn_p_uart9,
3149*28c10f9eSGabriel Fernandez 	[CK_BUS_FDCAN]		= &ck_icn_p_fdcan,
3150*28c10f9eSGabriel Fernandez 	[CK_BUS_SPI1]		= &ck_icn_p_spi1,
3151*28c10f9eSGabriel Fernandez 	[CK_BUS_SPI4]		= &ck_icn_p_spi4,
3152*28c10f9eSGabriel Fernandez 	[CK_BUS_SPI5]		= &ck_icn_p_spi5,
3153*28c10f9eSGabriel Fernandez 	[CK_BUS_SPI6]		= &ck_icn_p_spi6,
3154*28c10f9eSGabriel Fernandez 	[CK_BUS_SPI7]		= &ck_icn_p_spi7,
3155*28c10f9eSGabriel Fernandez 	[CK_BUS_BSEC]		= &ck_icn_p_bsec,
3156*28c10f9eSGabriel Fernandez 	[CK_BUS_IWDG1]		= &ck_icn_p_iwdg1,
3157*28c10f9eSGabriel Fernandez 	[CK_BUS_IWDG2]		= &ck_icn_p_iwdg2,
3158*28c10f9eSGabriel Fernandez 	[CK_BUS_IWDG3]		= &ck_icn_p_iwdg3,
3159*28c10f9eSGabriel Fernandez 	[CK_BUS_IWDG4]		= &ck_icn_p_iwdg4,
3160*28c10f9eSGabriel Fernandez 	[CK_BUS_WWDG1]		= &ck_icn_p_wwdg1,
3161*28c10f9eSGabriel Fernandez 	[CK_BUS_VREF]		= &ck_icn_p_vref,
3162*28c10f9eSGabriel Fernandez 	[CK_BUS_SERC]		= &ck_icn_p_serc,
3163*28c10f9eSGabriel Fernandez 	[CK_BUS_DTS]		= &ck_icn_p_dts,
3164*28c10f9eSGabriel Fernandez 	[CK_BUS_HDP]		= &ck_icn_p_hdp,
3165*28c10f9eSGabriel Fernandez 	[CK_BUS_IS2M]		= &ck_icn_p_is2m,
3166*28c10f9eSGabriel Fernandez 	[CK_BUS_DSI]		= &ck_icn_p_dsi,
3167*28c10f9eSGabriel Fernandez 	[CK_BUS_LTDC]		= &ck_icn_p_ltdc,
3168*28c10f9eSGabriel Fernandez 	[CK_BUS_CSI]		= &ck_icn_p_csi,
3169*28c10f9eSGabriel Fernandez 	[CK_BUS_DCMIPP]		= &ck_icn_p_dcmipp,
3170*28c10f9eSGabriel Fernandez 	[CK_BUS_DDRC]		= &ck_icn_p_ddrc,
3171*28c10f9eSGabriel Fernandez 	[CK_BUS_DDRCFG]		= &ck_icn_p_ddrcfg,
3172*28c10f9eSGabriel Fernandez 	[CK_BUS_LVDS]		= &ck_icn_p_lvds,
3173*28c10f9eSGabriel Fernandez 	[CK_BUS_GICV2M]		= &ck_icn_p_gicv2m,
3174*28c10f9eSGabriel Fernandez 	[CK_BUS_USBTC]		= &ck_icn_p_usbtc,
3175*28c10f9eSGabriel Fernandez 	[CK_BUS_USB3PCIEPHY]	= &ck_icn_p_usb3pciephy,
3176*28c10f9eSGabriel Fernandez 	[CK_BUS_STGEN]		= &ck_icn_p_stgen,
3177*28c10f9eSGabriel Fernandez 	[CK_BUS_VDEC]		= &ck_icn_p_vdec,
3178*28c10f9eSGabriel Fernandez 	[CK_BUS_VENC]		= &ck_icn_p_venc,
3179*28c10f9eSGabriel Fernandez 	[CK_SYSDBG]		= &ck_sys_dbg,
3180*28c10f9eSGabriel Fernandez 	[CK_KER_TIM2]		= &ck_ker_tim2,
3181*28c10f9eSGabriel Fernandez 	[CK_KER_TIM3]		= &ck_ker_tim3,
3182*28c10f9eSGabriel Fernandez 	[CK_KER_TIM4]		= &ck_ker_tim4,
3183*28c10f9eSGabriel Fernandez 	[CK_KER_TIM5]		= &ck_ker_tim5,
3184*28c10f9eSGabriel Fernandez 	[CK_KER_TIM6]		= &ck_ker_tim6,
3185*28c10f9eSGabriel Fernandez 	[CK_KER_TIM7]		= &ck_ker_tim7,
3186*28c10f9eSGabriel Fernandez 	[CK_KER_TIM10]		= &ck_ker_tim10,
3187*28c10f9eSGabriel Fernandez 	[CK_KER_TIM11]		= &ck_ker_tim11,
3188*28c10f9eSGabriel Fernandez 	[CK_KER_TIM12]		= &ck_ker_tim12,
3189*28c10f9eSGabriel Fernandez 	[CK_KER_TIM13]		= &ck_ker_tim13,
3190*28c10f9eSGabriel Fernandez 	[CK_KER_TIM14]		= &ck_ker_tim14,
3191*28c10f9eSGabriel Fernandez 	[CK_KER_TIM1]		= &ck_ker_tim1,
3192*28c10f9eSGabriel Fernandez 	[CK_KER_TIM8]		= &ck_ker_tim8,
3193*28c10f9eSGabriel Fernandez 	[CK_KER_TIM15]		= &ck_ker_tim15,
3194*28c10f9eSGabriel Fernandez 	[CK_KER_TIM16]		= &ck_ker_tim16,
3195*28c10f9eSGabriel Fernandez 	[CK_KER_TIM17]		= &ck_ker_tim17,
3196*28c10f9eSGabriel Fernandez 	[CK_KER_TIM20]		= &ck_ker_tim20,
3197*28c10f9eSGabriel Fernandez 	[CK_KER_LPTIM1]		= &ck_ker_lptim1,
3198*28c10f9eSGabriel Fernandez 	[CK_KER_LPTIM2]		= &ck_ker_lptim2,
3199*28c10f9eSGabriel Fernandez 	[CK_KER_USART2]		= &ck_ker_usart2,
3200*28c10f9eSGabriel Fernandez 	[CK_KER_UART4]		= &ck_ker_uart4,
3201*28c10f9eSGabriel Fernandez 	[CK_KER_USART3]		= &ck_ker_usart3,
3202*28c10f9eSGabriel Fernandez 	[CK_KER_UART5]		= &ck_ker_uart5,
3203*28c10f9eSGabriel Fernandez 	[CK_KER_SPI2]		= &ck_ker_spi2,
3204*28c10f9eSGabriel Fernandez 	[CK_KER_SPI3]		= &ck_ker_spi3,
3205*28c10f9eSGabriel Fernandez 	[CK_KER_SPDIFRX]	= &ck_ker_spdifrx,
3206*28c10f9eSGabriel Fernandez 	[CK_KER_I2C1]		= &ck_ker_i2c1,
3207*28c10f9eSGabriel Fernandez 	[CK_KER_I2C2]		= &ck_ker_i2c2,
3208*28c10f9eSGabriel Fernandez 	[CK_KER_I3C1]		= &ck_ker_i3c1,
3209*28c10f9eSGabriel Fernandez 	[CK_KER_I3C2]		= &ck_ker_i3c2,
3210*28c10f9eSGabriel Fernandez 	[CK_KER_I2C3]		= &ck_ker_i2c3,
3211*28c10f9eSGabriel Fernandez 	[CK_KER_I2C5]		= &ck_ker_i2c5,
3212*28c10f9eSGabriel Fernandez 	[CK_KER_I3C3]		= &ck_ker_i3c3,
3213*28c10f9eSGabriel Fernandez 	[CK_KER_I2C4]		= &ck_ker_i2c4,
3214*28c10f9eSGabriel Fernandez 	[CK_KER_I2C6]		= &ck_ker_i2c6,
3215*28c10f9eSGabriel Fernandez 	[CK_KER_I2C7]		= &ck_ker_i2c7,
3216*28c10f9eSGabriel Fernandez 	[CK_KER_SPI1]		= &ck_ker_spi1,
3217*28c10f9eSGabriel Fernandez 	[CK_KER_SPI4]		= &ck_ker_spi4,
3218*28c10f9eSGabriel Fernandez 	[CK_KER_SPI5]		= &ck_ker_spi5,
3219*28c10f9eSGabriel Fernandez 	[CK_KER_SPI6]		= &ck_ker_spi6,
3220*28c10f9eSGabriel Fernandez 	[CK_KER_SPI7]		= &ck_ker_spi7,
3221*28c10f9eSGabriel Fernandez 	[CK_KER_USART1]		= &ck_ker_usart1,
3222*28c10f9eSGabriel Fernandez 	[CK_KER_USART6]		= &ck_ker_usart6,
3223*28c10f9eSGabriel Fernandez 	[CK_KER_UART7]		= &ck_ker_uart7,
3224*28c10f9eSGabriel Fernandez 	[CK_KER_UART8]		= &ck_ker_uart8,
3225*28c10f9eSGabriel Fernandez 	[CK_KER_UART9]		= &ck_ker_uart9,
3226*28c10f9eSGabriel Fernandez 	[CK_KER_MDF1]		= &ck_ker_mdf1,
3227*28c10f9eSGabriel Fernandez 	[CK_KER_SAI1]		= &ck_ker_sai1,
3228*28c10f9eSGabriel Fernandez 	[CK_KER_SAI2]		= &ck_ker_sai2,
3229*28c10f9eSGabriel Fernandez 	[CK_KER_SAI3]		= &ck_ker_sai3,
3230*28c10f9eSGabriel Fernandez 	[CK_KER_SAI4]		= &ck_ker_sai4,
3231*28c10f9eSGabriel Fernandez 	[CK_KER_FDCAN]		= &ck_ker_fdcan,
3232*28c10f9eSGabriel Fernandez 	[CK_KER_CSI]		= &ck_ker_csi,
3233*28c10f9eSGabriel Fernandez 	[CK_KER_CSITXESC]	= &ck_ker_csitxesc,
3234*28c10f9eSGabriel Fernandez 	[CK_KER_CSIPHY]		= &ck_ker_csiphy,
3235*28c10f9eSGabriel Fernandez 	[CK_KER_STGEN]		= &ck_ker_stgen,
3236*28c10f9eSGabriel Fernandez 	[CK_KER_USBTC]		= &ck_ker_usbtc,
3237*28c10f9eSGabriel Fernandez 	[CK_KER_I3C4]		= &ck_ker_i3c4,
3238*28c10f9eSGabriel Fernandez 	[CK_KER_SPI8]		= &ck_ker_spi8,
3239*28c10f9eSGabriel Fernandez 	[CK_KER_I2C8]		= &ck_ker_i2c8,
3240*28c10f9eSGabriel Fernandez 	[CK_KER_LPUART1]	= &ck_ker_lpuart1,
3241*28c10f9eSGabriel Fernandez 	[CK_KER_LPTIM3]		= &ck_ker_lptim3,
3242*28c10f9eSGabriel Fernandez 	[CK_KER_LPTIM4]		= &ck_ker_lptim4,
3243*28c10f9eSGabriel Fernandez 	[CK_KER_LPTIM5]		= &ck_ker_lptim5,
3244*28c10f9eSGabriel Fernandez 	[CK_KER_ADF1]		= &ck_ker_adf1,
3245*28c10f9eSGabriel Fernandez 	[CK_KER_TSDBG]		= &ck_ker_tsdbg,
3246*28c10f9eSGabriel Fernandez 	[CK_KER_TPIU]		= &ck_ker_tpiu,
3247*28c10f9eSGabriel Fernandez 	[CK_BUS_ETR]		= &ck_icn_p_etr,
3248*28c10f9eSGabriel Fernandez 	[CK_KER_ETR]		= &ck_icn_m_etr,
3249*28c10f9eSGabriel Fernandez 	[CK_BUS_SYSATB]		= &ck_sys_atb,
3250*28c10f9eSGabriel Fernandez 	[CK_KER_OSPI1]		= &ck_ker_ospi1,
3251*28c10f9eSGabriel Fernandez 	[CK_KER_OSPI2]		= &ck_ker_ospi2,
3252*28c10f9eSGabriel Fernandez 	[CK_KER_FMC]		= &ck_ker_fmc,
3253*28c10f9eSGabriel Fernandez 	[CK_KER_SDMMC1]		= &ck_ker_sdmmc1,
3254*28c10f9eSGabriel Fernandez 	[CK_KER_SDMMC2]		= &ck_ker_sdmmc2,
3255*28c10f9eSGabriel Fernandez 	[CK_KER_SDMMC3]		= &ck_ker_sdmmc3,
3256*28c10f9eSGabriel Fernandez 	[CK_KER_ETH1]		= &ck_ker_eth1,
3257*28c10f9eSGabriel Fernandez 	[CK_ETH1_STP]		= &ck_ker_eth1stp,
3258*28c10f9eSGabriel Fernandez 	[CK_KER_ETHSW]		= &ck_ker_ethsw,
3259*28c10f9eSGabriel Fernandez 	[CK_KER_ETH2]		= &ck_ker_eth2,
3260*28c10f9eSGabriel Fernandez 	[CK_ETH2_STP]		= &ck_ker_eth2stp,
3261*28c10f9eSGabriel Fernandez 	[CK_KER_ETH1PTP]	= &ck_ker_eth1ptp,
3262*28c10f9eSGabriel Fernandez 	[CK_KER_ETH2PTP]	= &ck_ker_eth2ptp,
3263*28c10f9eSGabriel Fernandez 	[CK_BUS_GPU]		= &ck_icn_m_gpu,
3264*28c10f9eSGabriel Fernandez 	[CK_KER_GPU]		= &ck_ker_gpu,
3265*28c10f9eSGabriel Fernandez 	[CK_KER_ETHSWREF]	= &ck_ker_ethswref,
3266*28c10f9eSGabriel Fernandez 
3267*28c10f9eSGabriel Fernandez 	[CK_MCO1]		= &ck_mco1,
3268*28c10f9eSGabriel Fernandez 	[CK_MCO2]		= &ck_mco2,
3269*28c10f9eSGabriel Fernandez 	[CK_KER_ADC12]		= &ck_ker_adc12,
3270*28c10f9eSGabriel Fernandez 	[CK_KER_ADC3]		= &ck_ker_adc3,
3271*28c10f9eSGabriel Fernandez 	[CK_KER_USB2PHY1]	= &ck_ker_usb2phy1,
3272*28c10f9eSGabriel Fernandez 	[CK_KER_USB2PHY2]	= &ck_ker_usb2phy2,
3273*28c10f9eSGabriel Fernandez 	[CK_KER_USB2PHY2EN]	= &ck_ker_usb2phy2_en,
3274*28c10f9eSGabriel Fernandez 	[CK_KER_USB3PCIEPHY]	= &ck_ker_usb3pciephy,
3275*28c10f9eSGabriel Fernandez 	[CK_KER_LTDC]		= &ck_ker_ltdc,
3276*28c10f9eSGabriel Fernandez 	[CK_KER_DSIBLANE]	= &clk_lanebyte,
3277*28c10f9eSGabriel Fernandez 	[CK_KER_DSIPHY]		= &ck_phy_dsi,
3278*28c10f9eSGabriel Fernandez 	[CK_KER_LVDSPHY]	= &ck_ker_lvdsphy,
3279*28c10f9eSGabriel Fernandez 	[CK_KER_DTS]		= &ck_ker_dts,
3280*28c10f9eSGabriel Fernandez 	[RTC_CK]		= &ck_rtc,
3281*28c10f9eSGabriel Fernandez 
3282*28c10f9eSGabriel Fernandez 	[CK_ETH1_MAC]		= &ck_ker_eth1mac,
3283*28c10f9eSGabriel Fernandez 	[CK_ETH1_TX]		= &ck_ker_eth1tx,
3284*28c10f9eSGabriel Fernandez 	[CK_ETH1_RX]		= &ck_ker_eth1rx,
3285*28c10f9eSGabriel Fernandez 	[CK_ETH2_MAC]		= &ck_ker_eth2mac,
3286*28c10f9eSGabriel Fernandez 	[CK_ETH2_TX]		= &ck_ker_eth2tx,
3287*28c10f9eSGabriel Fernandez 	[CK_ETH2_RX]		= &ck_ker_eth2rx,
3288*28c10f9eSGabriel Fernandez 
3289*28c10f9eSGabriel Fernandez 	[CK_HSE_RTC]		= &ck_hse_rtc,
3290*28c10f9eSGabriel Fernandez 	[CK_OBSER0]		= &ck_obser0,
3291*28c10f9eSGabriel Fernandez 	[CK_OBSER1]		= &ck_obser1,
3292*28c10f9eSGabriel Fernandez 	[CK_OFF]		= &ck_off,
3293*28c10f9eSGabriel Fernandez 	[I2SCKIN]		= &i2sckin,
3294*28c10f9eSGabriel Fernandez 	[SPDIFSYMB]		= &spdifsymb,
3295*28c10f9eSGabriel Fernandez 	[TXBYTECLK]		= &txbyteclk,
3296*28c10f9eSGabriel Fernandez };
3297*28c10f9eSGabriel Fernandez 
3298*28c10f9eSGabriel Fernandez static bool clk_stm32_clock_is_critical(struct clk *clk)
3299*28c10f9eSGabriel Fernandez {
3300*28c10f9eSGabriel Fernandez 	struct clk *clk_criticals[] = {
3301*28c10f9eSGabriel Fernandez 		&ck_hsi,
3302*28c10f9eSGabriel Fernandez 		&ck_hse,
3303*28c10f9eSGabriel Fernandez 		&ck_msi,
3304*28c10f9eSGabriel Fernandez 		&ck_lsi,
3305*28c10f9eSGabriel Fernandez 		&ck_lse,
3306*28c10f9eSGabriel Fernandez 		&ck_cpu1,
3307*28c10f9eSGabriel Fernandez 		&ck_icn_p_syscpu1,
3308*28c10f9eSGabriel Fernandez 		&ck_icn_s_ddr,
3309*28c10f9eSGabriel Fernandez 		&ck_icn_p_ddrc,
3310*28c10f9eSGabriel Fernandez 		&ck_icn_p_ddrcfg,
3311*28c10f9eSGabriel Fernandez 		&ck_icn_p_ddrphyc,
3312*28c10f9eSGabriel Fernandez 		&ck_icn_s_sysram,
3313*28c10f9eSGabriel Fernandez 		&ck_icn_s_bkpsram,
3314*28c10f9eSGabriel Fernandez 		&ck_ker_fmc,
3315*28c10f9eSGabriel Fernandez 		&ck_ker_ospi1,
3316*28c10f9eSGabriel Fernandez 		&ck_ker_ospi2,
3317*28c10f9eSGabriel Fernandez 		&ck_icn_s_vderam,
3318*28c10f9eSGabriel Fernandez 		&ck_icn_s_lpsram1,
3319*28c10f9eSGabriel Fernandez 		&ck_icn_s_lpsram2,
3320*28c10f9eSGabriel Fernandez 		&ck_icn_s_lpsram3,
3321*28c10f9eSGabriel Fernandez 		&ck_icn_p_hpdma1,
3322*28c10f9eSGabriel Fernandez 		&ck_icn_p_hpdma2,
3323*28c10f9eSGabriel Fernandez 		&ck_icn_p_hpdma3,
3324*28c10f9eSGabriel Fernandez 		&ck_icn_p_gpioa,
3325*28c10f9eSGabriel Fernandez 		&ck_icn_p_gpiob,
3326*28c10f9eSGabriel Fernandez 		&ck_icn_p_gpioc,
3327*28c10f9eSGabriel Fernandez 		&ck_icn_p_gpiod,
3328*28c10f9eSGabriel Fernandez 		&ck_icn_p_gpioe,
3329*28c10f9eSGabriel Fernandez 		&ck_icn_p_gpiof,
3330*28c10f9eSGabriel Fernandez 		&ck_icn_p_gpiog,
3331*28c10f9eSGabriel Fernandez 		&ck_icn_p_gpioh,
3332*28c10f9eSGabriel Fernandez 		&ck_icn_p_gpioi,
3333*28c10f9eSGabriel Fernandez 		&ck_icn_p_gpioj,
3334*28c10f9eSGabriel Fernandez 		&ck_icn_p_gpiok,
3335*28c10f9eSGabriel Fernandez 		&ck_icn_p_gpioz,
3336*28c10f9eSGabriel Fernandez 		&ck_icn_p_ipcc1,
3337*28c10f9eSGabriel Fernandez 		&ck_icn_p_ipcc2,
3338*28c10f9eSGabriel Fernandez 		&ck_icn_p_gicv2m,
3339*28c10f9eSGabriel Fernandez 		&ck_icn_p_rtc
3340*28c10f9eSGabriel Fernandez 	};
3341*28c10f9eSGabriel Fernandez 	size_t i = 0;
3342*28c10f9eSGabriel Fernandez 
3343*28c10f9eSGabriel Fernandez 	for (i = 0; i < ARRAY_SIZE(clk_criticals); i++)
3344*28c10f9eSGabriel Fernandez 		if (clk == clk_criticals[i])
3345*28c10f9eSGabriel Fernandez 			return true;
3346*28c10f9eSGabriel Fernandez 	return false;
3347*28c10f9eSGabriel Fernandez }
3348*28c10f9eSGabriel Fernandez 
3349*28c10f9eSGabriel Fernandez static void clk_stm32_init_oscillators(const void *fdt, int node)
3350*28c10f9eSGabriel Fernandez {
3351*28c10f9eSGabriel Fernandez 	size_t i = 0;
3352*28c10f9eSGabriel Fernandez 	static const char * const name[] = {
3353*28c10f9eSGabriel Fernandez 		"clk-hse", "clk-hsi", "clk-lse",
3354*28c10f9eSGabriel Fernandez 		"clk-lsi", "clk-msi", "clk-i2sin"
3355*28c10f9eSGabriel Fernandez 	};
3356*28c10f9eSGabriel Fernandez 	struct clk *clks[ARRAY_SIZE(name)] = {
3357*28c10f9eSGabriel Fernandez 		&ck_hse, &ck_hsi, &ck_lse,
3358*28c10f9eSGabriel Fernandez 		&ck_lsi, &ck_msi, &i2sckin
3359*28c10f9eSGabriel Fernandez 	};
3360*28c10f9eSGabriel Fernandez 
3361*28c10f9eSGabriel Fernandez 	for (i = 0; i < ARRAY_SIZE(clks); i++) {
3362*28c10f9eSGabriel Fernandez 		struct clk *clk = NULL;
3363*28c10f9eSGabriel Fernandez 
3364*28c10f9eSGabriel Fernandez 		if (clk_dt_get_by_name(fdt, node, name[i], &clk))
3365*28c10f9eSGabriel Fernandez 			panic();
3366*28c10f9eSGabriel Fernandez 
3367*28c10f9eSGabriel Fernandez 		clks[i]->parents[0] = clk;
3368*28c10f9eSGabriel Fernandez 	}
3369*28c10f9eSGabriel Fernandez }
3370*28c10f9eSGabriel Fernandez 
3371*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_apply_rcc_config(struct stm32_clk_platdata *pdata)
3372*28c10f9eSGabriel Fernandez {
3373*28c10f9eSGabriel Fernandez 	if (pdata->safe_rst)
3374*28c10f9eSGabriel Fernandez 		stm32mp25_syscfg_set_safe_reset(true);
3375*28c10f9eSGabriel Fernandez 
3376*28c10f9eSGabriel Fernandez 	return TEE_SUCCESS;
3377*28c10f9eSGabriel Fernandez }
3378*28c10f9eSGabriel Fernandez 
3379*28c10f9eSGabriel Fernandez static struct stm32_pll_dt_cfg mp25_pll[PLL_NB];
3380*28c10f9eSGabriel Fernandez static struct stm32_clk_opp_dt_cfg mp25_clk_opp;
3381*28c10f9eSGabriel Fernandez static struct stm32_osci_dt_cfg mp25_osci[NB_OSCILLATOR];
3382*28c10f9eSGabriel Fernandez 
3383*28c10f9eSGabriel Fernandez #define DT_FLEXGEN_CLK_MAX	64
3384*28c10f9eSGabriel Fernandez static uint32_t mp25_flexgen[DT_FLEXGEN_CLK_MAX];
3385*28c10f9eSGabriel Fernandez 
3386*28c10f9eSGabriel Fernandez #define DT_BUS_CLK_MAX		6
3387*28c10f9eSGabriel Fernandez static uint32_t mp25_busclk[DT_BUS_CLK_MAX];
3388*28c10f9eSGabriel Fernandez 
3389*28c10f9eSGabriel Fernandez #define DT_KERNEL_CLK_MAX	20
3390*28c10f9eSGabriel Fernandez static uint32_t mp25_kernelclk[DT_KERNEL_CLK_MAX];
3391*28c10f9eSGabriel Fernandez 
3392*28c10f9eSGabriel Fernandez static struct stm32_clk_platdata stm32mp25_clock_pdata = {
3393*28c10f9eSGabriel Fernandez 	.osci		= mp25_osci,
3394*28c10f9eSGabriel Fernandez 	.nosci		= NB_OSCILLATOR,
3395*28c10f9eSGabriel Fernandez 	.pll		= mp25_pll,
3396*28c10f9eSGabriel Fernandez 	.npll		= PLL_NB,
3397*28c10f9eSGabriel Fernandez 	.opp		= &mp25_clk_opp,
3398*28c10f9eSGabriel Fernandez 	.busclk		= mp25_busclk,
3399*28c10f9eSGabriel Fernandez 	.nbusclk	= DT_BUS_CLK_MAX,
3400*28c10f9eSGabriel Fernandez 	.kernelclk	= mp25_kernelclk,
3401*28c10f9eSGabriel Fernandez 	.nkernelclk	= DT_KERNEL_CLK_MAX,
3402*28c10f9eSGabriel Fernandez 	.flexgen	= mp25_flexgen,
3403*28c10f9eSGabriel Fernandez 	.nflexgen	= DT_FLEXGEN_CLK_MAX,
3404*28c10f9eSGabriel Fernandez };
3405*28c10f9eSGabriel Fernandez 
3406*28c10f9eSGabriel Fernandez static struct clk_stm32_priv stm32mp25_clock_data = {
3407*28c10f9eSGabriel Fernandez 	.muxes			= parent_mp25,
3408*28c10f9eSGabriel Fernandez 	.nb_muxes		= ARRAY_SIZE(parent_mp25),
3409*28c10f9eSGabriel Fernandez 	.gates			= gates_mp25,
3410*28c10f9eSGabriel Fernandez 	.nb_gates		= ARRAY_SIZE(gates_mp25),
3411*28c10f9eSGabriel Fernandez 	.div			= dividers_mp25,
3412*28c10f9eSGabriel Fernandez 	.nb_div			= ARRAY_SIZE(dividers_mp25),
3413*28c10f9eSGabriel Fernandez 	.pdata			= &stm32mp25_clock_pdata,
3414*28c10f9eSGabriel Fernandez 	.nb_clk_refs		= STM32MP25_ALL_CLK_NB,
3415*28c10f9eSGabriel Fernandez 	.clk_refs		= stm32mp25_clk_provided,
3416*28c10f9eSGabriel Fernandez 	.is_critical		= clk_stm32_clock_is_critical,
3417*28c10f9eSGabriel Fernandez };
3418*28c10f9eSGabriel Fernandez 
3419*28c10f9eSGabriel Fernandez static TEE_Result stm32mp2_clk_probe(const void *fdt, int node,
3420*28c10f9eSGabriel Fernandez 				     const void *compat_data __unused)
3421*28c10f9eSGabriel Fernandez {
3422*28c10f9eSGabriel Fernandez 	TEE_Result res = TEE_ERROR_GENERIC;
3423*28c10f9eSGabriel Fernandez 	int fdt_rc = 0;
3424*28c10f9eSGabriel Fernandez 	int rc = 0;
3425*28c10f9eSGabriel Fernandez 	struct clk_stm32_priv *priv = &stm32mp25_clock_data;
3426*28c10f9eSGabriel Fernandez 	struct stm32_clk_platdata *pdata = &stm32mp25_clock_pdata;
3427*28c10f9eSGabriel Fernandez 
3428*28c10f9eSGabriel Fernandez 	fdt_rc = stm32_clk_parse_fdt(fdt, node, pdata);
3429*28c10f9eSGabriel Fernandez 	if (fdt_rc) {
3430*28c10f9eSGabriel Fernandez 		EMSG("Failed to parse clock node %s: %d",
3431*28c10f9eSGabriel Fernandez 		     fdt_get_name(fdt, node, NULL), fdt_rc);
3432*28c10f9eSGabriel Fernandez 		return TEE_ERROR_GENERIC;
3433*28c10f9eSGabriel Fernandez 	}
3434*28c10f9eSGabriel Fernandez 
3435*28c10f9eSGabriel Fernandez 	rc = clk_stm32_init(priv, stm32_rcc_base());
3436*28c10f9eSGabriel Fernandez 	if (rc)
3437*28c10f9eSGabriel Fernandez 		return TEE_ERROR_GENERIC;
3438*28c10f9eSGabriel Fernandez 
3439*28c10f9eSGabriel Fernandez 	stm32mp2_init_clock_tree(priv, pdata);
3440*28c10f9eSGabriel Fernandez 
3441*28c10f9eSGabriel Fernandez 	clk_stm32_init_oscillators(fdt, node);
3442*28c10f9eSGabriel Fernandez 
3443*28c10f9eSGabriel Fernandez 	res = clk_stm32_apply_rcc_config(pdata);
3444*28c10f9eSGabriel Fernandez 	if (res)
3445*28c10f9eSGabriel Fernandez 		panic("Error when applying RCC config");
3446*28c10f9eSGabriel Fernandez 
3447*28c10f9eSGabriel Fernandez 	stm32mp_clk_provider_probe_final(fdt, node, priv);
3448*28c10f9eSGabriel Fernandez 
3449*28c10f9eSGabriel Fernandez 	if (IS_ENABLED(CFG_STM32_CLK_DEBUG))
3450*28c10f9eSGabriel Fernandez 		clk_print_tree();
3451*28c10f9eSGabriel Fernandez 
3452*28c10f9eSGabriel Fernandez 	return TEE_SUCCESS;
3453*28c10f9eSGabriel Fernandez }
3454*28c10f9eSGabriel Fernandez 
3455*28c10f9eSGabriel Fernandez CLK_DT_DECLARE(stm32mp25_clk, "st,stm32mp25-rcc", stm32mp2_clk_probe);
3456