xref: /rk3399_rockchip-uboot/arch/arm/mach-socfpga/clock_manager_arria10.c (revision 753a4dde970c2bc9022321f1093e544e3a150f6e)
1*177ba1f9SLey Foon Tan /*
2*177ba1f9SLey Foon Tan  * Copyright (C) 2016-2017 Intel Corporation
3*177ba1f9SLey Foon Tan  *
4*177ba1f9SLey Foon Tan  * SPDX-License-Identifier:    GPL-2.0
5*177ba1f9SLey Foon Tan  */
6*177ba1f9SLey Foon Tan 
7*177ba1f9SLey Foon Tan #include <common.h>
8*177ba1f9SLey Foon Tan #include <fdtdec.h>
9*177ba1f9SLey Foon Tan #include <asm/io.h>
10*177ba1f9SLey Foon Tan #include <asm/arch/clock_manager.h>
11*177ba1f9SLey Foon Tan 
12*177ba1f9SLey Foon Tan DECLARE_GLOBAL_DATA_PTR;
13*177ba1f9SLey Foon Tan 
14*177ba1f9SLey Foon Tan static u32 eosc1_hz;
15*177ba1f9SLey Foon Tan static u32 cb_intosc_hz;
16*177ba1f9SLey Foon Tan static u32 f2s_free_hz;
17*177ba1f9SLey Foon Tan static u32 cm_l4_main_clk_hz;
18*177ba1f9SLey Foon Tan static u32 cm_l4_sp_clk_hz;
19*177ba1f9SLey Foon Tan static u32 cm_l4_mp_clk_hz;
20*177ba1f9SLey Foon Tan static u32 cm_l4_sys_free_clk_hz;
21*177ba1f9SLey Foon Tan 
22*177ba1f9SLey Foon Tan struct mainpll_cfg {
23*177ba1f9SLey Foon Tan 	u32 vco0_psrc;
24*177ba1f9SLey Foon Tan 	u32 vco1_denom;
25*177ba1f9SLey Foon Tan 	u32 vco1_numer;
26*177ba1f9SLey Foon Tan 	u32 mpuclk;
27*177ba1f9SLey Foon Tan 	u32 mpuclk_cnt;
28*177ba1f9SLey Foon Tan 	u32 mpuclk_src;
29*177ba1f9SLey Foon Tan 	u32 nocclk;
30*177ba1f9SLey Foon Tan 	u32 nocclk_cnt;
31*177ba1f9SLey Foon Tan 	u32 nocclk_src;
32*177ba1f9SLey Foon Tan 	u32 cntr2clk_cnt;
33*177ba1f9SLey Foon Tan 	u32 cntr3clk_cnt;
34*177ba1f9SLey Foon Tan 	u32 cntr4clk_cnt;
35*177ba1f9SLey Foon Tan 	u32 cntr5clk_cnt;
36*177ba1f9SLey Foon Tan 	u32 cntr6clk_cnt;
37*177ba1f9SLey Foon Tan 	u32 cntr7clk_cnt;
38*177ba1f9SLey Foon Tan 	u32 cntr7clk_src;
39*177ba1f9SLey Foon Tan 	u32 cntr8clk_cnt;
40*177ba1f9SLey Foon Tan 	u32 cntr9clk_cnt;
41*177ba1f9SLey Foon Tan 	u32 cntr9clk_src;
42*177ba1f9SLey Foon Tan 	u32 cntr15clk_cnt;
43*177ba1f9SLey Foon Tan 	u32 nocdiv_l4mainclk;
44*177ba1f9SLey Foon Tan 	u32 nocdiv_l4mpclk;
45*177ba1f9SLey Foon Tan 	u32 nocdiv_l4spclk;
46*177ba1f9SLey Foon Tan 	u32 nocdiv_csatclk;
47*177ba1f9SLey Foon Tan 	u32 nocdiv_cstraceclk;
48*177ba1f9SLey Foon Tan 	u32 nocdiv_cspdbclk;
49*177ba1f9SLey Foon Tan };
50*177ba1f9SLey Foon Tan 
51*177ba1f9SLey Foon Tan struct perpll_cfg {
52*177ba1f9SLey Foon Tan 	u32 vco0_psrc;
53*177ba1f9SLey Foon Tan 	u32 vco1_denom;
54*177ba1f9SLey Foon Tan 	u32 vco1_numer;
55*177ba1f9SLey Foon Tan 	u32 cntr2clk_cnt;
56*177ba1f9SLey Foon Tan 	u32 cntr2clk_src;
57*177ba1f9SLey Foon Tan 	u32 cntr3clk_cnt;
58*177ba1f9SLey Foon Tan 	u32 cntr3clk_src;
59*177ba1f9SLey Foon Tan 	u32 cntr4clk_cnt;
60*177ba1f9SLey Foon Tan 	u32 cntr4clk_src;
61*177ba1f9SLey Foon Tan 	u32 cntr5clk_cnt;
62*177ba1f9SLey Foon Tan 	u32 cntr5clk_src;
63*177ba1f9SLey Foon Tan 	u32 cntr6clk_cnt;
64*177ba1f9SLey Foon Tan 	u32 cntr6clk_src;
65*177ba1f9SLey Foon Tan 	u32 cntr7clk_cnt;
66*177ba1f9SLey Foon Tan 	u32 cntr8clk_cnt;
67*177ba1f9SLey Foon Tan 	u32 cntr8clk_src;
68*177ba1f9SLey Foon Tan 	u32 cntr9clk_cnt;
69*177ba1f9SLey Foon Tan 	u32 emacctl_emac0sel;
70*177ba1f9SLey Foon Tan 	u32 emacctl_emac1sel;
71*177ba1f9SLey Foon Tan 	u32 emacctl_emac2sel;
72*177ba1f9SLey Foon Tan 	u32 gpiodiv_gpiodbclk;
73*177ba1f9SLey Foon Tan };
74*177ba1f9SLey Foon Tan 
75*177ba1f9SLey Foon Tan struct alteragrp_cfg {
76*177ba1f9SLey Foon Tan 	u32 nocclk;
77*177ba1f9SLey Foon Tan 	u32 mpuclk;
78*177ba1f9SLey Foon Tan };
79*177ba1f9SLey Foon Tan 
80*177ba1f9SLey Foon Tan static const struct socfpga_clock_manager *clock_manager_base =
81*177ba1f9SLey Foon Tan 	(struct socfpga_clock_manager *)SOCFPGA_CLKMGR_ADDRESS;
82*177ba1f9SLey Foon Tan 
of_to_struct(const void * blob,int node,int cfg_len,void * cfg)83*177ba1f9SLey Foon Tan static int of_to_struct(const void *blob, int node, int cfg_len, void *cfg)
84*177ba1f9SLey Foon Tan {
85*177ba1f9SLey Foon Tan 	if (fdtdec_get_int_array(blob, node, "altr,of_reg_value",
86*177ba1f9SLey Foon Tan 				 (u32 *)cfg, cfg_len)) {
87*177ba1f9SLey Foon Tan 		/* could not find required property */
88*177ba1f9SLey Foon Tan 		return -EINVAL;
89*177ba1f9SLey Foon Tan 	}
90*177ba1f9SLey Foon Tan 
91*177ba1f9SLey Foon Tan 	return 0;
92*177ba1f9SLey Foon Tan }
93*177ba1f9SLey Foon Tan 
of_get_input_clks(const void * blob,int node,u32 * val)94*177ba1f9SLey Foon Tan static int of_get_input_clks(const void *blob, int node, u32 *val)
95*177ba1f9SLey Foon Tan {
96*177ba1f9SLey Foon Tan 	*val = fdtdec_get_uint(blob, node, "clock-frequency", 0);
97*177ba1f9SLey Foon Tan 	if (!*val)
98*177ba1f9SLey Foon Tan 		return -EINVAL;
99*177ba1f9SLey Foon Tan 
100*177ba1f9SLey Foon Tan 	return 0;
101*177ba1f9SLey Foon Tan }
102*177ba1f9SLey Foon Tan 
of_get_clk_cfg(const void * blob,struct mainpll_cfg * main_cfg,struct perpll_cfg * per_cfg,struct alteragrp_cfg * altrgrp_cfg)103*177ba1f9SLey Foon Tan static int of_get_clk_cfg(const void *blob, struct mainpll_cfg *main_cfg,
104*177ba1f9SLey Foon Tan 			  struct perpll_cfg *per_cfg,
105*177ba1f9SLey Foon Tan 			  struct alteragrp_cfg *altrgrp_cfg)
106*177ba1f9SLey Foon Tan {
107*177ba1f9SLey Foon Tan 	int node, child, len;
108*177ba1f9SLey Foon Tan 	const char *node_name;
109*177ba1f9SLey Foon Tan 
110*177ba1f9SLey Foon Tan 	node = fdtdec_next_compatible(blob, 0, COMPAT_ALTERA_SOCFPGA_CLK);
111*177ba1f9SLey Foon Tan 	if (node < 0)
112*177ba1f9SLey Foon Tan 		return -EINVAL;
113*177ba1f9SLey Foon Tan 
114*177ba1f9SLey Foon Tan 	child = fdt_first_subnode(blob, node);
115*177ba1f9SLey Foon Tan 	if (child < 0)
116*177ba1f9SLey Foon Tan 		return -EINVAL;
117*177ba1f9SLey Foon Tan 
118*177ba1f9SLey Foon Tan 	child = fdt_first_subnode(blob, child);
119*177ba1f9SLey Foon Tan 	if (child < 0)
120*177ba1f9SLey Foon Tan 		return -EINVAL;
121*177ba1f9SLey Foon Tan 
122*177ba1f9SLey Foon Tan 	node_name = fdt_get_name(blob, child, &len);
123*177ba1f9SLey Foon Tan 
124*177ba1f9SLey Foon Tan 	while (node_name) {
125*177ba1f9SLey Foon Tan 		if (!strcmp(node_name, "osc1")) {
126*177ba1f9SLey Foon Tan 			if (of_get_input_clks(blob, child, &eosc1_hz))
127*177ba1f9SLey Foon Tan 				return -EINVAL;
128*177ba1f9SLey Foon Tan 		} else if (!strcmp(node_name, "cb_intosc_ls_clk")) {
129*177ba1f9SLey Foon Tan 			if (of_get_input_clks(blob, child, &cb_intosc_hz))
130*177ba1f9SLey Foon Tan 				return -EINVAL;
131*177ba1f9SLey Foon Tan 		} else if (!strcmp(node_name, "f2s_free_clk")) {
132*177ba1f9SLey Foon Tan 			if (of_get_input_clks(blob, child, &f2s_free_hz))
133*177ba1f9SLey Foon Tan 				return -EINVAL;
134*177ba1f9SLey Foon Tan 		} else if (!strcmp(node_name, "main_pll")) {
135*177ba1f9SLey Foon Tan 			if (of_to_struct(blob, child,
136*177ba1f9SLey Foon Tan 					 sizeof(*main_cfg)/sizeof(u32),
137*177ba1f9SLey Foon Tan 					 main_cfg))
138*177ba1f9SLey Foon Tan 				return -EINVAL;
139*177ba1f9SLey Foon Tan 		} else if (!strcmp(node_name, "periph_pll")) {
140*177ba1f9SLey Foon Tan 			if (of_to_struct(blob, child,
141*177ba1f9SLey Foon Tan 					 sizeof(*per_cfg)/sizeof(u32),
142*177ba1f9SLey Foon Tan 					 per_cfg))
143*177ba1f9SLey Foon Tan 				return -EINVAL;
144*177ba1f9SLey Foon Tan 		} else if (!strcmp(node_name, "altera")) {
145*177ba1f9SLey Foon Tan 			if (of_to_struct(blob, child,
146*177ba1f9SLey Foon Tan 					 sizeof(*altrgrp_cfg)/sizeof(u32),
147*177ba1f9SLey Foon Tan 					 altrgrp_cfg))
148*177ba1f9SLey Foon Tan 				return -EINVAL;
149*177ba1f9SLey Foon Tan 
150*177ba1f9SLey Foon Tan 			main_cfg->mpuclk = altrgrp_cfg->mpuclk;
151*177ba1f9SLey Foon Tan 			main_cfg->nocclk = altrgrp_cfg->nocclk;
152*177ba1f9SLey Foon Tan 		}
153*177ba1f9SLey Foon Tan 		child = fdt_next_subnode(blob, child);
154*177ba1f9SLey Foon Tan 
155*177ba1f9SLey Foon Tan 		if (child < 0)
156*177ba1f9SLey Foon Tan 			break;
157*177ba1f9SLey Foon Tan 
158*177ba1f9SLey Foon Tan 		node_name = fdt_get_name(blob, child, &len);
159*177ba1f9SLey Foon Tan 	}
160*177ba1f9SLey Foon Tan 
161*177ba1f9SLey Foon Tan 	return 0;
162*177ba1f9SLey Foon Tan }
163*177ba1f9SLey Foon Tan 
164*177ba1f9SLey Foon Tan /* calculate the intended main VCO frequency based on handoff */
cm_calc_handoff_main_vco_clk_hz(struct mainpll_cfg * main_cfg)165*177ba1f9SLey Foon Tan static unsigned int cm_calc_handoff_main_vco_clk_hz
166*177ba1f9SLey Foon Tan 					(struct mainpll_cfg *main_cfg)
167*177ba1f9SLey Foon Tan {
168*177ba1f9SLey Foon Tan 	unsigned int clk_hz;
169*177ba1f9SLey Foon Tan 
170*177ba1f9SLey Foon Tan 	/* Check main VCO clock source: eosc, intosc or f2s? */
171*177ba1f9SLey Foon Tan 	switch (main_cfg->vco0_psrc) {
172*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_VCO0_PSRC_EOSC:
173*177ba1f9SLey Foon Tan 		clk_hz = eosc1_hz;
174*177ba1f9SLey Foon Tan 		break;
175*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC:
176*177ba1f9SLey Foon Tan 		clk_hz = cb_intosc_hz;
177*177ba1f9SLey Foon Tan 		break;
178*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_VCO0_PSRC_F2S:
179*177ba1f9SLey Foon Tan 		clk_hz = f2s_free_hz;
180*177ba1f9SLey Foon Tan 		break;
181*177ba1f9SLey Foon Tan 	default:
182*177ba1f9SLey Foon Tan 		return 0;
183*177ba1f9SLey Foon Tan 	}
184*177ba1f9SLey Foon Tan 
185*177ba1f9SLey Foon Tan 	/* calculate the VCO frequency */
186*177ba1f9SLey Foon Tan 	clk_hz /= 1 + main_cfg->vco1_denom;
187*177ba1f9SLey Foon Tan 	clk_hz *= 1 + main_cfg->vco1_numer;
188*177ba1f9SLey Foon Tan 
189*177ba1f9SLey Foon Tan 	return clk_hz;
190*177ba1f9SLey Foon Tan }
191*177ba1f9SLey Foon Tan 
192*177ba1f9SLey Foon Tan /* calculate the intended periph VCO frequency based on handoff */
cm_calc_handoff_periph_vco_clk_hz(struct mainpll_cfg * main_cfg,struct perpll_cfg * per_cfg)193*177ba1f9SLey Foon Tan static unsigned int cm_calc_handoff_periph_vco_clk_hz(
194*177ba1f9SLey Foon Tan 		struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
195*177ba1f9SLey Foon Tan {
196*177ba1f9SLey Foon Tan 	unsigned int clk_hz;
197*177ba1f9SLey Foon Tan 
198*177ba1f9SLey Foon Tan 	/* Check periph VCO clock source: eosc, intosc, f2s or mainpll? */
199*177ba1f9SLey Foon Tan 	switch (per_cfg->vco0_psrc) {
200*177ba1f9SLey Foon Tan 	case CLKMGR_PERPLL_VCO0_PSRC_EOSC:
201*177ba1f9SLey Foon Tan 		clk_hz = eosc1_hz;
202*177ba1f9SLey Foon Tan 		break;
203*177ba1f9SLey Foon Tan 	case CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC:
204*177ba1f9SLey Foon Tan 		clk_hz = cb_intosc_hz;
205*177ba1f9SLey Foon Tan 		break;
206*177ba1f9SLey Foon Tan 	case CLKMGR_PERPLL_VCO0_PSRC_F2S:
207*177ba1f9SLey Foon Tan 		clk_hz = f2s_free_hz;
208*177ba1f9SLey Foon Tan 		break;
209*177ba1f9SLey Foon Tan 	case CLKMGR_PERPLL_VCO0_PSRC_MAIN:
210*177ba1f9SLey Foon Tan 		clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
211*177ba1f9SLey Foon Tan 		clk_hz /= main_cfg->cntr15clk_cnt;
212*177ba1f9SLey Foon Tan 		break;
213*177ba1f9SLey Foon Tan 	default:
214*177ba1f9SLey Foon Tan 		return 0;
215*177ba1f9SLey Foon Tan 	}
216*177ba1f9SLey Foon Tan 
217*177ba1f9SLey Foon Tan 	/* calculate the VCO frequency */
218*177ba1f9SLey Foon Tan 	clk_hz /= 1 + per_cfg->vco1_denom;
219*177ba1f9SLey Foon Tan 	clk_hz *= 1 + per_cfg->vco1_numer;
220*177ba1f9SLey Foon Tan 
221*177ba1f9SLey Foon Tan 	return clk_hz;
222*177ba1f9SLey Foon Tan }
223*177ba1f9SLey Foon Tan 
224*177ba1f9SLey Foon Tan /* calculate the intended MPU clock frequency based on handoff */
cm_calc_handoff_mpu_clk_hz(struct mainpll_cfg * main_cfg,struct perpll_cfg * per_cfg)225*177ba1f9SLey Foon Tan static unsigned int cm_calc_handoff_mpu_clk_hz(struct mainpll_cfg *main_cfg,
226*177ba1f9SLey Foon Tan 					       struct perpll_cfg *per_cfg)
227*177ba1f9SLey Foon Tan {
228*177ba1f9SLey Foon Tan 	unsigned int clk_hz;
229*177ba1f9SLey Foon Tan 
230*177ba1f9SLey Foon Tan 	/* Check MPU clock source: main, periph, osc1, intosc or f2s? */
231*177ba1f9SLey Foon Tan 	switch (main_cfg->mpuclk_src) {
232*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_MPUCLK_SRC_MAIN:
233*177ba1f9SLey Foon Tan 		clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
234*177ba1f9SLey Foon Tan 		clk_hz /= (main_cfg->mpuclk & CLKMGR_MAINPLL_MPUCLK_CNT_MSK)
235*177ba1f9SLey Foon Tan 			   + 1;
236*177ba1f9SLey Foon Tan 		break;
237*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_MPUCLK_SRC_PERI:
238*177ba1f9SLey Foon Tan 		clk_hz = cm_calc_handoff_periph_vco_clk_hz(main_cfg, per_cfg);
239*177ba1f9SLey Foon Tan 		clk_hz /= ((main_cfg->mpuclk >>
240*177ba1f9SLey Foon Tan 			   CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB) &
241*177ba1f9SLey Foon Tan 			   CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1;
242*177ba1f9SLey Foon Tan 		break;
243*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_MPUCLK_SRC_OSC1:
244*177ba1f9SLey Foon Tan 		clk_hz = eosc1_hz;
245*177ba1f9SLey Foon Tan 		break;
246*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_MPUCLK_SRC_INTOSC:
247*177ba1f9SLey Foon Tan 		clk_hz = cb_intosc_hz;
248*177ba1f9SLey Foon Tan 		break;
249*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_MPUCLK_SRC_FPGA:
250*177ba1f9SLey Foon Tan 		clk_hz = f2s_free_hz;
251*177ba1f9SLey Foon Tan 		break;
252*177ba1f9SLey Foon Tan 	default:
253*177ba1f9SLey Foon Tan 		return 0;
254*177ba1f9SLey Foon Tan 	}
255*177ba1f9SLey Foon Tan 
256*177ba1f9SLey Foon Tan 	clk_hz /= main_cfg->mpuclk_cnt + 1;
257*177ba1f9SLey Foon Tan 	return clk_hz;
258*177ba1f9SLey Foon Tan }
259*177ba1f9SLey Foon Tan 
260*177ba1f9SLey Foon Tan /* calculate the intended NOC clock frequency based on handoff */
cm_calc_handoff_noc_clk_hz(struct mainpll_cfg * main_cfg,struct perpll_cfg * per_cfg)261*177ba1f9SLey Foon Tan static unsigned int cm_calc_handoff_noc_clk_hz(struct mainpll_cfg *main_cfg,
262*177ba1f9SLey Foon Tan 					       struct perpll_cfg *per_cfg)
263*177ba1f9SLey Foon Tan {
264*177ba1f9SLey Foon Tan 	unsigned int clk_hz;
265*177ba1f9SLey Foon Tan 
266*177ba1f9SLey Foon Tan 	/* Check MPU clock source: main, periph, osc1, intosc or f2s? */
267*177ba1f9SLey Foon Tan 	switch (main_cfg->nocclk_src) {
268*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_NOCCLK_SRC_MAIN:
269*177ba1f9SLey Foon Tan 		clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
270*177ba1f9SLey Foon Tan 		clk_hz /= (main_cfg->nocclk & CLKMGR_MAINPLL_NOCCLK_CNT_MSK)
271*177ba1f9SLey Foon Tan 			 + 1;
272*177ba1f9SLey Foon Tan 		break;
273*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_NOCCLK_SRC_PERI:
274*177ba1f9SLey Foon Tan 		clk_hz = cm_calc_handoff_periph_vco_clk_hz(main_cfg, per_cfg);
275*177ba1f9SLey Foon Tan 		clk_hz /= ((main_cfg->nocclk >>
276*177ba1f9SLey Foon Tan 			   CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB) &
277*177ba1f9SLey Foon Tan 			   CLKMGR_MAINPLL_NOCCLK_CNT_MSK) + 1;
278*177ba1f9SLey Foon Tan 		break;
279*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_NOCCLK_SRC_OSC1:
280*177ba1f9SLey Foon Tan 		clk_hz = eosc1_hz;
281*177ba1f9SLey Foon Tan 		break;
282*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_NOCCLK_SRC_INTOSC:
283*177ba1f9SLey Foon Tan 		clk_hz = cb_intosc_hz;
284*177ba1f9SLey Foon Tan 		break;
285*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_NOCCLK_SRC_FPGA:
286*177ba1f9SLey Foon Tan 		clk_hz = f2s_free_hz;
287*177ba1f9SLey Foon Tan 		break;
288*177ba1f9SLey Foon Tan 	default:
289*177ba1f9SLey Foon Tan 		return 0;
290*177ba1f9SLey Foon Tan 	}
291*177ba1f9SLey Foon Tan 
292*177ba1f9SLey Foon Tan 	clk_hz /= main_cfg->nocclk_cnt + 1;
293*177ba1f9SLey Foon Tan 	return clk_hz;
294*177ba1f9SLey Foon Tan }
295*177ba1f9SLey Foon Tan 
296*177ba1f9SLey Foon Tan /* return 1 if PLL ramp is required */
cm_is_pll_ramp_required(int main0periph1,struct mainpll_cfg * main_cfg,struct perpll_cfg * per_cfg)297*177ba1f9SLey Foon Tan static int cm_is_pll_ramp_required(int main0periph1,
298*177ba1f9SLey Foon Tan 				   struct mainpll_cfg *main_cfg,
299*177ba1f9SLey Foon Tan 				   struct perpll_cfg *per_cfg)
300*177ba1f9SLey Foon Tan {
301*177ba1f9SLey Foon Tan 	/* Check for main PLL */
302*177ba1f9SLey Foon Tan 	if (main0periph1 == 0) {
303*177ba1f9SLey Foon Tan 		/*
304*177ba1f9SLey Foon Tan 		 * PLL ramp is not required if both MPU clock and NOC clock are
305*177ba1f9SLey Foon Tan 		 * not sourced from main PLL
306*177ba1f9SLey Foon Tan 		 */
307*177ba1f9SLey Foon Tan 		if (main_cfg->mpuclk_src != CLKMGR_MAINPLL_MPUCLK_SRC_MAIN &&
308*177ba1f9SLey Foon Tan 		    main_cfg->nocclk_src != CLKMGR_MAINPLL_NOCCLK_SRC_MAIN)
309*177ba1f9SLey Foon Tan 			return 0;
310*177ba1f9SLey Foon Tan 
311*177ba1f9SLey Foon Tan 		/*
312*177ba1f9SLey Foon Tan 		 * PLL ramp is required if MPU clock is sourced from main PLL
313*177ba1f9SLey Foon Tan 		 * and MPU clock is over 900MHz (as advised by HW team)
314*177ba1f9SLey Foon Tan 		 */
315*177ba1f9SLey Foon Tan 		if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_MAIN &&
316*177ba1f9SLey Foon Tan 		    (cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg) >
317*177ba1f9SLey Foon Tan 		     CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ))
318*177ba1f9SLey Foon Tan 			return 1;
319*177ba1f9SLey Foon Tan 
320*177ba1f9SLey Foon Tan 		/*
321*177ba1f9SLey Foon Tan 		 * PLL ramp is required if NOC clock is sourced from main PLL
322*177ba1f9SLey Foon Tan 		 * and NOC clock is over 300MHz (as advised by HW team)
323*177ba1f9SLey Foon Tan 		 */
324*177ba1f9SLey Foon Tan 		if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_MAIN &&
325*177ba1f9SLey Foon Tan 		    (cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg) >
326*177ba1f9SLey Foon Tan 		     CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ))
327*177ba1f9SLey Foon Tan 			return 2;
328*177ba1f9SLey Foon Tan 
329*177ba1f9SLey Foon Tan 	} else if (main0periph1 == 1) {
330*177ba1f9SLey Foon Tan 		/*
331*177ba1f9SLey Foon Tan 		 * PLL ramp is not required if both MPU clock and NOC clock are
332*177ba1f9SLey Foon Tan 		 * not sourced from periph PLL
333*177ba1f9SLey Foon Tan 		 */
334*177ba1f9SLey Foon Tan 		if (main_cfg->mpuclk_src != CLKMGR_MAINPLL_MPUCLK_SRC_PERI &&
335*177ba1f9SLey Foon Tan 		    main_cfg->nocclk_src != CLKMGR_MAINPLL_NOCCLK_SRC_PERI)
336*177ba1f9SLey Foon Tan 			return 0;
337*177ba1f9SLey Foon Tan 
338*177ba1f9SLey Foon Tan 		/*
339*177ba1f9SLey Foon Tan 		 * PLL ramp is required if MPU clock are source from periph PLL
340*177ba1f9SLey Foon Tan 		 * and MPU clock is over 900MHz (as advised by HW team)
341*177ba1f9SLey Foon Tan 		 */
342*177ba1f9SLey Foon Tan 		if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_PERI &&
343*177ba1f9SLey Foon Tan 		    (cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg) >
344*177ba1f9SLey Foon Tan 		     CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ))
345*177ba1f9SLey Foon Tan 			return 1;
346*177ba1f9SLey Foon Tan 
347*177ba1f9SLey Foon Tan 		/*
348*177ba1f9SLey Foon Tan 		 * PLL ramp is required if NOC clock are source from periph PLL
349*177ba1f9SLey Foon Tan 		 * and NOC clock is over 300MHz (as advised by HW team)
350*177ba1f9SLey Foon Tan 		 */
351*177ba1f9SLey Foon Tan 		if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_PERI &&
352*177ba1f9SLey Foon Tan 		    (cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg) >
353*177ba1f9SLey Foon Tan 		     CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ))
354*177ba1f9SLey Foon Tan 			return 2;
355*177ba1f9SLey Foon Tan 	}
356*177ba1f9SLey Foon Tan 
357*177ba1f9SLey Foon Tan 	return 0;
358*177ba1f9SLey Foon Tan }
359*177ba1f9SLey Foon Tan 
cm_calculate_numer(struct mainpll_cfg * main_cfg,struct perpll_cfg * per_cfg,u32 safe_hz,u32 clk_hz)360*177ba1f9SLey Foon Tan static u32 cm_calculate_numer(struct mainpll_cfg *main_cfg,
361*177ba1f9SLey Foon Tan 			      struct perpll_cfg *per_cfg,
362*177ba1f9SLey Foon Tan 			      u32 safe_hz, u32 clk_hz)
363*177ba1f9SLey Foon Tan {
364*177ba1f9SLey Foon Tan 	u32 cnt;
365*177ba1f9SLey Foon Tan 	u32 clk;
366*177ba1f9SLey Foon Tan 	u32 shift;
367*177ba1f9SLey Foon Tan 	u32 mask;
368*177ba1f9SLey Foon Tan 	u32 denom;
369*177ba1f9SLey Foon Tan 
370*177ba1f9SLey Foon Tan 	if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_MAIN) {
371*177ba1f9SLey Foon Tan 		cnt = main_cfg->mpuclk_cnt;
372*177ba1f9SLey Foon Tan 		clk = main_cfg->mpuclk;
373*177ba1f9SLey Foon Tan 		shift = 0;
374*177ba1f9SLey Foon Tan 		mask = CLKMGR_MAINPLL_MPUCLK_CNT_MSK;
375*177ba1f9SLey Foon Tan 		denom = main_cfg->vco1_denom;
376*177ba1f9SLey Foon Tan 	} else if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_MAIN) {
377*177ba1f9SLey Foon Tan 		cnt = main_cfg->nocclk_cnt;
378*177ba1f9SLey Foon Tan 		clk = main_cfg->nocclk;
379*177ba1f9SLey Foon Tan 		shift = 0;
380*177ba1f9SLey Foon Tan 		mask = CLKMGR_MAINPLL_NOCCLK_CNT_MSK;
381*177ba1f9SLey Foon Tan 		denom = main_cfg->vco1_denom;
382*177ba1f9SLey Foon Tan 	} else if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_PERI) {
383*177ba1f9SLey Foon Tan 		cnt = main_cfg->mpuclk_cnt;
384*177ba1f9SLey Foon Tan 		clk = main_cfg->mpuclk;
385*177ba1f9SLey Foon Tan 		shift = CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB;
386*177ba1f9SLey Foon Tan 		mask = CLKMGR_MAINPLL_MPUCLK_CNT_MSK;
387*177ba1f9SLey Foon Tan 		denom = per_cfg->vco1_denom;
388*177ba1f9SLey Foon Tan 	} else if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_PERI) {
389*177ba1f9SLey Foon Tan 		cnt = main_cfg->nocclk_cnt;
390*177ba1f9SLey Foon Tan 		clk = main_cfg->nocclk;
391*177ba1f9SLey Foon Tan 		shift = CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB;
392*177ba1f9SLey Foon Tan 		mask = CLKMGR_MAINPLL_NOCCLK_CNT_MSK;
393*177ba1f9SLey Foon Tan 		denom = per_cfg->vco1_denom;
394*177ba1f9SLey Foon Tan 	} else {
395*177ba1f9SLey Foon Tan 		return 0;
396*177ba1f9SLey Foon Tan 	}
397*177ba1f9SLey Foon Tan 
398*177ba1f9SLey Foon Tan 	return (safe_hz / clk_hz) * (cnt + 1) * (((clk >> shift) & mask) + 1) *
399*177ba1f9SLey Foon Tan 		(1 + denom) - 1;
400*177ba1f9SLey Foon Tan }
401*177ba1f9SLey Foon Tan 
402*177ba1f9SLey Foon Tan /*
403*177ba1f9SLey Foon Tan  * Calculate the new PLL numerator which is based on existing DTS hand off and
404*177ba1f9SLey Foon Tan  * intended safe frequency (safe_hz). Note that PLL ramp is only modifying the
405*177ba1f9SLey Foon Tan  * numerator while maintaining denominator as denominator will influence the
406*177ba1f9SLey Foon Tan  * jitter condition. Please refer A10 HPS TRM for the jitter guide. Note final
407*177ba1f9SLey Foon Tan  * value for numerator is minus with 1 to cater our register value
408*177ba1f9SLey Foon Tan  * representation.
409*177ba1f9SLey Foon Tan  */
cm_calc_safe_pll_numer(int main0periph1,struct mainpll_cfg * main_cfg,struct perpll_cfg * per_cfg,unsigned int safe_hz)410*177ba1f9SLey Foon Tan static unsigned int cm_calc_safe_pll_numer(int main0periph1,
411*177ba1f9SLey Foon Tan 					   struct mainpll_cfg *main_cfg,
412*177ba1f9SLey Foon Tan 					   struct perpll_cfg *per_cfg,
413*177ba1f9SLey Foon Tan 					   unsigned int safe_hz)
414*177ba1f9SLey Foon Tan {
415*177ba1f9SLey Foon Tan 	unsigned int clk_hz = 0;
416*177ba1f9SLey Foon Tan 
417*177ba1f9SLey Foon Tan 	/* Check for main PLL */
418*177ba1f9SLey Foon Tan 	if (main0periph1 == 0) {
419*177ba1f9SLey Foon Tan 		/* Check main VCO clock source: eosc, intosc or f2s? */
420*177ba1f9SLey Foon Tan 		switch (main_cfg->vco0_psrc) {
421*177ba1f9SLey Foon Tan 		case CLKMGR_MAINPLL_VCO0_PSRC_EOSC:
422*177ba1f9SLey Foon Tan 			clk_hz = eosc1_hz;
423*177ba1f9SLey Foon Tan 			break;
424*177ba1f9SLey Foon Tan 		case CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC:
425*177ba1f9SLey Foon Tan 			clk_hz = cb_intosc_hz;
426*177ba1f9SLey Foon Tan 			break;
427*177ba1f9SLey Foon Tan 		case CLKMGR_MAINPLL_VCO0_PSRC_F2S:
428*177ba1f9SLey Foon Tan 			clk_hz = f2s_free_hz;
429*177ba1f9SLey Foon Tan 			break;
430*177ba1f9SLey Foon Tan 		default:
431*177ba1f9SLey Foon Tan 			return 0;
432*177ba1f9SLey Foon Tan 		}
433*177ba1f9SLey Foon Tan 	} else if (main0periph1 == 1) {
434*177ba1f9SLey Foon Tan 		/* Check periph VCO clock source: eosc, intosc, f2s, mainpll */
435*177ba1f9SLey Foon Tan 		switch (per_cfg->vco0_psrc) {
436*177ba1f9SLey Foon Tan 		case CLKMGR_PERPLL_VCO0_PSRC_EOSC:
437*177ba1f9SLey Foon Tan 			clk_hz = eosc1_hz;
438*177ba1f9SLey Foon Tan 			break;
439*177ba1f9SLey Foon Tan 		case CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC:
440*177ba1f9SLey Foon Tan 			clk_hz = cb_intosc_hz;
441*177ba1f9SLey Foon Tan 			break;
442*177ba1f9SLey Foon Tan 		case CLKMGR_PERPLL_VCO0_PSRC_F2S:
443*177ba1f9SLey Foon Tan 			clk_hz = f2s_free_hz;
444*177ba1f9SLey Foon Tan 			break;
445*177ba1f9SLey Foon Tan 		case CLKMGR_PERPLL_VCO0_PSRC_MAIN:
446*177ba1f9SLey Foon Tan 			clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
447*177ba1f9SLey Foon Tan 			clk_hz /= main_cfg->cntr15clk_cnt;
448*177ba1f9SLey Foon Tan 			break;
449*177ba1f9SLey Foon Tan 		default:
450*177ba1f9SLey Foon Tan 			return 0;
451*177ba1f9SLey Foon Tan 		}
452*177ba1f9SLey Foon Tan 	} else {
453*177ba1f9SLey Foon Tan 		return 0;
454*177ba1f9SLey Foon Tan 	}
455*177ba1f9SLey Foon Tan 
456*177ba1f9SLey Foon Tan 	return cm_calculate_numer(main_cfg, per_cfg, safe_hz, clk_hz);
457*177ba1f9SLey Foon Tan }
458*177ba1f9SLey Foon Tan 
459*177ba1f9SLey Foon Tan /* ramping the main PLL to final value */
cm_pll_ramp_main(struct mainpll_cfg * main_cfg,struct perpll_cfg * per_cfg,unsigned int pll_ramp_main_hz)460*177ba1f9SLey Foon Tan static void cm_pll_ramp_main(struct mainpll_cfg *main_cfg,
461*177ba1f9SLey Foon Tan 			     struct perpll_cfg *per_cfg,
462*177ba1f9SLey Foon Tan 			     unsigned int pll_ramp_main_hz)
463*177ba1f9SLey Foon Tan {
464*177ba1f9SLey Foon Tan 	unsigned int clk_hz = 0, clk_incr_hz = 0, clk_final_hz = 0;
465*177ba1f9SLey Foon Tan 
466*177ba1f9SLey Foon Tan 	/* find out the increment value */
467*177ba1f9SLey Foon Tan 	if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_MAIN) {
468*177ba1f9SLey Foon Tan 		clk_incr_hz = CLKMGR_PLL_RAMP_MPUCLK_INCREMENT_HZ;
469*177ba1f9SLey Foon Tan 		clk_final_hz = cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg);
470*177ba1f9SLey Foon Tan 	} else if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_MAIN) {
471*177ba1f9SLey Foon Tan 		clk_incr_hz = CLKMGR_PLL_RAMP_NOCCLK_INCREMENT_HZ;
472*177ba1f9SLey Foon Tan 		clk_final_hz = cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg);
473*177ba1f9SLey Foon Tan 	}
474*177ba1f9SLey Foon Tan 
475*177ba1f9SLey Foon Tan 	/* execute the ramping here */
476*177ba1f9SLey Foon Tan 	for (clk_hz = pll_ramp_main_hz + clk_incr_hz;
477*177ba1f9SLey Foon Tan 	     clk_hz < clk_final_hz; clk_hz += clk_incr_hz) {
478*177ba1f9SLey Foon Tan 		writel((main_cfg->vco1_denom <<
479*177ba1f9SLey Foon Tan 			CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
480*177ba1f9SLey Foon Tan 			cm_calc_safe_pll_numer(0, main_cfg, per_cfg, clk_hz),
481*177ba1f9SLey Foon Tan 			&clock_manager_base->main_pll.vco1);
482*177ba1f9SLey Foon Tan 		mdelay(1);
483*177ba1f9SLey Foon Tan 		cm_wait_for_lock(LOCKED_MASK);
484*177ba1f9SLey Foon Tan 	}
485*177ba1f9SLey Foon Tan 	writel((main_cfg->vco1_denom << CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
486*177ba1f9SLey Foon Tan 		main_cfg->vco1_numer, &clock_manager_base->main_pll.vco1);
487*177ba1f9SLey Foon Tan 	mdelay(1);
488*177ba1f9SLey Foon Tan 	cm_wait_for_lock(LOCKED_MASK);
489*177ba1f9SLey Foon Tan }
490*177ba1f9SLey Foon Tan 
491*177ba1f9SLey Foon Tan /* ramping the periph PLL to final value */
cm_pll_ramp_periph(struct mainpll_cfg * main_cfg,struct perpll_cfg * per_cfg,unsigned int pll_ramp_periph_hz)492*177ba1f9SLey Foon Tan static void cm_pll_ramp_periph(struct mainpll_cfg *main_cfg,
493*177ba1f9SLey Foon Tan 			       struct perpll_cfg *per_cfg,
494*177ba1f9SLey Foon Tan 			       unsigned int pll_ramp_periph_hz)
495*177ba1f9SLey Foon Tan {
496*177ba1f9SLey Foon Tan 	unsigned int clk_hz = 0, clk_incr_hz = 0, clk_final_hz = 0;
497*177ba1f9SLey Foon Tan 
498*177ba1f9SLey Foon Tan 	/* find out the increment value */
499*177ba1f9SLey Foon Tan 	if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_PERI) {
500*177ba1f9SLey Foon Tan 		clk_incr_hz = CLKMGR_PLL_RAMP_MPUCLK_INCREMENT_HZ;
501*177ba1f9SLey Foon Tan 		clk_final_hz = cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg);
502*177ba1f9SLey Foon Tan 	} else if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_PERI) {
503*177ba1f9SLey Foon Tan 		clk_incr_hz = CLKMGR_PLL_RAMP_NOCCLK_INCREMENT_HZ;
504*177ba1f9SLey Foon Tan 		clk_final_hz = cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg);
505*177ba1f9SLey Foon Tan 	}
506*177ba1f9SLey Foon Tan 	/* execute the ramping here */
507*177ba1f9SLey Foon Tan 	for (clk_hz = pll_ramp_periph_hz + clk_incr_hz;
508*177ba1f9SLey Foon Tan 	     clk_hz < clk_final_hz; clk_hz += clk_incr_hz) {
509*177ba1f9SLey Foon Tan 		writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
510*177ba1f9SLey Foon Tan 			cm_calc_safe_pll_numer(1, main_cfg, per_cfg, clk_hz),
511*177ba1f9SLey Foon Tan 			&clock_manager_base->per_pll.vco1);
512*177ba1f9SLey Foon Tan 		mdelay(1);
513*177ba1f9SLey Foon Tan 		cm_wait_for_lock(LOCKED_MASK);
514*177ba1f9SLey Foon Tan 	}
515*177ba1f9SLey Foon Tan 	writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
516*177ba1f9SLey Foon Tan 		per_cfg->vco1_numer, &clock_manager_base->per_pll.vco1);
517*177ba1f9SLey Foon Tan 	mdelay(1);
518*177ba1f9SLey Foon Tan 	cm_wait_for_lock(LOCKED_MASK);
519*177ba1f9SLey Foon Tan }
520*177ba1f9SLey Foon Tan 
521*177ba1f9SLey Foon Tan /*
522*177ba1f9SLey Foon Tan  * Setup clocks while making no assumptions of the
523*177ba1f9SLey Foon Tan  * previous state of the clocks.
524*177ba1f9SLey Foon Tan  *
525*177ba1f9SLey Foon Tan  * Start by being paranoid and gate all sw managed clocks
526*177ba1f9SLey Foon Tan  *
527*177ba1f9SLey Foon Tan  * Put all plls in bypass
528*177ba1f9SLey Foon Tan  *
529*177ba1f9SLey Foon Tan  * Put all plls VCO registers back to reset value (bgpwr dwn).
530*177ba1f9SLey Foon Tan  *
531*177ba1f9SLey Foon Tan  * Put peripheral and main pll src to reset value to avoid glitch.
532*177ba1f9SLey Foon Tan  *
533*177ba1f9SLey Foon Tan  * Delay 5 us.
534*177ba1f9SLey Foon Tan  *
535*177ba1f9SLey Foon Tan  * Deassert bg pwr dn and set numerator and denominator
536*177ba1f9SLey Foon Tan  *
537*177ba1f9SLey Foon Tan  * Start 7 us timer.
538*177ba1f9SLey Foon Tan  *
539*177ba1f9SLey Foon Tan  * set internal dividers
540*177ba1f9SLey Foon Tan  *
541*177ba1f9SLey Foon Tan  * Wait for 7 us timer.
542*177ba1f9SLey Foon Tan  *
543*177ba1f9SLey Foon Tan  * Enable plls
544*177ba1f9SLey Foon Tan  *
545*177ba1f9SLey Foon Tan  * Set external dividers while plls are locking
546*177ba1f9SLey Foon Tan  *
547*177ba1f9SLey Foon Tan  * Wait for pll lock
548*177ba1f9SLey Foon Tan  *
549*177ba1f9SLey Foon Tan  * Assert/deassert outreset all.
550*177ba1f9SLey Foon Tan  *
551*177ba1f9SLey Foon Tan  * Take all pll's out of bypass
552*177ba1f9SLey Foon Tan  *
553*177ba1f9SLey Foon Tan  * Clear safe mode
554*177ba1f9SLey Foon Tan  *
555*177ba1f9SLey Foon Tan  * set source main and peripheral clocks
556*177ba1f9SLey Foon Tan  *
557*177ba1f9SLey Foon Tan  * Ungate clocks
558*177ba1f9SLey Foon Tan  */
559*177ba1f9SLey Foon Tan 
cm_full_cfg(struct mainpll_cfg * main_cfg,struct perpll_cfg * per_cfg)560*177ba1f9SLey Foon Tan static int cm_full_cfg(struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
561*177ba1f9SLey Foon Tan {
562*177ba1f9SLey Foon Tan 	unsigned int pll_ramp_main_hz = 0, pll_ramp_periph_hz = 0,
563*177ba1f9SLey Foon Tan 		ramp_required;
564*177ba1f9SLey Foon Tan 
565*177ba1f9SLey Foon Tan 	/* gate off all mainpll clock excpet HW managed clock */
566*177ba1f9SLey Foon Tan 	writel(CLKMGR_MAINPLL_EN_S2FUSER0CLKEN_SET_MSK |
567*177ba1f9SLey Foon Tan 		CLKMGR_MAINPLL_EN_HMCPLLREFCLKEN_SET_MSK,
568*177ba1f9SLey Foon Tan 		&clock_manager_base->main_pll.enr);
569*177ba1f9SLey Foon Tan 
570*177ba1f9SLey Foon Tan 	/* now we can gate off the rest of the peripheral clocks */
571*177ba1f9SLey Foon Tan 	writel(0, &clock_manager_base->per_pll.en);
572*177ba1f9SLey Foon Tan 
573*177ba1f9SLey Foon Tan 	/* Put all plls in external bypass */
574*177ba1f9SLey Foon Tan 	writel(CLKMGR_MAINPLL_BYPASS_RESET,
575*177ba1f9SLey Foon Tan 	       &clock_manager_base->main_pll.bypasss);
576*177ba1f9SLey Foon Tan 	writel(CLKMGR_PERPLL_BYPASS_RESET,
577*177ba1f9SLey Foon Tan 	       &clock_manager_base->per_pll.bypasss);
578*177ba1f9SLey Foon Tan 
579*177ba1f9SLey Foon Tan 	/*
580*177ba1f9SLey Foon Tan 	 * Put all plls VCO registers back to reset value.
581*177ba1f9SLey Foon Tan 	 * Some code might have messed with them. At same time set the
582*177ba1f9SLey Foon Tan 	 * desired clock source
583*177ba1f9SLey Foon Tan 	 */
584*177ba1f9SLey Foon Tan 	writel(CLKMGR_MAINPLL_VCO0_RESET |
585*177ba1f9SLey Foon Tan 	       CLKMGR_MAINPLL_VCO0_REGEXTSEL_SET_MSK |
586*177ba1f9SLey Foon Tan 	       (main_cfg->vco0_psrc << CLKMGR_MAINPLL_VCO0_PSRC_LSB),
587*177ba1f9SLey Foon Tan 	       &clock_manager_base->main_pll.vco0);
588*177ba1f9SLey Foon Tan 
589*177ba1f9SLey Foon Tan 	writel(CLKMGR_PERPLL_VCO0_RESET |
590*177ba1f9SLey Foon Tan 	       CLKMGR_PERPLL_VCO0_REGEXTSEL_SET_MSK |
591*177ba1f9SLey Foon Tan 	       (per_cfg->vco0_psrc << CLKMGR_PERPLL_VCO0_PSRC_LSB),
592*177ba1f9SLey Foon Tan 	       &clock_manager_base->per_pll.vco0);
593*177ba1f9SLey Foon Tan 
594*177ba1f9SLey Foon Tan 	writel(CLKMGR_MAINPLL_VCO1_RESET, &clock_manager_base->main_pll.vco1);
595*177ba1f9SLey Foon Tan 	writel(CLKMGR_PERPLL_VCO1_RESET, &clock_manager_base->per_pll.vco1);
596*177ba1f9SLey Foon Tan 
597*177ba1f9SLey Foon Tan 	/* clear the interrupt register status register */
598*177ba1f9SLey Foon Tan 	writel(CLKMGR_CLKMGR_INTR_MAINPLLLOST_SET_MSK |
599*177ba1f9SLey Foon Tan 		CLKMGR_CLKMGR_INTR_PERPLLLOST_SET_MSK |
600*177ba1f9SLey Foon Tan 		CLKMGR_CLKMGR_INTR_MAINPLLRFSLIP_SET_MSK |
601*177ba1f9SLey Foon Tan 		CLKMGR_CLKMGR_INTR_PERPLLRFSLIP_SET_MSK |
602*177ba1f9SLey Foon Tan 		CLKMGR_CLKMGR_INTR_MAINPLLFBSLIP_SET_MSK |
603*177ba1f9SLey Foon Tan 		CLKMGR_CLKMGR_INTR_PERPLLFBSLIP_SET_MSK |
604*177ba1f9SLey Foon Tan 		CLKMGR_CLKMGR_INTR_MAINPLLACHIEVED_SET_MSK |
605*177ba1f9SLey Foon Tan 		CLKMGR_CLKMGR_INTR_PERPLLACHIEVED_SET_MSK,
606*177ba1f9SLey Foon Tan 		&clock_manager_base->intr);
607*177ba1f9SLey Foon Tan 
608*177ba1f9SLey Foon Tan 	/* Program VCO Numerator and Denominator for main PLL */
609*177ba1f9SLey Foon Tan 	ramp_required = cm_is_pll_ramp_required(0, main_cfg, per_cfg);
610*177ba1f9SLey Foon Tan 	if (ramp_required) {
611*177ba1f9SLey Foon Tan 		/* set main PLL to safe starting threshold frequency */
612*177ba1f9SLey Foon Tan 		if (ramp_required == 1)
613*177ba1f9SLey Foon Tan 			pll_ramp_main_hz = CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ;
614*177ba1f9SLey Foon Tan 		else if (ramp_required == 2)
615*177ba1f9SLey Foon Tan 			pll_ramp_main_hz = CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ;
616*177ba1f9SLey Foon Tan 
617*177ba1f9SLey Foon Tan 		writel((main_cfg->vco1_denom << CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
618*177ba1f9SLey Foon Tan 			cm_calc_safe_pll_numer(0, main_cfg, per_cfg,
619*177ba1f9SLey Foon Tan 					       pll_ramp_main_hz),
620*177ba1f9SLey Foon Tan 			&clock_manager_base->main_pll.vco1);
621*177ba1f9SLey Foon Tan 	} else
622*177ba1f9SLey Foon Tan 		writel((main_cfg->vco1_denom << CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
623*177ba1f9SLey Foon Tan 			main_cfg->vco1_numer,
624*177ba1f9SLey Foon Tan 			&clock_manager_base->main_pll.vco1);
625*177ba1f9SLey Foon Tan 
626*177ba1f9SLey Foon Tan 	/* Program VCO Numerator and Denominator for periph PLL */
627*177ba1f9SLey Foon Tan 	ramp_required = cm_is_pll_ramp_required(1, main_cfg, per_cfg);
628*177ba1f9SLey Foon Tan 	if (ramp_required) {
629*177ba1f9SLey Foon Tan 		/* set periph PLL to safe starting threshold frequency */
630*177ba1f9SLey Foon Tan 		if (ramp_required == 1)
631*177ba1f9SLey Foon Tan 			pll_ramp_periph_hz =
632*177ba1f9SLey Foon Tan 				CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ;
633*177ba1f9SLey Foon Tan 		else if (ramp_required == 2)
634*177ba1f9SLey Foon Tan 			pll_ramp_periph_hz =
635*177ba1f9SLey Foon Tan 				CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ;
636*177ba1f9SLey Foon Tan 
637*177ba1f9SLey Foon Tan 		writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
638*177ba1f9SLey Foon Tan 			cm_calc_safe_pll_numer(1, main_cfg, per_cfg,
639*177ba1f9SLey Foon Tan 					       pll_ramp_periph_hz),
640*177ba1f9SLey Foon Tan 			&clock_manager_base->per_pll.vco1);
641*177ba1f9SLey Foon Tan 	} else
642*177ba1f9SLey Foon Tan 		writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
643*177ba1f9SLey Foon Tan 			per_cfg->vco1_numer,
644*177ba1f9SLey Foon Tan 			&clock_manager_base->per_pll.vco1);
645*177ba1f9SLey Foon Tan 
646*177ba1f9SLey Foon Tan 	/* Wait for at least 5 us */
647*177ba1f9SLey Foon Tan 	udelay(5);
648*177ba1f9SLey Foon Tan 
649*177ba1f9SLey Foon Tan 	/* Now deassert BGPWRDN and PWRDN */
650*177ba1f9SLey Foon Tan 	clrbits_le32(&clock_manager_base->main_pll.vco0,
651*177ba1f9SLey Foon Tan 		     CLKMGR_MAINPLL_VCO0_BGPWRDN_SET_MSK |
652*177ba1f9SLey Foon Tan 		     CLKMGR_MAINPLL_VCO0_PWRDN_SET_MSK);
653*177ba1f9SLey Foon Tan 	clrbits_le32(&clock_manager_base->per_pll.vco0,
654*177ba1f9SLey Foon Tan 		     CLKMGR_PERPLL_VCO0_BGPWRDN_SET_MSK |
655*177ba1f9SLey Foon Tan 		     CLKMGR_PERPLL_VCO0_PWRDN_SET_MSK);
656*177ba1f9SLey Foon Tan 
657*177ba1f9SLey Foon Tan 	/* Wait for at least 7 us */
658*177ba1f9SLey Foon Tan 	udelay(7);
659*177ba1f9SLey Foon Tan 
660*177ba1f9SLey Foon Tan 	/* enable the VCO and disable the external regulator to PLL */
661*177ba1f9SLey Foon Tan 	writel((readl(&clock_manager_base->main_pll.vco0) &
662*177ba1f9SLey Foon Tan 		~CLKMGR_MAINPLL_VCO0_REGEXTSEL_SET_MSK) |
663*177ba1f9SLey Foon Tan 		CLKMGR_MAINPLL_VCO0_EN_SET_MSK,
664*177ba1f9SLey Foon Tan 		&clock_manager_base->main_pll.vco0);
665*177ba1f9SLey Foon Tan 	writel((readl(&clock_manager_base->per_pll.vco0) &
666*177ba1f9SLey Foon Tan 		~CLKMGR_PERPLL_VCO0_REGEXTSEL_SET_MSK) |
667*177ba1f9SLey Foon Tan 		CLKMGR_PERPLL_VCO0_EN_SET_MSK,
668*177ba1f9SLey Foon Tan 		&clock_manager_base->per_pll.vco0);
669*177ba1f9SLey Foon Tan 
670*177ba1f9SLey Foon Tan 	/* setup all the main PLL counter and clock source */
671*177ba1f9SLey Foon Tan 	writel(main_cfg->nocclk,
672*177ba1f9SLey Foon Tan 	       SOCFPGA_CLKMGR_ADDRESS + CLKMGR_MAINPLL_NOC_CLK_OFFSET);
673*177ba1f9SLey Foon Tan 	writel(main_cfg->mpuclk,
674*177ba1f9SLey Foon Tan 	       SOCFPGA_CLKMGR_ADDRESS + CLKMGR_ALTERAGRP_MPU_CLK_OFFSET);
675*177ba1f9SLey Foon Tan 
676*177ba1f9SLey Foon Tan 	/* main_emaca_clk divider */
677*177ba1f9SLey Foon Tan 	writel(main_cfg->cntr2clk_cnt, &clock_manager_base->main_pll.cntr2clk);
678*177ba1f9SLey Foon Tan 	/* main_emacb_clk divider */
679*177ba1f9SLey Foon Tan 	writel(main_cfg->cntr3clk_cnt, &clock_manager_base->main_pll.cntr3clk);
680*177ba1f9SLey Foon Tan 	/* main_emac_ptp_clk divider */
681*177ba1f9SLey Foon Tan 	writel(main_cfg->cntr4clk_cnt, &clock_manager_base->main_pll.cntr4clk);
682*177ba1f9SLey Foon Tan 	/* main_gpio_db_clk divider */
683*177ba1f9SLey Foon Tan 	writel(main_cfg->cntr5clk_cnt, &clock_manager_base->main_pll.cntr5clk);
684*177ba1f9SLey Foon Tan 	/* main_sdmmc_clk divider */
685*177ba1f9SLey Foon Tan 	writel(main_cfg->cntr6clk_cnt, &clock_manager_base->main_pll.cntr6clk);
686*177ba1f9SLey Foon Tan 	/* main_s2f_user0_clk divider */
687*177ba1f9SLey Foon Tan 	writel(main_cfg->cntr7clk_cnt |
688*177ba1f9SLey Foon Tan 	       (main_cfg->cntr7clk_src << CLKMGR_MAINPLL_CNTR7CLK_SRC_LSB),
689*177ba1f9SLey Foon Tan 	       &clock_manager_base->main_pll.cntr7clk);
690*177ba1f9SLey Foon Tan 	/* main_s2f_user1_clk divider */
691*177ba1f9SLey Foon Tan 	writel(main_cfg->cntr8clk_cnt, &clock_manager_base->main_pll.cntr8clk);
692*177ba1f9SLey Foon Tan 	/* main_hmc_pll_clk divider */
693*177ba1f9SLey Foon Tan 	writel(main_cfg->cntr9clk_cnt |
694*177ba1f9SLey Foon Tan 	       (main_cfg->cntr9clk_src << CLKMGR_MAINPLL_CNTR9CLK_SRC_LSB),
695*177ba1f9SLey Foon Tan 	       &clock_manager_base->main_pll.cntr9clk);
696*177ba1f9SLey Foon Tan 	/* main_periph_ref_clk divider */
697*177ba1f9SLey Foon Tan 	writel(main_cfg->cntr15clk_cnt,
698*177ba1f9SLey Foon Tan 	       &clock_manager_base->main_pll.cntr15clk);
699*177ba1f9SLey Foon Tan 
700*177ba1f9SLey Foon Tan 	/* setup all the peripheral PLL counter and clock source */
701*177ba1f9SLey Foon Tan 	/* peri_emaca_clk divider */
702*177ba1f9SLey Foon Tan 	writel(per_cfg->cntr2clk_cnt |
703*177ba1f9SLey Foon Tan 	       (per_cfg->cntr2clk_src << CLKMGR_PERPLL_CNTR2CLK_SRC_LSB),
704*177ba1f9SLey Foon Tan 	       &clock_manager_base->per_pll.cntr2clk);
705*177ba1f9SLey Foon Tan 	/* peri_emacb_clk divider */
706*177ba1f9SLey Foon Tan 	writel(per_cfg->cntr3clk_cnt |
707*177ba1f9SLey Foon Tan 	       (per_cfg->cntr3clk_src << CLKMGR_PERPLL_CNTR3CLK_SRC_LSB),
708*177ba1f9SLey Foon Tan 	       &clock_manager_base->per_pll.cntr3clk);
709*177ba1f9SLey Foon Tan 	/* peri_emac_ptp_clk divider */
710*177ba1f9SLey Foon Tan 	writel(per_cfg->cntr4clk_cnt |
711*177ba1f9SLey Foon Tan 	       (per_cfg->cntr4clk_src << CLKMGR_PERPLL_CNTR4CLK_SRC_LSB),
712*177ba1f9SLey Foon Tan 	       &clock_manager_base->per_pll.cntr4clk);
713*177ba1f9SLey Foon Tan 	/* peri_gpio_db_clk divider */
714*177ba1f9SLey Foon Tan 	writel(per_cfg->cntr5clk_cnt |
715*177ba1f9SLey Foon Tan 	       (per_cfg->cntr5clk_src << CLKMGR_PERPLL_CNTR5CLK_SRC_LSB),
716*177ba1f9SLey Foon Tan 	       &clock_manager_base->per_pll.cntr5clk);
717*177ba1f9SLey Foon Tan 	/* peri_sdmmc_clk divider */
718*177ba1f9SLey Foon Tan 	writel(per_cfg->cntr6clk_cnt |
719*177ba1f9SLey Foon Tan 	       (per_cfg->cntr6clk_src << CLKMGR_PERPLL_CNTR6CLK_SRC_LSB),
720*177ba1f9SLey Foon Tan 	       &clock_manager_base->per_pll.cntr6clk);
721*177ba1f9SLey Foon Tan 	/* peri_s2f_user0_clk divider */
722*177ba1f9SLey Foon Tan 	writel(per_cfg->cntr7clk_cnt, &clock_manager_base->per_pll.cntr7clk);
723*177ba1f9SLey Foon Tan 	/* peri_s2f_user1_clk divider */
724*177ba1f9SLey Foon Tan 	writel(per_cfg->cntr8clk_cnt |
725*177ba1f9SLey Foon Tan 	       (per_cfg->cntr8clk_src << CLKMGR_PERPLL_CNTR8CLK_SRC_LSB),
726*177ba1f9SLey Foon Tan 	       &clock_manager_base->per_pll.cntr8clk);
727*177ba1f9SLey Foon Tan 	/* peri_hmc_pll_clk divider */
728*177ba1f9SLey Foon Tan 	writel(per_cfg->cntr9clk_cnt, &clock_manager_base->per_pll.cntr9clk);
729*177ba1f9SLey Foon Tan 
730*177ba1f9SLey Foon Tan 	/* setup all the external PLL counter */
731*177ba1f9SLey Foon Tan 	/* mpu wrapper / external divider */
732*177ba1f9SLey Foon Tan 	writel(main_cfg->mpuclk_cnt |
733*177ba1f9SLey Foon Tan 	       (main_cfg->mpuclk_src << CLKMGR_MAINPLL_MPUCLK_SRC_LSB),
734*177ba1f9SLey Foon Tan 	       &clock_manager_base->main_pll.mpuclk);
735*177ba1f9SLey Foon Tan 	/* NOC wrapper / external divider */
736*177ba1f9SLey Foon Tan 	writel(main_cfg->nocclk_cnt |
737*177ba1f9SLey Foon Tan 	       (main_cfg->nocclk_src << CLKMGR_MAINPLL_NOCCLK_SRC_LSB),
738*177ba1f9SLey Foon Tan 	       &clock_manager_base->main_pll.nocclk);
739*177ba1f9SLey Foon Tan 	/* NOC subclock divider such as l4 */
740*177ba1f9SLey Foon Tan 	writel(main_cfg->nocdiv_l4mainclk |
741*177ba1f9SLey Foon Tan 	       (main_cfg->nocdiv_l4mpclk <<
742*177ba1f9SLey Foon Tan 		CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB) |
743*177ba1f9SLey Foon Tan 	       (main_cfg->nocdiv_l4spclk <<
744*177ba1f9SLey Foon Tan 		CLKMGR_MAINPLL_NOCDIV_L4SPCLK_LSB) |
745*177ba1f9SLey Foon Tan 	       (main_cfg->nocdiv_csatclk <<
746*177ba1f9SLey Foon Tan 		CLKMGR_MAINPLL_NOCDIV_CSATCLK_LSB) |
747*177ba1f9SLey Foon Tan 	       (main_cfg->nocdiv_cstraceclk <<
748*177ba1f9SLey Foon Tan 		CLKMGR_MAINPLL_NOCDIV_CSTRACECLK_LSB) |
749*177ba1f9SLey Foon Tan 	       (main_cfg->nocdiv_cspdbclk <<
750*177ba1f9SLey Foon Tan 		CLKMGR_MAINPLL_NOCDIV_CSPDBGCLK_LSB),
751*177ba1f9SLey Foon Tan 		&clock_manager_base->main_pll.nocdiv);
752*177ba1f9SLey Foon Tan 	/* gpio_db external divider */
753*177ba1f9SLey Foon Tan 	writel(per_cfg->gpiodiv_gpiodbclk,
754*177ba1f9SLey Foon Tan 	       &clock_manager_base->per_pll.gpiodiv);
755*177ba1f9SLey Foon Tan 
756*177ba1f9SLey Foon Tan 	/* setup the EMAC clock mux select */
757*177ba1f9SLey Foon Tan 	writel((per_cfg->emacctl_emac0sel <<
758*177ba1f9SLey Foon Tan 		CLKMGR_PERPLL_EMACCTL_EMAC0SEL_LSB) |
759*177ba1f9SLey Foon Tan 	       (per_cfg->emacctl_emac1sel <<
760*177ba1f9SLey Foon Tan 		CLKMGR_PERPLL_EMACCTL_EMAC1SEL_LSB) |
761*177ba1f9SLey Foon Tan 	       (per_cfg->emacctl_emac2sel <<
762*177ba1f9SLey Foon Tan 		CLKMGR_PERPLL_EMACCTL_EMAC2SEL_LSB),
763*177ba1f9SLey Foon Tan 	       &clock_manager_base->per_pll.emacctl);
764*177ba1f9SLey Foon Tan 
765*177ba1f9SLey Foon Tan 	/* at this stage, check for PLL lock status */
766*177ba1f9SLey Foon Tan 	cm_wait_for_lock(LOCKED_MASK);
767*177ba1f9SLey Foon Tan 
768*177ba1f9SLey Foon Tan 	/*
769*177ba1f9SLey Foon Tan 	 * after locking, but before taking out of bypass,
770*177ba1f9SLey Foon Tan 	 * assert/deassert outresetall
771*177ba1f9SLey Foon Tan 	 */
772*177ba1f9SLey Foon Tan 	/* assert mainpll outresetall */
773*177ba1f9SLey Foon Tan 	setbits_le32(&clock_manager_base->main_pll.vco0,
774*177ba1f9SLey Foon Tan 		     CLKMGR_MAINPLL_VCO0_OUTRSTALL_SET_MSK);
775*177ba1f9SLey Foon Tan 	/* assert perpll outresetall */
776*177ba1f9SLey Foon Tan 	setbits_le32(&clock_manager_base->per_pll.vco0,
777*177ba1f9SLey Foon Tan 		     CLKMGR_PERPLL_VCO0_OUTRSTALL_SET_MSK);
778*177ba1f9SLey Foon Tan 	/* de-assert mainpll outresetall */
779*177ba1f9SLey Foon Tan 	clrbits_le32(&clock_manager_base->main_pll.vco0,
780*177ba1f9SLey Foon Tan 		     CLKMGR_MAINPLL_VCO0_OUTRSTALL_SET_MSK);
781*177ba1f9SLey Foon Tan 	/* de-assert perpll outresetall */
782*177ba1f9SLey Foon Tan 	clrbits_le32(&clock_manager_base->per_pll.vco0,
783*177ba1f9SLey Foon Tan 		     CLKMGR_PERPLL_VCO0_OUTRSTALL_SET_MSK);
784*177ba1f9SLey Foon Tan 
785*177ba1f9SLey Foon Tan 	/* Take all PLLs out of bypass when boot mode is cleared. */
786*177ba1f9SLey Foon Tan 	/* release mainpll from bypass */
787*177ba1f9SLey Foon Tan 	writel(CLKMGR_MAINPLL_BYPASS_RESET,
788*177ba1f9SLey Foon Tan 	       &clock_manager_base->main_pll.bypassr);
789*177ba1f9SLey Foon Tan 	/* wait till Clock Manager is not busy */
790*177ba1f9SLey Foon Tan 	cm_wait_for_fsm();
791*177ba1f9SLey Foon Tan 
792*177ba1f9SLey Foon Tan 	/* release perpll from bypass */
793*177ba1f9SLey Foon Tan 	writel(CLKMGR_PERPLL_BYPASS_RESET,
794*177ba1f9SLey Foon Tan 	       &clock_manager_base->per_pll.bypassr);
795*177ba1f9SLey Foon Tan 	/* wait till Clock Manager is not busy */
796*177ba1f9SLey Foon Tan 	cm_wait_for_fsm();
797*177ba1f9SLey Foon Tan 
798*177ba1f9SLey Foon Tan 	/* clear boot mode */
799*177ba1f9SLey Foon Tan 	clrbits_le32(&clock_manager_base->ctrl,
800*177ba1f9SLey Foon Tan 		     CLKMGR_CLKMGR_CTL_BOOTMOD_SET_MSK);
801*177ba1f9SLey Foon Tan 	/* wait till Clock Manager is not busy */
802*177ba1f9SLey Foon Tan 	cm_wait_for_fsm();
803*177ba1f9SLey Foon Tan 
804*177ba1f9SLey Foon Tan 	/* At here, we need to ramp to final value if needed */
805*177ba1f9SLey Foon Tan 	if (pll_ramp_main_hz != 0)
806*177ba1f9SLey Foon Tan 		cm_pll_ramp_main(main_cfg, per_cfg, pll_ramp_main_hz);
807*177ba1f9SLey Foon Tan 	if (pll_ramp_periph_hz != 0)
808*177ba1f9SLey Foon Tan 		cm_pll_ramp_periph(main_cfg, per_cfg, pll_ramp_periph_hz);
809*177ba1f9SLey Foon Tan 
810*177ba1f9SLey Foon Tan 	/* Now ungate non-hw-managed clocks */
811*177ba1f9SLey Foon Tan 	writel(CLKMGR_MAINPLL_EN_S2FUSER0CLKEN_SET_MSK |
812*177ba1f9SLey Foon Tan 		CLKMGR_MAINPLL_EN_HMCPLLREFCLKEN_SET_MSK,
813*177ba1f9SLey Foon Tan 		&clock_manager_base->main_pll.ens);
814*177ba1f9SLey Foon Tan 	writel(CLKMGR_PERPLL_EN_RESET, &clock_manager_base->per_pll.ens);
815*177ba1f9SLey Foon Tan 
816*177ba1f9SLey Foon Tan 	/* Clear the loss lock and slip bits as they might set during
817*177ba1f9SLey Foon Tan 	clock reconfiguration */
818*177ba1f9SLey Foon Tan 	writel(CLKMGR_CLKMGR_INTR_MAINPLLLOST_SET_MSK |
819*177ba1f9SLey Foon Tan 	       CLKMGR_CLKMGR_INTR_PERPLLLOST_SET_MSK |
820*177ba1f9SLey Foon Tan 	       CLKMGR_CLKMGR_INTR_MAINPLLRFSLIP_SET_MSK |
821*177ba1f9SLey Foon Tan 	       CLKMGR_CLKMGR_INTR_PERPLLRFSLIP_SET_MSK |
822*177ba1f9SLey Foon Tan 	       CLKMGR_CLKMGR_INTR_MAINPLLFBSLIP_SET_MSK |
823*177ba1f9SLey Foon Tan 	       CLKMGR_CLKMGR_INTR_PERPLLFBSLIP_SET_MSK,
824*177ba1f9SLey Foon Tan 	       &clock_manager_base->intr);
825*177ba1f9SLey Foon Tan 
826*177ba1f9SLey Foon Tan 	return 0;
827*177ba1f9SLey Foon Tan }
828*177ba1f9SLey Foon Tan 
cm_use_intosc(void)829*177ba1f9SLey Foon Tan void cm_use_intosc(void)
830*177ba1f9SLey Foon Tan {
831*177ba1f9SLey Foon Tan 	setbits_le32(&clock_manager_base->ctrl,
832*177ba1f9SLey Foon Tan 		     CLKMGR_CLKMGR_CTL_BOOTCLK_INTOSC_SET_MSK);
833*177ba1f9SLey Foon Tan }
834*177ba1f9SLey Foon Tan 
cm_get_noc_clk_hz(void)835*177ba1f9SLey Foon Tan unsigned int cm_get_noc_clk_hz(void)
836*177ba1f9SLey Foon Tan {
837*177ba1f9SLey Foon Tan 	unsigned int clk_src, divisor, nocclk, src_hz;
838*177ba1f9SLey Foon Tan 
839*177ba1f9SLey Foon Tan 	nocclk = readl(&clock_manager_base->main_pll.nocclk);
840*177ba1f9SLey Foon Tan 	clk_src = (nocclk >> CLKMGR_MAINPLL_NOCCLK_SRC_LSB) &
841*177ba1f9SLey Foon Tan 		  CLKMGR_MAINPLL_NOCCLK_SRC_MSK;
842*177ba1f9SLey Foon Tan 
843*177ba1f9SLey Foon Tan 	divisor = 1 + (nocclk & CLKMGR_MAINPLL_NOCDIV_MSK);
844*177ba1f9SLey Foon Tan 
845*177ba1f9SLey Foon Tan 	if (clk_src == CLKMGR_PERPLLGRP_SRC_MAIN) {
846*177ba1f9SLey Foon Tan 		src_hz = cm_get_main_vco_clk_hz();
847*177ba1f9SLey Foon Tan 		src_hz /= 1 +
848*177ba1f9SLey Foon Tan 		(readl(SOCFPGA_CLKMGR_ADDRESS + CLKMGR_MAINPLL_NOC_CLK_OFFSET) &
849*177ba1f9SLey Foon Tan 		CLKMGR_MAINPLL_NOCCLK_CNT_MSK);
850*177ba1f9SLey Foon Tan 	} else if (clk_src == CLKMGR_PERPLLGRP_SRC_PERI) {
851*177ba1f9SLey Foon Tan 		src_hz = cm_get_per_vco_clk_hz();
852*177ba1f9SLey Foon Tan 		src_hz /= 1 +
853*177ba1f9SLey Foon Tan 		((readl(SOCFPGA_CLKMGR_ADDRESS +
854*177ba1f9SLey Foon Tan 			CLKMGR_MAINPLL_NOC_CLK_OFFSET) >>
855*177ba1f9SLey Foon Tan 			CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB) &
856*177ba1f9SLey Foon Tan 			CLKMGR_MAINPLL_NOCCLK_CNT_MSK);
857*177ba1f9SLey Foon Tan 	} else if (clk_src == CLKMGR_PERPLLGRP_SRC_OSC1) {
858*177ba1f9SLey Foon Tan 		src_hz = eosc1_hz;
859*177ba1f9SLey Foon Tan 	} else if (clk_src == CLKMGR_PERPLLGRP_SRC_INTOSC) {
860*177ba1f9SLey Foon Tan 		src_hz = cb_intosc_hz;
861*177ba1f9SLey Foon Tan 	} else if (clk_src == CLKMGR_PERPLLGRP_SRC_FPGA) {
862*177ba1f9SLey Foon Tan 		src_hz = f2s_free_hz;
863*177ba1f9SLey Foon Tan 	} else {
864*177ba1f9SLey Foon Tan 		src_hz = 0;
865*177ba1f9SLey Foon Tan 	}
866*177ba1f9SLey Foon Tan 
867*177ba1f9SLey Foon Tan 	return src_hz / divisor;
868*177ba1f9SLey Foon Tan }
869*177ba1f9SLey Foon Tan 
cm_get_l4_noc_hz(unsigned int nocdivshift)870*177ba1f9SLey Foon Tan unsigned int cm_get_l4_noc_hz(unsigned int nocdivshift)
871*177ba1f9SLey Foon Tan {
872*177ba1f9SLey Foon Tan 	unsigned int divisor2 = 1 <<
873*177ba1f9SLey Foon Tan 		((readl(&clock_manager_base->main_pll.nocdiv) >>
874*177ba1f9SLey Foon Tan 			nocdivshift) & CLKMGR_MAINPLL_NOCDIV_MSK);
875*177ba1f9SLey Foon Tan 
876*177ba1f9SLey Foon Tan 	return cm_get_noc_clk_hz() / divisor2;
877*177ba1f9SLey Foon Tan }
878*177ba1f9SLey Foon Tan 
cm_basic_init(const void * blob)879*177ba1f9SLey Foon Tan int cm_basic_init(const void *blob)
880*177ba1f9SLey Foon Tan {
881*177ba1f9SLey Foon Tan 	struct mainpll_cfg main_cfg;
882*177ba1f9SLey Foon Tan 	struct perpll_cfg per_cfg;
883*177ba1f9SLey Foon Tan 	struct alteragrp_cfg altrgrp_cfg;
884*177ba1f9SLey Foon Tan 	int rval;
885*177ba1f9SLey Foon Tan 
886*177ba1f9SLey Foon Tan 	/* initialize to zero for use case of optional node */
887*177ba1f9SLey Foon Tan 	memset(&main_cfg, 0, sizeof(main_cfg));
888*177ba1f9SLey Foon Tan 	memset(&per_cfg, 0, sizeof(per_cfg));
889*177ba1f9SLey Foon Tan 	memset(&altrgrp_cfg, 0, sizeof(altrgrp_cfg));
890*177ba1f9SLey Foon Tan 
891*177ba1f9SLey Foon Tan 	rval = of_get_clk_cfg(blob, &main_cfg, &per_cfg, &altrgrp_cfg);
892*177ba1f9SLey Foon Tan 	if (rval)
893*177ba1f9SLey Foon Tan 		return rval;
894*177ba1f9SLey Foon Tan 
895*177ba1f9SLey Foon Tan 	rval =  cm_full_cfg(&main_cfg, &per_cfg);
896*177ba1f9SLey Foon Tan 
897*177ba1f9SLey Foon Tan 	cm_l4_main_clk_hz =
898*177ba1f9SLey Foon Tan 		cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB);
899*177ba1f9SLey Foon Tan 
900*177ba1f9SLey Foon Tan 	cm_l4_mp_clk_hz = cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB);
901*177ba1f9SLey Foon Tan 
902*177ba1f9SLey Foon Tan 	cm_l4_sp_clk_hz = cm_get_l4_sp_clk_hz();
903*177ba1f9SLey Foon Tan 
904*177ba1f9SLey Foon Tan 	cm_l4_sys_free_clk_hz = cm_get_noc_clk_hz() / 4;
905*177ba1f9SLey Foon Tan 
906*177ba1f9SLey Foon Tan 	return rval;
907*177ba1f9SLey Foon Tan }
908*177ba1f9SLey Foon Tan 
cm_get_mpu_clk_hz(void)909*177ba1f9SLey Foon Tan unsigned long cm_get_mpu_clk_hz(void)
910*177ba1f9SLey Foon Tan {
911*177ba1f9SLey Foon Tan 	u32 reg, clk_hz;
912*177ba1f9SLey Foon Tan 	u32 clk_src, mainmpuclk_reg;
913*177ba1f9SLey Foon Tan 
914*177ba1f9SLey Foon Tan 	mainmpuclk_reg = readl(&clock_manager_base->main_pll.mpuclk);
915*177ba1f9SLey Foon Tan 
916*177ba1f9SLey Foon Tan 	clk_src = (mainmpuclk_reg >> CLKMGR_MAINPLL_MPUCLK_SRC_LSB) &
917*177ba1f9SLey Foon Tan 		CLKMGR_MAINPLL_MPUCLK_SRC_MSK;
918*177ba1f9SLey Foon Tan 
919*177ba1f9SLey Foon Tan 	reg = readl(&clock_manager_base->altera.mpuclk);
920*177ba1f9SLey Foon Tan 	/* Check MPU clock source: main, periph, osc1, intosc or f2s? */
921*177ba1f9SLey Foon Tan 	switch (clk_src) {
922*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_MPUCLK_SRC_MAIN:
923*177ba1f9SLey Foon Tan 		clk_hz = cm_get_main_vco_clk_hz();
924*177ba1f9SLey Foon Tan 		clk_hz /= (reg & CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1;
925*177ba1f9SLey Foon Tan 		break;
926*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_MPUCLK_SRC_PERI:
927*177ba1f9SLey Foon Tan 		clk_hz = cm_get_per_vco_clk_hz();
928*177ba1f9SLey Foon Tan 		clk_hz /= (((reg >> CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB) &
929*177ba1f9SLey Foon Tan 			   CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1);
930*177ba1f9SLey Foon Tan 		break;
931*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_MPUCLK_SRC_OSC1:
932*177ba1f9SLey Foon Tan 		clk_hz = eosc1_hz;
933*177ba1f9SLey Foon Tan 		break;
934*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_MPUCLK_SRC_INTOSC:
935*177ba1f9SLey Foon Tan 		clk_hz = cb_intosc_hz;
936*177ba1f9SLey Foon Tan 		break;
937*177ba1f9SLey Foon Tan 	case CLKMGR_MAINPLL_MPUCLK_SRC_FPGA:
938*177ba1f9SLey Foon Tan 		clk_hz = f2s_free_hz;
939*177ba1f9SLey Foon Tan 		break;
940*177ba1f9SLey Foon Tan 	default:
941*177ba1f9SLey Foon Tan 		printf("cm_get_mpu_clk_hz invalid clk_src %d\n", clk_src);
942*177ba1f9SLey Foon Tan 		return 0;
943*177ba1f9SLey Foon Tan 	}
944*177ba1f9SLey Foon Tan 
945*177ba1f9SLey Foon Tan 	clk_hz /= (mainmpuclk_reg & CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1;
946*177ba1f9SLey Foon Tan 
947*177ba1f9SLey Foon Tan 	return clk_hz;
948*177ba1f9SLey Foon Tan }
949*177ba1f9SLey Foon Tan 
cm_get_per_vco_clk_hz(void)950*177ba1f9SLey Foon Tan unsigned int cm_get_per_vco_clk_hz(void)
951*177ba1f9SLey Foon Tan {
952*177ba1f9SLey Foon Tan 	u32 src_hz = 0;
953*177ba1f9SLey Foon Tan 	u32 clk_src = 0;
954*177ba1f9SLey Foon Tan 	u32 numer = 0;
955*177ba1f9SLey Foon Tan 	u32 denom = 0;
956*177ba1f9SLey Foon Tan 	u32 vco = 0;
957*177ba1f9SLey Foon Tan 
958*177ba1f9SLey Foon Tan 	clk_src = readl(&clock_manager_base->per_pll.vco0);
959*177ba1f9SLey Foon Tan 
960*177ba1f9SLey Foon Tan 	clk_src = (clk_src >> CLKMGR_PERPLL_VCO0_PSRC_LSB) &
961*177ba1f9SLey Foon Tan 		CLKMGR_PERPLL_VCO0_PSRC_MSK;
962*177ba1f9SLey Foon Tan 
963*177ba1f9SLey Foon Tan 	if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_EOSC) {
964*177ba1f9SLey Foon Tan 		src_hz = eosc1_hz;
965*177ba1f9SLey Foon Tan 	} else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC) {
966*177ba1f9SLey Foon Tan 		src_hz = cb_intosc_hz;
967*177ba1f9SLey Foon Tan 	} else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_F2S) {
968*177ba1f9SLey Foon Tan 		src_hz = f2s_free_hz;
969*177ba1f9SLey Foon Tan 	} else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_MAIN) {
970*177ba1f9SLey Foon Tan 		src_hz = cm_get_main_vco_clk_hz();
971*177ba1f9SLey Foon Tan 		src_hz /= (readl(&clock_manager_base->main_pll.cntr15clk) &
972*177ba1f9SLey Foon Tan 			CLKMGR_MAINPLL_CNTRCLK_MSK) + 1;
973*177ba1f9SLey Foon Tan 	} else {
974*177ba1f9SLey Foon Tan 		printf("cm_get_per_vco_clk_hz invalid clk_src %d\n", clk_src);
975*177ba1f9SLey Foon Tan 		return 0;
976*177ba1f9SLey Foon Tan 	}
977*177ba1f9SLey Foon Tan 
978*177ba1f9SLey Foon Tan 	vco = readl(&clock_manager_base->per_pll.vco1);
979*177ba1f9SLey Foon Tan 
980*177ba1f9SLey Foon Tan 	numer = vco & CLKMGR_PERPLL_VCO1_NUMER_MSK;
981*177ba1f9SLey Foon Tan 
982*177ba1f9SLey Foon Tan 	denom = (vco >> CLKMGR_PERPLL_VCO1_DENOM_LSB) &
983*177ba1f9SLey Foon Tan 			CLKMGR_PERPLL_VCO1_DENOM_MSK;
984*177ba1f9SLey Foon Tan 
985*177ba1f9SLey Foon Tan 	vco = src_hz;
986*177ba1f9SLey Foon Tan 	vco /= 1 + denom;
987*177ba1f9SLey Foon Tan 	vco *= 1 + numer;
988*177ba1f9SLey Foon Tan 
989*177ba1f9SLey Foon Tan 	return vco;
990*177ba1f9SLey Foon Tan }
991*177ba1f9SLey Foon Tan 
cm_get_main_vco_clk_hz(void)992*177ba1f9SLey Foon Tan unsigned int cm_get_main_vco_clk_hz(void)
993*177ba1f9SLey Foon Tan {
994*177ba1f9SLey Foon Tan 	u32 src_hz, numer, denom, vco;
995*177ba1f9SLey Foon Tan 
996*177ba1f9SLey Foon Tan 	u32 clk_src = readl(&clock_manager_base->main_pll.vco0);
997*177ba1f9SLey Foon Tan 
998*177ba1f9SLey Foon Tan 	clk_src = (clk_src >> CLKMGR_MAINPLL_VCO0_PSRC_LSB) &
999*177ba1f9SLey Foon Tan 		CLKMGR_MAINPLL_VCO0_PSRC_MSK;
1000*177ba1f9SLey Foon Tan 
1001*177ba1f9SLey Foon Tan 	if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_EOSC) {
1002*177ba1f9SLey Foon Tan 		src_hz = eosc1_hz;
1003*177ba1f9SLey Foon Tan 	} else if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC) {
1004*177ba1f9SLey Foon Tan 		src_hz = cb_intosc_hz;
1005*177ba1f9SLey Foon Tan 	} else if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_F2S) {
1006*177ba1f9SLey Foon Tan 		src_hz = f2s_free_hz;
1007*177ba1f9SLey Foon Tan 	} else {
1008*177ba1f9SLey Foon Tan 		printf("cm_get_main_vco_clk_hz invalid clk_src %d\n", clk_src);
1009*177ba1f9SLey Foon Tan 		return 0;
1010*177ba1f9SLey Foon Tan 	}
1011*177ba1f9SLey Foon Tan 
1012*177ba1f9SLey Foon Tan 	vco = readl(&clock_manager_base->main_pll.vco1);
1013*177ba1f9SLey Foon Tan 
1014*177ba1f9SLey Foon Tan 	numer = vco & CLKMGR_MAINPLL_VCO1_NUMER_MSK;
1015*177ba1f9SLey Foon Tan 
1016*177ba1f9SLey Foon Tan 	denom = (vco >> CLKMGR_MAINPLL_VCO1_DENOM_LSB) &
1017*177ba1f9SLey Foon Tan 			CLKMGR_MAINPLL_VCO1_DENOM_MSK;
1018*177ba1f9SLey Foon Tan 
1019*177ba1f9SLey Foon Tan 	vco = src_hz;
1020*177ba1f9SLey Foon Tan 	vco /= 1 + denom;
1021*177ba1f9SLey Foon Tan 	vco *= 1 + numer;
1022*177ba1f9SLey Foon Tan 
1023*177ba1f9SLey Foon Tan 	return vco;
1024*177ba1f9SLey Foon Tan }
1025*177ba1f9SLey Foon Tan 
cm_get_l4_sp_clk_hz(void)1026*177ba1f9SLey Foon Tan unsigned int cm_get_l4_sp_clk_hz(void)
1027*177ba1f9SLey Foon Tan {
1028*177ba1f9SLey Foon Tan 	return cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4SPCLK_LSB);
1029*177ba1f9SLey Foon Tan }
1030*177ba1f9SLey Foon Tan 
cm_get_mmc_controller_clk_hz(void)1031*177ba1f9SLey Foon Tan unsigned int cm_get_mmc_controller_clk_hz(void)
1032*177ba1f9SLey Foon Tan {
1033*177ba1f9SLey Foon Tan 	u32 clk_hz = 0;
1034*177ba1f9SLey Foon Tan 	u32 clk_input = 0;
1035*177ba1f9SLey Foon Tan 
1036*177ba1f9SLey Foon Tan 	clk_input = readl(&clock_manager_base->per_pll.cntr6clk);
1037*177ba1f9SLey Foon Tan 	clk_input = (clk_input >> CLKMGR_PERPLL_CNTR6CLK_SRC_LSB) &
1038*177ba1f9SLey Foon Tan 		CLKMGR_PERPLLGRP_SRC_MSK;
1039*177ba1f9SLey Foon Tan 
1040*177ba1f9SLey Foon Tan 	switch (clk_input) {
1041*177ba1f9SLey Foon Tan 	case CLKMGR_PERPLLGRP_SRC_MAIN:
1042*177ba1f9SLey Foon Tan 		clk_hz = cm_get_main_vco_clk_hz();
1043*177ba1f9SLey Foon Tan 		clk_hz /= 1 + (readl(&clock_manager_base->main_pll.cntr6clk) &
1044*177ba1f9SLey Foon Tan 			CLKMGR_MAINPLL_CNTRCLK_MSK);
1045*177ba1f9SLey Foon Tan 		break;
1046*177ba1f9SLey Foon Tan 
1047*177ba1f9SLey Foon Tan 	case CLKMGR_PERPLLGRP_SRC_PERI:
1048*177ba1f9SLey Foon Tan 		clk_hz = cm_get_per_vco_clk_hz();
1049*177ba1f9SLey Foon Tan 		clk_hz /= 1 + (readl(&clock_manager_base->per_pll.cntr6clk) &
1050*177ba1f9SLey Foon Tan 			CLKMGR_PERPLL_CNTRCLK_MSK);
1051*177ba1f9SLey Foon Tan 		break;
1052*177ba1f9SLey Foon Tan 
1053*177ba1f9SLey Foon Tan 	case CLKMGR_PERPLLGRP_SRC_OSC1:
1054*177ba1f9SLey Foon Tan 		clk_hz = eosc1_hz;
1055*177ba1f9SLey Foon Tan 		break;
1056*177ba1f9SLey Foon Tan 
1057*177ba1f9SLey Foon Tan 	case CLKMGR_PERPLLGRP_SRC_INTOSC:
1058*177ba1f9SLey Foon Tan 		clk_hz = cb_intosc_hz;
1059*177ba1f9SLey Foon Tan 		break;
1060*177ba1f9SLey Foon Tan 
1061*177ba1f9SLey Foon Tan 	case CLKMGR_PERPLLGRP_SRC_FPGA:
1062*177ba1f9SLey Foon Tan 		clk_hz = f2s_free_hz;
1063*177ba1f9SLey Foon Tan 		break;
1064*177ba1f9SLey Foon Tan 	}
1065*177ba1f9SLey Foon Tan 
1066*177ba1f9SLey Foon Tan 	return clk_hz / 4;
1067*177ba1f9SLey Foon Tan }
1068*177ba1f9SLey Foon Tan 
cm_get_spi_controller_clk_hz(void)1069*177ba1f9SLey Foon Tan unsigned int cm_get_spi_controller_clk_hz(void)
1070*177ba1f9SLey Foon Tan {
1071*177ba1f9SLey Foon Tan 	return cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB);
1072*177ba1f9SLey Foon Tan }
1073*177ba1f9SLey Foon Tan 
cm_get_qspi_controller_clk_hz(void)1074*177ba1f9SLey Foon Tan unsigned int cm_get_qspi_controller_clk_hz(void)
1075*177ba1f9SLey Foon Tan {
1076*177ba1f9SLey Foon Tan 	return  cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB);
1077*177ba1f9SLey Foon Tan }
1078*177ba1f9SLey Foon Tan 
cm_print_clock_quick_summary(void)1079*177ba1f9SLey Foon Tan void cm_print_clock_quick_summary(void)
1080*177ba1f9SLey Foon Tan {
1081*177ba1f9SLey Foon Tan 	printf("MPU       %10ld kHz\n", cm_get_mpu_clk_hz() / 1000);
1082*177ba1f9SLey Foon Tan 	printf("MMC         %8d kHz\n", cm_get_mmc_controller_clk_hz() / 1000);
1083*177ba1f9SLey Foon Tan 	printf("QSPI        %8d kHz\n", cm_get_qspi_controller_clk_hz() / 1000);
1084*177ba1f9SLey Foon Tan 	printf("SPI         %8d kHz\n", cm_get_spi_controller_clk_hz() / 1000);
1085*177ba1f9SLey Foon Tan 	printf("EOSC1       %8d kHz\n", eosc1_hz / 1000);
1086*177ba1f9SLey Foon Tan 	printf("cb_intosc   %8d kHz\n", cb_intosc_hz / 1000);
1087*177ba1f9SLey Foon Tan 	printf("f2s_free    %8d kHz\n", f2s_free_hz / 1000);
1088*177ba1f9SLey Foon Tan 	printf("Main VCO    %8d kHz\n", cm_get_main_vco_clk_hz() / 1000);
1089*177ba1f9SLey Foon Tan 	printf("NOC         %8d kHz\n", cm_get_noc_clk_hz() / 1000);
1090*177ba1f9SLey Foon Tan 	printf("L4 Main	    %8d kHz\n",
1091*177ba1f9SLey Foon Tan 	       cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB) / 1000);
1092*177ba1f9SLey Foon Tan 	printf("L4 MP       %8d kHz\n",
1093*177ba1f9SLey Foon Tan 	       cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB) / 1000);
1094*177ba1f9SLey Foon Tan 	printf("L4 SP       %8d kHz\n", cm_get_l4_sp_clk_hz() / 1000);
1095*177ba1f9SLey Foon Tan 	printf("L4 sys free %8d kHz\n", cm_l4_sys_free_clk_hz / 1000);
1096*177ba1f9SLey Foon Tan }
1097