xref: /rk3399_rockchip-uboot/arch/arm/mach-keystone/clock.c (revision 4f66e09bb9fbc47b73f67c3cc08ee2663e8fcdb1)
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