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