xref: /rk3399_rockchip-uboot/arch/powerpc/cpu/mpc85xx/speed.c (revision c83a824e62277162ad35f52879b2316902c0eff5)
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 
get_sys_info(sys_info_t * sys_info)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);
30a47a12beSStefan Roese #ifdef CONFIG_FSL_CORENET
31a47a12beSStefan Roese 	volatile ccsr_clk_t *clk = (void *)(CONFIG_SYS_FSL_CORENET_CLK_ADDR);
32fbb9ecf7STimur Tabi 	unsigned int cpu;
33b8bf0adcSShaveta Leekha #ifdef CONFIG_HETROGENOUS_CLUSTERS
34b8bf0adcSShaveta Leekha 	unsigned int dsp_cpu;
35b8bf0adcSShaveta Leekha 	uint rcw_tmp1, rcw_tmp2;
36b8bf0adcSShaveta Leekha #endif
37ce746fe0SPrabhakar Kushwaha #ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
38ce746fe0SPrabhakar Kushwaha 	int cc_group[12] = CONFIG_SYS_FSL_CLUSTER_CLOCKS;
39ce746fe0SPrabhakar Kushwaha #endif
4014109c7aSYork Sun 	__maybe_unused u32 svr;
41a47a12beSStefan Roese 
42a47a12beSStefan Roese 	const u8 core_cplx_PLL[16] = {
43a47a12beSStefan Roese 		[ 0] = 0,	/* CC1 PPL / 1 */
44a47a12beSStefan Roese 		[ 1] = 0,	/* CC1 PPL / 2 */
45a47a12beSStefan Roese 		[ 2] = 0,	/* CC1 PPL / 4 */
46a47a12beSStefan Roese 		[ 4] = 1,	/* CC2 PPL / 1 */
47a47a12beSStefan Roese 		[ 5] = 1,	/* CC2 PPL / 2 */
48a47a12beSStefan Roese 		[ 6] = 1,	/* CC2 PPL / 4 */
49a47a12beSStefan Roese 		[ 8] = 2,	/* CC3 PPL / 1 */
50a47a12beSStefan Roese 		[ 9] = 2,	/* CC3 PPL / 2 */
51a47a12beSStefan Roese 		[10] = 2,	/* CC3 PPL / 4 */
52a47a12beSStefan Roese 		[12] = 3,	/* CC4 PPL / 1 */
53a47a12beSStefan Roese 		[13] = 3,	/* CC4 PPL / 2 */
54a47a12beSStefan Roese 		[14] = 3,	/* CC4 PPL / 4 */
55a47a12beSStefan Roese 	};
56a47a12beSStefan Roese 
57997399faSPrabhakar Kushwaha 	const u8 core_cplx_pll_div[16] = {
58a47a12beSStefan Roese 		[ 0] = 1,	/* CC1 PPL / 1 */
59a47a12beSStefan Roese 		[ 1] = 2,	/* CC1 PPL / 2 */
60a47a12beSStefan Roese 		[ 2] = 4,	/* CC1 PPL / 4 */
61a47a12beSStefan Roese 		[ 4] = 1,	/* CC2 PPL / 1 */
62a47a12beSStefan Roese 		[ 5] = 2,	/* CC2 PPL / 2 */
63a47a12beSStefan Roese 		[ 6] = 4,	/* CC2 PPL / 4 */
64a47a12beSStefan Roese 		[ 8] = 1,	/* CC3 PPL / 1 */
65a47a12beSStefan Roese 		[ 9] = 2,	/* CC3 PPL / 2 */
66a47a12beSStefan Roese 		[10] = 4,	/* CC3 PPL / 4 */
67a47a12beSStefan Roese 		[12] = 1,	/* CC4 PPL / 1 */
68a47a12beSStefan Roese 		[13] = 2,	/* CC4 PPL / 2 */
69a47a12beSStefan Roese 		[14] = 4,	/* CC4 PPL / 4 */
70a47a12beSStefan Roese 	};
71ce746fe0SPrabhakar Kushwaha 	uint i, freq_c_pll[CONFIG_SYS_FSL_NUM_CC_PLLS];
722d9ca2c7SYangbo Lu #if !defined(CONFIG_FM_PLAT_CLK_DIV) || !defined(CONFIG_PME_PLAT_CLK_DIV) || \
732d9ca2c7SYangbo Lu 	defined(CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK)
74ce746fe0SPrabhakar Kushwaha 	uint rcw_tmp;
75ce746fe0SPrabhakar Kushwaha #endif
76ce746fe0SPrabhakar Kushwaha 	uint ratio[CONFIG_SYS_FSL_NUM_CC_PLLS];
77a47a12beSStefan Roese 	unsigned long sysclk = CONFIG_SYS_CLK_FREQ;
78ab48ca1aSSrikanth Srinivasan 	uint mem_pll_rat;
79a47a12beSStefan Roese 
80997399faSPrabhakar Kushwaha 	sys_info->freq_systembus = sysclk;
81b135991aSPriyanka Jain #ifdef CONFIG_SYS_FSL_SINGLE_SOURCE_CLK
820c12a159Svijay rai 	uint ddr_refclk_sel;
830c12a159Svijay rai 	unsigned int porsr1_sys_clk;
840c12a159Svijay rai 	porsr1_sys_clk = in_be32(&gur->porsr1) >> FSL_DCFG_PORSR1_SYSCLK_SHIFT
850c12a159Svijay rai 						& FSL_DCFG_PORSR1_SYSCLK_MASK;
860c12a159Svijay rai 	if (porsr1_sys_clk == FSL_DCFG_PORSR1_SYSCLK_DIFF)
870c12a159Svijay rai 		sys_info->diff_sysclk = 1;
880c12a159Svijay rai 	else
890c12a159Svijay rai 		sys_info->diff_sysclk = 0;
900c12a159Svijay rai 
91b135991aSPriyanka Jain 	/*
92b135991aSPriyanka Jain 	 * DDR_REFCLK_SEL rcw bit is used to determine if DDR PLLS
93b135991aSPriyanka Jain 	 * are driven by separate DDR Refclock or single source
94b135991aSPriyanka Jain 	 * differential clock.
95b135991aSPriyanka Jain 	 */
960c12a159Svijay rai 	ddr_refclk_sel = (in_be32(&gur->rcwsr[5]) >>
97b135991aSPriyanka Jain 		      FSL_CORENET2_RCWSR5_DDR_REFCLK_SEL_SHIFT) &
98b135991aSPriyanka Jain 		      FSL_CORENET2_RCWSR5_DDR_REFCLK_SEL_MASK;
99b135991aSPriyanka Jain 	/*
1000c12a159Svijay rai 	 * For single source clocking, both ddrclock and sysclock
101b135991aSPriyanka Jain 	 * are driven by differential sysclock.
102b135991aSPriyanka Jain 	 */
1030c12a159Svijay rai 	if (ddr_refclk_sel == FSL_CORENET2_RCWSR5_DDR_REFCLK_SINGLE_CLK)
104b135991aSPriyanka Jain 		sys_info->freq_ddrbus = CONFIG_SYS_CLK_FREQ;
1050c12a159Svijay rai 	else
106b135991aSPriyanka Jain #endif
10798ffa190SYork Sun #ifdef CONFIG_DDR_CLK_FREQ
108997399faSPrabhakar Kushwaha 		sys_info->freq_ddrbus = CONFIG_DDR_CLK_FREQ;
10998ffa190SYork Sun #else
110997399faSPrabhakar Kushwaha 		sys_info->freq_ddrbus = sysclk;
11198ffa190SYork Sun #endif
112a47a12beSStefan Roese 
113997399faSPrabhakar Kushwaha 	sys_info->freq_systembus *= (in_be32(&gur->rcwsr[0]) >> 25) & 0x1f;
114f77329cfSYork Sun 	mem_pll_rat = (in_be32(&gur->rcwsr[0]) >>
115f77329cfSYork Sun 			FSL_CORENET_RCWSR0_MEM_PLL_RAT_SHIFT)
116f77329cfSYork Sun 			& FSL_CORENET_RCWSR0_MEM_PLL_RAT_MASK;
117c3678b09SYork Sun #ifdef CONFIG_SYS_FSL_ERRATUM_A007212
118c3678b09SYork Sun 	if (mem_pll_rat == 0) {
119c3678b09SYork Sun 		mem_pll_rat = (in_be32(&gur->rcwsr[0]) >>
120c3678b09SYork Sun 			FSL_CORENET_RCWSR0_MEM_PLL_RAT_RESV_SHIFT) &
121c3678b09SYork Sun 			FSL_CORENET_RCWSR0_MEM_PLL_RAT_MASK;
122c3678b09SYork Sun 	}
123c3678b09SYork Sun #endif
124e88f421eSZang Roy-R61911 	/* T4240/T4160 Rev2.0 MEM_PLL_RAT uses a value which is half of
125e88f421eSZang Roy-R61911 	 * T4240/T4160 Rev1.0. eg. It's 12 in Rev1.0, however, for Rev2.0
126e88f421eSZang Roy-R61911 	 * it uses 6.
12714109c7aSYork Sun 	 * T2080 rev 1.1 and later also use half mem_pll comparing with rev 1.0
128e88f421eSZang Roy-R61911 	 */
12926bc57daSYork Sun #if defined(CONFIG_ARCH_T4240) || defined(CONFIG_ARCH_T4160) || \
130cdb72c52SYork Sun 	defined(CONFIG_ARCH_T2080) || defined(CONFIG_ARCH_T2081)
13114109c7aSYork Sun 	svr = get_svr();
13214109c7aSYork Sun 	switch (SVR_SOC_VER(svr)) {
13314109c7aSYork Sun 	case SVR_T4240:
13414109c7aSYork Sun 	case SVR_T4160:
13514109c7aSYork Sun 	case SVR_T4120:
13614109c7aSYork Sun 	case SVR_T4080:
13714109c7aSYork Sun 		if (SVR_MAJ(svr) >= 2)
138e88f421eSZang Roy-R61911 			mem_pll_rat *= 2;
13914109c7aSYork Sun 		break;
14014109c7aSYork Sun 	case SVR_T2080:
14114109c7aSYork Sun 	case SVR_T2081:
14214109c7aSYork Sun 		if ((SVR_MAJ(svr) > 1) || (SVR_MIN(svr) >= 1))
14314109c7aSYork Sun 			mem_pll_rat *= 2;
14414109c7aSYork Sun 		break;
14514109c7aSYork Sun 	default:
14614109c7aSYork Sun 		break;
14714109c7aSYork Sun 	}
148e88f421eSZang Roy-R61911 #endif
149ab48ca1aSSrikanth Srinivasan 	if (mem_pll_rat > 2)
150997399faSPrabhakar Kushwaha 		sys_info->freq_ddrbus *= mem_pll_rat;
151ab48ca1aSSrikanth Srinivasan 	else
152997399faSPrabhakar Kushwaha 		sys_info->freq_ddrbus = sys_info->freq_systembus * mem_pll_rat;
153a47a12beSStefan Roese 
154ce746fe0SPrabhakar Kushwaha 	for (i = 0; i < CONFIG_SYS_FSL_NUM_CC_PLLS; i++) {
155ce746fe0SPrabhakar Kushwaha 		ratio[i] = (in_be32(&clk->pllcgsr[i].pllcngsr) >> 1) & 0x3f;
156ab48ca1aSSrikanth Srinivasan 		if (ratio[i] > 4)
157ce746fe0SPrabhakar Kushwaha 			freq_c_pll[i] = sysclk * ratio[i];
158ab48ca1aSSrikanth Srinivasan 		else
159ce746fe0SPrabhakar Kushwaha 			freq_c_pll[i] = sys_info->freq_systembus * ratio[i];
160ab48ca1aSSrikanth Srinivasan 	}
161b8bf0adcSShaveta Leekha 
1629a653a98SYork Sun #ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
1639a653a98SYork Sun 	/*
164ce746fe0SPrabhakar Kushwaha 	 * As per CHASSIS2 architeture total 12 clusters are posible and
1659a653a98SYork Sun 	 * Each cluster has up to 4 cores, sharing the same PLL selection.
166ce746fe0SPrabhakar Kushwaha 	 * The cluster clock assignment is SoC defined.
167ce746fe0SPrabhakar Kushwaha 	 *
168ce746fe0SPrabhakar Kushwaha 	 * Total 4 clock groups are possible with 3 PLLs each.
169ce746fe0SPrabhakar Kushwaha 	 * as per array indices, clock group A has 0, 1, 2 numbered PLLs &
170ce746fe0SPrabhakar Kushwaha 	 * clock group B has 3, 4, 6 and so on.
171ce746fe0SPrabhakar Kushwaha 	 *
172ce746fe0SPrabhakar Kushwaha 	 * Clock group A having PLL1, PLL2, PLL3, feeding cores of any cluster
173ce746fe0SPrabhakar Kushwaha 	 * depends upon the SoC architeture. Same applies to other
174ce746fe0SPrabhakar Kushwaha 	 * clock groups and clusters.
175ce746fe0SPrabhakar Kushwaha 	 *
1769a653a98SYork Sun 	 */
1779a653a98SYork Sun 	for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
178f6981439SYork Sun 		int cluster = fsl_qoriq_core_to_cluster(cpu);
179f6981439SYork Sun 		u32 c_pll_sel = (in_be32(&clk->clkcsr[cluster].clkcncsr) >> 27)
1809a653a98SYork Sun 				& 0xf;
1819a653a98SYork Sun 		u32 cplx_pll = core_cplx_PLL[c_pll_sel];
182ce746fe0SPrabhakar Kushwaha 		cplx_pll += cc_group[cluster] - 1;
183997399faSPrabhakar Kushwaha 		sys_info->freq_processor[cpu] =
184ce746fe0SPrabhakar Kushwaha 			 freq_c_pll[cplx_pll] / core_cplx_pll_div[c_pll_sel];
1859a653a98SYork Sun 	}
186b8bf0adcSShaveta Leekha 
187b8bf0adcSShaveta Leekha #ifdef CONFIG_HETROGENOUS_CLUSTERS
188b8bf0adcSShaveta Leekha 	for_each_cpu(i, dsp_cpu, cpu_num_dspcores(), cpu_dsp_mask()) {
189b8bf0adcSShaveta Leekha 		int dsp_cluster = fsl_qoriq_dsp_core_to_cluster(dsp_cpu);
190b8bf0adcSShaveta Leekha 		u32 c_pll_sel = (in_be32
191b8bf0adcSShaveta Leekha 				(&clk->clkcsr[dsp_cluster].clkcncsr) >> 27)
192b8bf0adcSShaveta Leekha 				& 0xf;
193b8bf0adcSShaveta Leekha 		u32 cplx_pll = core_cplx_PLL[c_pll_sel];
194b8bf0adcSShaveta Leekha 		cplx_pll += cc_group[dsp_cluster] - 1;
195b8bf0adcSShaveta Leekha 		sys_info->freq_processor_dsp[dsp_cpu] =
196b8bf0adcSShaveta Leekha 			 freq_c_pll[cplx_pll] / core_cplx_pll_div[c_pll_sel];
197b8bf0adcSShaveta Leekha 	}
198b8bf0adcSShaveta Leekha #endif
199b8bf0adcSShaveta Leekha 
200b41f192bSYork Sun #if defined(CONFIG_ARCH_B4860) || defined(CONFIG_ARCH_B4420) || \
2010f3d80e9SYork Sun 	defined(CONFIG_ARCH_T2080) || defined(CONFIG_ARCH_T2081)
2020cb3325cSSandeep Singh #define FM1_CLK_SEL	0xe0000000
2030cb3325cSSandeep Singh #define FM1_CLK_SHIFT	29
204e5d5f5a8SYork Sun #elif defined(CONFIG_ARCH_T1024) || defined(CONFIG_ARCH_T1023)
205f6050790SShengzhou Liu #define FM1_CLK_SEL	0x00000007
206f6050790SShengzhou Liu #define FM1_CLK_SHIFT	0
2070cb3325cSSandeep Singh #else
2089a653a98SYork Sun #define PME_CLK_SEL	0xe0000000
2099a653a98SYork Sun #define PME_CLK_SHIFT	29
2109a653a98SYork Sun #define FM1_CLK_SEL	0x1c000000
2119a653a98SYork Sun #define FM1_CLK_SHIFT	26
2120cb3325cSSandeep Singh #endif
213ce746fe0SPrabhakar Kushwaha #if !defined(CONFIG_FM_PLAT_CLK_DIV) || !defined(CONFIG_PME_PLAT_CLK_DIV)
214e5d5f5a8SYork Sun #if defined(CONFIG_ARCH_T1024) || defined(CONFIG_ARCH_T1023)
215f6050790SShengzhou Liu 	rcw_tmp = in_be32(&gur->rcwsr[15]) - 4;
216f6050790SShengzhou Liu #else
2179a653a98SYork Sun 	rcw_tmp = in_be32(&gur->rcwsr[7]);
218ce746fe0SPrabhakar Kushwaha #endif
219f6050790SShengzhou Liu #endif
2209a653a98SYork Sun 
2219a653a98SYork Sun #ifdef CONFIG_SYS_DPAA_PME
222ce746fe0SPrabhakar Kushwaha #ifndef CONFIG_PME_PLAT_CLK_DIV
2239a653a98SYork Sun 	switch ((rcw_tmp & PME_CLK_SEL) >> PME_CLK_SHIFT) {
2249a653a98SYork Sun 	case 1:
225ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK];
2269a653a98SYork Sun 		break;
2279a653a98SYork Sun 	case 2:
228ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK] / 2;
2299a653a98SYork Sun 		break;
2309a653a98SYork Sun 	case 3:
231ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK] / 3;
2329a653a98SYork Sun 		break;
2339a653a98SYork Sun 	case 4:
234ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK] / 4;
2359a653a98SYork Sun 		break;
2369a653a98SYork Sun 	case 6:
237ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK + 1] / 2;
2389a653a98SYork Sun 		break;
2399a653a98SYork Sun 	case 7:
240ce746fe0SPrabhakar Kushwaha 		sys_info->freq_pme = freq_c_pll[CONFIG_SYS_PME_CLK + 1] / 3;
2419a653a98SYork Sun 		break;
2429a653a98SYork Sun 	default:
2439a653a98SYork Sun 		printf("Error: Unknown PME clock select!\n");
2449a653a98SYork Sun 	case 0:
245997399faSPrabhakar Kushwaha 		sys_info->freq_pme = sys_info->freq_systembus / 2;
2469a653a98SYork Sun 		break;
2479a653a98SYork Sun 
2489a653a98SYork Sun 	}
249ce746fe0SPrabhakar Kushwaha #else
250ce746fe0SPrabhakar Kushwaha 	sys_info->freq_pme = sys_info->freq_systembus / CONFIG_SYS_PME_CLK;
251ce746fe0SPrabhakar Kushwaha 
252ce746fe0SPrabhakar Kushwaha #endif
2539a653a98SYork Sun #endif
2549a653a98SYork Sun 
255990e1a8cSHaiying Wang #ifdef CONFIG_SYS_DPAA_QBMAN
256f6050790SShengzhou Liu #ifndef CONFIG_QBMAN_CLK_DIV
257f6050790SShengzhou Liu #define CONFIG_QBMAN_CLK_DIV	2
258f6050790SShengzhou Liu #endif
259f6050790SShengzhou Liu 	sys_info->freq_qman = sys_info->freq_systembus / CONFIG_QBMAN_CLK_DIV;
260990e1a8cSHaiying Wang #endif
261990e1a8cSHaiying Wang 
262b8bf0adcSShaveta Leekha #if defined(CONFIG_SYS_MAPLE)
263b8bf0adcSShaveta Leekha #define CPRI_CLK_SEL		0x1C000000
264b8bf0adcSShaveta Leekha #define CPRI_CLK_SHIFT		26
265b8bf0adcSShaveta Leekha #define CPRI_ALT_CLK_SEL	0x00007000
266b8bf0adcSShaveta Leekha #define CPRI_ALT_CLK_SHIFT	12
267b8bf0adcSShaveta Leekha 
268b8bf0adcSShaveta Leekha 	rcw_tmp1 = in_be32(&gur->rcwsr[7]);	/* Reading RCW bits: 224-255*/
269b8bf0adcSShaveta Leekha 	rcw_tmp2 = in_be32(&gur->rcwsr[15]);	/* Reading RCW bits: 480-511*/
270b8bf0adcSShaveta Leekha 	/* For MAPLE and CPRI frequency */
271b8bf0adcSShaveta Leekha 	switch ((rcw_tmp1 & CPRI_CLK_SEL) >> CPRI_CLK_SHIFT) {
272b8bf0adcSShaveta Leekha 	case 1:
273b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK];
274b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK];
275b8bf0adcSShaveta Leekha 		break;
276b8bf0adcSShaveta Leekha 	case 2:
277b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 2;
278b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 2;
279b8bf0adcSShaveta Leekha 		break;
280b8bf0adcSShaveta Leekha 	case 3:
281b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 3;
282b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 3;
283b8bf0adcSShaveta Leekha 		break;
284b8bf0adcSShaveta Leekha 	case 4:
285b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 4;
286b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK] / 4;
287b8bf0adcSShaveta Leekha 		break;
288b8bf0adcSShaveta Leekha 	case 5:
289b8bf0adcSShaveta Leekha 		if (((rcw_tmp2 & CPRI_ALT_CLK_SEL)
290b8bf0adcSShaveta Leekha 					>> CPRI_ALT_CLK_SHIFT) == 6) {
291b8bf0adcSShaveta Leekha 			sys_info->freq_maple =
292b8bf0adcSShaveta Leekha 				freq_c_pll[CONFIG_SYS_CPRI_CLK - 2] / 2;
293b8bf0adcSShaveta Leekha 			sys_info->freq_cpri =
294b8bf0adcSShaveta Leekha 				freq_c_pll[CONFIG_SYS_CPRI_CLK - 2] / 2;
295b8bf0adcSShaveta Leekha 		}
296b8bf0adcSShaveta Leekha 		if (((rcw_tmp2 & CPRI_ALT_CLK_SEL)
297b8bf0adcSShaveta Leekha 					>> CPRI_ALT_CLK_SHIFT) == 7) {
298b8bf0adcSShaveta Leekha 			sys_info->freq_maple =
299b8bf0adcSShaveta Leekha 				freq_c_pll[CONFIG_SYS_CPRI_CLK - 2] / 3;
300b8bf0adcSShaveta Leekha 			sys_info->freq_cpri =
301b8bf0adcSShaveta Leekha 				freq_c_pll[CONFIG_SYS_CPRI_CLK - 2] / 3;
302b8bf0adcSShaveta Leekha 		}
303b8bf0adcSShaveta Leekha 		break;
304b8bf0adcSShaveta Leekha 	case 6:
305b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK + 1] / 2;
306b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK + 1] / 2;
307b8bf0adcSShaveta Leekha 		break;
308b8bf0adcSShaveta Leekha 	case 7:
309b8bf0adcSShaveta Leekha 		sys_info->freq_maple = freq_c_pll[CONFIG_SYS_CPRI_CLK + 1] / 3;
310b8bf0adcSShaveta Leekha 		sys_info->freq_cpri = freq_c_pll[CONFIG_SYS_CPRI_CLK + 1] / 3;
311b8bf0adcSShaveta Leekha 		break;
312b8bf0adcSShaveta Leekha 	default:
313b8bf0adcSShaveta Leekha 		printf("Error: Unknown MAPLE/CPRI clock select!\n");
314b8bf0adcSShaveta Leekha 	}
315b8bf0adcSShaveta Leekha 
316b8bf0adcSShaveta Leekha 	/* For MAPLE ULB and eTVPE frequencies */
317b8bf0adcSShaveta Leekha #define ULB_CLK_SEL		0x00000038
318b8bf0adcSShaveta Leekha #define ULB_CLK_SHIFT		3
319b8bf0adcSShaveta Leekha #define ETVPE_CLK_SEL		0x00000007
320b8bf0adcSShaveta Leekha #define ETVPE_CLK_SHIFT		0
321b8bf0adcSShaveta Leekha 
322b8bf0adcSShaveta Leekha 	switch ((rcw_tmp2 & ULB_CLK_SEL) >> ULB_CLK_SHIFT) {
323b8bf0adcSShaveta Leekha 	case 1:
324b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb = freq_c_pll[CONFIG_SYS_ULB_CLK];
325b8bf0adcSShaveta Leekha 		break;
326b8bf0adcSShaveta Leekha 	case 2:
327b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb = freq_c_pll[CONFIG_SYS_ULB_CLK] / 2;
328b8bf0adcSShaveta Leekha 		break;
329b8bf0adcSShaveta Leekha 	case 3:
330b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb = freq_c_pll[CONFIG_SYS_ULB_CLK] / 3;
331b8bf0adcSShaveta Leekha 		break;
332b8bf0adcSShaveta Leekha 	case 4:
333b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb = freq_c_pll[CONFIG_SYS_ULB_CLK] / 4;
334b8bf0adcSShaveta Leekha 		break;
335b8bf0adcSShaveta Leekha 	case 5:
336b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb = sys_info->freq_systembus;
337b8bf0adcSShaveta Leekha 		break;
338b8bf0adcSShaveta Leekha 	case 6:
339b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb =
340b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ULB_CLK - 1] / 2;
341b8bf0adcSShaveta Leekha 		break;
342b8bf0adcSShaveta Leekha 	case 7:
343b8bf0adcSShaveta Leekha 		sys_info->freq_maple_ulb =
344b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ULB_CLK - 1] / 3;
345b8bf0adcSShaveta Leekha 		break;
346b8bf0adcSShaveta Leekha 	default:
347b8bf0adcSShaveta Leekha 		printf("Error: Unknown MAPLE ULB clock select!\n");
348b8bf0adcSShaveta Leekha 	}
349b8bf0adcSShaveta Leekha 
350b8bf0adcSShaveta Leekha 	switch ((rcw_tmp2 & ETVPE_CLK_SEL) >> ETVPE_CLK_SHIFT) {
351b8bf0adcSShaveta Leekha 	case 1:
352b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe = freq_c_pll[CONFIG_SYS_ETVPE_CLK];
353b8bf0adcSShaveta Leekha 		break;
354b8bf0adcSShaveta Leekha 	case 2:
355b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe =
356b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ETVPE_CLK] / 2;
357b8bf0adcSShaveta Leekha 		break;
358b8bf0adcSShaveta Leekha 	case 3:
359b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe =
360b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ETVPE_CLK] / 3;
361b8bf0adcSShaveta Leekha 		break;
362b8bf0adcSShaveta Leekha 	case 4:
363b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe =
364b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ETVPE_CLK] / 4;
365b8bf0adcSShaveta Leekha 		break;
366b8bf0adcSShaveta Leekha 	case 5:
367b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe = sys_info->freq_systembus;
368b8bf0adcSShaveta Leekha 		break;
369b8bf0adcSShaveta Leekha 	case 6:
370b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe =
371b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ETVPE_CLK - 1] / 2;
372b8bf0adcSShaveta Leekha 		break;
373b8bf0adcSShaveta Leekha 	case 7:
374b8bf0adcSShaveta Leekha 		sys_info->freq_maple_etvpe =
375b8bf0adcSShaveta Leekha 			freq_c_pll[CONFIG_SYS_ETVPE_CLK - 1] / 3;
376b8bf0adcSShaveta Leekha 		break;
377b8bf0adcSShaveta Leekha 	default:
378b8bf0adcSShaveta Leekha 		printf("Error: Unknown MAPLE eTVPE clock select!\n");
379b8bf0adcSShaveta Leekha 	}
380b8bf0adcSShaveta Leekha 
381b8bf0adcSShaveta Leekha #endif
382b8bf0adcSShaveta Leekha 
3839a653a98SYork Sun #ifdef CONFIG_SYS_DPAA_FMAN
384ce746fe0SPrabhakar Kushwaha #ifndef CONFIG_FM_PLAT_CLK_DIV
3859a653a98SYork Sun 	switch ((rcw_tmp & FM1_CLK_SEL) >> FM1_CLK_SHIFT) {
3869a653a98SYork Sun 	case 1:
387ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK];
3889a653a98SYork Sun 		break;
3899a653a98SYork Sun 	case 2:
390ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK] / 2;
3919a653a98SYork Sun 		break;
3929a653a98SYork Sun 	case 3:
393ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK] / 3;
3949a653a98SYork Sun 		break;
3959a653a98SYork Sun 	case 4:
396ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK] / 4;
3979a653a98SYork Sun 		break;
3980cb3325cSSandeep Singh 	case 5:
399997399faSPrabhakar Kushwaha 		sys_info->freq_fman[0] = sys_info->freq_systembus;
4000cb3325cSSandeep Singh 		break;
4019a653a98SYork Sun 	case 6:
402ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK + 1] / 2;
4039a653a98SYork Sun 		break;
4049a653a98SYork Sun 	case 7:
405ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[0] = freq_c_pll[CONFIG_SYS_FM1_CLK + 1] / 3;
4069a653a98SYork Sun 		break;
4079a653a98SYork Sun 	default:
4089a653a98SYork Sun 		printf("Error: Unknown FMan1 clock select!\n");
4099a653a98SYork Sun 	case 0:
410997399faSPrabhakar Kushwaha 		sys_info->freq_fman[0] = sys_info->freq_systembus / 2;
4119a653a98SYork Sun 		break;
4129a653a98SYork Sun 	}
4139a653a98SYork Sun #if (CONFIG_SYS_NUM_FMAN) == 2
414ce746fe0SPrabhakar Kushwaha #ifdef CONFIG_SYS_FM2_CLK
4159a653a98SYork Sun #define FM2_CLK_SEL	0x00000038
4169a653a98SYork Sun #define FM2_CLK_SHIFT	3
4179a653a98SYork Sun 	rcw_tmp = in_be32(&gur->rcwsr[15]);
4189a653a98SYork Sun 	switch ((rcw_tmp & FM2_CLK_SEL) >> FM2_CLK_SHIFT) {
4199a653a98SYork Sun 	case 1:
420ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1];
4219a653a98SYork Sun 		break;
4229a653a98SYork Sun 	case 2:
423ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1] / 2;
4249a653a98SYork Sun 		break;
4259a653a98SYork Sun 	case 3:
426ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1] / 3;
4279a653a98SYork Sun 		break;
4289a653a98SYork Sun 	case 4:
429ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1] / 4;
4309a653a98SYork Sun 		break;
431c1015c67SShaohui Xie 	case 5:
432c1015c67SShaohui Xie 		sys_info->freq_fman[1] = sys_info->freq_systembus;
433c1015c67SShaohui Xie 		break;
4349a653a98SYork Sun 	case 6:
435ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK] / 2;
4369a653a98SYork Sun 		break;
4379a653a98SYork Sun 	case 7:
438ce746fe0SPrabhakar Kushwaha 		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK] / 3;
4399a653a98SYork Sun 		break;
4409a653a98SYork Sun 	default:
4419a653a98SYork Sun 		printf("Error: Unknown FMan2 clock select!\n");
4429a653a98SYork Sun 	case 0:
443997399faSPrabhakar Kushwaha 		sys_info->freq_fman[1] = sys_info->freq_systembus / 2;
4449a653a98SYork Sun 		break;
4459a653a98SYork Sun 	}
446ce746fe0SPrabhakar Kushwaha #endif
4479a653a98SYork Sun #endif	/* CONFIG_SYS_NUM_FMAN == 2 */
448ce746fe0SPrabhakar Kushwaha #else
449ce746fe0SPrabhakar Kushwaha 	sys_info->freq_fman[0] = sys_info->freq_systembus / CONFIG_SYS_FM1_CLK;
450ce746fe0SPrabhakar Kushwaha #endif
451ce746fe0SPrabhakar Kushwaha #endif
4529a653a98SYork Sun 
4532d9ca2c7SYangbo Lu #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
4540f3d80e9SYork Sun #if defined(CONFIG_ARCH_T2080)
4552d9ca2c7SYangbo Lu #define ESDHC_CLK_SEL	0x00000007
4562d9ca2c7SYangbo Lu #define ESDHC_CLK_SHIFT	0
4572d9ca2c7SYangbo Lu #define ESDHC_CLK_RCWSR	15
4582d9ca2c7SYangbo Lu #else	/* Support T1040 T1024 by now */
4592d9ca2c7SYangbo Lu #define ESDHC_CLK_SEL	0xe0000000
4602d9ca2c7SYangbo Lu #define ESDHC_CLK_SHIFT	29
4612d9ca2c7SYangbo Lu #define ESDHC_CLK_RCWSR	7
4622d9ca2c7SYangbo Lu #endif
4632d9ca2c7SYangbo Lu 	rcw_tmp = in_be32(&gur->rcwsr[ESDHC_CLK_RCWSR]);
4642d9ca2c7SYangbo Lu 	switch ((rcw_tmp & ESDHC_CLK_SEL) >> ESDHC_CLK_SHIFT) {
4652d9ca2c7SYangbo Lu 	case 1:
4662d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK];
4672d9ca2c7SYangbo Lu 		break;
4682d9ca2c7SYangbo Lu 	case 2:
4692d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK] / 2;
4702d9ca2c7SYangbo Lu 		break;
4712d9ca2c7SYangbo Lu 	case 3:
4722d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK] / 3;
4732d9ca2c7SYangbo Lu 		break;
4742d9ca2c7SYangbo Lu #if defined(CONFIG_SYS_SDHC_CLK_2_PLL)
4752d9ca2c7SYangbo Lu 	case 4:
4762d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[CONFIG_SYS_SDHC_CLK] / 4;
4772d9ca2c7SYangbo Lu 		break;
4780f3d80e9SYork Sun #if defined(CONFIG_ARCH_T2080)
4792d9ca2c7SYangbo Lu 	case 5:
4802d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[1 - CONFIG_SYS_SDHC_CLK];
4812d9ca2c7SYangbo Lu 		break;
4822d9ca2c7SYangbo Lu #endif
4832d9ca2c7SYangbo Lu 	case 6:
4842d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[1 - CONFIG_SYS_SDHC_CLK] / 2;
4852d9ca2c7SYangbo Lu 		break;
4862d9ca2c7SYangbo Lu 	case 7:
4872d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = freq_c_pll[1 - CONFIG_SYS_SDHC_CLK] / 3;
4882d9ca2c7SYangbo Lu 		break;
4892d9ca2c7SYangbo Lu #endif
4902d9ca2c7SYangbo Lu 	default:
4912d9ca2c7SYangbo Lu 		sys_info->freq_sdhc = 0;
4922d9ca2c7SYangbo Lu 		printf("Error: Unknown SDHC peripheral clock select!\n");
4932d9ca2c7SYangbo Lu 	}
4942d9ca2c7SYangbo Lu #endif
4959a653a98SYork Sun #else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
4969a653a98SYork Sun 
497fbb9ecf7STimur Tabi 	for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
498f6981439SYork Sun 		u32 c_pll_sel = (in_be32(&clk->clkcsr[cpu].clkcncsr) >> 27)
499f6981439SYork Sun 				& 0xf;
500a47a12beSStefan Roese 		u32 cplx_pll = core_cplx_PLL[c_pll_sel];
501a47a12beSStefan Roese 
502997399faSPrabhakar Kushwaha 		sys_info->freq_processor[cpu] =
503ce746fe0SPrabhakar Kushwaha 			 freq_c_pll[cplx_pll] / core_cplx_pll_div[c_pll_sel];
504a47a12beSStefan Roese 	}
505a47a12beSStefan Roese #define PME_CLK_SEL	0x80000000
506a47a12beSStefan Roese #define FM1_CLK_SEL	0x40000000
507a47a12beSStefan Roese #define FM2_CLK_SEL	0x20000000
508b5c8753fSKumar Gala #define HWA_ASYNC_DIV	0x04000000
509b5c8753fSKumar Gala #if (CONFIG_SYS_FSL_NUM_CC_PLLS == 2)
510b5c8753fSKumar Gala #define HWA_CC_PLL	1
5114905443fSTimur Tabi #elif (CONFIG_SYS_FSL_NUM_CC_PLLS == 3)
5124905443fSTimur Tabi #define HWA_CC_PLL	2
513b5c8753fSKumar Gala #elif (CONFIG_SYS_FSL_NUM_CC_PLLS == 4)
514b5c8753fSKumar Gala #define HWA_CC_PLL	2
515b5c8753fSKumar Gala #else
516b5c8753fSKumar Gala #error CONFIG_SYS_FSL_NUM_CC_PLLS not set or unknown case
517b5c8753fSKumar Gala #endif
518a47a12beSStefan Roese 	rcw_tmp = in_be32(&gur->rcwsr[7]);
519a47a12beSStefan Roese 
520a47a12beSStefan Roese #ifdef CONFIG_SYS_DPAA_PME
521b5c8753fSKumar Gala 	if (rcw_tmp & PME_CLK_SEL) {
522b5c8753fSKumar Gala 		if (rcw_tmp & HWA_ASYNC_DIV)
523ce746fe0SPrabhakar Kushwaha 			sys_info->freq_pme = freq_c_pll[HWA_CC_PLL] / 4;
524a47a12beSStefan Roese 		else
525ce746fe0SPrabhakar Kushwaha 			sys_info->freq_pme = freq_c_pll[HWA_CC_PLL] / 2;
526b5c8753fSKumar Gala 	} else {
527997399faSPrabhakar Kushwaha 		sys_info->freq_pme = sys_info->freq_systembus / 2;
528b5c8753fSKumar Gala 	}
529a47a12beSStefan Roese #endif
530a47a12beSStefan Roese 
531a47a12beSStefan Roese #ifdef CONFIG_SYS_DPAA_FMAN
532b5c8753fSKumar Gala 	if (rcw_tmp & FM1_CLK_SEL) {
533b5c8753fSKumar Gala 		if (rcw_tmp & HWA_ASYNC_DIV)
534ce746fe0SPrabhakar Kushwaha 			sys_info->freq_fman[0] = freq_c_pll[HWA_CC_PLL] / 4;
535a47a12beSStefan Roese 		else
536ce746fe0SPrabhakar Kushwaha 			sys_info->freq_fman[0] = freq_c_pll[HWA_CC_PLL] / 2;
537b5c8753fSKumar Gala 	} else {
538997399faSPrabhakar Kushwaha 		sys_info->freq_fman[0] = sys_info->freq_systembus / 2;
539b5c8753fSKumar Gala 	}
540a47a12beSStefan Roese #if (CONFIG_SYS_NUM_FMAN) == 2
541b5c8753fSKumar Gala 	if (rcw_tmp & FM2_CLK_SEL) {
542b5c8753fSKumar Gala 		if (rcw_tmp & HWA_ASYNC_DIV)
543ce746fe0SPrabhakar Kushwaha 			sys_info->freq_fman[1] = freq_c_pll[HWA_CC_PLL] / 4;
544a47a12beSStefan Roese 		else
545ce746fe0SPrabhakar Kushwaha 			sys_info->freq_fman[1] = freq_c_pll[HWA_CC_PLL] / 2;
546b5c8753fSKumar Gala 	} else {
547997399faSPrabhakar Kushwaha 		sys_info->freq_fman[1] = sys_info->freq_systembus / 2;
548b5c8753fSKumar Gala 	}
549a47a12beSStefan Roese #endif
550a47a12beSStefan Roese #endif
551a47a12beSStefan Roese 
5523e83fc9bSShaohui Xie #ifdef CONFIG_SYS_DPAA_QBMAN
553997399faSPrabhakar Kushwaha 	sys_info->freq_qman = sys_info->freq_systembus / 2;
5543e83fc9bSShaohui Xie #endif
5553e83fc9bSShaohui Xie 
5569a653a98SYork Sun #endif /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
5579a653a98SYork Sun 
5582a44efebSZhao Qiang #ifdef CONFIG_U_QE
5592a44efebSZhao Qiang 	sys_info->freq_qe =  sys_info->freq_systembus / 2;
5602a44efebSZhao Qiang #endif
5612a44efebSZhao Qiang 
5629a653a98SYork Sun #else /* CONFIG_FSL_CORENET */
563997399faSPrabhakar Kushwaha 	uint plat_ratio, e500_ratio, half_freq_systembus;
564a47a12beSStefan Roese 	int i;
565a47a12beSStefan Roese #ifdef CONFIG_QE
566a52d2f81SHaiying Wang 	__maybe_unused u32 qe_ratio;
567a47a12beSStefan Roese #endif
568a47a12beSStefan Roese 
569a47a12beSStefan Roese 	plat_ratio = (gur->porpllsr) & 0x0000003e;
570a47a12beSStefan Roese 	plat_ratio >>= 1;
571997399faSPrabhakar Kushwaha 	sys_info->freq_systembus = plat_ratio * CONFIG_SYS_CLK_FREQ;
572a47a12beSStefan Roese 
573a47a12beSStefan Roese 	/* Divide before multiply to avoid integer
574a47a12beSStefan Roese 	 * overflow for processor speeds above 2GHz */
575997399faSPrabhakar Kushwaha 	half_freq_systembus = sys_info->freq_systembus/2;
576a47a12beSStefan Roese 	for (i = 0; i < cpu_numcores(); i++) {
577a47a12beSStefan Roese 		e500_ratio = ((gur->porpllsr) >> (i * 8 + 16)) & 0x3f;
578997399faSPrabhakar Kushwaha 		sys_info->freq_processor[i] = e500_ratio * half_freq_systembus;
579a47a12beSStefan Roese 	}
580a47a12beSStefan Roese 
581997399faSPrabhakar Kushwaha 	/* Note: freq_ddrbus is the MCLK frequency, not the data rate. */
582997399faSPrabhakar Kushwaha 	sys_info->freq_ddrbus = sys_info->freq_systembus;
583a47a12beSStefan Roese 
584a47a12beSStefan Roese #ifdef CONFIG_DDR_CLK_FREQ
585a47a12beSStefan Roese 	{
586a47a12beSStefan Roese 		u32 ddr_ratio = ((gur->porpllsr) & MPC85xx_PORPLLSR_DDR_RATIO)
587a47a12beSStefan Roese 			>> MPC85xx_PORPLLSR_DDR_RATIO_SHIFT;
588a47a12beSStefan Roese 		if (ddr_ratio != 0x7)
589997399faSPrabhakar Kushwaha 			sys_info->freq_ddrbus = ddr_ratio * CONFIG_DDR_CLK_FREQ;
590a47a12beSStefan Roese 	}
591a47a12beSStefan Roese #endif
592a47a12beSStefan Roese 
593a47a12beSStefan Roese #ifdef CONFIG_QE
5944167a67dSYork Sun #if defined(CONFIG_ARCH_P1021) || defined(CONFIG_ARCH_P1025)
595997399faSPrabhakar Kushwaha 	sys_info->freq_qe =  sys_info->freq_systembus;
596a52d2f81SHaiying Wang #else
597a47a12beSStefan Roese 	qe_ratio = ((gur->porpllsr) & MPC85xx_PORPLLSR_QE_RATIO)
598a47a12beSStefan Roese 			>> MPC85xx_PORPLLSR_QE_RATIO_SHIFT;
599997399faSPrabhakar Kushwaha 	sys_info->freq_qe = qe_ratio * CONFIG_SYS_CLK_FREQ;
600a47a12beSStefan Roese #endif
601a52d2f81SHaiying Wang #endif
602a47a12beSStefan Roese 
60324995d82SHaiying Wang #ifdef CONFIG_SYS_DPAA_FMAN
604997399faSPrabhakar Kushwaha 		sys_info->freq_fman[0] = sys_info->freq_systembus;
60524995d82SHaiying Wang #endif
60624995d82SHaiying Wang 
60724995d82SHaiying Wang #endif /* CONFIG_FSL_CORENET */
60824995d82SHaiying Wang 
609beba93edSDipen Dudhat #if defined(CONFIG_FSL_LBC)
610*add63f94SPrabhakar Kushwaha 	sys_info->freq_localbus = sys_info->freq_systembus /
611*add63f94SPrabhakar Kushwaha 						CONFIG_SYS_FSL_LBC_CLK_DIV;
612beba93edSDipen Dudhat #endif
613800c73c4SKumar Gala 
614800c73c4SKumar Gala #if defined(CONFIG_FSL_IFC)
6151c40707eSPrabhakar Kushwaha 	sys_info->freq_localbus = sys_info->freq_systembus /
6161c40707eSPrabhakar Kushwaha 						CONFIG_SYS_FSL_IFC_CLK_DIV;
617800c73c4SKumar Gala #endif
618a47a12beSStefan Roese }
619a47a12beSStefan Roese 
620a47a12beSStefan Roese 
get_clocks(void)621a47a12beSStefan Roese int get_clocks (void)
622a47a12beSStefan Roese {
623a47a12beSStefan Roese 	sys_info_t sys_info;
62425cb74b3SYork Sun #ifdef CONFIG_ARCH_MPC8544
625a47a12beSStefan Roese 	volatile ccsr_gur_t *gur = (void *) CONFIG_SYS_MPC85xx_GUTS_ADDR;
626a47a12beSStefan Roese #endif
627a47a12beSStefan Roese #if defined(CONFIG_CPM2)
628a47a12beSStefan Roese 	volatile ccsr_cpm_t *cpm = (ccsr_cpm_t *)CONFIG_SYS_MPC85xx_CPM_ADDR;
629a47a12beSStefan Roese 	uint sccr, dfbrg;
630a47a12beSStefan Roese 
631a47a12beSStefan Roese 	/* set VCO = 4 * BRG */
632a47a12beSStefan Roese 	cpm->im_cpm_intctl.sccr &= 0xfffffffc;
633a47a12beSStefan Roese 	sccr = cpm->im_cpm_intctl.sccr;
634a47a12beSStefan Roese 	dfbrg = (sccr & SCCR_DFBRG_MSK) >> SCCR_DFBRG_SHIFT;
635a47a12beSStefan Roese #endif
636a47a12beSStefan Roese 	get_sys_info (&sys_info);
637997399faSPrabhakar Kushwaha 	gd->cpu_clk = sys_info.freq_processor[0];
638997399faSPrabhakar Kushwaha 	gd->bus_clk = sys_info.freq_systembus;
639997399faSPrabhakar Kushwaha 	gd->mem_clk = sys_info.freq_ddrbus;
640997399faSPrabhakar Kushwaha 	gd->arch.lbc_clk = sys_info.freq_localbus;
641a47a12beSStefan Roese 
642a47a12beSStefan Roese #ifdef CONFIG_QE
643997399faSPrabhakar Kushwaha 	gd->arch.qe_clk = sys_info.freq_qe;
64445bae2e3SSimon Glass 	gd->arch.brg_clk = gd->arch.qe_clk / 2;
645a47a12beSStefan Roese #endif
646a47a12beSStefan Roese 	/*
647a47a12beSStefan Roese 	 * The base clock for I2C depends on the actual SOC.  Unfortunately,
648a47a12beSStefan Roese 	 * there is no pattern that can be used to determine the frequency, so
649a47a12beSStefan Roese 	 * the only choice is to look up the actual SOC number and use the value
650a47a12beSStefan Roese 	 * for that SOC. This information is taken from application note
651a47a12beSStefan Roese 	 * AN2919.
652a47a12beSStefan Roese 	 */
6533aff3082SYork Sun #if defined(CONFIG_ARCH_MPC8540) || defined(CONFIG_ARCH_MPC8541) || \
65499d0a312SYork Sun 	defined(CONFIG_ARCH_MPC8560) || defined(CONFIG_ARCH_MPC8555) || \
655feb9e25bSYork Sun 	defined(CONFIG_ARCH_P1022)
656997399faSPrabhakar Kushwaha 	gd->arch.i2c1_clk = sys_info.freq_systembus;
65725cb74b3SYork Sun #elif defined(CONFIG_ARCH_MPC8544)
658a47a12beSStefan Roese 	/*
659a47a12beSStefan Roese 	 * On the 8544, the I2C clock is the same as the SEC clock.  This can be
660a47a12beSStefan Roese 	 * either CCB/2 or CCB/3, depending on the value of cfg_sec_freq. See
661a47a12beSStefan Roese 	 * 4.4.3.3 of the 8544 RM.  Note that this might actually work for all
662a47a12beSStefan Roese 	 * 85xx, but only the 8544 has cfg_sec_freq, so it's unknown if the
663a47a12beSStefan Roese 	 * PORDEVSR2_SEC_CFG bit is 0 on all 85xx boards that are not an 8544.
664a47a12beSStefan Roese 	 */
665a47a12beSStefan Roese 	if (gur->pordevsr2 & MPC85xx_PORDEVSR2_SEC_CFG)
666997399faSPrabhakar Kushwaha 		gd->arch.i2c1_clk = sys_info.freq_systembus / 3;
667a47a12beSStefan Roese 	else
668997399faSPrabhakar Kushwaha 		gd->arch.i2c1_clk = sys_info.freq_systembus / 2;
669a47a12beSStefan Roese #else
670a47a12beSStefan Roese 	/* Most 85xx SOCs use CCB/2, so this is the default behavior. */
671997399faSPrabhakar Kushwaha 	gd->arch.i2c1_clk = sys_info.freq_systembus / 2;
672a47a12beSStefan Roese #endif
673609e6ec3SSimon Glass 	gd->arch.i2c2_clk = gd->arch.i2c1_clk;
674a47a12beSStefan Roese 
675a47a12beSStefan Roese #if defined(CONFIG_FSL_ESDHC)
6762d9ca2c7SYangbo Lu #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
6772d9ca2c7SYangbo Lu 	gd->arch.sdhc_clk = sys_info.freq_sdhc / 2;
6782d9ca2c7SYangbo Lu #else
67946d9fc0bSYork Sun #if defined(CONFIG_ARCH_MPC8569) || defined(CONFIG_ARCH_P1010)
680e9adeca3SSimon Glass 	gd->arch.sdhc_clk = gd->bus_clk;
681a47a12beSStefan Roese #else
682e9adeca3SSimon Glass 	gd->arch.sdhc_clk = gd->bus_clk / 2;
683a47a12beSStefan Roese #endif
6842d9ca2c7SYangbo Lu #endif
685a47a12beSStefan Roese #endif /* defined(CONFIG_FSL_ESDHC) */
686a47a12beSStefan Roese 
687a47a12beSStefan Roese #if defined(CONFIG_CPM2)
688997399faSPrabhakar Kushwaha 	gd->arch.vco_out = 2*sys_info.freq_systembus;
689748cd059SSimon Glass 	gd->arch.cpm_clk = gd->arch.vco_out / 2;
690748cd059SSimon Glass 	gd->arch.scc_clk = gd->arch.vco_out / 4;
691748cd059SSimon Glass 	gd->arch.brg_clk = gd->arch.vco_out / (1 << (2 * (dfbrg + 1)));
692a47a12beSStefan Roese #endif
693a47a12beSStefan Roese 
694a47a12beSStefan Roese 	if(gd->cpu_clk != 0) return (0);
695a47a12beSStefan Roese 	else return (1);
696a47a12beSStefan Roese }
697a47a12beSStefan Roese 
698a47a12beSStefan Roese 
699a47a12beSStefan Roese /********************************************
700a47a12beSStefan Roese  * get_bus_freq
701a47a12beSStefan Roese  * return system bus freq in Hz
702a47a12beSStefan Roese  *********************************************/
get_bus_freq(ulong dummy)703a47a12beSStefan Roese ulong get_bus_freq (ulong dummy)
704a47a12beSStefan Roese {
705a47a12beSStefan Roese 	return gd->bus_clk;
706a47a12beSStefan Roese }
707a47a12beSStefan Roese 
708a47a12beSStefan Roese /********************************************
709a47a12beSStefan Roese  * get_ddr_freq
710a47a12beSStefan Roese  * return ddr bus freq in Hz
711a47a12beSStefan Roese  *********************************************/
get_ddr_freq(ulong dummy)712a47a12beSStefan Roese ulong get_ddr_freq (ulong dummy)
713a47a12beSStefan Roese {
714a47a12beSStefan Roese 	return gd->mem_clk;
715a47a12beSStefan Roese }
716