xref: /rk3399_rockchip-uboot/arch/powerpc/cpu/mpc85xx/speed.c (revision e5d5f5a8be964c4a3ffc84fd99762736db96c27a)
1a47a12beSStefan Roese /*
2beba93edSDipen Dudhat  * Copyright 2004, 2007-2011 Freescale Semiconductor, Inc.
3a47a12beSStefan Roese  *
4a47a12beSStefan Roese  * (C) Copyright 2003 Motorola Inc.
5a47a12beSStefan Roese  * Xianghua Xiao, (X.Xiao@motorola.com)
6a47a12beSStefan Roese  *
7a47a12beSStefan Roese  * (C) Copyright 2000
8a47a12beSStefan Roese  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
9a47a12beSStefan Roese  *
101a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
11a47a12beSStefan Roese  */
12a47a12beSStefan Roese 
13a47a12beSStefan Roese #include <common.h>
14a47a12beSStefan Roese #include <ppc_asm.tmpl>
15a52d2f81SHaiying Wang #include <linux/compiler.h>
16a47a12beSStefan Roese #include <asm/processor.h>
17a47a12beSStefan Roese #include <asm/io.h>
18a47a12beSStefan Roese 
19a47a12beSStefan Roese DECLARE_GLOBAL_DATA_PTR;
20a47a12beSStefan Roese 
21ce746fe0SPrabhakar Kushwaha 
22ce746fe0SPrabhakar Kushwaha #ifndef CONFIG_SYS_FSL_NUM_CC_PLLS
23ce746fe0SPrabhakar Kushwaha #define CONFIG_SYS_FSL_NUM_CC_PLLS	6
24ce746fe0SPrabhakar Kushwaha #endif
25a47a12beSStefan Roese /* --------------------------------------------------------------- */
26a47a12beSStefan Roese 
27997399faSPrabhakar Kushwaha void get_sys_info(sys_info_t *sys_info)
28a47a12beSStefan Roese {
29a47a12beSStefan Roese 	volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
30800c73c4SKumar Gala #ifdef CONFIG_FSL_IFC
3139b0bbbbSJaiprakash Singh 	struct fsl_ifc ifc_regs = {(void *)CONFIG_SYS_IFC_ADDR, (void *)NULL};
32800c73c4SKumar Gala 	u32 ccr;
33800c73c4SKumar Gala #endif
34a47a12beSStefan Roese #ifdef CONFIG_FSL_CORENET
35a47a12beSStefan Roese 	volatile ccsr_clk_t *clk = (void *)(CONFIG_SYS_FSL_CORENET_CLK_ADDR);
36fbb9ecf7STimur Tabi 	unsigned int cpu;
37b8bf0adcSShaveta Leekha #ifdef CONFIG_HETROGENOUS_CLUSTERS
38b8bf0adcSShaveta Leekha 	unsigned int dsp_cpu;
39b8bf0adcSShaveta Leekha 	uint rcw_tmp1, rcw_tmp2;
40b8bf0adcSShaveta Leekha #endif
41ce746fe0SPrabhakar Kushwaha #ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
42ce746fe0SPrabhakar Kushwaha 	int cc_group[12] = CONFIG_SYS_FSL_CLUSTER_CLOCKS;
43ce746fe0SPrabhakar Kushwaha #endif
4414109c7aSYork Sun 	__maybe_unused u32 svr;
45a47a12beSStefan Roese 
46a47a12beSStefan Roese 	const u8 core_cplx_PLL[16] = {
47a47a12beSStefan Roese 		[ 0] = 0,	/* CC1 PPL / 1 */
48a47a12beSStefan Roese 		[ 1] = 0,	/* CC1 PPL / 2 */
49a47a12beSStefan Roese 		[ 2] = 0,	/* CC1 PPL / 4 */
50a47a12beSStefan Roese 		[ 4] = 1,	/* CC2 PPL / 1 */
51a47a12beSStefan Roese 		[ 5] = 1,	/* CC2 PPL / 2 */
52a47a12beSStefan Roese 		[ 6] = 1,	/* CC2 PPL / 4 */
53a47a12beSStefan Roese 		[ 8] = 2,	/* CC3 PPL / 1 */
54a47a12beSStefan Roese 		[ 9] = 2,	/* CC3 PPL / 2 */
55a47a12beSStefan Roese 		[10] = 2,	/* CC3 PPL / 4 */
56a47a12beSStefan Roese 		[12] = 3,	/* CC4 PPL / 1 */
57a47a12beSStefan Roese 		[13] = 3,	/* CC4 PPL / 2 */
58a47a12beSStefan Roese 		[14] = 3,	/* CC4 PPL / 4 */
59a47a12beSStefan Roese 	};
60a47a12beSStefan Roese 
61997399faSPrabhakar Kushwaha 	const u8 core_cplx_pll_div[16] = {
62a47a12beSStefan Roese 		[ 0] = 1,	/* CC1 PPL / 1 */
63a47a12beSStefan Roese 		[ 1] = 2,	/* CC1 PPL / 2 */
64a47a12beSStefan Roese 		[ 2] = 4,	/* CC1 PPL / 4 */
65a47a12beSStefan Roese 		[ 4] = 1,	/* CC2 PPL / 1 */
66a47a12beSStefan Roese 		[ 5] = 2,	/* CC2 PPL / 2 */
67a47a12beSStefan Roese 		[ 6] = 4,	/* CC2 PPL / 4 */
68a47a12beSStefan Roese 		[ 8] = 1,	/* CC3 PPL / 1 */
69a47a12beSStefan Roese 		[ 9] = 2,	/* CC3 PPL / 2 */
70a47a12beSStefan Roese 		[10] = 4,	/* CC3 PPL / 4 */
71a47a12beSStefan Roese 		[12] = 1,	/* CC4 PPL / 1 */
72a47a12beSStefan Roese 		[13] = 2,	/* CC4 PPL / 2 */
73a47a12beSStefan Roese 		[14] = 4,	/* CC4 PPL / 4 */
74a47a12beSStefan Roese 	};
75ce746fe0SPrabhakar Kushwaha 	uint i, freq_c_pll[CONFIG_SYS_FSL_NUM_CC_PLLS];
762d9ca2c7SYangbo Lu #if !defined(CONFIG_FM_PLAT_CLK_DIV) || !defined(CONFIG_PME_PLAT_CLK_DIV) || \
772d9ca2c7SYangbo Lu 	defined(CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK)
78ce746fe0SPrabhakar Kushwaha 	uint rcw_tmp;
79ce746fe0SPrabhakar Kushwaha #endif
80ce746fe0SPrabhakar Kushwaha 	uint ratio[CONFIG_SYS_FSL_NUM_CC_PLLS];
81a47a12beSStefan Roese 	unsigned long sysclk = CONFIG_SYS_CLK_FREQ;
82ab48ca1aSSrikanth Srinivasan 	uint mem_pll_rat;
83a47a12beSStefan Roese 
84997399faSPrabhakar Kushwaha 	sys_info->freq_systembus = sysclk;
85b135991aSPriyanka Jain #ifdef CONFIG_SYS_FSL_SINGLE_SOURCE_CLK
860c12a159Svijay rai 	uint ddr_refclk_sel;
870c12a159Svijay rai 	unsigned int porsr1_sys_clk;
880c12a159Svijay rai 	porsr1_sys_clk = in_be32(&gur->porsr1) >> FSL_DCFG_PORSR1_SYSCLK_SHIFT
890c12a159Svijay rai 						& FSL_DCFG_PORSR1_SYSCLK_MASK;
900c12a159Svijay rai 	if (porsr1_sys_clk == FSL_DCFG_PORSR1_SYSCLK_DIFF)
910c12a159Svijay rai 		sys_info->diff_sysclk = 1;
920c12a159Svijay rai 	else
930c12a159Svijay rai 		sys_info->diff_sysclk = 0;
940c12a159Svijay rai 
95b135991aSPriyanka Jain 	/*
96b135991aSPriyanka Jain 	 * DDR_REFCLK_SEL rcw bit is used to determine if DDR PLLS
97b135991aSPriyanka Jain 	 * are driven by separate DDR Refclock or single source
98b135991aSPriyanka Jain 	 * differential clock.
99b135991aSPriyanka Jain 	 */
1000c12a159Svijay rai 	ddr_refclk_sel = (in_be32(&gur->rcwsr[5]) >>
101b135991aSPriyanka Jain 		      FSL_CORENET2_RCWSR5_DDR_REFCLK_SEL_SHIFT) &
102b135991aSPriyanka Jain 		      FSL_CORENET2_RCWSR5_DDR_REFCLK_SEL_MASK;
103b135991aSPriyanka Jain 	/*
1040c12a159Svijay rai 	 * For single source clocking, both ddrclock and sysclock
105b135991aSPriyanka Jain 	 * are driven by differential sysclock.
106b135991aSPriyanka Jain 	 */
1070c12a159Svijay rai 	if (ddr_refclk_sel == FSL_CORENET2_RCWSR5_DDR_REFCLK_SINGLE_CLK)
108b135991aSPriyanka Jain 		sys_info->freq_ddrbus = CONFIG_SYS_CLK_FREQ;
1090c12a159Svijay rai 	else
110b135991aSPriyanka Jain #endif
11198ffa190SYork Sun #ifdef CONFIG_DDR_CLK_FREQ
112997399faSPrabhakar Kushwaha 		sys_info->freq_ddrbus = CONFIG_DDR_CLK_FREQ;
11398ffa190SYork Sun #else
114997399faSPrabhakar Kushwaha 		sys_info->freq_ddrbus = sysclk;
11598ffa190SYork Sun #endif
116a47a12beSStefan Roese 
117997399faSPrabhakar Kushwaha 	sys_info->freq_systembus *= (in_be32(&gur->rcwsr[0]) >> 25) & 0x1f;
118f77329cfSYork Sun 	mem_pll_rat = (in_be32(&gur->rcwsr[0]) >>
119f77329cfSYork Sun 			FSL_CORENET_RCWSR0_MEM_PLL_RAT_SHIFT)
120f77329cfSYork Sun 			& FSL_CORENET_RCWSR0_MEM_PLL_RAT_MASK;
121c3678b09SYork Sun #ifdef CONFIG_SYS_FSL_ERRATUM_A007212
122c3678b09SYork Sun 	if (mem_pll_rat == 0) {
123c3678b09SYork Sun 		mem_pll_rat = (in_be32(&gur->rcwsr[0]) >>
124c3678b09SYork Sun 			FSL_CORENET_RCWSR0_MEM_PLL_RAT_RESV_SHIFT) &
125c3678b09SYork Sun 			FSL_CORENET_RCWSR0_MEM_PLL_RAT_MASK;
126c3678b09SYork Sun 	}
127c3678b09SYork Sun #endif
128e88f421eSZang Roy-R61911 	/* T4240/T4160 Rev2.0 MEM_PLL_RAT uses a value which is half of
129e88f421eSZang Roy-R61911 	 * T4240/T4160 Rev1.0. eg. It's 12 in Rev1.0, however, for Rev2.0
130e88f421eSZang Roy-R61911 	 * it uses 6.
13114109c7aSYork Sun 	 * T2080 rev 1.1 and later also use half mem_pll comparing with rev 1.0
132e88f421eSZang Roy-R61911 	 */
1335122dfaeSShengzhou Liu #if defined(CONFIG_PPC_T4240) || defined(CONFIG_PPC_T4160) || \
13496d59e9dSShengzhou Liu 	defined(CONFIG_PPC_T4080) || defined(CONFIG_PPC_T2080) || \
13596d59e9dSShengzhou Liu 	defined(CONFIG_PPC_T2081)
13614109c7aSYork Sun 	svr = get_svr();
13714109c7aSYork Sun 	switch (SVR_SOC_VER(svr)) {
13814109c7aSYork Sun 	case SVR_T4240:
13914109c7aSYork Sun 	case SVR_T4160:
14014109c7aSYork Sun 	case SVR_T4120:
14114109c7aSYork Sun 	case SVR_T4080:
14214109c7aSYork Sun 		if (SVR_MAJ(svr) >= 2)
143e88f421eSZang Roy-R61911 			mem_pll_rat *= 2;
14414109c7aSYork Sun 		break;
14514109c7aSYork Sun 	case SVR_T2080:
14614109c7aSYork Sun 	case SVR_T2081:
14714109c7aSYork Sun 		if ((SVR_MAJ(svr) > 1) || (SVR_MIN(svr) >= 1))
14814109c7aSYork Sun 			mem_pll_rat *= 2;
14914109c7aSYork Sun 		break;
15014109c7aSYork Sun 	default:
15114109c7aSYork Sun 		break;
15214109c7aSYork Sun 	}
153e88f421eSZang Roy-R61911 #endif
154ab48ca1aSSrikanth Srinivasan 	if (mem_pll_rat > 2)
155997399faSPrabhakar Kushwaha 		sys_info->freq_ddrbus *= mem_pll_rat;
156ab48ca1aSSrikanth Srinivasan 	else
157997399faSPrabhakar Kushwaha 		sys_info->freq_ddrbus = sys_info->freq_systembus * mem_pll_rat;
158a47a12beSStefan Roese 
159ce746fe0SPrabhakar Kushwaha 	for (i = 0; i < CONFIG_SYS_FSL_NUM_CC_PLLS; i++) {
160ce746fe0SPrabhakar Kushwaha 		ratio[i] = (in_be32(&clk->pllcgsr[i].pllcngsr) >> 1) & 0x3f;
161ab48ca1aSSrikanth Srinivasan 		if (ratio[i] > 4)
162ce746fe0SPrabhakar Kushwaha 			freq_c_pll[i] = sysclk * ratio[i];
163ab48ca1aSSrikanth Srinivasan 		else
164ce746fe0SPrabhakar Kushwaha 			freq_c_pll[i] = sys_info->freq_systembus * ratio[i];
165ab48ca1aSSrikanth Srinivasan 	}
166b8bf0adcSShaveta Leekha 
1679a653a98SYork Sun #ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
1689a653a98SYork Sun 	/*
169ce746fe0SPrabhakar Kushwaha 	 * As per CHASSIS2 architeture total 12 clusters are posible and
1709a653a98SYork Sun 	 * Each cluster has up to 4 cores, sharing the same PLL selection.
171ce746fe0SPrabhakar Kushwaha 	 * The cluster clock assignment is SoC defined.
172ce746fe0SPrabhakar Kushwaha 	 *
173ce746fe0SPrabhakar Kushwaha 	 * Total 4 clock groups are possible with 3 PLLs each.
174ce746fe0SPrabhakar Kushwaha 	 * as per array indices, clock group A has 0, 1, 2 numbered PLLs &
175ce746fe0SPrabhakar Kushwaha 	 * clock group B has 3, 4, 6 and so on.
176ce746fe0SPrabhakar Kushwaha 	 *
177ce746fe0SPrabhakar Kushwaha 	 * Clock group A having PLL1, PLL2, PLL3, feeding cores of any cluster
178ce746fe0SPrabhakar Kushwaha 	 * depends upon the SoC architeture. Same applies to other
179ce746fe0SPrabhakar Kushwaha 	 * clock groups and clusters.
180ce746fe0SPrabhakar Kushwaha 	 *
1819a653a98SYork Sun 	 */
1829a653a98SYork Sun 	for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
183f6981439SYork Sun 		int cluster = fsl_qoriq_core_to_cluster(cpu);
184f6981439SYork Sun 		u32 c_pll_sel = (in_be32(&clk->clkcsr[cluster].clkcncsr) >> 27)
1859a653a98SYork Sun 				& 0xf;
1869a653a98SYork Sun 		u32 cplx_pll = core_cplx_PLL[c_pll_sel];
187ce746fe0SPrabhakar Kushwaha 		cplx_pll += cc_group[cluster] - 1;
188997399faSPrabhakar Kushwaha 		sys_info->freq_processor[cpu] =
189ce746fe0SPrabhakar Kushwaha 			 freq_c_pll[cplx_pll] / core_cplx_pll_div[c_pll_sel];
1909a653a98SYork Sun 	}
191b8bf0adcSShaveta Leekha 
192b8bf0adcSShaveta Leekha #ifdef CONFIG_HETROGENOUS_CLUSTERS
193b8bf0adcSShaveta Leekha 	for_each_cpu(i, dsp_cpu, cpu_num_dspcores(), cpu_dsp_mask()) {
194b8bf0adcSShaveta Leekha 		int dsp_cluster = fsl_qoriq_dsp_core_to_cluster(dsp_cpu);
195b8bf0adcSShaveta Leekha 		u32 c_pll_sel = (in_be32
196b8bf0adcSShaveta Leekha 				(&clk->clkcsr[dsp_cluster].clkcncsr) >> 27)
197b8bf0adcSShaveta Leekha 				& 0xf;
198b8bf0adcSShaveta Leekha 		u32 cplx_pll = core_cplx_PLL[c_pll_sel];
199b8bf0adcSShaveta Leekha 		cplx_pll += cc_group[dsp_cluster] - 1;
200b8bf0adcSShaveta Leekha 		sys_info->freq_processor_dsp[dsp_cpu] =
201b8bf0adcSShaveta Leekha 			 freq_c_pll[cplx_pll] / core_cplx_pll_div[c_pll_sel];
202b8bf0adcSShaveta Leekha 	}
203b8bf0adcSShaveta Leekha #endif
204b8bf0adcSShaveta Leekha 
205b41f192bSYork Sun #if defined(CONFIG_ARCH_B4860) || defined(CONFIG_ARCH_B4420) || \
206b33bd8cdSPrabhakar Kushwaha 	defined(CONFIG_PPC_T2080) || defined(CONFIG_PPC_T2081)
2070cb3325cSSandeep Singh #define FM1_CLK_SEL	0xe0000000
2080cb3325cSSandeep Singh #define FM1_CLK_SHIFT	29
209*e5d5f5a8SYork Sun #elif defined(CONFIG_ARCH_T1024) || defined(CONFIG_ARCH_T1023)
210f6050790SShengzhou Liu #define FM1_CLK_SEL	0x00000007
211f6050790SShengzhou Liu #define FM1_CLK_SHIFT	0
2120cb3325cSSandeep Singh #else
2139a653a98SYork Sun #define PME_CLK_SEL	0xe0000000
2149a653a98SYork Sun #define PME_CLK_SHIFT	29
2159a653a98SYork Sun #define FM1_CLK_SEL	0x1c000000
2169a653a98SYork Sun #define FM1_CLK_SHIFT	26
2170cb3325cSSandeep Singh #endif
218ce746fe0SPrabhakar Kushwaha #if !defined(CONFIG_FM_PLAT_CLK_DIV) || !defined(CONFIG_PME_PLAT_CLK_DIV)
219*e5d5f5a8SYork Sun #if defined(CONFIG_ARCH_T1024) || defined(CONFIG_ARCH_T1023)
220f6050790SShengzhou Liu 	rcw_tmp = in_be32(&gur->rcwsr[15]) - 4;
221f6050790SShengzhou Liu #else
2229a653a98SYork Sun 	rcw_tmp = in_be32(&gur->rcwsr[7]);
223ce746fe0SPrabhakar Kushwaha #endif
224f6050790SShengzhou Liu #endif
2259a653a98SYork Sun 
2269a653a98SYork Sun #ifdef CONFIG_SYS_DPAA_PME
227ce746fe0SPrabhakar Kushwaha #ifndef CONFIG_PME_PLAT_CLK_DIV
2289a653a98SYork Sun 	switch ((rcw_tmp & PME_CLK_SEL) >> PME_CLK_SHIFT) {
2299a653a98SYork Sun 	case 1:
230ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK];
2319a653a98SYork Sun 		break;
2329a653a98SYork Sun 	case 2:
233ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK] / 2;
2349a653a98SYork Sun 		break;
2359a653a98SYork Sun 	case 3:
236ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK] / 3;
2379a653a98SYork Sun 		break;
2389a653a98SYork Sun 	case 4:
239ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK] / 4;
2409a653a98SYork Sun 		break;
2419a653a98SYork Sun 	case 6:
242ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK + 1] / 2;
2439a653a98SYork Sun 		break;
2449a653a98SYork Sun 	case 7:
245ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK + 1] / 3;
2469a653a98SYork Sun 		break;
2479a653a98SYork Sun 	default:
2489a653a98SYork Sun 		printf("Error: Unknown PME clock select!\n");
2499a653a98SYork Sun 	case 0:
250997399faSPrabhakar Kushwaha 		sys_info->freq_pme = sys_info->freq_systembus / 2;
2519a653a98SYork Sun 		break;
2529a653a98SYork Sun 
2539a653a98SYork Sun 	}
254ce746fe0SPrabhakar Kushwaha #else
255ce746fe0SPrabhakar Kushwaha 	sys_info->freq_pme = sys_info->freq_systembus / CONFIG_SYS_PME_CLK;
256ce746fe0SPrabhakar Kushwaha 
257ce746fe0SPrabhakar Kushwaha #endif
2589a653a98SYork Sun #endif
2599a653a98SYork Sun 
260990e1a8cSHaiying Wang #ifdef CONFIG_SYS_DPAA_QBMAN
261f6050790SShengzhou Liu #ifndef CONFIG_QBMAN_CLK_DIV
262f6050790SShengzhou Liu #define CONFIG_QBMAN_CLK_DIV	2
263f6050790SShengzhou Liu #endif
264f6050790SShengzhou Liu 	sys_info->freq_qman = sys_info->freq_systembus / CONFIG_QBMAN_CLK_DIV;
265990e1a8cSHaiying Wang #endif
266990e1a8cSHaiying Wang 
267b8bf0adcSShaveta Leekha #if defined(CONFIG_SYS_MAPLE)
268b8bf0adcSShaveta Leekha #define CPRI_CLK_SEL		0x1C000000
269b8bf0adcSShaveta Leekha #define CPRI_CLK_SHIFT		26
270b8bf0adcSShaveta Leekha #define CPRI_ALT_CLK_SEL	0x00007000
271b8bf0adcSShaveta Leekha #define CPRI_ALT_CLK_SHIFT	12
272b8bf0adcSShaveta Leekha 
273b8bf0adcSShaveta Leekha 	rcw_tmp1 = in_be32(&gur->rcwsr[7]);	/* Reading RCW bits: 224-255*/
274b8bf0adcSShaveta Leekha 	rcw_tmp2 = in_be32(&gur->rcwsr[15]);	/* Reading RCW bits: 480-511*/
275b8bf0adcSShaveta Leekha 	/* For MAPLE and CPRI frequency */
276b8bf0adcSShaveta Leekha 	switch ((rcw_tmp1 & CPRI_CLK_SEL) >> CPRI_CLK_SHIFT) {
277b8bf0adcSShaveta Leekha 	case 1:
278b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK];
279b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK];
280b8bf0adcSShaveta Leekha 		break;
281b8bf0adcSShaveta Leekha 	case 2:
282b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 2;
283b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 2;
284b8bf0adcSShaveta Leekha 		break;
285b8bf0adcSShaveta Leekha 	case 3:
286b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 3;
287b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 3;
288b8bf0adcSShaveta Leekha 		break;
289b8bf0adcSShaveta Leekha 	case 4:
290b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 4;
291b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 4;
292b8bf0adcSShaveta Leekha 		break;
293b8bf0adcSShaveta Leekha 	case 5:
294b8bf0adcSShaveta Leekha 		if (((rcw_tmp2 & CPRI_ALT_CLK_SEL)
295b8bf0adcSShaveta Leekha 					>> CPRI_ALT_CLK_SHIFT) == 6) {
296b8bf0adcSShaveta Leekha 			sys_info->freq_maple =
297b8bf0adcSShaveta Leekha 				freq_c_pll[CONFIG_SYS_CPRI_CLK - 2] / 2;
298b8bf0adcSShaveta Leekha 			sys_info->freq_cpri =
299b8bf0adcSShaveta Leekha 				freq_c_pll[CONFIG_SYS_CPRI_CLK - 2] / 2;
300b8bf0adcSShaveta Leekha 		}
301b8bf0adcSShaveta Leekha 		if (((rcw_tmp2 & CPRI_ALT_CLK_SEL)
302b8bf0adcSShaveta Leekha 					>> CPRI_ALT_CLK_SHIFT) == 7) {
303b8bf0adcSShaveta Leekha 			sys_info->freq_maple =
304b8bf0adcSShaveta Leekha 				freq_c_pll[CONFIG_SYS_CPRI_CLK - 2] / 3;
305b8bf0adcSShaveta Leekha 			sys_info->freq_cpri =
306b8bf0adcSShaveta Leekha 				freq_c_pll[CONFIG_SYS_CPRI_CLK - 2] / 3;
307b8bf0adcSShaveta Leekha 		}
308b8bf0adcSShaveta Leekha 		break;
309b8bf0adcSShaveta Leekha 	case 6:
310b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK + 1] / 2;
311b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK + 1] / 2;
312b8bf0adcSShaveta Leekha 		break;
313b8bf0adcSShaveta Leekha 	case 7:
314b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK + 1] / 3;
315b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK + 1] / 3;
316b8bf0adcSShaveta Leekha 		break;
317b8bf0adcSShaveta Leekha 	default:
318b8bf0adcSShaveta Leekha 		printf("Error: Unknown MAPLE/CPRI clock select!\n");
319b8bf0adcSShaveta Leekha 	}
320b8bf0adcSShaveta Leekha 
321b8bf0adcSShaveta Leekha 	/* For MAPLE ULB and eTVPE frequencies */
322b8bf0adcSShaveta Leekha #define ULB_CLK_SEL		0x00000038
323b8bf0adcSShaveta Leekha #define ULB_CLK_SHIFT		3
324b8bf0adcSShaveta Leekha #define ETVPE_CLK_SEL		0x00000007
325b8bf0adcSShaveta Leekha #define ETVPE_CLK_SHIFT		0
326b8bf0adcSShaveta Leekha 
327b8bf0adcSShaveta Leekha 	switch ((rcw_tmp2 & ULB_CLK_SEL) >> ULB_CLK_SHIFT) {
328b8bf0adcSShaveta Leekha 	case 1:
329b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb = freq_c_pll[CONFIG_SYS_ULB_CLK];
330b8bf0adcSShaveta Leekha 		break;
331b8bf0adcSShaveta Leekha 	case 2:
332b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb = freq_c_pll[CONFIG_SYS_ULB_CLK] / 2;
333b8bf0adcSShaveta Leekha 		break;
334b8bf0adcSShaveta Leekha 	case 3:
335b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb = freq_c_pll[CONFIG_SYS_ULB_CLK] / 3;
336b8bf0adcSShaveta Leekha 		break;
337b8bf0adcSShaveta Leekha 	case 4:
338b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb = freq_c_pll[CONFIG_SYS_ULB_CLK] / 4;
339b8bf0adcSShaveta Leekha 		break;
340b8bf0adcSShaveta Leekha 	case 5:
341b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb = sys_info->freq_systembus;
342b8bf0adcSShaveta Leekha 		break;
343b8bf0adcSShaveta Leekha 	case 6:
344b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb =
345b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ULB_CLK - 1] / 2;
346b8bf0adcSShaveta Leekha 		break;
347b8bf0adcSShaveta Leekha 	case 7:
348b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb =
349b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ULB_CLK - 1] / 3;
350b8bf0adcSShaveta Leekha 		break;
351b8bf0adcSShaveta Leekha 	default:
352b8bf0adcSShaveta Leekha 		printf("Error: Unknown MAPLE ULB clock select!\n");
353b8bf0adcSShaveta Leekha 	}
354b8bf0adcSShaveta Leekha 
355b8bf0adcSShaveta Leekha 	switch ((rcw_tmp2 & ETVPE_CLK_SEL) >> ETVPE_CLK_SHIFT) {
356b8bf0adcSShaveta Leekha 	case 1:
357b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe = freq_c_pll[CONFIG_SYS_ETVPE_CLK];
358b8bf0adcSShaveta Leekha 		break;
359b8bf0adcSShaveta Leekha 	case 2:
360b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe =
361b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ETVPE_CLK] / 2;
362b8bf0adcSShaveta Leekha 		break;
363b8bf0adcSShaveta Leekha 	case 3:
364b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe =
365b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ETVPE_CLK] / 3;
366b8bf0adcSShaveta Leekha 		break;
367b8bf0adcSShaveta Leekha 	case 4:
368b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe =
369b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ETVPE_CLK] / 4;
370b8bf0adcSShaveta Leekha 		break;
371b8bf0adcSShaveta Leekha 	case 5:
372b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe = sys_info->freq_systembus;
373b8bf0adcSShaveta Leekha 		break;
374b8bf0adcSShaveta Leekha 	case 6:
375b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe =
376b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ETVPE_CLK - 1] / 2;
377b8bf0adcSShaveta Leekha 		break;
378b8bf0adcSShaveta Leekha 	case 7:
379b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe =
380b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ETVPE_CLK - 1] / 3;
381b8bf0adcSShaveta Leekha 		break;
382b8bf0adcSShaveta Leekha 	default:
383b8bf0adcSShaveta Leekha 		printf("Error: Unknown MAPLE eTVPE clock select!\n");
384b8bf0adcSShaveta Leekha 	}
385b8bf0adcSShaveta Leekha 
386b8bf0adcSShaveta Leekha #endif
387b8bf0adcSShaveta Leekha 
3889a653a98SYork Sun #ifdef CONFIG_SYS_DPAA_FMAN
389ce746fe0SPrabhakar Kushwaha #ifndef CONFIG_FM_PLAT_CLK_DIV
3909a653a98SYork Sun 	switch ((rcw_tmp & FM1_CLK_SEL) >> FM1_CLK_SHIFT) {
3919a653a98SYork Sun 	case 1:
392ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK];
3939a653a98SYork Sun 		break;
3949a653a98SYork Sun 	case 2:
395ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK] / 2;
3969a653a98SYork Sun 		break;
3979a653a98SYork Sun 	case 3:
398ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK] / 3;
3999a653a98SYork Sun 		break;
4009a653a98SYork Sun 	case 4:
401ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK] / 4;
4029a653a98SYork Sun 		break;
4030cb3325cSSandeep Singh 	case 5:
404997399faSPrabhakar Kushwaha 		sys_info->freq_fman[0] = sys_info->freq_systembus;
4050cb3325cSSandeep Singh 		break;
4069a653a98SYork Sun 	case 6:
407ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK + 1] / 2;
4089a653a98SYork Sun 		break;
4099a653a98SYork Sun 	case 7:
410ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK + 1] / 3;
4119a653a98SYork Sun 		break;
4129a653a98SYork Sun 	default:
4139a653a98SYork Sun 		printf("Error: Unknown FMan1 clock select!\n");
4149a653a98SYork Sun 	case 0:
415997399faSPrabhakar Kushwaha 		sys_info->freq_fman[0] = sys_info->freq_systembus / 2;
4169a653a98SYork Sun 		break;
4179a653a98SYork Sun 	}
4189a653a98SYork Sun #if (CONFIG_SYS_NUM_FMAN) == 2
419ce746fe0SPrabhakar Kushwaha #ifdef CONFIG_SYS_FM2_CLK
4209a653a98SYork Sun #define FM2_CLK_SEL	0x00000038
4219a653a98SYork Sun #define FM2_CLK_SHIFT	3
4229a653a98SYork Sun 	rcw_tmp = in_be32(&gur->rcwsr[15]);
4239a653a98SYork Sun 	switch ((rcw_tmp & FM2_CLK_SEL) >> FM2_CLK_SHIFT) {
4249a653a98SYork Sun 	case 1:
425ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1];
4269a653a98SYork Sun 		break;
4279a653a98SYork Sun 	case 2:
428ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1] / 2;
4299a653a98SYork Sun 		break;
4309a653a98SYork Sun 	case 3:
431ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1] / 3;
4329a653a98SYork Sun 		break;
4339a653a98SYork Sun 	case 4:
434ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1] / 4;
4359a653a98SYork Sun 		break;
436c1015c67SShaohui Xie 	case 5:
437c1015c67SShaohui Xie 		sys_info->freq_fman[1] = sys_info->freq_systembus;
438c1015c67SShaohui Xie 		break;
4399a653a98SYork Sun 	case 6:
440ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK] / 2;
4419a653a98SYork Sun 		break;
4429a653a98SYork Sun 	case 7:
443ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK] / 3;
4449a653a98SYork Sun 		break;
4459a653a98SYork Sun 	default:
4469a653a98SYork Sun 		printf("Error: Unknown FMan2 clock select!\n");
4479a653a98SYork Sun 	case 0:
448997399faSPrabhakar Kushwaha 		sys_info->freq_fman[1] = sys_info->freq_systembus / 2;
4499a653a98SYork Sun 		break;
4509a653a98SYork Sun 	}
451ce746fe0SPrabhakar Kushwaha #endif
4529a653a98SYork Sun #endif	/* CONFIG_SYS_NUM_FMAN == 2 */
453ce746fe0SPrabhakar Kushwaha #else
454ce746fe0SPrabhakar Kushwaha 	sys_info->freq_fman[0] = sys_info->freq_systembus / CONFIG_SYS_FM1_CLK;
455ce746fe0SPrabhakar Kushwaha #endif
456ce746fe0SPrabhakar Kushwaha #endif
4579a653a98SYork Sun 
4582d9ca2c7SYangbo Lu #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
4592d9ca2c7SYangbo Lu #if defined(CONFIG_PPC_T2080)
4602d9ca2c7SYangbo Lu #define ESDHC_CLK_SEL	0x00000007
4612d9ca2c7SYangbo Lu #define ESDHC_CLK_SHIFT	0
4622d9ca2c7SYangbo Lu #define ESDHC_CLK_RCWSR	15
4632d9ca2c7SYangbo Lu #else	/* Support T1040 T1024 by now */
4642d9ca2c7SYangbo Lu #define ESDHC_CLK_SEL	0xe0000000
4652d9ca2c7SYangbo Lu #define ESDHC_CLK_SHIFT	29
4662d9ca2c7SYangbo Lu #define ESDHC_CLK_RCWSR	7
4672d9ca2c7SYangbo Lu #endif
4682d9ca2c7SYangbo Lu 	rcw_tmp = in_be32(&gur->rcwsr[ESDHC_CLK_RCWSR]);
4692d9ca2c7SYangbo Lu 	switch ((rcw_tmp & ESDHC_CLK_SEL) >> ESDHC_CLK_SHIFT) {
4702d9ca2c7SYangbo Lu 	case 1:
4712d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK];
4722d9ca2c7SYangbo Lu 		break;
4732d9ca2c7SYangbo Lu 	case 2:
4742d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK] / 2;
4752d9ca2c7SYangbo Lu 		break;
4762d9ca2c7SYangbo Lu 	case 3:
4772d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK] / 3;
4782d9ca2c7SYangbo Lu 		break;
4792d9ca2c7SYangbo Lu #if defined(CONFIG_SYS_SDHC_CLK_2_PLL)
4802d9ca2c7SYangbo Lu 	case 4:
4812d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK] / 4;
4822d9ca2c7SYangbo Lu 		break;
4832d9ca2c7SYangbo Lu #if defined(CONFIG_PPC_T2080)
4842d9ca2c7SYangbo Lu 	case 5:
4852d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[1 - CONFIG_SYS_SDHC_CLK];
4862d9ca2c7SYangbo Lu 		break;
4872d9ca2c7SYangbo Lu #endif
4882d9ca2c7SYangbo Lu 	case 6:
4892d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[1 - CONFIG_SYS_SDHC_CLK] / 2;
4902d9ca2c7SYangbo Lu 		break;
4912d9ca2c7SYangbo Lu 	case 7:
4922d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[1 - CONFIG_SYS_SDHC_CLK] / 3;
4932d9ca2c7SYangbo Lu 		break;
4942d9ca2c7SYangbo Lu #endif
4952d9ca2c7SYangbo Lu 	default:
4962d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = 0;
4972d9ca2c7SYangbo Lu 		printf("Error: Unknown SDHC peripheral clock select!\n");
4982d9ca2c7SYangbo Lu 	}
4992d9ca2c7SYangbo Lu #endif
5009a653a98SYork Sun #else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
5019a653a98SYork Sun 
502fbb9ecf7STimur Tabi 	for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
503f6981439SYork Sun 		u32 c_pll_sel = (in_be32(&clk->clkcsr[cpu].clkcncsr) >> 27)
504f6981439SYork Sun 				& 0xf;
505a47a12beSStefan Roese 		u32 cplx_pll = core_cplx_PLL[c_pll_sel];
506a47a12beSStefan Roese 
507997399faSPrabhakar Kushwaha 		sys_info->freq_processor[cpu] =
508ce746fe0SPrabhakar Kushwaha 			 freq_c_pll[cplx_pll] / core_cplx_pll_div[c_pll_sel];
509a47a12beSStefan Roese 	}
510a47a12beSStefan Roese #define PME_CLK_SEL	0x80000000
511a47a12beSStefan Roese #define FM1_CLK_SEL	0x40000000
512a47a12beSStefan Roese #define FM2_CLK_SEL	0x20000000
513b5c8753fSKumar Gala #define HWA_ASYNC_DIV	0x04000000
514b5c8753fSKumar Gala #if (CONFIG_SYS_FSL_NUM_CC_PLLS == 2)
515b5c8753fSKumar Gala #define HWA_CC_PLL	1
5164905443fSTimur Tabi #elif (CONFIG_SYS_FSL_NUM_CC_PLLS == 3)
5174905443fSTimur Tabi #define HWA_CC_PLL	2
518b5c8753fSKumar Gala #elif (CONFIG_SYS_FSL_NUM_CC_PLLS == 4)
519b5c8753fSKumar Gala #define HWA_CC_PLL	2
520b5c8753fSKumar Gala #else
521b5c8753fSKumar Gala #error CONFIG_SYS_FSL_NUM_CC_PLLS not set or unknown case
522b5c8753fSKumar Gala #endif
523a47a12beSStefan Roese 	rcw_tmp = in_be32(&gur->rcwsr[7]);
524a47a12beSStefan Roese 
525a47a12beSStefan Roese #ifdef CONFIG_SYS_DPAA_PME
526b5c8753fSKumar Gala 	if (rcw_tmp & PME_CLK_SEL) {
527b5c8753fSKumar Gala 		if (rcw_tmp & HWA_ASYNC_DIV)
528ce746fe0SPrabhakar Kushwaha 			sys_info->freq_pme = freq_c_pll[HWA_CC_PLL] / 4;
529a47a12beSStefan Roese 		else
530ce746fe0SPrabhakar Kushwaha 			sys_info->freq_pme = freq_c_pll[HWA_CC_PLL] / 2;
531b5c8753fSKumar Gala 	} else {
532997399faSPrabhakar Kushwaha 		sys_info->freq_pme = sys_info->freq_systembus / 2;
533b5c8753fSKumar Gala 	}
534a47a12beSStefan Roese #endif
535a47a12beSStefan Roese 
536a47a12beSStefan Roese #ifdef CONFIG_SYS_DPAA_FMAN
537b5c8753fSKumar Gala 	if (rcw_tmp & FM1_CLK_SEL) {
538b5c8753fSKumar Gala 		if (rcw_tmp & HWA_ASYNC_DIV)
539ce746fe0SPrabhakar Kushwaha 			sys_info->freq_fman[0] = freq_c_pll[HWA_CC_PLL] / 4;
540a47a12beSStefan Roese 		else
541ce746fe0SPrabhakar Kushwaha 			sys_info->freq_fman[0] = freq_c_pll[HWA_CC_PLL] / 2;
542b5c8753fSKumar Gala 	} else {
543997399faSPrabhakar Kushwaha 		sys_info->freq_fman[0] = sys_info->freq_systembus / 2;
544b5c8753fSKumar Gala 	}
545a47a12beSStefan Roese #if (CONFIG_SYS_NUM_FMAN) == 2
546b5c8753fSKumar Gala 	if (rcw_tmp & FM2_CLK_SEL) {
547b5c8753fSKumar Gala 		if (rcw_tmp & HWA_ASYNC_DIV)
548ce746fe0SPrabhakar Kushwaha 			sys_info->freq_fman[1] = freq_c_pll[HWA_CC_PLL] / 4;
549a47a12beSStefan Roese 		else
550ce746fe0SPrabhakar Kushwaha 			sys_info->freq_fman[1] = freq_c_pll[HWA_CC_PLL] / 2;
551b5c8753fSKumar Gala 	} else {
552997399faSPrabhakar Kushwaha 		sys_info->freq_fman[1] = sys_info->freq_systembus / 2;
553b5c8753fSKumar Gala 	}
554a47a12beSStefan Roese #endif
555a47a12beSStefan Roese #endif
556a47a12beSStefan Roese 
5573e83fc9bSShaohui Xie #ifdef CONFIG_SYS_DPAA_QBMAN
558997399faSPrabhakar Kushwaha 	sys_info->freq_qman = sys_info->freq_systembus / 2;
5593e83fc9bSShaohui Xie #endif
5603e83fc9bSShaohui Xie 
5619a653a98SYork Sun #endif /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
5629a653a98SYork Sun 
5632a44efebSZhao Qiang #ifdef CONFIG_U_QE
5642a44efebSZhao Qiang 	sys_info->freq_qe =  sys_info->freq_systembus / 2;
5652a44efebSZhao Qiang #endif
5662a44efebSZhao Qiang 
5679a653a98SYork Sun #else /* CONFIG_FSL_CORENET */
568997399faSPrabhakar Kushwaha 	uint plat_ratio, e500_ratio, half_freq_systembus;
569a47a12beSStefan Roese 	int i;
570a47a12beSStefan Roese #ifdef CONFIG_QE
571a52d2f81SHaiying Wang 	__maybe_unused u32 qe_ratio;
572a47a12beSStefan Roese #endif
573a47a12beSStefan Roese 
574a47a12beSStefan Roese 	plat_ratio = (gur->porpllsr) & 0x0000003e;
575a47a12beSStefan Roese 	plat_ratio >>= 1;
576997399faSPrabhakar Kushwaha 	sys_info->freq_systembus = plat_ratio * CONFIG_SYS_CLK_FREQ;
577a47a12beSStefan Roese 
578a47a12beSStefan Roese 	/* Divide before multiply to avoid integer
579a47a12beSStefan Roese 	 * overflow for processor speeds above 2GHz */
580997399faSPrabhakar Kushwaha 	half_freq_systembus = sys_info->freq_systembus/2;
581a47a12beSStefan Roese 	for (i = 0; i < cpu_numcores(); i++) {
582a47a12beSStefan Roese 		e500_ratio = ((gur->porpllsr) >> (i * 8 + 16)) & 0x3f;
583997399faSPrabhakar Kushwaha 		sys_info->freq_processor[i] = e500_ratio * half_freq_systembus;
584a47a12beSStefan Roese 	}
585a47a12beSStefan Roese 
586997399faSPrabhakar Kushwaha 	/* Note: freq_ddrbus is the MCLK frequency, not the data rate. */
587997399faSPrabhakar Kushwaha 	sys_info->freq_ddrbus = sys_info->freq_systembus;
588a47a12beSStefan Roese 
589a47a12beSStefan Roese #ifdef CONFIG_DDR_CLK_FREQ
590a47a12beSStefan Roese 	{
591a47a12beSStefan Roese 		u32 ddr_ratio = ((gur->porpllsr) & MPC85xx_PORPLLSR_DDR_RATIO)
592a47a12beSStefan Roese 			>> MPC85xx_PORPLLSR_DDR_RATIO_SHIFT;
593a47a12beSStefan Roese 		if (ddr_ratio != 0x7)
594997399faSPrabhakar Kushwaha 			sys_info->freq_ddrbus = ddr_ratio * CONFIG_DDR_CLK_FREQ;
595a47a12beSStefan Roese 	}
596a47a12beSStefan Roese #endif
597a47a12beSStefan Roese 
598a47a12beSStefan Roese #ifdef CONFIG_QE
5994167a67dSYork Sun #if defined(CONFIG_ARCH_P1021) || defined(CONFIG_ARCH_P1025)
600997399faSPrabhakar Kushwaha 	sys_info->freq_qe =  sys_info->freq_systembus;
601a52d2f81SHaiying Wang #else
602a47a12beSStefan Roese 	qe_ratio = ((gur->porpllsr) & MPC85xx_PORPLLSR_QE_RATIO)
603a47a12beSStefan Roese 			>> MPC85xx_PORPLLSR_QE_RATIO_SHIFT;
604997399faSPrabhakar Kushwaha 	sys_info->freq_qe = qe_ratio * CONFIG_SYS_CLK_FREQ;
605a47a12beSStefan Roese #endif
606a52d2f81SHaiying Wang #endif
607a47a12beSStefan Roese 
60824995d82SHaiying Wang #ifdef CONFIG_SYS_DPAA_FMAN
609997399faSPrabhakar Kushwaha 		sys_info->freq_fman[0] = sys_info->freq_systembus;
61024995d82SHaiying Wang #endif
61124995d82SHaiying Wang 
61224995d82SHaiying Wang #endif /* CONFIG_FSL_CORENET */
61324995d82SHaiying Wang 
614beba93edSDipen Dudhat #if defined(CONFIG_FSL_LBC)
6159a653a98SYork Sun 	uint lcrr_div;
616a47a12beSStefan Roese #if defined(CONFIG_SYS_LBC_LCRR)
617a47a12beSStefan Roese 	/* We will program LCRR to this value later */
618a47a12beSStefan Roese 	lcrr_div = CONFIG_SYS_LBC_LCRR & LCRR_CLKDIV;
619a47a12beSStefan Roese #else
620f51cdaf1SBecky Bruce 	lcrr_div = in_be32(&(LBC_BASE_ADDR)->lcrr) & LCRR_CLKDIV;
621a47a12beSStefan Roese #endif
622a47a12beSStefan Roese 	if (lcrr_div == 2 || lcrr_div == 4 || lcrr_div == 8) {
623a47a12beSStefan Roese #if defined(CONFIG_FSL_CORENET)
624a47a12beSStefan Roese 		/* If this is corenet based SoC, bit-representation
625a47a12beSStefan Roese 		 * for four times the clock divider values.
626a47a12beSStefan Roese 		 */
627a47a12beSStefan Roese 		lcrr_div *= 4;
6283aff3082SYork Sun #elif !defined(CONFIG_ARCH_MPC8540) && !defined(CONFIG_ARCH_MPC8541) && \
62999d0a312SYork Sun 	!defined(CONFIG_ARCH_MPC8555) && !defined(CONFIG_ARCH_MPC8560)
630a47a12beSStefan Roese 		/*
631a47a12beSStefan Roese 		 * Yes, the entire PQ38 family use the same
632a47a12beSStefan Roese 		 * bit-representation for twice the clock divider values.
633a47a12beSStefan Roese 		 */
634a47a12beSStefan Roese 		lcrr_div *= 2;
635a47a12beSStefan Roese #endif
636997399faSPrabhakar Kushwaha 		sys_info->freq_localbus = sys_info->freq_systembus / lcrr_div;
637a47a12beSStefan Roese 	} else {
638a47a12beSStefan Roese 		/* In case anyone cares what the unknown value is */
639997399faSPrabhakar Kushwaha 		sys_info->freq_localbus = lcrr_div;
640a47a12beSStefan Roese 	}
641beba93edSDipen Dudhat #endif
642800c73c4SKumar Gala 
643800c73c4SKumar Gala #if defined(CONFIG_FSL_IFC)
64439b0bbbbSJaiprakash Singh 	ccr = ifc_in32(&ifc_regs.gregs->ifc_ccr);
645800c73c4SKumar Gala 	ccr = ((ccr & IFC_CCR_CLK_DIV_MASK) >> IFC_CCR_CLK_DIV_SHIFT) + 1;
646800c73c4SKumar Gala 
647997399faSPrabhakar Kushwaha 	sys_info->freq_localbus = sys_info->freq_systembus / ccr;
648800c73c4SKumar Gala #endif
649a47a12beSStefan Roese }
650a47a12beSStefan Roese 
651a47a12beSStefan Roese 
652a47a12beSStefan Roese int get_clocks (void)
653a47a12beSStefan Roese {
654a47a12beSStefan Roese 	sys_info_t sys_info;
65525cb74b3SYork Sun #ifdef CONFIG_ARCH_MPC8544
656a47a12beSStefan Roese 	volatile ccsr_gur_t *gur = (void *) CONFIG_SYS_MPC85xx_GUTS_ADDR;
657a47a12beSStefan Roese #endif
658a47a12beSStefan Roese #if defined(CONFIG_CPM2)
659a47a12beSStefan Roese 	volatile ccsr_cpm_t *cpm = (ccsr_cpm_t *)CONFIG_SYS_MPC85xx_CPM_ADDR;
660a47a12beSStefan Roese 	uint sccr, dfbrg;
661a47a12beSStefan Roese 
662a47a12beSStefan Roese 	/* set VCO = 4 * BRG */
663a47a12beSStefan Roese 	cpm->im_cpm_intctl.sccr &= 0xfffffffc;
664a47a12beSStefan Roese 	sccr = cpm->im_cpm_intctl.sccr;
665a47a12beSStefan Roese 	dfbrg = (sccr & SCCR_DFBRG_MSK) >> SCCR_DFBRG_SHIFT;
666a47a12beSStefan Roese #endif
667a47a12beSStefan Roese 	get_sys_info (&sys_info);
668997399faSPrabhakar Kushwaha 	gd->cpu_clk = sys_info.freq_processor[0];
669997399faSPrabhakar Kushwaha 	gd->bus_clk = sys_info.freq_systembus;
670997399faSPrabhakar Kushwaha 	gd->mem_clk = sys_info.freq_ddrbus;
671997399faSPrabhakar Kushwaha 	gd->arch.lbc_clk = sys_info.freq_localbus;
672a47a12beSStefan Roese 
673a47a12beSStefan Roese #ifdef CONFIG_QE
674997399faSPrabhakar Kushwaha 	gd->arch.qe_clk = sys_info.freq_qe;
67545bae2e3SSimon Glass 	gd->arch.brg_clk = gd->arch.qe_clk / 2;
676a47a12beSStefan Roese #endif
677a47a12beSStefan Roese 	/*
678a47a12beSStefan Roese 	 * The base clock for I2C depends on the actual SOC.  Unfortunately,
679a47a12beSStefan Roese 	 * there is no pattern that can be used to determine the frequency, so
680a47a12beSStefan Roese 	 * the only choice is to look up the actual SOC number and use the value
681a47a12beSStefan Roese 	 * for that SOC. This information is taken from application note
682a47a12beSStefan Roese 	 * AN2919.
683a47a12beSStefan Roese 	 */
6843aff3082SYork Sun #if defined(CONFIG_ARCH_MPC8540) || defined(CONFIG_ARCH_MPC8541) || \
68599d0a312SYork Sun 	defined(CONFIG_ARCH_MPC8560) || defined(CONFIG_ARCH_MPC8555) || \
686feb9e25bSYork Sun 	defined(CONFIG_ARCH_P1022)
687997399faSPrabhakar Kushwaha 	gd->arch.i2c1_clk = sys_info.freq_systembus;
68825cb74b3SYork Sun #elif defined(CONFIG_ARCH_MPC8544)
689a47a12beSStefan Roese 	/*
690a47a12beSStefan Roese 	 * On the 8544, the I2C clock is the same as the SEC clock.  This can be
691a47a12beSStefan Roese 	 * either CCB/2 or CCB/3, depending on the value of cfg_sec_freq. See
692a47a12beSStefan Roese 	 * 4.4.3.3 of the 8544 RM.  Note that this might actually work for all
693a47a12beSStefan Roese 	 * 85xx, but only the 8544 has cfg_sec_freq, so it's unknown if the
694a47a12beSStefan Roese 	 * PORDEVSR2_SEC_CFG bit is 0 on all 85xx boards that are not an 8544.
695a47a12beSStefan Roese 	 */
696a47a12beSStefan Roese 	if (gur->pordevsr2 & MPC85xx_PORDEVSR2_SEC_CFG)
697997399faSPrabhakar Kushwaha 		gd->arch.i2c1_clk = sys_info.freq_systembus / 3;
698a47a12beSStefan Roese 	else
699997399faSPrabhakar Kushwaha 		gd->arch.i2c1_clk = sys_info.freq_systembus / 2;
700a47a12beSStefan Roese #else
701a47a12beSStefan Roese 	/* Most 85xx SOCs use CCB/2, so this is the default behavior. */
702997399faSPrabhakar Kushwaha 	gd->arch.i2c1_clk = sys_info.freq_systembus / 2;
703a47a12beSStefan Roese #endif
704609e6ec3SSimon Glass 	gd->arch.i2c2_clk = gd->arch.i2c1_clk;
705a47a12beSStefan Roese 
706a47a12beSStefan Roese #if defined(CONFIG_FSL_ESDHC)
7072d9ca2c7SYangbo Lu #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
7082d9ca2c7SYangbo Lu 	gd->arch.sdhc_clk = sys_info.freq_sdhc / 2;
7092d9ca2c7SYangbo Lu #else
71046d9fc0bSYork Sun #if defined(CONFIG_ARCH_MPC8569) || defined(CONFIG_ARCH_P1010)
711e9adeca3SSimon Glass 	gd->arch.sdhc_clk = gd->bus_clk;
712a47a12beSStefan Roese #else
713e9adeca3SSimon Glass 	gd->arch.sdhc_clk = gd->bus_clk / 2;
714a47a12beSStefan Roese #endif
7152d9ca2c7SYangbo Lu #endif
716a47a12beSStefan Roese #endif /* defined(CONFIG_FSL_ESDHC) */
717a47a12beSStefan Roese 
718a47a12beSStefan Roese #if defined(CONFIG_CPM2)
719997399faSPrabhakar Kushwaha 	gd->arch.vco_out = 2*sys_info.freq_systembus;
720748cd059SSimon Glass 	gd->arch.cpm_clk = gd->arch.vco_out / 2;
721748cd059SSimon Glass 	gd->arch.scc_clk = gd->arch.vco_out / 4;
722748cd059SSimon Glass 	gd->arch.brg_clk = gd->arch.vco_out / (1 << (2 * (dfbrg + 1)));
723a47a12beSStefan Roese #endif
724a47a12beSStefan Roese 
725a47a12beSStefan Roese 	if(gd->cpu_clk != 0) return (0);
726a47a12beSStefan Roese 	else return (1);
727a47a12beSStefan Roese }
728a47a12beSStefan Roese 
729a47a12beSStefan Roese 
730a47a12beSStefan Roese /********************************************
731a47a12beSStefan Roese  * get_bus_freq
732a47a12beSStefan Roese  * return system bus freq in Hz
733a47a12beSStefan Roese  *********************************************/
734a47a12beSStefan Roese ulong get_bus_freq (ulong dummy)
735a47a12beSStefan Roese {
736a47a12beSStefan Roese 	return gd->bus_clk;
737a47a12beSStefan Roese }
738a47a12beSStefan Roese 
739a47a12beSStefan Roese /********************************************
740a47a12beSStefan Roese  * get_ddr_freq
741a47a12beSStefan Roese  * return ddr bus freq in Hz
742a47a12beSStefan Roese  *********************************************/
743a47a12beSStefan Roese ulong get_ddr_freq (ulong dummy)
744a47a12beSStefan Roese {
745a47a12beSStefan Roese 	return gd->mem_clk;
746a47a12beSStefan Roese }
747