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},
34bda920c6SVitaly Andrianov [UART_PLL] = {KS2_UARTPLLCTL0, KS2_UARTPLLCTL1},
3574af583eSLokesh Vutla };
3674af583eSLokesh Vutla
pll_pa_clk_sel(void)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
wait_for_completion(const struct pll_init_data * data)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
bypass_main_pll(const struct pll_init_data * data)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
configure_mult_div(const struct pll_init_data * data)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
configure_main_pll(const struct pll_init_data * data)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
configure_secondary_pll(const struct pll_init_data * data)162c321a236SLokesh Vutla void configure_secondary_pll(const struct pll_init_data *data)
163c321a236SLokesh Vutla {
164c321a236SLokesh Vutla int pllod = data->pll_od - 1;
165c321a236SLokesh Vutla
1668b01ebd8SLokesh Vutla /* Enable Glitch free bypass for ARM PLL */
1678b01ebd8SLokesh Vutla if (cpu_is_k2hk() && data->pll == TETRIS_PLL)
1688b01ebd8SLokesh Vutla clrbits_le32(KS2_MISC_CTRL, MISC_CTL1_ARM_PLL_EN);
1698b01ebd8SLokesh Vutla
170c321a236SLokesh Vutla /* Enable Bypass mode */
171c321a236SLokesh Vutla setbits_le32(keystone_pll_regs[data->pll].reg1, CFG_PLLCTL1_ENSAT_MASK);
172c321a236SLokesh Vutla setbits_le32(keystone_pll_regs[data->pll].reg0,
173c321a236SLokesh Vutla CFG_PLLCTL0_BYPASS_MASK);
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 clrbits_le32(keystone_pll_regs[data->pll].reg1, CFG_PLLCTL1_RST_MASK);
193c321a236SLokesh Vutla /* Wait for 500 * REFCLK cucles * (PLLD + 1) */
194c321a236SLokesh Vutla sdelay(105000);
195c321a236SLokesh Vutla
196c321a236SLokesh Vutla /* Switch to PLL mode */
197c321a236SLokesh Vutla clrbits_le32(keystone_pll_regs[data->pll].reg0,
198c321a236SLokesh Vutla CFG_PLLCTL0_BYPASS_MASK);
1998b01ebd8SLokesh Vutla
2008b01ebd8SLokesh Vutla /* Select the Output of ARM PLL as input to ARM */
2018b01ebd8SLokesh Vutla if (cpu_is_k2hk() && data->pll == TETRIS_PLL)
2028b01ebd8SLokesh Vutla setbits_le32(KS2_MISC_CTRL, MISC_CTL1_ARM_PLL_EN);
203c321a236SLokesh Vutla }
204c321a236SLokesh Vutla
init_pll(const struct pll_init_data * data)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
init_plls(void)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
get_max_speed(u32 val,u32 speed_supported,int * spds)2315cd1f6bdSLokesh Vutla static int get_max_speed(u32 val, u32 speed_supported, int *spds)
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)
2385cd1f6bdSLokesh Vutla return spds[speed];
23939a72345SMasahiro Yamada }
24039a72345SMasahiro Yamada
241ef76ebb1SLokesh Vutla /* If no bit is set, return minimum speed */
242ef76ebb1SLokesh Vutla if (cpu_is_k2g())
243ef76ebb1SLokesh Vutla return SPD200;
244ef76ebb1SLokesh Vutla else
24539a72345SMasahiro Yamada return SPD800;
24639a72345SMasahiro Yamada }
24739a72345SMasahiro Yamada
read_efuse_bootrom(void)24839a72345SMasahiro Yamada static inline u32 read_efuse_bootrom(void)
24939a72345SMasahiro Yamada {
2507b50e159SLokesh Vutla if (cpu_is_k2hk() && (cpu_revision() <= 1))
2517b50e159SLokesh Vutla return __raw_readl(KS2_REV1_DEVSPEED);
2527b50e159SLokesh Vutla else
25339a72345SMasahiro Yamada return __raw_readl(KS2_EFUSE_BOOTROM);
25439a72345SMasahiro Yamada }
25539a72345SMasahiro Yamada
get_max_arm_speed(int * spds)2565cd1f6bdSLokesh Vutla int get_max_arm_speed(int *spds)
25739a72345SMasahiro Yamada {
2587b50e159SLokesh Vutla u32 armspeed = read_efuse_bootrom();
2597b50e159SLokesh Vutla
2607b50e159SLokesh Vutla armspeed = (armspeed & DEVSPEED_ARMSPEED_MASK) >>
2617b50e159SLokesh Vutla DEVSPEED_ARMSPEED_SHIFT;
2627b50e159SLokesh Vutla
2635cd1f6bdSLokesh Vutla return get_max_speed(armspeed, ARM_SUPPORTED_SPEEDS, spds);
26439a72345SMasahiro Yamada }
26539a72345SMasahiro Yamada
get_max_dev_speed(int * spds)2665cd1f6bdSLokesh Vutla int get_max_dev_speed(int *spds)
267437a7293SVitaly Andrianov {
2687b50e159SLokesh Vutla u32 devspeed = read_efuse_bootrom();
2697b50e159SLokesh Vutla
2707b50e159SLokesh Vutla devspeed = (devspeed & DEVSPEED_DEVSPEED_MASK) >>
2717b50e159SLokesh Vutla DEVSPEED_DEVSPEED_SHIFT;
2727b50e159SLokesh Vutla
2735cd1f6bdSLokesh Vutla return get_max_speed(devspeed, DEV_SUPPORTED_SPEEDS, spds);
274437a7293SVitaly Andrianov }
275fe772ebdSLokesh Vutla
276fe772ebdSLokesh Vutla /**
277fe772ebdSLokesh Vutla * pll_freq_get - get pll frequency
278fe772ebdSLokesh Vutla * @pll: pll identifier
279fe772ebdSLokesh Vutla */
pll_freq_get(int pll)280fe772ebdSLokesh Vutla static unsigned long pll_freq_get(int pll)
281fe772ebdSLokesh Vutla {
282fe772ebdSLokesh Vutla unsigned long mult = 1, prediv = 1, output_div = 2;
283fe772ebdSLokesh Vutla unsigned long ret;
284fe772ebdSLokesh Vutla u32 tmp, reg;
285fe772ebdSLokesh Vutla
286fe772ebdSLokesh Vutla if (pll == MAIN_PLL) {
287*ee3c6532SLokesh Vutla ret = get_external_clk(sys_clk);
288fe772ebdSLokesh Vutla if (pllctl_reg_read(pll, ctl) & PLLCTL_PLLEN_MASK) {
289fe772ebdSLokesh Vutla /* PLL mode */
290fe772ebdSLokesh Vutla tmp = __raw_readl(KS2_MAINPLLCTL0);
291fe772ebdSLokesh Vutla prediv = (tmp & CFG_PLLCTL0_PLLD_MASK) + 1;
292fe772ebdSLokesh Vutla mult = ((tmp & CFG_PLLCTL0_PLLM_HI_MASK) >>
293fe772ebdSLokesh Vutla CFG_PLLCTL0_PLLM_SHIFT |
294fe772ebdSLokesh Vutla (pllctl_reg_read(pll, mult) &
295fe772ebdSLokesh Vutla PLLM_MULT_LO_MASK)) + 1;
296fe772ebdSLokesh Vutla output_div = ((pllctl_reg_read(pll, secctl) &
297fe772ebdSLokesh Vutla SECCTL_OP_DIV_MASK) >>
298fe772ebdSLokesh Vutla SECCTL_OP_DIV_SHIFT) + 1;
299fe772ebdSLokesh Vutla
300fe772ebdSLokesh Vutla ret = ret / prediv / output_div * mult;
301fe772ebdSLokesh Vutla }
302fe772ebdSLokesh Vutla } else {
303fe772ebdSLokesh Vutla switch (pll) {
304fe772ebdSLokesh Vutla case PASS_PLL:
305*ee3c6532SLokesh Vutla ret = get_external_clk(pa_clk);
306fe772ebdSLokesh Vutla reg = KS2_PASSPLLCTL0;
307fe772ebdSLokesh Vutla break;
308fe772ebdSLokesh Vutla case TETRIS_PLL:
309*ee3c6532SLokesh Vutla ret = get_external_clk(tetris_clk);
310fe772ebdSLokesh Vutla reg = KS2_ARMPLLCTL0;
311fe772ebdSLokesh Vutla break;
312fe772ebdSLokesh Vutla case DDR3A_PLL:
313*ee3c6532SLokesh Vutla ret = get_external_clk(ddr3a_clk);
314fe772ebdSLokesh Vutla reg = KS2_DDR3APLLCTL0;
315fe772ebdSLokesh Vutla break;
316fe772ebdSLokesh Vutla case DDR3B_PLL:
317*ee3c6532SLokesh Vutla ret = get_external_clk(ddr3b_clk);
318fe772ebdSLokesh Vutla reg = KS2_DDR3BPLLCTL0;
319fe772ebdSLokesh Vutla break;
320bda920c6SVitaly Andrianov case UART_PLL:
321*ee3c6532SLokesh Vutla ret = get_external_clk(uart_clk);
322bda920c6SVitaly Andrianov reg = KS2_UARTPLLCTL0;
323bda920c6SVitaly Andrianov break;
324fe772ebdSLokesh Vutla default:
325fe772ebdSLokesh Vutla return 0;
326fe772ebdSLokesh Vutla }
327fe772ebdSLokesh Vutla
328fe772ebdSLokesh Vutla tmp = __raw_readl(reg);
329fe772ebdSLokesh Vutla
330fe772ebdSLokesh Vutla if (!(tmp & CFG_PLLCTL0_BYPASS_MASK)) {
331fe772ebdSLokesh Vutla /* Bypass disabled */
332fe772ebdSLokesh Vutla prediv = (tmp & CFG_PLLCTL0_PLLD_MASK) + 1;
333fe772ebdSLokesh Vutla mult = ((tmp & CFG_PLLCTL0_PLLM_MASK) >>
334fe772ebdSLokesh Vutla CFG_PLLCTL0_PLLM_SHIFT) + 1;
335fe772ebdSLokesh Vutla output_div = ((tmp & CFG_PLLCTL0_CLKOD_MASK) >>
336fe772ebdSLokesh Vutla CFG_PLLCTL0_CLKOD_SHIFT) + 1;
337fe772ebdSLokesh Vutla ret = ((ret / prediv) * mult) / output_div;
338fe772ebdSLokesh Vutla }
339fe772ebdSLokesh Vutla }
340fe772ebdSLokesh Vutla
341fe772ebdSLokesh Vutla return ret;
342fe772ebdSLokesh Vutla }
343fe772ebdSLokesh Vutla
ks_clk_get_rate(unsigned int clk)34443ebbfc3SMasahiro Yamada unsigned long ks_clk_get_rate(unsigned int clk)
345fe772ebdSLokesh Vutla {
346fe772ebdSLokesh Vutla unsigned long freq = 0;
347fe772ebdSLokesh Vutla
348fe772ebdSLokesh Vutla switch (clk) {
349fe772ebdSLokesh Vutla case core_pll_clk:
350fe772ebdSLokesh Vutla freq = pll_freq_get(CORE_PLL);
351fe772ebdSLokesh Vutla break;
352fe772ebdSLokesh Vutla case pass_pll_clk:
353fe772ebdSLokesh Vutla freq = pll_freq_get(PASS_PLL);
354fe772ebdSLokesh Vutla break;
355fe772ebdSLokesh Vutla case tetris_pll_clk:
356fe772ebdSLokesh Vutla if (!cpu_is_k2e())
357fe772ebdSLokesh Vutla freq = pll_freq_get(TETRIS_PLL);
358fe772ebdSLokesh Vutla break;
359fe772ebdSLokesh Vutla case ddr3a_pll_clk:
360fe772ebdSLokesh Vutla freq = pll_freq_get(DDR3A_PLL);
361fe772ebdSLokesh Vutla break;
362fe772ebdSLokesh Vutla case ddr3b_pll_clk:
363fe772ebdSLokesh Vutla if (cpu_is_k2hk())
364fe772ebdSLokesh Vutla freq = pll_freq_get(DDR3B_PLL);
365fe772ebdSLokesh Vutla break;
366e6d71e1cSVitaly Andrianov case uart_pll_clk:
367e6d71e1cSVitaly Andrianov if (cpu_is_k2g())
368e6d71e1cSVitaly Andrianov freq = pll_freq_get(UART_PLL);
369e6d71e1cSVitaly Andrianov break;
370fe772ebdSLokesh Vutla case sys_clk0_1_clk:
371fe772ebdSLokesh Vutla case sys_clk0_clk:
372fe772ebdSLokesh Vutla freq = pll_freq_get(CORE_PLL) / pll0div_read(1);
373fe772ebdSLokesh Vutla break;
374fe772ebdSLokesh Vutla case sys_clk1_clk:
375fe772ebdSLokesh Vutla return pll_freq_get(CORE_PLL) / pll0div_read(2);
376fe772ebdSLokesh Vutla break;
377fe772ebdSLokesh Vutla case sys_clk2_clk:
378fe772ebdSLokesh Vutla freq = pll_freq_get(CORE_PLL) / pll0div_read(3);
379fe772ebdSLokesh Vutla break;
380fe772ebdSLokesh Vutla case sys_clk3_clk:
381fe772ebdSLokesh Vutla freq = pll_freq_get(CORE_PLL) / pll0div_read(4);
382fe772ebdSLokesh Vutla break;
383fe772ebdSLokesh Vutla case sys_clk0_2_clk:
38443ebbfc3SMasahiro Yamada freq = ks_clk_get_rate(sys_clk0_clk) / 2;
385fe772ebdSLokesh Vutla break;
386fe772ebdSLokesh Vutla case sys_clk0_3_clk:
38743ebbfc3SMasahiro Yamada freq = ks_clk_get_rate(sys_clk0_clk) / 3;
388fe772ebdSLokesh Vutla break;
389fe772ebdSLokesh Vutla case sys_clk0_4_clk:
39043ebbfc3SMasahiro Yamada freq = ks_clk_get_rate(sys_clk0_clk) / 4;
391fe772ebdSLokesh Vutla break;
392fe772ebdSLokesh Vutla case sys_clk0_6_clk:
39343ebbfc3SMasahiro Yamada freq = ks_clk_get_rate(sys_clk0_clk) / 6;
394fe772ebdSLokesh Vutla break;
395fe772ebdSLokesh Vutla case sys_clk0_8_clk:
39643ebbfc3SMasahiro Yamada freq = ks_clk_get_rate(sys_clk0_clk) / 8;
397fe772ebdSLokesh Vutla break;
398fe772ebdSLokesh Vutla case sys_clk0_12_clk:
39943ebbfc3SMasahiro Yamada freq = ks_clk_get_rate(sys_clk0_clk) / 12;
400fe772ebdSLokesh Vutla break;
401fe772ebdSLokesh Vutla case sys_clk0_24_clk:
40243ebbfc3SMasahiro Yamada freq = ks_clk_get_rate(sys_clk0_clk) / 24;
403fe772ebdSLokesh Vutla break;
404fe772ebdSLokesh Vutla case sys_clk1_3_clk:
40543ebbfc3SMasahiro Yamada freq = ks_clk_get_rate(sys_clk1_clk) / 3;
406fe772ebdSLokesh Vutla break;
407fe772ebdSLokesh Vutla case sys_clk1_4_clk:
40843ebbfc3SMasahiro Yamada freq = ks_clk_get_rate(sys_clk1_clk) / 4;
409fe772ebdSLokesh Vutla break;
410fe772ebdSLokesh Vutla case sys_clk1_6_clk:
41143ebbfc3SMasahiro Yamada freq = ks_clk_get_rate(sys_clk1_clk) / 6;
412fe772ebdSLokesh Vutla break;
413fe772ebdSLokesh Vutla case sys_clk1_12_clk:
41443ebbfc3SMasahiro Yamada freq = ks_clk_get_rate(sys_clk1_clk) / 12;
415fe772ebdSLokesh Vutla break;
416fe772ebdSLokesh Vutla default:
417fe772ebdSLokesh Vutla break;
418fe772ebdSLokesh Vutla }
419fe772ebdSLokesh Vutla
420fe772ebdSLokesh Vutla return freq;
421fe772ebdSLokesh Vutla }
422