xref: /OK3568_Linux_fs/u-boot/arch/powerpc/cpu/mpc85xx/speed.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2004, 2007-2011 Freescale Semiconductor, Inc.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * (C) Copyright 2003 Motorola Inc.
5*4882a593Smuzhiyun  * Xianghua Xiao, (X.Xiao@motorola.com)
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * (C) Copyright 2000
8*4882a593Smuzhiyun  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
11*4882a593Smuzhiyun  */
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <common.h>
14*4882a593Smuzhiyun #include <ppc_asm.tmpl>
15*4882a593Smuzhiyun #include <linux/compiler.h>
16*4882a593Smuzhiyun #include <asm/processor.h>
17*4882a593Smuzhiyun #include <asm/io.h>
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #ifndef CONFIG_SYS_FSL_NUM_CC_PLLS
23*4882a593Smuzhiyun #define CONFIG_SYS_FSL_NUM_CC_PLLS	6
24*4882a593Smuzhiyun #endif
25*4882a593Smuzhiyun /* --------------------------------------------------------------- */
26*4882a593Smuzhiyun 
get_sys_info(sys_info_t * sys_info)27*4882a593Smuzhiyun void get_sys_info(sys_info_t *sys_info)
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun 	volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
30*4882a593Smuzhiyun #ifdef CONFIG_FSL_CORENET
31*4882a593Smuzhiyun 	volatile ccsr_clk_t *clk = (void *)(CONFIG_SYS_FSL_CORENET_CLK_ADDR);
32*4882a593Smuzhiyun 	unsigned int cpu;
33*4882a593Smuzhiyun #ifdef CONFIG_HETROGENOUS_CLUSTERS
34*4882a593Smuzhiyun 	unsigned int dsp_cpu;
35*4882a593Smuzhiyun 	uint rcw_tmp1, rcw_tmp2;
36*4882a593Smuzhiyun #endif
37*4882a593Smuzhiyun #ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
38*4882a593Smuzhiyun 	int cc_group[12] = CONFIG_SYS_FSL_CLUSTER_CLOCKS;
39*4882a593Smuzhiyun #endif
40*4882a593Smuzhiyun 	__maybe_unused u32 svr;
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun 	const u8 core_cplx_PLL[16] = {
43*4882a593Smuzhiyun 		[ 0] = 0,	/* CC1 PPL / 1 */
44*4882a593Smuzhiyun 		[ 1] = 0,	/* CC1 PPL / 2 */
45*4882a593Smuzhiyun 		[ 2] = 0,	/* CC1 PPL / 4 */
46*4882a593Smuzhiyun 		[ 4] = 1,	/* CC2 PPL / 1 */
47*4882a593Smuzhiyun 		[ 5] = 1,	/* CC2 PPL / 2 */
48*4882a593Smuzhiyun 		[ 6] = 1,	/* CC2 PPL / 4 */
49*4882a593Smuzhiyun 		[ 8] = 2,	/* CC3 PPL / 1 */
50*4882a593Smuzhiyun 		[ 9] = 2,	/* CC3 PPL / 2 */
51*4882a593Smuzhiyun 		[10] = 2,	/* CC3 PPL / 4 */
52*4882a593Smuzhiyun 		[12] = 3,	/* CC4 PPL / 1 */
53*4882a593Smuzhiyun 		[13] = 3,	/* CC4 PPL / 2 */
54*4882a593Smuzhiyun 		[14] = 3,	/* CC4 PPL / 4 */
55*4882a593Smuzhiyun 	};
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 	const u8 core_cplx_pll_div[16] = {
58*4882a593Smuzhiyun 		[ 0] = 1,	/* CC1 PPL / 1 */
59*4882a593Smuzhiyun 		[ 1] = 2,	/* CC1 PPL / 2 */
60*4882a593Smuzhiyun 		[ 2] = 4,	/* CC1 PPL / 4 */
61*4882a593Smuzhiyun 		[ 4] = 1,	/* CC2 PPL / 1 */
62*4882a593Smuzhiyun 		[ 5] = 2,	/* CC2 PPL / 2 */
63*4882a593Smuzhiyun 		[ 6] = 4,	/* CC2 PPL / 4 */
64*4882a593Smuzhiyun 		[ 8] = 1,	/* CC3 PPL / 1 */
65*4882a593Smuzhiyun 		[ 9] = 2,	/* CC3 PPL / 2 */
66*4882a593Smuzhiyun 		[10] = 4,	/* CC3 PPL / 4 */
67*4882a593Smuzhiyun 		[12] = 1,	/* CC4 PPL / 1 */
68*4882a593Smuzhiyun 		[13] = 2,	/* CC4 PPL / 2 */
69*4882a593Smuzhiyun 		[14] = 4,	/* CC4 PPL / 4 */
70*4882a593Smuzhiyun 	};
71*4882a593Smuzhiyun 	uint i, freq_c_pll[CONFIG_SYS_FSL_NUM_CC_PLLS];
72*4882a593Smuzhiyun #if !defined(CONFIG_FM_PLAT_CLK_DIV) || !defined(CONFIG_PME_PLAT_CLK_DIV) || \
73*4882a593Smuzhiyun 	defined(CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK)
74*4882a593Smuzhiyun 	uint rcw_tmp;
75*4882a593Smuzhiyun #endif
76*4882a593Smuzhiyun 	uint ratio[CONFIG_SYS_FSL_NUM_CC_PLLS];
77*4882a593Smuzhiyun 	unsigned long sysclk = CONFIG_SYS_CLK_FREQ;
78*4882a593Smuzhiyun 	uint mem_pll_rat;
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun 	sys_info->freq_systembus = sysclk;
81*4882a593Smuzhiyun #ifdef CONFIG_SYS_FSL_SINGLE_SOURCE_CLK
82*4882a593Smuzhiyun 	uint ddr_refclk_sel;
83*4882a593Smuzhiyun 	unsigned int porsr1_sys_clk;
84*4882a593Smuzhiyun 	porsr1_sys_clk = in_be32(&gur->porsr1) >> FSL_DCFG_PORSR1_SYSCLK_SHIFT
85*4882a593Smuzhiyun 						& FSL_DCFG_PORSR1_SYSCLK_MASK;
86*4882a593Smuzhiyun 	if (porsr1_sys_clk == FSL_DCFG_PORSR1_SYSCLK_DIFF)
87*4882a593Smuzhiyun 		sys_info->diff_sysclk = 1;
88*4882a593Smuzhiyun 	else
89*4882a593Smuzhiyun 		sys_info->diff_sysclk = 0;
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 	/*
92*4882a593Smuzhiyun 	 * DDR_REFCLK_SEL rcw bit is used to determine if DDR PLLS
93*4882a593Smuzhiyun 	 * are driven by separate DDR Refclock or single source
94*4882a593Smuzhiyun 	 * differential clock.
95*4882a593Smuzhiyun 	 */
96*4882a593Smuzhiyun 	ddr_refclk_sel = (in_be32(&gur->rcwsr[5]) >>
97*4882a593Smuzhiyun 		      FSL_CORENET2_RCWSR5_DDR_REFCLK_SEL_SHIFT) &
98*4882a593Smuzhiyun 		      FSL_CORENET2_RCWSR5_DDR_REFCLK_SEL_MASK;
99*4882a593Smuzhiyun 	/*
100*4882a593Smuzhiyun 	 * For single source clocking, both ddrclock and sysclock
101*4882a593Smuzhiyun 	 * are driven by differential sysclock.
102*4882a593Smuzhiyun 	 */
103*4882a593Smuzhiyun 	if (ddr_refclk_sel == FSL_CORENET2_RCWSR5_DDR_REFCLK_SINGLE_CLK)
104*4882a593Smuzhiyun 		sys_info->freq_ddrbus = CONFIG_SYS_CLK_FREQ;
105*4882a593Smuzhiyun 	else
106*4882a593Smuzhiyun #endif
107*4882a593Smuzhiyun #ifdef CONFIG_DDR_CLK_FREQ
108*4882a593Smuzhiyun 		sys_info->freq_ddrbus = CONFIG_DDR_CLK_FREQ;
109*4882a593Smuzhiyun #else
110*4882a593Smuzhiyun 		sys_info->freq_ddrbus = sysclk;
111*4882a593Smuzhiyun #endif
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 	sys_info->freq_systembus *= (in_be32(&gur->rcwsr[0]) >> 25) & 0x1f;
114*4882a593Smuzhiyun 	mem_pll_rat = (in_be32(&gur->rcwsr[0]) >>
115*4882a593Smuzhiyun 			FSL_CORENET_RCWSR0_MEM_PLL_RAT_SHIFT)
116*4882a593Smuzhiyun 			& FSL_CORENET_RCWSR0_MEM_PLL_RAT_MASK;
117*4882a593Smuzhiyun #ifdef CONFIG_SYS_FSL_ERRATUM_A007212
118*4882a593Smuzhiyun 	if (mem_pll_rat == 0) {
119*4882a593Smuzhiyun 		mem_pll_rat = (in_be32(&gur->rcwsr[0]) >>
120*4882a593Smuzhiyun 			FSL_CORENET_RCWSR0_MEM_PLL_RAT_RESV_SHIFT) &
121*4882a593Smuzhiyun 			FSL_CORENET_RCWSR0_MEM_PLL_RAT_MASK;
122*4882a593Smuzhiyun 	}
123*4882a593Smuzhiyun #endif
124*4882a593Smuzhiyun 	/* T4240/T4160 Rev2.0 MEM_PLL_RAT uses a value which is half of
125*4882a593Smuzhiyun 	 * T4240/T4160 Rev1.0. eg. It's 12 in Rev1.0, however, for Rev2.0
126*4882a593Smuzhiyun 	 * it uses 6.
127*4882a593Smuzhiyun 	 * T2080 rev 1.1 and later also use half mem_pll comparing with rev 1.0
128*4882a593Smuzhiyun 	 */
129*4882a593Smuzhiyun #if defined(CONFIG_ARCH_T4240) || defined(CONFIG_ARCH_T4160) || \
130*4882a593Smuzhiyun 	defined(CONFIG_ARCH_T2080) || defined(CONFIG_ARCH_T2081)
131*4882a593Smuzhiyun 	svr = get_svr();
132*4882a593Smuzhiyun 	switch (SVR_SOC_VER(svr)) {
133*4882a593Smuzhiyun 	case SVR_T4240:
134*4882a593Smuzhiyun 	case SVR_T4160:
135*4882a593Smuzhiyun 	case SVR_T4120:
136*4882a593Smuzhiyun 	case SVR_T4080:
137*4882a593Smuzhiyun 		if (SVR_MAJ(svr) >= 2)
138*4882a593Smuzhiyun 			mem_pll_rat *= 2;
139*4882a593Smuzhiyun 		break;
140*4882a593Smuzhiyun 	case SVR_T2080:
141*4882a593Smuzhiyun 	case SVR_T2081:
142*4882a593Smuzhiyun 		if ((SVR_MAJ(svr) > 1) || (SVR_MIN(svr) >= 1))
143*4882a593Smuzhiyun 			mem_pll_rat *= 2;
144*4882a593Smuzhiyun 		break;
145*4882a593Smuzhiyun 	default:
146*4882a593Smuzhiyun 		break;
147*4882a593Smuzhiyun 	}
148*4882a593Smuzhiyun #endif
149*4882a593Smuzhiyun 	if (mem_pll_rat > 2)
150*4882a593Smuzhiyun 		sys_info->freq_ddrbus *= mem_pll_rat;
151*4882a593Smuzhiyun 	else
152*4882a593Smuzhiyun 		sys_info->freq_ddrbus = sys_info->freq_systembus * mem_pll_rat;
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	for (i = 0; i < CONFIG_SYS_FSL_NUM_CC_PLLS; i++) {
155*4882a593Smuzhiyun 		ratio[i] = (in_be32(&clk->pllcgsr[i].pllcngsr) >> 1) & 0x3f;
156*4882a593Smuzhiyun 		if (ratio[i] > 4)
157*4882a593Smuzhiyun 			freq_c_pll[i] = sysclk * ratio[i];
158*4882a593Smuzhiyun 		else
159*4882a593Smuzhiyun 			freq_c_pll[i] = sys_info->freq_systembus * ratio[i];
160*4882a593Smuzhiyun 	}
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun #ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
163*4882a593Smuzhiyun 	/*
164*4882a593Smuzhiyun 	 * As per CHASSIS2 architeture total 12 clusters are posible and
165*4882a593Smuzhiyun 	 * Each cluster has up to 4 cores, sharing the same PLL selection.
166*4882a593Smuzhiyun 	 * The cluster clock assignment is SoC defined.
167*4882a593Smuzhiyun 	 *
168*4882a593Smuzhiyun 	 * Total 4 clock groups are possible with 3 PLLs each.
169*4882a593Smuzhiyun 	 * as per array indices, clock group A has 0, 1, 2 numbered PLLs &
170*4882a593Smuzhiyun 	 * clock group B has 3, 4, 6 and so on.
171*4882a593Smuzhiyun 	 *
172*4882a593Smuzhiyun 	 * Clock group A having PLL1, PLL2, PLL3, feeding cores of any cluster
173*4882a593Smuzhiyun 	 * depends upon the SoC architeture. Same applies to other
174*4882a593Smuzhiyun 	 * clock groups and clusters.
175*4882a593Smuzhiyun 	 *
176*4882a593Smuzhiyun 	 */
177*4882a593Smuzhiyun 	for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
178*4882a593Smuzhiyun 		int cluster = fsl_qoriq_core_to_cluster(cpu);
179*4882a593Smuzhiyun 		u32 c_pll_sel = (in_be32(&clk->clkcsr[cluster].clkcncsr) >> 27)
180*4882a593Smuzhiyun 				& 0xf;
181*4882a593Smuzhiyun 		u32 cplx_pll = core_cplx_PLL[c_pll_sel];
182*4882a593Smuzhiyun 		cplx_pll += cc_group[cluster] - 1;
183*4882a593Smuzhiyun 		sys_info->freq_processor[cpu] =
184*4882a593Smuzhiyun 			 freq_c_pll[cplx_pll] / core_cplx_pll_div[c_pll_sel];
185*4882a593Smuzhiyun 	}
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun #ifdef CONFIG_HETROGENOUS_CLUSTERS
188*4882a593Smuzhiyun 	for_each_cpu(i, dsp_cpu, cpu_num_dspcores(), cpu_dsp_mask()) {
189*4882a593Smuzhiyun 		int dsp_cluster = fsl_qoriq_dsp_core_to_cluster(dsp_cpu);
190*4882a593Smuzhiyun 		u32 c_pll_sel = (in_be32
191*4882a593Smuzhiyun 				(&clk->clkcsr[dsp_cluster].clkcncsr) >> 27)
192*4882a593Smuzhiyun 				& 0xf;
193*4882a593Smuzhiyun 		u32 cplx_pll = core_cplx_PLL[c_pll_sel];
194*4882a593Smuzhiyun 		cplx_pll += cc_group[dsp_cluster] - 1;
195*4882a593Smuzhiyun 		sys_info->freq_processor_dsp[dsp_cpu] =
196*4882a593Smuzhiyun 			 freq_c_pll[cplx_pll] / core_cplx_pll_div[c_pll_sel];
197*4882a593Smuzhiyun 	}
198*4882a593Smuzhiyun #endif
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun #if defined(CONFIG_ARCH_B4860) || defined(CONFIG_ARCH_B4420) || \
201*4882a593Smuzhiyun 	defined(CONFIG_ARCH_T2080) || defined(CONFIG_ARCH_T2081)
202*4882a593Smuzhiyun #define FM1_CLK_SEL	0xe0000000
203*4882a593Smuzhiyun #define FM1_CLK_SHIFT	29
204*4882a593Smuzhiyun #elif defined(CONFIG_ARCH_T1024) || defined(CONFIG_ARCH_T1023)
205*4882a593Smuzhiyun #define FM1_CLK_SEL	0x00000007
206*4882a593Smuzhiyun #define FM1_CLK_SHIFT	0
207*4882a593Smuzhiyun #else
208*4882a593Smuzhiyun #define PME_CLK_SEL	0xe0000000
209*4882a593Smuzhiyun #define PME_CLK_SHIFT	29
210*4882a593Smuzhiyun #define FM1_CLK_SEL	0x1c000000
211*4882a593Smuzhiyun #define FM1_CLK_SHIFT	26
212*4882a593Smuzhiyun #endif
213*4882a593Smuzhiyun #if !defined(CONFIG_FM_PLAT_CLK_DIV) || !defined(CONFIG_PME_PLAT_CLK_DIV)
214*4882a593Smuzhiyun #if defined(CONFIG_ARCH_T1024) || defined(CONFIG_ARCH_T1023)
215*4882a593Smuzhiyun 	rcw_tmp = in_be32(&gur->rcwsr[15]) - 4;
216*4882a593Smuzhiyun #else
217*4882a593Smuzhiyun 	rcw_tmp = in_be32(&gur->rcwsr[7]);
218*4882a593Smuzhiyun #endif
219*4882a593Smuzhiyun #endif
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun #ifdef CONFIG_SYS_DPAA_PME
222*4882a593Smuzhiyun #ifndef CONFIG_PME_PLAT_CLK_DIV
223*4882a593Smuzhiyun 	switch ((rcw_tmp & PME_CLK_SEL) >> PME_CLK_SHIFT) {
224*4882a593Smuzhiyun 	case 1:
225*4882a593Smuzhiyun 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK];
226*4882a593Smuzhiyun 		break;
227*4882a593Smuzhiyun 	case 2:
228*4882a593Smuzhiyun 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK] / 2;
229*4882a593Smuzhiyun 		break;
230*4882a593Smuzhiyun 	case 3:
231*4882a593Smuzhiyun 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK] / 3;
232*4882a593Smuzhiyun 		break;
233*4882a593Smuzhiyun 	case 4:
234*4882a593Smuzhiyun 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK] / 4;
235*4882a593Smuzhiyun 		break;
236*4882a593Smuzhiyun 	case 6:
237*4882a593Smuzhiyun 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK + 1] / 2;
238*4882a593Smuzhiyun 		break;
239*4882a593Smuzhiyun 	case 7:
240*4882a593Smuzhiyun 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK + 1] / 3;
241*4882a593Smuzhiyun 		break;
242*4882a593Smuzhiyun 	default:
243*4882a593Smuzhiyun 		printf("Error: Unknown PME clock select!\n");
244*4882a593Smuzhiyun 	case 0:
245*4882a593Smuzhiyun 		sys_info->freq_pme = sys_info->freq_systembus / 2;
246*4882a593Smuzhiyun 		break;
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	}
249*4882a593Smuzhiyun #else
250*4882a593Smuzhiyun 	sys_info->freq_pme = sys_info->freq_systembus / CONFIG_SYS_PME_CLK;
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun #endif
253*4882a593Smuzhiyun #endif
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun #ifdef CONFIG_SYS_DPAA_QBMAN
256*4882a593Smuzhiyun #ifndef CONFIG_QBMAN_CLK_DIV
257*4882a593Smuzhiyun #define CONFIG_QBMAN_CLK_DIV	2
258*4882a593Smuzhiyun #endif
259*4882a593Smuzhiyun 	sys_info->freq_qman = sys_info->freq_systembus / CONFIG_QBMAN_CLK_DIV;
260*4882a593Smuzhiyun #endif
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun #if defined(CONFIG_SYS_MAPLE)
263*4882a593Smuzhiyun #define CPRI_CLK_SEL		0x1C000000
264*4882a593Smuzhiyun #define CPRI_CLK_SHIFT		26
265*4882a593Smuzhiyun #define CPRI_ALT_CLK_SEL	0x00007000
266*4882a593Smuzhiyun #define CPRI_ALT_CLK_SHIFT	12
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 	rcw_tmp1 = in_be32(&gur->rcwsr[7]);	/* Reading RCW bits: 224-255*/
269*4882a593Smuzhiyun 	rcw_tmp2 = in_be32(&gur->rcwsr[15]);	/* Reading RCW bits: 480-511*/
270*4882a593Smuzhiyun 	/* For MAPLE and CPRI frequency */
271*4882a593Smuzhiyun 	switch ((rcw_tmp1 & CPRI_CLK_SEL) >> CPRI_CLK_SHIFT) {
272*4882a593Smuzhiyun 	case 1:
273*4882a593Smuzhiyun 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK];
274*4882a593Smuzhiyun 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK];
275*4882a593Smuzhiyun 		break;
276*4882a593Smuzhiyun 	case 2:
277*4882a593Smuzhiyun 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 2;
278*4882a593Smuzhiyun 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 2;
279*4882a593Smuzhiyun 		break;
280*4882a593Smuzhiyun 	case 3:
281*4882a593Smuzhiyun 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 3;
282*4882a593Smuzhiyun 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 3;
283*4882a593Smuzhiyun 		break;
284*4882a593Smuzhiyun 	case 4:
285*4882a593Smuzhiyun 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 4;
286*4882a593Smuzhiyun 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 4;
287*4882a593Smuzhiyun 		break;
288*4882a593Smuzhiyun 	case 5:
289*4882a593Smuzhiyun 		if (((rcw_tmp2 & CPRI_ALT_CLK_SEL)
290*4882a593Smuzhiyun 					>> CPRI_ALT_CLK_SHIFT) == 6) {
291*4882a593Smuzhiyun 			sys_info->freq_maple =
292*4882a593Smuzhiyun 				freq_c_pll[CONFIG_SYS_CPRI_CLK - 2] / 2;
293*4882a593Smuzhiyun 			sys_info->freq_cpri =
294*4882a593Smuzhiyun 				freq_c_pll[CONFIG_SYS_CPRI_CLK - 2] / 2;
295*4882a593Smuzhiyun 		}
296*4882a593Smuzhiyun 		if (((rcw_tmp2 & CPRI_ALT_CLK_SEL)
297*4882a593Smuzhiyun 					>> CPRI_ALT_CLK_SHIFT) == 7) {
298*4882a593Smuzhiyun 			sys_info->freq_maple =
299*4882a593Smuzhiyun 				freq_c_pll[CONFIG_SYS_CPRI_CLK - 2] / 3;
300*4882a593Smuzhiyun 			sys_info->freq_cpri =
301*4882a593Smuzhiyun 				freq_c_pll[CONFIG_SYS_CPRI_CLK - 2] / 3;
302*4882a593Smuzhiyun 		}
303*4882a593Smuzhiyun 		break;
304*4882a593Smuzhiyun 	case 6:
305*4882a593Smuzhiyun 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK + 1] / 2;
306*4882a593Smuzhiyun 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK + 1] / 2;
307*4882a593Smuzhiyun 		break;
308*4882a593Smuzhiyun 	case 7:
309*4882a593Smuzhiyun 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK + 1] / 3;
310*4882a593Smuzhiyun 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK + 1] / 3;
311*4882a593Smuzhiyun 		break;
312*4882a593Smuzhiyun 	default:
313*4882a593Smuzhiyun 		printf("Error: Unknown MAPLE/CPRI clock select!\n");
314*4882a593Smuzhiyun 	}
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun 	/* For MAPLE ULB and eTVPE frequencies */
317*4882a593Smuzhiyun #define ULB_CLK_SEL		0x00000038
318*4882a593Smuzhiyun #define ULB_CLK_SHIFT		3
319*4882a593Smuzhiyun #define ETVPE_CLK_SEL		0x00000007
320*4882a593Smuzhiyun #define ETVPE_CLK_SHIFT		0
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 	switch ((rcw_tmp2 & ULB_CLK_SEL) >> ULB_CLK_SHIFT) {
323*4882a593Smuzhiyun 	case 1:
324*4882a593Smuzhiyun 		sys_info->freq_maple_ulb = freq_c_pll[CONFIG_SYS_ULB_CLK];
325*4882a593Smuzhiyun 		break;
326*4882a593Smuzhiyun 	case 2:
327*4882a593Smuzhiyun 		sys_info->freq_maple_ulb = freq_c_pll[CONFIG_SYS_ULB_CLK] / 2;
328*4882a593Smuzhiyun 		break;
329*4882a593Smuzhiyun 	case 3:
330*4882a593Smuzhiyun 		sys_info->freq_maple_ulb = freq_c_pll[CONFIG_SYS_ULB_CLK] / 3;
331*4882a593Smuzhiyun 		break;
332*4882a593Smuzhiyun 	case 4:
333*4882a593Smuzhiyun 		sys_info->freq_maple_ulb = freq_c_pll[CONFIG_SYS_ULB_CLK] / 4;
334*4882a593Smuzhiyun 		break;
335*4882a593Smuzhiyun 	case 5:
336*4882a593Smuzhiyun 		sys_info->freq_maple_ulb = sys_info->freq_systembus;
337*4882a593Smuzhiyun 		break;
338*4882a593Smuzhiyun 	case 6:
339*4882a593Smuzhiyun 		sys_info->freq_maple_ulb =
340*4882a593Smuzhiyun 			freq_c_pll[CONFIG_SYS_ULB_CLK - 1] / 2;
341*4882a593Smuzhiyun 		break;
342*4882a593Smuzhiyun 	case 7:
343*4882a593Smuzhiyun 		sys_info->freq_maple_ulb =
344*4882a593Smuzhiyun 			freq_c_pll[CONFIG_SYS_ULB_CLK - 1] / 3;
345*4882a593Smuzhiyun 		break;
346*4882a593Smuzhiyun 	default:
347*4882a593Smuzhiyun 		printf("Error: Unknown MAPLE ULB clock select!\n");
348*4882a593Smuzhiyun 	}
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun 	switch ((rcw_tmp2 & ETVPE_CLK_SEL) >> ETVPE_CLK_SHIFT) {
351*4882a593Smuzhiyun 	case 1:
352*4882a593Smuzhiyun 		sys_info->freq_maple_etvpe = freq_c_pll[CONFIG_SYS_ETVPE_CLK];
353*4882a593Smuzhiyun 		break;
354*4882a593Smuzhiyun 	case 2:
355*4882a593Smuzhiyun 		sys_info->freq_maple_etvpe =
356*4882a593Smuzhiyun 			freq_c_pll[CONFIG_SYS_ETVPE_CLK] / 2;
357*4882a593Smuzhiyun 		break;
358*4882a593Smuzhiyun 	case 3:
359*4882a593Smuzhiyun 		sys_info->freq_maple_etvpe =
360*4882a593Smuzhiyun 			freq_c_pll[CONFIG_SYS_ETVPE_CLK] / 3;
361*4882a593Smuzhiyun 		break;
362*4882a593Smuzhiyun 	case 4:
363*4882a593Smuzhiyun 		sys_info->freq_maple_etvpe =
364*4882a593Smuzhiyun 			freq_c_pll[CONFIG_SYS_ETVPE_CLK] / 4;
365*4882a593Smuzhiyun 		break;
366*4882a593Smuzhiyun 	case 5:
367*4882a593Smuzhiyun 		sys_info->freq_maple_etvpe = sys_info->freq_systembus;
368*4882a593Smuzhiyun 		break;
369*4882a593Smuzhiyun 	case 6:
370*4882a593Smuzhiyun 		sys_info->freq_maple_etvpe =
371*4882a593Smuzhiyun 			freq_c_pll[CONFIG_SYS_ETVPE_CLK - 1] / 2;
372*4882a593Smuzhiyun 		break;
373*4882a593Smuzhiyun 	case 7:
374*4882a593Smuzhiyun 		sys_info->freq_maple_etvpe =
375*4882a593Smuzhiyun 			freq_c_pll[CONFIG_SYS_ETVPE_CLK - 1] / 3;
376*4882a593Smuzhiyun 		break;
377*4882a593Smuzhiyun 	default:
378*4882a593Smuzhiyun 		printf("Error: Unknown MAPLE eTVPE clock select!\n");
379*4882a593Smuzhiyun 	}
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun #endif
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun #ifdef CONFIG_SYS_DPAA_FMAN
384*4882a593Smuzhiyun #ifndef CONFIG_FM_PLAT_CLK_DIV
385*4882a593Smuzhiyun 	switch ((rcw_tmp & FM1_CLK_SEL) >> FM1_CLK_SHIFT) {
386*4882a593Smuzhiyun 	case 1:
387*4882a593Smuzhiyun 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK];
388*4882a593Smuzhiyun 		break;
389*4882a593Smuzhiyun 	case 2:
390*4882a593Smuzhiyun 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK] / 2;
391*4882a593Smuzhiyun 		break;
392*4882a593Smuzhiyun 	case 3:
393*4882a593Smuzhiyun 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK] / 3;
394*4882a593Smuzhiyun 		break;
395*4882a593Smuzhiyun 	case 4:
396*4882a593Smuzhiyun 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK] / 4;
397*4882a593Smuzhiyun 		break;
398*4882a593Smuzhiyun 	case 5:
399*4882a593Smuzhiyun 		sys_info->freq_fman[0] = sys_info->freq_systembus;
400*4882a593Smuzhiyun 		break;
401*4882a593Smuzhiyun 	case 6:
402*4882a593Smuzhiyun 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK + 1] / 2;
403*4882a593Smuzhiyun 		break;
404*4882a593Smuzhiyun 	case 7:
405*4882a593Smuzhiyun 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK + 1] / 3;
406*4882a593Smuzhiyun 		break;
407*4882a593Smuzhiyun 	default:
408*4882a593Smuzhiyun 		printf("Error: Unknown FMan1 clock select!\n");
409*4882a593Smuzhiyun 	case 0:
410*4882a593Smuzhiyun 		sys_info->freq_fman[0] = sys_info->freq_systembus / 2;
411*4882a593Smuzhiyun 		break;
412*4882a593Smuzhiyun 	}
413*4882a593Smuzhiyun #if (CONFIG_SYS_NUM_FMAN) == 2
414*4882a593Smuzhiyun #ifdef CONFIG_SYS_FM2_CLK
415*4882a593Smuzhiyun #define FM2_CLK_SEL	0x00000038
416*4882a593Smuzhiyun #define FM2_CLK_SHIFT	3
417*4882a593Smuzhiyun 	rcw_tmp = in_be32(&gur->rcwsr[15]);
418*4882a593Smuzhiyun 	switch ((rcw_tmp & FM2_CLK_SEL) >> FM2_CLK_SHIFT) {
419*4882a593Smuzhiyun 	case 1:
420*4882a593Smuzhiyun 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1];
421*4882a593Smuzhiyun 		break;
422*4882a593Smuzhiyun 	case 2:
423*4882a593Smuzhiyun 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1] / 2;
424*4882a593Smuzhiyun 		break;
425*4882a593Smuzhiyun 	case 3:
426*4882a593Smuzhiyun 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1] / 3;
427*4882a593Smuzhiyun 		break;
428*4882a593Smuzhiyun 	case 4:
429*4882a593Smuzhiyun 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1] / 4;
430*4882a593Smuzhiyun 		break;
431*4882a593Smuzhiyun 	case 5:
432*4882a593Smuzhiyun 		sys_info->freq_fman[1] = sys_info->freq_systembus;
433*4882a593Smuzhiyun 		break;
434*4882a593Smuzhiyun 	case 6:
435*4882a593Smuzhiyun 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK] / 2;
436*4882a593Smuzhiyun 		break;
437*4882a593Smuzhiyun 	case 7:
438*4882a593Smuzhiyun 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK] / 3;
439*4882a593Smuzhiyun 		break;
440*4882a593Smuzhiyun 	default:
441*4882a593Smuzhiyun 		printf("Error: Unknown FMan2 clock select!\n");
442*4882a593Smuzhiyun 	case 0:
443*4882a593Smuzhiyun 		sys_info->freq_fman[1] = sys_info->freq_systembus / 2;
444*4882a593Smuzhiyun 		break;
445*4882a593Smuzhiyun 	}
446*4882a593Smuzhiyun #endif
447*4882a593Smuzhiyun #endif	/* CONFIG_SYS_NUM_FMAN == 2 */
448*4882a593Smuzhiyun #else
449*4882a593Smuzhiyun 	sys_info->freq_fman[0] = sys_info->freq_systembus / CONFIG_SYS_FM1_CLK;
450*4882a593Smuzhiyun #endif
451*4882a593Smuzhiyun #endif
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
454*4882a593Smuzhiyun #if defined(CONFIG_ARCH_T2080)
455*4882a593Smuzhiyun #define ESDHC_CLK_SEL	0x00000007
456*4882a593Smuzhiyun #define ESDHC_CLK_SHIFT	0
457*4882a593Smuzhiyun #define ESDHC_CLK_RCWSR	15
458*4882a593Smuzhiyun #else	/* Support T1040 T1024 by now */
459*4882a593Smuzhiyun #define ESDHC_CLK_SEL	0xe0000000
460*4882a593Smuzhiyun #define ESDHC_CLK_SHIFT	29
461*4882a593Smuzhiyun #define ESDHC_CLK_RCWSR	7
462*4882a593Smuzhiyun #endif
463*4882a593Smuzhiyun 	rcw_tmp = in_be32(&gur->rcwsr[ESDHC_CLK_RCWSR]);
464*4882a593Smuzhiyun 	switch ((rcw_tmp & ESDHC_CLK_SEL) >> ESDHC_CLK_SHIFT) {
465*4882a593Smuzhiyun 	case 1:
466*4882a593Smuzhiyun 		sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK];
467*4882a593Smuzhiyun 		break;
468*4882a593Smuzhiyun 	case 2:
469*4882a593Smuzhiyun 		sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK] / 2;
470*4882a593Smuzhiyun 		break;
471*4882a593Smuzhiyun 	case 3:
472*4882a593Smuzhiyun 		sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK] / 3;
473*4882a593Smuzhiyun 		break;
474*4882a593Smuzhiyun #if defined(CONFIG_SYS_SDHC_CLK_2_PLL)
475*4882a593Smuzhiyun 	case 4:
476*4882a593Smuzhiyun 		sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK] / 4;
477*4882a593Smuzhiyun 		break;
478*4882a593Smuzhiyun #if defined(CONFIG_ARCH_T2080)
479*4882a593Smuzhiyun 	case 5:
480*4882a593Smuzhiyun 		sys_info->freq_sdhc = freq_c_pll[1 - CONFIG_SYS_SDHC_CLK];
481*4882a593Smuzhiyun 		break;
482*4882a593Smuzhiyun #endif
483*4882a593Smuzhiyun 	case 6:
484*4882a593Smuzhiyun 		sys_info->freq_sdhc = freq_c_pll[1 - CONFIG_SYS_SDHC_CLK] / 2;
485*4882a593Smuzhiyun 		break;
486*4882a593Smuzhiyun 	case 7:
487*4882a593Smuzhiyun 		sys_info->freq_sdhc = freq_c_pll[1 - CONFIG_SYS_SDHC_CLK] / 3;
488*4882a593Smuzhiyun 		break;
489*4882a593Smuzhiyun #endif
490*4882a593Smuzhiyun 	default:
491*4882a593Smuzhiyun 		sys_info->freq_sdhc = 0;
492*4882a593Smuzhiyun 		printf("Error: Unknown SDHC peripheral clock select!\n");
493*4882a593Smuzhiyun 	}
494*4882a593Smuzhiyun #endif
495*4882a593Smuzhiyun #else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 	for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
498*4882a593Smuzhiyun 		u32 c_pll_sel = (in_be32(&clk->clkcsr[cpu].clkcncsr) >> 27)
499*4882a593Smuzhiyun 				& 0xf;
500*4882a593Smuzhiyun 		u32 cplx_pll = core_cplx_PLL[c_pll_sel];
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun 		sys_info->freq_processor[cpu] =
503*4882a593Smuzhiyun 			 freq_c_pll[cplx_pll] / core_cplx_pll_div[c_pll_sel];
504*4882a593Smuzhiyun 	}
505*4882a593Smuzhiyun #define PME_CLK_SEL	0x80000000
506*4882a593Smuzhiyun #define FM1_CLK_SEL	0x40000000
507*4882a593Smuzhiyun #define FM2_CLK_SEL	0x20000000
508*4882a593Smuzhiyun #define HWA_ASYNC_DIV	0x04000000
509*4882a593Smuzhiyun #if (CONFIG_SYS_FSL_NUM_CC_PLLS == 2)
510*4882a593Smuzhiyun #define HWA_CC_PLL	1
511*4882a593Smuzhiyun #elif (CONFIG_SYS_FSL_NUM_CC_PLLS == 3)
512*4882a593Smuzhiyun #define HWA_CC_PLL	2
513*4882a593Smuzhiyun #elif (CONFIG_SYS_FSL_NUM_CC_PLLS == 4)
514*4882a593Smuzhiyun #define HWA_CC_PLL	2
515*4882a593Smuzhiyun #else
516*4882a593Smuzhiyun #error CONFIG_SYS_FSL_NUM_CC_PLLS not set or unknown case
517*4882a593Smuzhiyun #endif
518*4882a593Smuzhiyun 	rcw_tmp = in_be32(&gur->rcwsr[7]);
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun #ifdef CONFIG_SYS_DPAA_PME
521*4882a593Smuzhiyun 	if (rcw_tmp & PME_CLK_SEL) {
522*4882a593Smuzhiyun 		if (rcw_tmp & HWA_ASYNC_DIV)
523*4882a593Smuzhiyun 			sys_info->freq_pme = freq_c_pll[HWA_CC_PLL] / 4;
524*4882a593Smuzhiyun 		else
525*4882a593Smuzhiyun 			sys_info->freq_pme = freq_c_pll[HWA_CC_PLL] / 2;
526*4882a593Smuzhiyun 	} else {
527*4882a593Smuzhiyun 		sys_info->freq_pme = sys_info->freq_systembus / 2;
528*4882a593Smuzhiyun 	}
529*4882a593Smuzhiyun #endif
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun #ifdef CONFIG_SYS_DPAA_FMAN
532*4882a593Smuzhiyun 	if (rcw_tmp & FM1_CLK_SEL) {
533*4882a593Smuzhiyun 		if (rcw_tmp & HWA_ASYNC_DIV)
534*4882a593Smuzhiyun 			sys_info->freq_fman[0] = freq_c_pll[HWA_CC_PLL] / 4;
535*4882a593Smuzhiyun 		else
536*4882a593Smuzhiyun 			sys_info->freq_fman[0] = freq_c_pll[HWA_CC_PLL] / 2;
537*4882a593Smuzhiyun 	} else {
538*4882a593Smuzhiyun 		sys_info->freq_fman[0] = sys_info->freq_systembus / 2;
539*4882a593Smuzhiyun 	}
540*4882a593Smuzhiyun #if (CONFIG_SYS_NUM_FMAN) == 2
541*4882a593Smuzhiyun 	if (rcw_tmp & FM2_CLK_SEL) {
542*4882a593Smuzhiyun 		if (rcw_tmp & HWA_ASYNC_DIV)
543*4882a593Smuzhiyun 			sys_info->freq_fman[1] = freq_c_pll[HWA_CC_PLL] / 4;
544*4882a593Smuzhiyun 		else
545*4882a593Smuzhiyun 			sys_info->freq_fman[1] = freq_c_pll[HWA_CC_PLL] / 2;
546*4882a593Smuzhiyun 	} else {
547*4882a593Smuzhiyun 		sys_info->freq_fman[1] = sys_info->freq_systembus / 2;
548*4882a593Smuzhiyun 	}
549*4882a593Smuzhiyun #endif
550*4882a593Smuzhiyun #endif
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun #ifdef CONFIG_SYS_DPAA_QBMAN
553*4882a593Smuzhiyun 	sys_info->freq_qman = sys_info->freq_systembus / 2;
554*4882a593Smuzhiyun #endif
555*4882a593Smuzhiyun 
556*4882a593Smuzhiyun #endif /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun #ifdef CONFIG_U_QE
559*4882a593Smuzhiyun 	sys_info->freq_qe =  sys_info->freq_systembus / 2;
560*4882a593Smuzhiyun #endif
561*4882a593Smuzhiyun 
562*4882a593Smuzhiyun #else /* CONFIG_FSL_CORENET */
563*4882a593Smuzhiyun 	uint plat_ratio, e500_ratio, half_freq_systembus;
564*4882a593Smuzhiyun 	int i;
565*4882a593Smuzhiyun #ifdef CONFIG_QE
566*4882a593Smuzhiyun 	__maybe_unused u32 qe_ratio;
567*4882a593Smuzhiyun #endif
568*4882a593Smuzhiyun 
569*4882a593Smuzhiyun 	plat_ratio = (gur->porpllsr) & 0x0000003e;
570*4882a593Smuzhiyun 	plat_ratio >>= 1;
571*4882a593Smuzhiyun 	sys_info->freq_systembus = plat_ratio * CONFIG_SYS_CLK_FREQ;
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun 	/* Divide before multiply to avoid integer
574*4882a593Smuzhiyun 	 * overflow for processor speeds above 2GHz */
575*4882a593Smuzhiyun 	half_freq_systembus = sys_info->freq_systembus/2;
576*4882a593Smuzhiyun 	for (i = 0; i < cpu_numcores(); i++) {
577*4882a593Smuzhiyun 		e500_ratio = ((gur->porpllsr) >> (i * 8 + 16)) & 0x3f;
578*4882a593Smuzhiyun 		sys_info->freq_processor[i] = e500_ratio * half_freq_systembus;
579*4882a593Smuzhiyun 	}
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun 	/* Note: freq_ddrbus is the MCLK frequency, not the data rate. */
582*4882a593Smuzhiyun 	sys_info->freq_ddrbus = sys_info->freq_systembus;
583*4882a593Smuzhiyun 
584*4882a593Smuzhiyun #ifdef CONFIG_DDR_CLK_FREQ
585*4882a593Smuzhiyun 	{
586*4882a593Smuzhiyun 		u32 ddr_ratio = ((gur->porpllsr) & MPC85xx_PORPLLSR_DDR_RATIO)
587*4882a593Smuzhiyun 			>> MPC85xx_PORPLLSR_DDR_RATIO_SHIFT;
588*4882a593Smuzhiyun 		if (ddr_ratio != 0x7)
589*4882a593Smuzhiyun 			sys_info->freq_ddrbus = ddr_ratio * CONFIG_DDR_CLK_FREQ;
590*4882a593Smuzhiyun 	}
591*4882a593Smuzhiyun #endif
592*4882a593Smuzhiyun 
593*4882a593Smuzhiyun #ifdef CONFIG_QE
594*4882a593Smuzhiyun #if defined(CONFIG_ARCH_P1021) || defined(CONFIG_ARCH_P1025)
595*4882a593Smuzhiyun 	sys_info->freq_qe =  sys_info->freq_systembus;
596*4882a593Smuzhiyun #else
597*4882a593Smuzhiyun 	qe_ratio = ((gur->porpllsr) & MPC85xx_PORPLLSR_QE_RATIO)
598*4882a593Smuzhiyun 			>> MPC85xx_PORPLLSR_QE_RATIO_SHIFT;
599*4882a593Smuzhiyun 	sys_info->freq_qe = qe_ratio * CONFIG_SYS_CLK_FREQ;
600*4882a593Smuzhiyun #endif
601*4882a593Smuzhiyun #endif
602*4882a593Smuzhiyun 
603*4882a593Smuzhiyun #ifdef CONFIG_SYS_DPAA_FMAN
604*4882a593Smuzhiyun 		sys_info->freq_fman[0] = sys_info->freq_systembus;
605*4882a593Smuzhiyun #endif
606*4882a593Smuzhiyun 
607*4882a593Smuzhiyun #endif /* CONFIG_FSL_CORENET */
608*4882a593Smuzhiyun 
609*4882a593Smuzhiyun #if defined(CONFIG_FSL_LBC)
610*4882a593Smuzhiyun 	sys_info->freq_localbus = sys_info->freq_systembus /
611*4882a593Smuzhiyun 						CONFIG_SYS_FSL_LBC_CLK_DIV;
612*4882a593Smuzhiyun #endif
613*4882a593Smuzhiyun 
614*4882a593Smuzhiyun #if defined(CONFIG_FSL_IFC)
615*4882a593Smuzhiyun 	sys_info->freq_localbus = sys_info->freq_systembus /
616*4882a593Smuzhiyun 						CONFIG_SYS_FSL_IFC_CLK_DIV;
617*4882a593Smuzhiyun #endif
618*4882a593Smuzhiyun }
619*4882a593Smuzhiyun 
620*4882a593Smuzhiyun 
get_clocks(void)621*4882a593Smuzhiyun int get_clocks (void)
622*4882a593Smuzhiyun {
623*4882a593Smuzhiyun 	sys_info_t sys_info;
624*4882a593Smuzhiyun #ifdef CONFIG_ARCH_MPC8544
625*4882a593Smuzhiyun 	volatile ccsr_gur_t *gur = (void *) CONFIG_SYS_MPC85xx_GUTS_ADDR;
626*4882a593Smuzhiyun #endif
627*4882a593Smuzhiyun #if defined(CONFIG_CPM2)
628*4882a593Smuzhiyun 	volatile ccsr_cpm_t *cpm = (ccsr_cpm_t *)CONFIG_SYS_MPC85xx_CPM_ADDR;
629*4882a593Smuzhiyun 	uint sccr, dfbrg;
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun 	/* set VCO = 4 * BRG */
632*4882a593Smuzhiyun 	cpm->im_cpm_intctl.sccr &= 0xfffffffc;
633*4882a593Smuzhiyun 	sccr = cpm->im_cpm_intctl.sccr;
634*4882a593Smuzhiyun 	dfbrg = (sccr & SCCR_DFBRG_MSK) >> SCCR_DFBRG_SHIFT;
635*4882a593Smuzhiyun #endif
636*4882a593Smuzhiyun 	get_sys_info (&sys_info);
637*4882a593Smuzhiyun 	gd->cpu_clk = sys_info.freq_processor[0];
638*4882a593Smuzhiyun 	gd->bus_clk = sys_info.freq_systembus;
639*4882a593Smuzhiyun 	gd->mem_clk = sys_info.freq_ddrbus;
640*4882a593Smuzhiyun 	gd->arch.lbc_clk = sys_info.freq_localbus;
641*4882a593Smuzhiyun 
642*4882a593Smuzhiyun #ifdef CONFIG_QE
643*4882a593Smuzhiyun 	gd->arch.qe_clk = sys_info.freq_qe;
644*4882a593Smuzhiyun 	gd->arch.brg_clk = gd->arch.qe_clk / 2;
645*4882a593Smuzhiyun #endif
646*4882a593Smuzhiyun 	/*
647*4882a593Smuzhiyun 	 * The base clock for I2C depends on the actual SOC.  Unfortunately,
648*4882a593Smuzhiyun 	 * there is no pattern that can be used to determine the frequency, so
649*4882a593Smuzhiyun 	 * the only choice is to look up the actual SOC number and use the value
650*4882a593Smuzhiyun 	 * for that SOC. This information is taken from application note
651*4882a593Smuzhiyun 	 * AN2919.
652*4882a593Smuzhiyun 	 */
653*4882a593Smuzhiyun #if defined(CONFIG_ARCH_MPC8540) || defined(CONFIG_ARCH_MPC8541) || \
654*4882a593Smuzhiyun 	defined(CONFIG_ARCH_MPC8560) || defined(CONFIG_ARCH_MPC8555) || \
655*4882a593Smuzhiyun 	defined(CONFIG_ARCH_P1022)
656*4882a593Smuzhiyun 	gd->arch.i2c1_clk = sys_info.freq_systembus;
657*4882a593Smuzhiyun #elif defined(CONFIG_ARCH_MPC8544)
658*4882a593Smuzhiyun 	/*
659*4882a593Smuzhiyun 	 * On the 8544, the I2C clock is the same as the SEC clock.  This can be
660*4882a593Smuzhiyun 	 * either CCB/2 or CCB/3, depending on the value of cfg_sec_freq. See
661*4882a593Smuzhiyun 	 * 4.4.3.3 of the 8544 RM.  Note that this might actually work for all
662*4882a593Smuzhiyun 	 * 85xx, but only the 8544 has cfg_sec_freq, so it's unknown if the
663*4882a593Smuzhiyun 	 * PORDEVSR2_SEC_CFG bit is 0 on all 85xx boards that are not an 8544.
664*4882a593Smuzhiyun 	 */
665*4882a593Smuzhiyun 	if (gur->pordevsr2 & MPC85xx_PORDEVSR2_SEC_CFG)
666*4882a593Smuzhiyun 		gd->arch.i2c1_clk = sys_info.freq_systembus / 3;
667*4882a593Smuzhiyun 	else
668*4882a593Smuzhiyun 		gd->arch.i2c1_clk = sys_info.freq_systembus / 2;
669*4882a593Smuzhiyun #else
670*4882a593Smuzhiyun 	/* Most 85xx SOCs use CCB/2, so this is the default behavior. */
671*4882a593Smuzhiyun 	gd->arch.i2c1_clk = sys_info.freq_systembus / 2;
672*4882a593Smuzhiyun #endif
673*4882a593Smuzhiyun 	gd->arch.i2c2_clk = gd->arch.i2c1_clk;
674*4882a593Smuzhiyun 
675*4882a593Smuzhiyun #if defined(CONFIG_FSL_ESDHC)
676*4882a593Smuzhiyun #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
677*4882a593Smuzhiyun 	gd->arch.sdhc_clk = sys_info.freq_sdhc / 2;
678*4882a593Smuzhiyun #else
679*4882a593Smuzhiyun #if defined(CONFIG_ARCH_MPC8569) || defined(CONFIG_ARCH_P1010)
680*4882a593Smuzhiyun 	gd->arch.sdhc_clk = gd->bus_clk;
681*4882a593Smuzhiyun #else
682*4882a593Smuzhiyun 	gd->arch.sdhc_clk = gd->bus_clk / 2;
683*4882a593Smuzhiyun #endif
684*4882a593Smuzhiyun #endif
685*4882a593Smuzhiyun #endif /* defined(CONFIG_FSL_ESDHC) */
686*4882a593Smuzhiyun 
687*4882a593Smuzhiyun #if defined(CONFIG_CPM2)
688*4882a593Smuzhiyun 	gd->arch.vco_out = 2*sys_info.freq_systembus;
689*4882a593Smuzhiyun 	gd->arch.cpm_clk = gd->arch.vco_out / 2;
690*4882a593Smuzhiyun 	gd->arch.scc_clk = gd->arch.vco_out / 4;
691*4882a593Smuzhiyun 	gd->arch.brg_clk = gd->arch.vco_out / (1 << (2 * (dfbrg + 1)));
692*4882a593Smuzhiyun #endif
693*4882a593Smuzhiyun 
694*4882a593Smuzhiyun 	if(gd->cpu_clk != 0) return (0);
695*4882a593Smuzhiyun 	else return (1);
696*4882a593Smuzhiyun }
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun 
699*4882a593Smuzhiyun /********************************************
700*4882a593Smuzhiyun  * get_bus_freq
701*4882a593Smuzhiyun  * return system bus freq in Hz
702*4882a593Smuzhiyun  *********************************************/
get_bus_freq(ulong dummy)703*4882a593Smuzhiyun ulong get_bus_freq (ulong dummy)
704*4882a593Smuzhiyun {
705*4882a593Smuzhiyun 	return gd->bus_clk;
706*4882a593Smuzhiyun }
707*4882a593Smuzhiyun 
708*4882a593Smuzhiyun /********************************************
709*4882a593Smuzhiyun  * get_ddr_freq
710*4882a593Smuzhiyun  * return ddr bus freq in Hz
711*4882a593Smuzhiyun  *********************************************/
get_ddr_freq(ulong dummy)712*4882a593Smuzhiyun ulong get_ddr_freq (ulong dummy)
713*4882a593Smuzhiyun {
714*4882a593Smuzhiyun 	return gd->mem_clk;
715*4882a593Smuzhiyun }
716