1/*
2 * Copyright 2008-2010 Freescale Semiconductor, Inc. All Rights Reserved.
3 * Copyright (C) 2009-2010 Amit Kucheria <amit.kucheria@canonical.com>
4 *
5 * The code contained herein is licensed under the GNU General Public
6 * License. You may obtain a copy of the GNU General Public License
7 * Version 2 or later at the following locations:
8 *
9 * http://www.opensource.org/licenses/gpl-license.html
10 * http://www.gnu.org/copyleft/gpl.html
11 */
12
13#include <linux/mm.h>
14#include <linux/delay.h>
15#include <linux/clk.h>
16#include <linux/io.h>
17#include <linux/clkdev.h>
18#include <linux/of.h>
19
20#include <asm/div64.h>
21
22#include <mach/hardware.h>
23#include <mach/common.h>
24#include <mach/clock.h>
25
26#include "crm-regs-imx5.h"
27
28/* External clock values passed-in by the board code */
29static unsigned long external_high_reference, external_low_reference;
30static unsigned long oscillator_reference, ckih2_reference;
31
32static struct clk osc_clk;
33static struct clk pll1_main_clk;
34static struct clk pll1_sw_clk;
35static struct clk pll2_sw_clk;
36static struct clk pll3_sw_clk;
37static struct clk mx53_pll4_sw_clk;
38static struct clk lp_apm_clk;
39static struct clk periph_apm_clk;
40static struct clk ahb_clk;
41static struct clk ipg_clk;
42static struct clk usboh3_clk;
43static struct clk emi_fast_clk;
44static struct clk ipu_clk;
45static struct clk mipi_hsc1_clk;
46static struct clk esdhc1_clk;
47static struct clk esdhc2_clk;
48static struct clk esdhc3_mx53_clk;
49
50#define MAX_DPLL_WAIT_TRIES	1000 /* 1000 * udelay(1) = 1ms */
51
52/* calculate best pre and post dividers to get the required divider */
53static void __calc_pre_post_dividers(u32 div, u32 *pre, u32 *post,
54	u32 max_pre, u32 max_post)
55{
56	if (div >= max_pre * max_post) {
57		*pre = max_pre;
58		*post = max_post;
59	} else if (div >= max_pre) {
60		u32 min_pre, temp_pre, old_err, err;
61		min_pre = DIV_ROUND_UP(div, max_post);
62		old_err = max_pre;
63		for (temp_pre = max_pre; temp_pre >= min_pre; temp_pre--) {
64			err = div % temp_pre;
65			if (err == 0) {
66				*pre = temp_pre;
67				break;
68			}
69			err = temp_pre - err;
70			if (err < old_err) {
71				old_err = err;
72				*pre = temp_pre;
73			}
74		}
75		*post = DIV_ROUND_UP(div, *pre);
76	} else {
77		*pre = div;
78		*post = 1;
79	}
80}
81
82static void _clk_ccgr_setclk(struct clk *clk, unsigned mode)
83{
84	u32 reg = __raw_readl(clk->enable_reg);
85
86	reg &= ~(MXC_CCM_CCGRx_CG_MASK << clk->enable_shift);
87	reg |= mode << clk->enable_shift;
88
89	__raw_writel(reg, clk->enable_reg);
90}
91
92static int _clk_ccgr_enable(struct clk *clk)
93{
94	_clk_ccgr_setclk(clk, MXC_CCM_CCGRx_MOD_ON);
95	return 0;
96}
97
98static void _clk_ccgr_disable(struct clk *clk)
99{
100	_clk_ccgr_setclk(clk, MXC_CCM_CCGRx_MOD_OFF);
101}
102
103static int _clk_ccgr_enable_inrun(struct clk *clk)
104{
105	_clk_ccgr_setclk(clk, MXC_CCM_CCGRx_MOD_IDLE);
106	return 0;
107}
108
109static void _clk_ccgr_disable_inwait(struct clk *clk)
110{
111	_clk_ccgr_setclk(clk, MXC_CCM_CCGRx_MOD_IDLE);
112}
113
114/*
115 * For the 4-to-1 muxed input clock
116 */
117static inline u32 _get_mux(struct clk *parent, struct clk *m0,
118			   struct clk *m1, struct clk *m2, struct clk *m3)
119{
120	if (parent == m0)
121		return 0;
122	else if (parent == m1)
123		return 1;
124	else if (parent == m2)
125		return 2;
126	else if (parent == m3)
127		return 3;
128	else
129		BUG();
130
131	return -EINVAL;
132}
133
134static inline void __iomem *_mx51_get_pll_base(struct clk *pll)
135{
136	if (pll == &pll1_main_clk)
137		return MX51_DPLL1_BASE;
138	else if (pll == &pll2_sw_clk)
139		return MX51_DPLL2_BASE;
140	else if (pll == &pll3_sw_clk)
141		return MX51_DPLL3_BASE;
142	else
143		BUG();
144
145	return NULL;
146}
147
148static inline void __iomem *_mx53_get_pll_base(struct clk *pll)
149{
150	if (pll == &pll1_main_clk)
151		return MX53_DPLL1_BASE;
152	else if (pll == &pll2_sw_clk)
153		return MX53_DPLL2_BASE;
154	else if (pll == &pll3_sw_clk)
155		return MX53_DPLL3_BASE;
156	else if (pll == &mx53_pll4_sw_clk)
157		return MX53_DPLL4_BASE;
158	else
159		BUG();
160
161	return NULL;
162}
163
164static inline void __iomem *_get_pll_base(struct clk *pll)
165{
166	if (cpu_is_mx51())
167		return _mx51_get_pll_base(pll);
168	else
169		return _mx53_get_pll_base(pll);
170}
171
172static unsigned long clk_pll_get_rate(struct clk *clk)
173{
174	long mfi, mfn, mfd, pdf, ref_clk, mfn_abs;
175	unsigned long dp_op, dp_mfd, dp_mfn, dp_ctl, pll_hfsm, dbl;
176	void __iomem *pllbase;
177	s64 temp;
178	unsigned long parent_rate;
179
180	parent_rate = clk_get_rate(clk->parent);
181
182	pllbase = _get_pll_base(clk);
183
184	dp_ctl = __raw_readl(pllbase + MXC_PLL_DP_CTL);
185	pll_hfsm = dp_ctl & MXC_PLL_DP_CTL_HFSM;
186	dbl = dp_ctl & MXC_PLL_DP_CTL_DPDCK0_2_EN;
187
188	if (pll_hfsm == 0) {
189		dp_op = __raw_readl(pllbase + MXC_PLL_DP_OP);
190		dp_mfd = __raw_readl(pllbase + MXC_PLL_DP_MFD);
191		dp_mfn = __raw_readl(pllbase + MXC_PLL_DP_MFN);
192	} else {
193		dp_op = __raw_readl(pllbase + MXC_PLL_DP_HFS_OP);
194		dp_mfd = __raw_readl(pllbase + MXC_PLL_DP_HFS_MFD);
195		dp_mfn = __raw_readl(pllbase + MXC_PLL_DP_HFS_MFN);
196	}
197	pdf = dp_op & MXC_PLL_DP_OP_PDF_MASK;
198	mfi = (dp_op & MXC_PLL_DP_OP_MFI_MASK) >> MXC_PLL_DP_OP_MFI_OFFSET;
199	mfi = (mfi <= 5) ? 5 : mfi;
200	mfd = dp_mfd & MXC_PLL_DP_MFD_MASK;
201	mfn = mfn_abs = dp_mfn & MXC_PLL_DP_MFN_MASK;
202	/* Sign extend to 32-bits */
203	if (mfn >= 0x04000000) {
204		mfn |= 0xFC000000;
205		mfn_abs = -mfn;
206	}
207
208	ref_clk = 2 * parent_rate;
209	if (dbl != 0)
210		ref_clk *= 2;
211
212	ref_clk /= (pdf + 1);
213	temp = (u64) ref_clk * mfn_abs;
214	do_div(temp, mfd + 1);
215	if (mfn < 0)
216		temp = -temp;
217	temp = (ref_clk * mfi) + temp;
218
219	return temp;
220}
221
222static int _clk_pll_set_rate(struct clk *clk, unsigned long rate)
223{
224	u32 reg;
225	void __iomem *pllbase;
226
227	long mfi, pdf, mfn, mfd = 999999;
228	s64 temp64;
229	unsigned long quad_parent_rate;
230	unsigned long pll_hfsm, dp_ctl;
231	unsigned long parent_rate;
232
233	parent_rate = clk_get_rate(clk->parent);
234
235	pllbase = _get_pll_base(clk);
236
237	quad_parent_rate = 4 * parent_rate;
238	pdf = mfi = -1;
239	while (++pdf < 16 && mfi < 5)
240		mfi = rate * (pdf+1) / quad_parent_rate;
241	if (mfi > 15)
242		return -EINVAL;
243	pdf--;
244
245	temp64 = rate * (pdf+1) - quad_parent_rate * mfi;
246	do_div(temp64, quad_parent_rate/1000000);
247	mfn = (long)temp64;
248
249	dp_ctl = __raw_readl(pllbase + MXC_PLL_DP_CTL);
250	/* use dpdck0_2 */
251	__raw_writel(dp_ctl | 0x1000L, pllbase + MXC_PLL_DP_CTL);
252	pll_hfsm = dp_ctl & MXC_PLL_DP_CTL_HFSM;
253	if (pll_hfsm == 0) {
254		reg = mfi << 4 | pdf;
255		__raw_writel(reg, pllbase + MXC_PLL_DP_OP);
256		__raw_writel(mfd, pllbase + MXC_PLL_DP_MFD);
257		__raw_writel(mfn, pllbase + MXC_PLL_DP_MFN);
258	} else {
259		reg = mfi << 4 | pdf;
260		__raw_writel(reg, pllbase + MXC_PLL_DP_HFS_OP);
261		__raw_writel(mfd, pllbase + MXC_PLL_DP_HFS_MFD);
262		__raw_writel(mfn, pllbase + MXC_PLL_DP_HFS_MFN);
263	}
264
265	return 0;
266}
267
268static int _clk_pll_enable(struct clk *clk)
269{
270	u32 reg;
271	void __iomem *pllbase;
272	int i = 0;
273
274	pllbase = _get_pll_base(clk);
275	reg = __raw_readl(pllbase + MXC_PLL_DP_CTL);
276	if (reg & MXC_PLL_DP_CTL_UPEN)
277		return 0;
278
279	reg |= MXC_PLL_DP_CTL_UPEN;
280	__raw_writel(reg, pllbase + MXC_PLL_DP_CTL);
281
282	/* Wait for lock */
283	do {
284		reg = __raw_readl(pllbase + MXC_PLL_DP_CTL);
285		if (reg & MXC_PLL_DP_CTL_LRF)
286			break;
287
288		udelay(1);
289	} while (++i < MAX_DPLL_WAIT_TRIES);
290
291	if (i == MAX_DPLL_WAIT_TRIES) {
292		pr_err("MX5: pll locking failed\n");
293		return -EINVAL;
294	}
295
296	return 0;
297}
298
299static void _clk_pll_disable(struct clk *clk)
300{
301	u32 reg;
302	void __iomem *pllbase;
303
304	pllbase = _get_pll_base(clk);
305	reg = __raw_readl(pllbase + MXC_PLL_DP_CTL) & ~MXC_PLL_DP_CTL_UPEN;
306	__raw_writel(reg, pllbase + MXC_PLL_DP_CTL);
307}
308
309static int _clk_pll1_sw_set_parent(struct clk *clk, struct clk *parent)
310{
311	u32 reg, step;
312
313	reg = __raw_readl(MXC_CCM_CCSR);
314
315	/* When switching from pll_main_clk to a bypass clock, first select a
316	 * multiplexed clock in 'step_sel', then shift the glitchless mux
317	 * 'pll1_sw_clk_sel'.
318	 *
319	 * When switching back, do it in reverse order
320	 */
321	if (parent == &pll1_main_clk) {
322		/* Switch to pll1_main_clk */
323		reg &= ~MXC_CCM_CCSR_PLL1_SW_CLK_SEL;
324		__raw_writel(reg, MXC_CCM_CCSR);
325		/* step_clk mux switched to lp_apm, to save power. */
326		reg = __raw_readl(MXC_CCM_CCSR);
327		reg &= ~MXC_CCM_CCSR_STEP_SEL_MASK;
328		reg |= (MXC_CCM_CCSR_STEP_SEL_LP_APM <<
329				MXC_CCM_CCSR_STEP_SEL_OFFSET);
330	} else {
331		if (parent == &lp_apm_clk) {
332			step = MXC_CCM_CCSR_STEP_SEL_LP_APM;
333		} else  if (parent == &pll2_sw_clk) {
334			step = MXC_CCM_CCSR_STEP_SEL_PLL2_DIVIDED;
335		} else  if (parent == &pll3_sw_clk) {
336			step = MXC_CCM_CCSR_STEP_SEL_PLL3_DIVIDED;
337		} else
338			return -EINVAL;
339
340		reg &= ~MXC_CCM_CCSR_STEP_SEL_MASK;
341		reg |= (step << MXC_CCM_CCSR_STEP_SEL_OFFSET);
342
343		__raw_writel(reg, MXC_CCM_CCSR);
344		/* Switch to step_clk */
345		reg = __raw_readl(MXC_CCM_CCSR);
346		reg |= MXC_CCM_CCSR_PLL1_SW_CLK_SEL;
347	}
348	__raw_writel(reg, MXC_CCM_CCSR);
349	return 0;
350}
351
352static unsigned long clk_pll1_sw_get_rate(struct clk *clk)
353{
354	u32 reg, div;
355	unsigned long parent_rate;
356
357	parent_rate = clk_get_rate(clk->parent);
358
359	reg = __raw_readl(MXC_CCM_CCSR);
360
361	if (clk->parent == &pll2_sw_clk) {
362		div = ((reg & MXC_CCM_CCSR_PLL2_PODF_MASK) >>
363		       MXC_CCM_CCSR_PLL2_PODF_OFFSET) + 1;
364	} else if (clk->parent == &pll3_sw_clk) {
365		div = ((reg & MXC_CCM_CCSR_PLL3_PODF_MASK) >>
366		       MXC_CCM_CCSR_PLL3_PODF_OFFSET) + 1;
367	} else
368		div = 1;
369	return parent_rate / div;
370}
371
372static int _clk_pll2_sw_set_parent(struct clk *clk, struct clk *parent)
373{
374	u32 reg;
375
376	reg = __raw_readl(MXC_CCM_CCSR);
377
378	if (parent == &pll2_sw_clk)
379		reg &= ~MXC_CCM_CCSR_PLL2_SW_CLK_SEL;
380	else
381		reg |= MXC_CCM_CCSR_PLL2_SW_CLK_SEL;
382
383	__raw_writel(reg, MXC_CCM_CCSR);
384	return 0;
385}
386
387static int _clk_lp_apm_set_parent(struct clk *clk, struct clk *parent)
388{
389	u32 reg;
390
391	if (parent == &osc_clk)
392		reg = __raw_readl(MXC_CCM_CCSR) & ~MXC_CCM_CCSR_LP_APM_SEL;
393	else
394		return -EINVAL;
395
396	__raw_writel(reg, MXC_CCM_CCSR);
397
398	return 0;
399}
400
401static unsigned long clk_cpu_get_rate(struct clk *clk)
402{
403	u32 cacrr, div;
404	unsigned long parent_rate;
405
406	parent_rate = clk_get_rate(clk->parent);
407	cacrr = __raw_readl(MXC_CCM_CACRR);
408	div = (cacrr & MXC_CCM_CACRR_ARM_PODF_MASK) + 1;
409
410	return parent_rate / div;
411}
412
413static int clk_cpu_set_rate(struct clk *clk, unsigned long rate)
414{
415	u32 reg, cpu_podf;
416	unsigned long parent_rate;
417
418	parent_rate = clk_get_rate(clk->parent);
419	cpu_podf = parent_rate / rate - 1;
420	/* use post divider to change freq */
421	reg = __raw_readl(MXC_CCM_CACRR);
422	reg &= ~MXC_CCM_CACRR_ARM_PODF_MASK;
423	reg |= cpu_podf << MXC_CCM_CACRR_ARM_PODF_OFFSET;
424	__raw_writel(reg, MXC_CCM_CACRR);
425
426	return 0;
427}
428
429static int _clk_periph_apm_set_parent(struct clk *clk, struct clk *parent)
430{
431	u32 reg, mux;
432	int i = 0;
433
434	mux = _get_mux(parent, &pll1_sw_clk, &pll3_sw_clk, &lp_apm_clk, NULL);
435
436	reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_PERIPH_CLK_SEL_MASK;
437	reg |= mux << MXC_CCM_CBCMR_PERIPH_CLK_SEL_OFFSET;
438	__raw_writel(reg, MXC_CCM_CBCMR);
439
440	/* Wait for lock */
441	do {
442		reg = __raw_readl(MXC_CCM_CDHIPR);
443		if (!(reg &  MXC_CCM_CDHIPR_PERIPH_CLK_SEL_BUSY))
444			break;
445
446		udelay(1);
447	} while (++i < MAX_DPLL_WAIT_TRIES);
448
449	if (i == MAX_DPLL_WAIT_TRIES) {
450		pr_err("MX5: Set parent for periph_apm clock failed\n");
451		return -EINVAL;
452	}
453
454	return 0;
455}
456
457static int _clk_main_bus_set_parent(struct clk *clk, struct clk *parent)
458{
459	u32 reg;
460
461	reg = __raw_readl(MXC_CCM_CBCDR);
462
463	if (parent == &pll2_sw_clk)
464		reg &= ~MXC_CCM_CBCDR_PERIPH_CLK_SEL;
465	else if (parent == &periph_apm_clk)
466		reg |= MXC_CCM_CBCDR_PERIPH_CLK_SEL;
467	else
468		return -EINVAL;
469
470	__raw_writel(reg, MXC_CCM_CBCDR);
471
472	return 0;
473}
474
475static struct clk main_bus_clk = {
476	.parent = &pll2_sw_clk,
477	.set_parent = _clk_main_bus_set_parent,
478};
479
480static unsigned long clk_ahb_get_rate(struct clk *clk)
481{
482	u32 reg, div;
483	unsigned long parent_rate;
484
485	parent_rate = clk_get_rate(clk->parent);
486
487	reg = __raw_readl(MXC_CCM_CBCDR);
488	div = ((reg & MXC_CCM_CBCDR_AHB_PODF_MASK) >>
489	       MXC_CCM_CBCDR_AHB_PODF_OFFSET) + 1;
490	return parent_rate / div;
491}
492
493
494static int _clk_ahb_set_rate(struct clk *clk, unsigned long rate)
495{
496	u32 reg, div;
497	unsigned long parent_rate;
498	int i = 0;
499
500	parent_rate = clk_get_rate(clk->parent);
501
502	div = parent_rate / rate;
503	if (div > 8 || div < 1 || ((parent_rate / div) != rate))
504		return -EINVAL;
505
506	reg = __raw_readl(MXC_CCM_CBCDR);
507	reg &= ~MXC_CCM_CBCDR_AHB_PODF_MASK;
508	reg |= (div - 1) << MXC_CCM_CBCDR_AHB_PODF_OFFSET;
509	__raw_writel(reg, MXC_CCM_CBCDR);
510
511	/* Wait for lock */
512	do {
513		reg = __raw_readl(MXC_CCM_CDHIPR);
514		if (!(reg & MXC_CCM_CDHIPR_AHB_PODF_BUSY))
515			break;
516
517		udelay(1);
518	} while (++i < MAX_DPLL_WAIT_TRIES);
519
520	if (i == MAX_DPLL_WAIT_TRIES) {
521		pr_err("MX5: clk_ahb_set_rate failed\n");
522		return -EINVAL;
523	}
524
525	return 0;
526}
527
528static unsigned long _clk_ahb_round_rate(struct clk *clk,
529						unsigned long rate)
530{
531	u32 div;
532	unsigned long parent_rate;
533
534	parent_rate = clk_get_rate(clk->parent);
535
536	div = parent_rate / rate;
537	if (div > 8)
538		div = 8;
539	else if (div == 0)
540		div++;
541	return parent_rate / div;
542}
543
544
545static int _clk_max_enable(struct clk *clk)
546{
547	u32 reg;
548
549	_clk_ccgr_enable(clk);
550
551	/* Handshake with MAX when LPM is entered. */
552	reg = __raw_readl(MXC_CCM_CLPCR);
553	if (cpu_is_mx51())
554		reg &= ~MX51_CCM_CLPCR_BYPASS_MAX_LPM_HS;
555	else if (cpu_is_mx53())
556		reg &= ~MX53_CCM_CLPCR_BYPASS_MAX_LPM_HS;
557	__raw_writel(reg, MXC_CCM_CLPCR);
558
559	return 0;
560}
561
562static void _clk_max_disable(struct clk *clk)
563{
564	u32 reg;
565
566	_clk_ccgr_disable_inwait(clk);
567
568	/* No Handshake with MAX when LPM is entered as its disabled. */
569	reg = __raw_readl(MXC_CCM_CLPCR);
570	if (cpu_is_mx51())
571		reg |= MX51_CCM_CLPCR_BYPASS_MAX_LPM_HS;
572	else if (cpu_is_mx53())
573		reg &= ~MX53_CCM_CLPCR_BYPASS_MAX_LPM_HS;
574	__raw_writel(reg, MXC_CCM_CLPCR);
575}
576
577static unsigned long clk_ipg_get_rate(struct clk *clk)
578{
579	u32 reg, div;
580	unsigned long parent_rate;
581
582	parent_rate = clk_get_rate(clk->parent);
583
584	reg = __raw_readl(MXC_CCM_CBCDR);
585	div = ((reg & MXC_CCM_CBCDR_IPG_PODF_MASK) >>
586	       MXC_CCM_CBCDR_IPG_PODF_OFFSET) + 1;
587
588	return parent_rate / div;
589}
590
591static unsigned long clk_ipg_per_get_rate(struct clk *clk)
592{
593	u32 reg, prediv1, prediv2, podf;
594	unsigned long parent_rate;
595
596	parent_rate = clk_get_rate(clk->parent);
597
598	if (clk->parent == &main_bus_clk || clk->parent == &lp_apm_clk) {
599		/* the main_bus_clk is the one before the DVFS engine */
600		reg = __raw_readl(MXC_CCM_CBCDR);
601		prediv1 = ((reg & MXC_CCM_CBCDR_PERCLK_PRED1_MASK) >>
602			   MXC_CCM_CBCDR_PERCLK_PRED1_OFFSET) + 1;
603		prediv2 = ((reg & MXC_CCM_CBCDR_PERCLK_PRED2_MASK) >>
604			   MXC_CCM_CBCDR_PERCLK_PRED2_OFFSET) + 1;
605		podf = ((reg & MXC_CCM_CBCDR_PERCLK_PODF_MASK) >>
606			MXC_CCM_CBCDR_PERCLK_PODF_OFFSET) + 1;
607		return parent_rate / (prediv1 * prediv2 * podf);
608	} else if (clk->parent == &ipg_clk)
609		return parent_rate;
610	else
611		BUG();
612}
613
614static int _clk_ipg_per_set_parent(struct clk *clk, struct clk *parent)
615{
616	u32 reg;
617
618	reg = __raw_readl(MXC_CCM_CBCMR);
619
620	reg &= ~MXC_CCM_CBCMR_PERCLK_LP_APM_CLK_SEL;
621	reg &= ~MXC_CCM_CBCMR_PERCLK_IPG_CLK_SEL;
622
623	if (parent == &ipg_clk)
624		reg |= MXC_CCM_CBCMR_PERCLK_IPG_CLK_SEL;
625	else if (parent == &lp_apm_clk)
626		reg |= MXC_CCM_CBCMR_PERCLK_LP_APM_CLK_SEL;
627	else if (parent != &main_bus_clk)
628		return -EINVAL;
629
630	__raw_writel(reg, MXC_CCM_CBCMR);
631
632	return 0;
633}
634
635#define clk_nfc_set_parent	NULL
636
637static unsigned long clk_nfc_get_rate(struct clk *clk)
638{
639	unsigned long rate;
640	u32 reg, div;
641
642	reg = __raw_readl(MXC_CCM_CBCDR);
643	div = ((reg & MXC_CCM_CBCDR_NFC_PODF_MASK) >>
644	       MXC_CCM_CBCDR_NFC_PODF_OFFSET) + 1;
645	rate = clk_get_rate(clk->parent) / div;
646	WARN_ON(rate == 0);
647	return rate;
648}
649
650static unsigned long clk_nfc_round_rate(struct clk *clk,
651						unsigned long rate)
652{
653	u32 div;
654	unsigned long parent_rate = clk_get_rate(clk->parent);
655
656	if (!rate)
657		return -EINVAL;
658
659	div = parent_rate / rate;
660
661	if (parent_rate % rate)
662		div++;
663
664	if (div > 8)
665		return -EINVAL;
666
667	return parent_rate / div;
668
669}
670
671static int clk_nfc_set_rate(struct clk *clk, unsigned long rate)
672{
673	u32 reg, div;
674
675	div = clk_get_rate(clk->parent) / rate;
676	if (div == 0)
677		div++;
678	if (((clk_get_rate(clk->parent) / div) != rate) || (div > 8))
679		return -EINVAL;
680
681	reg = __raw_readl(MXC_CCM_CBCDR);
682	reg &= ~MXC_CCM_CBCDR_NFC_PODF_MASK;
683	reg |= (div - 1) << MXC_CCM_CBCDR_NFC_PODF_OFFSET;
684	__raw_writel(reg, MXC_CCM_CBCDR);
685
686	while (__raw_readl(MXC_CCM_CDHIPR) &
687			MXC_CCM_CDHIPR_NFC_IPG_INT_MEM_PODF_BUSY){
688	}
689
690	return 0;
691}
692
693static unsigned long get_high_reference_clock_rate(struct clk *clk)
694{
695	return external_high_reference;
696}
697
698static unsigned long get_low_reference_clock_rate(struct clk *clk)
699{
700	return external_low_reference;
701}
702
703static unsigned long get_oscillator_reference_clock_rate(struct clk *clk)
704{
705	return oscillator_reference;
706}
707
708static unsigned long get_ckih2_reference_clock_rate(struct clk *clk)
709{
710	return ckih2_reference;
711}
712
713static unsigned long clk_emi_slow_get_rate(struct clk *clk)
714{
715	u32 reg, div;
716
717	reg = __raw_readl(MXC_CCM_CBCDR);
718	div = ((reg & MXC_CCM_CBCDR_EMI_PODF_MASK) >>
719	       MXC_CCM_CBCDR_EMI_PODF_OFFSET) + 1;
720
721	return clk_get_rate(clk->parent) / div;
722}
723
724static unsigned long _clk_ddr_hf_get_rate(struct clk *clk)
725{
726	unsigned long rate;
727	u32 reg, div;
728
729	reg = __raw_readl(MXC_CCM_CBCDR);
730	div = ((reg & MXC_CCM_CBCDR_DDR_PODF_MASK) >>
731		MXC_CCM_CBCDR_DDR_PODF_OFFSET) + 1;
732	rate = clk_get_rate(clk->parent) / div;
733
734	return rate;
735}
736
737/* External high frequency clock */
738static struct clk ckih_clk = {
739	.get_rate = get_high_reference_clock_rate,
740};
741
742static struct clk ckih2_clk = {
743	.get_rate = get_ckih2_reference_clock_rate,
744};
745
746static struct clk osc_clk = {
747	.get_rate = get_oscillator_reference_clock_rate,
748};
749
750/* External low frequency (32kHz) clock */
751static struct clk ckil_clk = {
752	.get_rate = get_low_reference_clock_rate,
753};
754
755static struct clk pll1_main_clk = {
756	.parent = &osc_clk,
757	.get_rate = clk_pll_get_rate,
758	.enable = _clk_pll_enable,
759	.disable = _clk_pll_disable,
760};
761
762/* Clock tree block diagram (WIP):
763 * 	CCM: Clock Controller Module
764 *
765 * PLL output -> |
766 *               | CCM Switcher -> CCM_CLK_ROOT_GEN ->
767 * PLL bypass -> |
768 *
769 */
770
771/* PLL1 SW supplies to ARM core */
772static struct clk pll1_sw_clk = {
773	.parent = &pll1_main_clk,
774	.set_parent = _clk_pll1_sw_set_parent,
775	.get_rate = clk_pll1_sw_get_rate,
776};
777
778/* PLL2 SW supplies to AXI/AHB/IP buses */
779static struct clk pll2_sw_clk = {
780	.parent = &osc_clk,
781	.get_rate = clk_pll_get_rate,
782	.set_rate = _clk_pll_set_rate,
783	.set_parent = _clk_pll2_sw_set_parent,
784	.enable = _clk_pll_enable,
785	.disable = _clk_pll_disable,
786};
787
788/* PLL3 SW supplies to serial clocks like USB, SSI, etc. */
789static struct clk pll3_sw_clk = {
790	.parent = &osc_clk,
791	.set_rate = _clk_pll_set_rate,
792	.get_rate = clk_pll_get_rate,
793	.enable = _clk_pll_enable,
794	.disable = _clk_pll_disable,
795};
796
797/* PLL4 SW supplies to LVDS Display Bridge(LDB) */
798static struct clk mx53_pll4_sw_clk = {
799	.parent = &osc_clk,
800	.set_rate = _clk_pll_set_rate,
801	.enable = _clk_pll_enable,
802	.disable = _clk_pll_disable,
803};
804
805/* Low-power Audio Playback Mode clock */
806static struct clk lp_apm_clk = {
807	.parent = &osc_clk,
808	.set_parent = _clk_lp_apm_set_parent,
809};
810
811static struct clk periph_apm_clk = {
812	.parent = &pll1_sw_clk,
813	.set_parent = _clk_periph_apm_set_parent,
814};
815
816static struct clk cpu_clk = {
817	.parent = &pll1_sw_clk,
818	.get_rate = clk_cpu_get_rate,
819	.set_rate = clk_cpu_set_rate,
820};
821
822static struct clk ahb_clk = {
823	.parent = &main_bus_clk,
824	.get_rate = clk_ahb_get_rate,
825	.set_rate = _clk_ahb_set_rate,
826	.round_rate = _clk_ahb_round_rate,
827};
828
829static struct clk iim_clk = {
830	.parent = &ipg_clk,
831	.enable_reg = MXC_CCM_CCGR0,
832	.enable_shift = MXC_CCM_CCGRx_CG15_OFFSET,
833};
834
835/* Main IP interface clock for access to registers */
836static struct clk ipg_clk = {
837	.parent = &ahb_clk,
838	.get_rate = clk_ipg_get_rate,
839};
840
841static struct clk ipg_perclk = {
842	.parent = &lp_apm_clk,
843	.get_rate = clk_ipg_per_get_rate,
844	.set_parent = _clk_ipg_per_set_parent,
845};
846
847static struct clk ahb_max_clk = {
848	.parent = &ahb_clk,
849	.enable_reg = MXC_CCM_CCGR0,
850	.enable_shift = MXC_CCM_CCGRx_CG14_OFFSET,
851	.enable = _clk_max_enable,
852	.disable = _clk_max_disable,
853};
854
855static struct clk aips_tz1_clk = {
856	.parent = &ahb_clk,
857	.secondary = &ahb_max_clk,
858	.enable_reg = MXC_CCM_CCGR0,
859	.enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
860	.enable = _clk_ccgr_enable,
861	.disable = _clk_ccgr_disable_inwait,
862};
863
864static struct clk aips_tz2_clk = {
865	.parent = &ahb_clk,
866	.secondary = &ahb_max_clk,
867	.enable_reg = MXC_CCM_CCGR0,
868	.enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
869	.enable = _clk_ccgr_enable,
870	.disable = _clk_ccgr_disable_inwait,
871};
872
873static struct clk gpc_dvfs_clk = {
874	.enable_reg = MXC_CCM_CCGR5,
875	.enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
876	.enable = _clk_ccgr_enable,
877	.disable = _clk_ccgr_disable,
878};
879
880static struct clk gpt_32k_clk = {
881	.id = 0,
882	.parent = &ckil_clk,
883};
884
885static struct clk dummy_clk = {
886	.id = 0,
887};
888
889static struct clk emi_slow_clk = {
890	.parent = &pll2_sw_clk,
891	.enable_reg = MXC_CCM_CCGR5,
892	.enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
893	.enable = _clk_ccgr_enable,
894	.disable = _clk_ccgr_disable_inwait,
895	.get_rate = clk_emi_slow_get_rate,
896};
897
898static int clk_ipu_enable(struct clk *clk)
899{
900	u32 reg;
901
902	_clk_ccgr_enable(clk);
903
904	/* Enable handshake with IPU when certain clock rates are changed */
905	reg = __raw_readl(MXC_CCM_CCDR);
906	reg &= ~MXC_CCM_CCDR_IPU_HS_MASK;
907	__raw_writel(reg, MXC_CCM_CCDR);
908
909	/* Enable handshake with IPU when LPM is entered */
910	reg = __raw_readl(MXC_CCM_CLPCR);
911	reg &= ~MXC_CCM_CLPCR_BYPASS_IPU_LPM_HS;
912	__raw_writel(reg, MXC_CCM_CLPCR);
913
914	return 0;
915}
916
917static void clk_ipu_disable(struct clk *clk)
918{
919	u32 reg;
920
921	_clk_ccgr_disable(clk);
922
923	/* Disable handshake with IPU whe dividers are changed */
924	reg = __raw_readl(MXC_CCM_CCDR);
925	reg |= MXC_CCM_CCDR_IPU_HS_MASK;
926	__raw_writel(reg, MXC_CCM_CCDR);
927
928	/* Disable handshake with IPU when LPM is entered */
929	reg = __raw_readl(MXC_CCM_CLPCR);
930	reg |= MXC_CCM_CLPCR_BYPASS_IPU_LPM_HS;
931	__raw_writel(reg, MXC_CCM_CLPCR);
932}
933
934static struct clk ahbmux1_clk = {
935	.parent = &ahb_clk,
936	.secondary = &ahb_max_clk,
937	.enable_reg = MXC_CCM_CCGR0,
938	.enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
939	.enable = _clk_ccgr_enable,
940	.disable = _clk_ccgr_disable_inwait,
941};
942
943static struct clk ipu_sec_clk = {
944	.parent = &emi_fast_clk,
945	.secondary = &ahbmux1_clk,
946};
947
948static struct clk ddr_hf_clk = {
949	.parent = &pll1_sw_clk,
950	.get_rate = _clk_ddr_hf_get_rate,
951};
952
953static struct clk ddr_clk = {
954	.parent = &ddr_hf_clk,
955};
956
957/* clock definitions for MIPI HSC unit which has been removed
958 * from documentation, but not from hardware
959 */
960static int _clk_hsc_enable(struct clk *clk)
961{
962	u32 reg;
963
964	_clk_ccgr_enable(clk);
965	/* Handshake with IPU when certain clock rates are changed. */
966	reg = __raw_readl(MXC_CCM_CCDR);
967	reg &= ~MXC_CCM_CCDR_HSC_HS_MASK;
968	__raw_writel(reg, MXC_CCM_CCDR);
969
970	reg = __raw_readl(MXC_CCM_CLPCR);
971	reg &= ~MXC_CCM_CLPCR_BYPASS_HSC_LPM_HS;
972	__raw_writel(reg, MXC_CCM_CLPCR);
973
974	return 0;
975}
976
977static void _clk_hsc_disable(struct clk *clk)
978{
979	u32 reg;
980
981	_clk_ccgr_disable(clk);
982	/* No handshake with HSC as its not enabled. */
983	reg = __raw_readl(MXC_CCM_CCDR);
984	reg |= MXC_CCM_CCDR_HSC_HS_MASK;
985	__raw_writel(reg, MXC_CCM_CCDR);
986
987	reg = __raw_readl(MXC_CCM_CLPCR);
988	reg |= MXC_CCM_CLPCR_BYPASS_HSC_LPM_HS;
989	__raw_writel(reg, MXC_CCM_CLPCR);
990}
991
992static struct clk mipi_hsp_clk = {
993	.parent = &ipu_clk,
994	.enable_reg = MXC_CCM_CCGR4,
995	.enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
996	.enable = _clk_hsc_enable,
997	.disable = _clk_hsc_disable,
998	.secondary = &mipi_hsc1_clk,
999};
1000
1001#define DEFINE_CLOCK_CCGR(name, i, er, es, pfx, p, s)	\
1002	static struct clk name = {			\
1003		.id		= i,			\
1004		.enable_reg	= er,			\
1005		.enable_shift	= es,			\
1006		.get_rate	= pfx##_get_rate,	\
1007		.set_rate	= pfx##_set_rate,	\
1008		.round_rate	= pfx##_round_rate,	\
1009		.set_parent	= pfx##_set_parent,	\
1010		.enable		= _clk_ccgr_enable,	\
1011		.disable	= _clk_ccgr_disable,	\
1012		.parent		= p,			\
1013		.secondary	= s,			\
1014	}
1015
1016#define DEFINE_CLOCK_MAX(name, i, er, es, pfx, p, s)	\
1017	static struct clk name = {			\
1018		.id		= i,			\
1019		.enable_reg	= er,			\
1020		.enable_shift	= es,			\
1021		.get_rate	= pfx##_get_rate,	\
1022		.set_rate	= pfx##_set_rate,	\
1023		.set_parent	= pfx##_set_parent,	\
1024		.enable		= _clk_max_enable,	\
1025		.disable	= _clk_max_disable,	\
1026		.parent		= p,			\
1027		.secondary	= s,			\
1028	}
1029
1030#define CLK_GET_RATE(name, nr, bitsname)				\
1031static unsigned long clk_##name##_get_rate(struct clk *clk)		\
1032{									\
1033	u32 reg, pred, podf;						\
1034									\
1035	reg = __raw_readl(MXC_CCM_CSCDR##nr);				\
1036	pred = (reg & MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PRED_MASK)	\
1037		>> MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PRED_OFFSET;	\
1038	podf = (reg & MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PODF_MASK)	\
1039		>> MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PODF_OFFSET;	\
1040									\
1041	return DIV_ROUND_CLOSEST(clk_get_rate(clk->parent),		\
1042			(pred + 1) * (podf + 1));			\
1043}
1044
1045#define CLK_SET_PARENT(name, nr, bitsname)				\
1046static int clk_##name##_set_parent(struct clk *clk, struct clk *parent)	\
1047{									\
1048	u32 reg, mux;							\
1049									\
1050	mux = _get_mux(parent, &pll1_sw_clk, &pll2_sw_clk,		\
1051			&pll3_sw_clk, &lp_apm_clk);			\
1052	reg = __raw_readl(MXC_CCM_CSCMR##nr) &				\
1053		~MXC_CCM_CSCMR##nr##_##bitsname##_CLK_SEL_MASK;		\
1054	reg |= mux << MXC_CCM_CSCMR##nr##_##bitsname##_CLK_SEL_OFFSET;	\
1055	__raw_writel(reg, MXC_CCM_CSCMR##nr);				\
1056									\
1057	return 0;							\
1058}
1059
1060#define CLK_SET_RATE(name, nr, bitsname)				\
1061static int clk_##name##_set_rate(struct clk *clk, unsigned long rate)	\
1062{									\
1063	u32 reg, div, parent_rate;					\
1064	u32 pre = 0, post = 0;						\
1065									\
1066	parent_rate = clk_get_rate(clk->parent);			\
1067	div = parent_rate / rate;					\
1068									\
1069	if ((parent_rate / div) != rate)				\
1070		return -EINVAL;						\
1071									\
1072	__calc_pre_post_dividers(div, &pre, &post,			\
1073		(MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PRED_MASK >>	\
1074		MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PRED_OFFSET) + 1,	\
1075		(MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PODF_MASK >>	\
1076		MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PODF_OFFSET) + 1);\
1077									\
1078	/* Set sdhc1 clock divider */					\
1079	reg = __raw_readl(MXC_CCM_CSCDR##nr) &				\
1080		~(MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PRED_MASK	\
1081		| MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PODF_MASK);	\
1082	reg |= (post - 1) <<						\
1083		MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PODF_OFFSET;	\
1084	reg |= (pre - 1) <<						\
1085		MXC_CCM_CSCDR##nr##_##bitsname##_CLK_PRED_OFFSET;	\
1086	__raw_writel(reg, MXC_CCM_CSCDR##nr);				\
1087									\
1088	return 0;							\
1089}
1090
1091/* UART */
1092CLK_GET_RATE(uart, 1, UART)
1093CLK_SET_PARENT(uart, 1, UART)
1094
1095static struct clk uart_root_clk = {
1096	.parent = &pll2_sw_clk,
1097	.get_rate = clk_uart_get_rate,
1098	.set_parent = clk_uart_set_parent,
1099};
1100
1101/* USBOH3 */
1102CLK_GET_RATE(usboh3, 1, USBOH3)
1103CLK_SET_PARENT(usboh3, 1, USBOH3)
1104
1105static struct clk usboh3_clk = {
1106	.parent = &pll2_sw_clk,
1107	.get_rate = clk_usboh3_get_rate,
1108	.set_parent = clk_usboh3_set_parent,
1109	.enable = _clk_ccgr_enable,
1110	.disable = _clk_ccgr_disable,
1111	.enable_reg = MXC_CCM_CCGR2,
1112	.enable_shift = MXC_CCM_CCGRx_CG14_OFFSET,
1113};
1114
1115static struct clk usb_ahb_clk = {
1116	.parent = &ipg_clk,
1117	.enable = _clk_ccgr_enable,
1118	.disable = _clk_ccgr_disable,
1119	.enable_reg = MXC_CCM_CCGR2,
1120	.enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
1121};
1122
1123static int clk_usb_phy1_set_parent(struct clk *clk, struct clk *parent)
1124{
1125	u32 reg;
1126
1127	reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USB_PHY_CLK_SEL;
1128
1129	if (parent == &pll3_sw_clk)
1130		reg |= 1 << MXC_CCM_CSCMR1_USB_PHY_CLK_SEL_OFFSET;
1131
1132	__raw_writel(reg, MXC_CCM_CSCMR1);
1133
1134	return 0;
1135}
1136
1137static struct clk usb_phy1_clk = {
1138	.parent = &pll3_sw_clk,
1139	.set_parent = clk_usb_phy1_set_parent,
1140	.enable = _clk_ccgr_enable,
1141	.enable_reg = MXC_CCM_CCGR2,
1142	.enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
1143	.disable = _clk_ccgr_disable,
1144};
1145
1146/* eCSPI */
1147CLK_GET_RATE(ecspi, 2, CSPI)
1148CLK_SET_PARENT(ecspi, 1, CSPI)
1149
1150static struct clk ecspi_main_clk = {
1151	.parent = &pll3_sw_clk,
1152	.get_rate = clk_ecspi_get_rate,
1153	.set_parent = clk_ecspi_set_parent,
1154};
1155
1156/* eSDHC */
1157CLK_GET_RATE(esdhc1, 1, ESDHC1_MSHC1)
1158CLK_SET_PARENT(esdhc1, 1, ESDHC1_MSHC1)
1159CLK_SET_RATE(esdhc1, 1, ESDHC1_MSHC1)
1160
1161/* mx51 specific */
1162CLK_GET_RATE(esdhc2, 1, ESDHC2_MSHC2)
1163CLK_SET_PARENT(esdhc2, 1, ESDHC2_MSHC2)
1164CLK_SET_RATE(esdhc2, 1, ESDHC2_MSHC2)
1165
1166static int clk_esdhc3_set_parent(struct clk *clk, struct clk *parent)
1167{
1168	u32 reg;
1169
1170	reg = __raw_readl(MXC_CCM_CSCMR1);
1171	if (parent == &esdhc1_clk)
1172		reg &= ~MXC_CCM_CSCMR1_ESDHC3_CLK_SEL;
1173	else if (parent == &esdhc2_clk)
1174		reg |= MXC_CCM_CSCMR1_ESDHC3_CLK_SEL;
1175	else
1176		return -EINVAL;
1177	__raw_writel(reg, MXC_CCM_CSCMR1);
1178
1179	return 0;
1180}
1181
1182static int clk_esdhc4_set_parent(struct clk *clk, struct clk *parent)
1183{
1184	u32 reg;
1185
1186	reg = __raw_readl(MXC_CCM_CSCMR1);
1187	if (parent == &esdhc1_clk)
1188		reg &= ~MXC_CCM_CSCMR1_ESDHC4_CLK_SEL;
1189	else if (parent == &esdhc2_clk)
1190		reg |= MXC_CCM_CSCMR1_ESDHC4_CLK_SEL;
1191	else
1192		return -EINVAL;
1193	__raw_writel(reg, MXC_CCM_CSCMR1);
1194
1195	return 0;
1196}
1197
1198/* mx53 specific */
1199static int clk_esdhc2_mx53_set_parent(struct clk *clk, struct clk *parent)
1200{
1201	u32 reg;
1202
1203	reg = __raw_readl(MXC_CCM_CSCMR1);
1204	if (parent == &esdhc1_clk)
1205		reg &= ~MXC_CCM_CSCMR1_ESDHC2_MSHC2_MX53_CLK_SEL;
1206	else if (parent == &esdhc3_mx53_clk)
1207		reg |= MXC_CCM_CSCMR1_ESDHC2_MSHC2_MX53_CLK_SEL;
1208	else
1209		return -EINVAL;
1210	__raw_writel(reg, MXC_CCM_CSCMR1);
1211
1212	return 0;
1213}
1214
1215CLK_GET_RATE(esdhc3_mx53, 1, ESDHC3_MX53)
1216CLK_SET_PARENT(esdhc3_mx53, 1, ESDHC3_MX53)
1217CLK_SET_RATE(esdhc3_mx53, 1, ESDHC3_MX53)
1218
1219static int clk_esdhc4_mx53_set_parent(struct clk *clk, struct clk *parent)
1220{
1221	u32 reg;
1222
1223	reg = __raw_readl(MXC_CCM_CSCMR1);
1224	if (parent == &esdhc1_clk)
1225		reg &= ~MXC_CCM_CSCMR1_ESDHC4_CLK_SEL;
1226	else if (parent == &esdhc3_mx53_clk)
1227		reg |= MXC_CCM_CSCMR1_ESDHC4_CLK_SEL;
1228	else
1229		return -EINVAL;
1230	__raw_writel(reg, MXC_CCM_CSCMR1);
1231
1232	return 0;
1233}
1234
1235#define DEFINE_CLOCK_FULL(name, i, er, es, gr, sr, e, d, p, s)		\
1236	static struct clk name = {					\
1237		.id		= i,					\
1238		.enable_reg	= er,					\
1239		.enable_shift	= es,					\
1240		.get_rate	= gr,					\
1241		.set_rate	= sr,					\
1242		.enable		= e,					\
1243		.disable	= d,					\
1244		.parent		= p,					\
1245		.secondary	= s,					\
1246	}
1247
1248#define DEFINE_CLOCK(name, i, er, es, gr, sr, p, s)			\
1249	DEFINE_CLOCK_FULL(name, i, er, es, gr, sr, _clk_ccgr_enable, _clk_ccgr_disable, p, s)
1250
1251/* Shared peripheral bus arbiter */
1252DEFINE_CLOCK(spba_clk, 0, MXC_CCM_CCGR5, MXC_CCM_CCGRx_CG0_OFFSET,
1253	NULL,  NULL, &ipg_clk, NULL);
1254
1255/* UART */
1256DEFINE_CLOCK(uart1_ipg_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG3_OFFSET,
1257	NULL,  NULL, &ipg_clk, &aips_tz1_clk);
1258DEFINE_CLOCK(uart2_ipg_clk, 1, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG5_OFFSET,
1259	NULL,  NULL, &ipg_clk, &aips_tz1_clk);
1260DEFINE_CLOCK(uart3_ipg_clk, 2, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG7_OFFSET,
1261	NULL,  NULL, &ipg_clk, &spba_clk);
1262DEFINE_CLOCK(uart4_ipg_clk, 3, MXC_CCM_CCGR7, MXC_CCM_CCGRx_CG4_OFFSET,
1263	NULL,  NULL, &ipg_clk, &spba_clk);
1264DEFINE_CLOCK(uart5_ipg_clk, 4, MXC_CCM_CCGR7, MXC_CCM_CCGRx_CG6_OFFSET,
1265	NULL,  NULL, &ipg_clk, &spba_clk);
1266DEFINE_CLOCK(uart1_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG4_OFFSET,
1267	NULL,  NULL, &uart_root_clk, &uart1_ipg_clk);
1268DEFINE_CLOCK(uart2_clk, 1, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG6_OFFSET,
1269	NULL,  NULL, &uart_root_clk, &uart2_ipg_clk);
1270DEFINE_CLOCK(uart3_clk, 2, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG8_OFFSET,
1271	NULL,  NULL, &uart_root_clk, &uart3_ipg_clk);
1272DEFINE_CLOCK(uart4_clk, 3, MXC_CCM_CCGR7, MXC_CCM_CCGRx_CG5_OFFSET,
1273	NULL,  NULL, &uart_root_clk, &uart4_ipg_clk);
1274DEFINE_CLOCK(uart5_clk, 4, MXC_CCM_CCGR7, MXC_CCM_CCGRx_CG7_OFFSET,
1275	NULL,  NULL, &uart_root_clk, &uart5_ipg_clk);
1276
1277/* GPT */
1278DEFINE_CLOCK(gpt_ipg_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG10_OFFSET,
1279	NULL,  NULL, &ipg_clk, NULL);
1280DEFINE_CLOCK(gpt_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG9_OFFSET,
1281	NULL,  NULL, &ipg_clk, &gpt_ipg_clk);
1282
1283DEFINE_CLOCK(pwm1_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG6_OFFSET,
1284	NULL, NULL, &ipg_perclk, NULL);
1285DEFINE_CLOCK(pwm2_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG8_OFFSET,
1286	NULL, NULL, &ipg_perclk, NULL);
1287
1288/* I2C */
1289DEFINE_CLOCK(i2c1_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG9_OFFSET,
1290	NULL, NULL, &ipg_perclk, NULL);
1291DEFINE_CLOCK(i2c2_clk, 1, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG10_OFFSET,
1292	NULL, NULL, &ipg_perclk, NULL);
1293DEFINE_CLOCK(hsi2c_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG11_OFFSET,
1294	NULL, NULL, &ipg_clk, NULL);
1295DEFINE_CLOCK(i2c3_mx53_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG11_OFFSET,
1296	NULL, NULL, &ipg_perclk, NULL);
1297
1298/* FEC */
1299DEFINE_CLOCK(fec_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG12_OFFSET,
1300	NULL,  NULL, &ipg_clk, NULL);
1301
1302/* NFC */
1303DEFINE_CLOCK_CCGR(nfc_clk, 0, MXC_CCM_CCGR5, MXC_CCM_CCGRx_CG10_OFFSET,
1304	clk_nfc, &emi_slow_clk, NULL);
1305
1306/* SSI */
1307DEFINE_CLOCK(ssi1_ipg_clk, 0, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG8_OFFSET,
1308	NULL, NULL, &ipg_clk, NULL);
1309DEFINE_CLOCK(ssi1_clk, 0, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG9_OFFSET,
1310	NULL, NULL, &pll3_sw_clk, &ssi1_ipg_clk);
1311DEFINE_CLOCK(ssi2_ipg_clk, 1, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG10_OFFSET,
1312	NULL, NULL, &ipg_clk, NULL);
1313DEFINE_CLOCK(ssi2_clk, 1, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG11_OFFSET,
1314	NULL, NULL, &pll3_sw_clk, &ssi2_ipg_clk);
1315DEFINE_CLOCK(ssi3_ipg_clk, 2, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG12_OFFSET,
1316	NULL, NULL, &ipg_clk, NULL);
1317DEFINE_CLOCK(ssi3_clk, 2, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG13_OFFSET,
1318	NULL, NULL, &pll3_sw_clk, &ssi3_ipg_clk);
1319
1320/* eCSPI */
1321DEFINE_CLOCK_FULL(ecspi1_ipg_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG9_OFFSET,
1322		NULL, NULL, _clk_ccgr_enable_inrun, _clk_ccgr_disable,
1323		&ipg_clk, &spba_clk);
1324DEFINE_CLOCK(ecspi1_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG10_OFFSET,
1325		NULL, NULL, &ecspi_main_clk, &ecspi1_ipg_clk);
1326DEFINE_CLOCK_FULL(ecspi2_ipg_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG11_OFFSET,
1327		NULL, NULL, _clk_ccgr_enable_inrun, _clk_ccgr_disable,
1328		&ipg_clk, &aips_tz2_clk);
1329DEFINE_CLOCK(ecspi2_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG12_OFFSET,
1330		NULL, NULL, &ecspi_main_clk, &ecspi2_ipg_clk);
1331
1332/* CSPI */
1333DEFINE_CLOCK(cspi_ipg_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG9_OFFSET,
1334		NULL, NULL, &ipg_clk, &aips_tz2_clk);
1335DEFINE_CLOCK(cspi_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG13_OFFSET,
1336		NULL, NULL, &ipg_clk, &cspi_ipg_clk);
1337
1338/* SDMA */
1339DEFINE_CLOCK(sdma_clk, 1, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG15_OFFSET,
1340		NULL, NULL, &ahb_clk, NULL);
1341
1342/* eSDHC */
1343DEFINE_CLOCK_FULL(esdhc1_ipg_clk, 0, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG0_OFFSET,
1344	NULL,  NULL, _clk_max_enable, _clk_max_disable, &ipg_clk, NULL);
1345DEFINE_CLOCK_MAX(esdhc1_clk, 0, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG1_OFFSET,
1346	clk_esdhc1, &pll2_sw_clk, &esdhc1_ipg_clk);
1347DEFINE_CLOCK_FULL(esdhc2_ipg_clk, 1, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG2_OFFSET,
1348	NULL,  NULL, _clk_max_enable, _clk_max_disable, &ipg_clk, NULL);
1349DEFINE_CLOCK_FULL(esdhc3_ipg_clk, 2, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG4_OFFSET,
1350	NULL,  NULL, _clk_max_enable, _clk_max_disable, &ipg_clk, NULL);
1351DEFINE_CLOCK_FULL(esdhc4_ipg_clk, 3, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG6_OFFSET,
1352	NULL,  NULL, _clk_max_enable, _clk_max_disable, &ipg_clk, NULL);
1353
1354/* mx51 specific */
1355DEFINE_CLOCK_MAX(esdhc2_clk, 1, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG3_OFFSET,
1356	clk_esdhc2, &pll2_sw_clk, &esdhc2_ipg_clk);
1357
1358static struct clk esdhc3_clk = {
1359	.id = 2,
1360	.parent = &esdhc1_clk,
1361	.set_parent = clk_esdhc3_set_parent,
1362	.enable_reg = MXC_CCM_CCGR3,
1363	.enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
1364	.enable  = _clk_max_enable,
1365	.disable = _clk_max_disable,
1366	.secondary = &esdhc3_ipg_clk,
1367};
1368static struct clk esdhc4_clk = {
1369	.id = 3,
1370	.parent = &esdhc1_clk,
1371	.set_parent = clk_esdhc4_set_parent,
1372	.enable_reg = MXC_CCM_CCGR3,
1373	.enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
1374	.enable  = _clk_max_enable,
1375	.disable = _clk_max_disable,
1376	.secondary = &esdhc4_ipg_clk,
1377};
1378
1379/* mx53 specific */
1380static struct clk esdhc2_mx53_clk = {
1381	.id = 2,
1382	.parent = &esdhc1_clk,
1383	.set_parent = clk_esdhc2_mx53_set_parent,
1384	.enable_reg = MXC_CCM_CCGR3,
1385	.enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
1386	.enable  = _clk_max_enable,
1387	.disable = _clk_max_disable,
1388	.secondary = &esdhc3_ipg_clk,
1389};
1390
1391DEFINE_CLOCK_MAX(esdhc3_mx53_clk, 2, MXC_CCM_CCGR3, MXC_CCM_CCGRx_CG5_OFFSET,
1392	clk_esdhc3_mx53, &pll2_sw_clk, &esdhc2_ipg_clk);
1393
1394static struct clk esdhc4_mx53_clk = {
1395	.id = 3,
1396	.parent = &esdhc1_clk,
1397	.set_parent = clk_esdhc4_mx53_set_parent,
1398	.enable_reg = MXC_CCM_CCGR3,
1399	.enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
1400	.enable  = _clk_max_enable,
1401	.disable = _clk_max_disable,
1402	.secondary = &esdhc4_ipg_clk,
1403};
1404
1405static struct clk sata_clk = {
1406	.parent = &ipg_clk,
1407	.enable = _clk_max_enable,
1408	.enable_reg = MXC_CCM_CCGR4,
1409	.enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
1410	.disable = _clk_max_disable,
1411};
1412
1413static struct clk ahci_phy_clk = {
1414	.parent = &usb_phy1_clk,
1415};
1416
1417static struct clk ahci_dma_clk = {
1418	.parent = &ahb_clk,
1419};
1420
1421DEFINE_CLOCK(mipi_esc_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG5_OFFSET, NULL, NULL, NULL, &pll2_sw_clk);
1422DEFINE_CLOCK(mipi_hsc2_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG4_OFFSET, NULL, NULL, &mipi_esc_clk, &pll2_sw_clk);
1423DEFINE_CLOCK(mipi_hsc1_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG3_OFFSET, NULL, NULL, &mipi_hsc2_clk, &pll2_sw_clk);
1424
1425/* IPU */
1426DEFINE_CLOCK_FULL(ipu_clk, 0, MXC_CCM_CCGR5, MXC_CCM_CCGRx_CG5_OFFSET,
1427	NULL,  NULL, clk_ipu_enable, clk_ipu_disable, &ahb_clk, &ipu_sec_clk);
1428
1429DEFINE_CLOCK_FULL(emi_fast_clk, 0, MXC_CCM_CCGR5, MXC_CCM_CCGRx_CG7_OFFSET,
1430		NULL, NULL, _clk_ccgr_enable, _clk_ccgr_disable_inwait,
1431		&ddr_clk, NULL);
1432
1433DEFINE_CLOCK(ipu_di0_clk, 0, MXC_CCM_CCGR6, MXC_CCM_CCGRx_CG5_OFFSET,
1434		NULL, NULL, &pll3_sw_clk, NULL);
1435DEFINE_CLOCK(ipu_di1_clk, 0, MXC_CCM_CCGR6, MXC_CCM_CCGRx_CG6_OFFSET,
1436		NULL, NULL, &pll3_sw_clk, NULL);
1437
1438/* PATA */
1439DEFINE_CLOCK(pata_clk, 0, MXC_CCM_CCGR4, MXC_CCM_CCGRx_CG0_OFFSET,
1440		NULL, NULL, &ipg_clk, &spba_clk);
1441
1442#define _REGISTER_CLOCK(d, n, c) \
1443       { \
1444		.dev_id = d, \
1445		.con_id = n, \
1446		.clk = &c,   \
1447       },
1448
1449static struct clk_lookup mx51_lookups[] = {
1450	/* i.mx51 has the i.mx21 type uart */
1451	_REGISTER_CLOCK("imx21-uart.0", NULL, uart1_clk)
1452	_REGISTER_CLOCK("imx21-uart.1", NULL, uart2_clk)
1453	_REGISTER_CLOCK("imx21-uart.2", NULL, uart3_clk)
1454	_REGISTER_CLOCK(NULL, "gpt", gpt_clk)
1455	/* i.mx51 has the i.mx27 type fec */
1456	_REGISTER_CLOCK("imx27-fec.0", NULL, fec_clk)
1457	_REGISTER_CLOCK("mxc_pwm.0", "pwm", pwm1_clk)
1458	_REGISTER_CLOCK("mxc_pwm.1", "pwm", pwm2_clk)
1459	_REGISTER_CLOCK("imx-i2c.0", NULL, i2c1_clk)
1460	_REGISTER_CLOCK("imx-i2c.1", NULL, i2c2_clk)
1461	_REGISTER_CLOCK("imx-i2c.2", NULL, hsi2c_clk)
1462	_REGISTER_CLOCK("mxc-ehci.0", "usb", usboh3_clk)
1463	_REGISTER_CLOCK("mxc-ehci.0", "usb_ahb", usb_ahb_clk)
1464	_REGISTER_CLOCK("mxc-ehci.0", "usb_phy1", usb_phy1_clk)
1465	_REGISTER_CLOCK("mxc-ehci.1", "usb", usboh3_clk)
1466	_REGISTER_CLOCK("mxc-ehci.1", "usb_ahb", usb_ahb_clk)
1467	_REGISTER_CLOCK("mxc-ehci.2", "usb", usboh3_clk)
1468	_REGISTER_CLOCK("mxc-ehci.2", "usb_ahb", usb_ahb_clk)
1469	_REGISTER_CLOCK("fsl-usb2-udc", "usb", usboh3_clk)
1470	_REGISTER_CLOCK("fsl-usb2-udc", "usb_ahb", ahb_clk)
1471	_REGISTER_CLOCK("imx-keypad", NULL, dummy_clk)
1472	_REGISTER_CLOCK("mxc_nand", NULL, nfc_clk)
1473	_REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk)
1474	_REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk)
1475	_REGISTER_CLOCK("imx-ssi.2", NULL, ssi3_clk)
1476	/* i.mx51 has the i.mx35 type sdma */
1477	_REGISTER_CLOCK("imx35-sdma", NULL, sdma_clk)
1478	_REGISTER_CLOCK(NULL, "ckih", ckih_clk)
1479	_REGISTER_CLOCK(NULL, "ckih2", ckih2_clk)
1480	_REGISTER_CLOCK(NULL, "gpt_32k", gpt_32k_clk)
1481	_REGISTER_CLOCK("imx51-ecspi.0", NULL, ecspi1_clk)
1482	_REGISTER_CLOCK("imx51-ecspi.1", NULL, ecspi2_clk)
1483	/* i.mx51 has the i.mx35 type cspi */
1484	_REGISTER_CLOCK("imx35-cspi.0", NULL, cspi_clk)
1485	_REGISTER_CLOCK("sdhci-esdhc-imx51.0", NULL, esdhc1_clk)
1486	_REGISTER_CLOCK("sdhci-esdhc-imx51.1", NULL, esdhc2_clk)
1487	_REGISTER_CLOCK("sdhci-esdhc-imx51.2", NULL, esdhc3_clk)
1488	_REGISTER_CLOCK("sdhci-esdhc-imx51.3", NULL, esdhc4_clk)
1489	_REGISTER_CLOCK(NULL, "cpu_clk", cpu_clk)
1490	_REGISTER_CLOCK(NULL, "iim_clk", iim_clk)
1491	_REGISTER_CLOCK("imx2-wdt.0", NULL, dummy_clk)
1492	_REGISTER_CLOCK("imx2-wdt.1", NULL, dummy_clk)
1493	_REGISTER_CLOCK(NULL, "mipi_hsp", mipi_hsp_clk)
1494	_REGISTER_CLOCK("imx-ipuv3", NULL, ipu_clk)
1495	_REGISTER_CLOCK("imx-ipuv3", "di0", ipu_di0_clk)
1496	_REGISTER_CLOCK("imx-ipuv3", "di1", ipu_di1_clk)
1497	_REGISTER_CLOCK(NULL, "gpc_dvfs", gpc_dvfs_clk)
1498	_REGISTER_CLOCK("pata_imx", NULL, pata_clk)
1499};
1500
1501static struct clk_lookup mx53_lookups[] = {
1502	/* i.mx53 has the i.mx21 type uart */
1503	_REGISTER_CLOCK("imx21-uart.0", NULL, uart1_clk)
1504	_REGISTER_CLOCK("imx21-uart.1", NULL, uart2_clk)
1505	_REGISTER_CLOCK("imx21-uart.2", NULL, uart3_clk)
1506	_REGISTER_CLOCK("imx21-uart.3", NULL, uart4_clk)
1507	_REGISTER_CLOCK("imx21-uart.4", NULL, uart5_clk)
1508	_REGISTER_CLOCK(NULL, "gpt", gpt_clk)
1509	/* i.mx53 has the i.mx25 type fec */
1510	_REGISTER_CLOCK("imx25-fec.0", NULL, fec_clk)
1511	_REGISTER_CLOCK(NULL, "iim_clk", iim_clk)
1512	_REGISTER_CLOCK("imx-i2c.0", NULL, i2c1_clk)
1513	_REGISTER_CLOCK("imx-i2c.1", NULL, i2c2_clk)
1514	_REGISTER_CLOCK("imx-i2c.2", NULL, i2c3_mx53_clk)
1515	/* i.mx53 has the i.mx51 type ecspi */
1516	_REGISTER_CLOCK("imx51-ecspi.0", NULL, ecspi1_clk)
1517	_REGISTER_CLOCK("imx51-ecspi.1", NULL, ecspi2_clk)
1518	/* i.mx53 has the i.mx25 type cspi */
1519	_REGISTER_CLOCK("imx35-cspi.0", NULL, cspi_clk)
1520	_REGISTER_CLOCK("sdhci-esdhc-imx53.0", NULL, esdhc1_clk)
1521	_REGISTER_CLOCK("sdhci-esdhc-imx53.1", NULL, esdhc2_mx53_clk)
1522	_REGISTER_CLOCK("sdhci-esdhc-imx53.2", NULL, esdhc3_mx53_clk)
1523	_REGISTER_CLOCK("sdhci-esdhc-imx53.3", NULL, esdhc4_mx53_clk)
1524	_REGISTER_CLOCK("imx2-wdt.0", NULL, dummy_clk)
1525	_REGISTER_CLOCK("imx2-wdt.1", NULL, dummy_clk)
1526	/* i.mx53 has the i.mx35 type sdma */
1527	_REGISTER_CLOCK("imx35-sdma", NULL, sdma_clk)
1528	_REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk)
1529	_REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk)
1530	_REGISTER_CLOCK("imx-ssi.2", NULL, ssi3_clk)
1531	_REGISTER_CLOCK("imx-keypad", NULL, dummy_clk)
1532	_REGISTER_CLOCK("pata_imx", NULL, pata_clk)
1533	_REGISTER_CLOCK("imx53-ahci.0", "ahci", sata_clk)
1534	_REGISTER_CLOCK("imx53-ahci.0", "ahci_phy", ahci_phy_clk)
1535	_REGISTER_CLOCK("imx53-ahci.0", "ahci_dma", ahci_dma_clk)
1536};
1537
1538static void clk_tree_init(void)
1539{
1540	u32 reg;
1541
1542	ipg_perclk.set_parent(&ipg_perclk, &lp_apm_clk);
1543
1544	/*
1545	 * Initialise the IPG PER CLK dividers to 3. IPG_PER_CLK should be at
1546	 * 8MHz, its derived from lp_apm.
1547	 *
1548	 * FIXME: Verify if true for all boards
1549	 */
1550	reg = __raw_readl(MXC_CCM_CBCDR);
1551	reg &= ~MXC_CCM_CBCDR_PERCLK_PRED1_MASK;
1552	reg &= ~MXC_CCM_CBCDR_PERCLK_PRED2_MASK;
1553	reg &= ~MXC_CCM_CBCDR_PERCLK_PODF_MASK;
1554	reg |= (2 << MXC_CCM_CBCDR_PERCLK_PRED1_OFFSET);
1555	__raw_writel(reg, MXC_CCM_CBCDR);
1556}
1557
1558int __init mx51_clocks_init(unsigned long ckil, unsigned long osc,
1559			unsigned long ckih1, unsigned long ckih2)
1560{
1561	int i;
1562
1563	external_low_reference = ckil;
1564	external_high_reference = ckih1;
1565	ckih2_reference = ckih2;
1566	oscillator_reference = osc;
1567
1568	for (i = 0; i < ARRAY_SIZE(mx51_lookups); i++)
1569		clkdev_add(&mx51_lookups[i]);
1570
1571	clk_tree_init();
1572
1573	clk_enable(&cpu_clk);
1574	clk_enable(&main_bus_clk);
1575
1576	clk_enable(&iim_clk);
1577	imx_print_silicon_rev("i.MX51", mx51_revision());
1578	clk_disable(&iim_clk);
1579
1580	/* move usb_phy_clk to 24MHz */
1581	clk_set_parent(&usb_phy1_clk, &osc_clk);
1582
1583	/* set the usboh3_clk parent to pll2_sw_clk */
1584	clk_set_parent(&usboh3_clk, &pll2_sw_clk);
1585
1586	/* Set SDHC parents to be PLL2 */
1587	clk_set_parent(&esdhc1_clk, &pll2_sw_clk);
1588	clk_set_parent(&esdhc2_clk, &pll2_sw_clk);
1589
1590	/* set SDHC root clock as 166.25MHZ*/
1591	clk_set_rate(&esdhc1_clk, 166250000);
1592	clk_set_rate(&esdhc2_clk, 166250000);
1593
1594	/* System timer */
1595	mxc_timer_init(&gpt_clk, MX51_IO_ADDRESS(MX51_GPT1_BASE_ADDR),
1596		MX51_INT_GPT);
1597	return 0;
1598}
1599
1600int __init mx53_clocks_init(unsigned long ckil, unsigned long osc,
1601			unsigned long ckih1, unsigned long ckih2)
1602{
1603	int i;
1604
1605	external_low_reference = ckil;
1606	external_high_reference = ckih1;
1607	ckih2_reference = ckih2;
1608	oscillator_reference = osc;
1609
1610	for (i = 0; i < ARRAY_SIZE(mx53_lookups); i++)
1611		clkdev_add(&mx53_lookups[i]);
1612
1613	clk_tree_init();
1614
1615	clk_set_parent(&uart_root_clk, &pll3_sw_clk);
1616	clk_enable(&cpu_clk);
1617	clk_enable(&main_bus_clk);
1618
1619	clk_enable(&iim_clk);
1620	imx_print_silicon_rev("i.MX53", mx53_revision());
1621	clk_disable(&iim_clk);
1622
1623	/* Set SDHC parents to be PLL2 */
1624	clk_set_parent(&esdhc1_clk, &pll2_sw_clk);
1625	clk_set_parent(&esdhc3_mx53_clk, &pll2_sw_clk);
1626
1627	/* set SDHC root clock as 200MHZ*/
1628	clk_set_rate(&esdhc1_clk, 200000000);
1629	clk_set_rate(&esdhc3_mx53_clk, 200000000);
1630
1631	/* System timer */
1632	mxc_timer_init(&gpt_clk, MX53_IO_ADDRESS(MX53_GPT1_BASE_ADDR),
1633		MX53_INT_GPT);
1634	return 0;
1635}
1636
1637#ifdef CONFIG_OF
1638static void __init clk_get_freq_dt(unsigned long *ckil, unsigned long *osc,
1639				   unsigned long *ckih1, unsigned long *ckih2)
1640{
1641	struct device_node *np;
1642
1643	/* retrieve the freqency of fixed clocks from device tree */
1644	for_each_compatible_node(np, NULL, "fixed-clock") {
1645		u32 rate;
1646		if (of_property_read_u32(np, "clock-frequency", &rate))
1647			continue;
1648
1649		if (of_device_is_compatible(np, "fsl,imx-ckil"))
1650			*ckil = rate;
1651		else if (of_device_is_compatible(np, "fsl,imx-osc"))
1652			*osc = rate;
1653		else if (of_device_is_compatible(np, "fsl,imx-ckih1"))
1654			*ckih1 = rate;
1655		else if (of_device_is_compatible(np, "fsl,imx-ckih2"))
1656			*ckih2 = rate;
1657	}
1658}
1659
1660int __init mx51_clocks_init_dt(void)
1661{
1662	unsigned long ckil, osc, ckih1, ckih2;
1663
1664	clk_get_freq_dt(&ckil, &osc, &ckih1, &ckih2);
1665	return mx51_clocks_init(ckil, osc, ckih1, ckih2);
1666}
1667
1668int __init mx53_clocks_init_dt(void)
1669{
1670	unsigned long ckil, osc, ckih1, ckih2;
1671
1672	clk_get_freq_dt(&ckil, &osc, &ckih1, &ckih2);
1673	return mx53_clocks_init(ckil, osc, ckih1, ckih2);
1674}
1675#endif
1676