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