139a72345SMasahiro Yamada /* 239a72345SMasahiro Yamada * Keystone2: pll initialization 339a72345SMasahiro Yamada * 439a72345SMasahiro Yamada * (C) Copyright 2012-2014 539a72345SMasahiro Yamada * Texas Instruments Incorporated, <www.ti.com> 639a72345SMasahiro Yamada * 739a72345SMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 839a72345SMasahiro Yamada */ 939a72345SMasahiro Yamada 1039a72345SMasahiro Yamada #include <common.h> 1139a72345SMasahiro Yamada #include <asm/arch/clock.h> 1239a72345SMasahiro Yamada #include <asm/arch/clock_defs.h> 1339a72345SMasahiro Yamada 147b50e159SLokesh Vutla /* DEV and ARM speed definitions as specified in DEVSPEED register */ 157b50e159SLokesh Vutla int __weak speeds[DEVSPEED_NUMSPDS] = { 167b50e159SLokesh Vutla SPD1000, 177b50e159SLokesh Vutla SPD1200, 187b50e159SLokesh Vutla SPD1350, 197b50e159SLokesh Vutla SPD1400, 207b50e159SLokesh Vutla SPD1500, 217b50e159SLokesh Vutla SPD1400, 227b50e159SLokesh Vutla SPD1350, 237b50e159SLokesh Vutla SPD1200, 247b50e159SLokesh Vutla SPD1000, 257b50e159SLokesh Vutla SPD800, 267b50e159SLokesh Vutla }; 2739a72345SMasahiro Yamada 2874af583eSLokesh Vutla const struct keystone_pll_regs keystone_pll_regs[] = { 2974af583eSLokesh Vutla [CORE_PLL] = {KS2_MAINPLLCTL0, KS2_MAINPLLCTL1}, 3074af583eSLokesh Vutla [PASS_PLL] = {KS2_PASSPLLCTL0, KS2_PASSPLLCTL1}, 3174af583eSLokesh Vutla [TETRIS_PLL] = {KS2_ARMPLLCTL0, KS2_ARMPLLCTL1}, 3274af583eSLokesh Vutla [DDR3A_PLL] = {KS2_DDR3APLLCTL0, KS2_DDR3APLLCTL1}, 3374af583eSLokesh Vutla [DDR3B_PLL] = {KS2_DDR3BPLLCTL0, KS2_DDR3BPLLCTL1}, 34*bda920c6SVitaly Andrianov [UART_PLL] = {KS2_UARTPLLCTL0, KS2_UARTPLLCTL1}, 3574af583eSLokesh Vutla }; 3674af583eSLokesh Vutla 378626cb80SLokesh Vutla inline void pll_pa_clk_sel(void) 388626cb80SLokesh Vutla { 398626cb80SLokesh Vutla setbits_le32(keystone_pll_regs[PASS_PLL].reg1, CFG_PLLCTL1_PAPLL_MASK); 408626cb80SLokesh Vutla } 418626cb80SLokesh Vutla 4239a72345SMasahiro Yamada static void wait_for_completion(const struct pll_init_data *data) 4339a72345SMasahiro Yamada { 4439a72345SMasahiro Yamada int i; 4539a72345SMasahiro Yamada for (i = 0; i < 100; i++) { 4639a72345SMasahiro Yamada sdelay(450); 47c321a236SLokesh Vutla if (!(pllctl_reg_read(data->pll, stat) & PLLSTAT_GOSTAT_MASK)) 4839a72345SMasahiro Yamada break; 4939a72345SMasahiro Yamada } 5039a72345SMasahiro Yamada } 5139a72345SMasahiro Yamada 52c321a236SLokesh Vutla static inline void bypass_main_pll(const struct pll_init_data *data) 5339a72345SMasahiro Yamada { 54c321a236SLokesh Vutla pllctl_reg_clrbits(data->pll, ctl, PLLCTL_PLLENSRC_MASK | 55c321a236SLokesh Vutla PLLCTL_PLLEN_MASK); 56c321a236SLokesh Vutla 57c321a236SLokesh Vutla /* 4 cycles of reference clock CLKIN*/ 58c321a236SLokesh Vutla sdelay(340); 59c321a236SLokesh Vutla } 60c321a236SLokesh Vutla 61c321a236SLokesh Vutla static void configure_mult_div(const struct pll_init_data *data) 62c321a236SLokesh Vutla { 63c321a236SLokesh Vutla u32 pllm, plld, bwadj; 6439a72345SMasahiro Yamada 6539a72345SMasahiro Yamada pllm = data->pll_m - 1; 66c321a236SLokesh Vutla plld = (data->pll_d - 1) & CFG_PLLCTL0_PLLD_MASK; 6739a72345SMasahiro Yamada 68c321a236SLokesh Vutla /* Program Multiplier */ 69c321a236SLokesh Vutla if (data->pll == MAIN_PLL) 70c321a236SLokesh Vutla pllctl_reg_write(data->pll, mult, pllm & PLLM_MULT_LO_MASK); 71c321a236SLokesh Vutla 72c321a236SLokesh Vutla clrsetbits_le32(keystone_pll_regs[data->pll].reg0, 73c321a236SLokesh Vutla CFG_PLLCTL0_PLLM_MASK, 74c321a236SLokesh Vutla pllm << CFG_PLLCTL0_PLLM_SHIFT); 75c321a236SLokesh Vutla 76c321a236SLokesh Vutla /* Program BWADJ */ 77c321a236SLokesh Vutla bwadj = (data->pll_m - 1) >> 1; /* Divide pllm by 2 */ 78c321a236SLokesh Vutla clrsetbits_le32(keystone_pll_regs[data->pll].reg0, 79c321a236SLokesh Vutla CFG_PLLCTL0_BWADJ_MASK, 80c321a236SLokesh Vutla (bwadj << CFG_PLLCTL0_BWADJ_SHIFT) & 81c321a236SLokesh Vutla CFG_PLLCTL0_BWADJ_MASK); 82c321a236SLokesh Vutla bwadj = bwadj >> CFG_PLLCTL0_BWADJ_BITS; 83c321a236SLokesh Vutla clrsetbits_le32(keystone_pll_regs[data->pll].reg1, 84c321a236SLokesh Vutla CFG_PLLCTL1_BWADJ_MASK, bwadj); 85c321a236SLokesh Vutla 86c321a236SLokesh Vutla /* Program Divider */ 87c321a236SLokesh Vutla clrsetbits_le32(keystone_pll_regs[data->pll].reg0, 88c321a236SLokesh Vutla CFG_PLLCTL0_PLLD_MASK, plld); 89c321a236SLokesh Vutla } 90c321a236SLokesh Vutla 91c321a236SLokesh Vutla void configure_main_pll(const struct pll_init_data *data) 92c321a236SLokesh Vutla { 93c321a236SLokesh Vutla u32 tmp, pllod, i, alnctl_val = 0; 94c321a236SLokesh Vutla u32 *offset; 95c321a236SLokesh Vutla 96c321a236SLokesh Vutla pllod = data->pll_od - 1; 97c321a236SLokesh Vutla 98c321a236SLokesh Vutla /* 100 micro sec for stabilization */ 9939a72345SMasahiro Yamada sdelay(210000); 10039a72345SMasahiro Yamada 10139a72345SMasahiro Yamada tmp = pllctl_reg_read(data->pll, secctl); 10239a72345SMasahiro Yamada 103c321a236SLokesh Vutla /* Check for Bypass */ 104c321a236SLokesh Vutla if (tmp & SECCTL_BYPASS_MASK) { 10539a72345SMasahiro Yamada setbits_le32(keystone_pll_regs[data->pll].reg1, 106c321a236SLokesh Vutla CFG_PLLCTL1_ENSAT_MASK); 10739a72345SMasahiro Yamada 108c321a236SLokesh Vutla bypass_main_pll(data); 10939a72345SMasahiro Yamada 110c321a236SLokesh Vutla /* Powerdown and powerup Main Pll */ 111c321a236SLokesh Vutla pllctl_reg_setbits(data->pll, secctl, SECCTL_BYPASS_MASK); 112c321a236SLokesh Vutla pllctl_reg_setbits(data->pll, ctl, PLLCTL_PLLPWRDN_MASK); 113c321a236SLokesh Vutla /* 5 micro sec */ 11439a72345SMasahiro Yamada sdelay(21000); 11539a72345SMasahiro Yamada 116c321a236SLokesh Vutla pllctl_reg_clrbits(data->pll, ctl, PLLCTL_PLLPWRDN_MASK); 11739a72345SMasahiro Yamada } else { 118c321a236SLokesh Vutla bypass_main_pll(data); 11939a72345SMasahiro Yamada } 12039a72345SMasahiro Yamada 121c321a236SLokesh Vutla configure_mult_div(data); 12239a72345SMasahiro Yamada 123c321a236SLokesh Vutla /* Program Output Divider */ 124c321a236SLokesh Vutla pllctl_reg_rmw(data->pll, secctl, SECCTL_OP_DIV_MASK, 125c321a236SLokesh Vutla ((pllod << SECCTL_OP_DIV_SHIFT) & SECCTL_OP_DIV_MASK)); 12639a72345SMasahiro Yamada 127c321a236SLokesh Vutla /* Program PLLDIVn */ 12839a72345SMasahiro Yamada wait_for_completion(data); 129c321a236SLokesh Vutla for (i = 0; i < PLLDIV_MAX; i++) { 130c321a236SLokesh Vutla if (i < 3) 131c321a236SLokesh Vutla offset = pllctl_reg(data->pll, div1) + i; 132c321a236SLokesh Vutla else 133c321a236SLokesh Vutla offset = pllctl_reg(data->pll, div4) + (i - 3); 13439a72345SMasahiro Yamada 135c321a236SLokesh Vutla if (divn_val[i] != -1) { 136c321a236SLokesh Vutla __raw_writel(divn_val[i] | PLLDIV_ENABLE_MASK, offset); 137c321a236SLokesh Vutla alnctl_val |= BIT(i); 138c321a236SLokesh Vutla } 139c321a236SLokesh Vutla } 14039a72345SMasahiro Yamada 141c321a236SLokesh Vutla if (alnctl_val) { 142c321a236SLokesh Vutla pllctl_reg_setbits(data->pll, alnctl, alnctl_val); 14339a72345SMasahiro Yamada /* 14439a72345SMasahiro Yamada * Set GOSET bit in PLLCMD to initiate the GO operation 14539a72345SMasahiro Yamada * to change the divide 14639a72345SMasahiro Yamada */ 147c321a236SLokesh Vutla pllctl_reg_setbits(data->pll, cmd, PLLSTAT_GOSTAT_MASK); 14839a72345SMasahiro Yamada wait_for_completion(data); 149c321a236SLokesh Vutla } 15039a72345SMasahiro Yamada 15139a72345SMasahiro Yamada /* Reset PLL */ 152c321a236SLokesh Vutla pllctl_reg_setbits(data->pll, ctl, PLLCTL_PLLRST_MASK); 15339a72345SMasahiro Yamada sdelay(21000); /* Wait for a minimum of 7 us*/ 154c321a236SLokesh Vutla pllctl_reg_clrbits(data->pll, ctl, PLLCTL_PLLRST_MASK); 15539a72345SMasahiro Yamada sdelay(105000); /* Wait for PLL Lock time (min 50 us) */ 15639a72345SMasahiro Yamada 157c321a236SLokesh Vutla /* Enable PLL */ 158c321a236SLokesh Vutla pllctl_reg_clrbits(data->pll, secctl, SECCTL_BYPASS_MASK); 159c321a236SLokesh Vutla pllctl_reg_setbits(data->pll, ctl, PLLCTL_PLLEN_MASK); 16039a72345SMasahiro Yamada } 16139a72345SMasahiro Yamada 162c321a236SLokesh Vutla void configure_secondary_pll(const struct pll_init_data *data) 163c321a236SLokesh Vutla { 164c321a236SLokesh Vutla int pllod = data->pll_od - 1; 165c321a236SLokesh Vutla 166c321a236SLokesh Vutla /* Enable Bypass mode */ 167c321a236SLokesh Vutla setbits_le32(keystone_pll_regs[data->pll].reg1, CFG_PLLCTL1_ENSAT_MASK); 168c321a236SLokesh Vutla setbits_le32(keystone_pll_regs[data->pll].reg0, 169c321a236SLokesh Vutla CFG_PLLCTL0_BYPASS_MASK); 170c321a236SLokesh Vutla 171c321a236SLokesh Vutla /* Enable Glitch free bypass for ARM PLL */ 172c321a236SLokesh Vutla if (cpu_is_k2hk() && data->pll == TETRIS_PLL) 173c321a236SLokesh Vutla clrbits_le32(KS2_MISC_CTRL, MISC_CTL1_ARM_PLL_EN); 174c321a236SLokesh Vutla 175c321a236SLokesh Vutla configure_mult_div(data); 176c321a236SLokesh Vutla 177c321a236SLokesh Vutla /* Program Output Divider */ 178c321a236SLokesh Vutla clrsetbits_le32(keystone_pll_regs[data->pll].reg0, 179c321a236SLokesh Vutla CFG_PLLCTL0_CLKOD_MASK, 180c321a236SLokesh Vutla (pllod << CFG_PLLCTL0_CLKOD_SHIFT) & 181c321a236SLokesh Vutla CFG_PLLCTL0_CLKOD_MASK); 182c321a236SLokesh Vutla 183c321a236SLokesh Vutla /* Reset PLL */ 184c321a236SLokesh Vutla setbits_le32(keystone_pll_regs[data->pll].reg1, CFG_PLLCTL1_RST_MASK); 185c321a236SLokesh Vutla /* Wait for 5 micro seconds */ 186c321a236SLokesh Vutla sdelay(21000); 187c321a236SLokesh Vutla 188c321a236SLokesh Vutla /* Select the Output of PASS PLL as input to PASS */ 1898626cb80SLokesh Vutla if (data->pll == PASS_PLL && cpu_is_k2hk()) 1908626cb80SLokesh Vutla pll_pa_clk_sel(); 191c321a236SLokesh Vutla 192c321a236SLokesh Vutla /* Select the Output of ARM PLL as input to ARM */ 193c321a236SLokesh Vutla if (data->pll == TETRIS_PLL) 194c321a236SLokesh Vutla setbits_le32(KS2_MISC_CTRL, MISC_CTL1_ARM_PLL_EN); 195c321a236SLokesh Vutla 196c321a236SLokesh Vutla clrbits_le32(keystone_pll_regs[data->pll].reg1, CFG_PLLCTL1_RST_MASK); 197c321a236SLokesh Vutla /* Wait for 500 * REFCLK cucles * (PLLD + 1) */ 198c321a236SLokesh Vutla sdelay(105000); 199c321a236SLokesh Vutla 200c321a236SLokesh Vutla /* Switch to PLL mode */ 201c321a236SLokesh Vutla clrbits_le32(keystone_pll_regs[data->pll].reg0, 202c321a236SLokesh Vutla CFG_PLLCTL0_BYPASS_MASK); 203c321a236SLokesh Vutla } 204c321a236SLokesh Vutla 205c321a236SLokesh Vutla void init_pll(const struct pll_init_data *data) 206c321a236SLokesh Vutla { 207c321a236SLokesh Vutla if (data->pll == MAIN_PLL) 208c321a236SLokesh Vutla configure_main_pll(data); 209c321a236SLokesh Vutla else 210c321a236SLokesh Vutla configure_secondary_pll(data); 211c321a236SLokesh Vutla 21239a72345SMasahiro Yamada /* 21339a72345SMasahiro Yamada * This is required to provide a delay between multiple 21439a72345SMasahiro Yamada * consequent PPL configurations 21539a72345SMasahiro Yamada */ 21639a72345SMasahiro Yamada sdelay(210000); 21739a72345SMasahiro Yamada } 21839a72345SMasahiro Yamada 21994069301SLokesh Vutla void init_plls(void) 22039a72345SMasahiro Yamada { 22194069301SLokesh Vutla struct pll_init_data *data; 22294069301SLokesh Vutla int pll; 22339a72345SMasahiro Yamada 22494069301SLokesh Vutla for (pll = MAIN_PLL; pll < MAX_PLL_COUNT; pll++) { 22594069301SLokesh Vutla data = get_pll_init_data(pll); 22694069301SLokesh Vutla if (data) 22794069301SLokesh Vutla init_pll(data); 22894069301SLokesh Vutla } 22939a72345SMasahiro Yamada } 23039a72345SMasahiro Yamada 2317b50e159SLokesh Vutla static int get_max_speed(u32 val, u32 speed_supported) 23239a72345SMasahiro Yamada { 2337b50e159SLokesh Vutla int speed; 23439a72345SMasahiro Yamada 2357b50e159SLokesh Vutla /* Left most setbit gives the speed */ 2367b50e159SLokesh Vutla for (speed = DEVSPEED_NUMSPDS; speed >= 0; speed--) { 2377b50e159SLokesh Vutla if ((val & BIT(speed)) & speed_supported) 2387b50e159SLokesh Vutla return speeds[speed]; 23939a72345SMasahiro Yamada } 24039a72345SMasahiro Yamada 2417b50e159SLokesh Vutla /* If no bit is set, use SPD800 */ 24239a72345SMasahiro Yamada return SPD800; 24339a72345SMasahiro Yamada } 24439a72345SMasahiro Yamada 24539a72345SMasahiro Yamada static inline u32 read_efuse_bootrom(void) 24639a72345SMasahiro Yamada { 2477b50e159SLokesh Vutla if (cpu_is_k2hk() && (cpu_revision() <= 1)) 2487b50e159SLokesh Vutla return __raw_readl(KS2_REV1_DEVSPEED); 2497b50e159SLokesh Vutla else 25039a72345SMasahiro Yamada return __raw_readl(KS2_EFUSE_BOOTROM); 25139a72345SMasahiro Yamada } 25239a72345SMasahiro Yamada 2537b50e159SLokesh Vutla int get_max_arm_speed(void) 25439a72345SMasahiro Yamada { 2557b50e159SLokesh Vutla u32 armspeed = read_efuse_bootrom(); 2567b50e159SLokesh Vutla 2577b50e159SLokesh Vutla armspeed = (armspeed & DEVSPEED_ARMSPEED_MASK) >> 2587b50e159SLokesh Vutla DEVSPEED_ARMSPEED_SHIFT; 2597b50e159SLokesh Vutla 2607b50e159SLokesh Vutla return get_max_speed(armspeed, ARM_SUPPORTED_SPEEDS); 26139a72345SMasahiro Yamada } 26239a72345SMasahiro Yamada 2637b50e159SLokesh Vutla int get_max_dev_speed(void) 264437a7293SVitaly Andrianov { 2657b50e159SLokesh Vutla u32 devspeed = read_efuse_bootrom(); 2667b50e159SLokesh Vutla 2677b50e159SLokesh Vutla devspeed = (devspeed & DEVSPEED_DEVSPEED_MASK) >> 2687b50e159SLokesh Vutla DEVSPEED_DEVSPEED_SHIFT; 2697b50e159SLokesh Vutla 2707b50e159SLokesh Vutla return get_max_speed(devspeed, DEV_SUPPORTED_SPEEDS); 271437a7293SVitaly Andrianov } 272fe772ebdSLokesh Vutla 273fe772ebdSLokesh Vutla /** 274fe772ebdSLokesh Vutla * pll_freq_get - get pll frequency 275fe772ebdSLokesh Vutla * @pll: pll identifier 276fe772ebdSLokesh Vutla */ 277fe772ebdSLokesh Vutla static unsigned long pll_freq_get(int pll) 278fe772ebdSLokesh Vutla { 279fe772ebdSLokesh Vutla unsigned long mult = 1, prediv = 1, output_div = 2; 280fe772ebdSLokesh Vutla unsigned long ret; 281fe772ebdSLokesh Vutla u32 tmp, reg; 282fe772ebdSLokesh Vutla 283fe772ebdSLokesh Vutla if (pll == MAIN_PLL) { 284fe772ebdSLokesh Vutla ret = external_clk[sys_clk]; 285fe772ebdSLokesh Vutla if (pllctl_reg_read(pll, ctl) & PLLCTL_PLLEN_MASK) { 286fe772ebdSLokesh Vutla /* PLL mode */ 287fe772ebdSLokesh Vutla tmp = __raw_readl(KS2_MAINPLLCTL0); 288fe772ebdSLokesh Vutla prediv = (tmp & CFG_PLLCTL0_PLLD_MASK) + 1; 289fe772ebdSLokesh Vutla mult = ((tmp & CFG_PLLCTL0_PLLM_HI_MASK) >> 290fe772ebdSLokesh Vutla CFG_PLLCTL0_PLLM_SHIFT | 291fe772ebdSLokesh Vutla (pllctl_reg_read(pll, mult) & 292fe772ebdSLokesh Vutla PLLM_MULT_LO_MASK)) + 1; 293fe772ebdSLokesh Vutla output_div = ((pllctl_reg_read(pll, secctl) & 294fe772ebdSLokesh Vutla SECCTL_OP_DIV_MASK) >> 295fe772ebdSLokesh Vutla SECCTL_OP_DIV_SHIFT) + 1; 296fe772ebdSLokesh Vutla 297fe772ebdSLokesh Vutla ret = ret / prediv / output_div * mult; 298fe772ebdSLokesh Vutla } 299fe772ebdSLokesh Vutla } else { 300fe772ebdSLokesh Vutla switch (pll) { 301fe772ebdSLokesh Vutla case PASS_PLL: 302fe772ebdSLokesh Vutla ret = external_clk[pa_clk]; 303fe772ebdSLokesh Vutla reg = KS2_PASSPLLCTL0; 304fe772ebdSLokesh Vutla break; 305fe772ebdSLokesh Vutla case TETRIS_PLL: 306fe772ebdSLokesh Vutla ret = external_clk[tetris_clk]; 307fe772ebdSLokesh Vutla reg = KS2_ARMPLLCTL0; 308fe772ebdSLokesh Vutla break; 309fe772ebdSLokesh Vutla case DDR3A_PLL: 310fe772ebdSLokesh Vutla ret = external_clk[ddr3a_clk]; 311fe772ebdSLokesh Vutla reg = KS2_DDR3APLLCTL0; 312fe772ebdSLokesh Vutla break; 313fe772ebdSLokesh Vutla case DDR3B_PLL: 314fe772ebdSLokesh Vutla ret = external_clk[ddr3b_clk]; 315fe772ebdSLokesh Vutla reg = KS2_DDR3BPLLCTL0; 316fe772ebdSLokesh Vutla break; 317*bda920c6SVitaly Andrianov case UART_PLL: 318*bda920c6SVitaly Andrianov ret = external_clk[uart_clk]; 319*bda920c6SVitaly Andrianov reg = KS2_UARTPLLCTL0; 320*bda920c6SVitaly Andrianov break; 321fe772ebdSLokesh Vutla default: 322fe772ebdSLokesh Vutla return 0; 323fe772ebdSLokesh Vutla } 324fe772ebdSLokesh Vutla 325fe772ebdSLokesh Vutla tmp = __raw_readl(reg); 326fe772ebdSLokesh Vutla 327fe772ebdSLokesh Vutla if (!(tmp & CFG_PLLCTL0_BYPASS_MASK)) { 328fe772ebdSLokesh Vutla /* Bypass disabled */ 329fe772ebdSLokesh Vutla prediv = (tmp & CFG_PLLCTL0_PLLD_MASK) + 1; 330fe772ebdSLokesh Vutla mult = ((tmp & CFG_PLLCTL0_PLLM_MASK) >> 331fe772ebdSLokesh Vutla CFG_PLLCTL0_PLLM_SHIFT) + 1; 332fe772ebdSLokesh Vutla output_div = ((tmp & CFG_PLLCTL0_CLKOD_MASK) >> 333fe772ebdSLokesh Vutla CFG_PLLCTL0_CLKOD_SHIFT) + 1; 334fe772ebdSLokesh Vutla ret = ((ret / prediv) * mult) / output_div; 335fe772ebdSLokesh Vutla } 336fe772ebdSLokesh Vutla } 337fe772ebdSLokesh Vutla 338fe772ebdSLokesh Vutla return ret; 339fe772ebdSLokesh Vutla } 340fe772ebdSLokesh Vutla 341fe772ebdSLokesh Vutla unsigned long clk_get_rate(unsigned int clk) 342fe772ebdSLokesh Vutla { 343fe772ebdSLokesh Vutla unsigned long freq = 0; 344fe772ebdSLokesh Vutla 345fe772ebdSLokesh Vutla switch (clk) { 346fe772ebdSLokesh Vutla case core_pll_clk: 347fe772ebdSLokesh Vutla freq = pll_freq_get(CORE_PLL); 348fe772ebdSLokesh Vutla break; 349fe772ebdSLokesh Vutla case pass_pll_clk: 350fe772ebdSLokesh Vutla freq = pll_freq_get(PASS_PLL); 351fe772ebdSLokesh Vutla break; 352fe772ebdSLokesh Vutla case tetris_pll_clk: 353fe772ebdSLokesh Vutla if (!cpu_is_k2e()) 354fe772ebdSLokesh Vutla freq = pll_freq_get(TETRIS_PLL); 355fe772ebdSLokesh Vutla break; 356fe772ebdSLokesh Vutla case ddr3a_pll_clk: 357fe772ebdSLokesh Vutla freq = pll_freq_get(DDR3A_PLL); 358fe772ebdSLokesh Vutla break; 359fe772ebdSLokesh Vutla case ddr3b_pll_clk: 360fe772ebdSLokesh Vutla if (cpu_is_k2hk()) 361fe772ebdSLokesh Vutla freq = pll_freq_get(DDR3B_PLL); 362fe772ebdSLokesh Vutla break; 363fe772ebdSLokesh Vutla case sys_clk0_1_clk: 364fe772ebdSLokesh Vutla case sys_clk0_clk: 365fe772ebdSLokesh Vutla freq = pll_freq_get(CORE_PLL) / pll0div_read(1); 366fe772ebdSLokesh Vutla break; 367fe772ebdSLokesh Vutla case sys_clk1_clk: 368fe772ebdSLokesh Vutla return pll_freq_get(CORE_PLL) / pll0div_read(2); 369fe772ebdSLokesh Vutla break; 370fe772ebdSLokesh Vutla case sys_clk2_clk: 371fe772ebdSLokesh Vutla freq = pll_freq_get(CORE_PLL) / pll0div_read(3); 372fe772ebdSLokesh Vutla break; 373fe772ebdSLokesh Vutla case sys_clk3_clk: 374fe772ebdSLokesh Vutla freq = pll_freq_get(CORE_PLL) / pll0div_read(4); 375fe772ebdSLokesh Vutla break; 376fe772ebdSLokesh Vutla case sys_clk0_2_clk: 377fe772ebdSLokesh Vutla freq = clk_get_rate(sys_clk0_clk) / 2; 378fe772ebdSLokesh Vutla break; 379fe772ebdSLokesh Vutla case sys_clk0_3_clk: 380fe772ebdSLokesh Vutla freq = clk_get_rate(sys_clk0_clk) / 3; 381fe772ebdSLokesh Vutla break; 382fe772ebdSLokesh Vutla case sys_clk0_4_clk: 383fe772ebdSLokesh Vutla freq = clk_get_rate(sys_clk0_clk) / 4; 384fe772ebdSLokesh Vutla break; 385fe772ebdSLokesh Vutla case sys_clk0_6_clk: 386fe772ebdSLokesh Vutla freq = clk_get_rate(sys_clk0_clk) / 6; 387fe772ebdSLokesh Vutla break; 388fe772ebdSLokesh Vutla case sys_clk0_8_clk: 389fe772ebdSLokesh Vutla freq = clk_get_rate(sys_clk0_clk) / 8; 390fe772ebdSLokesh Vutla break; 391fe772ebdSLokesh Vutla case sys_clk0_12_clk: 392fe772ebdSLokesh Vutla freq = clk_get_rate(sys_clk0_clk) / 12; 393fe772ebdSLokesh Vutla break; 394fe772ebdSLokesh Vutla case sys_clk0_24_clk: 395fe772ebdSLokesh Vutla freq = clk_get_rate(sys_clk0_clk) / 24; 396fe772ebdSLokesh Vutla break; 397fe772ebdSLokesh Vutla case sys_clk1_3_clk: 398fe772ebdSLokesh Vutla freq = clk_get_rate(sys_clk1_clk) / 3; 399fe772ebdSLokesh Vutla break; 400fe772ebdSLokesh Vutla case sys_clk1_4_clk: 401fe772ebdSLokesh Vutla freq = clk_get_rate(sys_clk1_clk) / 4; 402fe772ebdSLokesh Vutla break; 403fe772ebdSLokesh Vutla case sys_clk1_6_clk: 404fe772ebdSLokesh Vutla freq = clk_get_rate(sys_clk1_clk) / 6; 405fe772ebdSLokesh Vutla break; 406fe772ebdSLokesh Vutla case sys_clk1_12_clk: 407fe772ebdSLokesh Vutla freq = clk_get_rate(sys_clk1_clk) / 12; 408fe772ebdSLokesh Vutla break; 409fe772ebdSLokesh Vutla default: 410fe772ebdSLokesh Vutla break; 411fe772ebdSLokesh Vutla } 412fe772ebdSLokesh Vutla 413fe772ebdSLokesh Vutla return freq; 414fe772ebdSLokesh Vutla } 415