xref: /rk3399_rockchip-uboot/arch/arm/mach-imx/mx5/clock.c (revision 39632b4a01210e329333d787d828157dcd2c7328)
1*552a848eSStefano Babic /*
2*552a848eSStefano Babic  * (C) Copyright 2007
3*552a848eSStefano Babic  * Sascha Hauer, Pengutronix
4*552a848eSStefano Babic  *
5*552a848eSStefano Babic  * (C) Copyright 2009 Freescale Semiconductor, Inc.
6*552a848eSStefano Babic  *
7*552a848eSStefano Babic  * SPDX-License-Identifier:	GPL-2.0+
8*552a848eSStefano Babic  */
9*552a848eSStefano Babic 
10*552a848eSStefano Babic #include <common.h>
11*552a848eSStefano Babic #include <asm/io.h>
12*552a848eSStefano Babic #include <linux/errno.h>
13*552a848eSStefano Babic #include <asm/arch/imx-regs.h>
14*552a848eSStefano Babic #include <asm/arch/crm_regs.h>
15*552a848eSStefano Babic #include <asm/arch/clock.h>
16*552a848eSStefano Babic #include <div64.h>
17*552a848eSStefano Babic #include <asm/arch/sys_proto.h>
18*552a848eSStefano Babic 
19*552a848eSStefano Babic enum pll_clocks {
20*552a848eSStefano Babic 	PLL1_CLOCK = 0,
21*552a848eSStefano Babic 	PLL2_CLOCK,
22*552a848eSStefano Babic 	PLL3_CLOCK,
23*552a848eSStefano Babic #ifdef CONFIG_MX53
24*552a848eSStefano Babic 	PLL4_CLOCK,
25*552a848eSStefano Babic #endif
26*552a848eSStefano Babic 	PLL_CLOCKS,
27*552a848eSStefano Babic };
28*552a848eSStefano Babic 
29*552a848eSStefano Babic struct mxc_pll_reg *mxc_plls[PLL_CLOCKS] = {
30*552a848eSStefano Babic 	[PLL1_CLOCK] = (struct mxc_pll_reg *)PLL1_BASE_ADDR,
31*552a848eSStefano Babic 	[PLL2_CLOCK] = (struct mxc_pll_reg *)PLL2_BASE_ADDR,
32*552a848eSStefano Babic 	[PLL3_CLOCK] = (struct mxc_pll_reg *)PLL3_BASE_ADDR,
33*552a848eSStefano Babic #ifdef	CONFIG_MX53
34*552a848eSStefano Babic 	[PLL4_CLOCK] = (struct mxc_pll_reg *)PLL4_BASE_ADDR,
35*552a848eSStefano Babic #endif
36*552a848eSStefano Babic };
37*552a848eSStefano Babic 
38*552a848eSStefano Babic #define AHB_CLK_ROOT    133333333
39*552a848eSStefano Babic #define SZ_DEC_1M       1000000
40*552a848eSStefano Babic #define PLL_PD_MAX      16      /* Actual pd+1 */
41*552a848eSStefano Babic #define PLL_MFI_MAX     15
42*552a848eSStefano Babic #define PLL_MFI_MIN     5
43*552a848eSStefano Babic #define ARM_DIV_MAX     8
44*552a848eSStefano Babic #define IPG_DIV_MAX     4
45*552a848eSStefano Babic #define AHB_DIV_MAX     8
46*552a848eSStefano Babic #define EMI_DIV_MAX     8
47*552a848eSStefano Babic #define NFC_DIV_MAX     8
48*552a848eSStefano Babic 
49*552a848eSStefano Babic #define MX5_CBCMR	0x00015154
50*552a848eSStefano Babic #define MX5_CBCDR	0x02888945
51*552a848eSStefano Babic 
52*552a848eSStefano Babic struct fixed_pll_mfd {
53*552a848eSStefano Babic 	u32 ref_clk_hz;
54*552a848eSStefano Babic 	u32 mfd;
55*552a848eSStefano Babic };
56*552a848eSStefano Babic 
57*552a848eSStefano Babic const struct fixed_pll_mfd fixed_mfd[] = {
58*552a848eSStefano Babic 	{MXC_HCLK, 24 * 16},
59*552a848eSStefano Babic };
60*552a848eSStefano Babic 
61*552a848eSStefano Babic struct pll_param {
62*552a848eSStefano Babic 	u32 pd;
63*552a848eSStefano Babic 	u32 mfi;
64*552a848eSStefano Babic 	u32 mfn;
65*552a848eSStefano Babic 	u32 mfd;
66*552a848eSStefano Babic };
67*552a848eSStefano Babic 
68*552a848eSStefano Babic #define PLL_FREQ_MAX(ref_clk)  (4 * (ref_clk) * PLL_MFI_MAX)
69*552a848eSStefano Babic #define PLL_FREQ_MIN(ref_clk) \
70*552a848eSStefano Babic 		((2 * (ref_clk) * (PLL_MFI_MIN - 1)) / PLL_PD_MAX)
71*552a848eSStefano Babic #define MAX_DDR_CLK     420000000
72*552a848eSStefano Babic #define NFC_CLK_MAX     34000000
73*552a848eSStefano Babic 
74*552a848eSStefano Babic struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)MXC_CCM_BASE;
75*552a848eSStefano Babic 
set_usboh3_clk(void)76*552a848eSStefano Babic void set_usboh3_clk(void)
77*552a848eSStefano Babic {
78*552a848eSStefano Babic 	clrsetbits_le32(&mxc_ccm->cscmr1,
79*552a848eSStefano Babic 			MXC_CCM_CSCMR1_USBOH3_CLK_SEL_MASK,
80*552a848eSStefano Babic 			MXC_CCM_CSCMR1_USBOH3_CLK_SEL(1));
81*552a848eSStefano Babic 	clrsetbits_le32(&mxc_ccm->cscdr1,
82*552a848eSStefano Babic 			MXC_CCM_CSCDR1_USBOH3_CLK_PODF_MASK |
83*552a848eSStefano Babic 			MXC_CCM_CSCDR1_USBOH3_CLK_PRED_MASK,
84*552a848eSStefano Babic 			MXC_CCM_CSCDR1_USBOH3_CLK_PRED(4) |
85*552a848eSStefano Babic 			MXC_CCM_CSCDR1_USBOH3_CLK_PODF(1));
86*552a848eSStefano Babic }
87*552a848eSStefano Babic 
enable_usboh3_clk(bool enable)88*552a848eSStefano Babic void enable_usboh3_clk(bool enable)
89*552a848eSStefano Babic {
90*552a848eSStefano Babic 	unsigned int cg = enable ? MXC_CCM_CCGR_CG_ON : MXC_CCM_CCGR_CG_OFF;
91*552a848eSStefano Babic 
92*552a848eSStefano Babic 	clrsetbits_le32(&mxc_ccm->CCGR2,
93*552a848eSStefano Babic 			MXC_CCM_CCGR2_USBOH3_60M(MXC_CCM_CCGR_CG_MASK),
94*552a848eSStefano Babic 			MXC_CCM_CCGR2_USBOH3_60M(cg));
95*552a848eSStefano Babic }
96*552a848eSStefano Babic 
97*552a848eSStefano Babic #ifdef CONFIG_SYS_I2C_MXC
98*552a848eSStefano Babic /* i2c_num can be from 0, to 1 for i.MX51 and 2 for i.MX53 */
enable_i2c_clk(unsigned char enable,unsigned i2c_num)99*552a848eSStefano Babic int enable_i2c_clk(unsigned char enable, unsigned i2c_num)
100*552a848eSStefano Babic {
101*552a848eSStefano Babic 	u32 mask;
102*552a848eSStefano Babic 
103*552a848eSStefano Babic #if defined(CONFIG_MX51)
104*552a848eSStefano Babic 	if (i2c_num > 1)
105*552a848eSStefano Babic #elif defined(CONFIG_MX53)
106*552a848eSStefano Babic 	if (i2c_num > 2)
107*552a848eSStefano Babic #endif
108*552a848eSStefano Babic 		return -EINVAL;
109*552a848eSStefano Babic 	mask = MXC_CCM_CCGR_CG_MASK <<
110*552a848eSStefano Babic 			(MXC_CCM_CCGR1_I2C1_OFFSET + (i2c_num << 1));
111*552a848eSStefano Babic 	if (enable)
112*552a848eSStefano Babic 		setbits_le32(&mxc_ccm->CCGR1, mask);
113*552a848eSStefano Babic 	else
114*552a848eSStefano Babic 		clrbits_le32(&mxc_ccm->CCGR1, mask);
115*552a848eSStefano Babic 	return 0;
116*552a848eSStefano Babic }
117*552a848eSStefano Babic #endif
118*552a848eSStefano Babic 
set_usb_phy_clk(void)119*552a848eSStefano Babic void set_usb_phy_clk(void)
120*552a848eSStefano Babic {
121*552a848eSStefano Babic 	clrbits_le32(&mxc_ccm->cscmr1, MXC_CCM_CSCMR1_USB_PHY_CLK_SEL);
122*552a848eSStefano Babic }
123*552a848eSStefano Babic 
124*552a848eSStefano Babic #if defined(CONFIG_MX51)
enable_usb_phy1_clk(bool enable)125*552a848eSStefano Babic void enable_usb_phy1_clk(bool enable)
126*552a848eSStefano Babic {
127*552a848eSStefano Babic 	unsigned int cg = enable ? MXC_CCM_CCGR_CG_ON : MXC_CCM_CCGR_CG_OFF;
128*552a848eSStefano Babic 
129*552a848eSStefano Babic 	clrsetbits_le32(&mxc_ccm->CCGR2,
130*552a848eSStefano Babic 			MXC_CCM_CCGR2_USB_PHY(MXC_CCM_CCGR_CG_MASK),
131*552a848eSStefano Babic 			MXC_CCM_CCGR2_USB_PHY(cg));
132*552a848eSStefano Babic }
133*552a848eSStefano Babic 
enable_usb_phy2_clk(bool enable)134*552a848eSStefano Babic void enable_usb_phy2_clk(bool enable)
135*552a848eSStefano Babic {
136*552a848eSStefano Babic 	/* i.MX51 has a single USB PHY clock, so do nothing here. */
137*552a848eSStefano Babic }
138*552a848eSStefano Babic #elif defined(CONFIG_MX53)
enable_usb_phy1_clk(bool enable)139*552a848eSStefano Babic void enable_usb_phy1_clk(bool enable)
140*552a848eSStefano Babic {
141*552a848eSStefano Babic 	unsigned int cg = enable ? MXC_CCM_CCGR_CG_ON : MXC_CCM_CCGR_CG_OFF;
142*552a848eSStefano Babic 
143*552a848eSStefano Babic 	clrsetbits_le32(&mxc_ccm->CCGR4,
144*552a848eSStefano Babic 			MXC_CCM_CCGR4_USB_PHY1(MXC_CCM_CCGR_CG_MASK),
145*552a848eSStefano Babic 			MXC_CCM_CCGR4_USB_PHY1(cg));
146*552a848eSStefano Babic }
147*552a848eSStefano Babic 
enable_usb_phy2_clk(bool enable)148*552a848eSStefano Babic void enable_usb_phy2_clk(bool enable)
149*552a848eSStefano Babic {
150*552a848eSStefano Babic 	unsigned int cg = enable ? MXC_CCM_CCGR_CG_ON : MXC_CCM_CCGR_CG_OFF;
151*552a848eSStefano Babic 
152*552a848eSStefano Babic 	clrsetbits_le32(&mxc_ccm->CCGR4,
153*552a848eSStefano Babic 			MXC_CCM_CCGR4_USB_PHY2(MXC_CCM_CCGR_CG_MASK),
154*552a848eSStefano Babic 			MXC_CCM_CCGR4_USB_PHY2(cg));
155*552a848eSStefano Babic }
156*552a848eSStefano Babic #endif
157*552a848eSStefano Babic 
158*552a848eSStefano Babic /*
159*552a848eSStefano Babic  * Calculate the frequency of PLLn.
160*552a848eSStefano Babic  */
decode_pll(struct mxc_pll_reg * pll,uint32_t infreq)161*552a848eSStefano Babic static uint32_t decode_pll(struct mxc_pll_reg *pll, uint32_t infreq)
162*552a848eSStefano Babic {
163*552a848eSStefano Babic 	uint32_t ctrl, op, mfd, mfn, mfi, pdf, ret;
164*552a848eSStefano Babic 	uint64_t refclk, temp;
165*552a848eSStefano Babic 	int32_t mfn_abs;
166*552a848eSStefano Babic 
167*552a848eSStefano Babic 	ctrl = readl(&pll->ctrl);
168*552a848eSStefano Babic 
169*552a848eSStefano Babic 	if (ctrl & MXC_DPLLC_CTL_HFSM) {
170*552a848eSStefano Babic 		mfn = readl(&pll->hfs_mfn);
171*552a848eSStefano Babic 		mfd = readl(&pll->hfs_mfd);
172*552a848eSStefano Babic 		op = readl(&pll->hfs_op);
173*552a848eSStefano Babic 	} else {
174*552a848eSStefano Babic 		mfn = readl(&pll->mfn);
175*552a848eSStefano Babic 		mfd = readl(&pll->mfd);
176*552a848eSStefano Babic 		op = readl(&pll->op);
177*552a848eSStefano Babic 	}
178*552a848eSStefano Babic 
179*552a848eSStefano Babic 	mfd &= MXC_DPLLC_MFD_MFD_MASK;
180*552a848eSStefano Babic 	mfn &= MXC_DPLLC_MFN_MFN_MASK;
181*552a848eSStefano Babic 	pdf = op & MXC_DPLLC_OP_PDF_MASK;
182*552a848eSStefano Babic 	mfi = MXC_DPLLC_OP_MFI_RD(op);
183*552a848eSStefano Babic 
184*552a848eSStefano Babic 	/* 21.2.3 */
185*552a848eSStefano Babic 	if (mfi < 5)
186*552a848eSStefano Babic 		mfi = 5;
187*552a848eSStefano Babic 
188*552a848eSStefano Babic 	/* Sign extend */
189*552a848eSStefano Babic 	if (mfn >= 0x04000000) {
190*552a848eSStefano Babic 		mfn |= 0xfc000000;
191*552a848eSStefano Babic 		mfn_abs = -mfn;
192*552a848eSStefano Babic 	} else
193*552a848eSStefano Babic 		mfn_abs = mfn;
194*552a848eSStefano Babic 
195*552a848eSStefano Babic 	refclk = infreq * 2;
196*552a848eSStefano Babic 	if (ctrl & MXC_DPLLC_CTL_DPDCK0_2_EN)
197*552a848eSStefano Babic 		refclk *= 2;
198*552a848eSStefano Babic 
199*552a848eSStefano Babic 	do_div(refclk, pdf + 1);
200*552a848eSStefano Babic 	temp = refclk * mfn_abs;
201*552a848eSStefano Babic 	do_div(temp, mfd + 1);
202*552a848eSStefano Babic 	ret = refclk * mfi;
203*552a848eSStefano Babic 
204*552a848eSStefano Babic 	if ((int)mfn < 0)
205*552a848eSStefano Babic 		ret -= temp;
206*552a848eSStefano Babic 	else
207*552a848eSStefano Babic 		ret += temp;
208*552a848eSStefano Babic 
209*552a848eSStefano Babic 	return ret;
210*552a848eSStefano Babic }
211*552a848eSStefano Babic 
212*552a848eSStefano Babic #ifdef CONFIG_MX51
213*552a848eSStefano Babic /*
214*552a848eSStefano Babic  * This function returns the Frequency Pre-Multiplier clock.
215*552a848eSStefano Babic  */
get_fpm(void)216*552a848eSStefano Babic static u32 get_fpm(void)
217*552a848eSStefano Babic {
218*552a848eSStefano Babic 	u32 mult;
219*552a848eSStefano Babic 	u32 ccr = readl(&mxc_ccm->ccr);
220*552a848eSStefano Babic 
221*552a848eSStefano Babic 	if (ccr & MXC_CCM_CCR_FPM_MULT)
222*552a848eSStefano Babic 		mult = 1024;
223*552a848eSStefano Babic 	else
224*552a848eSStefano Babic 		mult = 512;
225*552a848eSStefano Babic 
226*552a848eSStefano Babic 	return MXC_CLK32 * mult;
227*552a848eSStefano Babic }
228*552a848eSStefano Babic #endif
229*552a848eSStefano Babic 
230*552a848eSStefano Babic /*
231*552a848eSStefano Babic  * This function returns the low power audio clock.
232*552a848eSStefano Babic  */
get_lp_apm(void)233*552a848eSStefano Babic static u32 get_lp_apm(void)
234*552a848eSStefano Babic {
235*552a848eSStefano Babic 	u32 ret_val = 0;
236*552a848eSStefano Babic 	u32 ccsr = readl(&mxc_ccm->ccsr);
237*552a848eSStefano Babic 
238*552a848eSStefano Babic 	if (ccsr & MXC_CCM_CCSR_LP_APM)
239*552a848eSStefano Babic #if defined(CONFIG_MX51)
240*552a848eSStefano Babic 		ret_val = get_fpm();
241*552a848eSStefano Babic #elif defined(CONFIG_MX53)
242*552a848eSStefano Babic 		ret_val = decode_pll(mxc_plls[PLL4_CLOCK], MXC_HCLK);
243*552a848eSStefano Babic #endif
244*552a848eSStefano Babic 	else
245*552a848eSStefano Babic 		ret_val = MXC_HCLK;
246*552a848eSStefano Babic 
247*552a848eSStefano Babic 	return ret_val;
248*552a848eSStefano Babic }
249*552a848eSStefano Babic 
250*552a848eSStefano Babic /*
251*552a848eSStefano Babic  * Get mcu main rate
252*552a848eSStefano Babic  */
get_mcu_main_clk(void)253*552a848eSStefano Babic u32 get_mcu_main_clk(void)
254*552a848eSStefano Babic {
255*552a848eSStefano Babic 	u32 reg, freq;
256*552a848eSStefano Babic 
257*552a848eSStefano Babic 	reg = MXC_CCM_CACRR_ARM_PODF_RD(readl(&mxc_ccm->cacrr));
258*552a848eSStefano Babic 	freq = decode_pll(mxc_plls[PLL1_CLOCK], MXC_HCLK);
259*552a848eSStefano Babic 	return freq / (reg + 1);
260*552a848eSStefano Babic }
261*552a848eSStefano Babic 
262*552a848eSStefano Babic /*
263*552a848eSStefano Babic  * Get the rate of peripheral's root clock.
264*552a848eSStefano Babic  */
get_periph_clk(void)265*552a848eSStefano Babic u32 get_periph_clk(void)
266*552a848eSStefano Babic {
267*552a848eSStefano Babic 	u32 reg;
268*552a848eSStefano Babic 
269*552a848eSStefano Babic 	reg = readl(&mxc_ccm->cbcdr);
270*552a848eSStefano Babic 	if (!(reg & MXC_CCM_CBCDR_PERIPH_CLK_SEL))
271*552a848eSStefano Babic 		return decode_pll(mxc_plls[PLL2_CLOCK], MXC_HCLK);
272*552a848eSStefano Babic 	reg = readl(&mxc_ccm->cbcmr);
273*552a848eSStefano Babic 	switch (MXC_CCM_CBCMR_PERIPH_CLK_SEL_RD(reg)) {
274*552a848eSStefano Babic 	case 0:
275*552a848eSStefano Babic 		return decode_pll(mxc_plls[PLL1_CLOCK], MXC_HCLK);
276*552a848eSStefano Babic 	case 1:
277*552a848eSStefano Babic 		return decode_pll(mxc_plls[PLL3_CLOCK], MXC_HCLK);
278*552a848eSStefano Babic 	case 2:
279*552a848eSStefano Babic 		return get_lp_apm();
280*552a848eSStefano Babic 	default:
281*552a848eSStefano Babic 		return 0;
282*552a848eSStefano Babic 	}
283*552a848eSStefano Babic 	/* NOTREACHED */
284*552a848eSStefano Babic }
285*552a848eSStefano Babic 
286*552a848eSStefano Babic /*
287*552a848eSStefano Babic  * Get the rate of ipg clock.
288*552a848eSStefano Babic  */
get_ipg_clk(void)289*552a848eSStefano Babic static u32 get_ipg_clk(void)
290*552a848eSStefano Babic {
291*552a848eSStefano Babic 	uint32_t freq, reg, div;
292*552a848eSStefano Babic 
293*552a848eSStefano Babic 	freq = get_ahb_clk();
294*552a848eSStefano Babic 
295*552a848eSStefano Babic 	reg = readl(&mxc_ccm->cbcdr);
296*552a848eSStefano Babic 	div = MXC_CCM_CBCDR_IPG_PODF_RD(reg) + 1;
297*552a848eSStefano Babic 
298*552a848eSStefano Babic 	return freq / div;
299*552a848eSStefano Babic }
300*552a848eSStefano Babic 
301*552a848eSStefano Babic /*
302*552a848eSStefano Babic  * Get the rate of ipg_per clock.
303*552a848eSStefano Babic  */
get_ipg_per_clk(void)304*552a848eSStefano Babic static u32 get_ipg_per_clk(void)
305*552a848eSStefano Babic {
306*552a848eSStefano Babic 	u32 freq, pred1, pred2, podf;
307*552a848eSStefano Babic 
308*552a848eSStefano Babic 	if (readl(&mxc_ccm->cbcmr) & MXC_CCM_CBCMR_PERCLK_IPG_CLK_SEL)
309*552a848eSStefano Babic 		return get_ipg_clk();
310*552a848eSStefano Babic 
311*552a848eSStefano Babic 	if (readl(&mxc_ccm->cbcmr) & MXC_CCM_CBCMR_PERCLK_LP_APM_CLK_SEL)
312*552a848eSStefano Babic 		freq = get_lp_apm();
313*552a848eSStefano Babic 	else
314*552a848eSStefano Babic 		freq = get_periph_clk();
315*552a848eSStefano Babic 	podf = readl(&mxc_ccm->cbcdr);
316*552a848eSStefano Babic 	pred1 = MXC_CCM_CBCDR_PERCLK_PRED1_RD(podf);
317*552a848eSStefano Babic 	pred2 = MXC_CCM_CBCDR_PERCLK_PRED2_RD(podf);
318*552a848eSStefano Babic 	podf = MXC_CCM_CBCDR_PERCLK_PODF_RD(podf);
319*552a848eSStefano Babic 	return freq / ((pred1 + 1) * (pred2 + 1) * (podf + 1));
320*552a848eSStefano Babic }
321*552a848eSStefano Babic 
322*552a848eSStefano Babic /* Get the output clock rate of a standard PLL MUX for peripherals. */
get_standard_pll_sel_clk(u32 clk_sel)323*552a848eSStefano Babic static u32 get_standard_pll_sel_clk(u32 clk_sel)
324*552a848eSStefano Babic {
325*552a848eSStefano Babic 	u32 freq = 0;
326*552a848eSStefano Babic 
327*552a848eSStefano Babic 	switch (clk_sel & 0x3) {
328*552a848eSStefano Babic 	case 0:
329*552a848eSStefano Babic 		freq = decode_pll(mxc_plls[PLL1_CLOCK], MXC_HCLK);
330*552a848eSStefano Babic 		break;
331*552a848eSStefano Babic 	case 1:
332*552a848eSStefano Babic 		freq = decode_pll(mxc_plls[PLL2_CLOCK], MXC_HCLK);
333*552a848eSStefano Babic 		break;
334*552a848eSStefano Babic 	case 2:
335*552a848eSStefano Babic 		freq = decode_pll(mxc_plls[PLL3_CLOCK], MXC_HCLK);
336*552a848eSStefano Babic 		break;
337*552a848eSStefano Babic 	case 3:
338*552a848eSStefano Babic 		freq = get_lp_apm();
339*552a848eSStefano Babic 		break;
340*552a848eSStefano Babic 	}
341*552a848eSStefano Babic 
342*552a848eSStefano Babic 	return freq;
343*552a848eSStefano Babic }
344*552a848eSStefano Babic 
345*552a848eSStefano Babic /*
346*552a848eSStefano Babic  * Get the rate of uart clk.
347*552a848eSStefano Babic  */
get_uart_clk(void)348*552a848eSStefano Babic static u32 get_uart_clk(void)
349*552a848eSStefano Babic {
350*552a848eSStefano Babic 	unsigned int clk_sel, freq, reg, pred, podf;
351*552a848eSStefano Babic 
352*552a848eSStefano Babic 	reg = readl(&mxc_ccm->cscmr1);
353*552a848eSStefano Babic 	clk_sel = MXC_CCM_CSCMR1_UART_CLK_SEL_RD(reg);
354*552a848eSStefano Babic 	freq = get_standard_pll_sel_clk(clk_sel);
355*552a848eSStefano Babic 
356*552a848eSStefano Babic 	reg = readl(&mxc_ccm->cscdr1);
357*552a848eSStefano Babic 	pred = MXC_CCM_CSCDR1_UART_CLK_PRED_RD(reg);
358*552a848eSStefano Babic 	podf = MXC_CCM_CSCDR1_UART_CLK_PODF_RD(reg);
359*552a848eSStefano Babic 	freq /= (pred + 1) * (podf + 1);
360*552a848eSStefano Babic 
361*552a848eSStefano Babic 	return freq;
362*552a848eSStefano Babic }
363*552a848eSStefano Babic 
364*552a848eSStefano Babic /*
365*552a848eSStefano Babic  * get cspi clock rate.
366*552a848eSStefano Babic  */
imx_get_cspiclk(void)367*552a848eSStefano Babic static u32 imx_get_cspiclk(void)
368*552a848eSStefano Babic {
369*552a848eSStefano Babic 	u32 ret_val = 0, pdf, pre_pdf, clk_sel, freq;
370*552a848eSStefano Babic 	u32 cscmr1 = readl(&mxc_ccm->cscmr1);
371*552a848eSStefano Babic 	u32 cscdr2 = readl(&mxc_ccm->cscdr2);
372*552a848eSStefano Babic 
373*552a848eSStefano Babic 	pre_pdf = MXC_CCM_CSCDR2_CSPI_CLK_PRED_RD(cscdr2);
374*552a848eSStefano Babic 	pdf = MXC_CCM_CSCDR2_CSPI_CLK_PODF_RD(cscdr2);
375*552a848eSStefano Babic 	clk_sel = MXC_CCM_CSCMR1_CSPI_CLK_SEL_RD(cscmr1);
376*552a848eSStefano Babic 	freq = get_standard_pll_sel_clk(clk_sel);
377*552a848eSStefano Babic 	ret_val = freq / ((pre_pdf + 1) * (pdf + 1));
378*552a848eSStefano Babic 	return ret_val;
379*552a848eSStefano Babic }
380*552a848eSStefano Babic 
381*552a848eSStefano Babic /*
382*552a848eSStefano Babic  * get esdhc clock rate.
383*552a848eSStefano Babic  */
get_esdhc_clk(u32 port)384*552a848eSStefano Babic static u32 get_esdhc_clk(u32 port)
385*552a848eSStefano Babic {
386*552a848eSStefano Babic 	u32 clk_sel = 0, pred = 0, podf = 0, freq = 0;
387*552a848eSStefano Babic 	u32 cscmr1 = readl(&mxc_ccm->cscmr1);
388*552a848eSStefano Babic 	u32 cscdr1 = readl(&mxc_ccm->cscdr1);
389*552a848eSStefano Babic 
390*552a848eSStefano Babic 	switch (port) {
391*552a848eSStefano Babic 	case 0:
392*552a848eSStefano Babic 		clk_sel = MXC_CCM_CSCMR1_ESDHC1_MSHC1_CLK_SEL_RD(cscmr1);
393*552a848eSStefano Babic 		pred = MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PRED_RD(cscdr1);
394*552a848eSStefano Babic 		podf = MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PODF_RD(cscdr1);
395*552a848eSStefano Babic 		break;
396*552a848eSStefano Babic 	case 1:
397*552a848eSStefano Babic 		clk_sel = MXC_CCM_CSCMR1_ESDHC2_MSHC2_CLK_SEL_RD(cscmr1);
398*552a848eSStefano Babic 		pred = MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PRED_RD(cscdr1);
399*552a848eSStefano Babic 		podf = MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PODF_RD(cscdr1);
400*552a848eSStefano Babic 		break;
401*552a848eSStefano Babic 	case 2:
402*552a848eSStefano Babic 		if (cscmr1 & MXC_CCM_CSCMR1_ESDHC3_CLK_SEL)
403*552a848eSStefano Babic 			return get_esdhc_clk(1);
404*552a848eSStefano Babic 		else
405*552a848eSStefano Babic 			return get_esdhc_clk(0);
406*552a848eSStefano Babic 	case 3:
407*552a848eSStefano Babic 		if (cscmr1 & MXC_CCM_CSCMR1_ESDHC4_CLK_SEL)
408*552a848eSStefano Babic 			return get_esdhc_clk(1);
409*552a848eSStefano Babic 		else
410*552a848eSStefano Babic 			return get_esdhc_clk(0);
411*552a848eSStefano Babic 	default:
412*552a848eSStefano Babic 		break;
413*552a848eSStefano Babic 	}
414*552a848eSStefano Babic 
415*552a848eSStefano Babic 	freq = get_standard_pll_sel_clk(clk_sel) / ((pred + 1) * (podf + 1));
416*552a848eSStefano Babic 	return freq;
417*552a848eSStefano Babic }
418*552a848eSStefano Babic 
get_axi_a_clk(void)419*552a848eSStefano Babic static u32 get_axi_a_clk(void)
420*552a848eSStefano Babic {
421*552a848eSStefano Babic 	u32 cbcdr = readl(&mxc_ccm->cbcdr);
422*552a848eSStefano Babic 	u32 pdf = MXC_CCM_CBCDR_AXI_A_PODF_RD(cbcdr);
423*552a848eSStefano Babic 
424*552a848eSStefano Babic 	return  get_periph_clk() / (pdf + 1);
425*552a848eSStefano Babic }
426*552a848eSStefano Babic 
get_axi_b_clk(void)427*552a848eSStefano Babic static u32 get_axi_b_clk(void)
428*552a848eSStefano Babic {
429*552a848eSStefano Babic 	u32 cbcdr = readl(&mxc_ccm->cbcdr);
430*552a848eSStefano Babic 	u32 pdf = MXC_CCM_CBCDR_AXI_B_PODF_RD(cbcdr);
431*552a848eSStefano Babic 
432*552a848eSStefano Babic 	return  get_periph_clk() / (pdf + 1);
433*552a848eSStefano Babic }
434*552a848eSStefano Babic 
get_emi_slow_clk(void)435*552a848eSStefano Babic static u32 get_emi_slow_clk(void)
436*552a848eSStefano Babic {
437*552a848eSStefano Babic 	u32 cbcdr = readl(&mxc_ccm->cbcdr);
438*552a848eSStefano Babic 	u32 emi_clk_sel = cbcdr & MXC_CCM_CBCDR_EMI_CLK_SEL;
439*552a848eSStefano Babic 	u32 pdf = MXC_CCM_CBCDR_EMI_PODF_RD(cbcdr);
440*552a848eSStefano Babic 
441*552a848eSStefano Babic 	if (emi_clk_sel)
442*552a848eSStefano Babic 		return  get_ahb_clk() / (pdf + 1);
443*552a848eSStefano Babic 
444*552a848eSStefano Babic 	return  get_periph_clk() / (pdf + 1);
445*552a848eSStefano Babic }
446*552a848eSStefano Babic 
get_ddr_clk(void)447*552a848eSStefano Babic static u32 get_ddr_clk(void)
448*552a848eSStefano Babic {
449*552a848eSStefano Babic 	u32 ret_val = 0;
450*552a848eSStefano Babic 	u32 cbcmr = readl(&mxc_ccm->cbcmr);
451*552a848eSStefano Babic 	u32 ddr_clk_sel = MXC_CCM_CBCMR_DDR_CLK_SEL_RD(cbcmr);
452*552a848eSStefano Babic #ifdef CONFIG_MX51
453*552a848eSStefano Babic 	u32 cbcdr = readl(&mxc_ccm->cbcdr);
454*552a848eSStefano Babic 	if (cbcdr & MXC_CCM_CBCDR_DDR_HIFREQ_SEL) {
455*552a848eSStefano Babic 		u32 ddr_clk_podf = MXC_CCM_CBCDR_DDR_PODF_RD(cbcdr);
456*552a848eSStefano Babic 
457*552a848eSStefano Babic 		ret_val = decode_pll(mxc_plls[PLL1_CLOCK], MXC_HCLK);
458*552a848eSStefano Babic 		ret_val /= ddr_clk_podf + 1;
459*552a848eSStefano Babic 
460*552a848eSStefano Babic 		return ret_val;
461*552a848eSStefano Babic 	}
462*552a848eSStefano Babic #endif
463*552a848eSStefano Babic 	switch (ddr_clk_sel) {
464*552a848eSStefano Babic 	case 0:
465*552a848eSStefano Babic 		ret_val = get_axi_a_clk();
466*552a848eSStefano Babic 		break;
467*552a848eSStefano Babic 	case 1:
468*552a848eSStefano Babic 		ret_val = get_axi_b_clk();
469*552a848eSStefano Babic 		break;
470*552a848eSStefano Babic 	case 2:
471*552a848eSStefano Babic 		ret_val = get_emi_slow_clk();
472*552a848eSStefano Babic 		break;
473*552a848eSStefano Babic 	case 3:
474*552a848eSStefano Babic 		ret_val = get_ahb_clk();
475*552a848eSStefano Babic 		break;
476*552a848eSStefano Babic 	default:
477*552a848eSStefano Babic 		break;
478*552a848eSStefano Babic 	}
479*552a848eSStefano Babic 
480*552a848eSStefano Babic 	return ret_val;
481*552a848eSStefano Babic }
482*552a848eSStefano Babic 
483*552a848eSStefano Babic /*
484*552a848eSStefano Babic  * The API of get mxc clocks.
485*552a848eSStefano Babic  */
mxc_get_clock(enum mxc_clock clk)486*552a848eSStefano Babic unsigned int mxc_get_clock(enum mxc_clock clk)
487*552a848eSStefano Babic {
488*552a848eSStefano Babic 	switch (clk) {
489*552a848eSStefano Babic 	case MXC_ARM_CLK:
490*552a848eSStefano Babic 		return get_mcu_main_clk();
491*552a848eSStefano Babic 	case MXC_AHB_CLK:
492*552a848eSStefano Babic 		return get_ahb_clk();
493*552a848eSStefano Babic 	case MXC_IPG_CLK:
494*552a848eSStefano Babic 		return get_ipg_clk();
495*552a848eSStefano Babic 	case MXC_IPG_PERCLK:
496*552a848eSStefano Babic 	case MXC_I2C_CLK:
497*552a848eSStefano Babic 		return get_ipg_per_clk();
498*552a848eSStefano Babic 	case MXC_UART_CLK:
499*552a848eSStefano Babic 		return get_uart_clk();
500*552a848eSStefano Babic 	case MXC_CSPI_CLK:
501*552a848eSStefano Babic 		return imx_get_cspiclk();
502*552a848eSStefano Babic 	case MXC_ESDHC_CLK:
503*552a848eSStefano Babic 		return get_esdhc_clk(0);
504*552a848eSStefano Babic 	case MXC_ESDHC2_CLK:
505*552a848eSStefano Babic 		return get_esdhc_clk(1);
506*552a848eSStefano Babic 	case MXC_ESDHC3_CLK:
507*552a848eSStefano Babic 		return get_esdhc_clk(2);
508*552a848eSStefano Babic 	case MXC_ESDHC4_CLK:
509*552a848eSStefano Babic 		return get_esdhc_clk(3);
510*552a848eSStefano Babic 	case MXC_FEC_CLK:
511*552a848eSStefano Babic 		return get_ipg_clk();
512*552a848eSStefano Babic 	case MXC_SATA_CLK:
513*552a848eSStefano Babic 		return get_ahb_clk();
514*552a848eSStefano Babic 	case MXC_DDR_CLK:
515*552a848eSStefano Babic 		return get_ddr_clk();
516*552a848eSStefano Babic 	default:
517*552a848eSStefano Babic 		break;
518*552a848eSStefano Babic 	}
519*552a848eSStefano Babic 	return -EINVAL;
520*552a848eSStefano Babic }
521*552a848eSStefano Babic 
imx_get_uartclk(void)522*552a848eSStefano Babic u32 imx_get_uartclk(void)
523*552a848eSStefano Babic {
524*552a848eSStefano Babic 	return get_uart_clk();
525*552a848eSStefano Babic }
526*552a848eSStefano Babic 
imx_get_fecclk(void)527*552a848eSStefano Babic u32 imx_get_fecclk(void)
528*552a848eSStefano Babic {
529*552a848eSStefano Babic 	return get_ipg_clk();
530*552a848eSStefano Babic }
531*552a848eSStefano Babic 
gcd(int m,int n)532*552a848eSStefano Babic static int gcd(int m, int n)
533*552a848eSStefano Babic {
534*552a848eSStefano Babic 	int t;
535*552a848eSStefano Babic 	while (m > 0) {
536*552a848eSStefano Babic 		if (n > m) {
537*552a848eSStefano Babic 			t = m;
538*552a848eSStefano Babic 			m = n;
539*552a848eSStefano Babic 			n = t;
540*552a848eSStefano Babic 		} /* swap */
541*552a848eSStefano Babic 		m -= n;
542*552a848eSStefano Babic 	}
543*552a848eSStefano Babic 	return n;
544*552a848eSStefano Babic }
545*552a848eSStefano Babic 
546*552a848eSStefano Babic /*
547*552a848eSStefano Babic  * This is to calculate various parameters based on reference clock and
548*552a848eSStefano Babic  * targeted clock based on the equation:
549*552a848eSStefano Babic  *      t_clk = 2*ref_freq*(mfi + mfn/(mfd+1))/(pd+1)
550*552a848eSStefano Babic  * This calculation is based on a fixed MFD value for simplicity.
551*552a848eSStefano Babic  */
calc_pll_params(u32 ref,u32 target,struct pll_param * pll)552*552a848eSStefano Babic static int calc_pll_params(u32 ref, u32 target, struct pll_param *pll)
553*552a848eSStefano Babic {
554*552a848eSStefano Babic 	u64 pd, mfi = 1, mfn, mfd, t1;
555*552a848eSStefano Babic 	u32 n_target = target;
556*552a848eSStefano Babic 	u32 n_ref = ref, i;
557*552a848eSStefano Babic 
558*552a848eSStefano Babic 	/*
559*552a848eSStefano Babic 	 * Make sure targeted freq is in the valid range.
560*552a848eSStefano Babic 	 * Otherwise the following calculation might be wrong!!!
561*552a848eSStefano Babic 	 */
562*552a848eSStefano Babic 	if (n_target < PLL_FREQ_MIN(ref) ||
563*552a848eSStefano Babic 		n_target > PLL_FREQ_MAX(ref)) {
564*552a848eSStefano Babic 		printf("Targeted peripheral clock should be"
565*552a848eSStefano Babic 			"within [%d - %d]\n",
566*552a848eSStefano Babic 			PLL_FREQ_MIN(ref) / SZ_DEC_1M,
567*552a848eSStefano Babic 			PLL_FREQ_MAX(ref) / SZ_DEC_1M);
568*552a848eSStefano Babic 		return -EINVAL;
569*552a848eSStefano Babic 	}
570*552a848eSStefano Babic 
571*552a848eSStefano Babic 	for (i = 0; i < ARRAY_SIZE(fixed_mfd); i++) {
572*552a848eSStefano Babic 		if (fixed_mfd[i].ref_clk_hz == ref) {
573*552a848eSStefano Babic 			mfd = fixed_mfd[i].mfd;
574*552a848eSStefano Babic 			break;
575*552a848eSStefano Babic 		}
576*552a848eSStefano Babic 	}
577*552a848eSStefano Babic 
578*552a848eSStefano Babic 	if (i == ARRAY_SIZE(fixed_mfd))
579*552a848eSStefano Babic 		return -EINVAL;
580*552a848eSStefano Babic 
581*552a848eSStefano Babic 	/* Use n_target and n_ref to avoid overflow */
582*552a848eSStefano Babic 	for (pd = 1; pd <= PLL_PD_MAX; pd++) {
583*552a848eSStefano Babic 		t1 = n_target * pd;
584*552a848eSStefano Babic 		do_div(t1, (4 * n_ref));
585*552a848eSStefano Babic 		mfi = t1;
586*552a848eSStefano Babic 		if (mfi > PLL_MFI_MAX)
587*552a848eSStefano Babic 			return -EINVAL;
588*552a848eSStefano Babic 		else if (mfi < 5)
589*552a848eSStefano Babic 			continue;
590*552a848eSStefano Babic 		break;
591*552a848eSStefano Babic 	}
592*552a848eSStefano Babic 	/*
593*552a848eSStefano Babic 	 * Now got pd and mfi already
594*552a848eSStefano Babic 	 *
595*552a848eSStefano Babic 	 * mfn = (((n_target * pd) / 4 - n_ref * mfi) * mfd) / n_ref;
596*552a848eSStefano Babic 	 */
597*552a848eSStefano Babic 	t1 = n_target * pd;
598*552a848eSStefano Babic 	do_div(t1, 4);
599*552a848eSStefano Babic 	t1 -= n_ref * mfi;
600*552a848eSStefano Babic 	t1 *= mfd;
601*552a848eSStefano Babic 	do_div(t1, n_ref);
602*552a848eSStefano Babic 	mfn = t1;
603*552a848eSStefano Babic 	debug("ref=%d, target=%d, pd=%d," "mfi=%d,mfn=%d, mfd=%d\n",
604*552a848eSStefano Babic 		ref, n_target, (u32)pd, (u32)mfi, (u32)mfn, (u32)mfd);
605*552a848eSStefano Babic 	i = 1;
606*552a848eSStefano Babic 	if (mfn != 0)
607*552a848eSStefano Babic 		i = gcd(mfd, mfn);
608*552a848eSStefano Babic 	pll->pd = (u32)pd;
609*552a848eSStefano Babic 	pll->mfi = (u32)mfi;
610*552a848eSStefano Babic 	do_div(mfn, i);
611*552a848eSStefano Babic 	pll->mfn = (u32)mfn;
612*552a848eSStefano Babic 	do_div(mfd, i);
613*552a848eSStefano Babic 	pll->mfd = (u32)mfd;
614*552a848eSStefano Babic 
615*552a848eSStefano Babic 	return 0;
616*552a848eSStefano Babic }
617*552a848eSStefano Babic 
618*552a848eSStefano Babic #define calc_div(tgt_clk, src_clk, limit) ({		\
619*552a848eSStefano Babic 		u32 v = 0;				\
620*552a848eSStefano Babic 		if (((src_clk) % (tgt_clk)) <= 100)	\
621*552a848eSStefano Babic 			v = (src_clk) / (tgt_clk);	\
622*552a848eSStefano Babic 		else					\
623*552a848eSStefano Babic 			v = ((src_clk) / (tgt_clk)) + 1;\
624*552a848eSStefano Babic 		if (v > limit)				\
625*552a848eSStefano Babic 			v = limit;			\
626*552a848eSStefano Babic 		(v - 1);				\
627*552a848eSStefano Babic 	})
628*552a848eSStefano Babic 
629*552a848eSStefano Babic #define CHANGE_PLL_SETTINGS(pll, pd, fi, fn, fd) \
630*552a848eSStefano Babic 	{	\
631*552a848eSStefano Babic 		writel(0x1232, &pll->ctrl);		\
632*552a848eSStefano Babic 		writel(0x2, &pll->config);		\
633*552a848eSStefano Babic 		writel((((pd) - 1) << 0) | ((fi) << 4),	\
634*552a848eSStefano Babic 			&pll->op);			\
635*552a848eSStefano Babic 		writel(fn, &(pll->mfn));		\
636*552a848eSStefano Babic 		writel((fd) - 1, &pll->mfd);		\
637*552a848eSStefano Babic 		writel((((pd) - 1) << 0) | ((fi) << 4),	\
638*552a848eSStefano Babic 			&pll->hfs_op);			\
639*552a848eSStefano Babic 		writel(fn, &pll->hfs_mfn);		\
640*552a848eSStefano Babic 		writel((fd) - 1, &pll->hfs_mfd);	\
641*552a848eSStefano Babic 		writel(0x1232, &pll->ctrl);		\
642*552a848eSStefano Babic 		while (!readl(&pll->ctrl) & 0x1)	\
643*552a848eSStefano Babic 			;\
644*552a848eSStefano Babic 	}
645*552a848eSStefano Babic 
config_pll_clk(enum pll_clocks index,struct pll_param * pll_param)646*552a848eSStefano Babic static int config_pll_clk(enum pll_clocks index, struct pll_param *pll_param)
647*552a848eSStefano Babic {
648*552a848eSStefano Babic 	u32 ccsr = readl(&mxc_ccm->ccsr);
649*552a848eSStefano Babic 	struct mxc_pll_reg *pll = mxc_plls[index];
650*552a848eSStefano Babic 
651*552a848eSStefano Babic 	switch (index) {
652*552a848eSStefano Babic 	case PLL1_CLOCK:
653*552a848eSStefano Babic 		/* Switch ARM to PLL2 clock */
654*552a848eSStefano Babic 		writel(ccsr | MXC_CCM_CCSR_PLL1_SW_CLK_SEL,
655*552a848eSStefano Babic 				&mxc_ccm->ccsr);
656*552a848eSStefano Babic 		CHANGE_PLL_SETTINGS(pll, pll_param->pd,
657*552a848eSStefano Babic 					pll_param->mfi, pll_param->mfn,
658*552a848eSStefano Babic 					pll_param->mfd);
659*552a848eSStefano Babic 		/* Switch back */
660*552a848eSStefano Babic 		writel(ccsr & ~MXC_CCM_CCSR_PLL1_SW_CLK_SEL,
661*552a848eSStefano Babic 				&mxc_ccm->ccsr);
662*552a848eSStefano Babic 		break;
663*552a848eSStefano Babic 	case PLL2_CLOCK:
664*552a848eSStefano Babic 		/* Switch to pll2 bypass clock */
665*552a848eSStefano Babic 		writel(ccsr | MXC_CCM_CCSR_PLL2_SW_CLK_SEL,
666*552a848eSStefano Babic 				&mxc_ccm->ccsr);
667*552a848eSStefano Babic 		CHANGE_PLL_SETTINGS(pll, pll_param->pd,
668*552a848eSStefano Babic 					pll_param->mfi, pll_param->mfn,
669*552a848eSStefano Babic 					pll_param->mfd);
670*552a848eSStefano Babic 		/* Switch back */
671*552a848eSStefano Babic 		writel(ccsr & ~MXC_CCM_CCSR_PLL2_SW_CLK_SEL,
672*552a848eSStefano Babic 				&mxc_ccm->ccsr);
673*552a848eSStefano Babic 		break;
674*552a848eSStefano Babic 	case PLL3_CLOCK:
675*552a848eSStefano Babic 		/* Switch to pll3 bypass clock */
676*552a848eSStefano Babic 		writel(ccsr | MXC_CCM_CCSR_PLL3_SW_CLK_SEL,
677*552a848eSStefano Babic 				&mxc_ccm->ccsr);
678*552a848eSStefano Babic 		CHANGE_PLL_SETTINGS(pll, pll_param->pd,
679*552a848eSStefano Babic 					pll_param->mfi, pll_param->mfn,
680*552a848eSStefano Babic 					pll_param->mfd);
681*552a848eSStefano Babic 		/* Switch back */
682*552a848eSStefano Babic 		writel(ccsr & ~MXC_CCM_CCSR_PLL3_SW_CLK_SEL,
683*552a848eSStefano Babic 				&mxc_ccm->ccsr);
684*552a848eSStefano Babic 		break;
685*552a848eSStefano Babic #ifdef CONFIG_MX53
686*552a848eSStefano Babic 	case PLL4_CLOCK:
687*552a848eSStefano Babic 		/* Switch to pll4 bypass clock */
688*552a848eSStefano Babic 		writel(ccsr | MXC_CCM_CCSR_PLL4_SW_CLK_SEL,
689*552a848eSStefano Babic 				&mxc_ccm->ccsr);
690*552a848eSStefano Babic 		CHANGE_PLL_SETTINGS(pll, pll_param->pd,
691*552a848eSStefano Babic 					pll_param->mfi, pll_param->mfn,
692*552a848eSStefano Babic 					pll_param->mfd);
693*552a848eSStefano Babic 		/* Switch back */
694*552a848eSStefano Babic 		writel(ccsr & ~MXC_CCM_CCSR_PLL4_SW_CLK_SEL,
695*552a848eSStefano Babic 				&mxc_ccm->ccsr);
696*552a848eSStefano Babic 		break;
697*552a848eSStefano Babic #endif
698*552a848eSStefano Babic 	default:
699*552a848eSStefano Babic 		return -EINVAL;
700*552a848eSStefano Babic 	}
701*552a848eSStefano Babic 
702*552a848eSStefano Babic 	return 0;
703*552a848eSStefano Babic }
704*552a848eSStefano Babic 
705*552a848eSStefano Babic /* Config CPU clock */
config_core_clk(u32 ref,u32 freq)706*552a848eSStefano Babic static int config_core_clk(u32 ref, u32 freq)
707*552a848eSStefano Babic {
708*552a848eSStefano Babic 	int ret = 0;
709*552a848eSStefano Babic 	struct pll_param pll_param;
710*552a848eSStefano Babic 
711*552a848eSStefano Babic 	memset(&pll_param, 0, sizeof(struct pll_param));
712*552a848eSStefano Babic 
713*552a848eSStefano Babic 	/* The case that periph uses PLL1 is not considered here */
714*552a848eSStefano Babic 	ret = calc_pll_params(ref, freq, &pll_param);
715*552a848eSStefano Babic 	if (ret != 0) {
716*552a848eSStefano Babic 		printf("Error:Can't find pll parameters: %d\n", ret);
717*552a848eSStefano Babic 		return ret;
718*552a848eSStefano Babic 	}
719*552a848eSStefano Babic 
720*552a848eSStefano Babic 	return config_pll_clk(PLL1_CLOCK, &pll_param);
721*552a848eSStefano Babic }
722*552a848eSStefano Babic 
config_nfc_clk(u32 nfc_clk)723*552a848eSStefano Babic static int config_nfc_clk(u32 nfc_clk)
724*552a848eSStefano Babic {
725*552a848eSStefano Babic 	u32 parent_rate = get_emi_slow_clk();
726*552a848eSStefano Babic 	u32 div;
727*552a848eSStefano Babic 
728*552a848eSStefano Babic 	if (nfc_clk == 0)
729*552a848eSStefano Babic 		return -EINVAL;
730*552a848eSStefano Babic 	div = parent_rate / nfc_clk;
731*552a848eSStefano Babic 	if (div == 0)
732*552a848eSStefano Babic 		div++;
733*552a848eSStefano Babic 	if (parent_rate / div > NFC_CLK_MAX)
734*552a848eSStefano Babic 		div++;
735*552a848eSStefano Babic 	clrsetbits_le32(&mxc_ccm->cbcdr,
736*552a848eSStefano Babic 			MXC_CCM_CBCDR_NFC_PODF_MASK,
737*552a848eSStefano Babic 			MXC_CCM_CBCDR_NFC_PODF(div - 1));
738*552a848eSStefano Babic 	while (readl(&mxc_ccm->cdhipr) != 0)
739*552a848eSStefano Babic 		;
740*552a848eSStefano Babic 	return 0;
741*552a848eSStefano Babic }
742*552a848eSStefano Babic 
enable_nfc_clk(unsigned char enable)743*552a848eSStefano Babic void enable_nfc_clk(unsigned char enable)
744*552a848eSStefano Babic {
745*552a848eSStefano Babic 	unsigned int cg = enable ? MXC_CCM_CCGR_CG_ON : MXC_CCM_CCGR_CG_OFF;
746*552a848eSStefano Babic 
747*552a848eSStefano Babic 	clrsetbits_le32(&mxc_ccm->CCGR5,
748*552a848eSStefano Babic 		MXC_CCM_CCGR5_EMI_ENFC(MXC_CCM_CCGR_CG_MASK),
749*552a848eSStefano Babic 		MXC_CCM_CCGR5_EMI_ENFC(cg));
750*552a848eSStefano Babic }
751*552a848eSStefano Babic 
752*552a848eSStefano Babic #ifdef CONFIG_FSL_IIM
enable_efuse_prog_supply(bool enable)753*552a848eSStefano Babic void enable_efuse_prog_supply(bool enable)
754*552a848eSStefano Babic {
755*552a848eSStefano Babic 	if (enable)
756*552a848eSStefano Babic 		setbits_le32(&mxc_ccm->cgpr,
757*552a848eSStefano Babic 			     MXC_CCM_CGPR_EFUSE_PROG_SUPPLY_GATE);
758*552a848eSStefano Babic 	else
759*552a848eSStefano Babic 		clrbits_le32(&mxc_ccm->cgpr,
760*552a848eSStefano Babic 			     MXC_CCM_CGPR_EFUSE_PROG_SUPPLY_GATE);
761*552a848eSStefano Babic }
762*552a848eSStefano Babic #endif
763*552a848eSStefano Babic 
764*552a848eSStefano Babic /* Config main_bus_clock for periphs */
config_periph_clk(u32 ref,u32 freq)765*552a848eSStefano Babic static int config_periph_clk(u32 ref, u32 freq)
766*552a848eSStefano Babic {
767*552a848eSStefano Babic 	int ret = 0;
768*552a848eSStefano Babic 	struct pll_param pll_param;
769*552a848eSStefano Babic 
770*552a848eSStefano Babic 	memset(&pll_param, 0, sizeof(struct pll_param));
771*552a848eSStefano Babic 
772*552a848eSStefano Babic 	if (readl(&mxc_ccm->cbcdr) & MXC_CCM_CBCDR_PERIPH_CLK_SEL) {
773*552a848eSStefano Babic 		ret = calc_pll_params(ref, freq, &pll_param);
774*552a848eSStefano Babic 		if (ret != 0) {
775*552a848eSStefano Babic 			printf("Error:Can't find pll parameters: %d\n",
776*552a848eSStefano Babic 				ret);
777*552a848eSStefano Babic 			return ret;
778*552a848eSStefano Babic 		}
779*552a848eSStefano Babic 		switch (MXC_CCM_CBCMR_PERIPH_CLK_SEL_RD(
780*552a848eSStefano Babic 				readl(&mxc_ccm->cbcmr))) {
781*552a848eSStefano Babic 		case 0:
782*552a848eSStefano Babic 			return config_pll_clk(PLL1_CLOCK, &pll_param);
783*552a848eSStefano Babic 			break;
784*552a848eSStefano Babic 		case 1:
785*552a848eSStefano Babic 			return config_pll_clk(PLL3_CLOCK, &pll_param);
786*552a848eSStefano Babic 			break;
787*552a848eSStefano Babic 		default:
788*552a848eSStefano Babic 			return -EINVAL;
789*552a848eSStefano Babic 		}
790*552a848eSStefano Babic 	}
791*552a848eSStefano Babic 
792*552a848eSStefano Babic 	return 0;
793*552a848eSStefano Babic }
794*552a848eSStefano Babic 
config_ddr_clk(u32 emi_clk)795*552a848eSStefano Babic static int config_ddr_clk(u32 emi_clk)
796*552a848eSStefano Babic {
797*552a848eSStefano Babic 	u32 clk_src;
798*552a848eSStefano Babic 	s32 shift = 0, clk_sel, div = 1;
799*552a848eSStefano Babic 	u32 cbcmr = readl(&mxc_ccm->cbcmr);
800*552a848eSStefano Babic 
801*552a848eSStefano Babic 	if (emi_clk > MAX_DDR_CLK) {
802*552a848eSStefano Babic 		printf("Warning:DDR clock should not exceed %d MHz\n",
803*552a848eSStefano Babic 			MAX_DDR_CLK / SZ_DEC_1M);
804*552a848eSStefano Babic 		emi_clk = MAX_DDR_CLK;
805*552a848eSStefano Babic 	}
806*552a848eSStefano Babic 
807*552a848eSStefano Babic 	clk_src = get_periph_clk();
808*552a848eSStefano Babic 	/* Find DDR clock input */
809*552a848eSStefano Babic 	clk_sel = MXC_CCM_CBCMR_DDR_CLK_SEL_RD(cbcmr);
810*552a848eSStefano Babic 	switch (clk_sel) {
811*552a848eSStefano Babic 	case 0:
812*552a848eSStefano Babic 		shift = 16;
813*552a848eSStefano Babic 		break;
814*552a848eSStefano Babic 	case 1:
815*552a848eSStefano Babic 		shift = 19;
816*552a848eSStefano Babic 		break;
817*552a848eSStefano Babic 	case 2:
818*552a848eSStefano Babic 		shift = 22;
819*552a848eSStefano Babic 		break;
820*552a848eSStefano Babic 	case 3:
821*552a848eSStefano Babic 		shift = 10;
822*552a848eSStefano Babic 		break;
823*552a848eSStefano Babic 	default:
824*552a848eSStefano Babic 		return -EINVAL;
825*552a848eSStefano Babic 	}
826*552a848eSStefano Babic 
827*552a848eSStefano Babic 	if ((clk_src % emi_clk) < 10000000)
828*552a848eSStefano Babic 		div = clk_src / emi_clk;
829*552a848eSStefano Babic 	else
830*552a848eSStefano Babic 		div = (clk_src / emi_clk) + 1;
831*552a848eSStefano Babic 	if (div > 8)
832*552a848eSStefano Babic 		div = 8;
833*552a848eSStefano Babic 
834*552a848eSStefano Babic 	clrsetbits_le32(&mxc_ccm->cbcdr, 0x7 << shift, (div - 1) << shift);
835*552a848eSStefano Babic 	while (readl(&mxc_ccm->cdhipr) != 0)
836*552a848eSStefano Babic 		;
837*552a848eSStefano Babic 	writel(0x0, &mxc_ccm->ccdr);
838*552a848eSStefano Babic 
839*552a848eSStefano Babic 	return 0;
840*552a848eSStefano Babic }
841*552a848eSStefano Babic 
842*552a848eSStefano Babic /*
843*552a848eSStefano Babic  * This function assumes the expected core clock has to be changed by
844*552a848eSStefano Babic  * modifying the PLL. This is NOT true always but for most of the times,
845*552a848eSStefano Babic  * it is. So it assumes the PLL output freq is the same as the expected
846*552a848eSStefano Babic  * core clock (presc=1) unless the core clock is less than PLL_FREQ_MIN.
847*552a848eSStefano Babic  * In the latter case, it will try to increase the presc value until
848*552a848eSStefano Babic  * (presc*core_clk) is greater than PLL_FREQ_MIN. It then makes call to
849*552a848eSStefano Babic  * calc_pll_params() and obtains the values of PD, MFI,MFN, MFD based
850*552a848eSStefano Babic  * on the targeted PLL and reference input clock to the PLL. Lastly,
851*552a848eSStefano Babic  * it sets the register based on these values along with the dividers.
852*552a848eSStefano Babic  * Note 1) There is no value checking for the passed-in divider values
853*552a848eSStefano Babic  *         so the caller has to make sure those values are sensible.
854*552a848eSStefano Babic  *      2) Also adjust the NFC divider such that the NFC clock doesn't
855*552a848eSStefano Babic  *         exceed NFC_CLK_MAX.
856*552a848eSStefano Babic  *      3) IPU HSP clock is independent of AHB clock. Even it can go up to
857*552a848eSStefano Babic  *         177MHz for higher voltage, this function fixes the max to 133MHz.
858*552a848eSStefano Babic  *      4) This function should not have allowed diag_printf() calls since
859*552a848eSStefano Babic  *         the serial driver has been stoped. But leave then here to allow
860*552a848eSStefano Babic  *         easy debugging by NOT calling the cyg_hal_plf_serial_stop().
861*552a848eSStefano Babic  */
mxc_set_clock(u32 ref,u32 freq,enum mxc_clock clk)862*552a848eSStefano Babic int mxc_set_clock(u32 ref, u32 freq, enum mxc_clock clk)
863*552a848eSStefano Babic {
864*552a848eSStefano Babic 	freq *= SZ_DEC_1M;
865*552a848eSStefano Babic 
866*552a848eSStefano Babic 	switch (clk) {
867*552a848eSStefano Babic 	case MXC_ARM_CLK:
868*552a848eSStefano Babic 		if (config_core_clk(ref, freq))
869*552a848eSStefano Babic 			return -EINVAL;
870*552a848eSStefano Babic 		break;
871*552a848eSStefano Babic 	case MXC_PERIPH_CLK:
872*552a848eSStefano Babic 		if (config_periph_clk(ref, freq))
873*552a848eSStefano Babic 			return -EINVAL;
874*552a848eSStefano Babic 		break;
875*552a848eSStefano Babic 	case MXC_DDR_CLK:
876*552a848eSStefano Babic 		if (config_ddr_clk(freq))
877*552a848eSStefano Babic 			return -EINVAL;
878*552a848eSStefano Babic 		break;
879*552a848eSStefano Babic 	case MXC_NFC_CLK:
880*552a848eSStefano Babic 		if (config_nfc_clk(freq))
881*552a848eSStefano Babic 			return -EINVAL;
882*552a848eSStefano Babic 		break;
883*552a848eSStefano Babic 	default:
884*552a848eSStefano Babic 		printf("Warning:Unsupported or invalid clock type\n");
885*552a848eSStefano Babic 	}
886*552a848eSStefano Babic 
887*552a848eSStefano Babic 	return 0;
888*552a848eSStefano Babic }
889*552a848eSStefano Babic 
890*552a848eSStefano Babic #ifdef CONFIG_MX53
891*552a848eSStefano Babic /*
892*552a848eSStefano Babic  * The clock for the external interface can be set to use internal clock
893*552a848eSStefano Babic  * if fuse bank 4, row 3, bit 2 is set.
894*552a848eSStefano Babic  * This is an undocumented feature and it was confirmed by Freescale's support:
895*552a848eSStefano Babic  * Fuses (but not pins) may be used to configure SATA clocks.
896*552a848eSStefano Babic  * Particularly the i.MX53 Fuse_Map contains the next information
897*552a848eSStefano Babic  * about configuring SATA clocks :  SATA_ALT_REF_CLK[1:0] (offset 0x180C)
898*552a848eSStefano Babic  * '00' - 100MHz (External)
899*552a848eSStefano Babic  * '01' - 50MHz (External)
900*552a848eSStefano Babic  * '10' - 120MHz, internal (USB PHY)
901*552a848eSStefano Babic  * '11' - Reserved
902*552a848eSStefano Babic */
mxc_set_sata_internal_clock(void)903*552a848eSStefano Babic void mxc_set_sata_internal_clock(void)
904*552a848eSStefano Babic {
905*552a848eSStefano Babic 	u32 *tmp_base =
906*552a848eSStefano Babic 		(u32 *)(IIM_BASE_ADDR + 0x180c);
907*552a848eSStefano Babic 
908*552a848eSStefano Babic 	set_usb_phy_clk();
909*552a848eSStefano Babic 
910*552a848eSStefano Babic 	clrsetbits_le32(tmp_base, 0x6, 0x4);
911*552a848eSStefano Babic }
912*552a848eSStefano Babic #endif
913*552a848eSStefano Babic 
914*552a848eSStefano Babic /*
915*552a848eSStefano Babic  * Dump some core clockes.
916*552a848eSStefano Babic  */
do_mx5_showclocks(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])917*552a848eSStefano Babic int do_mx5_showclocks(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
918*552a848eSStefano Babic {
919*552a848eSStefano Babic 	u32 freq;
920*552a848eSStefano Babic 
921*552a848eSStefano Babic 	freq = decode_pll(mxc_plls[PLL1_CLOCK], MXC_HCLK);
922*552a848eSStefano Babic 	printf("PLL1       %8d MHz\n", freq / 1000000);
923*552a848eSStefano Babic 	freq = decode_pll(mxc_plls[PLL2_CLOCK], MXC_HCLK);
924*552a848eSStefano Babic 	printf("PLL2       %8d MHz\n", freq / 1000000);
925*552a848eSStefano Babic 	freq = decode_pll(mxc_plls[PLL3_CLOCK], MXC_HCLK);
926*552a848eSStefano Babic 	printf("PLL3       %8d MHz\n", freq / 1000000);
927*552a848eSStefano Babic #ifdef	CONFIG_MX53
928*552a848eSStefano Babic 	freq = decode_pll(mxc_plls[PLL4_CLOCK], MXC_HCLK);
929*552a848eSStefano Babic 	printf("PLL4       %8d MHz\n", freq / 1000000);
930*552a848eSStefano Babic #endif
931*552a848eSStefano Babic 
932*552a848eSStefano Babic 	printf("\n");
933*552a848eSStefano Babic 	printf("AHB        %8d kHz\n", mxc_get_clock(MXC_AHB_CLK) / 1000);
934*552a848eSStefano Babic 	printf("IPG        %8d kHz\n", mxc_get_clock(MXC_IPG_CLK) / 1000);
935*552a848eSStefano Babic 	printf("IPG PERCLK %8d kHz\n", mxc_get_clock(MXC_IPG_PERCLK) / 1000);
936*552a848eSStefano Babic 	printf("DDR        %8d kHz\n", mxc_get_clock(MXC_DDR_CLK) / 1000);
937*552a848eSStefano Babic #ifdef CONFIG_MXC_SPI
938*552a848eSStefano Babic 	printf("CSPI       %8d kHz\n", mxc_get_clock(MXC_CSPI_CLK) / 1000);
939*552a848eSStefano Babic #endif
940*552a848eSStefano Babic 	return 0;
941*552a848eSStefano Babic }
942*552a848eSStefano Babic 
943*552a848eSStefano Babic /***************************************************/
944*552a848eSStefano Babic 
945*552a848eSStefano Babic U_BOOT_CMD(
946*552a848eSStefano Babic 	clocks,	CONFIG_SYS_MAXARGS, 1, do_mx5_showclocks,
947*552a848eSStefano Babic 	"display clocks",
948*552a848eSStefano Babic 	""
949*552a848eSStefano Babic );
950