xref: /rk3399_rockchip-uboot/arch/powerpc/cpu/mpc85xx/speed.c (revision 2d9ca2c72c0fce33052f78f02cdc8ad0a5cf4292)
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];
76*2d9ca2c7SYangbo Lu #if !defined(CONFIG_FM_PLAT_CLK_DIV) || !defined(CONFIG_PME_PLAT_CLK_DIV) || \
77*2d9ca2c7SYangbo 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) || \
13414109c7aSYork Sun 	defined(CONFIG_PPC_T4080) || defined(CONFIG_PPC_T2080)
13514109c7aSYork Sun 	svr = get_svr();
13614109c7aSYork Sun 	switch (SVR_SOC_VER(svr)) {
13714109c7aSYork Sun 	case SVR_T4240:
13814109c7aSYork Sun 	case SVR_T4160:
13914109c7aSYork Sun 	case SVR_T4120:
14014109c7aSYork Sun 	case SVR_T4080:
14114109c7aSYork Sun 		if (SVR_MAJ(svr) >= 2)
142e88f421eSZang Roy-R61911 			mem_pll_rat *= 2;
14314109c7aSYork Sun 		break;
14414109c7aSYork Sun 	case SVR_T2080:
14514109c7aSYork Sun 	case SVR_T2081:
14614109c7aSYork Sun 		if ((SVR_MAJ(svr) > 1) || (SVR_MIN(svr) >= 1))
14714109c7aSYork Sun 			mem_pll_rat *= 2;
14814109c7aSYork Sun 		break;
14914109c7aSYork Sun 	default:
15014109c7aSYork Sun 		break;
15114109c7aSYork Sun 	}
152e88f421eSZang Roy-R61911 #endif
153ab48ca1aSSrikanth Srinivasan 	if (mem_pll_rat > 2)
154997399faSPrabhakar Kushwaha 		sys_info->freq_ddrbus *= mem_pll_rat;
155ab48ca1aSSrikanth Srinivasan 	else
156997399faSPrabhakar Kushwaha 		sys_info->freq_ddrbus = sys_info->freq_systembus * mem_pll_rat;
157a47a12beSStefan Roese 
158ce746fe0SPrabhakar Kushwaha 	for (i = 0; i < CONFIG_SYS_FSL_NUM_CC_PLLS; i++) {
159ce746fe0SPrabhakar Kushwaha 		ratio[i] = (in_be32(&clk->pllcgsr[i].pllcngsr) >> 1) & 0x3f;
160ab48ca1aSSrikanth Srinivasan 		if (ratio[i] > 4)
161ce746fe0SPrabhakar Kushwaha 			freq_c_pll[i] = sysclk * ratio[i];
162ab48ca1aSSrikanth Srinivasan 		else
163ce746fe0SPrabhakar Kushwaha 			freq_c_pll[i] = sys_info->freq_systembus * ratio[i];
164ab48ca1aSSrikanth Srinivasan 	}
165b8bf0adcSShaveta Leekha 
1669a653a98SYork Sun #ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
1679a653a98SYork Sun 	/*
168ce746fe0SPrabhakar Kushwaha 	 * As per CHASSIS2 architeture total 12 clusters are posible and
1699a653a98SYork Sun 	 * Each cluster has up to 4 cores, sharing the same PLL selection.
170ce746fe0SPrabhakar Kushwaha 	 * The cluster clock assignment is SoC defined.
171ce746fe0SPrabhakar Kushwaha 	 *
172ce746fe0SPrabhakar Kushwaha 	 * Total 4 clock groups are possible with 3 PLLs each.
173ce746fe0SPrabhakar Kushwaha 	 * as per array indices, clock group A has 0, 1, 2 numbered PLLs &
174ce746fe0SPrabhakar Kushwaha 	 * clock group B has 3, 4, 6 and so on.
175ce746fe0SPrabhakar Kushwaha 	 *
176ce746fe0SPrabhakar Kushwaha 	 * Clock group A having PLL1, PLL2, PLL3, feeding cores of any cluster
177ce746fe0SPrabhakar Kushwaha 	 * depends upon the SoC architeture. Same applies to other
178ce746fe0SPrabhakar Kushwaha 	 * clock groups and clusters.
179ce746fe0SPrabhakar Kushwaha 	 *
1809a653a98SYork Sun 	 */
1819a653a98SYork Sun 	for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
182f6981439SYork Sun 		int cluster = fsl_qoriq_core_to_cluster(cpu);
183f6981439SYork Sun 		u32 c_pll_sel = (in_be32(&clk->clkcsr[cluster].clkcncsr) >> 27)
1849a653a98SYork Sun 				& 0xf;
1859a653a98SYork Sun 		u32 cplx_pll = core_cplx_PLL[c_pll_sel];
186ce746fe0SPrabhakar Kushwaha 		cplx_pll += cc_group[cluster] - 1;
187997399faSPrabhakar Kushwaha 		sys_info->freq_processor[cpu] =
188ce746fe0SPrabhakar Kushwaha 			 freq_c_pll[cplx_pll] / core_cplx_pll_div[c_pll_sel];
1899a653a98SYork Sun 	}
190b8bf0adcSShaveta Leekha 
191b8bf0adcSShaveta Leekha #ifdef CONFIG_HETROGENOUS_CLUSTERS
192b8bf0adcSShaveta Leekha 	for_each_cpu(i, dsp_cpu, cpu_num_dspcores(), cpu_dsp_mask()) {
193b8bf0adcSShaveta Leekha 		int dsp_cluster = fsl_qoriq_dsp_core_to_cluster(dsp_cpu);
194b8bf0adcSShaveta Leekha 		u32 c_pll_sel = (in_be32
195b8bf0adcSShaveta Leekha 				(&clk->clkcsr[dsp_cluster].clkcncsr) >> 27)
196b8bf0adcSShaveta Leekha 				& 0xf;
197b8bf0adcSShaveta Leekha 		u32 cplx_pll = core_cplx_PLL[c_pll_sel];
198b8bf0adcSShaveta Leekha 		cplx_pll += cc_group[dsp_cluster] - 1;
199b8bf0adcSShaveta Leekha 		sys_info->freq_processor_dsp[dsp_cpu] =
200b8bf0adcSShaveta Leekha 			 freq_c_pll[cplx_pll] / core_cplx_pll_div[c_pll_sel];
201b8bf0adcSShaveta Leekha 	}
202b8bf0adcSShaveta Leekha #endif
203b8bf0adcSShaveta Leekha 
204b33bd8cdSPrabhakar Kushwaha #if defined(CONFIG_PPC_B4860) || defined(CONFIG_PPC_B4420) || \
205b33bd8cdSPrabhakar Kushwaha 	defined(CONFIG_PPC_T2080) || defined(CONFIG_PPC_T2081)
2060cb3325cSSandeep Singh #define FM1_CLK_SEL	0xe0000000
2070cb3325cSSandeep Singh #define FM1_CLK_SHIFT	29
208f6050790SShengzhou Liu #elif defined(CONFIG_PPC_T1024) || defined(CONFIG_PPC_T1023)
209f6050790SShengzhou Liu #define FM1_CLK_SEL	0x00000007
210f6050790SShengzhou Liu #define FM1_CLK_SHIFT	0
2110cb3325cSSandeep Singh #else
2129a653a98SYork Sun #define PME_CLK_SEL	0xe0000000
2139a653a98SYork Sun #define PME_CLK_SHIFT	29
2149a653a98SYork Sun #define FM1_CLK_SEL	0x1c000000
2159a653a98SYork Sun #define FM1_CLK_SHIFT	26
2160cb3325cSSandeep Singh #endif
217ce746fe0SPrabhakar Kushwaha #if !defined(CONFIG_FM_PLAT_CLK_DIV) || !defined(CONFIG_PME_PLAT_CLK_DIV)
218f6050790SShengzhou Liu #if defined(CONFIG_PPC_T1024) || defined(CONFIG_PPC_T1023)
219f6050790SShengzhou Liu 	rcw_tmp = in_be32(&gur->rcwsr[15]) - 4;
220f6050790SShengzhou Liu #else
2219a653a98SYork Sun 	rcw_tmp = in_be32(&gur->rcwsr[7]);
222ce746fe0SPrabhakar Kushwaha #endif
223f6050790SShengzhou Liu #endif
2249a653a98SYork Sun 
2259a653a98SYork Sun #ifdef CONFIG_SYS_DPAA_PME
226ce746fe0SPrabhakar Kushwaha #ifndef CONFIG_PME_PLAT_CLK_DIV
2279a653a98SYork Sun 	switch ((rcw_tmp & PME_CLK_SEL) >> PME_CLK_SHIFT) {
2289a653a98SYork Sun 	case 1:
229ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK];
2309a653a98SYork Sun 		break;
2319a653a98SYork Sun 	case 2:
232ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK] / 2;
2339a653a98SYork Sun 		break;
2349a653a98SYork Sun 	case 3:
235ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK] / 3;
2369a653a98SYork Sun 		break;
2379a653a98SYork Sun 	case 4:
238ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK] / 4;
2399a653a98SYork Sun 		break;
2409a653a98SYork Sun 	case 6:
241ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK + 1] / 2;
2429a653a98SYork Sun 		break;
2439a653a98SYork Sun 	case 7:
244ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK + 1] / 3;
2459a653a98SYork Sun 		break;
2469a653a98SYork Sun 	default:
2479a653a98SYork Sun 		printf("Error: Unknown PME clock select!\n");
2489a653a98SYork Sun 	case 0:
249997399faSPrabhakar Kushwaha 		sys_info->freq_pme = sys_info->freq_systembus / 2;
2509a653a98SYork Sun 		break;
2519a653a98SYork Sun 
2529a653a98SYork Sun 	}
253ce746fe0SPrabhakar Kushwaha #else
254ce746fe0SPrabhakar Kushwaha 	sys_info->freq_pme = sys_info->freq_systembus / CONFIG_SYS_PME_CLK;
255ce746fe0SPrabhakar Kushwaha 
256ce746fe0SPrabhakar Kushwaha #endif
2579a653a98SYork Sun #endif
2589a653a98SYork Sun 
259990e1a8cSHaiying Wang #ifdef CONFIG_SYS_DPAA_QBMAN
260f6050790SShengzhou Liu #ifndef CONFIG_QBMAN_CLK_DIV
261f6050790SShengzhou Liu #define CONFIG_QBMAN_CLK_DIV	2
262f6050790SShengzhou Liu #endif
263f6050790SShengzhou Liu 	sys_info->freq_qman = sys_info->freq_systembus / CONFIG_QBMAN_CLK_DIV;
264990e1a8cSHaiying Wang #endif
265990e1a8cSHaiying Wang 
266b8bf0adcSShaveta Leekha #if defined(CONFIG_SYS_MAPLE)
267b8bf0adcSShaveta Leekha #define CPRI_CLK_SEL		0x1C000000
268b8bf0adcSShaveta Leekha #define CPRI_CLK_SHIFT		26
269b8bf0adcSShaveta Leekha #define CPRI_ALT_CLK_SEL	0x00007000
270b8bf0adcSShaveta Leekha #define CPRI_ALT_CLK_SHIFT	12
271b8bf0adcSShaveta Leekha 
272b8bf0adcSShaveta Leekha 	rcw_tmp1 = in_be32(&gur->rcwsr[7]);	/* Reading RCW bits: 224-255*/
273b8bf0adcSShaveta Leekha 	rcw_tmp2 = in_be32(&gur->rcwsr[15]);	/* Reading RCW bits: 480-511*/
274b8bf0adcSShaveta Leekha 	/* For MAPLE and CPRI frequency */
275b8bf0adcSShaveta Leekha 	switch ((rcw_tmp1 & CPRI_CLK_SEL) >> CPRI_CLK_SHIFT) {
276b8bf0adcSShaveta Leekha 	case 1:
277b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK];
278b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK];
279b8bf0adcSShaveta Leekha 		break;
280b8bf0adcSShaveta Leekha 	case 2:
281b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 2;
282b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 2;
283b8bf0adcSShaveta Leekha 		break;
284b8bf0adcSShaveta Leekha 	case 3:
285b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 3;
286b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 3;
287b8bf0adcSShaveta Leekha 		break;
288b8bf0adcSShaveta Leekha 	case 4:
289b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 4;
290b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 4;
291b8bf0adcSShaveta Leekha 		break;
292b8bf0adcSShaveta Leekha 	case 5:
293b8bf0adcSShaveta Leekha 		if (((rcw_tmp2 & CPRI_ALT_CLK_SEL)
294b8bf0adcSShaveta Leekha 					>> CPRI_ALT_CLK_SHIFT) == 6) {
295b8bf0adcSShaveta Leekha 			sys_info->freq_maple =
296b8bf0adcSShaveta Leekha 				freq_c_pll[CONFIG_SYS_CPRI_CLK - 2] / 2;
297b8bf0adcSShaveta Leekha 			sys_info->freq_cpri =
298b8bf0adcSShaveta Leekha 				freq_c_pll[CONFIG_SYS_CPRI_CLK - 2] / 2;
299b8bf0adcSShaveta Leekha 		}
300b8bf0adcSShaveta Leekha 		if (((rcw_tmp2 & CPRI_ALT_CLK_SEL)
301b8bf0adcSShaveta Leekha 					>> CPRI_ALT_CLK_SHIFT) == 7) {
302b8bf0adcSShaveta Leekha 			sys_info->freq_maple =
303b8bf0adcSShaveta Leekha 				freq_c_pll[CONFIG_SYS_CPRI_CLK - 2] / 3;
304b8bf0adcSShaveta Leekha 			sys_info->freq_cpri =
305b8bf0adcSShaveta Leekha 				freq_c_pll[CONFIG_SYS_CPRI_CLK - 2] / 3;
306b8bf0adcSShaveta Leekha 		}
307b8bf0adcSShaveta Leekha 		break;
308b8bf0adcSShaveta Leekha 	case 6:
309b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK + 1] / 2;
310b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK + 1] / 2;
311b8bf0adcSShaveta Leekha 		break;
312b8bf0adcSShaveta Leekha 	case 7:
313b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK + 1] / 3;
314b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK + 1] / 3;
315b8bf0adcSShaveta Leekha 		break;
316b8bf0adcSShaveta Leekha 	default:
317b8bf0adcSShaveta Leekha 		printf("Error: Unknown MAPLE/CPRI clock select!\n");
318b8bf0adcSShaveta Leekha 	}
319b8bf0adcSShaveta Leekha 
320b8bf0adcSShaveta Leekha 	/* For MAPLE ULB and eTVPE frequencies */
321b8bf0adcSShaveta Leekha #define ULB_CLK_SEL		0x00000038
322b8bf0adcSShaveta Leekha #define ULB_CLK_SHIFT		3
323b8bf0adcSShaveta Leekha #define ETVPE_CLK_SEL		0x00000007
324b8bf0adcSShaveta Leekha #define ETVPE_CLK_SHIFT		0
325b8bf0adcSShaveta Leekha 
326b8bf0adcSShaveta Leekha 	switch ((rcw_tmp2 & ULB_CLK_SEL) >> ULB_CLK_SHIFT) {
327b8bf0adcSShaveta Leekha 	case 1:
328b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb = freq_c_pll[CONFIG_SYS_ULB_CLK];
329b8bf0adcSShaveta Leekha 		break;
330b8bf0adcSShaveta Leekha 	case 2:
331b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb = freq_c_pll[CONFIG_SYS_ULB_CLK] / 2;
332b8bf0adcSShaveta Leekha 		break;
333b8bf0adcSShaveta Leekha 	case 3:
334b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb = freq_c_pll[CONFIG_SYS_ULB_CLK] / 3;
335b8bf0adcSShaveta Leekha 		break;
336b8bf0adcSShaveta Leekha 	case 4:
337b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb = freq_c_pll[CONFIG_SYS_ULB_CLK] / 4;
338b8bf0adcSShaveta Leekha 		break;
339b8bf0adcSShaveta Leekha 	case 5:
340b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb = sys_info->freq_systembus;
341b8bf0adcSShaveta Leekha 		break;
342b8bf0adcSShaveta Leekha 	case 6:
343b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb =
344b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ULB_CLK - 1] / 2;
345b8bf0adcSShaveta Leekha 		break;
346b8bf0adcSShaveta Leekha 	case 7:
347b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb =
348b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ULB_CLK - 1] / 3;
349b8bf0adcSShaveta Leekha 		break;
350b8bf0adcSShaveta Leekha 	default:
351b8bf0adcSShaveta Leekha 		printf("Error: Unknown MAPLE ULB clock select!\n");
352b8bf0adcSShaveta Leekha 	}
353b8bf0adcSShaveta Leekha 
354b8bf0adcSShaveta Leekha 	switch ((rcw_tmp2 & ETVPE_CLK_SEL) >> ETVPE_CLK_SHIFT) {
355b8bf0adcSShaveta Leekha 	case 1:
356b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe = freq_c_pll[CONFIG_SYS_ETVPE_CLK];
357b8bf0adcSShaveta Leekha 		break;
358b8bf0adcSShaveta Leekha 	case 2:
359b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe =
360b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ETVPE_CLK] / 2;
361b8bf0adcSShaveta Leekha 		break;
362b8bf0adcSShaveta Leekha 	case 3:
363b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe =
364b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ETVPE_CLK] / 3;
365b8bf0adcSShaveta Leekha 		break;
366b8bf0adcSShaveta Leekha 	case 4:
367b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe =
368b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ETVPE_CLK] / 4;
369b8bf0adcSShaveta Leekha 		break;
370b8bf0adcSShaveta Leekha 	case 5:
371b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe = sys_info->freq_systembus;
372b8bf0adcSShaveta Leekha 		break;
373b8bf0adcSShaveta Leekha 	case 6:
374b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe =
375b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ETVPE_CLK - 1] / 2;
376b8bf0adcSShaveta Leekha 		break;
377b8bf0adcSShaveta Leekha 	case 7:
378b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe =
379b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ETVPE_CLK - 1] / 3;
380b8bf0adcSShaveta Leekha 		break;
381b8bf0adcSShaveta Leekha 	default:
382b8bf0adcSShaveta Leekha 		printf("Error: Unknown MAPLE eTVPE clock select!\n");
383b8bf0adcSShaveta Leekha 	}
384b8bf0adcSShaveta Leekha 
385b8bf0adcSShaveta Leekha #endif
386b8bf0adcSShaveta Leekha 
3879a653a98SYork Sun #ifdef CONFIG_SYS_DPAA_FMAN
388ce746fe0SPrabhakar Kushwaha #ifndef CONFIG_FM_PLAT_CLK_DIV
3899a653a98SYork Sun 	switch ((rcw_tmp & FM1_CLK_SEL) >> FM1_CLK_SHIFT) {
3909a653a98SYork Sun 	case 1:
391ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK];
3929a653a98SYork Sun 		break;
3939a653a98SYork Sun 	case 2:
394ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK] / 2;
3959a653a98SYork Sun 		break;
3969a653a98SYork Sun 	case 3:
397ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK] / 3;
3989a653a98SYork Sun 		break;
3999a653a98SYork Sun 	case 4:
400ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK] / 4;
4019a653a98SYork Sun 		break;
4020cb3325cSSandeep Singh 	case 5:
403997399faSPrabhakar Kushwaha 		sys_info->freq_fman[0] = sys_info->freq_systembus;
4040cb3325cSSandeep Singh 		break;
4059a653a98SYork Sun 	case 6:
406ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK + 1] / 2;
4079a653a98SYork Sun 		break;
4089a653a98SYork Sun 	case 7:
409ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK + 1] / 3;
4109a653a98SYork Sun 		break;
4119a653a98SYork Sun 	default:
4129a653a98SYork Sun 		printf("Error: Unknown FMan1 clock select!\n");
4139a653a98SYork Sun 	case 0:
414997399faSPrabhakar Kushwaha 		sys_info->freq_fman[0] = sys_info->freq_systembus / 2;
4159a653a98SYork Sun 		break;
4169a653a98SYork Sun 	}
4179a653a98SYork Sun #if (CONFIG_SYS_NUM_FMAN) == 2
418ce746fe0SPrabhakar Kushwaha #ifdef CONFIG_SYS_FM2_CLK
4199a653a98SYork Sun #define FM2_CLK_SEL	0x00000038
4209a653a98SYork Sun #define FM2_CLK_SHIFT	3
4219a653a98SYork Sun 	rcw_tmp = in_be32(&gur->rcwsr[15]);
4229a653a98SYork Sun 	switch ((rcw_tmp & FM2_CLK_SEL) >> FM2_CLK_SHIFT) {
4239a653a98SYork Sun 	case 1:
424ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1];
4259a653a98SYork Sun 		break;
4269a653a98SYork Sun 	case 2:
427ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1] / 2;
4289a653a98SYork Sun 		break;
4299a653a98SYork Sun 	case 3:
430ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1] / 3;
4319a653a98SYork Sun 		break;
4329a653a98SYork Sun 	case 4:
433ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1] / 4;
4349a653a98SYork Sun 		break;
435c1015c67SShaohui Xie 	case 5:
436c1015c67SShaohui Xie 		sys_info->freq_fman[1] = sys_info->freq_systembus;
437c1015c67SShaohui Xie 		break;
4389a653a98SYork Sun 	case 6:
439ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK] / 2;
4409a653a98SYork Sun 		break;
4419a653a98SYork Sun 	case 7:
442ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK] / 3;
4439a653a98SYork Sun 		break;
4449a653a98SYork Sun 	default:
4459a653a98SYork Sun 		printf("Error: Unknown FMan2 clock select!\n");
4469a653a98SYork Sun 	case 0:
447997399faSPrabhakar Kushwaha 		sys_info->freq_fman[1] = sys_info->freq_systembus / 2;
4489a653a98SYork Sun 		break;
4499a653a98SYork Sun 	}
450ce746fe0SPrabhakar Kushwaha #endif
4519a653a98SYork Sun #endif	/* CONFIG_SYS_NUM_FMAN == 2 */
452ce746fe0SPrabhakar Kushwaha #else
453ce746fe0SPrabhakar Kushwaha 	sys_info->freq_fman[0] = sys_info->freq_systembus / CONFIG_SYS_FM1_CLK;
454ce746fe0SPrabhakar Kushwaha #endif
455ce746fe0SPrabhakar Kushwaha #endif
4569a653a98SYork Sun 
457*2d9ca2c7SYangbo Lu #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
458*2d9ca2c7SYangbo Lu #if defined(CONFIG_PPC_T2080)
459*2d9ca2c7SYangbo Lu #define ESDHC_CLK_SEL	0x00000007
460*2d9ca2c7SYangbo Lu #define ESDHC_CLK_SHIFT	0
461*2d9ca2c7SYangbo Lu #define ESDHC_CLK_RCWSR	15
462*2d9ca2c7SYangbo Lu #else	/* Support T1040 T1024 by now */
463*2d9ca2c7SYangbo Lu #define ESDHC_CLK_SEL	0xe0000000
464*2d9ca2c7SYangbo Lu #define ESDHC_CLK_SHIFT	29
465*2d9ca2c7SYangbo Lu #define ESDHC_CLK_RCWSR	7
466*2d9ca2c7SYangbo Lu #endif
467*2d9ca2c7SYangbo Lu 	rcw_tmp = in_be32(&gur->rcwsr[ESDHC_CLK_RCWSR]);
468*2d9ca2c7SYangbo Lu 	switch ((rcw_tmp & ESDHC_CLK_SEL) >> ESDHC_CLK_SHIFT) {
469*2d9ca2c7SYangbo Lu 	case 1:
470*2d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK];
471*2d9ca2c7SYangbo Lu 		break;
472*2d9ca2c7SYangbo Lu 	case 2:
473*2d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK] / 2;
474*2d9ca2c7SYangbo Lu 		break;
475*2d9ca2c7SYangbo Lu 	case 3:
476*2d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK] / 3;
477*2d9ca2c7SYangbo Lu 		break;
478*2d9ca2c7SYangbo Lu #if defined(CONFIG_SYS_SDHC_CLK_2_PLL)
479*2d9ca2c7SYangbo Lu 	case 4:
480*2d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK] / 4;
481*2d9ca2c7SYangbo Lu 		break;
482*2d9ca2c7SYangbo Lu #if defined(CONFIG_PPC_T2080)
483*2d9ca2c7SYangbo Lu 	case 5:
484*2d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[1 - CONFIG_SYS_SDHC_CLK];
485*2d9ca2c7SYangbo Lu 		break;
486*2d9ca2c7SYangbo Lu #endif
487*2d9ca2c7SYangbo Lu 	case 6:
488*2d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[1 - CONFIG_SYS_SDHC_CLK] / 2;
489*2d9ca2c7SYangbo Lu 		break;
490*2d9ca2c7SYangbo Lu 	case 7:
491*2d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[1 - CONFIG_SYS_SDHC_CLK] / 3;
492*2d9ca2c7SYangbo Lu 		break;
493*2d9ca2c7SYangbo Lu #endif
494*2d9ca2c7SYangbo Lu 	default:
495*2d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = 0;
496*2d9ca2c7SYangbo Lu 		printf("Error: Unknown SDHC peripheral clock select!\n");
497*2d9ca2c7SYangbo Lu 	}
498*2d9ca2c7SYangbo Lu #endif
4999a653a98SYork Sun #else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
5009a653a98SYork Sun 
501fbb9ecf7STimur Tabi 	for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
502f6981439SYork Sun 		u32 c_pll_sel = (in_be32(&clk->clkcsr[cpu].clkcncsr) >> 27)
503f6981439SYork Sun 				& 0xf;
504a47a12beSStefan Roese 		u32 cplx_pll = core_cplx_PLL[c_pll_sel];
505a47a12beSStefan Roese 
506997399faSPrabhakar Kushwaha 		sys_info->freq_processor[cpu] =
507ce746fe0SPrabhakar Kushwaha 			 freq_c_pll[cplx_pll] / core_cplx_pll_div[c_pll_sel];
508a47a12beSStefan Roese 	}
509a47a12beSStefan Roese #define PME_CLK_SEL	0x80000000
510a47a12beSStefan Roese #define FM1_CLK_SEL	0x40000000
511a47a12beSStefan Roese #define FM2_CLK_SEL	0x20000000
512b5c8753fSKumar Gala #define HWA_ASYNC_DIV	0x04000000
513b5c8753fSKumar Gala #if (CONFIG_SYS_FSL_NUM_CC_PLLS == 2)
514b5c8753fSKumar Gala #define HWA_CC_PLL	1
5154905443fSTimur Tabi #elif (CONFIG_SYS_FSL_NUM_CC_PLLS == 3)
5164905443fSTimur Tabi #define HWA_CC_PLL	2
517b5c8753fSKumar Gala #elif (CONFIG_SYS_FSL_NUM_CC_PLLS == 4)
518b5c8753fSKumar Gala #define HWA_CC_PLL	2
519b5c8753fSKumar Gala #else
520b5c8753fSKumar Gala #error CONFIG_SYS_FSL_NUM_CC_PLLS not set or unknown case
521b5c8753fSKumar Gala #endif
522a47a12beSStefan Roese 	rcw_tmp = in_be32(&gur->rcwsr[7]);
523a47a12beSStefan Roese 
524a47a12beSStefan Roese #ifdef CONFIG_SYS_DPAA_PME
525b5c8753fSKumar Gala 	if (rcw_tmp & PME_CLK_SEL) {
526b5c8753fSKumar Gala 		if (rcw_tmp & HWA_ASYNC_DIV)
527ce746fe0SPrabhakar Kushwaha 			sys_info->freq_pme = freq_c_pll[HWA_CC_PLL] / 4;
528a47a12beSStefan Roese 		else
529ce746fe0SPrabhakar Kushwaha 			sys_info->freq_pme = freq_c_pll[HWA_CC_PLL] / 2;
530b5c8753fSKumar Gala 	} else {
531997399faSPrabhakar Kushwaha 		sys_info->freq_pme = sys_info->freq_systembus / 2;
532b5c8753fSKumar Gala 	}
533a47a12beSStefan Roese #endif
534a47a12beSStefan Roese 
535a47a12beSStefan Roese #ifdef CONFIG_SYS_DPAA_FMAN
536b5c8753fSKumar Gala 	if (rcw_tmp & FM1_CLK_SEL) {
537b5c8753fSKumar Gala 		if (rcw_tmp & HWA_ASYNC_DIV)
538ce746fe0SPrabhakar Kushwaha 			sys_info->freq_fman[0] = freq_c_pll[HWA_CC_PLL] / 4;
539a47a12beSStefan Roese 		else
540ce746fe0SPrabhakar Kushwaha 			sys_info->freq_fman[0] = freq_c_pll[HWA_CC_PLL] / 2;
541b5c8753fSKumar Gala 	} else {
542997399faSPrabhakar Kushwaha 		sys_info->freq_fman[0] = sys_info->freq_systembus / 2;
543b5c8753fSKumar Gala 	}
544a47a12beSStefan Roese #if (CONFIG_SYS_NUM_FMAN) == 2
545b5c8753fSKumar Gala 	if (rcw_tmp & FM2_CLK_SEL) {
546b5c8753fSKumar Gala 		if (rcw_tmp & HWA_ASYNC_DIV)
547ce746fe0SPrabhakar Kushwaha 			sys_info->freq_fman[1] = freq_c_pll[HWA_CC_PLL] / 4;
548a47a12beSStefan Roese 		else
549ce746fe0SPrabhakar Kushwaha 			sys_info->freq_fman[1] = freq_c_pll[HWA_CC_PLL] / 2;
550b5c8753fSKumar Gala 	} else {
551997399faSPrabhakar Kushwaha 		sys_info->freq_fman[1] = sys_info->freq_systembus / 2;
552b5c8753fSKumar Gala 	}
553a47a12beSStefan Roese #endif
554a47a12beSStefan Roese #endif
555a47a12beSStefan Roese 
5563e83fc9bSShaohui Xie #ifdef CONFIG_SYS_DPAA_QBMAN
557997399faSPrabhakar Kushwaha 	sys_info->freq_qman = sys_info->freq_systembus / 2;
5583e83fc9bSShaohui Xie #endif
5593e83fc9bSShaohui Xie 
5609a653a98SYork Sun #endif /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
5619a653a98SYork Sun 
5622a44efebSZhao Qiang #ifdef CONFIG_U_QE
5632a44efebSZhao Qiang 	sys_info->freq_qe =  sys_info->freq_systembus / 2;
5642a44efebSZhao Qiang #endif
5652a44efebSZhao Qiang 
5669a653a98SYork Sun #else /* CONFIG_FSL_CORENET */
567997399faSPrabhakar Kushwaha 	uint plat_ratio, e500_ratio, half_freq_systembus;
568a47a12beSStefan Roese 	int i;
569a47a12beSStefan Roese #ifdef CONFIG_QE
570a52d2f81SHaiying Wang 	__maybe_unused u32 qe_ratio;
571a47a12beSStefan Roese #endif
572a47a12beSStefan Roese 
573a47a12beSStefan Roese 	plat_ratio = (gur->porpllsr) & 0x0000003e;
574a47a12beSStefan Roese 	plat_ratio >>= 1;
575997399faSPrabhakar Kushwaha 	sys_info->freq_systembus = plat_ratio * CONFIG_SYS_CLK_FREQ;
576a47a12beSStefan Roese 
577a47a12beSStefan Roese 	/* Divide before multiply to avoid integer
578a47a12beSStefan Roese 	 * overflow for processor speeds above 2GHz */
579997399faSPrabhakar Kushwaha 	half_freq_systembus = sys_info->freq_systembus/2;
580a47a12beSStefan Roese 	for (i = 0; i < cpu_numcores(); i++) {
581a47a12beSStefan Roese 		e500_ratio = ((gur->porpllsr) >> (i * 8 + 16)) & 0x3f;
582997399faSPrabhakar Kushwaha 		sys_info->freq_processor[i] = e500_ratio * half_freq_systembus;
583a47a12beSStefan Roese 	}
584a47a12beSStefan Roese 
585997399faSPrabhakar Kushwaha 	/* Note: freq_ddrbus is the MCLK frequency, not the data rate. */
586997399faSPrabhakar Kushwaha 	sys_info->freq_ddrbus = sys_info->freq_systembus;
587a47a12beSStefan Roese 
588a47a12beSStefan Roese #ifdef CONFIG_DDR_CLK_FREQ
589a47a12beSStefan Roese 	{
590a47a12beSStefan Roese 		u32 ddr_ratio = ((gur->porpllsr) & MPC85xx_PORPLLSR_DDR_RATIO)
591a47a12beSStefan Roese 			>> MPC85xx_PORPLLSR_DDR_RATIO_SHIFT;
592a47a12beSStefan Roese 		if (ddr_ratio != 0x7)
593997399faSPrabhakar Kushwaha 			sys_info->freq_ddrbus = ddr_ratio * CONFIG_DDR_CLK_FREQ;
594a47a12beSStefan Roese 	}
595a47a12beSStefan Roese #endif
596a47a12beSStefan Roese 
597a47a12beSStefan Roese #ifdef CONFIG_QE
598be7bebeaSYork Sun #if defined(CONFIG_P1012) || defined(CONFIG_P1021) || defined(CONFIG_P1025)
599997399faSPrabhakar Kushwaha 	sys_info->freq_qe =  sys_info->freq_systembus;
600a52d2f81SHaiying Wang #else
601a47a12beSStefan Roese 	qe_ratio = ((gur->porpllsr) & MPC85xx_PORPLLSR_QE_RATIO)
602a47a12beSStefan Roese 			>> MPC85xx_PORPLLSR_QE_RATIO_SHIFT;
603997399faSPrabhakar Kushwaha 	sys_info->freq_qe = qe_ratio * CONFIG_SYS_CLK_FREQ;
604a47a12beSStefan Roese #endif
605a52d2f81SHaiying Wang #endif
606a47a12beSStefan Roese 
60724995d82SHaiying Wang #ifdef CONFIG_SYS_DPAA_FMAN
608997399faSPrabhakar Kushwaha 		sys_info->freq_fman[0] = sys_info->freq_systembus;
60924995d82SHaiying Wang #endif
61024995d82SHaiying Wang 
61124995d82SHaiying Wang #endif /* CONFIG_FSL_CORENET */
61224995d82SHaiying Wang 
613beba93edSDipen Dudhat #if defined(CONFIG_FSL_LBC)
6149a653a98SYork Sun 	uint lcrr_div;
615a47a12beSStefan Roese #if defined(CONFIG_SYS_LBC_LCRR)
616a47a12beSStefan Roese 	/* We will program LCRR to this value later */
617a47a12beSStefan Roese 	lcrr_div = CONFIG_SYS_LBC_LCRR & LCRR_CLKDIV;
618a47a12beSStefan Roese #else
619f51cdaf1SBecky Bruce 	lcrr_div = in_be32(&(LBC_BASE_ADDR)->lcrr) & LCRR_CLKDIV;
620a47a12beSStefan Roese #endif
621a47a12beSStefan Roese 	if (lcrr_div == 2 || lcrr_div == 4 || lcrr_div == 8) {
622a47a12beSStefan Roese #if defined(CONFIG_FSL_CORENET)
623a47a12beSStefan Roese 		/* If this is corenet based SoC, bit-representation
624a47a12beSStefan Roese 		 * for four times the clock divider values.
625a47a12beSStefan Roese 		 */
626a47a12beSStefan Roese 		lcrr_div *= 4;
627a47a12beSStefan Roese #elif !defined(CONFIG_MPC8540) && !defined(CONFIG_MPC8541) && \
628a47a12beSStefan Roese     !defined(CONFIG_MPC8555) && !defined(CONFIG_MPC8560)
629a47a12beSStefan Roese 		/*
630a47a12beSStefan Roese 		 * Yes, the entire PQ38 family use the same
631a47a12beSStefan Roese 		 * bit-representation for twice the clock divider values.
632a47a12beSStefan Roese 		 */
633a47a12beSStefan Roese 		lcrr_div *= 2;
634a47a12beSStefan Roese #endif
635997399faSPrabhakar Kushwaha 		sys_info->freq_localbus = sys_info->freq_systembus / lcrr_div;
636a47a12beSStefan Roese 	} else {
637a47a12beSStefan Roese 		/* In case anyone cares what the unknown value is */
638997399faSPrabhakar Kushwaha 		sys_info->freq_localbus = lcrr_div;
639a47a12beSStefan Roese 	}
640beba93edSDipen Dudhat #endif
641800c73c4SKumar Gala 
642800c73c4SKumar Gala #if defined(CONFIG_FSL_IFC)
64339b0bbbbSJaiprakash Singh 	ccr = ifc_in32(&ifc_regs.gregs->ifc_ccr);
644800c73c4SKumar Gala 	ccr = ((ccr & IFC_CCR_CLK_DIV_MASK) >> IFC_CCR_CLK_DIV_SHIFT) + 1;
645800c73c4SKumar Gala 
646997399faSPrabhakar Kushwaha 	sys_info->freq_localbus = sys_info->freq_systembus / ccr;
647800c73c4SKumar Gala #endif
648a47a12beSStefan Roese }
649a47a12beSStefan Roese 
650a47a12beSStefan Roese 
651a47a12beSStefan Roese int get_clocks (void)
652a47a12beSStefan Roese {
653a47a12beSStefan Roese 	sys_info_t sys_info;
654a47a12beSStefan Roese #ifdef CONFIG_MPC8544
655a47a12beSStefan Roese 	volatile ccsr_gur_t *gur = (void *) CONFIG_SYS_MPC85xx_GUTS_ADDR;
656a47a12beSStefan Roese #endif
657a47a12beSStefan Roese #if defined(CONFIG_CPM2)
658a47a12beSStefan Roese 	volatile ccsr_cpm_t *cpm = (ccsr_cpm_t *)CONFIG_SYS_MPC85xx_CPM_ADDR;
659a47a12beSStefan Roese 	uint sccr, dfbrg;
660a47a12beSStefan Roese 
661a47a12beSStefan Roese 	/* set VCO = 4 * BRG */
662a47a12beSStefan Roese 	cpm->im_cpm_intctl.sccr &= 0xfffffffc;
663a47a12beSStefan Roese 	sccr = cpm->im_cpm_intctl.sccr;
664a47a12beSStefan Roese 	dfbrg = (sccr & SCCR_DFBRG_MSK) >> SCCR_DFBRG_SHIFT;
665a47a12beSStefan Roese #endif
666a47a12beSStefan Roese 	get_sys_info (&sys_info);
667997399faSPrabhakar Kushwaha 	gd->cpu_clk = sys_info.freq_processor[0];
668997399faSPrabhakar Kushwaha 	gd->bus_clk = sys_info.freq_systembus;
669997399faSPrabhakar Kushwaha 	gd->mem_clk = sys_info.freq_ddrbus;
670997399faSPrabhakar Kushwaha 	gd->arch.lbc_clk = sys_info.freq_localbus;
671a47a12beSStefan Roese 
672a47a12beSStefan Roese #ifdef CONFIG_QE
673997399faSPrabhakar Kushwaha 	gd->arch.qe_clk = sys_info.freq_qe;
67445bae2e3SSimon Glass 	gd->arch.brg_clk = gd->arch.qe_clk / 2;
675a47a12beSStefan Roese #endif
676a47a12beSStefan Roese 	/*
677a47a12beSStefan Roese 	 * The base clock for I2C depends on the actual SOC.  Unfortunately,
678a47a12beSStefan Roese 	 * there is no pattern that can be used to determine the frequency, so
679a47a12beSStefan Roese 	 * the only choice is to look up the actual SOC number and use the value
680a47a12beSStefan Roese 	 * for that SOC. This information is taken from application note
681a47a12beSStefan Roese 	 * AN2919.
682a47a12beSStefan Roese 	 */
683a47a12beSStefan Roese #if defined(CONFIG_MPC8540) || defined(CONFIG_MPC8541) || \
684f62b1238STang Yuantian 	defined(CONFIG_MPC8560) || defined(CONFIG_MPC8555) || \
685f62b1238STang Yuantian 	defined(CONFIG_P1022)
686997399faSPrabhakar Kushwaha 	gd->arch.i2c1_clk = sys_info.freq_systembus;
687a47a12beSStefan Roese #elif defined(CONFIG_MPC8544)
688a47a12beSStefan Roese 	/*
689a47a12beSStefan Roese 	 * On the 8544, the I2C clock is the same as the SEC clock.  This can be
690a47a12beSStefan Roese 	 * either CCB/2 or CCB/3, depending on the value of cfg_sec_freq. See
691a47a12beSStefan Roese 	 * 4.4.3.3 of the 8544 RM.  Note that this might actually work for all
692a47a12beSStefan Roese 	 * 85xx, but only the 8544 has cfg_sec_freq, so it's unknown if the
693a47a12beSStefan Roese 	 * PORDEVSR2_SEC_CFG bit is 0 on all 85xx boards that are not an 8544.
694a47a12beSStefan Roese 	 */
695a47a12beSStefan Roese 	if (gur->pordevsr2 & MPC85xx_PORDEVSR2_SEC_CFG)
696997399faSPrabhakar Kushwaha 		gd->arch.i2c1_clk = sys_info.freq_systembus / 3;
697a47a12beSStefan Roese 	else
698997399faSPrabhakar Kushwaha 		gd->arch.i2c1_clk = sys_info.freq_systembus / 2;
699a47a12beSStefan Roese #else
700a47a12beSStefan Roese 	/* Most 85xx SOCs use CCB/2, so this is the default behavior. */
701997399faSPrabhakar Kushwaha 	gd->arch.i2c1_clk = sys_info.freq_systembus / 2;
702a47a12beSStefan Roese #endif
703609e6ec3SSimon Glass 	gd->arch.i2c2_clk = gd->arch.i2c1_clk;
704a47a12beSStefan Roese 
705a47a12beSStefan Roese #if defined(CONFIG_FSL_ESDHC)
706*2d9ca2c7SYangbo Lu #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
707*2d9ca2c7SYangbo Lu 	gd->arch.sdhc_clk = sys_info.freq_sdhc / 2;
708*2d9ca2c7SYangbo Lu #else
7097d640e9bSPriyanka Jain #if defined(CONFIG_MPC8569) || defined(CONFIG_P1010) ||\
7107d640e9bSPriyanka Jain        defined(CONFIG_P1014)
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
715*2d9ca2c7SYangbo 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