xref: /rk3399_ARM-atf/drivers/st/clk/stm32mp1_clk.c (revision dfdb057a179556a48e313d2c884af3f877530b7e)
1 /*
2  * Copyright (C) 2018-2019, STMicroelectronics - All Rights Reserved
3  *
4  * SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
5  */
6 
7 #include <assert.h>
8 #include <errno.h>
9 #include <stdint.h>
10 #include <stdio.h>
11 
12 #include <libfdt.h>
13 
14 #include <platform_def.h>
15 
16 #include <arch.h>
17 #include <arch_helpers.h>
18 #include <common/debug.h>
19 #include <drivers/delay_timer.h>
20 #include <drivers/generic_delay_timer.h>
21 #include <drivers/st/stm32mp1_clk.h>
22 #include <drivers/st/stm32mp1_clkfunc.h>
23 #include <drivers/st/stm32mp1_rcc.h>
24 #include <dt-bindings/clock/stm32mp1-clks.h>
25 #include <dt-bindings/clock/stm32mp1-clksrc.h>
26 #include <lib/mmio.h>
27 #include <lib/utils_def.h>
28 #include <plat/common/platform.h>
29 
30 #define MAX_HSI_HZ		64000000
31 
32 #define TIMEOUT_US_200MS	U(200000)
33 #define TIMEOUT_US_1S		U(1000000)
34 
35 #define PLLRDY_TIMEOUT		TIMEOUT_US_200MS
36 #define CLKSRC_TIMEOUT		TIMEOUT_US_200MS
37 #define CLKDIV_TIMEOUT		TIMEOUT_US_200MS
38 #define HSIDIV_TIMEOUT		TIMEOUT_US_200MS
39 #define OSCRDY_TIMEOUT		TIMEOUT_US_1S
40 
41 enum stm32mp1_parent_id {
42 /* Oscillators are defined in enum stm32mp_osc_id */
43 
44 /* Other parent source */
45 	_HSI_KER = NB_OSC,
46 	_HSE_KER,
47 	_HSE_KER_DIV2,
48 	_CSI_KER,
49 	_PLL1_P,
50 	_PLL1_Q,
51 	_PLL1_R,
52 	_PLL2_P,
53 	_PLL2_Q,
54 	_PLL2_R,
55 	_PLL3_P,
56 	_PLL3_Q,
57 	_PLL3_R,
58 	_PLL4_P,
59 	_PLL4_Q,
60 	_PLL4_R,
61 	_ACLK,
62 	_PCLK1,
63 	_PCLK2,
64 	_PCLK3,
65 	_PCLK4,
66 	_PCLK5,
67 	_HCLK6,
68 	_HCLK2,
69 	_CK_PER,
70 	_CK_MPU,
71 	_PARENT_NB,
72 	_UNKNOWN_ID = 0xff,
73 };
74 
75 enum stm32mp1_parent_sel {
76 	_I2C46_SEL,
77 	_UART6_SEL,
78 	_UART24_SEL,
79 	_UART35_SEL,
80 	_UART78_SEL,
81 	_SDMMC12_SEL,
82 	_SDMMC3_SEL,
83 	_QSPI_SEL,
84 	_FMC_SEL,
85 	_USBPHY_SEL,
86 	_USBO_SEL,
87 	_STGEN_SEL,
88 	_PARENT_SEL_NB,
89 	_UNKNOWN_SEL = 0xff,
90 };
91 
92 enum stm32mp1_pll_id {
93 	_PLL1,
94 	_PLL2,
95 	_PLL3,
96 	_PLL4,
97 	_PLL_NB
98 };
99 
100 enum stm32mp1_div_id {
101 	_DIV_P,
102 	_DIV_Q,
103 	_DIV_R,
104 	_DIV_NB,
105 };
106 
107 enum stm32mp1_clksrc_id {
108 	CLKSRC_MPU,
109 	CLKSRC_AXI,
110 	CLKSRC_PLL12,
111 	CLKSRC_PLL3,
112 	CLKSRC_PLL4,
113 	CLKSRC_RTC,
114 	CLKSRC_MCO1,
115 	CLKSRC_MCO2,
116 	CLKSRC_NB
117 };
118 
119 enum stm32mp1_clkdiv_id {
120 	CLKDIV_MPU,
121 	CLKDIV_AXI,
122 	CLKDIV_APB1,
123 	CLKDIV_APB2,
124 	CLKDIV_APB3,
125 	CLKDIV_APB4,
126 	CLKDIV_APB5,
127 	CLKDIV_RTC,
128 	CLKDIV_MCO1,
129 	CLKDIV_MCO2,
130 	CLKDIV_NB
131 };
132 
133 enum stm32mp1_pllcfg {
134 	PLLCFG_M,
135 	PLLCFG_N,
136 	PLLCFG_P,
137 	PLLCFG_Q,
138 	PLLCFG_R,
139 	PLLCFG_O,
140 	PLLCFG_NB
141 };
142 
143 enum stm32mp1_pllcsg {
144 	PLLCSG_MOD_PER,
145 	PLLCSG_INC_STEP,
146 	PLLCSG_SSCG_MODE,
147 	PLLCSG_NB
148 };
149 
150 enum stm32mp1_plltype {
151 	PLL_800,
152 	PLL_1600,
153 	PLL_TYPE_NB
154 };
155 
156 struct stm32mp1_pll {
157 	uint8_t refclk_min;
158 	uint8_t refclk_max;
159 	uint8_t divn_max;
160 };
161 
162 struct stm32mp1_clk_gate {
163 	uint16_t offset;
164 	uint8_t bit;
165 	uint8_t index;
166 	uint8_t set_clr;
167 	enum stm32mp1_parent_sel sel;
168 	enum stm32mp1_parent_id fixed;
169 	bool secure;
170 };
171 
172 struct stm32mp1_clk_sel {
173 	uint16_t offset;
174 	uint8_t src;
175 	uint8_t msk;
176 	uint8_t nb_parent;
177 	const uint8_t *parent;
178 };
179 
180 #define REFCLK_SIZE 4
181 struct stm32mp1_clk_pll {
182 	enum stm32mp1_plltype plltype;
183 	uint16_t rckxselr;
184 	uint16_t pllxcfgr1;
185 	uint16_t pllxcfgr2;
186 	uint16_t pllxfracr;
187 	uint16_t pllxcr;
188 	uint16_t pllxcsgr;
189 	enum stm32mp_osc_id refclk[REFCLK_SIZE];
190 };
191 
192 struct stm32mp1_clk_data {
193 	const struct stm32mp1_clk_gate *gate;
194 	const struct stm32mp1_clk_sel *sel;
195 	const struct stm32mp1_clk_pll *pll;
196 	const int nb_gate;
197 };
198 
199 struct stm32mp1_clk_priv {
200 	uint32_t base;
201 	const struct stm32mp1_clk_data *data;
202 	unsigned long osc[NB_OSC];
203 	uint32_t pkcs_usb_value;
204 };
205 
206 #define STM32MP1_CLK(off, b, idx, s)			\
207 	{						\
208 		.offset = (off),			\
209 		.bit = (b),				\
210 		.index = (idx),				\
211 		.set_clr = 0,				\
212 		.sel = (s),				\
213 		.fixed = _UNKNOWN_ID,			\
214 		.secure = 0,				\
215 	}
216 
217 #define STM32MP1_CLK_F(off, b, idx, f)			\
218 	{						\
219 		.offset = (off),			\
220 		.bit = (b),				\
221 		.index = (idx),				\
222 		.set_clr = 0,				\
223 		.sel = _UNKNOWN_SEL,			\
224 		.fixed = (f),				\
225 		.secure = 0,				\
226 	}
227 
228 #define STM32MP1_CLK_SET_CLR(off, b, idx, s)		\
229 	{						\
230 		.offset = (off),			\
231 		.bit = (b),				\
232 		.index = (idx),				\
233 		.set_clr = 1,				\
234 		.sel = (s),				\
235 		.fixed = _UNKNOWN_ID,			\
236 		.secure = 0,				\
237 	}
238 
239 #define STM32MP1_CLK_SET_CLR_F(off, b, idx, f)		\
240 	{						\
241 		.offset = (off),			\
242 		.bit = (b),				\
243 		.index = (idx),				\
244 		.set_clr = 1,				\
245 		.sel = _UNKNOWN_SEL,			\
246 		.fixed = (f),				\
247 		.secure = 0,				\
248 	}
249 
250 #define STM32MP1_CLK_SEC_SET_CLR(off, b, idx, s)	\
251 	{						\
252 		.offset = (off),			\
253 		.bit = (b),				\
254 		.index = (idx),				\
255 		.set_clr = 1,				\
256 		.sel = (s),				\
257 		.fixed = _UNKNOWN_ID,			\
258 		.secure = 1,				\
259 	}
260 
261 #define STM32MP1_CLK_PARENT(idx, off, s, m, p)		\
262 	[(idx)] = {					\
263 		.offset = (off),			\
264 		.src = (s),				\
265 		.msk = (m),				\
266 		.parent = (p),				\
267 		.nb_parent = ARRAY_SIZE((p))		\
268 	}
269 
270 #define STM32MP1_CLK_PLL(idx, type, off1, off2, off3,	\
271 			 off4, off5, off6,		\
272 			 p1, p2, p3, p4)		\
273 	[(idx)] = {					\
274 		.plltype = (type),			\
275 		.rckxselr = (off1),			\
276 		.pllxcfgr1 = (off2),			\
277 		.pllxcfgr2 = (off3),			\
278 		.pllxfracr = (off4),			\
279 		.pllxcr = (off5),			\
280 		.pllxcsgr = (off6),			\
281 		.refclk[0] = (p1),			\
282 		.refclk[1] = (p2),			\
283 		.refclk[2] = (p3),			\
284 		.refclk[3] = (p4),			\
285 	}
286 
287 static const uint8_t stm32mp1_clks[][2] = {
288 	{CK_PER, _CK_PER},
289 	{CK_MPU, _CK_MPU},
290 	{CK_AXI, _ACLK},
291 	{CK_HSE, _HSE},
292 	{CK_CSI, _CSI},
293 	{CK_LSI, _LSI},
294 	{CK_LSE, _LSE},
295 	{CK_HSI, _HSI},
296 	{CK_HSE_DIV2, _HSE_KER_DIV2},
297 };
298 
299 static const struct stm32mp1_clk_gate stm32mp1_clk_gate[] = {
300 	STM32MP1_CLK(RCC_DDRITFCR, 0, DDRC1, _UNKNOWN_SEL),
301 	STM32MP1_CLK(RCC_DDRITFCR, 1, DDRC1LP, _UNKNOWN_SEL),
302 	STM32MP1_CLK(RCC_DDRITFCR, 2, DDRC2, _UNKNOWN_SEL),
303 	STM32MP1_CLK(RCC_DDRITFCR, 3, DDRC2LP, _UNKNOWN_SEL),
304 	STM32MP1_CLK_F(RCC_DDRITFCR, 4, DDRPHYC, _PLL2_R),
305 	STM32MP1_CLK(RCC_DDRITFCR, 5, DDRPHYCLP, _UNKNOWN_SEL),
306 	STM32MP1_CLK(RCC_DDRITFCR, 6, DDRCAPB, _UNKNOWN_SEL),
307 	STM32MP1_CLK(RCC_DDRITFCR, 7, DDRCAPBLP, _UNKNOWN_SEL),
308 	STM32MP1_CLK(RCC_DDRITFCR, 8, AXIDCG, _UNKNOWN_SEL),
309 	STM32MP1_CLK(RCC_DDRITFCR, 9, DDRPHYCAPB, _UNKNOWN_SEL),
310 	STM32MP1_CLK(RCC_DDRITFCR, 10, DDRPHYCAPBLP, _UNKNOWN_SEL),
311 
312 	STM32MP1_CLK_SET_CLR(RCC_MP_APB1ENSETR, 14, USART2_K, _UART24_SEL),
313 	STM32MP1_CLK_SET_CLR(RCC_MP_APB1ENSETR, 15, USART3_K, _UART35_SEL),
314 	STM32MP1_CLK_SET_CLR(RCC_MP_APB1ENSETR, 16, UART4_K, _UART24_SEL),
315 	STM32MP1_CLK_SET_CLR(RCC_MP_APB1ENSETR, 17, UART5_K, _UART35_SEL),
316 	STM32MP1_CLK_SET_CLR(RCC_MP_APB1ENSETR, 18, UART7_K, _UART78_SEL),
317 	STM32MP1_CLK_SET_CLR(RCC_MP_APB1ENSETR, 19, UART8_K, _UART78_SEL),
318 
319 	STM32MP1_CLK_SET_CLR(RCC_MP_APB2ENSETR, 13, USART6_K, _UART6_SEL),
320 
321 	STM32MP1_CLK_SET_CLR(RCC_MP_APB4ENSETR, 8, DDRPERFM, _UNKNOWN_SEL),
322 	STM32MP1_CLK_SET_CLR(RCC_MP_APB4ENSETR, 15, IWDG2, _UNKNOWN_SEL),
323 	STM32MP1_CLK_SET_CLR(RCC_MP_APB4ENSETR, 16, USBPHY_K, _USBPHY_SEL),
324 
325 	STM32MP1_CLK_SEC_SET_CLR(RCC_MP_APB5ENSETR, 2, I2C4_K, _I2C46_SEL),
326 	STM32MP1_CLK_SEC_SET_CLR(RCC_MP_APB5ENSETR, 8, RTCAPB, _PCLK5),
327 	STM32MP1_CLK_SEC_SET_CLR(RCC_MP_APB5ENSETR, 11, TZC1, _UNKNOWN_SEL),
328 	STM32MP1_CLK_SEC_SET_CLR(RCC_MP_APB5ENSETR, 12, TZC2, _UNKNOWN_SEL),
329 	STM32MP1_CLK_SEC_SET_CLR(RCC_MP_APB5ENSETR, 20, STGEN_K, _STGEN_SEL),
330 
331 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB2ENSETR, 8, USBO_K, _USBO_SEL),
332 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB2ENSETR, 16, SDMMC3_K, _SDMMC3_SEL),
333 
334 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB4ENSETR, 0, GPIOA, _UNKNOWN_SEL),
335 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB4ENSETR, 1, GPIOB, _UNKNOWN_SEL),
336 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB4ENSETR, 2, GPIOC, _UNKNOWN_SEL),
337 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB4ENSETR, 3, GPIOD, _UNKNOWN_SEL),
338 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB4ENSETR, 4, GPIOE, _UNKNOWN_SEL),
339 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB4ENSETR, 5, GPIOF, _UNKNOWN_SEL),
340 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB4ENSETR, 6, GPIOG, _UNKNOWN_SEL),
341 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB4ENSETR, 7, GPIOH, _UNKNOWN_SEL),
342 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB4ENSETR, 8, GPIOI, _UNKNOWN_SEL),
343 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB4ENSETR, 9, GPIOJ, _UNKNOWN_SEL),
344 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB4ENSETR, 10, GPIOK, _UNKNOWN_SEL),
345 
346 	STM32MP1_CLK_SEC_SET_CLR(RCC_MP_AHB5ENSETR, 0, GPIOZ, _UNKNOWN_SEL),
347 	STM32MP1_CLK_SEC_SET_CLR(RCC_MP_AHB5ENSETR, 5, HASH1, _UNKNOWN_SEL),
348 	STM32MP1_CLK_SEC_SET_CLR(RCC_MP_AHB5ENSETR, 6, RNG1_K, _CSI_KER),
349 	STM32MP1_CLK_SEC_SET_CLR(RCC_MP_AHB5ENSETR, 8, BKPSRAM, _UNKNOWN_SEL),
350 
351 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB6ENSETR, 12, FMC_K, _FMC_SEL),
352 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB6ENSETR, 14, QSPI_K, _QSPI_SEL),
353 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB6ENSETR, 16, SDMMC1_K, _SDMMC12_SEL),
354 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB6ENSETR, 17, SDMMC2_K, _SDMMC12_SEL),
355 	STM32MP1_CLK_SET_CLR(RCC_MP_AHB6ENSETR, 24, USBH, _UNKNOWN_SEL),
356 
357 	STM32MP1_CLK(RCC_DBGCFGR, 8, CK_DBG, _UNKNOWN_SEL),
358 };
359 
360 static const uint8_t i2c46_parents[] = {_PCLK5, _PLL3_Q, _HSI_KER, _CSI_KER};
361 static const uint8_t uart6_parents[] = {_PCLK2, _PLL4_Q, _HSI_KER, _CSI_KER,
362 					_HSE_KER};
363 static const uint8_t uart24_parents[] = {_PCLK1, _PLL4_Q, _HSI_KER, _CSI_KER,
364 					 _HSE_KER};
365 static const uint8_t uart35_parents[] = {_PCLK1, _PLL4_Q, _HSI_KER, _CSI_KER,
366 					 _HSE_KER};
367 static const uint8_t uart78_parents[] = {_PCLK1, _PLL4_Q, _HSI_KER, _CSI_KER,
368 					 _HSE_KER};
369 static const uint8_t sdmmc12_parents[] = {_HCLK6, _PLL3_R, _PLL4_P, _HSI_KER};
370 static const uint8_t sdmmc3_parents[] = {_HCLK2, _PLL3_R, _PLL4_P, _HSI_KER};
371 static const uint8_t qspi_parents[] = {_ACLK, _PLL3_R, _PLL4_P, _CK_PER};
372 static const uint8_t fmc_parents[] = {_ACLK, _PLL3_R, _PLL4_P, _CK_PER};
373 static const uint8_t usbphy_parents[] = {_HSE_KER, _PLL4_R, _HSE_KER_DIV2};
374 static const uint8_t usbo_parents[] = {_PLL4_R, _USB_PHY_48};
375 static const uint8_t stgen_parents[] = {_HSI_KER, _HSE_KER};
376 
377 static const struct stm32mp1_clk_sel stm32mp1_clk_sel[_PARENT_SEL_NB] = {
378 	STM32MP1_CLK_PARENT(_I2C46_SEL, RCC_I2C46CKSELR, 0, 0x7, i2c46_parents),
379 	STM32MP1_CLK_PARENT(_UART6_SEL, RCC_UART6CKSELR, 0, 0x7, uart6_parents),
380 	STM32MP1_CLK_PARENT(_UART24_SEL, RCC_UART24CKSELR, 0, 0x7,
381 			    uart24_parents),
382 	STM32MP1_CLK_PARENT(_UART35_SEL, RCC_UART35CKSELR, 0, 0x7,
383 			    uart35_parents),
384 	STM32MP1_CLK_PARENT(_UART78_SEL, RCC_UART78CKSELR, 0, 0x7,
385 			    uart78_parents),
386 	STM32MP1_CLK_PARENT(_SDMMC12_SEL, RCC_SDMMC12CKSELR, 0, 0x7,
387 			    sdmmc12_parents),
388 	STM32MP1_CLK_PARENT(_SDMMC3_SEL, RCC_SDMMC3CKSELR, 0, 0x7,
389 			    sdmmc3_parents),
390 	STM32MP1_CLK_PARENT(_QSPI_SEL, RCC_QSPICKSELR, 0, 0xf, qspi_parents),
391 	STM32MP1_CLK_PARENT(_FMC_SEL, RCC_FMCCKSELR, 0, 0xf, fmc_parents),
392 	STM32MP1_CLK_PARENT(_USBPHY_SEL, RCC_USBCKSELR, 0, 0x3, usbphy_parents),
393 	STM32MP1_CLK_PARENT(_USBO_SEL, RCC_USBCKSELR, 4, 0x1, usbo_parents),
394 	STM32MP1_CLK_PARENT(_STGEN_SEL, RCC_STGENCKSELR, 0, 0x3, stgen_parents),
395 };
396 
397 /* Define characteristic of PLL according type */
398 #define DIVN_MIN	24
399 static const struct stm32mp1_pll stm32mp1_pll[PLL_TYPE_NB] = {
400 	[PLL_800] = {
401 		.refclk_min = 4,
402 		.refclk_max = 16,
403 		.divn_max = 99,
404 	},
405 	[PLL_1600] = {
406 		.refclk_min = 8,
407 		.refclk_max = 16,
408 		.divn_max = 199,
409 	},
410 };
411 
412 /* PLLNCFGR2 register divider by output */
413 static const uint8_t pllncfgr2[_DIV_NB] = {
414 	[_DIV_P] = RCC_PLLNCFGR2_DIVP_SHIFT,
415 	[_DIV_Q] = RCC_PLLNCFGR2_DIVQ_SHIFT,
416 	[_DIV_R] = RCC_PLLNCFGR2_DIVR_SHIFT
417 };
418 
419 static const struct stm32mp1_clk_pll stm32mp1_clk_pll[_PLL_NB] = {
420 	STM32MP1_CLK_PLL(_PLL1, PLL_1600,
421 			 RCC_RCK12SELR, RCC_PLL1CFGR1, RCC_PLL1CFGR2,
422 			 RCC_PLL1FRACR, RCC_PLL1CR, RCC_PLL1CSGR,
423 			 _HSI, _HSE, _UNKNOWN_OSC_ID, _UNKNOWN_OSC_ID),
424 	STM32MP1_CLK_PLL(_PLL2, PLL_1600,
425 			 RCC_RCK12SELR, RCC_PLL2CFGR1, RCC_PLL2CFGR2,
426 			 RCC_PLL2FRACR, RCC_PLL2CR, RCC_PLL2CSGR,
427 			 _HSI, _HSE, _UNKNOWN_OSC_ID, _UNKNOWN_OSC_ID),
428 	STM32MP1_CLK_PLL(_PLL3, PLL_800,
429 			 RCC_RCK3SELR, RCC_PLL3CFGR1, RCC_PLL3CFGR2,
430 			 RCC_PLL3FRACR, RCC_PLL3CR, RCC_PLL3CSGR,
431 			 _HSI, _HSE, _CSI, _UNKNOWN_OSC_ID),
432 	STM32MP1_CLK_PLL(_PLL4, PLL_800,
433 			 RCC_RCK4SELR, RCC_PLL4CFGR1, RCC_PLL4CFGR2,
434 			 RCC_PLL4FRACR, RCC_PLL4CR, RCC_PLL4CSGR,
435 			 _HSI, _HSE, _CSI, _I2S_CKIN),
436 };
437 
438 /* Prescaler table lookups for clock computation */
439 
440 /* div = /1 /2 /4 /8 /16 : same divider for PMU and APBX */
441 #define stm32mp1_mpu_div stm32mp1_mpu_apbx_div
442 #define stm32mp1_apbx_div stm32mp1_mpu_apbx_div
443 static const uint8_t stm32mp1_mpu_apbx_div[8] = {
444 	0, 1, 2, 3, 4, 4, 4, 4
445 };
446 
447 /* div = /1 /2 /3 /4 */
448 static const uint8_t stm32mp1_axi_div[8] = {
449 	1, 2, 3, 4, 4, 4, 4, 4
450 };
451 
452 static const struct stm32mp1_clk_data stm32mp1_data = {
453 	.gate = stm32mp1_clk_gate,
454 	.sel = stm32mp1_clk_sel,
455 	.pll = stm32mp1_clk_pll,
456 	.nb_gate = ARRAY_SIZE(stm32mp1_clk_gate),
457 };
458 
459 static struct stm32mp1_clk_priv stm32mp1_clk_priv_data;
460 
461 static unsigned long stm32mp1_clk_get_fixed(struct stm32mp1_clk_priv *priv,
462 					    enum stm32mp_osc_id idx)
463 {
464 	if (idx >= NB_OSC) {
465 		return 0;
466 	}
467 
468 	return priv->osc[idx];
469 }
470 
471 static int stm32mp1_clk_get_id(struct stm32mp1_clk_priv *priv, unsigned long id)
472 {
473 	const struct stm32mp1_clk_gate *gate = priv->data->gate;
474 	int i;
475 	int nb_clks = priv->data->nb_gate;
476 
477 	for (i = 0; i < nb_clks; i++) {
478 		if (gate[i].index == id) {
479 			return i;
480 		}
481 	}
482 
483 	ERROR("%s: clk id %d not found\n", __func__, (uint32_t)id);
484 
485 	return -EINVAL;
486 }
487 
488 static enum stm32mp1_parent_sel
489 stm32mp1_clk_get_sel(struct stm32mp1_clk_priv *priv, int i)
490 {
491 	const struct stm32mp1_clk_gate *gate = priv->data->gate;
492 
493 	return gate[i].sel;
494 }
495 
496 static enum stm32mp1_parent_id
497 stm32mp1_clk_get_fixed_parent(struct stm32mp1_clk_priv *priv, int i)
498 {
499 	const struct stm32mp1_clk_gate *gate = priv->data->gate;
500 
501 	return gate[i].fixed;
502 }
503 
504 static int stm32mp1_clk_get_parent(struct stm32mp1_clk_priv *priv,
505 				   unsigned long id)
506 {
507 	const struct stm32mp1_clk_sel *sel = priv->data->sel;
508 	uint32_t j, p_sel;
509 	int i;
510 	enum stm32mp1_parent_id p;
511 	enum stm32mp1_parent_sel s;
512 
513 	for (j = 0; j < ARRAY_SIZE(stm32mp1_clks); j++) {
514 		if (stm32mp1_clks[j][0] == id) {
515 			return (int)stm32mp1_clks[j][1];
516 		}
517 	}
518 
519 	i = stm32mp1_clk_get_id(priv, id);
520 	if (i < 0) {
521 		return i;
522 	}
523 
524 	p = stm32mp1_clk_get_fixed_parent(priv, i);
525 	if (p < _PARENT_NB) {
526 		return (int)p;
527 	}
528 
529 	s = stm32mp1_clk_get_sel(priv, i);
530 	if (s >= _PARENT_SEL_NB) {
531 		return -EINVAL;
532 	}
533 
534 	p_sel = (mmio_read_32(priv->base + sel[s].offset) >> sel[s].src) &
535 		sel[s].msk;
536 
537 	if (p_sel < sel[s].nb_parent) {
538 		return (int)sel[s].parent[p_sel];
539 	}
540 
541 	ERROR("%s: no parents defined for clk id %ld\n", __func__, id);
542 
543 	return -EINVAL;
544 }
545 
546 static unsigned long stm32mp1_pll_get_fref_ck(struct stm32mp1_clk_priv *priv,
547 					      enum stm32mp1_pll_id pll_id)
548 {
549 	const struct stm32mp1_clk_pll *pll = priv->data->pll;
550 	uint32_t selr, src;
551 	unsigned long refclk;
552 
553 	selr = mmio_read_32(priv->base + pll[pll_id].rckxselr);
554 	src = selr & RCC_SELR_REFCLK_SRC_MASK;
555 
556 	refclk = stm32mp1_clk_get_fixed(priv, pll[pll_id].refclk[src]);
557 
558 	return refclk;
559 }
560 
561 /*
562  * pll_get_fvco() : return the VCO or (VCO / 2) frequency for the requested PLL
563  * - PLL1 & PLL2 => return VCO / 2 with Fpll_y_ck = FVCO / 2 * (DIVy + 1)
564  * - PLL3 & PLL4 => return VCO     with Fpll_y_ck = FVCO / (DIVy + 1)
565  * => in all cases Fpll_y_ck = pll_get_fvco() / (DIVy + 1)
566  */
567 static unsigned long stm32mp1_pll_get_fvco(struct stm32mp1_clk_priv *priv,
568 					   enum stm32mp1_pll_id pll_id)
569 {
570 	const struct stm32mp1_clk_pll *pll = priv->data->pll;
571 	unsigned long refclk, fvco;
572 	uint32_t cfgr1, fracr, divm, divn;
573 
574 	cfgr1 = mmio_read_32(priv->base + pll[pll_id].pllxcfgr1);
575 	fracr = mmio_read_32(priv->base + pll[pll_id].pllxfracr);
576 
577 	divm = (cfgr1 & (RCC_PLLNCFGR1_DIVM_MASK)) >> RCC_PLLNCFGR1_DIVM_SHIFT;
578 	divn = cfgr1 & RCC_PLLNCFGR1_DIVN_MASK;
579 
580 	refclk = stm32mp1_pll_get_fref_ck(priv, pll_id);
581 
582 	/*
583 	 * With FRACV :
584 	 *   Fvco = Fck_ref * ((DIVN + 1) + FRACV / 2^13) / (DIVM + 1)
585 	 * Without FRACV
586 	 *   Fvco = Fck_ref * ((DIVN + 1) / (DIVM + 1)
587 	 */
588 	if ((fracr & RCC_PLLNFRACR_FRACLE) != 0U) {
589 		uint32_t fracv = (fracr & RCC_PLLNFRACR_FRACV_MASK)
590 			    >> RCC_PLLNFRACR_FRACV_SHIFT;
591 		unsigned long long numerator, denominator;
592 
593 		numerator = ((unsigned long long)divn + 1U) << 13;
594 		numerator = (refclk * numerator) + fracv;
595 		denominator = ((unsigned long long)divm + 1U)  << 13;
596 		fvco = (unsigned long)(numerator / denominator);
597 	} else {
598 		fvco = (unsigned long)(refclk * (divn + 1U) / (divm + 1U));
599 	}
600 
601 	return fvco;
602 }
603 
604 static unsigned long stm32mp1_read_pll_freq(struct stm32mp1_clk_priv *priv,
605 					    enum stm32mp1_pll_id pll_id,
606 					    enum stm32mp1_div_id div_id)
607 {
608 	const struct stm32mp1_clk_pll *pll = priv->data->pll;
609 	unsigned long dfout;
610 	uint32_t cfgr2, divy;
611 
612 	if (div_id >= _DIV_NB) {
613 		return 0;
614 	}
615 
616 	cfgr2 = mmio_read_32(priv->base + pll[pll_id].pllxcfgr2);
617 	divy = (cfgr2 >> pllncfgr2[div_id]) & RCC_PLLNCFGR2_DIVX_MASK;
618 
619 	dfout = stm32mp1_pll_get_fvco(priv, pll_id) / (divy + 1U);
620 
621 	return dfout;
622 }
623 
624 static unsigned long stm32mp1_clk_get(struct stm32mp1_clk_priv *priv, int p)
625 {
626 	uint32_t reg, clkdiv;
627 	unsigned long clock = 0;
628 
629 	switch (p) {
630 	case _CK_MPU:
631 	/* MPU sub system */
632 		reg = mmio_read_32(priv->base + RCC_MPCKSELR);
633 		switch (reg & RCC_SELR_SRC_MASK) {
634 		case RCC_MPCKSELR_HSI:
635 			clock = stm32mp1_clk_get_fixed(priv, _HSI);
636 			break;
637 		case RCC_MPCKSELR_HSE:
638 			clock = stm32mp1_clk_get_fixed(priv, _HSE);
639 			break;
640 		case RCC_MPCKSELR_PLL:
641 			clock = stm32mp1_read_pll_freq(priv, _PLL1, _DIV_P);
642 			break;
643 		case RCC_MPCKSELR_PLL_MPUDIV:
644 			clock = stm32mp1_read_pll_freq(priv, _PLL1, _DIV_P);
645 
646 			reg = mmio_read_32(priv->base + RCC_MPCKDIVR);
647 			clkdiv = reg & RCC_MPUDIV_MASK;
648 			if (clkdiv != 0U) {
649 				clock /= stm32mp1_mpu_div[clkdiv];
650 			}
651 
652 			break;
653 		default:
654 			break;
655 		}
656 		break;
657 	/* AXI sub system */
658 	case _ACLK:
659 	case _HCLK2:
660 	case _HCLK6:
661 	case _PCLK4:
662 	case _PCLK5:
663 		reg = mmio_read_32(priv->base + RCC_ASSCKSELR);
664 		switch (reg & RCC_SELR_SRC_MASK) {
665 		case RCC_ASSCKSELR_HSI:
666 			clock = stm32mp1_clk_get_fixed(priv, _HSI);
667 			break;
668 		case RCC_ASSCKSELR_HSE:
669 			clock = stm32mp1_clk_get_fixed(priv, _HSE);
670 			break;
671 		case RCC_ASSCKSELR_PLL:
672 			clock = stm32mp1_read_pll_freq(priv, _PLL2, _DIV_P);
673 			break;
674 		default:
675 			break;
676 		}
677 
678 		/* System clock divider */
679 		reg = mmio_read_32(priv->base + RCC_AXIDIVR);
680 		clock /= stm32mp1_axi_div[reg & RCC_AXIDIV_MASK];
681 
682 		switch (p) {
683 		case _PCLK4:
684 			reg = mmio_read_32(priv->base + RCC_APB4DIVR);
685 			clock >>= stm32mp1_apbx_div[reg & RCC_APBXDIV_MASK];
686 			break;
687 		case _PCLK5:
688 			reg = mmio_read_32(priv->base + RCC_APB5DIVR);
689 			clock >>= stm32mp1_apbx_div[reg & RCC_APBXDIV_MASK];
690 			break;
691 		default:
692 			break;
693 		}
694 		break;
695 	case _CK_PER:
696 		reg = mmio_read_32(priv->base + RCC_CPERCKSELR);
697 		switch (reg & RCC_SELR_SRC_MASK) {
698 		case RCC_CPERCKSELR_HSI:
699 			clock = stm32mp1_clk_get_fixed(priv, _HSI);
700 			break;
701 		case RCC_CPERCKSELR_HSE:
702 			clock = stm32mp1_clk_get_fixed(priv, _HSE);
703 			break;
704 		case RCC_CPERCKSELR_CSI:
705 			clock = stm32mp1_clk_get_fixed(priv, _CSI);
706 			break;
707 		default:
708 			break;
709 		}
710 		break;
711 	case _HSI:
712 	case _HSI_KER:
713 		clock = stm32mp1_clk_get_fixed(priv, _HSI);
714 		break;
715 	case _CSI:
716 	case _CSI_KER:
717 		clock = stm32mp1_clk_get_fixed(priv, _CSI);
718 		break;
719 	case _HSE:
720 	case _HSE_KER:
721 		clock = stm32mp1_clk_get_fixed(priv, _HSE);
722 		break;
723 	case _HSE_KER_DIV2:
724 		clock = stm32mp1_clk_get_fixed(priv, _HSE) >> 1;
725 		break;
726 	case _LSI:
727 		clock = stm32mp1_clk_get_fixed(priv, _LSI);
728 		break;
729 	case _LSE:
730 		clock = stm32mp1_clk_get_fixed(priv, _LSE);
731 		break;
732 	/* PLL */
733 	case _PLL1_P:
734 		clock = stm32mp1_read_pll_freq(priv, _PLL1, _DIV_P);
735 		break;
736 	case _PLL1_Q:
737 		clock = stm32mp1_read_pll_freq(priv, _PLL1, _DIV_Q);
738 		break;
739 	case _PLL1_R:
740 		clock = stm32mp1_read_pll_freq(priv, _PLL1, _DIV_R);
741 		break;
742 	case _PLL2_P:
743 		clock = stm32mp1_read_pll_freq(priv, _PLL2, _DIV_P);
744 		break;
745 	case _PLL2_Q:
746 		clock = stm32mp1_read_pll_freq(priv, _PLL2, _DIV_Q);
747 		break;
748 	case _PLL2_R:
749 		clock = stm32mp1_read_pll_freq(priv, _PLL2, _DIV_R);
750 		break;
751 	case _PLL3_P:
752 		clock = stm32mp1_read_pll_freq(priv, _PLL3, _DIV_P);
753 		break;
754 	case _PLL3_Q:
755 		clock = stm32mp1_read_pll_freq(priv, _PLL3, _DIV_Q);
756 		break;
757 	case _PLL3_R:
758 		clock = stm32mp1_read_pll_freq(priv, _PLL3, _DIV_R);
759 		break;
760 	case _PLL4_P:
761 		clock = stm32mp1_read_pll_freq(priv, _PLL4, _DIV_P);
762 		break;
763 	case _PLL4_Q:
764 		clock = stm32mp1_read_pll_freq(priv, _PLL4, _DIV_Q);
765 		break;
766 	case _PLL4_R:
767 		clock = stm32mp1_read_pll_freq(priv, _PLL4, _DIV_R);
768 		break;
769 	/* Other */
770 	case _USB_PHY_48:
771 		clock = stm32mp1_clk_get_fixed(priv, _USB_PHY_48);
772 		break;
773 	default:
774 		break;
775 	}
776 
777 	return clock;
778 }
779 
780 bool stm32mp_clk_is_enabled(unsigned long id)
781 {
782 	struct stm32mp1_clk_priv *priv = &stm32mp1_clk_priv_data;
783 	const struct stm32mp1_clk_gate *gate = priv->data->gate;
784 	int i = stm32mp1_clk_get_id(priv, id);
785 
786 	if (i < 0) {
787 		return false;
788 	}
789 
790 	return ((mmio_read_32(priv->base + gate[i].offset) &
791 		 BIT(gate[i].bit)) != 0U);
792 }
793 
794 int stm32mp_clk_enable(unsigned long id)
795 {
796 	struct stm32mp1_clk_priv *priv = &stm32mp1_clk_priv_data;
797 	const struct stm32mp1_clk_gate *gate = priv->data->gate;
798 	int i = stm32mp1_clk_get_id(priv, id);
799 
800 	if (i < 0) {
801 		return i;
802 	}
803 
804 	if (gate[i].set_clr != 0U) {
805 		mmio_write_32(priv->base + gate[i].offset, BIT(gate[i].bit));
806 	} else {
807 		mmio_setbits_32(priv->base + gate[i].offset, BIT(gate[i].bit));
808 	}
809 
810 	return 0;
811 }
812 
813 int stm32mp_clk_disable(unsigned long id)
814 {
815 	struct stm32mp1_clk_priv *priv = &stm32mp1_clk_priv_data;
816 	const struct stm32mp1_clk_gate *gate = priv->data->gate;
817 	int i = stm32mp1_clk_get_id(priv, id);
818 
819 	if (i < 0) {
820 		return i;
821 	}
822 
823 	if (gate[i].set_clr != 0U) {
824 		mmio_write_32(priv->base + gate[i].offset
825 			      + RCC_MP_ENCLRR_OFFSET,
826 			      BIT(gate[i].bit));
827 	} else {
828 		mmio_clrbits_32(priv->base + gate[i].offset, BIT(gate[i].bit));
829 	}
830 
831 	return 0;
832 }
833 
834 unsigned long stm32mp_clk_get_rate(unsigned long id)
835 {
836 	struct stm32mp1_clk_priv *priv = &stm32mp1_clk_priv_data;
837 	int p = stm32mp1_clk_get_parent(priv, id);
838 	unsigned long rate;
839 
840 	if (p < 0) {
841 		return 0;
842 	}
843 
844 	rate = stm32mp1_clk_get(priv, p);
845 
846 	return rate;
847 }
848 
849 static void stm32mp1_ls_osc_set(int enable, uint32_t rcc, uint32_t offset,
850 				uint32_t mask_on)
851 {
852 	uint32_t address = rcc + offset;
853 
854 	if (enable != 0) {
855 		mmio_setbits_32(address, mask_on);
856 	} else {
857 		mmio_clrbits_32(address, mask_on);
858 	}
859 }
860 
861 static void stm32mp1_hs_ocs_set(int enable, uint32_t rcc, uint32_t mask_on)
862 {
863 	if (enable != 0) {
864 		mmio_setbits_32(rcc + RCC_OCENSETR, mask_on);
865 	} else {
866 		mmio_setbits_32(rcc + RCC_OCENCLRR, mask_on);
867 	}
868 }
869 
870 static int stm32mp1_osc_wait(int enable, uint32_t rcc, uint32_t offset,
871 			     uint32_t mask_rdy)
872 {
873 	uint64_t timeout;
874 	uint32_t mask_test;
875 	uint32_t address = rcc + offset;
876 
877 	if (enable != 0) {
878 		mask_test = mask_rdy;
879 	} else {
880 		mask_test = 0;
881 	}
882 
883 	timeout = timeout_init_us(OSCRDY_TIMEOUT);
884 	while ((mmio_read_32(address) & mask_rdy) != mask_test) {
885 		if (timeout_elapsed(timeout)) {
886 			ERROR("OSC %x @ %x timeout for enable=%d : 0x%x\n",
887 			      mask_rdy, address, enable, mmio_read_32(address));
888 			return -ETIMEDOUT;
889 		}
890 	}
891 
892 	return 0;
893 }
894 
895 static void stm32mp1_lse_enable(uint32_t rcc, bool bypass, uint32_t lsedrv)
896 {
897 	uint32_t value;
898 
899 	if (bypass) {
900 		mmio_setbits_32(rcc + RCC_BDCR, RCC_BDCR_LSEBYP);
901 	}
902 
903 	/*
904 	 * Warning: not recommended to switch directly from "high drive"
905 	 * to "medium low drive", and vice-versa.
906 	 */
907 	value = (mmio_read_32(rcc + RCC_BDCR) & RCC_BDCR_LSEDRV_MASK) >>
908 		RCC_BDCR_LSEDRV_SHIFT;
909 
910 	while (value != lsedrv) {
911 		if (value > lsedrv) {
912 			value--;
913 		} else {
914 			value++;
915 		}
916 
917 		mmio_clrsetbits_32(rcc + RCC_BDCR,
918 				   RCC_BDCR_LSEDRV_MASK,
919 				   value << RCC_BDCR_LSEDRV_SHIFT);
920 	}
921 
922 	stm32mp1_ls_osc_set(1, rcc, RCC_BDCR, RCC_BDCR_LSEON);
923 }
924 
925 static void stm32mp1_lse_wait(uint32_t rcc)
926 {
927 	if (stm32mp1_osc_wait(1, rcc, RCC_BDCR, RCC_BDCR_LSERDY) != 0) {
928 		VERBOSE("%s: failed\n", __func__);
929 	}
930 }
931 
932 static void stm32mp1_lsi_set(uint32_t rcc, int enable)
933 {
934 	stm32mp1_ls_osc_set(enable, rcc, RCC_RDLSICR, RCC_RDLSICR_LSION);
935 	if (stm32mp1_osc_wait(enable, rcc, RCC_RDLSICR, RCC_RDLSICR_LSIRDY) !=
936 	    0) {
937 		VERBOSE("%s: failed\n", __func__);
938 	}
939 }
940 
941 static void stm32mp1_hse_enable(uint32_t rcc, bool bypass, bool css)
942 {
943 	if (bypass) {
944 		mmio_setbits_32(rcc + RCC_OCENSETR, RCC_OCENR_HSEBYP);
945 	}
946 
947 	stm32mp1_hs_ocs_set(1, rcc, RCC_OCENR_HSEON);
948 	if (stm32mp1_osc_wait(1, rcc, RCC_OCRDYR, RCC_OCRDYR_HSERDY) !=
949 	    0) {
950 		VERBOSE("%s: failed\n", __func__);
951 	}
952 
953 	if (css) {
954 		mmio_setbits_32(rcc + RCC_OCENSETR, RCC_OCENR_HSECSSON);
955 	}
956 }
957 
958 static void stm32mp1_csi_set(uint32_t rcc, int enable)
959 {
960 	stm32mp1_ls_osc_set(enable, rcc, RCC_OCENSETR, RCC_OCENR_CSION);
961 	if (stm32mp1_osc_wait(enable, rcc, RCC_OCRDYR, RCC_OCRDYR_CSIRDY) !=
962 	    0) {
963 		VERBOSE("%s: failed\n", __func__);
964 	}
965 }
966 
967 static void stm32mp1_hsi_set(uint32_t rcc, int enable)
968 {
969 	stm32mp1_hs_ocs_set(enable, rcc, RCC_OCENR_HSION);
970 	if (stm32mp1_osc_wait(enable, rcc, RCC_OCRDYR, RCC_OCRDYR_HSIRDY) !=
971 	    0) {
972 		VERBOSE("%s: failed\n", __func__);
973 	}
974 }
975 
976 static int stm32mp1_set_hsidiv(uint32_t rcc, uint8_t hsidiv)
977 {
978 	uint32_t address = rcc + RCC_OCRDYR;
979 	uint64_t timeout;
980 
981 	mmio_clrsetbits_32(rcc + RCC_HSICFGR,
982 			   RCC_HSICFGR_HSIDIV_MASK,
983 			   RCC_HSICFGR_HSIDIV_MASK & (uint32_t)hsidiv);
984 
985 	timeout = timeout_init_us(HSIDIV_TIMEOUT);
986 	while ((mmio_read_32(address) & RCC_OCRDYR_HSIDIVRDY) == 0U) {
987 		if (timeout_elapsed(timeout)) {
988 			ERROR("HSIDIV failed @ 0x%x: 0x%x\n",
989 			      address, mmio_read_32(address));
990 			return -ETIMEDOUT;
991 		}
992 	}
993 
994 	return 0;
995 }
996 
997 static int stm32mp1_hsidiv(uint32_t rcc, unsigned long hsifreq)
998 {
999 	uint8_t hsidiv;
1000 	uint32_t hsidivfreq = MAX_HSI_HZ;
1001 
1002 	for (hsidiv = 0; hsidiv < 4U; hsidiv++) {
1003 		if (hsidivfreq == hsifreq) {
1004 			break;
1005 		}
1006 
1007 		hsidivfreq /= 2U;
1008 	}
1009 
1010 	if (hsidiv == 4U) {
1011 		ERROR("Invalid clk-hsi frequency\n");
1012 		return -1;
1013 	}
1014 
1015 	if (hsidiv != 0U) {
1016 		return stm32mp1_set_hsidiv(rcc, hsidiv);
1017 	}
1018 
1019 	return 0;
1020 }
1021 
1022 static void stm32mp1_pll_start(struct stm32mp1_clk_priv *priv,
1023 			       enum stm32mp1_pll_id pll_id)
1024 {
1025 	const struct stm32mp1_clk_pll *pll = priv->data->pll;
1026 
1027 	mmio_write_32(priv->base + pll[pll_id].pllxcr, RCC_PLLNCR_PLLON);
1028 }
1029 
1030 static int stm32mp1_pll_output(struct stm32mp1_clk_priv *priv,
1031 			       enum stm32mp1_pll_id pll_id, uint32_t output)
1032 {
1033 	const struct stm32mp1_clk_pll *pll = priv->data->pll;
1034 	uint32_t pllxcr = priv->base + pll[pll_id].pllxcr;
1035 	uint64_t timeout = timeout_init_us(PLLRDY_TIMEOUT);
1036 
1037 	/* Wait PLL lock */
1038 	while ((mmio_read_32(pllxcr) & RCC_PLLNCR_PLLRDY) == 0U) {
1039 		if (timeout_elapsed(timeout)) {
1040 			ERROR("PLL%d start failed @ 0x%x: 0x%x\n",
1041 			      pll_id, pllxcr, mmio_read_32(pllxcr));
1042 			return -ETIMEDOUT;
1043 		}
1044 	}
1045 
1046 	/* Start the requested output */
1047 	mmio_setbits_32(pllxcr, output << RCC_PLLNCR_DIVEN_SHIFT);
1048 
1049 	return 0;
1050 }
1051 
1052 static int stm32mp1_pll_stop(struct stm32mp1_clk_priv *priv,
1053 			     enum stm32mp1_pll_id pll_id)
1054 {
1055 	const struct stm32mp1_clk_pll *pll = priv->data->pll;
1056 	uint32_t pllxcr = priv->base + pll[pll_id].pllxcr;
1057 	uint64_t timeout;
1058 
1059 	/* Stop all output */
1060 	mmio_clrbits_32(pllxcr, RCC_PLLNCR_DIVPEN | RCC_PLLNCR_DIVQEN |
1061 			RCC_PLLNCR_DIVREN);
1062 
1063 	/* Stop PLL */
1064 	mmio_clrbits_32(pllxcr, RCC_PLLNCR_PLLON);
1065 
1066 	timeout = timeout_init_us(PLLRDY_TIMEOUT);
1067 	/* Wait PLL stopped */
1068 	while ((mmio_read_32(pllxcr) & RCC_PLLNCR_PLLRDY) != 0U) {
1069 		if (timeout_elapsed(timeout)) {
1070 			ERROR("PLL%d stop failed @ 0x%x: 0x%x\n",
1071 			      pll_id, pllxcr, mmio_read_32(pllxcr));
1072 			return -ETIMEDOUT;
1073 		}
1074 	}
1075 
1076 	return 0;
1077 }
1078 
1079 static void stm32mp1_pll_config_output(struct stm32mp1_clk_priv *priv,
1080 				       enum stm32mp1_pll_id pll_id,
1081 				       uint32_t *pllcfg)
1082 {
1083 	const struct stm32mp1_clk_pll *pll = priv->data->pll;
1084 	uint32_t rcc = priv->base;
1085 	uint32_t value;
1086 
1087 	value = (pllcfg[PLLCFG_P] << RCC_PLLNCFGR2_DIVP_SHIFT) &
1088 		RCC_PLLNCFGR2_DIVP_MASK;
1089 	value |= (pllcfg[PLLCFG_Q] << RCC_PLLNCFGR2_DIVQ_SHIFT) &
1090 		 RCC_PLLNCFGR2_DIVQ_MASK;
1091 	value |= (pllcfg[PLLCFG_R] << RCC_PLLNCFGR2_DIVR_SHIFT) &
1092 		 RCC_PLLNCFGR2_DIVR_MASK;
1093 	mmio_write_32(rcc + pll[pll_id].pllxcfgr2, value);
1094 }
1095 
1096 static int stm32mp1_pll_config(struct stm32mp1_clk_priv *priv,
1097 			       enum stm32mp1_pll_id pll_id,
1098 			       uint32_t *pllcfg, uint32_t fracv)
1099 {
1100 	const struct stm32mp1_clk_pll *pll = priv->data->pll;
1101 	uint32_t rcc = priv->base;
1102 	enum stm32mp1_plltype type = pll[pll_id].plltype;
1103 	unsigned long refclk;
1104 	uint32_t ifrge = 0;
1105 	uint32_t src, value;
1106 
1107 	src = mmio_read_32(priv->base + pll[pll_id].rckxselr) &
1108 		RCC_SELR_REFCLK_SRC_MASK;
1109 
1110 	refclk = stm32mp1_clk_get_fixed(priv, pll[pll_id].refclk[src]) /
1111 		 (pllcfg[PLLCFG_M] + 1U);
1112 
1113 	if ((refclk < (stm32mp1_pll[type].refclk_min * 1000000U)) ||
1114 	    (refclk > (stm32mp1_pll[type].refclk_max * 1000000U))) {
1115 		return -EINVAL;
1116 	}
1117 
1118 	if ((type == PLL_800) && (refclk >= 8000000U)) {
1119 		ifrge = 1U;
1120 	}
1121 
1122 	value = (pllcfg[PLLCFG_N] << RCC_PLLNCFGR1_DIVN_SHIFT) &
1123 		RCC_PLLNCFGR1_DIVN_MASK;
1124 	value |= (pllcfg[PLLCFG_M] << RCC_PLLNCFGR1_DIVM_SHIFT) &
1125 		 RCC_PLLNCFGR1_DIVM_MASK;
1126 	value |= (ifrge << RCC_PLLNCFGR1_IFRGE_SHIFT) &
1127 		 RCC_PLLNCFGR1_IFRGE_MASK;
1128 	mmio_write_32(rcc + pll[pll_id].pllxcfgr1, value);
1129 
1130 	/* Fractional configuration */
1131 	value = 0;
1132 	mmio_write_32(rcc + pll[pll_id].pllxfracr, value);
1133 
1134 	value = fracv << RCC_PLLNFRACR_FRACV_SHIFT;
1135 	mmio_write_32(rcc + pll[pll_id].pllxfracr, value);
1136 
1137 	value |= RCC_PLLNFRACR_FRACLE;
1138 	mmio_write_32(rcc + pll[pll_id].pllxfracr, value);
1139 
1140 	stm32mp1_pll_config_output(priv, pll_id, pllcfg);
1141 
1142 	return 0;
1143 }
1144 
1145 static void stm32mp1_pll_csg(struct stm32mp1_clk_priv *priv,
1146 			     enum stm32mp1_pll_id pll_id,
1147 			     uint32_t *csg)
1148 {
1149 	const struct stm32mp1_clk_pll *pll = priv->data->pll;
1150 	uint32_t pllxcsg = 0;
1151 
1152 	pllxcsg |= (csg[PLLCSG_MOD_PER] << RCC_PLLNCSGR_MOD_PER_SHIFT) &
1153 		    RCC_PLLNCSGR_MOD_PER_MASK;
1154 
1155 	pllxcsg |= (csg[PLLCSG_INC_STEP] << RCC_PLLNCSGR_INC_STEP_SHIFT) &
1156 		    RCC_PLLNCSGR_INC_STEP_MASK;
1157 
1158 	pllxcsg |= (csg[PLLCSG_SSCG_MODE] << RCC_PLLNCSGR_SSCG_MODE_SHIFT) &
1159 		    RCC_PLLNCSGR_SSCG_MODE_MASK;
1160 
1161 	mmio_write_32(priv->base + pll[pll_id].pllxcsgr, pllxcsg);
1162 }
1163 
1164 static int stm32mp1_set_clksrc(struct stm32mp1_clk_priv *priv,
1165 			       unsigned int clksrc)
1166 {
1167 	uint32_t address = priv->base + (clksrc >> 4);
1168 	uint64_t timeout;
1169 
1170 	mmio_clrsetbits_32(address, RCC_SELR_SRC_MASK,
1171 			   clksrc & RCC_SELR_SRC_MASK);
1172 
1173 	timeout = timeout_init_us(CLKSRC_TIMEOUT);
1174 	while ((mmio_read_32(address) & RCC_SELR_SRCRDY) == 0U) {
1175 		if (timeout_elapsed(timeout)) {
1176 			ERROR("CLKSRC %x start failed @ 0x%x: 0x%x\n",
1177 			      clksrc, address, mmio_read_32(address));
1178 			return -ETIMEDOUT;
1179 		}
1180 	}
1181 
1182 	return 0;
1183 }
1184 
1185 static int stm32mp1_set_clkdiv(unsigned int clkdiv, uint32_t address)
1186 {
1187 	uint64_t timeout;
1188 
1189 	mmio_clrsetbits_32(address, RCC_DIVR_DIV_MASK,
1190 			   clkdiv & RCC_DIVR_DIV_MASK);
1191 
1192 	timeout = timeout_init_us(CLKDIV_TIMEOUT);
1193 	while ((mmio_read_32(address) & RCC_DIVR_DIVRDY) == 0U) {
1194 		if (timeout_elapsed(timeout)) {
1195 			ERROR("CLKDIV %x start failed @ 0x%x: 0x%x\n",
1196 			      clkdiv, address, mmio_read_32(address));
1197 			return -ETIMEDOUT;
1198 		}
1199 	}
1200 
1201 	return 0;
1202 }
1203 
1204 static void stm32mp1_mco_csg(struct stm32mp1_clk_priv *priv,
1205 			     uint32_t clksrc, uint32_t clkdiv)
1206 {
1207 	uint32_t address = priv->base + (clksrc >> 4);
1208 
1209 	/*
1210 	 * Binding clksrc :
1211 	 *      bit15-4 offset
1212 	 *      bit3:   disable
1213 	 *      bit2-0: MCOSEL[2:0]
1214 	 */
1215 	if ((clksrc & 0x8U) != 0U) {
1216 		mmio_clrbits_32(address, RCC_MCOCFG_MCOON);
1217 	} else {
1218 		mmio_clrsetbits_32(address,
1219 				   RCC_MCOCFG_MCOSRC_MASK,
1220 				   clksrc & RCC_MCOCFG_MCOSRC_MASK);
1221 		mmio_clrsetbits_32(address,
1222 				   RCC_MCOCFG_MCODIV_MASK,
1223 				   clkdiv << RCC_MCOCFG_MCODIV_SHIFT);
1224 		mmio_setbits_32(address, RCC_MCOCFG_MCOON);
1225 	}
1226 }
1227 
1228 static void stm32mp1_set_rtcsrc(struct stm32mp1_clk_priv *priv,
1229 				unsigned int clksrc, bool lse_css)
1230 {
1231 	uint32_t address = priv->base + RCC_BDCR;
1232 
1233 	if (((mmio_read_32(address) & RCC_BDCR_RTCCKEN) == 0U) ||
1234 	    (clksrc != (uint32_t)CLK_RTC_DISABLED)) {
1235 		mmio_clrsetbits_32(address,
1236 				   RCC_BDCR_RTCSRC_MASK,
1237 				   clksrc << RCC_BDCR_RTCSRC_SHIFT);
1238 
1239 		mmio_setbits_32(address, RCC_BDCR_RTCCKEN);
1240 	}
1241 
1242 	if (lse_css) {
1243 		mmio_setbits_32(address, RCC_BDCR_LSECSSON);
1244 	}
1245 }
1246 
1247 #define CNTCVL_OFF	0x008
1248 #define CNTCVU_OFF	0x00C
1249 
1250 static void stm32mp1_stgen_config(struct stm32mp1_clk_priv *priv)
1251 {
1252 	uintptr_t stgen;
1253 	int p;
1254 	uint32_t cntfid0;
1255 	unsigned long rate;
1256 
1257 	stgen = fdt_get_stgen_base();
1258 
1259 	cntfid0 = mmio_read_32(stgen + CNTFID_OFF);
1260 	p = stm32mp1_clk_get_parent(priv, STGEN_K);
1261 	rate = stm32mp1_clk_get(priv, p);
1262 
1263 	if (cntfid0 != rate) {
1264 		unsigned long long counter;
1265 
1266 		mmio_clrbits_32(stgen + CNTCR_OFF, CNTCR_EN);
1267 		counter = (unsigned long long)
1268 			mmio_read_32(stgen + CNTCVL_OFF);
1269 		counter |= ((unsigned long long)
1270 			    (mmio_read_32(stgen + CNTCVU_OFF))) << 32;
1271 		counter = (counter * rate / cntfid0);
1272 		mmio_write_32(stgen + CNTCVL_OFF, (uint32_t)counter);
1273 		mmio_write_32(stgen + CNTCVU_OFF, (uint32_t)(counter >> 32));
1274 		mmio_write_32(stgen + CNTFID_OFF, rate);
1275 		mmio_setbits_32(stgen + CNTCR_OFF, CNTCR_EN);
1276 
1277 		write_cntfrq((u_register_t)rate);
1278 
1279 		/* Need to update timer with new frequency */
1280 		generic_delay_timer_init();
1281 	}
1282 }
1283 
1284 void stm32mp1_stgen_increment(unsigned long long offset_in_ms)
1285 {
1286 	uintptr_t stgen;
1287 	unsigned long long cnt;
1288 
1289 	stgen = fdt_get_stgen_base();
1290 
1291 	cnt = ((unsigned long long)mmio_read_32(stgen + CNTCVU_OFF) << 32) |
1292 		mmio_read_32(stgen + CNTCVL_OFF);
1293 
1294 	cnt += (offset_in_ms * mmio_read_32(stgen + CNTFID_OFF)) / 1000U;
1295 
1296 	mmio_clrbits_32(stgen + CNTCR_OFF, CNTCR_EN);
1297 	mmio_write_32(stgen + CNTCVL_OFF, (uint32_t)cnt);
1298 	mmio_write_32(stgen + CNTCVU_OFF, (uint32_t)(cnt >> 32));
1299 	mmio_setbits_32(stgen + CNTCR_OFF, CNTCR_EN);
1300 }
1301 
1302 static void stm32mp1_pkcs_config(struct stm32mp1_clk_priv *priv, uint32_t pkcs)
1303 {
1304 	uint32_t address = priv->base + ((pkcs >> 4) & 0xFFFU);
1305 	uint32_t value = pkcs & 0xFU;
1306 	uint32_t mask = 0xFU;
1307 
1308 	if ((pkcs & BIT(31)) != 0U) {
1309 		mask <<= 4;
1310 		value <<= 4;
1311 	}
1312 
1313 	mmio_clrsetbits_32(address, mask, value);
1314 }
1315 
1316 int stm32mp1_clk_init(void)
1317 {
1318 	struct stm32mp1_clk_priv *priv = &stm32mp1_clk_priv_data;
1319 	uint32_t rcc = priv->base;
1320 	unsigned int clksrc[CLKSRC_NB];
1321 	unsigned int clkdiv[CLKDIV_NB];
1322 	unsigned int pllcfg[_PLL_NB][PLLCFG_NB];
1323 	int plloff[_PLL_NB];
1324 	int ret, len;
1325 	enum stm32mp1_pll_id i;
1326 	bool lse_css = false;
1327 	const fdt32_t *pkcs_cell;
1328 
1329 	/* Check status field to disable security */
1330 	if (!fdt_get_rcc_secure_status()) {
1331 		mmio_write_32(rcc + RCC_TZCR, 0);
1332 	}
1333 
1334 	ret = fdt_rcc_read_uint32_array("st,clksrc", clksrc,
1335 					(uint32_t)CLKSRC_NB);
1336 	if (ret < 0) {
1337 		return -FDT_ERR_NOTFOUND;
1338 	}
1339 
1340 	ret = fdt_rcc_read_uint32_array("st,clkdiv", clkdiv,
1341 					(uint32_t)CLKDIV_NB);
1342 	if (ret < 0) {
1343 		return -FDT_ERR_NOTFOUND;
1344 	}
1345 
1346 	for (i = (enum stm32mp1_pll_id)0; i < _PLL_NB; i++) {
1347 		char name[12];
1348 
1349 		snprintf(name, sizeof(name), "st,pll@%d", i);
1350 		plloff[i] = fdt_rcc_subnode_offset(name);
1351 
1352 		if (!fdt_check_node(plloff[i])) {
1353 			continue;
1354 		}
1355 
1356 		ret = fdt_read_uint32_array(plloff[i], "cfg",
1357 					    pllcfg[i], (int)PLLCFG_NB);
1358 		if (ret < 0) {
1359 			return -FDT_ERR_NOTFOUND;
1360 		}
1361 	}
1362 
1363 	stm32mp1_mco_csg(priv, clksrc[CLKSRC_MCO1], clkdiv[CLKDIV_MCO1]);
1364 	stm32mp1_mco_csg(priv, clksrc[CLKSRC_MCO2], clkdiv[CLKDIV_MCO2]);
1365 
1366 	/*
1367 	 * Switch ON oscillator found in device-tree.
1368 	 * Note: HSI already ON after BootROM stage.
1369 	 */
1370 	if (priv->osc[_LSI] != 0U) {
1371 		stm32mp1_lsi_set(rcc, 1);
1372 	}
1373 	if (priv->osc[_LSE] != 0U) {
1374 		bool bypass;
1375 		uint32_t lsedrv;
1376 
1377 		bypass = fdt_osc_read_bool(_LSE, "st,bypass");
1378 		lse_css = fdt_osc_read_bool(_LSE, "st,css");
1379 		lsedrv = fdt_osc_read_uint32_default(_LSE, "st,drive",
1380 						     LSEDRV_MEDIUM_HIGH);
1381 		stm32mp1_lse_enable(rcc, bypass, lsedrv);
1382 	}
1383 	if (priv->osc[_HSE] != 0U) {
1384 		bool bypass, css;
1385 
1386 		bypass = fdt_osc_read_bool(_LSE, "st,bypass");
1387 		css = fdt_osc_read_bool(_LSE, "st,css");
1388 		stm32mp1_hse_enable(rcc, bypass, css);
1389 	}
1390 	/*
1391 	 * CSI is mandatory for automatic I/O compensation (SYSCFG_CMPCR)
1392 	 * => switch on CSI even if node is not present in device tree
1393 	 */
1394 	stm32mp1_csi_set(rcc, 1);
1395 
1396 	/* Come back to HSI */
1397 	ret = stm32mp1_set_clksrc(priv, CLK_MPU_HSI);
1398 	if (ret != 0) {
1399 		return ret;
1400 	}
1401 	ret = stm32mp1_set_clksrc(priv, CLK_AXI_HSI);
1402 	if (ret != 0) {
1403 		return ret;
1404 	}
1405 
1406 	for (i = (enum stm32mp1_pll_id)0; i < _PLL_NB; i++) {
1407 		if (i == _PLL4)
1408 			continue;
1409 		ret = stm32mp1_pll_stop(priv, i);
1410 		if (ret != 0) {
1411 			return ret;
1412 		}
1413 	}
1414 
1415 	/* Configure HSIDIV */
1416 	if (priv->osc[_HSI] != 0U) {
1417 		ret = stm32mp1_hsidiv(rcc, priv->osc[_HSI]);
1418 		if (ret != 0) {
1419 			return ret;
1420 		}
1421 		stm32mp1_stgen_config(priv);
1422 	}
1423 
1424 	/* Select DIV */
1425 	/* No ready bit when MPUSRC != CLK_MPU_PLL1P_DIV, MPUDIV is disabled */
1426 	mmio_write_32(rcc + RCC_MPCKDIVR,
1427 		      clkdiv[CLKDIV_MPU] & RCC_DIVR_DIV_MASK);
1428 	ret = stm32mp1_set_clkdiv(clkdiv[CLKDIV_AXI], rcc + RCC_AXIDIVR);
1429 	if (ret != 0) {
1430 		return ret;
1431 	}
1432 	ret = stm32mp1_set_clkdiv(clkdiv[CLKDIV_APB4], rcc + RCC_APB4DIVR);
1433 	if (ret != 0) {
1434 		return ret;
1435 	}
1436 	ret = stm32mp1_set_clkdiv(clkdiv[CLKDIV_APB5], rcc + RCC_APB5DIVR);
1437 	if (ret != 0) {
1438 		return ret;
1439 	}
1440 	ret = stm32mp1_set_clkdiv(clkdiv[CLKDIV_APB1], rcc + RCC_APB1DIVR);
1441 	if (ret != 0) {
1442 		return ret;
1443 	}
1444 	ret = stm32mp1_set_clkdiv(clkdiv[CLKDIV_APB2], rcc + RCC_APB2DIVR);
1445 	if (ret != 0) {
1446 		return ret;
1447 	}
1448 	ret = stm32mp1_set_clkdiv(clkdiv[CLKDIV_APB3], rcc + RCC_APB3DIVR);
1449 	if (ret != 0) {
1450 		return ret;
1451 	}
1452 
1453 	/* No ready bit for RTC */
1454 	mmio_write_32(rcc + RCC_RTCDIVR,
1455 		      clkdiv[CLKDIV_RTC] & RCC_DIVR_DIV_MASK);
1456 
1457 	/* Configure PLLs source */
1458 	ret = stm32mp1_set_clksrc(priv, clksrc[CLKSRC_PLL12]);
1459 	if (ret != 0) {
1460 		return ret;
1461 	}
1462 	ret = stm32mp1_set_clksrc(priv, clksrc[CLKSRC_PLL3]);
1463 	if (ret != 0) {
1464 		return ret;
1465 	}
1466 
1467 	ret = stm32mp1_set_clksrc(priv, clksrc[CLKSRC_PLL4]);
1468 	if (ret != 0) {
1469 		return ret;
1470 	}
1471 
1472 	/* Configure and start PLLs */
1473 	for (i = (enum stm32mp1_pll_id)0; i < _PLL_NB; i++) {
1474 		uint32_t fracv;
1475 		uint32_t csg[PLLCSG_NB];
1476 
1477 		if (!fdt_check_node(plloff[i])) {
1478 			continue;
1479 		}
1480 
1481 		fracv = fdt_read_uint32_default(plloff[i], "frac", 0);
1482 
1483 		ret = stm32mp1_pll_config(priv, i, pllcfg[i], fracv);
1484 		if (ret != 0) {
1485 			return ret;
1486 		}
1487 		ret = fdt_read_uint32_array(plloff[i], "csg", csg,
1488 					    (uint32_t)PLLCSG_NB);
1489 		if (ret == 0) {
1490 			stm32mp1_pll_csg(priv, i, csg);
1491 		} else if (ret != -FDT_ERR_NOTFOUND) {
1492 			return ret;
1493 		}
1494 
1495 		stm32mp1_pll_start(priv, i);
1496 	}
1497 	/* Wait and start PLLs ouptut when ready */
1498 	for (i = (enum stm32mp1_pll_id)0; i < _PLL_NB; i++) {
1499 		if (!fdt_check_node(plloff[i])) {
1500 			continue;
1501 		}
1502 
1503 		ret = stm32mp1_pll_output(priv, i, pllcfg[i][PLLCFG_O]);
1504 		if (ret != 0) {
1505 			return ret;
1506 		}
1507 	}
1508 	/* Wait LSE ready before to use it */
1509 	if (priv->osc[_LSE] != 0U) {
1510 		stm32mp1_lse_wait(rcc);
1511 	}
1512 
1513 	/* Configure with expected clock source */
1514 	ret = stm32mp1_set_clksrc(priv, clksrc[CLKSRC_MPU]);
1515 	if (ret != 0) {
1516 		return ret;
1517 	}
1518 	ret = stm32mp1_set_clksrc(priv, clksrc[CLKSRC_AXI]);
1519 	if (ret != 0) {
1520 		return ret;
1521 	}
1522 	stm32mp1_set_rtcsrc(priv, clksrc[CLKSRC_RTC], lse_css);
1523 
1524 	/* Configure PKCK */
1525 	pkcs_cell = fdt_rcc_read_prop("st,pkcs", &len);
1526 	if (pkcs_cell != NULL) {
1527 		bool ckper_disabled = false;
1528 		uint32_t j;
1529 
1530 		priv->pkcs_usb_value = 0;
1531 
1532 		for (j = 0; j < ((uint32_t)len / sizeof(uint32_t)); j++) {
1533 			uint32_t pkcs = fdt32_to_cpu(pkcs_cell[j]);
1534 
1535 			if (pkcs == (uint32_t)CLK_CKPER_DISABLED) {
1536 				ckper_disabled = true;
1537 				continue;
1538 			}
1539 			stm32mp1_pkcs_config(priv, pkcs);
1540 		}
1541 
1542 		/*
1543 		 * CKPER is source for some peripheral clocks
1544 		 * (FMC-NAND / QPSI-NOR) and switching source is allowed
1545 		 * only if previous clock is still ON
1546 		 * => deactivated CKPER only after switching clock
1547 		 */
1548 		if (ckper_disabled) {
1549 			stm32mp1_pkcs_config(priv, CLK_CKPER_DISABLED);
1550 		}
1551 	}
1552 
1553 	/* Switch OFF HSI if not found in device-tree */
1554 	if (priv->osc[_HSI] == 0U) {
1555 		stm32mp1_hsi_set(rcc, 0);
1556 	}
1557 	stm32mp1_stgen_config(priv);
1558 
1559 	/* Software Self-Refresh mode (SSR) during DDR initilialization */
1560 	mmio_clrsetbits_32(priv->base + RCC_DDRITFCR,
1561 			   RCC_DDRITFCR_DDRCKMOD_MASK,
1562 			   RCC_DDRITFCR_DDRCKMOD_SSR <<
1563 			   RCC_DDRITFCR_DDRCKMOD_SHIFT);
1564 
1565 	return 0;
1566 }
1567 
1568 static void stm32mp1_osc_clk_init(const char *name,
1569 				  struct stm32mp1_clk_priv *priv,
1570 				  enum stm32mp_osc_id index)
1571 {
1572 	uint32_t frequency;
1573 
1574 	priv->osc[index] = 0;
1575 
1576 	if (fdt_osc_read_freq(name, &frequency) != 0) {
1577 		ERROR("%s frequency request failed\n", name);
1578 		panic();
1579 	} else {
1580 		priv->osc[index] = frequency;
1581 	}
1582 }
1583 
1584 static void stm32mp1_osc_init(void)
1585 {
1586 	struct stm32mp1_clk_priv *priv = &stm32mp1_clk_priv_data;
1587 	enum stm32mp_osc_id i;
1588 
1589 	for (i = (enum stm32mp_osc_id)0 ; i < NB_OSC; i++) {
1590 		stm32mp1_osc_clk_init(stm32mp_osc_node_label[i], priv, i);
1591 	}
1592 }
1593 
1594 int stm32mp1_clk_probe(void)
1595 {
1596 	struct stm32mp1_clk_priv *priv = &stm32mp1_clk_priv_data;
1597 
1598 	priv->base = fdt_rcc_read_addr();
1599 	if (priv->base == 0U) {
1600 		return -EINVAL;
1601 	}
1602 
1603 	priv->data = &stm32mp1_data;
1604 
1605 	if ((priv->data->gate == NULL) || (priv->data->sel == NULL) ||
1606 	    (priv->data->pll == NULL)) {
1607 		return -EINVAL;
1608 	}
1609 
1610 	stm32mp1_osc_init();
1611 
1612 	return 0;
1613 }
1614