3 * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved.
7 * The code contained herein is licensed under the GNU General Public
8 * License. You may obtain a copy of the GNU General Public License
9 * Version 2 or later at the following locations:
11 * http://www.opensource.org/licenses/gpl-license.html
12 * http://www.gnu.org/copyleft/gpl.html
15 #include <linux/kernel.h>
16 #include <linux/init.h>
17 #include <linux/types.h>
18 #include <linux/time.h>
19 #include <linux/hrtimer.h>
21 #include <linux/errno.h>
22 #include <linux/delay.h>
23 #include <linux/clk.h>
25 #include <linux/clkdev.h>
26 #include <asm/div64.h>
27 #include <mach/hardware.h>
28 #include <mach/common.h>
29 #include <mach/clock.h>
30 #include <mach/mxc_dvfs.h>
32 #include "cpu_op-mx6.h"
34 #ifdef CONFIG_CLK_DEBUG
35 #define __INIT_CLK_DEBUG(n) .name = #n,
37 #define __INIT_CLK_DEBUG(n)
40 extern int mxc_jtag_enabled;
41 extern struct cpu_op *(*get_cpu_op)(int *op);
42 extern int lp_high_freq;
43 extern int lp_med_freq;
45 void __iomem *apll_base;
46 static struct clk pll1_sys_main_clk;
47 static struct clk pll2_528_bus_main_clk;
48 static struct clk pll2_pfd_400M;
49 static struct clk pll3_usb_otg_main_clk;
50 static struct clk pll4_audio_main_clk;
51 static struct clk pll5_video_main_clk;
52 static struct clk pll6_MLB_main_clk;
53 static struct clk pll7_usb_host_main_clk;
54 static struct clk pll8_enet_main_clk;
55 static struct clk apbh_dma_clk;
56 static struct clk openvg_axi_clk;
57 static struct clk enfc_clk;
58 static struct clk ipu1_di_clk_root;
59 static struct clk ipu2_di_clk_root;
60 static struct clk usdhc3_clk;
62 static struct cpu_op *cpu_op_tbl;
65 #define SPIN_DELAY 1000000 /* in nanoseconds */
67 #define AUDIO_VIDEO_MIN_CLK_FREQ 650000000
68 #define AUDIO_VIDEO_MAX_CLK_FREQ 1300000000
70 #define WAIT(exp, timeout) \
72 struct timespec nstimeofday; \
73 struct timespec curtime; \
75 getnstimeofday(&nstimeofday); \
77 getnstimeofday(&curtime); \
78 if ((curtime.tv_nsec - nstimeofday.tv_nsec) > (timeout)) { \
86 /* External clock values passed-in by the board code */
87 static unsigned long external_high_reference, external_low_reference;
88 static unsigned long oscillator_reference, ckih2_reference;
90 static void __calc_pre_post_dividers(u32 max_podf, u32 div, u32 *pre, u32 *post)
92 u32 min_pre, temp_pre, old_err, err;
94 /* Some of the podfs are 3 bits while others are 6 bits.
95 * Handle both cases here.
97 if (div >= 512 && (max_podf == 64)) {
98 /* For pre = 3bits and podf = 6 bits, max divider is 512. */
101 } else if (div >= 64 && (max_podf == 8)) {
102 /* For pre = 3bits and podf = 3 bits, max divider is 64. */
105 } else if (div >= 8) {
106 /* Find the minimum pre-divider for a max podf */
108 min_pre = (div - 1) / (1 << 6) + 1;
110 min_pre = (div - 1) / (1 << 3) + 1;
112 /* Now loop through to find the max pre-divider. */
113 for (temp_pre = 8; temp_pre >= min_pre; temp_pre--) {
114 err = div % temp_pre;
119 err = temp_pre - err;
125 *post = (div + *pre - 1) / *pre;
126 } else if (div < 8) {
132 static int _clk_enable(struct clk *clk)
135 reg = __raw_readl(clk->enable_reg);
136 reg |= MXC_CCM_CCGRx_CG_MASK << clk->enable_shift;
137 __raw_writel(reg, clk->enable_reg);
139 if (clk->flags & AHB_HIGH_SET_POINT)
141 else if (clk->flags & AHB_MED_SET_POINT)
147 static void _clk_disable(struct clk *clk)
150 reg = __raw_readl(clk->enable_reg);
151 reg &= ~(MXC_CCM_CCGRx_CG_MASK << clk->enable_shift);
152 __raw_writel(reg, clk->enable_reg);
154 if (clk->flags & AHB_HIGH_SET_POINT)
156 else if (clk->flags & AHB_MED_SET_POINT)
160 static void _clk_disable_inwait(struct clk *clk)
163 reg = __raw_readl(clk->enable_reg);
164 reg &= ~(MXC_CCM_CCGRx_CG_MASK << clk->enable_shift);
165 reg |= 1 << clk->enable_shift;
166 __raw_writel(reg, clk->enable_reg);
170 * For the 4-to-1 muxed input clock
172 static inline u32 _get_mux(struct clk *parent, struct clk *m0,
173 struct clk *m1, struct clk *m2, struct clk *m3)
177 else if (parent == m1)
179 else if (parent == m2)
181 else if (parent == m3)
189 static inline void __iomem *_get_pll_base(struct clk *pll)
191 if (pll == &pll1_sys_main_clk)
192 return PLL1_SYS_BASE_ADDR;
193 else if (pll == &pll2_528_bus_main_clk)
194 return PLL2_528_BASE_ADDR;
195 else if (pll == &pll3_usb_otg_main_clk)
196 return PLL3_480_USB1_BASE_ADDR;
197 else if (pll == &pll4_audio_main_clk)
198 return PLL4_AUDIO_BASE_ADDR;
199 else if (pll == &pll5_video_main_clk)
200 return PLL5_VIDEO_BASE_ADDR;
201 else if (pll == &pll6_MLB_main_clk)
202 return PLL6_MLB_BASE_ADDR;
203 else if (pll == &pll7_usb_host_main_clk)
204 return PLL7_480_USB2_BASE_ADDR;
205 else if (pll == &pll8_enet_main_clk)
206 return PLL8_ENET_BASE_ADDR;
214 * For the 6-to-1 muxed input clock
216 static inline u32 _get_mux6(struct clk *parent, struct clk *m0, struct clk *m1,
217 struct clk *m2, struct clk *m3, struct clk *m4,
222 else if (parent == m1)
224 else if (parent == m2)
226 else if (parent == m3)
228 else if (parent == m4)
230 else if (parent == m5)
237 static unsigned long get_high_reference_clock_rate(struct clk *clk)
239 return external_high_reference;
242 static unsigned long get_low_reference_clock_rate(struct clk *clk)
244 return external_low_reference;
247 static unsigned long get_oscillator_reference_clock_rate(struct clk *clk)
249 return oscillator_reference;
252 static unsigned long get_ckih2_reference_clock_rate(struct clk *clk)
254 return ckih2_reference;
257 /* External high frequency clock */
258 static struct clk ckih_clk = {
259 __INIT_CLK_DEBUG(ckih_clk)
260 .get_rate = get_high_reference_clock_rate,
263 static struct clk ckih2_clk = {
264 __INIT_CLK_DEBUG(ckih2_clk)
265 .get_rate = get_ckih2_reference_clock_rate,
268 static struct clk osc_clk = {
269 __INIT_CLK_DEBUG(osc_clk)
270 .get_rate = get_oscillator_reference_clock_rate,
273 /* External low frequency (32kHz) clock */
274 static struct clk ckil_clk = {
275 __INIT_CLK_DEBUG(ckil_clk)
276 .get_rate = get_low_reference_clock_rate,
279 static unsigned long pfd_round_rate(struct clk *clk, unsigned long rate)
284 tmp = (u64)clk_get_rate(clk->parent) * 18;
288 frac = frac < 12 ? 12 : frac;
289 frac = frac > 35 ? 35 : frac;
290 tmp = (u64)clk_get_rate(clk->parent) * 18;
295 static unsigned long pfd_get_rate(struct clk *clk)
299 tmp = (u64)clk_get_rate(clk->parent) * 18;
301 if (apbh_dma_clk.usecount == 0)
302 apbh_dma_clk.enable(&apbh_dma_clk);
304 frac = (__raw_readl(clk->enable_reg) >> clk->enable_shift) &
305 ANADIG_PFD_FRAC_MASK;
312 static int pfd_set_rate(struct clk *clk, unsigned long rate)
316 tmp = (u64)clk_get_rate(clk->parent) * 18;
318 if (apbh_dma_clk.usecount == 0)
319 apbh_dma_clk.enable(&apbh_dma_clk);
321 /* Round up the divider so that we don't set a rate
322 * higher than what is requested. */
326 frac = frac < 12 ? 12 : frac;
327 frac = frac > 35 ? 35 : frac;
328 /* clear clk frac bits */
329 __raw_writel(ANADIG_PFD_FRAC_MASK << clk->enable_shift,
330 (int)clk->enable_reg + 8);
331 /* set clk frac bits */
332 __raw_writel(frac << clk->enable_shift,
333 (int)clk->enable_reg + 4);
335 tmp = (u64)clk_get_rate(clk->parent) * 18;
338 if (apbh_dma_clk.usecount == 0)
339 apbh_dma_clk.disable(&apbh_dma_clk);
343 static int _clk_pfd_enable(struct clk *clk)
345 if (apbh_dma_clk.usecount == 0)
346 apbh_dma_clk.enable(&apbh_dma_clk);
348 /* clear clk gate bit */
349 __raw_writel((1 << (clk->enable_shift + 7)),
350 (int)clk->enable_reg + 8);
352 if (apbh_dma_clk.usecount == 0)
353 apbh_dma_clk.disable(&apbh_dma_clk);
358 static void _clk_pfd_disable(struct clk *clk)
360 if (apbh_dma_clk.usecount == 0)
361 apbh_dma_clk.enable(&apbh_dma_clk);
363 /* set clk gate bit */
364 __raw_writel((1 << (clk->enable_shift + 7)),
365 (int)clk->enable_reg + 4);
367 if (apbh_dma_clk.usecount == 0)
368 apbh_dma_clk.disable(&apbh_dma_clk);
371 static int _clk_pll_enable(struct clk *clk)
374 void __iomem *pllbase;
376 pllbase = _get_pll_base(clk);
378 reg = __raw_readl(pllbase);
379 reg &= ~ANADIG_PLL_BYPASS;
380 reg &= ~ANADIG_PLL_POWER_DOWN;
382 /* The 480MHz PLLs have the opposite definition for power bit. */
383 if (clk == &pll3_usb_otg_main_clk || clk == &pll7_usb_host_main_clk)
384 reg |= ANADIG_PLL_POWER_DOWN;
386 __raw_writel(reg, pllbase);
388 /* Wait for PLL to lock */
389 if (!WAIT(__raw_readl(pllbase) & ANADIG_PLL_LOCK,
391 panic("pll enable failed\n");
393 /* Enable the PLL output now*/
394 reg = __raw_readl(pllbase);
395 reg |= ANADIG_PLL_ENABLE;
396 __raw_writel(reg, pllbase);
401 static void _clk_pll_disable(struct clk *clk)
404 void __iomem *pllbase;
406 pllbase = _get_pll_base(clk);
408 reg = __raw_readl(pllbase);
409 reg |= ANADIG_PLL_BYPASS;
410 reg |= ANADIG_PLL_POWER_DOWN;
412 /* The 480MHz PLLs, pll3 & pll7, have the opposite
413 * definition for power bit.
415 if (clk == &pll3_usb_otg_main_clk || clk == &pll7_usb_host_main_clk)
416 reg &= ~ANADIG_PLL_POWER_DOWN;
417 __raw_writel(reg, pllbase);
420 static unsigned long _clk_pll1_main_get_rate(struct clk *clk)
425 div = __raw_readl(PLL1_SYS_BASE_ADDR) & ANADIG_PLL_SYS_DIV_SELECT_MASK;
426 val = (clk_get_rate(clk->parent) * div) / 2;
430 static int _clk_pll1_main_set_rate(struct clk *clk, unsigned long rate)
432 unsigned int reg, div;
434 if (rate < AUDIO_VIDEO_MIN_CLK_FREQ || rate > AUDIO_VIDEO_MAX_CLK_FREQ)
437 div = (rate * 2) / clk_get_rate(clk->parent) ;
439 reg = __raw_readl(PLL1_SYS_BASE_ADDR) & ~ANADIG_PLL_SYS_DIV_SELECT_MASK;
441 __raw_writel(reg, PLL1_SYS_BASE_ADDR);
446 static struct clk pll1_sys_main_clk = {
447 __INIT_CLK_DEBUG(pll1_sys_main_clk)
449 .get_rate = _clk_pll1_main_get_rate,
450 .set_rate = _clk_pll1_main_set_rate,
451 .enable = _clk_pll_enable,
452 .disable = _clk_pll_disable,
455 static int _clk_pll1_sw_set_parent(struct clk *clk, struct clk *parent)
459 reg = __raw_readl(MXC_CCM_CCSR);
461 if (parent == &pll1_sys_main_clk) {
462 reg &= ~MXC_CCM_CCSR_PLL1_SW_CLK_SEL;
463 __raw_writel(reg, MXC_CCM_CCSR);
464 /* Set the step_clk parent to be lp_apm, to save power. */
465 reg = __raw_readl(MXC_CCM_CCSR);
466 reg = (reg & ~MXC_CCM_CCSR_STEP_SEL);
468 /* Set STEP_CLK to be the parent*/
469 if (parent == &osc_clk) {
470 /* Set STEP_CLK to be sourced from LPAPM. */
471 reg = __raw_readl(MXC_CCM_CCSR);
472 reg = (reg & ~MXC_CCM_CCSR_STEP_SEL);
473 __raw_writel(reg, MXC_CCM_CCSR);
475 /* Set STEP_CLK to be sourced from PLL2-PDF (400MHz). */
476 reg = __raw_readl(MXC_CCM_CCSR);
477 reg |= MXC_CCM_CCSR_STEP_SEL;
478 __raw_writel(reg, MXC_CCM_CCSR);
481 reg = __raw_readl(MXC_CCM_CCSR);
482 reg |= MXC_CCM_CCSR_PLL1_SW_CLK_SEL;
484 __raw_writel(reg, MXC_CCM_CCSR);
488 static unsigned long _clk_pll1_sw_get_rate(struct clk *clk)
490 return clk_get_rate(clk->parent);
493 static struct clk pll1_sw_clk = {
494 __INIT_CLK_DEBUG(pll1_sw_clk)
495 .parent = &pll1_sys_main_clk,
496 .set_parent = _clk_pll1_sw_set_parent,
497 .get_rate = _clk_pll1_sw_get_rate,
500 static unsigned long _clk_pll2_main_get_rate(struct clk *clk)
505 div = __raw_readl(PLL2_528_BASE_ADDR) & ANADIG_PLL_528_DIV_SELECT;
508 val = clk_get_rate(clk->parent) * 22;
511 val = clk_get_rate(clk->parent) * 20;
516 static int _clk_pll2_main_set_rate(struct clk *clk, unsigned long rate)
518 unsigned int reg, div;
520 if (rate == 528000000)
522 else if (rate == 480000000)
527 reg = __raw_readl(PLL2_528_BASE_ADDR);
528 reg &= ~ANADIG_PLL_528_DIV_SELECT;
530 __raw_writel(reg, PLL2_528_BASE_ADDR);
535 static struct clk pll2_528_bus_main_clk = {
536 __INIT_CLK_DEBUG(pll2_528_bus_main_clk)
538 .get_rate = _clk_pll2_main_get_rate,
539 .set_rate = _clk_pll2_main_set_rate,
540 .enable = _clk_pll_enable,
541 .disable = _clk_pll_disable,
544 static struct clk pll2_pfd_400M = {
545 __INIT_CLK_DEBUG(pll2_pfd_400M)
546 .parent = &pll2_528_bus_main_clk,
547 .enable_reg = (void *)PFD_528_BASE_ADDR,
548 .enable_shift = ANADIG_PFD2_FRAC_OFFSET,
549 .enable = _clk_pfd_enable,
550 .disable = _clk_pfd_disable,
551 .get_rate = pfd_get_rate,
552 .set_rate = pfd_set_rate,
553 .get_rate = pfd_get_rate,
554 .round_rate = pfd_round_rate,
557 static struct clk pll2_pfd_352M = {
558 __INIT_CLK_DEBUG(pll2_pfd_352M)
559 .parent = &pll2_528_bus_main_clk,
560 .enable_reg = (void *)PFD_528_BASE_ADDR,
561 .enable_shift = ANADIG_PFD0_FRAC_OFFSET,
562 .enable = _clk_pfd_enable,
563 .disable = _clk_pfd_disable,
564 .set_rate = pfd_set_rate,
565 .get_rate = pfd_get_rate,
566 .round_rate = pfd_round_rate,
569 static struct clk pll2_pfd_594M = {
570 __INIT_CLK_DEBUG(pll2_pfd_594M)
571 .parent = &pll2_528_bus_main_clk,
572 .enable_reg = (void *)PFD_528_BASE_ADDR,
573 .enable_shift = ANADIG_PFD1_FRAC_OFFSET,
574 .enable = _clk_pfd_enable,
575 .disable = _clk_pfd_disable,
576 .set_rate = pfd_set_rate,
577 .get_rate = pfd_get_rate,
578 .round_rate = pfd_round_rate,
581 static unsigned long _clk_pll2_200M_get_rate(struct clk *clk)
583 return clk_get_rate(clk->parent) / 2;
586 static struct clk pll2_200M = {
587 __INIT_CLK_DEBUG(pll2_200M)
588 .parent = &pll2_pfd_400M,
589 .get_rate = _clk_pll2_200M_get_rate,
592 static unsigned long _clk_pll3_usb_otg_get_rate(struct clk *clk)
597 div = __raw_readl(PLL3_480_USB1_BASE_ADDR)
598 & ANADIG_PLL_480_DIV_SELECT_MASK;
601 val = clk_get_rate(clk->parent) * 22;
603 val = clk_get_rate(clk->parent) * 20;
607 static int _clk_pll3_usb_otg_set_rate(struct clk *clk, unsigned long rate)
609 unsigned int reg, div;
611 if (rate == 528000000)
613 else if (rate == 480000000)
618 reg = __raw_readl(PLL3_480_USB1_BASE_ADDR);
619 reg &= ~ANADIG_PLL_480_DIV_SELECT_MASK;
621 __raw_writel(reg, PLL3_480_USB1_BASE_ADDR);
627 /* same as pll3_main_clk. These two clocks should always be the same */
628 static struct clk pll3_usb_otg_main_clk = {
629 __INIT_CLK_DEBUG(pll3_usb_otg_main_clk)
631 .enable = _clk_pll_enable,
632 .disable = _clk_pll_disable,
633 .set_rate = _clk_pll3_usb_otg_set_rate,
634 .get_rate = _clk_pll3_usb_otg_get_rate,
637 static struct clk usb_phy1_clk = {
638 __INIT_CLK_DEBUG(usb_phy1_clk)
639 .parent = &pll3_usb_otg_main_clk,
640 .set_rate = _clk_pll3_usb_otg_set_rate,
641 .get_rate = _clk_pll3_usb_otg_get_rate,
644 static struct clk pll3_pfd_508M = {
645 __INIT_CLK_DEBUG(pll3_pfd_508M)
646 .parent = &pll3_usb_otg_main_clk,
647 .enable_reg = (void *)PFD_480_BASE_ADDR,
648 .enable_shift = ANADIG_PFD2_FRAC_OFFSET,
649 .enable = _clk_pfd_enable,
650 .disable = _clk_pfd_disable,
651 .set_rate = pfd_set_rate,
652 .get_rate = pfd_get_rate,
653 .round_rate = pfd_round_rate,
656 static struct clk pll3_pfd_454M = {
657 __INIT_CLK_DEBUG(pll3_pfd_454M)
658 .parent = &pll3_usb_otg_main_clk,
659 .enable_reg = (void *)PFD_480_BASE_ADDR,
660 .enable_shift = ANADIG_PFD3_FRAC_OFFSET,
661 .enable = _clk_pfd_enable,
662 .disable = _clk_pfd_disable,
663 .set_rate = pfd_set_rate,
664 .get_rate = pfd_get_rate,
665 .round_rate = pfd_round_rate,
668 static struct clk pll3_pfd_720M = {
669 __INIT_CLK_DEBUG(pll3_pfd_720M)
670 .parent = &pll3_usb_otg_main_clk,
671 .enable_reg = (void *)PFD_480_BASE_ADDR,
672 .enable_shift = ANADIG_PFD0_FRAC_OFFSET,
673 .enable = _clk_pfd_enable,
674 .disable = _clk_pfd_disable,
675 .set_rate = pfd_set_rate,
676 .get_rate = pfd_get_rate,
677 .round_rate = pfd_round_rate,
680 static struct clk pll3_pfd_540M = {
681 __INIT_CLK_DEBUG(pll3_pfd_540M)
682 .parent = &pll3_usb_otg_main_clk,
683 .enable_reg = (void *)PFD_480_BASE_ADDR,
684 .enable_shift = ANADIG_PFD1_FRAC_OFFSET,
685 .enable = _clk_pfd_enable,
686 .disable = _clk_pfd_disable,
687 .set_rate = pfd_set_rate,
688 .get_rate = pfd_get_rate,
689 .round_rate = pfd_round_rate,
690 .get_rate = pfd_get_rate,
693 static unsigned long _clk_pll3_sw_get_rate(struct clk *clk)
695 return clk_get_rate(clk->parent);
698 /* same as pll3_main_clk. These two clocks should always be the same */
699 static struct clk pll3_sw_clk = {
700 __INIT_CLK_DEBUG(pll3_sw_clk)
701 .parent = &pll3_usb_otg_main_clk,
702 .get_rate = _clk_pll3_sw_get_rate,
705 static unsigned long _clk_pll3_120M_get_rate(struct clk *clk)
707 return clk_get_rate(clk->parent) / 4;
710 static struct clk pll3_120M = {
711 __INIT_CLK_DEBUG(pll3_120M)
712 .parent = &pll3_sw_clk,
713 .get_rate = _clk_pll3_120M_get_rate,
716 static unsigned long _clk_pll3_80M_get_rate(struct clk *clk)
718 return clk_get_rate(clk->parent) / 6;
721 static struct clk pll3_80M = {
722 __INIT_CLK_DEBUG(pll3_80M)
723 .parent = &pll3_sw_clk,
724 .get_rate = _clk_pll3_80M_get_rate,
727 static unsigned long _clk_pll3_60M_get_rate(struct clk *clk)
729 return clk_get_rate(clk->parent) / 8;
732 static struct clk pll3_60M = {
733 __INIT_CLK_DEBUG(pll3_60M)
734 .parent = &pll3_sw_clk,
735 .get_rate = _clk_pll3_60M_get_rate,
738 static unsigned long _clk_audio_video_get_rate(struct clk *clk)
740 unsigned int div, mfn, mfd;
742 unsigned int parent_rate = clk_get_rate(clk->parent);
743 void __iomem *pllbase;
745 if (clk == &pll4_audio_main_clk)
746 pllbase = PLL4_AUDIO_BASE_ADDR;
748 pllbase = PLL5_VIDEO_BASE_ADDR;
750 div = __raw_readl(pllbase) & ANADIG_PLL_SYS_DIV_SELECT_MASK;
751 mfn = __raw_readl(pllbase + PLL_NUM_DIV_OFFSET);
752 mfd = __raw_readl(pllbase + PLL_DENOM_DIV_OFFSET);
754 rate = (parent_rate * div) + ((parent_rate / mfd) * mfn);
759 static int _clk_audio_video_set_rate(struct clk *clk, unsigned long rate)
761 unsigned int reg, div;
762 unsigned int mfn, mfd = 1000000;
764 unsigned int parent_rate = clk_get_rate(clk->parent);
765 void __iomem *pllbase;
767 if ((rate < AUDIO_VIDEO_MIN_CLK_FREQ) ||
768 (rate > AUDIO_VIDEO_MAX_CLK_FREQ))
771 if (clk == &pll4_audio_main_clk)
772 pllbase = PLL4_AUDIO_BASE_ADDR;
774 pllbase = PLL5_VIDEO_BASE_ADDR;
776 div = rate / parent_rate ;
777 temp64 = (u64) (rate - (div * parent_rate));
779 do_div(temp64, parent_rate);
782 reg = __raw_readl(pllbase) & ~ANADIG_PLL_SYS_DIV_SELECT_MASK;
784 __raw_writel(reg, pllbase);
785 __raw_writel(mfn, pllbase + PLL_NUM_DIV_OFFSET);
786 __raw_writel(mfd, pllbase + PLL_DENOM_DIV_OFFSET);
791 static unsigned long _clk_audio_video_round_rate(struct clk *clk,
794 if (rate < AUDIO_VIDEO_MIN_CLK_FREQ)
795 return AUDIO_VIDEO_MIN_CLK_FREQ;
797 if (rate > AUDIO_VIDEO_MAX_CLK_FREQ)
798 return AUDIO_VIDEO_MAX_CLK_FREQ;
804 static struct clk pll4_audio_main_clk = {
805 __INIT_CLK_DEBUG(pll4_audio_main_clk)
807 .enable = _clk_pll_enable,
808 .disable = _clk_pll_disable,
809 .set_rate = _clk_audio_video_set_rate,
810 .get_rate = _clk_audio_video_get_rate,
811 .round_rate = _clk_audio_video_round_rate,
815 static struct clk pll5_video_main_clk = {
816 __INIT_CLK_DEBUG(pll5_video_main_clk)
818 .enable = _clk_pll_enable,
819 .disable = _clk_pll_disable,
820 .set_rate = _clk_audio_video_set_rate,
821 .get_rate = _clk_audio_video_get_rate,
822 .round_rate = _clk_audio_video_round_rate,
825 static struct clk pll6_MLB_main_clk = {
826 __INIT_CLK_DEBUG(pll6_MLB_main_clk)
828 .enable = _clk_pll_enable,
829 .disable = _clk_pll_disable,
832 static unsigned long _clk_pll7_usb_otg_get_rate(struct clk *clk)
837 div = __raw_readl(PLL7_480_USB2_BASE_ADDR)
838 & ANADIG_PLL_480_DIV_SELECT_MASK;
841 val = clk_get_rate(clk->parent) * 22;
843 val = clk_get_rate(clk->parent) * 20;
847 static int _clk_pll7_usb_otg_set_rate(struct clk *clk, unsigned long rate)
849 unsigned int reg, div;
851 if (rate == 528000000)
853 else if (rate == 480000000)
858 reg = __raw_readl(PLL7_480_USB2_BASE_ADDR);
859 reg &= ~ANADIG_PLL_480_DIV_SELECT_MASK;
861 __raw_writel(reg, PLL7_480_USB2_BASE_ADDR);
866 static struct clk pll7_usb_host_main_clk = {
867 __INIT_CLK_DEBUG(pll7_usb_host_main_clk)
869 .enable = _clk_pll_enable,
870 .disable = _clk_pll_disable,
871 .set_rate = _clk_pll7_usb_otg_set_rate,
872 .get_rate = _clk_pll7_usb_otg_get_rate,
876 static struct clk pll8_enet_main_clk = {
877 __INIT_CLK_DEBUG(pll8_enet_main_clk)
879 .enable = _clk_pll_enable,
880 .disable = _clk_pll_disable,
883 static unsigned long _clk_arm_get_rate(struct clk *clk)
887 cacrr = __raw_readl(MXC_CCM_CACRR);
888 div = (cacrr & MXC_CCM_CACRR_ARM_PODF_MASK) + 1;
889 return clk_get_rate(clk->parent) / div;
892 static int _clk_arm_set_rate(struct clk *clk, unsigned long rate)
899 for (i = 0; i < cpu_op_nr; i++) {
900 if (rate == cpu_op_tbl[i].cpu_rate)
906 if (cpu_op_tbl[i].pll_rate != clk_get_rate(&pll1_sys_main_clk)) {
907 /* Change the PLL1 rate. */
908 if (pll2_pfd_400M.usecount != 0)
909 pll1_sw_clk.set_parent(&pll1_sw_clk, &pll2_pfd_400M);
911 pll1_sw_clk.set_parent(&pll1_sw_clk, &osc_clk);
912 pll1_sys_main_clk.set_rate(&pll1_sys_main_clk, cpu_op_tbl[i].pll_rate);
913 pll1_sw_clk.set_parent(&pll1_sw_clk, &pll1_sys_main_clk);
916 parent_rate = clk_get_rate(clk->parent);
917 div = parent_rate / rate;
922 if ((parent_rate / div) > rate)
928 __raw_writel(div - 1, MXC_CCM_CACRR);
933 static struct clk cpu_clk = {
934 __INIT_CLK_DEBUG(cpu_clk)
935 .parent = &pll1_sw_clk,
936 .set_rate = _clk_arm_set_rate,
937 .get_rate = _clk_arm_get_rate,
940 static int _clk_periph_set_parent(struct clk *clk, struct clk *parent)
945 mux = _get_mux6(parent, &pll2_528_bus_main_clk, &pll2_pfd_400M,
946 &pll2_pfd_352M, &pll2_200M, &pll3_sw_clk, &osc_clk);
949 /* Set the pre_periph_clk multiplexer */
950 reg = __raw_readl(MXC_CCM_CBCMR);
951 reg &= ~MXC_CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK;
952 reg |= mux << MXC_CCM_CBCMR_PRE_PERIPH_CLK_SEL_OFFSET;
953 __raw_writel(reg, MXC_CCM_CBCMR);
955 /* Set the periph_clk_sel multiplexer. */
956 reg = __raw_readl(MXC_CCM_CBCDR);
957 reg &= ~MXC_CCM_CBCDR_PERIPH_CLK_SEL;
958 __raw_writel(reg, MXC_CCM_CBCDR);
960 reg = __raw_readl(MXC_CCM_CBCDR);
961 /* Set the periph_clk2_podf divider to divide by 1. */
962 reg &= ~MXC_CCM_CBCDR_PERIPH_CLK2_PODF_MASK;
963 __raw_writel(reg, MXC_CCM_CBCDR);
965 /* Set the periph_clk2_sel mux. */
966 reg = __raw_readl(MXC_CCM_CBCMR);
967 reg &= ~MXC_CCM_CBCMR_PERIPH_CLK2_SEL_MASK;
968 reg |= ((mux - 4) << MXC_CCM_CBCMR_PERIPH_CLK2_SEL_OFFSET);
969 __raw_writel(reg, MXC_CCM_CBCMR);
971 while (__raw_readl(MXC_CCM_CDHIPR))
974 reg = __raw_readl(MXC_CCM_CBCDR);
975 /* Set periph_clk_sel to select periph_clk2. */
976 reg |= MXC_CCM_CBCDR_PERIPH_CLK_SEL;
977 __raw_writel(reg, MXC_CCM_CBCDR);
980 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
981 & MXC_CCM_CDHIPR_PERIPH_CLK_SEL_BUSY), SPIN_DELAY))
982 panic("_clk_periph_set_parent failed\n");
987 static unsigned long _clk_periph_get_rate(struct clk *clk)
993 if ((clk->parent == &pll3_sw_clk) || (clk->parent == &osc_clk)) {
994 reg = __raw_readl(MXC_CCM_CBCDR)
995 & MXC_CCM_CBCDR_PERIPH_CLK2_PODF_MASK;
996 div = (reg >> MXC_CCM_CBCDR_PERIPH_CLK2_PODF_OFFSET) + 1;
998 val = clk_get_rate(clk->parent) / div;
1002 static struct clk periph_clk = {
1003 __INIT_CLK_DEBUG(periph_clk)
1004 .parent = &pll2_528_bus_main_clk,
1005 .set_parent = _clk_periph_set_parent,
1006 .get_rate = _clk_periph_get_rate,
1009 static unsigned long _clk_axi_get_rate(struct clk *clk)
1014 reg = __raw_readl(MXC_CCM_CBCDR) & MXC_CCM_CBCDR_AXI_PODF_MASK;
1015 div = (reg >> MXC_CCM_CBCDR_AXI_PODF_OFFSET);
1017 val = clk_get_rate(clk->parent) / (div + 1);
1021 static int _clk_axi_set_rate(struct clk *clk, unsigned long rate)
1024 u32 parent_rate = clk_get_rate(clk->parent);
1026 div = parent_rate / rate;
1030 if (((parent_rate / div) != rate) || (div > 8))
1033 reg = __raw_readl(MXC_CCM_CBCDR);
1034 reg &= ~MXC_CCM_CBCDR_AXI_PODF_MASK;
1035 reg |= (div - 1) << MXC_CCM_CBCDR_AXI_PODF_OFFSET;
1036 __raw_writel(reg, MXC_CCM_CBCDR);
1038 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1039 & MXC_CCM_CDHIPR_AXI_PODF_BUSY), SPIN_DELAY))
1040 panic("pll _clk_axi_a_set_rate failed\n");
1045 static unsigned long _clk_axi_round_rate(struct clk *clk,
1049 u32 parent_rate = clk_get_rate(clk->parent);
1051 div = parent_rate / rate;
1053 /* Make sure rate is not greater than the maximum
1054 * value for the clock.
1055 * Also prevent a div of 0.
1063 return parent_rate / div;
1066 static int _clk_axi_set_parent(struct clk *clk, struct clk *parent)
1071 mux = _get_mux6(parent, &periph_clk, &pll2_pfd_400M,
1072 &pll3_pfd_540M, NULL, NULL, NULL);
1075 /* Set the AXI_SEL mux */
1076 reg = __raw_readl(MXC_CCM_CBCDR) & ~MXC_CCM_CBCDR_AXI_SEL;
1077 __raw_writel(reg, MXC_CCM_CBCDR);
1079 /* Set the AXI_ALT_SEL mux. */
1080 reg = __raw_readl(MXC_CCM_CBCDR)
1081 & ~MXC_CCM_CBCDR_AXI_ALT_SEL_MASK;
1082 reg = ((mux - 1) << MXC_CCM_CBCDR_AXI_ALT_SEL_OFFSET);
1083 __raw_writel(reg, MXC_CCM_CBCDR);
1085 /* Set the AXI_SEL mux */
1086 reg = __raw_readl(MXC_CCM_CBCDR) & ~MXC_CCM_CBCDR_AXI_SEL;
1087 reg |= MXC_CCM_CBCDR_AXI_SEL;
1088 __raw_writel(reg, MXC_CCM_CBCDR);
1093 static struct clk axi_clk = {
1094 __INIT_CLK_DEBUG(axi_clk)
1095 .parent = &periph_clk,
1096 .set_parent = _clk_axi_set_parent,
1097 .set_rate = _clk_axi_set_rate,
1098 .get_rate = _clk_axi_get_rate,
1099 .round_rate = _clk_axi_round_rate,
1102 static unsigned long _clk_ahb_get_rate(struct clk *clk)
1106 reg = __raw_readl(MXC_CCM_CBCDR);
1107 div = ((reg & MXC_CCM_CBCDR_AHB_PODF_MASK) >>
1108 MXC_CCM_CBCDR_AHB_PODF_OFFSET) + 1;
1110 return clk_get_rate(clk->parent) / div;
1113 static int _clk_ahb_set_rate(struct clk *clk, unsigned long rate)
1116 u32 parent_rate = clk_get_rate(clk->parent);
1118 div = parent_rate / rate;
1121 if (((parent_rate / div) != rate) || (div > 8))
1124 reg = __raw_readl(MXC_CCM_CBCDR);
1125 reg &= ~MXC_CCM_CBCDR_AHB_PODF_MASK;
1126 reg |= (div - 1) << MXC_CCM_CBCDR_AHB_PODF_OFFSET;
1127 __raw_writel(reg, MXC_CCM_CBCDR);
1129 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR) & MXC_CCM_CDHIPR_AHB_PODF_BUSY),
1131 panic("_clk_ahb_set_rate failed\n");
1136 static unsigned long _clk_ahb_round_rate(struct clk *clk,
1140 u32 parent_rate = clk_get_rate(clk->parent);
1142 div = parent_rate / rate;
1144 /* Make sure rate is not greater than the maximum value for the clock.
1145 * Also prevent a div of 0.
1153 return parent_rate / div;
1156 static struct clk ahb_clk = {
1157 __INIT_CLK_DEBUG(ahb_clk)
1158 .parent = &periph_clk,
1159 .get_rate = _clk_ahb_get_rate,
1160 .set_rate = _clk_ahb_set_rate,
1161 .round_rate = _clk_ahb_round_rate,
1164 static unsigned long _clk_ipg_get_rate(struct clk *clk)
1168 reg = __raw_readl(MXC_CCM_CBCDR);
1169 div = ((reg & MXC_CCM_CBCDR_IPG_PODF_MASK) >>
1170 MXC_CCM_CBCDR_IPG_PODF_OFFSET) + 1;
1172 return clk_get_rate(clk->parent) / div;
1176 static struct clk ipg_clk = {
1177 __INIT_CLK_DEBUG(ipg_clk)
1179 .get_rate = _clk_ipg_get_rate,
1182 static struct clk tzasc1_clk = {
1183 __INIT_CLK_DEBUG(tzasc1_clk)
1186 .enable_reg = MXC_CCM_CCGR2,
1187 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
1188 .enable = _clk_enable,
1189 .disable = _clk_disable_inwait,
1192 static struct clk tzasc2_clk = {
1193 __INIT_CLK_DEBUG(tzasc2_clk)
1196 .enable_reg = MXC_CCM_CCGR2,
1197 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
1198 .enable = _clk_enable,
1199 .disable = _clk_disable_inwait,
1202 static struct clk mx6fast1_clk = {
1203 __INIT_CLK_DEBUG(mx6fast1_clk)
1206 .enable_reg = MXC_CCM_CCGR4,
1207 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
1208 .enable = _clk_enable,
1209 .disable = _clk_disable_inwait,
1212 static struct clk mx6per1_clk = {
1213 __INIT_CLK_DEBUG(mx6per1_clk)
1216 .secondary = &mx6fast1_clk,
1217 .enable_reg = MXC_CCM_CCGR4,
1218 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1219 .enable = _clk_enable,
1220 .disable = _clk_disable_inwait,
1223 static struct clk mx6per2_clk = {
1224 __INIT_CLK_DEBUG(mx6per2_clk)
1227 .enable_reg = MXC_CCM_CCGR4,
1228 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
1229 .enable = _clk_enable,
1230 .disable = _clk_disable_inwait,
1233 static unsigned long _clk_mmdc_ch0_axi_get_rate(struct clk *clk)
1237 reg = __raw_readl(MXC_CCM_CBCDR);
1238 div = ((reg & MXC_CCM_CBCDR_MMDC_CH0_PODF_MASK) >>
1239 MXC_CCM_CBCDR_MMDC_CH0_PODF_OFFSET) + 1;
1241 return clk_get_rate(clk->parent) / div;
1244 static int _clk_mmdc_ch0_axi_set_rate(struct clk *clk, unsigned long rate)
1247 u32 parent_rate = clk_get_rate(clk->parent);
1249 div = parent_rate / rate;
1252 if (((parent_rate / div) != rate) || (div > 8))
1255 reg = __raw_readl(MXC_CCM_CBCDR);
1256 reg &= ~MXC_CCM_CBCDR_MMDC_CH0_PODF_MASK;
1257 reg |= (div - 1) << MXC_CCM_CBCDR_MMDC_CH0_PODF_OFFSET;
1258 __raw_writel(reg, MXC_CCM_CBCDR);
1260 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1261 & MXC_CCM_CDHIPR_MMDC_CH0_PODF_BUSY),
1263 panic("_clk_mmdc_ch0_axi_set_rate failed\n");
1268 static unsigned long _clk_mmdc_ch0_axi_round_rate(struct clk *clk,
1272 u32 parent_rate = clk_get_rate(clk->parent);
1274 div = parent_rate / rate;
1276 /* Make sure rate is not greater than the maximum value for the clock.
1277 * Also prevent a div of 0.
1285 return parent_rate / div;
1288 static struct clk mmdc_ch0_axi_clk[] = {
1290 __INIT_CLK_DEBUG(mmdc_ch0_axi_clk)
1292 .parent = &periph_clk,
1293 .enable = _clk_enable,
1294 .disable = _clk_disable_inwait,
1295 .enable_reg = MXC_CCM_CCGR3,
1296 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
1297 .secondary = &mmdc_ch0_axi_clk[1],
1298 .get_rate = _clk_mmdc_ch0_axi_get_rate,
1299 .set_rate = _clk_mmdc_ch0_axi_set_rate,
1300 .round_rate = _clk_mmdc_ch0_axi_round_rate,
1303 __INIT_CLK_DEBUG(mmdc_ch0_ipg_clk)
1306 .enable = _clk_enable,
1307 .disable = _clk_disable_inwait,
1308 .enable_reg = MXC_CCM_CCGR3,
1309 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
1310 .secondary = &tzasc1_clk,
1314 static unsigned long _clk_mmdc_ch1_axi_get_rate(struct clk *clk)
1318 reg = __raw_readl(MXC_CCM_CBCDR);
1319 div = ((reg & MXC_CCM_CBCDR_MMDC_CH1_PODF_MASK) >>
1320 MXC_CCM_CBCDR_MMDC_CH1_PODF_OFFSET) + 1;
1322 return clk_get_rate(clk->parent) / div;
1325 static int _clk_mmdc_ch1_axi_set_rate(struct clk *clk, unsigned long rate)
1328 u32 parent_rate = clk_get_rate(clk->parent);
1330 div = parent_rate / rate;
1333 if (((parent_rate / div) != rate) || (div > 8))
1336 reg = __raw_readl(MXC_CCM_CBCDR);
1337 reg &= ~MXC_CCM_CBCDR_MMDC_CH1_PODF_MASK;
1338 reg |= (div - 1) << MXC_CCM_CBCDR_MMDC_CH1_PODF_OFFSET;
1339 __raw_writel(reg, MXC_CCM_CBCDR);
1341 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1342 & MXC_CCM_CDHIPR_MMDC_CH1_PODF_BUSY), SPIN_DELAY))
1343 panic("_clk_mmdc_ch1_axi_set_rate failed\n");
1348 static unsigned long _clk_mmdc_ch1_axi_round_rate(struct clk *clk,
1352 u32 parent_rate = clk_get_rate(clk->parent);
1354 div = parent_rate / rate;
1356 /* Make sure rate is not greater than the maximum value for the clock.
1357 * Also prevent a div of 0.
1365 return parent_rate / div;
1368 static struct clk mmdc_ch1_axi_clk[] = {
1370 __INIT_CLK_DEBUG(mmdc_ch1_axi_clk)
1372 .parent = &pll2_pfd_400M,
1373 .enable = _clk_enable,
1374 .disable = _clk_disable,
1375 .enable_reg = MXC_CCM_CCGR3,
1376 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
1377 .secondary = &mmdc_ch1_axi_clk[1],
1378 .get_rate = _clk_mmdc_ch1_axi_get_rate,
1379 .set_rate = _clk_mmdc_ch1_axi_set_rate,
1380 .round_rate = _clk_mmdc_ch1_axi_round_rate,
1384 __INIT_CLK_DEBUG(mmdc_ch1_ipg_clk)
1386 .enable = _clk_enable,
1387 .disable = _clk_disable,
1388 .enable_reg = MXC_CCM_CCGR3,
1389 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
1390 .secondary = &tzasc2_clk,
1394 static struct clk ocram_clk = {
1395 __INIT_CLK_DEBUG(ocram_clk)
1398 .enable_reg = MXC_CCM_CCGR3,
1399 .enable_shift = MXC_CCM_CCGRx_CG14_OFFSET,
1400 .enable = _clk_enable,
1401 .disable = _clk_disable_inwait,
1404 static unsigned long _clk_ipg_perclk_get_rate(struct clk *clk)
1408 reg = __raw_readl(MXC_CCM_CSCMR1);
1409 div = ((reg & MXC_CCM_CSCMR1_PERCLK_PODF_MASK) >>
1410 MXC_CCM_CSCMR1_PERCLK_PODF_OFFSET) + 1;
1412 return clk_get_rate(clk->parent) / div;
1415 static int _clk_ipg_perclk_set_rate(struct clk *clk, unsigned long rate)
1418 u32 parent_rate = clk_get_rate(clk->parent);
1420 div = parent_rate / rate;
1423 if (((parent_rate / div) != rate) || (div > 64))
1426 reg = __raw_readl(MXC_CCM_CSCMR1);
1427 reg &= ~MXC_CCM_CSCMR1_PERCLK_PODF_MASK;
1428 reg |= (div - 1) << MXC_CCM_CSCMR1_PERCLK_PODF_OFFSET;
1429 __raw_writel(reg, MXC_CCM_CSCMR1);
1435 static unsigned long _clk_ipg_perclk_round_rate(struct clk *clk,
1439 u32 parent_rate = clk_get_rate(clk->parent);
1441 div = parent_rate / rate;
1443 /* Make sure rate is not greater than the maximum value for the clock.
1444 * Also prevent a div of 0.
1452 return parent_rate / div;
1455 static struct clk ipg_perclk = {
1456 __INIT_CLK_DEBUG(ipg_perclk)
1458 .get_rate = _clk_ipg_perclk_get_rate,
1459 .set_rate = _clk_ipg_perclk_set_rate,
1460 .round_rate = _clk_ipg_perclk_round_rate,
1463 static struct clk spba_clk = {
1464 __INIT_CLK_DEBUG(spba_clk)
1466 .enable_reg = MXC_CCM_CCGR5,
1467 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1468 .enable = _clk_enable,
1469 .disable = _clk_disable,
1472 static struct clk sdma_clk[] = {
1474 __INIT_CLK_DEBUG(sdma_clk)
1476 .enable_reg = MXC_CCM_CCGR5,
1477 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
1478 .enable = _clk_enable,
1479 .disable = _clk_disable,
1480 .secondary = &sdma_clk[1],
1483 .parent = &mx6per1_clk,
1484 #ifdef CONFIG_SDMA_IRAM
1485 .secondary = &ocram_clk,
1487 .secondary = &mmdc_ch0_axi_clk[0],
1492 static int _clk_gpu2d_axi_set_parent(struct clk *clk, struct clk *parent)
1494 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_GPU2D_AXI_CLK_SEL;
1496 if (parent == &ahb_clk)
1497 reg |= MXC_CCM_CBCMR_GPU2D_AXI_CLK_SEL;
1499 __raw_writel(reg, MXC_CCM_CBCMR);
1504 static struct clk gpu2d_axi_clk = {
1505 __INIT_CLK_DEBUG(gpu2d_axi_clk)
1507 .secondary = &mmdc_ch0_axi_clk[0],
1508 .set_parent = _clk_gpu2d_axi_set_parent,
1511 static int _clk_gpu3d_axi_set_parent(struct clk *clk, struct clk *parent)
1513 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_GPU3D_AXI_CLK_SEL;
1515 if (parent == &ahb_clk)
1516 reg |= MXC_CCM_CBCMR_GPU3D_AXI_CLK_SEL;
1518 __raw_writel(reg, MXC_CCM_CBCMR);
1523 static struct clk gpu3d_axi_clk = {
1524 __INIT_CLK_DEBUG(gpu3d_axi_clk)
1526 .secondary = &mmdc_ch0_axi_clk[0],
1527 .set_parent = _clk_gpu3d_axi_set_parent,
1530 static int _clk_pcie_axi_set_parent(struct clk *clk, struct clk *parent)
1532 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_PCIE_AXI_CLK_SEL;
1534 if (parent == &ahb_clk)
1535 reg |= MXC_CCM_CBCMR_PCIE_AXI_CLK_SEL;
1537 __raw_writel(reg, MXC_CCM_CBCMR);
1542 static struct clk pcie_axi_clk = {
1543 __INIT_CLK_DEBUG(pcie_axi_clk)
1545 .set_parent = _clk_pcie_axi_set_parent,
1548 static int _clk_vdo_axi_set_parent(struct clk *clk, struct clk *parent)
1550 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_VDOAXI_CLK_SEL;
1552 if (parent == &ahb_clk)
1553 reg |= MXC_CCM_CBCMR_VDOAXI_CLK_SEL;
1555 __raw_writel(reg, MXC_CCM_CBCMR);
1560 static struct clk vdo_axi_clk = {
1561 __INIT_CLK_DEBUG(vdo_axi_clk)
1563 .enable_reg = MXC_CCM_CCGR6,
1564 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1565 .enable = _clk_enable,
1566 .disable = _clk_disable,
1567 .set_parent = _clk_vdo_axi_set_parent,
1570 static struct clk vdoa_clk = {
1571 __INIT_CLK_DEBUG(vdoa_clk)
1574 .secondary = &mx6fast1_clk,
1575 .enable_reg = MXC_CCM_CCGR2,
1576 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
1577 .enable = _clk_enable,
1578 .disable = _clk_disable,
1581 static struct clk gpt_clk[] = {
1583 __INIT_CLK_DEBUG(gpt_clk)
1584 .parent = &ipg_perclk,
1586 .enable_reg = MXC_CCM_CCGR1,
1587 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
1588 .enable = _clk_enable,
1589 .disable = _clk_disable,
1590 .secondary = &gpt_clk[1],
1593 __INIT_CLK_DEBUG(gpt_serial_clk)
1595 .enable_reg = MXC_CCM_CCGR1,
1596 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
1597 .enable = _clk_enable,
1598 .disable = _clk_disable,
1602 static struct clk iim_clk = {
1603 __INIT_CLK_DEBUG(iim_clk)
1605 .enable = _clk_enable,
1606 .enable_reg = MXC_CCM_CCGR2,
1607 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1608 .disable = _clk_disable,
1611 static struct clk i2c_clk[] = {
1613 __INIT_CLK_DEBUG(i2c_clk_0)
1615 .parent = &ipg_perclk,
1616 .enable_reg = MXC_CCM_CCGR2,
1617 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
1618 .enable = _clk_enable,
1619 .disable = _clk_disable,
1622 __INIT_CLK_DEBUG(i2c_clk_1)
1624 .parent = &ipg_perclk,
1625 .enable_reg = MXC_CCM_CCGR2,
1626 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
1627 .enable = _clk_enable,
1628 .disable = _clk_disable,
1631 __INIT_CLK_DEBUG(i2c_clk_2)
1633 .parent = &ipg_perclk,
1634 .enable_reg = MXC_CCM_CCGR2,
1635 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
1636 .enable = _clk_enable,
1637 .disable = _clk_disable,
1641 static int _clk_vpu_axi_set_parent(struct clk *clk, struct clk *parent)
1644 u32 reg = __raw_readl(MXC_CCM_CBCMR)
1645 & ~MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_MASK;
1647 mux = _get_mux6(parent, &axi_clk, &pll2_pfd_400M,
1648 &pll2_pfd_352M, NULL, NULL, NULL);
1650 reg |= (mux << MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_OFFSET);
1652 __raw_writel(reg, MXC_CCM_CBCMR);
1657 static unsigned long _clk_vpu_axi_get_rate(struct clk *clk)
1661 reg = __raw_readl(MXC_CCM_CSCDR1);
1662 div = ((reg & MXC_CCM_CSCDR1_VPU_AXI_PODF_MASK) >>
1663 MXC_CCM_CSCDR1_VPU_AXI_PODF_OFFSET) + 1;
1665 return clk_get_rate(clk->parent) / div;
1668 static int _clk_vpu_axi_set_rate(struct clk *clk, unsigned long rate)
1671 u32 parent_rate = clk_get_rate(clk->parent);
1673 div = parent_rate / rate;
1676 if (((parent_rate / div) != rate) || (div > 8))
1679 reg = __raw_readl(MXC_CCM_CSCDR1);
1680 reg &= ~MXC_CCM_CSCDR1_VPU_AXI_PODF_MASK;
1681 reg |= (div - 1) << MXC_CCM_CSCDR1_VPU_AXI_PODF_OFFSET;
1682 __raw_writel(reg, MXC_CCM_CSCDR1);
1687 static unsigned long _clk_vpu_axi_round_rate(struct clk *clk,
1691 u32 parent_rate = clk_get_rate(clk->parent);
1693 div = parent_rate / rate;
1695 /* Make sure rate is not greater than the maximum value for the clock.
1696 * Also prevent a div of 0.
1704 return parent_rate / div;
1707 static struct clk vpu_clk[] = {
1709 __INIT_CLK_DEBUG(vpu_clk)
1711 .enable_reg = MXC_CCM_CCGR6,
1712 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
1713 .enable = _clk_enable,
1714 .disable = _clk_disable,
1715 .set_parent = _clk_vpu_axi_set_parent,
1716 .round_rate = _clk_vpu_axi_round_rate,
1717 .set_rate = _clk_vpu_axi_set_rate,
1718 .get_rate = _clk_vpu_axi_get_rate,
1719 .secondary = &vpu_clk[1],
1722 .parent = &mmdc_ch0_axi_clk[0],
1723 .secondary = &vpu_clk[2],
1726 .parent = &mx6fast1_clk,
1727 .secondary = &ocram_clk,
1732 static int _clk_ipu1_set_parent(struct clk *clk, struct clk *parent)
1735 u32 reg = __raw_readl(MXC_CCM_CSCDR3)
1736 & ~MXC_CCM_CSCDR3_IPU1_HSP_CLK_SEL_MASK;
1738 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
1739 &pll2_pfd_400M, &pll3_120M, &pll3_pfd_540M, NULL, NULL);
1741 reg |= (mux << MXC_CCM_CSCDR3_IPU1_HSP_CLK_SEL_OFFSET);
1743 __raw_writel(reg, MXC_CCM_CSCDR3);
1748 static unsigned long _clk_ipu1_get_rate(struct clk *clk)
1752 reg = __raw_readl(MXC_CCM_CSCDR3);
1753 div = ((reg & MXC_CCM_CSCDR3_IPU1_HSP_PODF_MASK) >>
1754 MXC_CCM_CSCDR3_IPU1_HSP_PODF_OFFSET) + 1;
1756 return clk_get_rate(clk->parent) / div;
1759 static int _clk_ipu1_set_rate(struct clk *clk, unsigned long rate)
1762 u32 parent_rate = clk_get_rate(clk->parent);
1764 div = parent_rate / rate;
1767 if (((parent_rate / div) != rate) || (div > 8))
1770 reg = __raw_readl(MXC_CCM_CSCDR3);
1771 reg &= ~MXC_CCM_CSCDR3_IPU1_HSP_PODF_MASK;
1772 reg |= (div - 1) << MXC_CCM_CSCDR3_IPU1_HSP_PODF_OFFSET;
1773 __raw_writel(reg, MXC_CCM_CSCDR3);
1778 static unsigned long _clk_ipu_round_rate(struct clk *clk,
1782 u32 parent_rate = clk_get_rate(clk->parent);
1784 div = parent_rate / rate;
1786 /* Make sure rate is not greater than the maximum value for the clock.
1787 * Also prevent a div of 0.
1795 return parent_rate / div;
1798 static struct clk ipu1_clk = {
1799 __INIT_CLK_DEBUG(ipu1_clk)
1800 .parent = &mmdc_ch0_axi_clk[0],
1801 .secondary = &mmdc_ch0_axi_clk[0],
1802 .enable_reg = MXC_CCM_CCGR3,
1803 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
1804 .enable = _clk_enable,
1805 .disable = _clk_disable,
1806 .set_parent = _clk_ipu1_set_parent,
1807 .round_rate = _clk_ipu_round_rate,
1808 .set_rate = _clk_ipu1_set_rate,
1809 .get_rate = _clk_ipu1_get_rate,
1810 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
1813 static int _clk_cko1_clk0_set_parent(struct clk *clk, struct clk *parent)
1817 if (parent == &pll3_sw_clk)
1819 else if (parent == &pll2_528_bus_main_clk)
1821 else if (parent == &pll1_sys_main_clk)
1823 else if (parent == &pll5_video_main_clk)
1825 else if (parent == &axi_clk)
1827 else if (parent == &enfc_clk)
1829 else if (parent == &ipu1_di_clk_root)
1831 else if (parent == &ipu1_di_clk_root)
1833 else if (parent == &ipu2_di_clk_root)
1835 else if (parent == &ipu2_di_clk_root)
1837 else if (parent == &ahb_clk)
1839 else if (parent == &ipg_clk)
1841 else if (parent == &ipg_perclk)
1843 else if (parent == &ckil_clk)
1845 else if (parent == &pll4_audio_main_clk)
1850 reg = __raw_readl(MXC_CCM_CCOSR);
1851 reg &= ~MXC_CCM_CCOSR_CKOL_SEL_MASK;
1852 reg |= sel << MXC_CCM_CCOSR_CKOL_SEL_OFFSET;
1853 __raw_writel(reg, MXC_CCM_CCOSR);
1857 static unsigned long _clk_cko1_round_rate(struct clk *clk,
1861 u32 parent_rate = clk_get_rate(clk->parent);
1863 div = parent_rate / rate;
1865 /* Make sure rate is not greater than the maximum value for the clock.
1866 * Also prevent a div of 0.
1874 return parent_rate / div;
1877 static int _clk_cko1_set_rate(struct clk *clk, unsigned long rate)
1880 u32 parent_rate = clk_get_rate(clk->parent);
1882 div = parent_rate / rate;
1885 if (((parent_rate / div) != rate) || (div > 8))
1888 reg = __raw_readl(MXC_CCM_CCOSR);
1889 reg &= ~MXC_CCM_CCOSR_CKOL_DIV_MASK;
1890 reg |= div << MXC_CCM_CCOSR_CKOL_DIV_OFFSET;
1891 __raw_writel(reg, MXC_CCM_CCOSR);
1896 static unsigned long _clk_cko1_get_rate(struct clk *clk)
1900 reg = __raw_readl(MXC_CCM_CCOSR);
1901 div = ((reg & MXC_CCM_CCOSR_CKOL_DIV_MASK) >>
1902 MXC_CCM_CCOSR_CKOL_DIV_OFFSET) + 1;
1904 return clk_get_rate(clk->parent) / div;
1907 static int cko1_clk_enable(struct clk *clk)
1910 reg = __raw_readl(clk->enable_reg);
1911 reg |= clk->enable_shift;
1912 __raw_writel(reg, clk->enable_reg);
1917 static struct clk cko1_clk0 = {
1918 __INIT_CLK_DEBUG(cko1_clk0)
1920 .enable_reg = MXC_CCM_CCOSR,
1921 .enable_shift = MXC_CCM_CCOSR_CKOL_EN,
1922 .enable = cko1_clk_enable,
1923 .disable = _clk_disable,
1924 .set_parent = _clk_cko1_clk0_set_parent,
1925 .round_rate = _clk_cko1_round_rate,
1926 .set_rate = _clk_cko1_set_rate,
1927 .get_rate = _clk_cko1_get_rate,
1930 static int _clk_ipu2_set_parent(struct clk *clk, struct clk *parent)
1933 u32 reg = __raw_readl(MXC_CCM_CSCDR3)
1934 & ~MXC_CCM_CSCDR3_IPU2_HSP_CLK_SEL_MASK;
1936 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
1937 &pll2_pfd_400M, &pll3_120M, &pll3_pfd_540M, NULL, NULL);
1939 reg |= (mux << MXC_CCM_CSCDR3_IPU2_HSP_CLK_SEL_OFFSET);
1941 __raw_writel(reg, MXC_CCM_CSCDR3);
1946 static unsigned long _clk_ipu2_get_rate(struct clk *clk)
1950 reg = __raw_readl(MXC_CCM_CSCDR3);
1951 div = ((reg & MXC_CCM_CSCDR3_IPU2_HSP_PODF_MASK) >>
1952 MXC_CCM_CSCDR3_IPU2_HSP_PODF_OFFSET) + 1;
1954 return clk_get_rate(clk->parent) / div;
1957 static int _clk_ipu2_set_rate(struct clk *clk, unsigned long rate)
1960 u32 parent_rate = clk_get_rate(clk->parent);
1962 div = parent_rate / rate;
1965 if (((parent_rate / div) != rate) || (div > 8))
1968 reg = __raw_readl(MXC_CCM_CSCDR3);
1969 reg &= ~MXC_CCM_CSCDR3_IPU2_HSP_PODF_MASK;
1970 reg |= (div - 1) << MXC_CCM_CSCDR3_IPU2_HSP_PODF_OFFSET;
1971 __raw_writel(reg, MXC_CCM_CSCDR3);
1976 static struct clk ipu2_clk = {
1977 __INIT_CLK_DEBUG(ipu2_clk)
1978 .parent = &mmdc_ch0_axi_clk[0],
1979 .secondary = &mmdc_ch0_axi_clk[0],
1980 .enable_reg = MXC_CCM_CCGR3,
1981 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
1982 .enable = _clk_enable,
1983 .disable = _clk_disable,
1984 .set_parent = _clk_ipu2_set_parent,
1985 .round_rate = _clk_ipu_round_rate,
1986 .set_rate = _clk_ipu2_set_rate,
1987 .get_rate = _clk_ipu2_get_rate,
1988 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
1991 static struct clk usdhc_dep_clk = {
1992 .parent = &mmdc_ch0_axi_clk[0],
1993 .secondary = &mx6per1_clk,
1994 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
1997 static unsigned long _clk_usdhc_round_rate(struct clk *clk,
2001 u32 parent_rate = clk_get_rate(clk->parent);
2003 div = parent_rate / rate;
2005 /* Make sure rate is not greater than the maximum value for the clock.
2006 * Also prevent a div of 0.
2014 return parent_rate / div;
2017 static int _clk_usdhc1_set_parent(struct clk *clk, struct clk *parent)
2019 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC1_CLK_SEL;
2021 if (parent == &pll2_pfd_352M)
2022 reg |= (MXC_CCM_CSCMR1_USDHC1_CLK_SEL);
2024 __raw_writel(reg, MXC_CCM_CSCMR1);
2029 static unsigned long _clk_usdhc1_get_rate(struct clk *clk)
2033 reg = __raw_readl(MXC_CCM_CSCDR1);
2034 div = ((reg & MXC_CCM_CSCDR1_USDHC1_PODF_MASK) >>
2035 MXC_CCM_CSCDR1_USDHC1_PODF_OFFSET) + 1;
2037 return clk_get_rate(clk->parent) / div;
2040 static int _clk_usdhc1_set_rate(struct clk *clk, unsigned long rate)
2043 u32 parent_rate = clk_get_rate(clk->parent);
2045 div = parent_rate / rate;
2048 if (((parent_rate / div) != rate) || (div > 8))
2051 reg = __raw_readl(MXC_CCM_CSCDR1);
2052 reg &= ~MXC_CCM_CSCDR1_USDHC1_PODF_MASK;
2053 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC1_PODF_OFFSET;
2054 __raw_writel(reg, MXC_CCM_CSCDR1);
2059 static struct clk usdhc1_clk = {
2060 __INIT_CLK_DEBUG(usdhc1_clk)
2062 .parent = &pll2_pfd_400M,
2063 .secondary = &usdhc_dep_clk,
2064 .enable_reg = MXC_CCM_CCGR6,
2065 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
2066 .enable = _clk_enable,
2067 .disable = _clk_disable,
2068 .set_parent = _clk_usdhc1_set_parent,
2069 .round_rate = _clk_usdhc_round_rate,
2070 .set_rate = _clk_usdhc1_set_rate,
2071 .get_rate = _clk_usdhc1_get_rate,
2072 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2075 static int _clk_usdhc2_set_parent(struct clk *clk, struct clk *parent)
2077 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC2_CLK_SEL;
2079 if (parent == &pll2_pfd_352M)
2080 reg |= (MXC_CCM_CSCMR1_USDHC2_CLK_SEL);
2082 __raw_writel(reg, MXC_CCM_CSCMR1);
2087 static unsigned long _clk_usdhc2_get_rate(struct clk *clk)
2091 reg = __raw_readl(MXC_CCM_CSCDR1);
2092 div = ((reg & MXC_CCM_CSCDR1_USDHC2_PODF_MASK) >>
2093 MXC_CCM_CSCDR1_USDHC2_PODF_OFFSET) + 1;
2095 return clk_get_rate(clk->parent) / div;
2098 static int _clk_usdhc2_set_rate(struct clk *clk, unsigned long rate)
2101 u32 parent_rate = clk_get_rate(clk->parent);
2103 div = parent_rate / rate;
2106 if (((parent_rate / div) != rate) || (div > 8))
2109 reg = __raw_readl(MXC_CCM_CSCDR1);
2110 reg &= ~MXC_CCM_CSCDR1_USDHC2_PODF_MASK;
2111 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC2_PODF_OFFSET;
2112 __raw_writel(reg, MXC_CCM_CSCDR1);
2117 static struct clk usdhc2_clk = {
2118 __INIT_CLK_DEBUG(usdhc2_clk)
2120 .parent = &pll2_pfd_400M,
2121 .secondary = &usdhc_dep_clk,
2122 .enable_reg = MXC_CCM_CCGR6,
2123 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
2124 .enable = _clk_enable,
2125 .disable = _clk_disable,
2126 .set_parent = _clk_usdhc2_set_parent,
2127 .round_rate = _clk_usdhc_round_rate,
2128 .set_rate = _clk_usdhc2_set_rate,
2129 .get_rate = _clk_usdhc2_get_rate,
2130 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2133 static int _clk_usdhc3_set_parent(struct clk *clk, struct clk *parent)
2135 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC3_CLK_SEL;
2137 if (parent == &pll2_pfd_352M)
2138 reg |= (MXC_CCM_CSCMR1_USDHC3_CLK_SEL);
2140 __raw_writel(reg, MXC_CCM_CSCMR1);
2145 static unsigned long _clk_usdhc3_get_rate(struct clk *clk)
2149 reg = __raw_readl(MXC_CCM_CSCDR1);
2150 div = ((reg & MXC_CCM_CSCDR1_USDHC3_PODF_MASK) >>
2151 MXC_CCM_CSCDR1_USDHC3_PODF_OFFSET) + 1;
2153 return clk_get_rate(clk->parent) / div;
2156 static int _clk_usdhc3_set_rate(struct clk *clk, unsigned long rate)
2159 u32 parent_rate = clk_get_rate(clk->parent);
2161 div = parent_rate / rate;
2164 if (((parent_rate / div) != rate) || (div > 8))
2167 reg = __raw_readl(MXC_CCM_CSCDR1);
2168 reg &= ~MXC_CCM_CSCDR1_USDHC3_PODF_MASK;
2169 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC3_PODF_OFFSET;
2170 __raw_writel(reg, MXC_CCM_CSCDR1);
2176 static struct clk usdhc3_clk = {
2177 __INIT_CLK_DEBUG(usdhc3_clk)
2179 .parent = &pll2_pfd_400M,
2180 .secondary = &usdhc_dep_clk,
2181 .enable_reg = MXC_CCM_CCGR6,
2182 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
2183 .enable = _clk_enable,
2184 .disable = _clk_disable,
2185 .set_parent = _clk_usdhc3_set_parent,
2186 .round_rate = _clk_usdhc_round_rate,
2187 .set_rate = _clk_usdhc3_set_rate,
2188 .get_rate = _clk_usdhc3_get_rate,
2189 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2192 static int _clk_usdhc4_set_parent(struct clk *clk, struct clk *parent)
2194 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC4_CLK_SEL;
2196 if (parent == &pll2_pfd_352M)
2197 reg |= (MXC_CCM_CSCMR1_USDHC4_CLK_SEL);
2199 __raw_writel(reg, MXC_CCM_CSCMR1);
2204 static unsigned long _clk_usdhc4_get_rate(struct clk *clk)
2208 reg = __raw_readl(MXC_CCM_CSCDR1);
2209 div = ((reg & MXC_CCM_CSCDR1_USDHC4_PODF_MASK) >>
2210 MXC_CCM_CSCDR1_USDHC4_PODF_OFFSET) + 1;
2212 return clk_get_rate(clk->parent) / div;
2215 static int _clk_usdhc4_set_rate(struct clk *clk, unsigned long rate)
2218 u32 parent_rate = clk_get_rate(clk->parent);
2220 div = parent_rate / rate;
2223 if (((parent_rate / div) != rate) || (div > 8))
2226 reg = __raw_readl(MXC_CCM_CSCDR1);
2227 reg &= ~MXC_CCM_CSCDR1_USDHC4_PODF_MASK;
2228 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC4_PODF_OFFSET;
2229 __raw_writel(reg, MXC_CCM_CSCDR1);
2235 static struct clk usdhc4_clk = {
2236 __INIT_CLK_DEBUG(usdhc4_clk)
2238 .parent = &pll2_pfd_400M,
2239 .secondary = &usdhc_dep_clk,
2240 .enable_reg = MXC_CCM_CCGR6,
2241 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
2242 .enable = _clk_enable,
2243 .disable = _clk_disable,
2244 .set_parent = _clk_usdhc4_set_parent,
2245 .round_rate = _clk_usdhc_round_rate,
2246 .set_rate = _clk_usdhc4_set_rate,
2247 .get_rate = _clk_usdhc4_get_rate,
2248 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2251 static unsigned long _clk_ssi_round_rate(struct clk *clk,
2255 u32 parent_rate = clk_get_rate(clk->parent);
2256 u32 div = parent_rate / rate;
2258 if (parent_rate % rate)
2261 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2263 return parent_rate / (pre * post);
2266 static unsigned long _clk_ssi1_get_rate(struct clk *clk)
2268 u32 reg, prediv, podf;
2270 reg = __raw_readl(MXC_CCM_CS1CDR);
2272 prediv = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK)
2273 >> MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET) + 1;
2274 podf = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK)
2275 >> MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET) + 1;
2277 return clk_get_rate(clk->parent) / (prediv * podf);
2280 static int _clk_ssi1_set_rate(struct clk *clk, unsigned long rate)
2282 u32 reg, div, pre, post;
2283 u32 parent_rate = clk_get_rate(clk->parent);
2285 div = parent_rate / rate;
2288 if (((parent_rate / div) != rate) || div > 512)
2291 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2293 reg = __raw_readl(MXC_CCM_CS1CDR);
2294 reg &= ~(MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK |
2295 MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK);
2296 reg |= (post - 1) << MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET;
2297 reg |= (pre - 1) << MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET;
2299 __raw_writel(reg, MXC_CCM_CS1CDR);
2305 static int _clk_ssi1_set_parent(struct clk *clk, struct clk *parent)
2309 reg = __raw_readl(MXC_CCM_CSCMR1)
2310 & ~MXC_CCM_CSCMR1_SSI1_CLK_SEL_MASK;
2312 mux = _get_mux6(parent, &pll3_pfd_508M, &pll3_pfd_454M,
2313 &pll4_audio_main_clk, NULL, NULL, NULL);
2314 reg |= (mux << MXC_CCM_CSCMR1_SSI1_CLK_SEL_OFFSET);
2316 __raw_writel(reg, MXC_CCM_CSCMR1);
2321 static struct clk ssi1_clk = {
2322 __INIT_CLK_DEBUG(ssi1_clk)
2323 .parent = &pll3_pfd_508M,
2324 .enable_reg = MXC_CCM_CCGR5,
2325 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
2326 .enable = _clk_enable,
2327 .disable = _clk_disable,
2328 .set_parent = _clk_ssi1_set_parent,
2329 .set_rate = _clk_ssi1_set_rate,
2330 .round_rate = _clk_ssi_round_rate,
2331 .get_rate = _clk_ssi1_get_rate,
2332 #ifdef CONFIG_SND_MXC_SOC_IRAM
2333 .secondary = &ocram_clk,
2335 .secondary = &mmdc_ch0_axi_clk[0],
2339 static unsigned long _clk_ssi2_get_rate(struct clk *clk)
2341 u32 reg, prediv, podf;
2343 reg = __raw_readl(MXC_CCM_CS2CDR);
2345 prediv = ((reg & MXC_CCM_CS2CDR_SSI2_CLK_PRED_MASK)
2346 >> MXC_CCM_CS2CDR_SSI2_CLK_PRED_OFFSET) + 1;
2347 podf = ((reg & MXC_CCM_CS2CDR_SSI2_CLK_PODF_MASK)
2348 >> MXC_CCM_CS2CDR_SSI2_CLK_PODF_OFFSET) + 1;
2350 return clk_get_rate(clk->parent) / (prediv * podf);
2353 static int _clk_ssi2_set_rate(struct clk *clk, unsigned long rate)
2355 u32 reg, div, pre, post;
2356 u32 parent_rate = clk_get_rate(clk->parent);
2358 div = parent_rate / rate;
2361 if (((parent_rate / div) != rate) || div > 512)
2364 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2366 reg = __raw_readl(MXC_CCM_CS2CDR);
2367 reg &= ~(MXC_CCM_CS2CDR_SSI2_CLK_PRED_MASK |
2368 MXC_CCM_CS2CDR_SSI2_CLK_PODF_MASK);
2369 reg |= (post - 1) << MXC_CCM_CS2CDR_SSI2_CLK_PODF_OFFSET;
2370 reg |= (pre - 1) << MXC_CCM_CS2CDR_SSI2_CLK_PRED_OFFSET;
2372 __raw_writel(reg, MXC_CCM_CS2CDR);
2378 static int _clk_ssi2_set_parent(struct clk *clk, struct clk *parent)
2382 reg = __raw_readl(MXC_CCM_CSCMR1)
2383 & ~MXC_CCM_CSCMR1_SSI2_CLK_SEL_MASK;
2385 mux = _get_mux6(parent, &pll3_pfd_508M, &pll3_pfd_454M,
2386 &pll4_audio_main_clk, NULL, NULL, NULL);
2387 reg |= (mux << MXC_CCM_CSCMR1_SSI2_CLK_SEL_OFFSET);
2389 __raw_writel(reg, MXC_CCM_CSCMR1);
2394 static struct clk ssi2_clk = {
2395 __INIT_CLK_DEBUG(ssi2_clk)
2396 .parent = &pll3_pfd_508M,
2397 .enable_reg = MXC_CCM_CCGR5,
2398 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
2399 .enable = _clk_enable,
2400 .disable = _clk_disable,
2401 .set_parent = _clk_ssi2_set_parent,
2402 .set_rate = _clk_ssi2_set_rate,
2403 .round_rate = _clk_ssi_round_rate,
2404 .get_rate = _clk_ssi2_get_rate,
2405 #ifdef CONFIG_SND_MXC_SOC_IRAM
2406 .secondary = &ocram_clk,
2408 .secondary = &mmdc_ch0_axi_clk[0],
2412 static unsigned long _clk_ssi3_get_rate(struct clk *clk)
2414 u32 reg, prediv, podf;
2416 reg = __raw_readl(MXC_CCM_CS1CDR);
2418 prediv = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK)
2419 >> MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET) + 1;
2420 podf = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK)
2421 >> MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET) + 1;
2423 return clk_get_rate(clk->parent) / (prediv * podf);
2426 static int _clk_ssi3_set_rate(struct clk *clk, unsigned long rate)
2428 u32 reg, div, pre, post;
2429 u32 parent_rate = clk_get_rate(clk->parent);
2431 div = parent_rate / rate;
2434 if (((parent_rate / div) != rate) || div > 512)
2437 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2439 reg = __raw_readl(MXC_CCM_CS1CDR);
2440 reg &= ~(MXC_CCM_CS1CDR_SSI3_CLK_PODF_MASK|
2441 MXC_CCM_CS1CDR_SSI3_CLK_PRED_MASK);
2442 reg |= (post - 1) << MXC_CCM_CS1CDR_SSI3_CLK_PODF_OFFSET;
2443 reg |= (pre - 1) << MXC_CCM_CS1CDR_SSI3_CLK_PRED_OFFSET;
2445 __raw_writel(reg, MXC_CCM_CS1CDR);
2451 static int _clk_ssi3_set_parent(struct clk *clk, struct clk *parent)
2455 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_SSI3_CLK_SEL_MASK;
2457 mux = _get_mux6(parent, &pll3_pfd_508M, &pll3_pfd_454M,
2458 &pll4_audio_main_clk, NULL, NULL, NULL);
2459 reg |= (mux << MXC_CCM_CSCMR1_SSI3_CLK_SEL_OFFSET);
2461 __raw_writel(reg, MXC_CCM_CSCMR1);
2466 static struct clk ssi3_clk = {
2467 __INIT_CLK_DEBUG(ssi3_clk)
2468 .parent = &pll3_pfd_508M,
2469 .enable_reg = MXC_CCM_CCGR5,
2470 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
2471 .enable = _clk_enable,
2472 .disable = _clk_disable,
2473 .set_parent = _clk_ssi3_set_parent,
2474 .set_rate = _clk_ssi3_set_rate,
2475 .round_rate = _clk_ssi_round_rate,
2476 .get_rate = _clk_ssi3_get_rate,
2477 #ifdef CONFIG_SND_MXC_SOC_IRAM
2478 .secondary = &ocram_clk,
2480 .secondary = &mmdc_ch0_axi_clk[0],
2484 static unsigned long _clk_ldb_di_round_rate(struct clk *clk,
2487 u32 parent_rate = clk_get_rate(clk->parent);
2489 if (rate * 7 <= parent_rate + parent_rate/20)
2490 return parent_rate / 7;
2492 return 2 * parent_rate / 7;
2495 static unsigned long _clk_ldb_di0_get_rate(struct clk *clk)
2499 div = __raw_readl(MXC_CCM_CSCMR2) &
2500 MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
2503 return clk_get_rate(clk->parent) / 7;
2505 return (2 * clk_get_rate(clk->parent)) / 7;
2508 static int _clk_ldb_di0_set_rate(struct clk *clk, unsigned long rate)
2511 u32 parent_rate = clk_get_rate(clk->parent);
2513 if (rate * 7 <= parent_rate + parent_rate/20) {
2515 rate = parent_rate / 7;
2517 rate = 2 * parent_rate / 7;
2519 reg = __raw_readl(MXC_CCM_CSCMR2);
2521 reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
2523 reg &= ~MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
2525 __raw_writel(reg, MXC_CCM_CSCMR2);
2530 static int _clk_ldb_di0_set_parent(struct clk *clk, struct clk *parent)
2534 reg = __raw_readl(MXC_CCM_CS2CDR)
2535 & ~MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK;
2537 mux = _get_mux6(parent, &pll5_video_main_clk,
2538 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M,
2539 &pll3_usb_otg_main_clk, NULL);
2540 reg |= (mux << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET);
2542 __raw_writel(reg, MXC_CCM_CS2CDR);
2547 static struct clk ldb_di0_clk = {
2548 __INIT_CLK_DEBUG(ldb_di0_clk)
2550 .parent = &pll3_pfd_540M,
2551 .enable_reg = MXC_CCM_CCGR3,
2552 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
2553 .enable = _clk_enable,
2554 .disable = _clk_disable,
2555 .set_parent = _clk_ldb_di0_set_parent,
2556 .set_rate = _clk_ldb_di0_set_rate,
2557 .round_rate = _clk_ldb_di_round_rate,
2558 .get_rate = _clk_ldb_di0_get_rate,
2559 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2562 static unsigned long _clk_ldb_di1_get_rate(struct clk *clk)
2566 div = __raw_readl(MXC_CCM_CSCMR2) &
2567 MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
2570 return clk_get_rate(clk->parent) / 7;
2572 return (2 * clk_get_rate(clk->parent)) / 7;
2575 static int _clk_ldb_di1_set_rate(struct clk *clk, unsigned long rate)
2578 u32 parent_rate = clk_get_rate(clk->parent);
2580 if (rate * 7 <= parent_rate + parent_rate/20) {
2582 rate = parent_rate / 7;
2584 rate = 2 * parent_rate / 7;
2586 reg = __raw_readl(MXC_CCM_CSCMR2);
2588 reg |= MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
2590 reg &= ~MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
2592 __raw_writel(reg, MXC_CCM_CSCMR2);
2597 static int _clk_ldb_di1_set_parent(struct clk *clk, struct clk *parent)
2601 reg = __raw_readl(MXC_CCM_CS2CDR)
2602 & ~MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK;
2604 mux = _get_mux6(parent, &pll5_video_main_clk,
2605 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M,
2606 &pll3_usb_otg_main_clk, NULL);
2607 reg |= (mux << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
2609 __raw_writel(reg, MXC_CCM_CS2CDR);
2614 static struct clk ldb_di1_clk = {
2615 __INIT_CLK_DEBUG(ldb_di1_clk)
2617 .parent = &pll3_pfd_540M,
2618 .enable_reg = MXC_CCM_CCGR3,
2619 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
2620 .enable = _clk_enable,
2621 .disable = _clk_disable,
2622 .set_parent = _clk_ldb_di1_set_parent,
2623 .set_rate = _clk_ldb_di1_set_rate,
2624 .round_rate = _clk_ldb_di_round_rate,
2625 .get_rate = _clk_ldb_di1_get_rate,
2626 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2630 static unsigned long _clk_ipu_di_round_rate(struct clk *clk,
2634 u32 parent_rate = clk_get_rate(clk->parent);
2636 if ((clk->parent == &ldb_di0_clk) ||
2637 (clk->parent == &ldb_di1_clk))
2640 div = parent_rate / rate;
2642 /* Make sure rate is not greater than the maximum value for the clock.
2643 * Also prevent a div of 0.
2651 return parent_rate / div;
2654 static unsigned long _clk_ipu1_di0_get_rate(struct clk *clk)
2658 if ((clk->parent == &ldb_di0_clk) ||
2659 (clk->parent == &ldb_di1_clk))
2660 return clk_get_rate(clk->parent);
2662 reg = __raw_readl(MXC_CCM_CHSCCDR);
2664 div = ((reg & MXC_CCM_CHSCCDR_IPU1_DI0_PODF_MASK) >>
2665 MXC_CCM_CHSCCDR_IPU1_DI0_PODF_OFFSET) + 1;
2667 return clk_get_rate(clk->parent) / div;
2670 static int _clk_ipu1_di0_set_rate(struct clk *clk, unsigned long rate)
2673 u32 parent_rate = clk_get_rate(clk->parent);
2675 if ((clk->parent == &ldb_di0_clk) ||
2676 (clk->parent == &ldb_di1_clk)) {
2677 if (parent_rate == rate)
2683 div = parent_rate / rate;
2686 if (((parent_rate / div) != rate) || (div > 8))
2689 reg = __raw_readl(MXC_CCM_CHSCCDR);
2690 reg &= ~MXC_CCM_CHSCCDR_IPU1_DI0_PODF_MASK;
2691 reg |= (div - 1) << MXC_CCM_CHSCCDR_IPU1_DI0_PODF_OFFSET;
2692 __raw_writel(reg, MXC_CCM_CHSCCDR);
2698 static int _clk_ipu1_di0_set_parent(struct clk *clk, struct clk *parent)
2702 if (parent == &ldb_di0_clk)
2704 else if (parent == &ldb_di1_clk)
2707 reg = __raw_readl(MXC_CCM_CHSCCDR)
2708 & ~MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_MASK;
2710 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2711 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
2712 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
2713 reg |= (mux << MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_OFFSET);
2715 __raw_writel(reg, MXC_CCM_CHSCCDR);
2717 /* Derive clock from divided pre-muxed ipu1_di0 clock.*/
2721 reg = __raw_readl(MXC_CCM_CHSCCDR)
2722 & ~MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_MASK;
2723 __raw_writel(reg | (mux << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET),
2729 static unsigned long _clk_ipu1_di1_get_rate(struct clk *clk)
2733 if ((clk->parent == &ldb_di0_clk) ||
2734 (clk->parent == &ldb_di1_clk))
2735 return clk_get_rate(clk->parent);
2737 reg = __raw_readl(MXC_CCM_CHSCCDR);
2739 div = ((reg & MXC_CCM_CHSCCDR_IPU1_DI1_PODF_MASK)
2740 >> MXC_CCM_CHSCCDR_IPU1_DI1_PODF_OFFSET) + 1;
2742 return clk_get_rate(clk->parent) / div;
2745 static int _clk_ipu1_di1_set_rate(struct clk *clk, unsigned long rate)
2748 u32 parent_rate = clk_get_rate(clk->parent);
2750 if ((clk->parent == &ldb_di0_clk) ||
2751 (clk->parent == &ldb_di1_clk)) {
2752 if (parent_rate == rate)
2758 div = parent_rate / rate;
2761 if (((parent_rate / div) != rate) || (div > 8))
2764 reg = __raw_readl(MXC_CCM_CHSCCDR);
2765 reg &= ~MXC_CCM_CHSCCDR_IPU1_DI1_PODF_MASK;
2766 reg |= (div - 1) << MXC_CCM_CHSCCDR_IPU1_DI1_PODF_OFFSET;
2767 __raw_writel(reg, MXC_CCM_CHSCCDR);
2773 static int _clk_ipu1_di1_set_parent(struct clk *clk, struct clk *parent)
2777 if (parent == &ldb_di0_clk)
2779 else if (parent == &ldb_di1_clk)
2782 reg = __raw_readl(MXC_CCM_CHSCCDR)
2783 & ~MXC_CCM_CHSCCDR_IPU1_DI1_PRE_CLK_SEL_MASK;
2785 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2786 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
2787 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
2788 reg |= (mux << MXC_CCM_CHSCCDR_IPU1_DI1_PRE_CLK_SEL_OFFSET);
2790 __raw_writel(reg, MXC_CCM_CHSCCDR);
2792 /* Derive clock from divided pre-muxed ipu1_di0 clock.*/
2795 reg = __raw_readl(MXC_CCM_CHSCCDR)
2796 & ~MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_MASK;
2797 __raw_writel(reg | (mux << MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET),
2803 static struct clk ipu1_di_clk[] = {
2805 __INIT_CLK_DEBUG(ipu1_di_clk_0)
2807 .parent = &pll5_video_main_clk,
2808 .enable_reg = MXC_CCM_CCGR3,
2809 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
2810 .enable = _clk_enable,
2811 .disable = _clk_disable,
2812 .set_parent = _clk_ipu1_di0_set_parent,
2813 .set_rate = _clk_ipu1_di0_set_rate,
2814 .round_rate = _clk_ipu_di_round_rate,
2815 .get_rate = _clk_ipu1_di0_get_rate,
2816 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2819 __INIT_CLK_DEBUG(ipu1_di_clk_1)
2821 .parent = &pll5_video_main_clk,
2822 .enable_reg = MXC_CCM_CCGR3,
2823 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
2824 .enable = _clk_enable,
2825 .disable = _clk_disable,
2826 .set_parent = _clk_ipu1_di1_set_parent,
2827 .set_rate = _clk_ipu1_di1_set_rate,
2828 .round_rate = _clk_ipu_di_round_rate,
2829 .get_rate = _clk_ipu1_di1_get_rate,
2830 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2834 static unsigned long _clk_ipu2_di0_get_rate(struct clk *clk)
2838 if ((clk->parent == &ldb_di0_clk) ||
2839 (clk->parent == &ldb_di1_clk))
2840 return clk_get_rate(clk->parent);
2842 reg = __raw_readl(MXC_CCM_CSCDR2);
2844 div = ((reg & MXC_CCM_CSCDR2_IPU2_DI0_PODF_MASK) >>
2845 MXC_CCM_CSCDR2_IPU2_DI0_PODF_OFFSET) + 1;
2847 return clk_get_rate(clk->parent) / div;
2850 static int _clk_ipu2_di0_set_rate(struct clk *clk, unsigned long rate)
2853 u32 parent_rate = clk_get_rate(clk->parent);
2855 if ((clk->parent == &ldb_di0_clk) ||
2856 (clk->parent == &ldb_di1_clk)) {
2857 if (parent_rate == rate)
2863 div = parent_rate / rate;
2866 if (((parent_rate / div) != rate) || (div > 8))
2869 reg = __raw_readl(MXC_CCM_CSCDR2);
2870 reg &= ~MXC_CCM_CSCDR2_IPU2_DI0_PODF_MASK;
2871 reg |= (div - 1) << MXC_CCM_CSCDR2_IPU2_DI0_PODF_OFFSET;
2872 __raw_writel(reg, MXC_CCM_CSCDR2);
2877 static int _clk_ipu2_di0_set_parent(struct clk *clk, struct clk *parent)
2881 if (parent == &ldb_di0_clk)
2883 else if (parent == &ldb_di1_clk)
2886 reg = __raw_readl(MXC_CCM_CSCDR2)
2887 & ~MXC_CCM_CSCDR2_IPU2_DI0_PRE_CLK_SEL_MASK;
2889 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2890 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
2891 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
2892 reg |= (mux << MXC_CCM_CSCDR2_IPU2_DI0_PRE_CLK_SEL_OFFSET);
2894 __raw_writel(reg, MXC_CCM_CSCDR2);
2896 /* Derive clock from divided pre-muxed ipu2_di0 clock.*/
2899 reg = __raw_readl(MXC_CCM_CSCDR2)
2900 & ~MXC_CCM_CSCDR2_IPU2_DI0_CLK_SEL_MASK;
2901 __raw_writel(reg | (mux << MXC_CCM_CSCDR2_IPU2_DI0_CLK_SEL_OFFSET),
2907 static unsigned long _clk_ipu2_di1_get_rate(struct clk *clk)
2911 if ((clk->parent == &ldb_di0_clk) ||
2912 (clk->parent == &ldb_di1_clk))
2913 return clk_get_rate(clk->parent);
2915 reg = __raw_readl(MXC_CCM_CSCDR2);
2917 div = ((reg & MXC_CCM_CSCDR2_IPU2_DI1_PODF_MASK)
2918 >> MXC_CCM_CSCDR2_IPU2_DI1_PODF_OFFSET) + 1;
2920 return clk_get_rate(clk->parent) / div;
2923 static int _clk_ipu2_di1_set_rate(struct clk *clk, unsigned long rate)
2926 u32 parent_rate = clk_get_rate(clk->parent);
2928 if ((clk->parent == &ldb_di0_clk) ||
2929 (clk->parent == &ldb_di1_clk)) {
2930 if (parent_rate == rate)
2936 div = parent_rate / rate;
2939 if (((parent_rate / div) != rate) || (div > 8))
2942 reg = __raw_readl(MXC_CCM_CSCDR2);
2943 reg &= ~MXC_CCM_CSCDR2_IPU2_DI1_PODF_MASK;
2944 reg |= (div - 1) << MXC_CCM_CSCDR2_IPU2_DI1_PODF_OFFSET;
2945 __raw_writel(reg, MXC_CCM_CSCDR2);
2950 static int _clk_ipu2_di1_set_parent(struct clk *clk, struct clk *parent)
2954 if (parent == &ldb_di0_clk)
2956 else if (parent == &ldb_di1_clk)
2959 reg = __raw_readl(MXC_CCM_CSCDR2)
2960 & ~MXC_CCM_CSCDR2_IPU2_DI1_PRE_CLK_SEL_MASK;
2962 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2963 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
2964 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
2965 reg |= (mux << MXC_CCM_CSCDR2_IPU2_DI1_PRE_CLK_SEL_OFFSET);
2967 __raw_writel(reg, MXC_CCM_CSCDR2);
2969 /* Derive clock from divided pre-muxed ipu1_di0 clock.*/
2972 reg = __raw_readl(MXC_CCM_CSCDR2)
2973 & ~MXC_CCM_CSCDR2_IPU2_DI1_CLK_SEL_MASK;
2974 __raw_writel(reg | (mux << MXC_CCM_CSCDR2_IPU2_DI1_CLK_SEL_OFFSET),
2980 static struct clk ipu2_di_clk[] = {
2982 __INIT_CLK_DEBUG(ipu2_di_clk_0)
2984 .parent = &pll5_video_main_clk,
2985 .enable_reg = MXC_CCM_CCGR3,
2986 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
2987 .enable = _clk_enable,
2988 .disable = _clk_disable,
2989 .set_parent = _clk_ipu2_di0_set_parent,
2990 .set_rate = _clk_ipu2_di0_set_rate,
2991 .round_rate = _clk_ipu_di_round_rate,
2992 .get_rate = _clk_ipu2_di0_get_rate,
2993 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2996 __INIT_CLK_DEBUG(ipu2_di_clk_1)
2998 .parent = &pll5_video_main_clk,
2999 .enable_reg = MXC_CCM_CCGR3,
3000 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
3001 .enable = _clk_enable,
3002 .disable = _clk_disable,
3003 .set_parent = _clk_ipu2_di1_set_parent,
3004 .set_rate = _clk_ipu2_di1_set_rate,
3005 .round_rate = _clk_ipu_di_round_rate,
3006 .get_rate = _clk_ipu2_di1_get_rate,
3007 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3011 static struct clk can2_clk[] = {
3013 __INIT_CLK_DEBUG(can2_module_clk)
3015 .parent = &pll3_60M,
3016 .enable_reg = MXC_CCM_CCGR0,
3017 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
3018 .enable = _clk_enable,
3019 .disable = _clk_disable,
3020 .secondary = &can2_clk[1],
3021 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3024 __INIT_CLK_DEBUG(can2_serial_clk)
3026 .parent = &pll3_60M,
3027 .enable_reg = MXC_CCM_CCGR0,
3028 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
3029 .enable = _clk_enable,
3030 .disable = _clk_disable,
3035 static struct clk can1_clk[] = {
3037 __INIT_CLK_DEBUG(can1_module_clk)
3039 .parent = &pll3_60M,
3040 .enable_reg = MXC_CCM_CCGR0,
3041 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
3042 .enable = _clk_enable,
3043 .disable = _clk_disable,
3044 .secondary = &can1_clk[1],
3045 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3048 __INIT_CLK_DEBUG(can1_serial_clk)
3050 .parent = &pll3_60M,
3051 .enable_reg = MXC_CCM_CCGR0,
3052 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
3053 .enable = _clk_enable,
3054 .disable = _clk_disable,
3058 static unsigned long _clk_spdif_round_rate(struct clk *clk,
3062 u32 parent_rate = clk_get_rate(clk->parent);
3063 u32 div = parent_rate / rate;
3065 if (parent_rate % rate)
3068 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3070 return parent_rate / (pre * post);
3073 static int _clk_spdif0_set_parent(struct clk *clk, struct clk *parent)
3077 reg = __raw_readl(MXC_CCM_CDCDR)
3078 & ~MXC_CCM_CDCDR_SPDIF0_CLK_SEL_MASK;
3080 mux = _get_mux6(parent, &pll4_audio_main_clk,
3081 &pll3_pfd_508M, &pll3_pfd_454M,
3082 &pll3_sw_clk, NULL, NULL);
3083 reg |= mux << MXC_CCM_CDCDR_SPDIF0_CLK_SEL_OFFSET;
3085 __raw_writel(reg, MXC_CCM_CDCDR);
3090 static unsigned long _clk_spdif0_get_rate(struct clk *clk)
3092 u32 reg, pred, podf;
3094 reg = __raw_readl(MXC_CCM_CDCDR);
3096 pred = ((reg & MXC_CCM_CDCDR_SPDIF0_CLK_PRED_MASK)
3097 >> MXC_CCM_CDCDR_SPDIF0_CLK_PRED_OFFSET) + 1;
3098 podf = ((reg & MXC_CCM_CDCDR_SPDIF0_CLK_PODF_MASK)
3099 >> MXC_CCM_CDCDR_SPDIF0_CLK_PODF_OFFSET) + 1;
3101 return clk_get_rate(clk->parent) / (pred * podf);
3104 static int _clk_spdif0_set_rate(struct clk *clk, unsigned long rate)
3106 u32 reg, div, pre, post;
3107 u32 parent_rate = clk_get_rate(clk->parent);
3109 div = parent_rate / rate;
3112 if (((parent_rate / div) != rate) || div > 64)
3115 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3117 reg = __raw_readl(MXC_CCM_CDCDR);
3118 reg &= ~(MXC_CCM_CDCDR_SPDIF0_CLK_PRED_MASK|
3119 MXC_CCM_CDCDR_SPDIF0_CLK_PODF_MASK);
3120 reg |= (post - 1) << MXC_CCM_CDCDR_SPDIF0_CLK_PODF_OFFSET;
3121 reg |= (pre - 1) << MXC_CCM_CDCDR_SPDIF0_CLK_PRED_OFFSET;
3123 __raw_writel(reg, MXC_CCM_CDCDR);
3128 static struct clk spdif0_clk[] = {
3130 __INIT_CLK_DEBUG(spdif0_clk_0)
3132 .parent = &pll3_sw_clk,
3133 .enable = _clk_enable,
3134 .enable_reg = MXC_CCM_CCGR5,
3135 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
3136 .disable = _clk_disable,
3137 .secondary = &spdif0_clk[1],
3138 .set_rate = _clk_spdif0_set_rate,
3139 .get_rate = _clk_spdif0_get_rate,
3140 .set_parent = _clk_spdif0_set_parent,
3141 .round_rate = _clk_spdif_round_rate,
3142 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3145 __INIT_CLK_DEBUG(spdif0_clk_1)
3148 .secondary = &spba_clk,
3152 static unsigned long _clk_esai_round_rate(struct clk *clk,
3156 u32 parent_rate = clk_get_rate(clk->parent);
3157 u32 div = parent_rate / rate;
3159 if (parent_rate % rate)
3162 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3164 return parent_rate / (pre * post);
3167 static int _clk_esai_set_parent(struct clk *clk, struct clk *parent)
3171 reg = __raw_readl(MXC_CCM_CSCMR2) & ~MXC_CCM_CSCMR2_ESAI_CLK_SEL_MASK;
3173 mux = _get_mux6(parent, &pll4_audio_main_clk, &pll3_pfd_508M,
3174 &pll3_pfd_454M, &pll3_sw_clk, NULL, NULL);
3175 reg |= mux << MXC_CCM_CSCMR2_ESAI_CLK_SEL_OFFSET;
3177 __raw_writel(reg, MXC_CCM_CSCMR2);
3182 static unsigned long _clk_esai_get_rate(struct clk *clk)
3184 u32 reg, pred, podf;
3186 reg = __raw_readl(MXC_CCM_CS1CDR);
3188 pred = ((reg & MXC_CCM_CS1CDR_ESAI_CLK_PRED_MASK)
3189 >> MXC_CCM_CS1CDR_ESAI_CLK_PRED_OFFSET) + 1;
3190 podf = ((reg & MXC_CCM_CS1CDR_ESAI_CLK_PODF_MASK)
3191 >> MXC_CCM_CS1CDR_ESAI_CLK_PODF_OFFSET) + 1;
3193 return clk_get_rate(clk->parent) / (pred * podf);
3196 static int _clk_esai_set_rate(struct clk *clk, unsigned long rate)
3198 u32 reg, div, pre, post;
3199 u32 parent_rate = clk_get_rate(clk->parent);
3201 div = parent_rate / rate;
3204 if (((parent_rate / div) != rate) || div > 64)
3207 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3209 reg = __raw_readl(MXC_CCM_CS1CDR);
3210 reg &= ~(MXC_CCM_CS1CDR_ESAI_CLK_PRED_MASK|
3211 MXC_CCM_CS1CDR_ESAI_CLK_PODF_MASK);
3212 reg |= (post - 1) << MXC_CCM_CS1CDR_ESAI_CLK_PODF_OFFSET;
3213 reg |= (pre - 1) << MXC_CCM_CS1CDR_ESAI_CLK_PRED_OFFSET;
3215 __raw_writel(reg, MXC_CCM_CS1CDR);
3220 static struct clk esai_clk = {
3221 __INIT_CLK_DEBUG(esai_clk)
3223 .parent = &pll3_sw_clk,
3224 .secondary = &spba_clk,
3225 .enable_reg = MXC_CCM_CCGR1,
3226 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
3227 .enable = _clk_enable,
3228 .disable = _clk_disable,
3229 .set_rate = _clk_esai_set_rate,
3230 .get_rate = _clk_esai_get_rate,
3231 .set_parent = _clk_esai_set_parent,
3232 .round_rate = _clk_esai_round_rate,
3235 static int _clk_enet_enable(struct clk *clk)
3239 /* Enable ENET ref clock */
3240 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
3241 reg &= ~ANADIG_PLL_BYPASS;
3242 reg &= ~ANADIG_PLL_ENABLE;
3243 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
3249 static void _clk_enet_disable(struct clk *clk)
3255 /* Enable ENET ref clock */
3256 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
3257 reg |= ANADIG_PLL_BYPASS;
3258 reg |= ANADIG_PLL_ENABLE;
3259 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
3262 static int _clk_enet_set_rate(struct clk *clk, unsigned long rate)
3264 unsigned int reg, div = 1;
3282 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
3283 reg &= ~ANADIG_PLL_ENET_DIV_SELECT_MASK;
3284 reg |= (div << ANADIG_PLL_ENET_DIV_SELECT_OFFSET);
3285 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
3290 static unsigned long _clk_enet_get_rate(struct clk *clk)
3294 div = (__raw_readl(PLL8_ENET_BASE_ADDR))
3295 & ANADIG_PLL_ENET_DIV_SELECT_MASK;
3297 return 500000000 / (div + 1);
3300 static struct clk enet_clk[] = {
3302 __INIT_CLK_DEBUG(enet_clk)
3304 .parent = &pll8_enet_main_clk,
3305 .enable_reg = MXC_CCM_CCGR1,
3306 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
3307 .enable = _clk_enet_enable,
3308 .disable = _clk_enet_disable,
3309 .set_rate = _clk_enet_set_rate,
3310 .get_rate = _clk_enet_get_rate,
3311 .secondary = &enet_clk[1],
3312 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3315 .parent = &mmdc_ch0_axi_clk[0],
3316 .secondary = &mx6per1_clk,
3320 static struct clk ecspi_clk[] = {
3322 __INIT_CLK_DEBUG(ecspi0_clk)
3324 .parent = &pll3_60M,
3325 .secondary = &spba_clk,
3326 .enable_reg = MXC_CCM_CCGR1,
3327 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
3328 .enable = _clk_enable,
3329 .disable = _clk_disable,
3332 __INIT_CLK_DEBUG(ecspi1_clk)
3334 .parent = &pll3_60M,
3335 .secondary = &spba_clk,
3336 .enable_reg = MXC_CCM_CCGR1,
3337 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
3338 .enable = _clk_enable,
3339 .disable = _clk_disable,
3342 __INIT_CLK_DEBUG(ecspi2_clk)
3344 .parent = &pll3_60M,
3345 .secondary = &spba_clk,
3346 .enable_reg = MXC_CCM_CCGR1,
3347 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
3348 .enable = _clk_enable,
3349 .disable = _clk_disable,
3352 __INIT_CLK_DEBUG(ecspi3_clk)
3354 .parent = &pll3_60M,
3355 .secondary = &spba_clk,
3356 .enable_reg = MXC_CCM_CCGR1,
3357 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
3358 .enable = _clk_enable,
3359 .disable = _clk_disable,
3362 __INIT_CLK_DEBUG(ecspi4_clk)
3364 .parent = &pll3_60M,
3365 .secondary = &spba_clk,
3366 .enable_reg = MXC_CCM_CCGR1,
3367 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
3368 .enable = _clk_enable,
3369 .disable = _clk_disable,
3373 static unsigned long _clk_emi_slow_round_rate(struct clk *clk,
3377 u32 parent_rate = clk_get_rate(clk->parent);
3379 div = parent_rate / rate;
3381 /* Make sure rate is not greater than the maximum value for the clock.
3382 * Also prevent a div of 0.
3390 return parent_rate / div;
3393 static int _clk_emi_slow_set_parent(struct clk *clk, struct clk *parent)
3396 u32 reg = __raw_readl(MXC_CCM_CSCMR1)
3397 & ~MXC_CCM_CSCMR1_ACLK_EMI_SLOW_MASK;
3399 mux = _get_mux6(parent, &axi_clk, &pll3_usb_otg_main_clk,
3400 &pll2_pfd_400M, &pll2_pfd_352M, NULL, NULL);
3401 reg |= (mux << MXC_CCM_CSCMR1_ACLK_EMI_SLOW_OFFSET);
3402 __raw_writel(reg, MXC_CCM_CSCMR1);
3407 static unsigned long _clk_emi_slow_get_rate(struct clk *clk)
3411 reg = __raw_readl(MXC_CCM_CSCMR1);
3412 div = ((reg & MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK) >>
3413 MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET) + 1;
3415 return clk_get_rate(clk->parent) / div;
3418 static int _clk_emi_slow_set_rate(struct clk *clk, unsigned long rate)
3421 u32 parent_rate = clk_get_rate(clk->parent);
3423 div = parent_rate / rate;
3426 if (((parent_rate / div) != rate) || (div > 8))
3429 reg = __raw_readl(MXC_CCM_CSCMR1);
3430 reg &= ~MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK;
3431 reg |= (div - 1) << MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET;
3432 __raw_writel(reg, MXC_CCM_CSCMR1);
3437 static struct clk emi_slow_clk = {
3438 __INIT_CLK_DEBUG(emi_slow_clk)
3441 .enable_reg = MXC_CCM_CCGR6,
3442 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
3443 .enable = _clk_enable,
3444 .disable = _clk_disable,
3445 .set_rate = _clk_emi_slow_set_rate,
3446 .get_rate = _clk_emi_slow_get_rate,
3447 .round_rate = _clk_emi_slow_round_rate,
3448 .set_parent = _clk_emi_slow_set_parent,
3451 static unsigned long _clk_emi_round_rate(struct clk *clk,
3455 u32 parent_rate = clk_get_rate(clk->parent);
3457 div = parent_rate / rate;
3459 /* Make sure rate is not greater than the maximum value for the clock.
3460 * Also prevent a div of 0.
3468 return parent_rate / div;
3471 static int _clk_emi_set_parent(struct clk *clk, struct clk *parent)
3474 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_ACLK_EMI_MASK;
3476 mux = _get_mux6(parent, &axi_clk, &pll3_usb_otg_main_clk,
3477 &pll2_pfd_400M, &pll2_pfd_352M, NULL, NULL);
3478 reg |= (mux << MXC_CCM_CSCMR1_ACLK_EMI_OFFSET);
3479 __raw_writel(reg, MXC_CCM_CSCMR1);
3484 static unsigned long _clk_emi_get_rate(struct clk *clk)
3488 reg = __raw_readl(MXC_CCM_CSCMR1);
3489 div = ((reg & MXC_CCM_CSCMR1_ACLK_EMI_PODF_MASK) >>
3490 MXC_CCM_CSCMR1_ACLK_EMI_PODF_OFFSET) + 1;
3492 return clk_get_rate(clk->parent) / div;
3495 static int _clk_emi_set_rate(struct clk *clk, unsigned long rate)
3498 u32 parent_rate = clk_get_rate(clk->parent);
3500 div = parent_rate / rate;
3503 if (((parent_rate / div) != rate) || (div > 8))
3506 reg = __raw_readl(MXC_CCM_CSCMR1);
3507 reg &= ~MXC_CCM_CSCMR1_ACLK_EMI_PODF_MASK;
3508 reg |= (div - 1) << MXC_CCM_CSCMR1_ACLK_EMI_PODF_OFFSET;
3509 __raw_writel(reg, MXC_CCM_CSCMR1);
3514 static struct clk emi_clk = {
3515 __INIT_CLK_DEBUG(emi_clk)
3518 .set_rate = _clk_emi_set_rate,
3519 .get_rate = _clk_emi_get_rate,
3520 .round_rate = _clk_emi_round_rate,
3521 .set_parent = _clk_emi_set_parent,
3524 static unsigned long _clk_enfc_round_rate(struct clk *clk,
3528 u32 parent_rate = clk_get_rate(clk->parent);
3529 u32 div = parent_rate / rate;
3531 if (parent_rate % rate)
3534 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
3536 return parent_rate / (pre * post);
3539 static int _clk_enfc_set_parent(struct clk *clk, struct clk *parent)
3543 reg = __raw_readl(MXC_CCM_CS2CDR)
3544 & ~MXC_CCM_CS2CDR_ENFC_CLK_SEL_MASK;
3546 mux = _get_mux6(parent, &pll2_pfd_352M,
3547 &pll2_528_bus_main_clk, &pll3_usb_otg_main_clk,
3548 &pll2_pfd_400M, NULL, NULL);
3549 reg |= mux << MXC_CCM_CS2CDR_ENFC_CLK_SEL_OFFSET;
3551 __raw_writel(reg, MXC_CCM_CS2CDR);
3556 static unsigned long _clk_enfc_get_rate(struct clk *clk)
3558 u32 reg, pred, podf;
3560 reg = __raw_readl(MXC_CCM_CS2CDR);
3562 pred = ((reg & MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK)
3563 >> MXC_CCM_CS2CDR_ENFC_CLK_PRED_OFFSET) + 1;
3564 podf = ((reg & MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK)
3565 >> MXC_CCM_CS2CDR_ENFC_CLK_PODF_OFFSET) + 1;
3567 return clk_get_rate(clk->parent) / (pred * podf);
3570 static int _clk_enfc_set_rate(struct clk *clk, unsigned long rate)
3572 u32 reg, div, pre, post;
3573 u32 parent_rate = clk_get_rate(clk->parent);
3575 div = parent_rate / rate;
3578 if (((parent_rate / div) != rate) || div > 512)
3581 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
3583 reg = __raw_readl(MXC_CCM_CS2CDR);
3584 reg &= ~(MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK|
3585 MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK);
3586 reg |= (post - 1) << MXC_CCM_CS2CDR_ENFC_CLK_PODF_OFFSET;
3587 reg |= (pre - 1) << MXC_CCM_CS2CDR_ENFC_CLK_PRED_OFFSET;
3589 __raw_writel(reg, MXC_CCM_CS2CDR);
3594 static struct clk enfc_clk = {
3595 __INIT_CLK_DEBUG(enfc_clk)
3597 .parent = &pll2_pfd_352M,
3598 .enable_reg = MXC_CCM_CCGR2,
3599 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
3600 .enable = _clk_enable,
3601 .disable = _clk_disable,
3602 .set_rate = _clk_enfc_set_rate,
3603 .get_rate = _clk_enfc_get_rate,
3604 .round_rate = _clk_enfc_round_rate,
3605 .set_parent = _clk_enfc_set_parent,
3608 static unsigned long _clk_uart_round_rate(struct clk *clk,
3612 u32 parent_rate = clk_get_rate(clk->parent);
3614 div = parent_rate / rate;
3616 /* Make sure rate is not greater than the maximum value for the clock.
3617 * Also prevent a div of 0.
3625 return parent_rate / div;
3628 static int _clk_uart_set_rate(struct clk *clk, unsigned long rate)
3631 u32 parent_rate = clk_get_rate(clk->parent);
3633 div = parent_rate / rate;
3636 if (((parent_rate / div) != rate) || (div > 64))
3639 reg = __raw_readl(MXC_CCM_CSCDR1) & MXC_CCM_CSCDR1_UART_CLK_PODF_MASK;
3640 reg |= ((div - 1) << MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET);
3642 __raw_writel(reg, MXC_CCM_CSCDR1);
3647 static unsigned long _clk_uart_get_rate(struct clk *clk)
3652 reg = __raw_readl(MXC_CCM_CSCDR1) & MXC_CCM_CSCDR1_UART_CLK_PODF_MASK;
3653 div = (reg >> MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET) + 1;
3654 val = clk_get_rate(clk->parent) / div;
3659 static struct clk uart_clk[] = {
3661 __INIT_CLK_DEBUG(uart_clk)
3663 .parent = &pll3_80M,
3664 .enable_reg = MXC_CCM_CCGR5,
3665 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
3666 .enable = _clk_enable,
3667 .disable = _clk_disable,
3668 .secondary = &uart_clk[1],
3669 .set_rate = _clk_uart_set_rate,
3670 .get_rate = _clk_uart_get_rate,
3671 .round_rate = _clk_uart_round_rate,
3674 __INIT_CLK_DEBUG(uart_serial_clk)
3676 .enable_reg = MXC_CCM_CCGR5,
3677 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
3678 .enable = _clk_enable,
3679 .disable = _clk_disable,
3683 static unsigned long _clk_hsi_tx_round_rate(struct clk *clk,
3687 u32 parent_rate = clk_get_rate(clk->parent);
3689 div = parent_rate / rate;
3691 /* Make sure rate is not greater than the maximum value for the clock.
3692 * Also prevent a div of 0.
3700 return parent_rate / div;
3703 static int _clk_hsi_tx_set_parent(struct clk *clk, struct clk *parent)
3705 u32 reg = __raw_readl(MXC_CCM_CDCDR) & ~MXC_CCM_CDCDR_HSI_TX_CLK_SEL;
3707 if (parent == &pll2_pfd_400M)
3708 reg |= (MXC_CCM_CDCDR_HSI_TX_CLK_SEL);
3710 __raw_writel(reg, MXC_CCM_CDCDR);
3715 static unsigned long _clk_hsi_tx_get_rate(struct clk *clk)
3719 reg = __raw_readl(MXC_CCM_CDCDR);
3720 div = ((reg & MXC_CCM_CDCDR_HSI_TX_PODF_MASK) >>
3721 MXC_CCM_CDCDR_HSI_TX_PODF_OFFSET) + 1;
3723 return clk_get_rate(clk->parent) / div;
3726 static int _clk_hsi_tx_set_rate(struct clk *clk, unsigned long rate)
3729 u32 parent_rate = clk_get_rate(clk->parent);
3731 div = parent_rate / rate;
3734 if (((parent_rate / div) != rate) || (div > 8))
3737 reg = __raw_readl(MXC_CCM_CDCDR);
3738 reg &= ~MXC_CCM_CDCDR_HSI_TX_PODF_MASK;
3739 reg |= (div - 1) << MXC_CCM_CDCDR_HSI_TX_PODF_OFFSET;
3740 __raw_writel(reg, MXC_CCM_CDCDR);
3745 static struct clk hsi_tx_clk[] = {
3747 __INIT_CLK_DEBUG(hsi_tx_clk)
3749 .parent = &pll2_pfd_400M,
3750 .enable_reg = MXC_CCM_CCGR3,
3751 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
3752 .enable = _clk_enable,
3753 .disable = _clk_disable,
3754 .set_parent = _clk_hsi_tx_set_parent,
3755 .round_rate = _clk_hsi_tx_round_rate,
3756 .set_rate = _clk_hsi_tx_set_rate,
3757 .get_rate = _clk_hsi_tx_get_rate,
3758 .secondary = &hsi_tx_clk[1],
3759 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3762 .parent = &mx6per1_clk,
3763 .secondary = &mx6per2_clk,
3767 static struct clk hdmi_clk[] = {
3769 __INIT_CLK_DEBUG(hdmi_isfr_clk)
3771 .parent = &pll3_pfd_540M,
3772 .enable_reg = MXC_CCM_CCGR2,
3773 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
3774 .enable = _clk_enable,
3775 .disable = _clk_disable,
3776 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3779 __INIT_CLK_DEBUG(hdmi_iahb_clk)
3782 .enable_reg = MXC_CCM_CCGR2,
3783 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
3784 .enable = _clk_enable,
3785 .disable = _clk_disable,
3789 static struct clk caam_clk[] = {
3791 __INIT_CLK_DEBUG(caam_mem_clk)
3793 .enable_reg = MXC_CCM_CCGR0,
3794 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
3795 .enable = _clk_enable,
3796 .disable = _clk_disable,
3797 .secondary = &caam_clk[1],
3798 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3801 __INIT_CLK_DEBUG(caam_aclk_clk)
3803 .enable_reg = MXC_CCM_CCGR0,
3804 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
3805 .enable = _clk_enable,
3806 .disable = _clk_disable,
3807 .secondary = &caam_clk[2],
3810 __INIT_CLK_DEBUG(caam_ipg_clk)
3812 .enable_reg = MXC_CCM_CCGR0,
3813 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
3814 .enable = _clk_enable,
3815 .disable = _clk_disable,
3816 .parent = &mmdc_ch0_axi_clk[0],
3817 .secondary = &mx6per1_clk,
3821 static int _clk_asrc_serial_set_parent(struct clk *clk, struct clk *parent)
3825 reg = __raw_readl(MXC_CCM_CDCDR) & ~MXC_CCM_CDCDR_SPDIF1_CLK_SEL_MASK;
3827 mux = _get_mux6(parent, &pll4_audio_main_clk, &pll3_pfd_508M,
3828 &pll3_pfd_454M, &pll3_sw_clk, NULL, NULL);
3829 reg |= mux << MXC_CCM_CDCDR_SPDIF1_CLK_SEL_OFFSET;
3831 __raw_writel(reg, MXC_CCM_CDCDR);
3836 static unsigned long _clk_asrc_serial_get_rate(struct clk *clk)
3838 u32 reg, pred, podf;
3840 reg = __raw_readl(MXC_CCM_CDCDR);
3842 pred = ((reg & MXC_CCM_CDCDR_SPDIF1_CLK_PRED_MASK)
3843 >> MXC_CCM_CDCDR_SPDIF1_CLK_PRED_OFFSET) + 1;
3844 podf = ((reg & MXC_CCM_CDCDR_SPDIF1_CLK_PODF_MASK)
3845 >> MXC_CCM_CDCDR_SPDIF1_CLK_PODF_OFFSET) + 1;
3847 return clk_get_rate(clk->parent) / (pred * podf);
3850 static int _clk_asrc_serial_set_rate(struct clk *clk, unsigned long rate)
3852 u32 reg, div, pre, post;
3853 u32 parent_rate = clk_get_rate(clk->parent);
3855 div = parent_rate / rate;
3858 if (((parent_rate / div) != rate) || div > 64)
3861 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3863 reg = __raw_readl(MXC_CCM_CDCDR);
3864 reg &= ~(MXC_CCM_CDCDR_SPDIF1_CLK_PRED_MASK|
3865 MXC_CCM_CDCDR_SPDIF1_CLK_PODF_MASK);
3866 reg |= (post - 1) << MXC_CCM_CDCDR_SPDIF1_CLK_PODF_OFFSET;
3867 reg |= (pre - 1) << MXC_CCM_CDCDR_SPDIF1_CLK_PRED_OFFSET;
3869 __raw_writel(reg, MXC_CCM_CDCDR);
3874 static unsigned long _clk_asrc_serial_round_rate(struct clk *clk,
3878 u32 parent_rate = clk_get_rate(clk->parent);
3879 u32 div = parent_rate / rate;
3881 if (parent_rate % rate)
3884 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3886 return parent_rate / (pre * post);
3889 static struct clk asrc_clk[] = {
3891 __INIT_CLK_DEBUG(asrc_clk)
3893 .parent = &pll4_audio_main_clk,
3894 .enable_reg = MXC_CCM_CCGR0,
3895 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
3896 .enable = _clk_enable,
3897 .disable = _clk_disable,
3898 .secondary = &spba_clk,
3901 /*In the MX6 spec, asrc_serial_clk is listed as SPDIF1 clk
3902 * This clock can never be gated and does not have any
3903 * CCGR bits associated with it.
3905 __INIT_CLK_DEBUG(asrc_serial_clk)
3907 .parent = &pll3_sw_clk,
3908 .set_rate = _clk_asrc_serial_set_rate,
3909 .get_rate = _clk_asrc_serial_get_rate,
3910 .set_parent = _clk_asrc_serial_set_parent,
3911 .round_rate = _clk_asrc_serial_round_rate,
3915 static struct clk apbh_dma_clk = {
3916 __INIT_CLK_DEBUG(apbh_dma_clk)
3917 .parent = &usdhc3_clk,
3918 .secondary = &mx6per1_clk,
3919 .enable = _clk_enable,
3920 .disable = _clk_disable_inwait,
3921 .enable_reg = MXC_CCM_CCGR0,
3922 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
3925 static struct clk aips_tz2_clk = {
3926 __INIT_CLK_DEBUG(aips_tz2_clk)
3928 .enable_reg = MXC_CCM_CCGR0,
3929 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
3930 .enable = _clk_enable,
3931 .disable = _clk_disable_inwait,
3934 static struct clk aips_tz1_clk = {
3935 __INIT_CLK_DEBUG(aips_tz1_clk)
3937 .enable_reg = MXC_CCM_CCGR0,
3938 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
3939 .enable = _clk_enable,
3940 .disable = _clk_disable_inwait,
3944 static struct clk openvg_axi_clk = {
3945 __INIT_CLK_DEBUG(openvg_axi_clk)
3946 .parent = &gpu2d_axi_clk,
3947 .enable = _clk_enable,
3948 .enable_reg = MXC_CCM_CCGR3,
3949 .enable_shift = MXC_CCM_CCGRx_CG15_OFFSET,
3950 .disable = _clk_disable,
3951 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3954 static unsigned long _clk_gpu3d_core_round_rate(struct clk *clk,
3958 u32 parent_rate = clk_get_rate(clk->parent);
3960 div = parent_rate / rate;
3962 /* Make sure rate is not greater than the maximum value for the clock.
3963 * Also prevent a div of 0.
3971 return parent_rate / div;
3974 static int _clk_gpu3d_core_set_parent(struct clk *clk, struct clk *parent)
3977 u32 reg = __raw_readl(MXC_CCM_CBCMR)
3978 & ~MXC_CCM_CBCMR_GPU3D_CORE_CLK_SEL_MASK;
3980 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
3981 &pll3_usb_otg_main_clk,
3982 &pll2_pfd_594M, &pll2_pfd_400M, NULL, NULL);
3983 reg |= (mux << MXC_CCM_CBCMR_GPU3D_CORE_CLK_SEL_OFFSET);
3984 __raw_writel(reg, MXC_CCM_CBCMR);
3989 static unsigned long _clk_gpu3d_core_get_rate(struct clk *clk)
3993 reg = __raw_readl(MXC_CCM_CBCMR);
3994 div = ((reg & MXC_CCM_CBCMR_GPU3D_CORE_PODF_MASK) >>
3995 MXC_CCM_CBCMR_GPU3D_CORE_PODF_OFFSET) + 1;
3997 return clk_get_rate(clk->parent) / div;
4000 static int _clk_gpu3d_core_set_rate(struct clk *clk, unsigned long rate)
4003 u32 parent_rate = clk_get_rate(clk->parent);
4005 div = parent_rate / rate;
4011 reg = __raw_readl(MXC_CCM_CBCMR);
4012 reg &= ~MXC_CCM_CBCMR_GPU3D_CORE_PODF_MASK;
4013 reg |= (div - 1) << MXC_CCM_CBCMR_GPU3D_CORE_PODF_OFFSET;
4014 __raw_writel(reg, MXC_CCM_CBCMR);
4019 static struct clk gpu3d_core_clk[] = {
4021 __INIT_CLK_DEBUG(gpu3d_core_clk)
4022 .parent = &pll2_pfd_594M,
4023 .enable = _clk_enable,
4024 .enable_reg = MXC_CCM_CCGR1,
4025 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
4026 .disable = _clk_disable,
4027 .set_parent = _clk_gpu3d_core_set_parent,
4028 .set_rate = _clk_gpu3d_core_set_rate,
4029 .get_rate = _clk_gpu3d_core_get_rate,
4030 .round_rate = _clk_gpu3d_core_round_rate,
4031 .secondary = &gpu3d_core_clk[1],
4032 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4035 .parent = &gpu3d_axi_clk,
4036 .secondary = &mx6fast1_clk,
4040 static unsigned long _clk_gpu2d_core_round_rate(struct clk *clk,
4044 u32 parent_rate = clk_get_rate(clk->parent);
4046 div = parent_rate / rate;
4048 /* Make sure rate is not greater than the maximum value for the clock.
4049 * Also prevent a div of 0.
4057 return parent_rate / div;
4060 static int _clk_gpu2d_core_set_parent(struct clk *clk, struct clk *parent)
4063 u32 reg = __raw_readl(MXC_CCM_CBCMR) &
4064 ~MXC_CCM_CBCMR_GPU2D_CLK_SEL_MASK;
4066 mux = _get_mux6(parent, &axi_clk, &pll3_usb_otg_main_clk,
4067 &pll2_pfd_352M, &pll2_pfd_400M, NULL, NULL);
4068 reg |= (mux << MXC_CCM_CBCMR_GPU2D_CLK_SEL_OFFSET);
4069 __raw_writel(reg, MXC_CCM_CBCMR);
4074 static unsigned long _clk_gpu2d_core_get_rate(struct clk *clk)
4078 reg = __raw_readl(MXC_CCM_CBCMR);
4079 div = ((reg & MXC_CCM_CBCMR_GPU2D_CORE_PODF_MASK) >>
4080 MXC_CCM_CBCMR_GPU2D_CORE_PODF_OFFSET) + 1;
4082 return clk_get_rate(clk->parent) / div;
4085 static int _clk_gpu2d_core_set_rate(struct clk *clk, unsigned long rate)
4088 u32 parent_rate = clk_get_rate(clk->parent);
4090 div = parent_rate / rate;
4093 if (((parent_rate / div) != rate) || (div > 8))
4096 reg = __raw_readl(MXC_CCM_CBCMR);
4097 reg &= ~MXC_CCM_CBCMR_GPU3D_CORE_PODF_MASK;
4098 reg |= (div - 1) << MXC_CCM_CBCMR_GPU3D_CORE_PODF_OFFSET;
4099 __raw_writel(reg, MXC_CCM_CBCMR);
4103 static struct clk gpu2d_core_clk[] = {
4105 __INIT_CLK_DEBUG(gpu2d_core_clk)
4106 .parent = &pll2_pfd_352M,
4107 .enable = _clk_enable,
4108 .enable_reg = MXC_CCM_CCGR1,
4109 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
4110 .disable = _clk_disable,
4111 .set_parent = _clk_gpu2d_core_set_parent,
4112 .set_rate = _clk_gpu2d_core_set_rate,
4113 .get_rate = _clk_gpu2d_core_get_rate,
4114 .round_rate = _clk_gpu2d_core_round_rate,
4115 .secondary = &gpu2d_core_clk[0],
4116 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4119 .parent = &gpu2d_axi_clk,
4120 .secondary = &mx6fast1_clk,
4124 static unsigned long _clk_gpu3d_shader_round_rate(struct clk *clk,
4128 u32 parent_rate = clk_get_rate(clk->parent);
4130 div = parent_rate / rate;
4132 /* Make sure rate is not greater than the maximum value for the clock.
4133 * Also prevent a div of 0.
4141 return parent_rate / div;
4144 static int _clk_gpu3d_shader_set_parent(struct clk *clk, struct clk *parent)
4147 u32 reg = __raw_readl(MXC_CCM_CBCMR)
4148 & ~MXC_CCM_CBCMR_GPU3D_SHADER_CLK_SEL_MASK;
4150 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
4151 &pll3_usb_otg_main_clk,
4152 &pll2_pfd_594M, &pll3_pfd_720M, NULL, NULL);
4153 reg |= (mux << MXC_CCM_CBCMR_GPU3D_SHADER_CLK_SEL_OFFSET);
4154 __raw_writel(reg, MXC_CCM_CBCMR);
4159 static unsigned long _clk_gpu3d_shader_get_rate(struct clk *clk)
4163 reg = __raw_readl(MXC_CCM_CBCMR);
4164 div = ((reg & MXC_CCM_CBCMR_GPU3D_SHADER_PODF_MASK) >>
4165 MXC_CCM_CBCMR_GPU3D_SHADER_PODF_OFFSET) + 1;
4167 return clk_get_rate(clk->parent) / div;
4170 static int _clk_gpu3d_shader_set_rate(struct clk *clk, unsigned long rate)
4173 u32 parent_rate = clk_get_rate(clk->parent);
4175 div = parent_rate / rate;
4181 reg = __raw_readl(MXC_CCM_CBCMR);
4182 reg &= ~MXC_CCM_CBCMR_GPU3D_SHADER_PODF_MASK;
4183 reg |= (div - 1) << MXC_CCM_CBCMR_GPU3D_SHADER_PODF_OFFSET;
4184 __raw_writel(reg, MXC_CCM_CBCMR);
4190 static struct clk gpu3d_shader_clk = {
4191 __INIT_CLK_DEBUG(gpu3d_shader_clk)
4192 .parent = &pll3_pfd_720M,
4193 .secondary = &mmdc_ch0_axi_clk[0],
4194 .enable = _clk_enable,
4195 .enable_reg = MXC_CCM_CCGR1,
4196 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
4197 .disable = _clk_disable,
4198 .set_parent = _clk_gpu3d_shader_set_parent,
4199 .set_rate = _clk_gpu3d_shader_set_rate,
4200 .get_rate = _clk_gpu3d_shader_get_rate,
4201 .round_rate = _clk_gpu3d_shader_round_rate,
4202 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4205 /* set the parent by the ipcg table */
4206 static struct clk gpmi_nfc_clk[] = {
4208 __INIT_CLK_DEBUG(gpmi_io_clk)
4209 .parent = &enfc_clk,
4210 .secondary = &gpmi_nfc_clk[1],
4211 .enable = _clk_enable,
4212 .enable_reg = MXC_CCM_CCGR4,
4213 .enable_shift = MXC_CCM_CCGRx_CG14_OFFSET,
4214 .disable = _clk_disable,
4216 { /* gpmi_apb_clk */
4217 __INIT_CLK_DEBUG(gpmi_apb_clk)
4218 .parent = &usdhc3_clk,
4219 .secondary = &gpmi_nfc_clk[2],
4220 .enable = _clk_enable,
4221 .enable_reg = MXC_CCM_CCGR4,
4222 .enable_shift = MXC_CCM_CCGRx_CG15_OFFSET,
4223 .disable = _clk_disable,
4226 __INIT_CLK_DEBUG(gpmi_bch_clk)
4227 .parent = &usdhc4_clk,
4228 .secondary = &gpmi_nfc_clk[3],
4229 .enable = _clk_enable,
4230 .enable_reg = MXC_CCM_CCGR4,
4231 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
4232 .disable = _clk_disable,
4235 __INIT_CLK_DEBUG(gpmi_bch_apb_clk)
4236 .parent = &usdhc3_clk,
4237 .secondary = &gpmi_nfc_clk[4],
4238 .enable = _clk_enable,
4239 .enable_reg = MXC_CCM_CCGR4,
4240 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
4241 .disable = _clk_disable,
4243 { /* bch relative clk */
4244 __INIT_CLK_DEBUG(pl301_mx6qperl_bch)
4245 .parent = &mx6per1_clk,
4246 .secondary = &mmdc_ch0_axi_clk[0],
4250 static struct clk pwm_clk[] = {
4252 __INIT_CLK_DEBUG(pwm_clk_0)
4253 .parent = &ipg_perclk,
4255 .enable_reg = MXC_CCM_CCGR4,
4256 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
4257 .enable = _clk_enable,
4258 .disable = _clk_disable,
4261 __INIT_CLK_DEBUG(pwm_clk_1)
4262 .parent = &ipg_perclk,
4264 .enable_reg = MXC_CCM_CCGR4,
4265 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
4266 .enable = _clk_enable,
4267 .disable = _clk_disable,
4270 __INIT_CLK_DEBUG(pwm_clk_2)
4271 .parent = &ipg_perclk,
4273 .enable_reg = MXC_CCM_CCGR4,
4274 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
4275 .enable = _clk_enable,
4276 .disable = _clk_disable,
4279 __INIT_CLK_DEBUG(pwm_clk_3)
4280 .parent = &ipg_perclk,
4282 .enable_reg = MXC_CCM_CCGR4,
4283 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
4284 .enable = _clk_enable,
4285 .disable = _clk_disable,
4289 static int _clk_pcie_enable(struct clk *clk)
4293 /* Enable SATA ref clock */
4294 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4295 reg |= ANADIG_PLL_ENET_EN_PCIE;
4296 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4303 static void _clk_pcie_disable(struct clk *clk)
4309 /* Disable SATA ref clock */
4310 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4311 reg &= ~ANADIG_PLL_ENET_EN_PCIE;
4312 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4315 static struct clk pcie_clk[] = {
4317 __INIT_CLK_DEBUG(pcie_clk)
4318 .parent = &pcie_axi_clk,
4319 .enable = _clk_pcie_enable,
4320 .disable = _clk_pcie_disable,
4321 .enable_reg = MXC_CCM_CCGR4,
4322 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4323 .secondary = &pcie_clk[1],
4324 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4327 .parent = &mmdc_ch0_axi_clk[0],
4328 .secondary = &mx6fast1_clk,
4332 static int _clk_sata_enable(struct clk *clk)
4336 /* Clear Power Down and Enable PLLs */
4337 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4338 reg &= ~ANADIG_PLL_ENET_POWER_DOWN;
4339 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4341 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4342 reg |= ANADIG_PLL_ENET_EN;
4343 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4345 /* Waiting for the PLL is locked */
4346 if (!WAIT(ANADIG_PLL_ENET_LOCK & __raw_readl(PLL8_ENET_BASE_ADDR),
4348 panic("pll8 lock failed\n");
4350 /* Disable the bypass */
4351 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4352 reg &= ~ANADIG_PLL_ENET_BYPASS;
4353 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4355 /* Enable SATA ref clock */
4356 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4357 reg |= ANADIG_PLL_ENET_EN_SATA;
4358 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4365 static void _clk_sata_disable(struct clk *clk)
4371 /* Disable SATA ref clock */
4372 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4373 reg &= ~ANADIG_PLL_ENET_EN_SATA;
4374 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4377 static struct clk sata_clk[] = {
4379 __INIT_CLK_DEBUG(sata_clk)
4381 .enable = _clk_sata_enable,
4382 .enable_reg = MXC_CCM_CCGR5,
4383 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
4384 .disable = _clk_sata_disable,
4385 .secondary = &sata_clk[1],
4386 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4389 .parent = &mmdc_ch0_axi_clk[0],
4390 .secondary = &mx6per1_clk,
4394 static struct clk usboh3_clk[] = {
4396 __INIT_CLK_DEBUG(usboh3_clk)
4398 .enable = _clk_enable,
4399 .enable_reg = MXC_CCM_CCGR6,
4400 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4401 .disable = _clk_disable,
4402 .secondary = &usboh3_clk[1],
4403 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4406 .parent = &mmdc_ch0_axi_clk[0],
4407 .secondary = &mx6per1_clk,
4411 static int _clk_enable1(struct clk *clk)
4414 reg = __raw_readl(clk->enable_reg);
4415 reg |= 1 << clk->enable_shift;
4416 __raw_writel(reg, clk->enable_reg);
4421 static void _clk_disable1(struct clk *clk)
4424 reg = __raw_readl(clk->enable_reg);
4425 reg &= ~(1 << clk->enable_shift);
4426 __raw_writel(reg, clk->enable_reg);
4429 static int _clk_clko_set_parent(struct clk *clk, struct clk *parent)
4433 if (parent == &pll3_usb_otg_main_clk)
4435 else if (parent == &pll2_528_bus_main_clk)
4437 else if (parent == &pll1_sys_main_clk)
4439 else if (parent == &pll5_video_main_clk)
4441 else if (parent == &axi_clk)
4443 else if (parent == &enfc_clk)
4445 else if (parent == &ipu1_di_clk[0])
4447 else if (parent == &ipu1_di_clk[1])
4449 else if (parent == &ipu2_di_clk[0])
4451 else if (parent == &ipu2_di_clk[1])
4453 else if (parent == &ahb_clk)
4455 else if (parent == &ipg_clk)
4457 else if (parent == &ipg_perclk)
4459 else if (parent == &ckil_clk)
4461 else if (parent == &pll4_audio_main_clk)
4466 reg = __raw_readl(MXC_CCM_CCOSR);
4467 reg &= ~MXC_CCM_CCOSR_CKOL_SEL_MASK;
4468 reg |= sel << MXC_CCM_CCOSR_CKOL_SEL_OFFSET;
4469 __raw_writel(reg, MXC_CCM_CCOSR);
4473 static unsigned long _clk_clko_get_rate(struct clk *clk)
4475 u32 reg = __raw_readl(MXC_CCM_CCOSR);
4476 u32 div = ((reg & MXC_CCM_CCOSR_CKOL_DIV_MASK) >>
4477 MXC_CCM_CCOSR_CKOL_DIV_OFFSET) + 1;
4478 return clk_get_rate(clk->parent) / div;
4481 static int _clk_clko_set_rate(struct clk *clk, unsigned long rate)
4484 u32 parent_rate = clk_get_rate(clk->parent);
4485 u32 div = parent_rate / rate;
4489 if (((parent_rate / div) != rate) || (div > 8))
4492 reg = __raw_readl(MXC_CCM_CCOSR);
4493 reg &= ~MXC_CCM_CCOSR_CKOL_DIV_MASK;
4494 reg |= (div - 1) << MXC_CCM_CCOSR_CKOL_DIV_OFFSET;
4495 __raw_writel(reg, MXC_CCM_CCOSR);
4499 static unsigned long _clk_clko_round_rate(struct clk *clk,
4502 u32 parent_rate = clk_get_rate(clk->parent);
4503 u32 div = parent_rate / rate;
4505 /* Make sure rate is not greater than the maximum value for the clock.
4506 * Also prevent a div of 0.
4512 return parent_rate / div;
4515 static struct clk clko_clk = {
4516 __INIT_CLK_DEBUG(clko_clk)
4517 .parent = &pll2_528_bus_main_clk,
4518 .enable = _clk_enable1,
4519 .enable_reg = MXC_CCM_CCOSR,
4520 .enable_shift = MXC_CCM_CCOSR_CKOL_EN_OFFSET,
4521 .disable = _clk_disable1,
4522 .set_parent = _clk_clko_set_parent,
4523 .set_rate = _clk_clko_set_rate,
4524 .get_rate = _clk_clko_get_rate,
4525 .round_rate = _clk_clko_round_rate,
4528 static struct clk dummy_clk = {
4532 #define _REGISTER_CLOCK(d, n, c) \
4540 static struct clk_lookup lookups[] = {
4541 _REGISTER_CLOCK(NULL, "osc", osc_clk),
4542 _REGISTER_CLOCK(NULL, "ckih", ckih_clk),
4543 _REGISTER_CLOCK(NULL, "ckih2", ckih2_clk),
4544 _REGISTER_CLOCK(NULL, "ckil", ckil_clk),
4545 _REGISTER_CLOCK(NULL, "pll1_main_clk", pll1_sys_main_clk),
4546 _REGISTER_CLOCK(NULL, "pll1_sw_clk", pll1_sw_clk),
4547 _REGISTER_CLOCK(NULL, "pll2", pll2_528_bus_main_clk),
4548 _REGISTER_CLOCK(NULL, "pll2_pfd_400M", pll2_pfd_400M),
4549 _REGISTER_CLOCK(NULL, "pll2_pfd_352M", pll2_pfd_352M),
4550 _REGISTER_CLOCK(NULL, "pll2_pfd_594M", pll2_pfd_594M),
4551 _REGISTER_CLOCK(NULL, "pll2_200M", pll2_200M),
4552 _REGISTER_CLOCK(NULL, "pll3_main_clk", pll3_usb_otg_main_clk),
4553 _REGISTER_CLOCK(NULL, "pll3_pfd_508M", pll3_pfd_508M),
4554 _REGISTER_CLOCK(NULL, "pll3_pfd_454M", pll3_pfd_454M),
4555 _REGISTER_CLOCK(NULL, "pll3_pfd_720M", pll3_pfd_720M),
4556 _REGISTER_CLOCK(NULL, "pll3_pfd_540M", pll3_pfd_540M),
4557 _REGISTER_CLOCK(NULL, "pll3_sw_clk", pll3_sw_clk),
4558 _REGISTER_CLOCK(NULL, "pll3_120M", pll3_120M),
4559 _REGISTER_CLOCK(NULL, "pll3_120M", pll3_80M),
4560 _REGISTER_CLOCK(NULL, "pll3_120M", pll3_60M),
4561 _REGISTER_CLOCK(NULL, "pll4", pll4_audio_main_clk),
4562 _REGISTER_CLOCK(NULL, "pll5", pll5_video_main_clk),
4563 _REGISTER_CLOCK(NULL, "pll4", pll6_MLB_main_clk),
4564 _REGISTER_CLOCK(NULL, "pll3", pll7_usb_host_main_clk),
4565 _REGISTER_CLOCK(NULL, "pll4", pll8_enet_main_clk),
4566 _REGISTER_CLOCK(NULL, "cpu_clk", cpu_clk),
4567 _REGISTER_CLOCK(NULL, "periph_clk", periph_clk),
4568 _REGISTER_CLOCK(NULL, "axi_clk", axi_clk),
4569 _REGISTER_CLOCK(NULL, "mmdc_ch0_axi", mmdc_ch0_axi_clk[0]),
4570 _REGISTER_CLOCK(NULL, "mmdc_ch1_axi", mmdc_ch1_axi_clk[0]),
4571 _REGISTER_CLOCK(NULL, "ahb", ahb_clk),
4572 _REGISTER_CLOCK(NULL, "ipg_clk", ipg_clk),
4573 _REGISTER_CLOCK(NULL, "ipg_perclk", ipg_perclk),
4574 _REGISTER_CLOCK(NULL, "spba", spba_clk),
4575 _REGISTER_CLOCK("imx-sdma", NULL, sdma_clk[0]),
4576 _REGISTER_CLOCK(NULL, "gpu2d_axi_clk", gpu2d_axi_clk),
4577 _REGISTER_CLOCK(NULL, "gpu3d_axi_clk", gpu3d_axi_clk),
4578 _REGISTER_CLOCK(NULL, "pcie_axi_clk", pcie_axi_clk),
4579 _REGISTER_CLOCK(NULL, "vdo_axi_clk", vdo_axi_clk),
4580 _REGISTER_CLOCK(NULL, "iim_clk", iim_clk),
4581 _REGISTER_CLOCK(NULL, "i2c_clk", i2c_clk[0]),
4582 _REGISTER_CLOCK("imx-i2c.1", NULL, i2c_clk[1]),
4583 _REGISTER_CLOCK("imx-i2c.2", NULL, i2c_clk[2]),
4584 _REGISTER_CLOCK(NULL, "vpu_clk", vpu_clk[0]),
4585 _REGISTER_CLOCK(NULL, "ipu1_clk", ipu1_clk),
4586 _REGISTER_CLOCK(NULL, "ipu2_clk", ipu2_clk),
4587 _REGISTER_CLOCK(NULL, "cko1_clk0", cko1_clk0),
4588 _REGISTER_CLOCK("sdhci-esdhc-imx.0", NULL, usdhc1_clk),
4589 _REGISTER_CLOCK("sdhci-esdhc-imx.1", NULL, usdhc2_clk),
4590 _REGISTER_CLOCK("sdhci-esdhc-imx.2", NULL, usdhc3_clk),
4591 _REGISTER_CLOCK("sdhci-esdhc-imx.3", NULL, usdhc4_clk),
4592 _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk),
4593 _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk),
4594 _REGISTER_CLOCK("imx-ssi.2", NULL, ssi3_clk),
4595 _REGISTER_CLOCK(NULL, "ipu1_di0_clk", ipu1_di_clk[0]),
4596 _REGISTER_CLOCK(NULL, "ipu1_di1_clk", ipu1_di_clk[1]),
4597 _REGISTER_CLOCK(NULL, "ipu2_di0_clk", ipu2_di_clk[0]),
4598 _REGISTER_CLOCK(NULL, "ipu2_di1_clk", ipu2_di_clk[1]),
4599 _REGISTER_CLOCK("FlexCAN.0", "can_clk", can1_clk[0]),
4600 _REGISTER_CLOCK("FlexCAN.1", "can_clk", can2_clk[0]),
4601 _REGISTER_CLOCK(NULL, "ldb_di0_clk", ldb_di0_clk),
4602 _REGISTER_CLOCK(NULL, "ldb_di1_clk", ldb_di1_clk),
4603 _REGISTER_CLOCK("mxc_spdif.0", NULL, spdif0_clk[0]),
4604 _REGISTER_CLOCK(NULL, "esai_clk", esai_clk),
4605 _REGISTER_CLOCK("mxc_spi.0", NULL, ecspi_clk[0]),
4606 _REGISTER_CLOCK("mxc_spi.1", NULL, ecspi_clk[1]),
4607 _REGISTER_CLOCK("mxc_spi.2", NULL, ecspi_clk[2]),
4608 _REGISTER_CLOCK("mxc_spi.3", NULL, ecspi_clk[3]),
4609 _REGISTER_CLOCK("mxc_spi.4", NULL, ecspi_clk[4]),
4610 _REGISTER_CLOCK(NULL, "emi_slow_clk", emi_slow_clk),
4611 _REGISTER_CLOCK(NULL, "emi_clk", emi_clk),
4612 _REGISTER_CLOCK(NULL, "enfc_clk", enfc_clk),
4613 _REGISTER_CLOCK("imx-uart.0", NULL, uart_clk[0]),
4614 _REGISTER_CLOCK(NULL, "hsi_tx", hsi_tx_clk[0]),
4615 _REGISTER_CLOCK(NULL, "caam_clk", caam_clk[0]),
4616 _REGISTER_CLOCK(NULL, "asrc_clk", asrc_clk[0]),
4617 _REGISTER_CLOCK(NULL, "asrc_serial_clk", asrc_clk[1]),
4618 _REGISTER_CLOCK("mxs-dma-apbh", NULL, apbh_dma_clk),
4619 _REGISTER_CLOCK(NULL, "openvg_axi_clk", openvg_axi_clk),
4620 _REGISTER_CLOCK(NULL, "gpu3d_clk", gpu3d_core_clk[0]),
4621 _REGISTER_CLOCK(NULL, "gpu2d_clk", gpu2d_core_clk[0]),
4622 _REGISTER_CLOCK(NULL, "gpu3d_shader_clk", gpu3d_shader_clk),
4623 _REGISTER_CLOCK(NULL, "gpt", gpt_clk[0]),
4624 _REGISTER_CLOCK("imx6q-gpmi-nfc.0", NULL, gpmi_nfc_clk[0]),
4625 _REGISTER_CLOCK(NULL, "gpmi-apb", gpmi_nfc_clk[1]),
4626 _REGISTER_CLOCK(NULL, "bch", gpmi_nfc_clk[2]),
4627 _REGISTER_CLOCK(NULL, "bch-apb", gpmi_nfc_clk[3]),
4628 _REGISTER_CLOCK(NULL, "pl301_mx6qperl-bch", gpmi_nfc_clk[4]),
4629 _REGISTER_CLOCK("mxc_pwm.0", NULL, pwm_clk[0]),
4630 _REGISTER_CLOCK("mxc_pwm.1", NULL, pwm_clk[1]),
4631 _REGISTER_CLOCK("mxc_pwm.2", NULL, pwm_clk[2]),
4632 _REGISTER_CLOCK("mxc_pwm.3", NULL, pwm_clk[3]),
4633 _REGISTER_CLOCK(NULL, "pcie_clk", pcie_clk[0]),
4634 _REGISTER_CLOCK("fec.0", NULL, enet_clk[0]),
4635 _REGISTER_CLOCK(NULL, "imx_sata_clk", sata_clk[0]),
4636 _REGISTER_CLOCK(NULL, "usboh3_clk", usboh3_clk[0]),
4637 _REGISTER_CLOCK(NULL, "usb_phy1_clk", usb_phy1_clk),
4638 _REGISTER_CLOCK("imx2-wdt.0", NULL, dummy_clk),
4639 _REGISTER_CLOCK("imx2-wdt.1", NULL, dummy_clk),
4640 _REGISTER_CLOCK(NULL, "hdmi_isfr_clk", hdmi_clk[0]),
4641 _REGISTER_CLOCK(NULL, "hdmi_iahb_clk", hdmi_clk[1]),
4642 _REGISTER_CLOCK(NULL, NULL, vdoa_clk),
4643 _REGISTER_CLOCK(NULL, NULL, aips_tz2_clk),
4644 _REGISTER_CLOCK(NULL, NULL, aips_tz1_clk),
4645 _REGISTER_CLOCK(NULL, "clko_clk", clko_clk),
4649 static void clk_tree_init(void)
4654 reg = __raw_readl(MMDC_MDMISC_OFFSET);
4655 if ((reg & MMDC_MDMISC_DDR_TYPE_MASK) ==
4656 (0x1 << MMDC_MDMISC_DDR_TYPE_OFFSET)) {
4657 clk_set_parent(&periph_clk, &pll2_pfd_400M);
4658 printk(KERN_INFO "Set periph_clk's parent to pll2_pfd_400M!\n");
4663 int __init mx6_clocks_init(unsigned long ckil, unsigned long osc,
4664 unsigned long ckih1, unsigned long ckih2)
4669 external_low_reference = ckil;
4670 external_high_reference = ckih1;
4671 ckih2_reference = ckih2;
4672 oscillator_reference = osc;
4674 apll_base = ioremap(ANATOP_BASE_ADDR, SZ_4K);
4676 for (i = 0; i < ARRAY_SIZE(lookups); i++) {
4677 clkdev_add(&lookups[i]);
4678 clk_debug_register(lookups[i].clk);
4681 /* Disable un-necessary PFDs & PLLs */
4683 /* keep correct count. */
4684 clk_enable(&cpu_clk);
4685 clk_enable(&periph_clk);
4689 if (pll2_pfd_400M.usecount == 0)
4690 pll2_pfd_400M.disable(&pll2_pfd_400M);
4691 pll2_pfd_352M.disable(&pll2_pfd_352M);
4692 pll2_pfd_594M.disable(&pll2_pfd_594M);
4694 pll3_pfd_454M.disable(&pll3_pfd_454M);
4695 pll3_pfd_508M.disable(&pll3_pfd_508M);
4696 pll3_pfd_540M.disable(&pll3_pfd_540M);
4697 pll3_pfd_720M.disable(&pll3_pfd_720M);
4699 pll3_usb_otg_main_clk.disable(&pll3_usb_otg_main_clk);
4700 pll4_audio_main_clk.disable(&pll4_audio_main_clk);
4701 pll5_video_main_clk.disable(&pll5_video_main_clk);
4702 pll6_MLB_main_clk.disable(&pll6_MLB_main_clk);
4703 pll7_usb_host_main_clk.disable(&pll7_usb_host_main_clk);
4704 pll8_enet_main_clk.disable(&pll8_enet_main_clk);
4706 sata_clk[0].disable(&sata_clk[0]);
4707 pcie_clk[0].disable(&pcie_clk[0]);
4709 /* Initialize Audio and Video PLLs to valid frequency (650MHz). */
4710 clk_set_rate(&pll4_audio_main_clk, 650000000);
4711 clk_set_rate(&pll5_video_main_clk, 650000000);
4713 clk_set_parent(&ipu1_di_clk[0], &pll5_video_main_clk);
4714 clk_set_parent(&ipu1_di_clk[1], &pll5_video_main_clk);
4715 clk_set_parent(&ipu2_di_clk[0], &pll5_video_main_clk);
4716 clk_set_parent(&ipu2_di_clk[1], &pll5_video_main_clk);
4718 clk_set_parent(&cko1_clk0, &ipg_clk);
4719 clk_set_rate(&cko1_clk0, 22000000);
4720 clk_enable(&cko1_clk0);
4722 clk_set_parent(&gpu3d_shader_clk, &pll2_pfd_594M);
4723 clk_set_rate(&gpu3d_shader_clk, 594000000);
4724 clk_set_parent(&gpu3d_core_clk[0], &mmdc_ch0_axi_clk[0]);
4725 clk_set_rate(&gpu3d_core_clk[0], 528000000);
4728 * FIXME: asrc needs to use asrc_serial(spdif1) clock to do sample rate convertion,
4729 * however we found it only works when set to 1.5M clock and the
4730 * parent is pll3_sw_clk.
4732 clk_set_parent(&asrc_clk[1], &pll3_sw_clk);
4733 clk_set_rate(&asrc_clk[1], 1500000);
4735 /* set the NAND to 11MHz. Too fast will cause dma timeout. */
4736 clk_set_rate(&enfc_clk, enfc_clk.round_rate(&enfc_clk, 11000000));
4739 cpu_op_tbl = get_cpu_op(&cpu_op_nr);
4741 /* Gate off all possible clocks */
4742 if (mxc_jtag_enabled) {
4743 __raw_writel(3 << MXC_CCM_CCGRx_CG11_OFFSET |
4744 3 << MXC_CCM_CCGRx_CG2_OFFSET |
4745 3 << MXC_CCM_CCGRx_CG1_OFFSET |
4746 3 << MXC_CCM_CCGRx_CG0_OFFSET, MXC_CCM_CCGR0);
4748 __raw_writel(1 << MXC_CCM_CCGRx_CG11_OFFSET |
4749 3 << MXC_CCM_CCGRx_CG2_OFFSET |
4750 3 << MXC_CCM_CCGRx_CG1_OFFSET |
4751 3 << MXC_CCM_CCGRx_CG0_OFFSET, MXC_CCM_CCGR0);
4753 __raw_writel(3 << MXC_CCM_CCGRx_CG10_OFFSET, MXC_CCM_CCGR1);
4754 __raw_writel(1 << MXC_CCM_CCGRx_CG12_OFFSET |
4755 1 << MXC_CCM_CCGRx_CG11_OFFSET |
4756 3 << MXC_CCM_CCGRx_CG10_OFFSET |
4757 3 << MXC_CCM_CCGRx_CG9_OFFSET |
4758 3 << MXC_CCM_CCGRx_CG8_OFFSET, MXC_CCM_CCGR2);
4759 __raw_writel(1 << MXC_CCM_CCGRx_CG14_OFFSET |
4760 3 << MXC_CCM_CCGRx_CG13_OFFSET |
4761 3 << MXC_CCM_CCGRx_CG12_OFFSET |
4762 3 << MXC_CCM_CCGRx_CG11_OFFSET |
4763 3 << MXC_CCM_CCGRx_CG10_OFFSET, MXC_CCM_CCGR3);
4764 __raw_writel(3 << MXC_CCM_CCGRx_CG7_OFFSET |
4765 1 << MXC_CCM_CCGRx_CG6_OFFSET |
4766 1 << MXC_CCM_CCGRx_CG4_OFFSET, MXC_CCM_CCGR4);
4767 __raw_writel(1 << MXC_CCM_CCGRx_CG0_OFFSET, MXC_CCM_CCGR5);
4769 __raw_writel(0, MXC_CCM_CCGR6);
4771 /* Lower the ipg_perclk frequency to 8.25MHz. */
4772 clk_set_rate(&ipg_perclk, 8250000);
4775 clk_set_parent(&spdif0_clk[0], &pll3_pfd_454M);
4777 base = ioremap(GPT_BASE_ADDR, SZ_4K);
4778 mxc_timer_init(&gpt_clk[0], base, MXC_INT_GPT);