3 * Copyright (C) 2012 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 <linux/regulator/consumer.h>
27 #include <asm/div64.h>
28 #include <mach/hardware.h>
29 #include <mach/common.h>
30 #include <mach/clock.h>
31 #include <mach/mxc_dvfs.h>
33 #include "cpu_op-mx6.h"
34 #include "regs-anadig.h"
36 #ifdef CONFIG_CLK_DEBUG
37 #define __INIT_CLK_DEBUG(n) .name = #n,
39 #define __INIT_CLK_DEBUG(n)
42 extern u32 arm_max_freq;
43 extern int mxc_jtag_enabled;
44 extern struct regulator *cpu_regulator;
45 extern struct cpu_op *(*get_cpu_op)(int *op);
46 extern int lp_high_freq;
47 extern int lp_med_freq;
48 extern int mx6q_revision(void);
50 void __iomem *apll_base;
51 static struct clk pll1_sys_main_clk;
52 static struct clk pll2_528_bus_main_clk;
53 static struct clk pll2_pfd_400M;
54 static struct clk pll3_usb_otg_main_clk;
55 static struct clk pll4_audio_main_clk;
56 static struct clk pll5_video_main_clk;
57 static struct clk pll6_mlb150_main_clk;
58 static struct clk pll7_usb_host_main_clk;
59 static struct clk pll8_enet_main_clk;
60 static struct clk apbh_dma_clk;
61 static struct clk openvg_axi_clk;
62 static struct clk enfc_clk;
63 static struct clk ipu1_di_clk_root;
64 static struct clk ipu2_di_clk_root;
65 static struct clk usdhc3_clk;
67 static struct cpu_op *cpu_op_tbl;
70 #define SPIN_DELAY 1200000 /* in nanoseconds */
72 #define AUDIO_VIDEO_MIN_CLK_FREQ 650000000
73 #define AUDIO_VIDEO_MAX_CLK_FREQ 1300000000
75 /* We need to check the exp status again after timer expiration,
76 * as there might be interrupt coming between the first time exp
77 * and the time reading, then the time reading may be several ms
78 * after the exp checking due to the irq handle, so we need to
79 * check it to make sure the exp return the right value after
80 * timer expiration. */
81 #define WAIT(exp, timeout) \
83 struct timespec nstimeofday; \
84 struct timespec curtime; \
86 getnstimeofday(&nstimeofday); \
88 getnstimeofday(&curtime); \
89 if ((curtime.tv_nsec - nstimeofday.tv_nsec) > (timeout)) { \
98 /* External clock values passed-in by the board code */
99 static unsigned long external_high_reference, external_low_reference;
100 static unsigned long oscillator_reference, ckih2_reference;
102 static void __calc_pre_post_dividers(u32 max_podf, u32 div, u32 *pre, u32 *post)
104 u32 min_pre, temp_pre, old_err, err;
106 /* Some of the podfs are 3 bits while others are 6 bits.
107 * Handle both cases here.
109 if (div >= 512 && (max_podf == 64)) {
110 /* For pre = 3bits and podf = 6 bits, max divider is 512. */
113 } else if (div >= 64 && (max_podf == 8)) {
114 /* For pre = 3bits and podf = 3 bits, max divider is 64. */
117 } else if (div >= 8) {
118 /* Find the minimum pre-divider for a max podf */
120 min_pre = (div - 1) / (1 << 6) + 1;
122 min_pre = (div - 1) / (1 << 3) + 1;
124 /* Now loop through to find the max pre-divider. */
125 for (temp_pre = 8; temp_pre >= min_pre; temp_pre--) {
126 err = div % temp_pre;
131 err = temp_pre - err;
137 *post = (div + *pre - 1) / *pre;
138 } else if (div < 8) {
144 static int _clk_enable(struct clk *clk)
147 reg = __raw_readl(clk->enable_reg);
148 reg |= MXC_CCM_CCGRx_CG_MASK << clk->enable_shift;
149 __raw_writel(reg, clk->enable_reg);
151 if (clk->flags & AHB_HIGH_SET_POINT)
153 else if (clk->flags & AHB_MED_SET_POINT)
159 static void _clk_disable(struct clk *clk)
162 reg = __raw_readl(clk->enable_reg);
163 reg &= ~(MXC_CCM_CCGRx_CG_MASK << clk->enable_shift);
164 __raw_writel(reg, clk->enable_reg);
166 if (clk->flags & AHB_HIGH_SET_POINT)
168 else if (clk->flags & AHB_MED_SET_POINT)
172 static void _clk_disable_inwait(struct clk *clk)
175 reg = __raw_readl(clk->enable_reg);
176 reg &= ~(MXC_CCM_CCGRx_CG_MASK << clk->enable_shift);
177 reg |= 1 << clk->enable_shift;
178 __raw_writel(reg, clk->enable_reg);
182 * For the 4-to-1 muxed input clock
184 static inline u32 _get_mux(struct clk *parent, struct clk *m0,
185 struct clk *m1, struct clk *m2, struct clk *m3)
189 else if (parent == m1)
191 else if (parent == m2)
193 else if (parent == m3)
201 static inline void __iomem *_get_pll_base(struct clk *pll)
203 if (pll == &pll1_sys_main_clk)
204 return PLL1_SYS_BASE_ADDR;
205 else if (pll == &pll2_528_bus_main_clk)
206 return PLL2_528_BASE_ADDR;
207 else if (pll == &pll3_usb_otg_main_clk)
208 return PLL3_480_USB1_BASE_ADDR;
209 else if (pll == &pll4_audio_main_clk)
210 return PLL4_AUDIO_BASE_ADDR;
211 else if (pll == &pll5_video_main_clk)
212 return PLL5_VIDEO_BASE_ADDR;
213 else if (pll == &pll6_mlb150_main_clk)
214 return PLL6_MLB_BASE_ADDR;
215 else if (pll == &pll7_usb_host_main_clk)
216 return PLL7_480_USB2_BASE_ADDR;
217 else if (pll == &pll8_enet_main_clk)
218 return PLL8_ENET_BASE_ADDR;
226 * For the 6-to-1 muxed input clock
228 static inline u32 _get_mux6(struct clk *parent, struct clk *m0, struct clk *m1,
229 struct clk *m2, struct clk *m3, struct clk *m4,
234 else if (parent == m1)
236 else if (parent == m2)
238 else if (parent == m3)
240 else if (parent == m4)
242 else if (parent == m5)
249 static unsigned long get_high_reference_clock_rate(struct clk *clk)
251 return external_high_reference;
254 static unsigned long get_low_reference_clock_rate(struct clk *clk)
256 return external_low_reference;
259 static unsigned long get_oscillator_reference_clock_rate(struct clk *clk)
261 return oscillator_reference;
264 static unsigned long get_ckih2_reference_clock_rate(struct clk *clk)
266 return ckih2_reference;
269 /* External high frequency clock */
270 static struct clk ckih_clk = {
271 __INIT_CLK_DEBUG(ckih_clk)
272 .get_rate = get_high_reference_clock_rate,
275 static struct clk ckih2_clk = {
276 __INIT_CLK_DEBUG(ckih2_clk)
277 .get_rate = get_ckih2_reference_clock_rate,
280 static struct clk osc_clk = {
281 __INIT_CLK_DEBUG(osc_clk)
282 .get_rate = get_oscillator_reference_clock_rate,
285 /* External low frequency (32kHz) clock */
286 static struct clk ckil_clk = {
287 __INIT_CLK_DEBUG(ckil_clk)
288 .get_rate = get_low_reference_clock_rate,
291 static unsigned long pfd_round_rate(struct clk *clk, unsigned long rate)
296 tmp = (u64)clk_get_rate(clk->parent) * 18;
300 frac = frac < 12 ? 12 : frac;
301 frac = frac > 35 ? 35 : frac;
302 tmp = (u64)clk_get_rate(clk->parent) * 18;
307 static unsigned long pfd_get_rate(struct clk *clk)
311 tmp = (u64)clk_get_rate(clk->parent) * 18;
313 if (apbh_dma_clk.usecount == 0)
314 apbh_dma_clk.enable(&apbh_dma_clk);
316 frac = (__raw_readl(clk->enable_reg) >> clk->enable_shift) &
317 ANADIG_PFD_FRAC_MASK;
324 static int pfd_set_rate(struct clk *clk, unsigned long rate)
328 tmp = (u64)clk_get_rate(clk->parent) * 18;
330 if (apbh_dma_clk.usecount == 0)
331 apbh_dma_clk.enable(&apbh_dma_clk);
333 /* Round up the divider so that we don't set a rate
334 * higher than what is requested. */
338 frac = frac < 12 ? 12 : frac;
339 frac = frac > 35 ? 35 : frac;
340 /* clear clk frac bits */
341 __raw_writel(ANADIG_PFD_FRAC_MASK << clk->enable_shift,
342 (int)clk->enable_reg + 8);
343 /* set clk frac bits */
344 __raw_writel(frac << clk->enable_shift,
345 (int)clk->enable_reg + 4);
347 tmp = (u64)clk_get_rate(clk->parent) * 18;
350 if (apbh_dma_clk.usecount == 0)
351 apbh_dma_clk.disable(&apbh_dma_clk);
355 static int _clk_pfd_enable(struct clk *clk)
357 if (apbh_dma_clk.usecount == 0)
358 apbh_dma_clk.enable(&apbh_dma_clk);
360 /* clear clk gate bit */
361 __raw_writel((1 << (clk->enable_shift + 7)),
362 (int)clk->enable_reg + 8);
364 if (apbh_dma_clk.usecount == 0)
365 apbh_dma_clk.disable(&apbh_dma_clk);
370 static void _clk_pfd_disable(struct clk *clk)
372 if (apbh_dma_clk.usecount == 0)
373 apbh_dma_clk.enable(&apbh_dma_clk);
375 /* set clk gate bit */
376 __raw_writel((1 << (clk->enable_shift + 7)),
377 (int)clk->enable_reg + 4);
379 if (apbh_dma_clk.usecount == 0)
380 apbh_dma_clk.disable(&apbh_dma_clk);
383 static int _clk_pll_enable(struct clk *clk)
386 void __iomem *pllbase;
388 pllbase = _get_pll_base(clk);
390 reg = __raw_readl(pllbase);
391 reg &= ~ANADIG_PLL_BYPASS;
392 reg &= ~ANADIG_PLL_POWER_DOWN;
394 /* The 480MHz PLLs have the opposite definition for power bit. */
395 if (clk == &pll3_usb_otg_main_clk || clk == &pll7_usb_host_main_clk)
396 reg |= ANADIG_PLL_POWER_DOWN;
398 __raw_writel(reg, pllbase);
400 /* It will power on pll3 */
401 if (clk == &pll3_usb_otg_main_clk)
402 __raw_writel(BM_ANADIG_ANA_MISC2_CONTROL0, apll_base + HW_ANADIG_ANA_MISC2_CLR);
404 /* Wait for PLL to lock */
405 if (!WAIT(__raw_readl(pllbase) & ANADIG_PLL_LOCK,
407 panic("pll enable failed\n");
409 /* Enable the PLL output now*/
410 reg = __raw_readl(pllbase);
411 reg |= ANADIG_PLL_ENABLE;
412 __raw_writel(reg, pllbase);
417 static void _clk_pll_disable(struct clk *clk)
420 void __iomem *pllbase;
422 pllbase = _get_pll_base(clk);
424 reg = __raw_readl(pllbase);
425 reg |= ANADIG_PLL_BYPASS;
426 reg &= ~ANADIG_PLL_ENABLE;
428 __raw_writel(reg, pllbase);
431 * It will power off PLL3's power, it is the TO1.1 fix
432 * Please see TKT064178 for detail.
434 if (clk == &pll3_usb_otg_main_clk)
435 __raw_writel(BM_ANADIG_ANA_MISC2_CONTROL0, apll_base + HW_ANADIG_ANA_MISC2_SET);
438 static unsigned long _clk_pll1_main_get_rate(struct clk *clk)
443 div = __raw_readl(PLL1_SYS_BASE_ADDR) & ANADIG_PLL_SYS_DIV_SELECT_MASK;
444 val = (clk_get_rate(clk->parent) * div) / 2;
448 static int _clk_pll1_main_set_rate(struct clk *clk, unsigned long rate)
450 unsigned int reg, div;
452 if (rate < AUDIO_VIDEO_MIN_CLK_FREQ || rate > AUDIO_VIDEO_MAX_CLK_FREQ)
455 div = (rate * 2) / clk_get_rate(clk->parent) ;
457 reg = __raw_readl(PLL1_SYS_BASE_ADDR) & ~ANADIG_PLL_SYS_DIV_SELECT_MASK;
459 __raw_writel(reg, PLL1_SYS_BASE_ADDR);
464 static struct clk pll1_sys_main_clk = {
465 __INIT_CLK_DEBUG(pll1_sys_main_clk)
467 .get_rate = _clk_pll1_main_get_rate,
468 .set_rate = _clk_pll1_main_set_rate,
469 .enable = _clk_pll_enable,
470 .disable = _clk_pll_disable,
473 static int _clk_pll1_sw_set_parent(struct clk *clk, struct clk *parent)
477 reg = __raw_readl(MXC_CCM_CCSR);
479 if (parent == &pll1_sys_main_clk) {
480 reg &= ~MXC_CCM_CCSR_PLL1_SW_CLK_SEL;
481 __raw_writel(reg, MXC_CCM_CCSR);
482 /* Set the step_clk parent to be lp_apm, to save power. */
483 reg = __raw_readl(MXC_CCM_CCSR);
484 reg = (reg & ~MXC_CCM_CCSR_STEP_SEL);
486 /* Set STEP_CLK to be the parent*/
487 if (parent == &osc_clk) {
488 /* Set STEP_CLK to be sourced from LPAPM. */
489 reg = __raw_readl(MXC_CCM_CCSR);
490 reg = (reg & ~MXC_CCM_CCSR_STEP_SEL);
491 __raw_writel(reg, MXC_CCM_CCSR);
493 /* Set STEP_CLK to be sourced from PLL2-PDF (400MHz). */
494 reg = __raw_readl(MXC_CCM_CCSR);
495 reg |= MXC_CCM_CCSR_STEP_SEL;
496 __raw_writel(reg, MXC_CCM_CCSR);
499 reg = __raw_readl(MXC_CCM_CCSR);
500 reg |= MXC_CCM_CCSR_PLL1_SW_CLK_SEL;
502 __raw_writel(reg, MXC_CCM_CCSR);
506 static unsigned long _clk_pll1_sw_get_rate(struct clk *clk)
508 return clk_get_rate(clk->parent);
511 static struct clk pll1_sw_clk = {
512 __INIT_CLK_DEBUG(pll1_sw_clk)
513 .parent = &pll1_sys_main_clk,
514 .set_parent = _clk_pll1_sw_set_parent,
515 .get_rate = _clk_pll1_sw_get_rate,
518 static unsigned long _clk_pll2_main_get_rate(struct clk *clk)
523 div = __raw_readl(PLL2_528_BASE_ADDR) & ANADIG_PLL_528_DIV_SELECT;
526 val = clk_get_rate(clk->parent) * 22;
529 val = clk_get_rate(clk->parent) * 20;
534 static int _clk_pll2_main_set_rate(struct clk *clk, unsigned long rate)
536 unsigned int reg, div;
538 if (rate == 528000000)
540 else if (rate == 480000000)
545 reg = __raw_readl(PLL2_528_BASE_ADDR);
546 reg &= ~ANADIG_PLL_528_DIV_SELECT;
548 __raw_writel(reg, PLL2_528_BASE_ADDR);
553 static struct clk pll2_528_bus_main_clk = {
554 __INIT_CLK_DEBUG(pll2_528_bus_main_clk)
556 .get_rate = _clk_pll2_main_get_rate,
557 .set_rate = _clk_pll2_main_set_rate,
558 .enable = _clk_pll_enable,
559 .disable = _clk_pll_disable,
562 static struct clk pll2_pfd_400M = {
563 __INIT_CLK_DEBUG(pll2_pfd_400M)
564 .parent = &pll2_528_bus_main_clk,
565 .enable_reg = (void *)PFD_528_BASE_ADDR,
566 .enable_shift = ANADIG_PFD2_FRAC_OFFSET,
567 .enable = _clk_pfd_enable,
568 .disable = _clk_pfd_disable,
569 .get_rate = pfd_get_rate,
570 .set_rate = pfd_set_rate,
571 .get_rate = pfd_get_rate,
572 .round_rate = pfd_round_rate,
575 static struct clk pll2_pfd_352M = {
576 __INIT_CLK_DEBUG(pll2_pfd_352M)
577 .parent = &pll2_528_bus_main_clk,
578 .enable_reg = (void *)PFD_528_BASE_ADDR,
579 .enable_shift = ANADIG_PFD0_FRAC_OFFSET,
580 .enable = _clk_pfd_enable,
581 .disable = _clk_pfd_disable,
582 .set_rate = pfd_set_rate,
583 .get_rate = pfd_get_rate,
584 .round_rate = pfd_round_rate,
587 static struct clk pll2_pfd_594M = {
588 __INIT_CLK_DEBUG(pll2_pfd_594M)
589 .parent = &pll2_528_bus_main_clk,
590 .enable_reg = (void *)PFD_528_BASE_ADDR,
591 .enable_shift = ANADIG_PFD1_FRAC_OFFSET,
592 .enable = _clk_pfd_enable,
593 .disable = _clk_pfd_disable,
594 .set_rate = pfd_set_rate,
595 .get_rate = pfd_get_rate,
596 .round_rate = pfd_round_rate,
599 static unsigned long _clk_pll2_200M_get_rate(struct clk *clk)
601 return clk_get_rate(clk->parent) / 2;
604 static struct clk pll2_200M = {
605 __INIT_CLK_DEBUG(pll2_200M)
606 .parent = &pll2_pfd_400M,
607 .get_rate = _clk_pll2_200M_get_rate,
610 static unsigned long _clk_pll3_usb_otg_get_rate(struct clk *clk)
615 div = __raw_readl(PLL3_480_USB1_BASE_ADDR)
616 & ANADIG_PLL_480_DIV_SELECT_MASK;
619 val = clk_get_rate(clk->parent) * 22;
621 val = clk_get_rate(clk->parent) * 20;
625 static int _clk_pll3_usb_otg_set_rate(struct clk *clk, unsigned long rate)
627 unsigned int reg, div;
629 if (rate == 528000000)
631 else if (rate == 480000000)
636 reg = __raw_readl(PLL3_480_USB1_BASE_ADDR);
637 reg &= ~ANADIG_PLL_480_DIV_SELECT_MASK;
639 __raw_writel(reg, PLL3_480_USB1_BASE_ADDR);
645 /* same as pll3_main_clk. These two clocks should always be the same */
646 static struct clk pll3_usb_otg_main_clk = {
647 __INIT_CLK_DEBUG(pll3_usb_otg_main_clk)
649 .enable = _clk_pll_enable,
650 .disable = _clk_pll_disable,
651 .set_rate = _clk_pll3_usb_otg_set_rate,
652 .get_rate = _clk_pll3_usb_otg_get_rate,
656 static struct clk usb_phy1_clk = {
657 __INIT_CLK_DEBUG(usb_phy1_clk)
658 .parent = &pll3_usb_otg_main_clk,
659 .set_rate = _clk_pll3_usb_otg_set_rate,
660 .get_rate = _clk_pll3_usb_otg_get_rate,
663 /* For HSIC port 1 */
664 static struct clk usb_phy3_clk = {
665 __INIT_CLK_DEBUG(usb_phy3_clk)
666 .parent = &pll3_usb_otg_main_clk,
667 .set_rate = _clk_pll3_usb_otg_set_rate,
668 .get_rate = _clk_pll3_usb_otg_get_rate,
671 /* For HSIC port 2 */
672 static struct clk usb_phy4_clk = {
673 __INIT_CLK_DEBUG(usb_phy4_clk)
674 .parent = &pll3_usb_otg_main_clk,
675 .set_rate = _clk_pll3_usb_otg_set_rate,
676 .get_rate = _clk_pll3_usb_otg_get_rate,
679 static struct clk pll3_pfd_508M = {
680 __INIT_CLK_DEBUG(pll3_pfd_508M)
681 .parent = &pll3_usb_otg_main_clk,
682 .enable_reg = (void *)PFD_480_BASE_ADDR,
683 .enable_shift = ANADIG_PFD2_FRAC_OFFSET,
684 .enable = _clk_pfd_enable,
685 .disable = _clk_pfd_disable,
686 .set_rate = pfd_set_rate,
687 .get_rate = pfd_get_rate,
688 .round_rate = pfd_round_rate,
691 static struct clk pll3_pfd_454M = {
692 __INIT_CLK_DEBUG(pll3_pfd_454M)
693 .parent = &pll3_usb_otg_main_clk,
694 .enable_reg = (void *)PFD_480_BASE_ADDR,
695 .enable_shift = ANADIG_PFD3_FRAC_OFFSET,
696 .enable = _clk_pfd_enable,
697 .disable = _clk_pfd_disable,
698 .set_rate = pfd_set_rate,
699 .get_rate = pfd_get_rate,
700 .round_rate = pfd_round_rate,
703 static struct clk pll3_pfd_720M = {
704 __INIT_CLK_DEBUG(pll3_pfd_720M)
705 .parent = &pll3_usb_otg_main_clk,
706 .enable_reg = (void *)PFD_480_BASE_ADDR,
707 .enable_shift = ANADIG_PFD0_FRAC_OFFSET,
708 .enable = _clk_pfd_enable,
709 .disable = _clk_pfd_disable,
710 .set_rate = pfd_set_rate,
711 .get_rate = pfd_get_rate,
712 .round_rate = pfd_round_rate,
715 static struct clk pll3_pfd_540M = {
716 __INIT_CLK_DEBUG(pll3_pfd_540M)
717 .parent = &pll3_usb_otg_main_clk,
718 .enable_reg = (void *)PFD_480_BASE_ADDR,
719 .enable_shift = ANADIG_PFD1_FRAC_OFFSET,
720 .enable = _clk_pfd_enable,
721 .disable = _clk_pfd_disable,
722 .set_rate = pfd_set_rate,
723 .get_rate = pfd_get_rate,
724 .round_rate = pfd_round_rate,
725 .get_rate = pfd_get_rate,
728 static unsigned long _clk_pll3_sw_get_rate(struct clk *clk)
730 return clk_get_rate(clk->parent);
733 /* same as pll3_main_clk. These two clocks should always be the same */
734 static struct clk pll3_sw_clk = {
735 __INIT_CLK_DEBUG(pll3_sw_clk)
736 .parent = &pll3_usb_otg_main_clk,
737 .get_rate = _clk_pll3_sw_get_rate,
740 static unsigned long _clk_pll3_120M_get_rate(struct clk *clk)
742 return clk_get_rate(clk->parent) / 4;
745 static struct clk pll3_120M = {
746 __INIT_CLK_DEBUG(pll3_120M)
747 .parent = &pll3_sw_clk,
748 .get_rate = _clk_pll3_120M_get_rate,
751 static unsigned long _clk_pll3_80M_get_rate(struct clk *clk)
753 return clk_get_rate(clk->parent) / 6;
756 static struct clk pll3_80M = {
757 __INIT_CLK_DEBUG(pll3_80M)
758 .parent = &pll3_sw_clk,
759 .get_rate = _clk_pll3_80M_get_rate,
762 static unsigned long _clk_pll3_60M_get_rate(struct clk *clk)
764 return clk_get_rate(clk->parent) / 8;
767 static struct clk pll3_60M = {
768 __INIT_CLK_DEBUG(pll3_60M)
769 .parent = &pll3_sw_clk,
770 .get_rate = _clk_pll3_60M_get_rate,
773 static unsigned long _clk_audio_video_get_rate(struct clk *clk)
775 unsigned int div, mfn, mfd;
777 unsigned int parent_rate = clk_get_rate(clk->parent);
778 void __iomem *pllbase;
779 int rev = mx6q_revision();
780 unsigned int test_div_sel, control3, post_div = 1;
782 if (clk == &pll4_audio_main_clk)
783 pllbase = PLL4_AUDIO_BASE_ADDR;
785 pllbase = PLL5_VIDEO_BASE_ADDR;
787 if (rev >= IMX_CHIP_REVISION_1_1) {
788 test_div_sel = (__raw_readl(pllbase)
789 & ANADIG_PLL_AV_TEST_DIV_SEL_MASK)
790 >> ANADIG_PLL_AV_TEST_DIV_SEL_OFFSET;
791 if (test_div_sel == 0)
793 else if (test_div_sel == 1)
796 if (clk == &pll5_video_main_clk) {
797 control3 = (__raw_readl(ANA_MISC2_BASE_ADDR)
798 & ANADIG_ANA_MISC2_CONTROL3_MASK)
799 >> ANADIG_ANA_MISC2_CONTROL3_OFFSET;
802 else if (control3 == 3)
807 div = __raw_readl(pllbase) & ANADIG_PLL_SYS_DIV_SELECT_MASK;
808 mfn = __raw_readl(pllbase + PLL_NUM_DIV_OFFSET);
809 mfd = __raw_readl(pllbase + PLL_DENOM_DIV_OFFSET);
811 rate = (parent_rate * div) + ((parent_rate / mfd) * mfn);
812 rate = rate / post_div;
817 static int _clk_audio_video_set_rate(struct clk *clk, unsigned long rate)
819 unsigned int reg, div;
820 unsigned int mfn, mfd = 1000000;
822 unsigned int parent_rate = clk_get_rate(clk->parent);
823 void __iomem *pllbase;
824 unsigned long min_clk_rate, pre_div_rate;
825 int rev = mx6q_revision();
826 u32 test_div_sel = 2;
829 if (rev < IMX_CHIP_REVISION_1_1)
830 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ;
831 else if (clk == &pll4_audio_main_clk)
832 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ / 4;
834 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ / 16;
836 if ((rate < min_clk_rate) || (rate > AUDIO_VIDEO_MAX_CLK_FREQ))
839 if (clk == &pll4_audio_main_clk)
840 pllbase = PLL4_AUDIO_BASE_ADDR;
842 pllbase = PLL5_VIDEO_BASE_ADDR;
845 if (rev >= IMX_CHIP_REVISION_1_1) {
846 while (pre_div_rate < AUDIO_VIDEO_MIN_CLK_FREQ) {
849 * test_div_sel field values:
854 * control3 field values:
859 if (test_div_sel != 0)
869 div = pre_div_rate / parent_rate;
870 temp64 = (u64) (pre_div_rate - (div * parent_rate));
872 do_div(temp64, parent_rate);
875 reg = __raw_readl(pllbase)
876 & ~ANADIG_PLL_SYS_DIV_SELECT_MASK
877 & ~ANADIG_PLL_AV_TEST_DIV_SEL_MASK;
879 (test_div_sel << ANADIG_PLL_AV_TEST_DIV_SEL_OFFSET);
880 __raw_writel(reg, pllbase);
881 __raw_writel(mfn, pllbase + PLL_NUM_DIV_OFFSET);
882 __raw_writel(mfd, pllbase + PLL_DENOM_DIV_OFFSET);
884 if (rev >= IMX_CHIP_REVISION_1_1) {
885 reg = __raw_readl(ANA_MISC2_BASE_ADDR)
886 & ~ANADIG_ANA_MISC2_CONTROL3_MASK;
887 reg |= control3 << ANADIG_ANA_MISC2_CONTROL3_OFFSET;
888 __raw_writel(reg, ANA_MISC2_BASE_ADDR);
894 static unsigned long _clk_audio_video_round_rate(struct clk *clk,
897 unsigned long min_clk_rate;
898 unsigned int div, post_div = 1;
899 unsigned int mfn, mfd = 1000000;
901 unsigned int parent_rate = clk_get_rate(clk->parent);
902 unsigned long pre_div_rate;
903 u32 test_div_sel = 2;
905 unsigned long final_rate;
906 int rev = mx6q_revision();
908 if (rev < IMX_CHIP_REVISION_1_1)
909 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ;
910 else if (clk == &pll4_audio_main_clk)
911 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ / 4;
913 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ / 16;
915 if (rate < min_clk_rate)
918 if (rate > AUDIO_VIDEO_MAX_CLK_FREQ)
919 return AUDIO_VIDEO_MAX_CLK_FREQ;
922 if (rev >= IMX_CHIP_REVISION_1_1) {
923 while (pre_div_rate < AUDIO_VIDEO_MIN_CLK_FREQ) {
926 if (test_div_sel != 0)
936 div = pre_div_rate / parent_rate;
937 temp64 = (u64) (pre_div_rate - (div * parent_rate));
939 do_div(temp64, parent_rate);
942 final_rate = (parent_rate * div) + ((parent_rate / mfd) * mfn);
943 final_rate = final_rate / post_div;
949 static struct clk pll4_audio_main_clk = {
950 __INIT_CLK_DEBUG(pll4_audio_main_clk)
952 .enable = _clk_pll_enable,
953 .disable = _clk_pll_disable,
954 .set_rate = _clk_audio_video_set_rate,
955 .get_rate = _clk_audio_video_get_rate,
956 .round_rate = _clk_audio_video_round_rate,
960 static struct clk pll5_video_main_clk = {
961 __INIT_CLK_DEBUG(pll5_video_main_clk)
963 .enable = _clk_pll_enable,
964 .disable = _clk_pll_disable,
965 .set_rate = _clk_audio_video_set_rate,
966 .get_rate = _clk_audio_video_get_rate,
967 .round_rate = _clk_audio_video_round_rate,
970 static int _clk_pll_mlb_main_enable(struct clk *clk)
973 void __iomem *pllbase;
975 pllbase = _get_pll_base(clk);
977 reg = __raw_readl(pllbase);
978 reg &= ~ANADIG_PLL_BYPASS;
981 __raw_writel(reg, pllbase);
983 /* Wait for PLL to lock */
984 if (!WAIT(__raw_readl(pllbase) & ANADIG_PLL_LOCK,
986 panic("pll enable failed\n");
991 static struct clk pll6_mlb150_main_clk = {
992 __INIT_CLK_DEBUG(pll6_mlb150_main_clk)
994 .enable = _clk_pll_mlb_main_enable,
995 .disable = _clk_pll_disable,
998 static unsigned long _clk_pll7_usb_otg_get_rate(struct clk *clk)
1003 div = __raw_readl(PLL7_480_USB2_BASE_ADDR)
1004 & ANADIG_PLL_480_DIV_SELECT_MASK;
1007 val = clk_get_rate(clk->parent) * 22;
1009 val = clk_get_rate(clk->parent) * 20;
1013 static int _clk_pll7_usb_otg_set_rate(struct clk *clk, unsigned long rate)
1015 unsigned int reg, div;
1017 if (rate == 528000000)
1019 else if (rate == 480000000)
1024 reg = __raw_readl(PLL7_480_USB2_BASE_ADDR);
1025 reg &= ~ANADIG_PLL_480_DIV_SELECT_MASK;
1027 __raw_writel(reg, PLL7_480_USB2_BASE_ADDR);
1032 static struct clk pll7_usb_host_main_clk = {
1033 __INIT_CLK_DEBUG(pll7_usb_host_main_clk)
1035 .enable = _clk_pll_enable,
1036 .disable = _clk_pll_disable,
1037 .set_rate = _clk_pll7_usb_otg_set_rate,
1038 .get_rate = _clk_pll7_usb_otg_get_rate,
1042 static struct clk pll8_enet_main_clk = {
1043 __INIT_CLK_DEBUG(pll8_enet_main_clk)
1045 .enable = _clk_pll_enable,
1046 .disable = _clk_pll_disable,
1049 static unsigned long _clk_arm_get_rate(struct clk *clk)
1053 cacrr = __raw_readl(MXC_CCM_CACRR);
1054 div = (cacrr & MXC_CCM_CACRR_ARM_PODF_MASK) + 1;
1055 return clk_get_rate(clk->parent) / div;
1058 static int _clk_arm_set_rate(struct clk *clk, unsigned long rate)
1065 for (i = 0; i < cpu_op_nr; i++) {
1066 if (rate == cpu_op_tbl[i].cpu_rate)
1072 if (cpu_op_tbl[i].pll_rate != clk_get_rate(&pll1_sys_main_clk)) {
1073 /* Change the PLL1 rate. */
1074 if (pll2_pfd_400M.usecount != 0)
1075 pll1_sw_clk.set_parent(&pll1_sw_clk, &pll2_pfd_400M);
1077 pll1_sw_clk.set_parent(&pll1_sw_clk, &osc_clk);
1078 pll1_sys_main_clk.set_rate(&pll1_sys_main_clk, cpu_op_tbl[i].pll_rate);
1079 pll1_sw_clk.set_parent(&pll1_sw_clk, &pll1_sys_main_clk);
1082 parent_rate = clk_get_rate(clk->parent);
1083 div = parent_rate / rate;
1088 if ((parent_rate / div) > rate)
1094 __raw_writel(div - 1, MXC_CCM_CACRR);
1099 static struct clk cpu_clk = {
1100 __INIT_CLK_DEBUG(cpu_clk)
1101 .parent = &pll1_sw_clk,
1102 .set_rate = _clk_arm_set_rate,
1103 .get_rate = _clk_arm_get_rate,
1106 static int _clk_periph_set_parent(struct clk *clk, struct clk *parent)
1111 mux = _get_mux6(parent, &pll2_528_bus_main_clk, &pll2_pfd_400M,
1112 &pll2_pfd_352M, &pll2_200M, &pll3_sw_clk, &osc_clk);
1115 /* Set the pre_periph_clk multiplexer */
1116 reg = __raw_readl(MXC_CCM_CBCMR);
1117 reg &= ~MXC_CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK;
1118 reg |= mux << MXC_CCM_CBCMR_PRE_PERIPH_CLK_SEL_OFFSET;
1119 __raw_writel(reg, MXC_CCM_CBCMR);
1121 /* Set the periph_clk_sel multiplexer. */
1122 reg = __raw_readl(MXC_CCM_CBCDR);
1123 reg &= ~MXC_CCM_CBCDR_PERIPH_CLK_SEL;
1124 __raw_writel(reg, MXC_CCM_CBCDR);
1126 reg = __raw_readl(MXC_CCM_CBCDR);
1127 /* Set the periph_clk2_podf divider to divide by 1. */
1128 reg &= ~MXC_CCM_CBCDR_PERIPH_CLK2_PODF_MASK;
1129 __raw_writel(reg, MXC_CCM_CBCDR);
1131 /* Set the periph_clk2_sel mux. */
1132 reg = __raw_readl(MXC_CCM_CBCMR);
1133 reg &= ~MXC_CCM_CBCMR_PERIPH_CLK2_SEL_MASK;
1134 reg |= ((mux - 4) << MXC_CCM_CBCMR_PERIPH_CLK2_SEL_OFFSET);
1135 __raw_writel(reg, MXC_CCM_CBCMR);
1137 while (__raw_readl(MXC_CCM_CDHIPR))
1140 reg = __raw_readl(MXC_CCM_CBCDR);
1141 /* Set periph_clk_sel to select periph_clk2. */
1142 reg |= MXC_CCM_CBCDR_PERIPH_CLK_SEL;
1143 __raw_writel(reg, MXC_CCM_CBCDR);
1146 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1147 & MXC_CCM_CDHIPR_PERIPH_CLK_SEL_BUSY), SPIN_DELAY))
1148 panic("_clk_periph_set_parent failed\n");
1153 static unsigned long _clk_periph_get_rate(struct clk *clk)
1159 if ((clk->parent == &pll3_sw_clk) || (clk->parent == &osc_clk)) {
1160 reg = __raw_readl(MXC_CCM_CBCDR)
1161 & MXC_CCM_CBCDR_PERIPH_CLK2_PODF_MASK;
1162 div = (reg >> MXC_CCM_CBCDR_PERIPH_CLK2_PODF_OFFSET) + 1;
1164 val = clk_get_rate(clk->parent) / div;
1168 static struct clk periph_clk = {
1169 __INIT_CLK_DEBUG(periph_clk)
1170 .parent = &pll2_528_bus_main_clk,
1171 .set_parent = _clk_periph_set_parent,
1172 .get_rate = _clk_periph_get_rate,
1175 static unsigned long _clk_axi_get_rate(struct clk *clk)
1180 reg = __raw_readl(MXC_CCM_CBCDR) & MXC_CCM_CBCDR_AXI_PODF_MASK;
1181 div = (reg >> MXC_CCM_CBCDR_AXI_PODF_OFFSET);
1183 val = clk_get_rate(clk->parent) / (div + 1);
1187 static int _clk_axi_set_rate(struct clk *clk, unsigned long rate)
1190 u32 parent_rate = clk_get_rate(clk->parent);
1192 div = parent_rate / rate;
1196 if (((parent_rate / div) != rate) || (div > 8))
1199 reg = __raw_readl(MXC_CCM_CBCDR);
1200 reg &= ~MXC_CCM_CBCDR_AXI_PODF_MASK;
1201 reg |= (div - 1) << MXC_CCM_CBCDR_AXI_PODF_OFFSET;
1202 __raw_writel(reg, MXC_CCM_CBCDR);
1204 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1205 & MXC_CCM_CDHIPR_AXI_PODF_BUSY), SPIN_DELAY))
1206 panic("pll _clk_axi_a_set_rate failed\n");
1211 static unsigned long _clk_axi_round_rate(struct clk *clk,
1215 u32 parent_rate = clk_get_rate(clk->parent);
1217 div = parent_rate / rate;
1219 /* Make sure rate is not greater than the maximum
1220 * value for the clock.
1221 * Also prevent a div of 0.
1229 return parent_rate / div;
1232 static int _clk_axi_set_parent(struct clk *clk, struct clk *parent)
1237 mux = _get_mux6(parent, &periph_clk, &pll2_pfd_400M,
1238 &pll3_pfd_540M, NULL, NULL, NULL);
1241 /* Set the AXI_SEL mux */
1242 reg = __raw_readl(MXC_CCM_CBCDR) & ~MXC_CCM_CBCDR_AXI_SEL;
1243 __raw_writel(reg, MXC_CCM_CBCDR);
1245 /* Set the AXI_ALT_SEL mux. */
1246 reg = __raw_readl(MXC_CCM_CBCDR)
1247 & ~MXC_CCM_CBCDR_AXI_ALT_SEL_MASK;
1248 reg = ((mux - 1) << MXC_CCM_CBCDR_AXI_ALT_SEL_OFFSET);
1249 __raw_writel(reg, MXC_CCM_CBCDR);
1251 /* Set the AXI_SEL mux */
1252 reg = __raw_readl(MXC_CCM_CBCDR) & ~MXC_CCM_CBCDR_AXI_SEL;
1253 reg |= MXC_CCM_CBCDR_AXI_SEL;
1254 __raw_writel(reg, MXC_CCM_CBCDR);
1259 static struct clk axi_clk = {
1260 __INIT_CLK_DEBUG(axi_clk)
1261 .parent = &periph_clk,
1262 .set_parent = _clk_axi_set_parent,
1263 .set_rate = _clk_axi_set_rate,
1264 .get_rate = _clk_axi_get_rate,
1265 .round_rate = _clk_axi_round_rate,
1268 static unsigned long _clk_ahb_get_rate(struct clk *clk)
1272 reg = __raw_readl(MXC_CCM_CBCDR);
1273 div = ((reg & MXC_CCM_CBCDR_AHB_PODF_MASK) >>
1274 MXC_CCM_CBCDR_AHB_PODF_OFFSET) + 1;
1276 return clk_get_rate(clk->parent) / div;
1279 static int _clk_ahb_set_rate(struct clk *clk, unsigned long rate)
1282 u32 parent_rate = clk_get_rate(clk->parent);
1284 div = parent_rate / rate;
1287 if (((parent_rate / div) != rate) || (div > 8))
1290 reg = __raw_readl(MXC_CCM_CBCDR);
1291 reg &= ~MXC_CCM_CBCDR_AHB_PODF_MASK;
1292 reg |= (div - 1) << MXC_CCM_CBCDR_AHB_PODF_OFFSET;
1293 __raw_writel(reg, MXC_CCM_CBCDR);
1295 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR) & MXC_CCM_CDHIPR_AHB_PODF_BUSY),
1297 panic("_clk_ahb_set_rate failed\n");
1302 static unsigned long _clk_ahb_round_rate(struct clk *clk,
1306 u32 parent_rate = clk_get_rate(clk->parent);
1308 div = parent_rate / rate;
1310 /* Make sure rate is not greater than the maximum value for the clock.
1311 * Also prevent a div of 0.
1319 return parent_rate / div;
1322 static struct clk ahb_clk = {
1323 __INIT_CLK_DEBUG(ahb_clk)
1324 .parent = &periph_clk,
1325 .get_rate = _clk_ahb_get_rate,
1326 .set_rate = _clk_ahb_set_rate,
1327 .round_rate = _clk_ahb_round_rate,
1330 static unsigned long _clk_ipg_get_rate(struct clk *clk)
1334 reg = __raw_readl(MXC_CCM_CBCDR);
1335 div = ((reg & MXC_CCM_CBCDR_IPG_PODF_MASK) >>
1336 MXC_CCM_CBCDR_IPG_PODF_OFFSET) + 1;
1338 return clk_get_rate(clk->parent) / div;
1342 static struct clk ipg_clk = {
1343 __INIT_CLK_DEBUG(ipg_clk)
1345 .get_rate = _clk_ipg_get_rate,
1348 static struct clk tzasc1_clk = {
1349 __INIT_CLK_DEBUG(tzasc1_clk)
1352 .enable_reg = MXC_CCM_CCGR2,
1353 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
1354 .enable = _clk_enable,
1355 .disable = _clk_disable_inwait,
1358 static struct clk tzasc2_clk = {
1359 __INIT_CLK_DEBUG(tzasc2_clk)
1362 .enable_reg = MXC_CCM_CCGR2,
1363 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
1364 .enable = _clk_enable,
1365 .disable = _clk_disable_inwait,
1368 static struct clk mx6fast1_clk = {
1369 __INIT_CLK_DEBUG(mx6fast1_clk)
1372 .enable_reg = MXC_CCM_CCGR4,
1373 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
1374 .enable = _clk_enable,
1375 .disable = _clk_disable_inwait,
1378 static struct clk mx6per1_clk = {
1379 __INIT_CLK_DEBUG(mx6per1_clk)
1382 .secondary = &mx6fast1_clk,
1383 .enable_reg = MXC_CCM_CCGR4,
1384 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1385 .enable = _clk_enable,
1386 .disable = _clk_disable_inwait,
1389 static struct clk mx6per2_clk = {
1390 __INIT_CLK_DEBUG(mx6per2_clk)
1393 .enable_reg = MXC_CCM_CCGR4,
1394 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
1395 .enable = _clk_enable,
1396 .disable = _clk_disable_inwait,
1399 static unsigned long _clk_mmdc_ch0_axi_get_rate(struct clk *clk)
1403 reg = __raw_readl(MXC_CCM_CBCDR);
1404 div = ((reg & MXC_CCM_CBCDR_MMDC_CH0_PODF_MASK) >>
1405 MXC_CCM_CBCDR_MMDC_CH0_PODF_OFFSET) + 1;
1407 return clk_get_rate(clk->parent) / div;
1410 static int _clk_mmdc_ch0_axi_set_rate(struct clk *clk, unsigned long rate)
1413 u32 parent_rate = clk_get_rate(clk->parent);
1415 div = parent_rate / rate;
1418 if (((parent_rate / div) != rate) || (div > 8))
1421 reg = __raw_readl(MXC_CCM_CBCDR);
1422 reg &= ~MXC_CCM_CBCDR_MMDC_CH0_PODF_MASK;
1423 reg |= (div - 1) << MXC_CCM_CBCDR_MMDC_CH0_PODF_OFFSET;
1424 __raw_writel(reg, MXC_CCM_CBCDR);
1426 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1427 & MXC_CCM_CDHIPR_MMDC_CH0_PODF_BUSY),
1429 panic("_clk_mmdc_ch0_axi_set_rate failed\n");
1434 static unsigned long _clk_mmdc_ch0_axi_round_rate(struct clk *clk,
1438 u32 parent_rate = clk_get_rate(clk->parent);
1440 div = parent_rate / rate;
1442 /* Make sure rate is not greater than the maximum value for the clock.
1443 * Also prevent a div of 0.
1451 return parent_rate / div;
1454 static struct clk mmdc_ch0_axi_clk[] = {
1456 __INIT_CLK_DEBUG(mmdc_ch0_axi_clk)
1458 .parent = &periph_clk,
1459 .enable = _clk_enable,
1460 .disable = _clk_disable_inwait,
1461 .enable_reg = MXC_CCM_CCGR3,
1462 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
1463 .secondary = &mmdc_ch0_axi_clk[1],
1464 .get_rate = _clk_mmdc_ch0_axi_get_rate,
1465 .set_rate = _clk_mmdc_ch0_axi_set_rate,
1466 .round_rate = _clk_mmdc_ch0_axi_round_rate,
1469 __INIT_CLK_DEBUG(mmdc_ch0_ipg_clk)
1472 .enable = _clk_enable,
1473 .disable = _clk_disable_inwait,
1474 .enable_reg = MXC_CCM_CCGR3,
1475 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
1476 .secondary = &tzasc1_clk,
1480 static unsigned long _clk_mmdc_ch1_axi_get_rate(struct clk *clk)
1484 reg = __raw_readl(MXC_CCM_CBCDR);
1485 div = ((reg & MXC_CCM_CBCDR_MMDC_CH1_PODF_MASK) >>
1486 MXC_CCM_CBCDR_MMDC_CH1_PODF_OFFSET) + 1;
1488 return clk_get_rate(clk->parent) / div;
1491 static int _clk_mmdc_ch1_axi_set_rate(struct clk *clk, unsigned long rate)
1494 u32 parent_rate = clk_get_rate(clk->parent);
1496 div = parent_rate / rate;
1499 if (((parent_rate / div) != rate) || (div > 8))
1502 reg = __raw_readl(MXC_CCM_CBCDR);
1503 reg &= ~MXC_CCM_CBCDR_MMDC_CH1_PODF_MASK;
1504 reg |= (div - 1) << MXC_CCM_CBCDR_MMDC_CH1_PODF_OFFSET;
1505 __raw_writel(reg, MXC_CCM_CBCDR);
1507 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1508 & MXC_CCM_CDHIPR_MMDC_CH1_PODF_BUSY), SPIN_DELAY))
1509 panic("_clk_mmdc_ch1_axi_set_rate failed\n");
1514 static unsigned long _clk_mmdc_ch1_axi_round_rate(struct clk *clk,
1518 u32 parent_rate = clk_get_rate(clk->parent);
1520 div = parent_rate / rate;
1522 /* Make sure rate is not greater than the maximum value for the clock.
1523 * Also prevent a div of 0.
1531 return parent_rate / div;
1534 static struct clk mmdc_ch1_axi_clk[] = {
1536 __INIT_CLK_DEBUG(mmdc_ch1_axi_clk)
1538 .parent = &pll2_pfd_400M,
1539 .enable = _clk_enable,
1540 .disable = _clk_disable,
1541 .enable_reg = MXC_CCM_CCGR3,
1542 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
1543 .secondary = &mmdc_ch1_axi_clk[1],
1544 .get_rate = _clk_mmdc_ch1_axi_get_rate,
1545 .set_rate = _clk_mmdc_ch1_axi_set_rate,
1546 .round_rate = _clk_mmdc_ch1_axi_round_rate,
1550 __INIT_CLK_DEBUG(mmdc_ch1_ipg_clk)
1552 .enable = _clk_enable,
1553 .disable = _clk_disable,
1554 .enable_reg = MXC_CCM_CCGR3,
1555 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
1556 .secondary = &tzasc2_clk,
1560 static struct clk ocram_clk = {
1561 __INIT_CLK_DEBUG(ocram_clk)
1564 .enable_reg = MXC_CCM_CCGR3,
1565 .enable_shift = MXC_CCM_CCGRx_CG14_OFFSET,
1566 .enable = _clk_enable,
1567 .disable = _clk_disable_inwait,
1570 static unsigned long _clk_ipg_perclk_get_rate(struct clk *clk)
1574 reg = __raw_readl(MXC_CCM_CSCMR1);
1575 div = ((reg & MXC_CCM_CSCMR1_PERCLK_PODF_MASK) >>
1576 MXC_CCM_CSCMR1_PERCLK_PODF_OFFSET) + 1;
1578 return clk_get_rate(clk->parent) / div;
1581 static int _clk_ipg_perclk_set_rate(struct clk *clk, unsigned long rate)
1584 u32 parent_rate = clk_get_rate(clk->parent);
1586 div = parent_rate / rate;
1589 if (((parent_rate / div) != rate) || (div > 64))
1592 reg = __raw_readl(MXC_CCM_CSCMR1);
1593 reg &= ~MXC_CCM_CSCMR1_PERCLK_PODF_MASK;
1594 reg |= (div - 1) << MXC_CCM_CSCMR1_PERCLK_PODF_OFFSET;
1595 __raw_writel(reg, MXC_CCM_CSCMR1);
1601 static unsigned long _clk_ipg_perclk_round_rate(struct clk *clk,
1605 u32 parent_rate = clk_get_rate(clk->parent);
1607 div = parent_rate / rate;
1609 /* Make sure rate is not greater than the maximum value for the clock.
1610 * Also prevent a div of 0.
1618 return parent_rate / div;
1621 static struct clk ipg_perclk = {
1622 __INIT_CLK_DEBUG(ipg_perclk)
1624 .get_rate = _clk_ipg_perclk_get_rate,
1625 .set_rate = _clk_ipg_perclk_set_rate,
1626 .round_rate = _clk_ipg_perclk_round_rate,
1629 static struct clk spba_clk = {
1630 __INIT_CLK_DEBUG(spba_clk)
1632 .enable_reg = MXC_CCM_CCGR5,
1633 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1634 .enable = _clk_enable,
1635 .disable = _clk_disable,
1638 static struct clk sdma_clk[] = {
1640 __INIT_CLK_DEBUG(sdma_clk)
1642 .enable_reg = MXC_CCM_CCGR5,
1643 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
1644 .enable = _clk_enable,
1645 .disable = _clk_disable,
1646 .secondary = &sdma_clk[1],
1649 .parent = &mx6per1_clk,
1650 #ifdef CONFIG_SDMA_IRAM
1651 .secondary = &ocram_clk,
1653 .secondary = &mmdc_ch0_axi_clk[0],
1658 static int _clk_gpu2d_axi_set_parent(struct clk *clk, struct clk *parent)
1660 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_GPU2D_AXI_CLK_SEL;
1662 if (parent == &ahb_clk)
1663 reg |= MXC_CCM_CBCMR_GPU2D_AXI_CLK_SEL;
1665 __raw_writel(reg, MXC_CCM_CBCMR);
1670 static struct clk gpu2d_axi_clk = {
1671 __INIT_CLK_DEBUG(gpu2d_axi_clk)
1673 .secondary = &openvg_axi_clk,
1674 .set_parent = _clk_gpu2d_axi_set_parent,
1677 static int _clk_gpu3d_axi_set_parent(struct clk *clk, struct clk *parent)
1679 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_GPU3D_AXI_CLK_SEL;
1681 if (parent == &ahb_clk)
1682 reg |= MXC_CCM_CBCMR_GPU3D_AXI_CLK_SEL;
1684 __raw_writel(reg, MXC_CCM_CBCMR);
1689 static struct clk gpu3d_axi_clk = {
1690 __INIT_CLK_DEBUG(gpu3d_axi_clk)
1692 .secondary = &mmdc_ch0_axi_clk[0],
1693 .set_parent = _clk_gpu3d_axi_set_parent,
1696 static int _clk_pcie_axi_set_parent(struct clk *clk, struct clk *parent)
1698 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_PCIE_AXI_CLK_SEL;
1700 if (parent == &ahb_clk)
1701 reg |= MXC_CCM_CBCMR_PCIE_AXI_CLK_SEL;
1703 __raw_writel(reg, MXC_CCM_CBCMR);
1708 static struct clk pcie_axi_clk = {
1709 __INIT_CLK_DEBUG(pcie_axi_clk)
1711 .set_parent = _clk_pcie_axi_set_parent,
1714 static int _clk_vdo_axi_set_parent(struct clk *clk, struct clk *parent)
1716 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_VDOAXI_CLK_SEL;
1718 if (parent == &ahb_clk)
1719 reg |= MXC_CCM_CBCMR_VDOAXI_CLK_SEL;
1721 __raw_writel(reg, MXC_CCM_CBCMR);
1726 static struct clk vdo_axi_clk = {
1727 __INIT_CLK_DEBUG(vdo_axi_clk)
1729 .enable_reg = MXC_CCM_CCGR6,
1730 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1731 .enable = _clk_enable,
1732 .disable = _clk_disable,
1733 .set_parent = _clk_vdo_axi_set_parent,
1736 static struct clk vdoa_clk = {
1737 __INIT_CLK_DEBUG(vdoa_clk)
1740 .secondary = &mx6fast1_clk,
1741 .enable_reg = MXC_CCM_CCGR2,
1742 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
1743 .enable = _clk_enable,
1744 .disable = _clk_disable,
1747 static unsigned long _clk_gpt_get_rate(struct clk *clk)
1752 if (mx6q_revision() == IMX_CHIP_REVISION_1_0)
1753 return clk_get_rate(clk->parent);
1755 rate = mx6_timer_rate();
1757 return clk_get_rate(clk->parent);
1762 static struct clk gpt_clk[] = {
1764 __INIT_CLK_DEBUG(gpt_clk)
1767 .enable_reg = MXC_CCM_CCGR1,
1768 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
1769 .enable = _clk_enable,
1770 .disable = _clk_disable,
1771 .get_rate = _clk_gpt_get_rate,
1772 .secondary = &gpt_clk[1],
1775 __INIT_CLK_DEBUG(gpt_serial_clk)
1777 .enable_reg = MXC_CCM_CCGR1,
1778 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
1779 .enable = _clk_enable,
1780 .disable = _clk_disable,
1784 static unsigned long _clk_iim_get_rate(struct clk *clk)
1786 return clk_get_rate(clk->parent);
1789 static struct clk iim_clk = {
1790 __INIT_CLK_DEBUG(iim_clk)
1792 .enable = _clk_enable,
1793 .enable_reg = MXC_CCM_CCGR2,
1794 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1795 .disable = _clk_disable,
1796 .get_rate = _clk_iim_get_rate,
1799 static struct clk i2c_clk[] = {
1801 __INIT_CLK_DEBUG(i2c_clk_0)
1803 .parent = &ipg_perclk,
1804 .enable_reg = MXC_CCM_CCGR2,
1805 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
1806 .enable = _clk_enable,
1807 .disable = _clk_disable,
1810 __INIT_CLK_DEBUG(i2c_clk_1)
1812 .parent = &ipg_perclk,
1813 .enable_reg = MXC_CCM_CCGR2,
1814 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
1815 .enable = _clk_enable,
1816 .disable = _clk_disable,
1819 __INIT_CLK_DEBUG(i2c_clk_2)
1821 .parent = &ipg_perclk,
1822 .enable_reg = MXC_CCM_CCGR2,
1823 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
1824 .enable = _clk_enable,
1825 .disable = _clk_disable,
1829 static int _clk_vpu_axi_set_parent(struct clk *clk, struct clk *parent)
1832 u32 reg = __raw_readl(MXC_CCM_CBCMR)
1833 & ~MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_MASK;
1835 mux = _get_mux6(parent, &axi_clk, &pll2_pfd_400M,
1836 &pll2_pfd_352M, NULL, NULL, NULL);
1838 reg |= (mux << MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_OFFSET);
1840 __raw_writel(reg, MXC_CCM_CBCMR);
1845 static unsigned long _clk_vpu_axi_get_rate(struct clk *clk)
1849 reg = __raw_readl(MXC_CCM_CSCDR1);
1850 div = ((reg & MXC_CCM_CSCDR1_VPU_AXI_PODF_MASK) >>
1851 MXC_CCM_CSCDR1_VPU_AXI_PODF_OFFSET) + 1;
1853 return clk_get_rate(clk->parent) / div;
1856 static int _clk_vpu_axi_set_rate(struct clk *clk, unsigned long rate)
1859 u32 parent_rate = clk_get_rate(clk->parent);
1861 div = parent_rate / rate;
1864 if (((parent_rate / div) != rate) || (div > 8))
1867 reg = __raw_readl(MXC_CCM_CSCDR1);
1868 reg &= ~MXC_CCM_CSCDR1_VPU_AXI_PODF_MASK;
1869 reg |= (div - 1) << MXC_CCM_CSCDR1_VPU_AXI_PODF_OFFSET;
1870 __raw_writel(reg, MXC_CCM_CSCDR1);
1875 static unsigned long _clk_vpu_axi_round_rate(struct clk *clk,
1879 u32 parent_rate = clk_get_rate(clk->parent);
1881 div = parent_rate / rate;
1883 /* Make sure rate is not greater than the maximum value for the clock.
1884 * Also prevent a div of 0.
1892 return parent_rate / div;
1895 static struct clk vpu_clk[] = {
1897 __INIT_CLK_DEBUG(vpu_clk)
1899 .enable_reg = MXC_CCM_CCGR6,
1900 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
1901 .enable = _clk_enable,
1902 .disable = _clk_disable,
1903 .set_parent = _clk_vpu_axi_set_parent,
1904 .round_rate = _clk_vpu_axi_round_rate,
1905 .set_rate = _clk_vpu_axi_set_rate,
1906 .get_rate = _clk_vpu_axi_get_rate,
1907 .secondary = &vpu_clk[1],
1910 .parent = &mmdc_ch0_axi_clk[0],
1911 .secondary = &vpu_clk[2],
1914 .parent = &mx6fast1_clk,
1915 .secondary = &ocram_clk,
1920 static int _clk_ipu1_set_parent(struct clk *clk, struct clk *parent)
1923 u32 reg = __raw_readl(MXC_CCM_CSCDR3)
1924 & ~MXC_CCM_CSCDR3_IPU1_HSP_CLK_SEL_MASK;
1926 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
1927 &pll2_pfd_400M, &pll3_120M, &pll3_pfd_540M, NULL, NULL);
1929 reg |= (mux << MXC_CCM_CSCDR3_IPU1_HSP_CLK_SEL_OFFSET);
1931 __raw_writel(reg, MXC_CCM_CSCDR3);
1936 static unsigned long _clk_ipu1_get_rate(struct clk *clk)
1940 reg = __raw_readl(MXC_CCM_CSCDR3);
1941 div = ((reg & MXC_CCM_CSCDR3_IPU1_HSP_PODF_MASK) >>
1942 MXC_CCM_CSCDR3_IPU1_HSP_PODF_OFFSET) + 1;
1944 return clk_get_rate(clk->parent) / div;
1947 static int _clk_ipu1_set_rate(struct clk *clk, unsigned long rate)
1950 u32 parent_rate = clk_get_rate(clk->parent);
1952 div = parent_rate / rate;
1955 if (((parent_rate / div) != rate) || (div > 8))
1958 reg = __raw_readl(MXC_CCM_CSCDR3);
1959 reg &= ~MXC_CCM_CSCDR3_IPU1_HSP_PODF_MASK;
1960 reg |= (div - 1) << MXC_CCM_CSCDR3_IPU1_HSP_PODF_OFFSET;
1961 __raw_writel(reg, MXC_CCM_CSCDR3);
1966 static unsigned long _clk_ipu_round_rate(struct clk *clk,
1970 u32 parent_rate = clk_get_rate(clk->parent);
1972 div = parent_rate / rate;
1974 /* Make sure rate is not greater than the maximum value for the clock.
1975 * Also prevent a div of 0.
1983 return parent_rate / div;
1986 static struct clk ipu1_clk = {
1987 __INIT_CLK_DEBUG(ipu1_clk)
1988 .parent = &mmdc_ch0_axi_clk[0],
1989 .secondary = &mmdc_ch0_axi_clk[0],
1990 .enable_reg = MXC_CCM_CCGR3,
1991 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
1992 .enable = _clk_enable,
1993 .disable = _clk_disable,
1994 .set_parent = _clk_ipu1_set_parent,
1995 .round_rate = _clk_ipu_round_rate,
1996 .set_rate = _clk_ipu1_set_rate,
1997 .get_rate = _clk_ipu1_get_rate,
1998 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2001 static int _clk_cko1_clk0_set_parent(struct clk *clk, struct clk *parent)
2005 if (parent == &pll3_sw_clk)
2007 else if (parent == &pll2_528_bus_main_clk)
2009 else if (parent == &pll1_sys_main_clk)
2011 else if (parent == &pll5_video_main_clk)
2013 else if (parent == &axi_clk)
2015 else if (parent == &enfc_clk)
2017 else if (parent == &ipu1_di_clk_root)
2019 else if (parent == &ipu1_di_clk_root)
2021 else if (parent == &ipu2_di_clk_root)
2023 else if (parent == &ipu2_di_clk_root)
2025 else if (parent == &ahb_clk)
2027 else if (parent == &ipg_clk)
2029 else if (parent == &ipg_perclk)
2031 else if (parent == &ckil_clk)
2033 else if (parent == &pll4_audio_main_clk)
2038 reg = __raw_readl(MXC_CCM_CCOSR);
2039 reg &= ~MXC_CCM_CCOSR_CKOL_SEL_MASK;
2040 reg |= sel << MXC_CCM_CCOSR_CKOL_SEL_OFFSET;
2041 __raw_writel(reg, MXC_CCM_CCOSR);
2045 static unsigned long _clk_cko1_round_rate(struct clk *clk,
2049 u32 parent_rate = clk_get_rate(clk->parent);
2051 div = parent_rate / rate;
2053 /* Make sure rate is not greater than the maximum value for the clock.
2054 * Also prevent a div of 0.
2062 return parent_rate / div;
2065 static int _clk_cko1_set_rate(struct clk *clk, unsigned long rate)
2068 u32 parent_rate = clk_get_rate(clk->parent);
2070 div = parent_rate / rate;
2073 if (((parent_rate / div) != rate) || (div > 8))
2076 reg = __raw_readl(MXC_CCM_CCOSR);
2077 reg &= ~MXC_CCM_CCOSR_CKOL_DIV_MASK;
2078 reg |= div << MXC_CCM_CCOSR_CKOL_DIV_OFFSET;
2079 __raw_writel(reg, MXC_CCM_CCOSR);
2084 static unsigned long _clk_cko1_get_rate(struct clk *clk)
2088 reg = __raw_readl(MXC_CCM_CCOSR);
2089 div = ((reg & MXC_CCM_CCOSR_CKOL_DIV_MASK) >>
2090 MXC_CCM_CCOSR_CKOL_DIV_OFFSET) + 1;
2092 return clk_get_rate(clk->parent) / div;
2095 static int cko1_clk_enable(struct clk *clk)
2098 reg = __raw_readl(clk->enable_reg);
2099 reg |= clk->enable_shift;
2100 __raw_writel(reg, clk->enable_reg);
2105 static struct clk cko1_clk0 = {
2106 __INIT_CLK_DEBUG(cko1_clk0)
2108 .enable_reg = MXC_CCM_CCOSR,
2109 .enable_shift = MXC_CCM_CCOSR_CKOL_EN,
2110 .enable = cko1_clk_enable,
2111 .disable = _clk_disable,
2112 .set_parent = _clk_cko1_clk0_set_parent,
2113 .round_rate = _clk_cko1_round_rate,
2114 .set_rate = _clk_cko1_set_rate,
2115 .get_rate = _clk_cko1_get_rate,
2118 static int _clk_ipu2_set_parent(struct clk *clk, struct clk *parent)
2121 u32 reg = __raw_readl(MXC_CCM_CSCDR3)
2122 & ~MXC_CCM_CSCDR3_IPU2_HSP_CLK_SEL_MASK;
2124 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2125 &pll2_pfd_400M, &pll3_120M, &pll3_pfd_540M, NULL, NULL);
2127 reg |= (mux << MXC_CCM_CSCDR3_IPU2_HSP_CLK_SEL_OFFSET);
2129 __raw_writel(reg, MXC_CCM_CSCDR3);
2134 static unsigned long _clk_ipu2_get_rate(struct clk *clk)
2138 reg = __raw_readl(MXC_CCM_CSCDR3);
2139 div = ((reg & MXC_CCM_CSCDR3_IPU2_HSP_PODF_MASK) >>
2140 MXC_CCM_CSCDR3_IPU2_HSP_PODF_OFFSET) + 1;
2142 return clk_get_rate(clk->parent) / div;
2145 static int _clk_ipu2_set_rate(struct clk *clk, unsigned long rate)
2148 u32 parent_rate = clk_get_rate(clk->parent);
2150 div = parent_rate / rate;
2153 if (((parent_rate / div) != rate) || (div > 8))
2156 reg = __raw_readl(MXC_CCM_CSCDR3);
2157 reg &= ~MXC_CCM_CSCDR3_IPU2_HSP_PODF_MASK;
2158 reg |= (div - 1) << MXC_CCM_CSCDR3_IPU2_HSP_PODF_OFFSET;
2159 __raw_writel(reg, MXC_CCM_CSCDR3);
2164 static struct clk ipu2_clk = {
2165 __INIT_CLK_DEBUG(ipu2_clk)
2166 .parent = &mmdc_ch0_axi_clk[0],
2167 .secondary = &mmdc_ch0_axi_clk[0],
2168 .enable_reg = MXC_CCM_CCGR3,
2169 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
2170 .enable = _clk_enable,
2171 .disable = _clk_disable,
2172 .set_parent = _clk_ipu2_set_parent,
2173 .round_rate = _clk_ipu_round_rate,
2174 .set_rate = _clk_ipu2_set_rate,
2175 .get_rate = _clk_ipu2_get_rate,
2176 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2179 static struct clk usdhc_dep_clk = {
2180 .parent = &mmdc_ch0_axi_clk[0],
2181 .secondary = &mx6per1_clk,
2182 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2185 static unsigned long _clk_usdhc_round_rate(struct clk *clk,
2189 u32 parent_rate = clk_get_rate(clk->parent);
2191 div = parent_rate / rate;
2193 /* Make sure rate is not greater than the maximum value for the clock.
2194 * Also prevent a div of 0.
2202 return parent_rate / div;
2205 static int _clk_usdhc1_set_parent(struct clk *clk, struct clk *parent)
2207 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC1_CLK_SEL;
2209 if (parent == &pll2_pfd_352M)
2210 reg |= (MXC_CCM_CSCMR1_USDHC1_CLK_SEL);
2212 __raw_writel(reg, MXC_CCM_CSCMR1);
2217 static unsigned long _clk_usdhc1_get_rate(struct clk *clk)
2221 reg = __raw_readl(MXC_CCM_CSCDR1);
2222 div = ((reg & MXC_CCM_CSCDR1_USDHC1_PODF_MASK) >>
2223 MXC_CCM_CSCDR1_USDHC1_PODF_OFFSET) + 1;
2225 return clk_get_rate(clk->parent) / div;
2228 static int _clk_usdhc1_set_rate(struct clk *clk, unsigned long rate)
2231 u32 parent_rate = clk_get_rate(clk->parent);
2233 div = parent_rate / rate;
2236 if (((parent_rate / div) != rate) || (div > 8))
2239 reg = __raw_readl(MXC_CCM_CSCDR1);
2240 reg &= ~MXC_CCM_CSCDR1_USDHC1_PODF_MASK;
2241 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC1_PODF_OFFSET;
2242 __raw_writel(reg, MXC_CCM_CSCDR1);
2247 static struct clk usdhc1_clk = {
2248 __INIT_CLK_DEBUG(usdhc1_clk)
2250 .parent = &pll2_pfd_400M,
2251 .secondary = &usdhc_dep_clk,
2252 .enable_reg = MXC_CCM_CCGR6,
2253 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
2254 .enable = _clk_enable,
2255 .disable = _clk_disable,
2256 .set_parent = _clk_usdhc1_set_parent,
2257 .round_rate = _clk_usdhc_round_rate,
2258 .set_rate = _clk_usdhc1_set_rate,
2259 .get_rate = _clk_usdhc1_get_rate,
2260 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2263 static int _clk_usdhc2_set_parent(struct clk *clk, struct clk *parent)
2265 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC2_CLK_SEL;
2267 if (parent == &pll2_pfd_352M)
2268 reg |= (MXC_CCM_CSCMR1_USDHC2_CLK_SEL);
2270 __raw_writel(reg, MXC_CCM_CSCMR1);
2275 static unsigned long _clk_usdhc2_get_rate(struct clk *clk)
2279 reg = __raw_readl(MXC_CCM_CSCDR1);
2280 div = ((reg & MXC_CCM_CSCDR1_USDHC2_PODF_MASK) >>
2281 MXC_CCM_CSCDR1_USDHC2_PODF_OFFSET) + 1;
2283 return clk_get_rate(clk->parent) / div;
2286 static int _clk_usdhc2_set_rate(struct clk *clk, unsigned long rate)
2289 u32 parent_rate = clk_get_rate(clk->parent);
2291 div = parent_rate / rate;
2294 if (((parent_rate / div) != rate) || (div > 8))
2297 reg = __raw_readl(MXC_CCM_CSCDR1);
2298 reg &= ~MXC_CCM_CSCDR1_USDHC2_PODF_MASK;
2299 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC2_PODF_OFFSET;
2300 __raw_writel(reg, MXC_CCM_CSCDR1);
2305 static struct clk usdhc2_clk = {
2306 __INIT_CLK_DEBUG(usdhc2_clk)
2308 .parent = &pll2_pfd_400M,
2309 .secondary = &usdhc_dep_clk,
2310 .enable_reg = MXC_CCM_CCGR6,
2311 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
2312 .enable = _clk_enable,
2313 .disable = _clk_disable,
2314 .set_parent = _clk_usdhc2_set_parent,
2315 .round_rate = _clk_usdhc_round_rate,
2316 .set_rate = _clk_usdhc2_set_rate,
2317 .get_rate = _clk_usdhc2_get_rate,
2318 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2321 static int _clk_usdhc3_set_parent(struct clk *clk, struct clk *parent)
2323 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC3_CLK_SEL;
2325 if (parent == &pll2_pfd_352M)
2326 reg |= (MXC_CCM_CSCMR1_USDHC3_CLK_SEL);
2328 __raw_writel(reg, MXC_CCM_CSCMR1);
2333 static unsigned long _clk_usdhc3_get_rate(struct clk *clk)
2337 reg = __raw_readl(MXC_CCM_CSCDR1);
2338 div = ((reg & MXC_CCM_CSCDR1_USDHC3_PODF_MASK) >>
2339 MXC_CCM_CSCDR1_USDHC3_PODF_OFFSET) + 1;
2341 return clk_get_rate(clk->parent) / div;
2344 static int _clk_usdhc3_set_rate(struct clk *clk, unsigned long rate)
2347 u32 parent_rate = clk_get_rate(clk->parent);
2349 div = parent_rate / rate;
2352 if (((parent_rate / div) != rate) || (div > 8))
2355 reg = __raw_readl(MXC_CCM_CSCDR1);
2356 reg &= ~MXC_CCM_CSCDR1_USDHC3_PODF_MASK;
2357 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC3_PODF_OFFSET;
2358 __raw_writel(reg, MXC_CCM_CSCDR1);
2364 static struct clk usdhc3_clk = {
2365 __INIT_CLK_DEBUG(usdhc3_clk)
2367 .parent = &pll2_pfd_400M,
2368 .secondary = &usdhc_dep_clk,
2369 .enable_reg = MXC_CCM_CCGR6,
2370 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
2371 .enable = _clk_enable,
2372 .disable = _clk_disable,
2373 .set_parent = _clk_usdhc3_set_parent,
2374 .round_rate = _clk_usdhc_round_rate,
2375 .set_rate = _clk_usdhc3_set_rate,
2376 .get_rate = _clk_usdhc3_get_rate,
2377 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2380 static int _clk_usdhc4_set_parent(struct clk *clk, struct clk *parent)
2382 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC4_CLK_SEL;
2384 if (parent == &pll2_pfd_352M)
2385 reg |= (MXC_CCM_CSCMR1_USDHC4_CLK_SEL);
2387 __raw_writel(reg, MXC_CCM_CSCMR1);
2392 static unsigned long _clk_usdhc4_get_rate(struct clk *clk)
2396 reg = __raw_readl(MXC_CCM_CSCDR1);
2397 div = ((reg & MXC_CCM_CSCDR1_USDHC4_PODF_MASK) >>
2398 MXC_CCM_CSCDR1_USDHC4_PODF_OFFSET) + 1;
2400 return clk_get_rate(clk->parent) / div;
2403 static int _clk_usdhc4_set_rate(struct clk *clk, unsigned long rate)
2406 u32 parent_rate = clk_get_rate(clk->parent);
2408 div = parent_rate / rate;
2411 if (((parent_rate / div) != rate) || (div > 8))
2414 reg = __raw_readl(MXC_CCM_CSCDR1);
2415 reg &= ~MXC_CCM_CSCDR1_USDHC4_PODF_MASK;
2416 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC4_PODF_OFFSET;
2417 __raw_writel(reg, MXC_CCM_CSCDR1);
2423 static struct clk usdhc4_clk = {
2424 __INIT_CLK_DEBUG(usdhc4_clk)
2426 .parent = &pll2_pfd_400M,
2427 .secondary = &usdhc_dep_clk,
2428 .enable_reg = MXC_CCM_CCGR6,
2429 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
2430 .enable = _clk_enable,
2431 .disable = _clk_disable,
2432 .set_parent = _clk_usdhc4_set_parent,
2433 .round_rate = _clk_usdhc_round_rate,
2434 .set_rate = _clk_usdhc4_set_rate,
2435 .get_rate = _clk_usdhc4_get_rate,
2436 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2439 static unsigned long _clk_ssi_round_rate(struct clk *clk,
2443 u32 parent_rate = clk_get_rate(clk->parent);
2444 u32 div = parent_rate / rate;
2446 if (parent_rate % rate)
2449 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2451 return parent_rate / (pre * post);
2454 static unsigned long _clk_ssi1_get_rate(struct clk *clk)
2456 u32 reg, prediv, podf;
2458 reg = __raw_readl(MXC_CCM_CS1CDR);
2460 prediv = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK)
2461 >> MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET) + 1;
2462 podf = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK)
2463 >> MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET) + 1;
2465 return clk_get_rate(clk->parent) / (prediv * podf);
2468 static int _clk_ssi1_set_rate(struct clk *clk, unsigned long rate)
2470 u32 reg, div, pre, post;
2471 u32 parent_rate = clk_get_rate(clk->parent);
2473 div = parent_rate / rate;
2476 if (((parent_rate / div) != rate) || div > 512)
2479 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2481 reg = __raw_readl(MXC_CCM_CS1CDR);
2482 reg &= ~(MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK |
2483 MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK);
2484 reg |= (post - 1) << MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET;
2485 reg |= (pre - 1) << MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET;
2487 __raw_writel(reg, MXC_CCM_CS1CDR);
2493 static int _clk_ssi1_set_parent(struct clk *clk, struct clk *parent)
2497 reg = __raw_readl(MXC_CCM_CSCMR1)
2498 & ~MXC_CCM_CSCMR1_SSI1_CLK_SEL_MASK;
2500 mux = _get_mux6(parent, &pll3_pfd_508M, &pll3_pfd_454M,
2501 &pll4_audio_main_clk, NULL, NULL, NULL);
2502 reg |= (mux << MXC_CCM_CSCMR1_SSI1_CLK_SEL_OFFSET);
2504 __raw_writel(reg, MXC_CCM_CSCMR1);
2509 static struct clk ssi1_clk = {
2510 __INIT_CLK_DEBUG(ssi1_clk)
2511 .parent = &pll3_pfd_508M,
2512 .enable_reg = MXC_CCM_CCGR5,
2513 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
2514 .enable = _clk_enable,
2515 .disable = _clk_disable,
2516 .set_parent = _clk_ssi1_set_parent,
2517 .set_rate = _clk_ssi1_set_rate,
2518 .round_rate = _clk_ssi_round_rate,
2519 .get_rate = _clk_ssi1_get_rate,
2520 #ifdef CONFIG_SND_MXC_SOC_IRAM
2521 .secondary = &ocram_clk,
2523 .secondary = &mmdc_ch0_axi_clk[0],
2527 static unsigned long _clk_ssi2_get_rate(struct clk *clk)
2529 u32 reg, prediv, podf;
2531 reg = __raw_readl(MXC_CCM_CS2CDR);
2533 prediv = ((reg & MXC_CCM_CS2CDR_SSI2_CLK_PRED_MASK)
2534 >> MXC_CCM_CS2CDR_SSI2_CLK_PRED_OFFSET) + 1;
2535 podf = ((reg & MXC_CCM_CS2CDR_SSI2_CLK_PODF_MASK)
2536 >> MXC_CCM_CS2CDR_SSI2_CLK_PODF_OFFSET) + 1;
2538 return clk_get_rate(clk->parent) / (prediv * podf);
2541 static int _clk_ssi2_set_rate(struct clk *clk, unsigned long rate)
2543 u32 reg, div, pre, post;
2544 u32 parent_rate = clk_get_rate(clk->parent);
2546 div = parent_rate / rate;
2549 if (((parent_rate / div) != rate) || div > 512)
2552 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2554 reg = __raw_readl(MXC_CCM_CS2CDR);
2555 reg &= ~(MXC_CCM_CS2CDR_SSI2_CLK_PRED_MASK |
2556 MXC_CCM_CS2CDR_SSI2_CLK_PODF_MASK);
2557 reg |= (post - 1) << MXC_CCM_CS2CDR_SSI2_CLK_PODF_OFFSET;
2558 reg |= (pre - 1) << MXC_CCM_CS2CDR_SSI2_CLK_PRED_OFFSET;
2560 __raw_writel(reg, MXC_CCM_CS2CDR);
2566 static int _clk_ssi2_set_parent(struct clk *clk, struct clk *parent)
2570 reg = __raw_readl(MXC_CCM_CSCMR1)
2571 & ~MXC_CCM_CSCMR1_SSI2_CLK_SEL_MASK;
2573 mux = _get_mux6(parent, &pll3_pfd_508M, &pll3_pfd_454M,
2574 &pll4_audio_main_clk, NULL, NULL, NULL);
2575 reg |= (mux << MXC_CCM_CSCMR1_SSI2_CLK_SEL_OFFSET);
2577 __raw_writel(reg, MXC_CCM_CSCMR1);
2582 static struct clk ssi2_clk = {
2583 __INIT_CLK_DEBUG(ssi2_clk)
2584 .parent = &pll3_pfd_508M,
2585 .enable_reg = MXC_CCM_CCGR5,
2586 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
2587 .enable = _clk_enable,
2588 .disable = _clk_disable,
2589 .set_parent = _clk_ssi2_set_parent,
2590 .set_rate = _clk_ssi2_set_rate,
2591 .round_rate = _clk_ssi_round_rate,
2592 .get_rate = _clk_ssi2_get_rate,
2593 #ifdef CONFIG_SND_MXC_SOC_IRAM
2594 .secondary = &ocram_clk,
2596 .secondary = &mmdc_ch0_axi_clk[0],
2600 static unsigned long _clk_ssi3_get_rate(struct clk *clk)
2602 u32 reg, prediv, podf;
2604 reg = __raw_readl(MXC_CCM_CS1CDR);
2606 prediv = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK)
2607 >> MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET) + 1;
2608 podf = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK)
2609 >> MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET) + 1;
2611 return clk_get_rate(clk->parent) / (prediv * podf);
2614 static int _clk_ssi3_set_rate(struct clk *clk, unsigned long rate)
2616 u32 reg, div, pre, post;
2617 u32 parent_rate = clk_get_rate(clk->parent);
2619 div = parent_rate / rate;
2622 if (((parent_rate / div) != rate) || div > 512)
2625 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2627 reg = __raw_readl(MXC_CCM_CS1CDR);
2628 reg &= ~(MXC_CCM_CS1CDR_SSI3_CLK_PODF_MASK|
2629 MXC_CCM_CS1CDR_SSI3_CLK_PRED_MASK);
2630 reg |= (post - 1) << MXC_CCM_CS1CDR_SSI3_CLK_PODF_OFFSET;
2631 reg |= (pre - 1) << MXC_CCM_CS1CDR_SSI3_CLK_PRED_OFFSET;
2633 __raw_writel(reg, MXC_CCM_CS1CDR);
2639 static int _clk_ssi3_set_parent(struct clk *clk, struct clk *parent)
2643 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_SSI3_CLK_SEL_MASK;
2645 mux = _get_mux6(parent, &pll3_pfd_508M, &pll3_pfd_454M,
2646 &pll4_audio_main_clk, NULL, NULL, NULL);
2647 reg |= (mux << MXC_CCM_CSCMR1_SSI3_CLK_SEL_OFFSET);
2649 __raw_writel(reg, MXC_CCM_CSCMR1);
2654 static struct clk ssi3_clk = {
2655 __INIT_CLK_DEBUG(ssi3_clk)
2656 .parent = &pll3_pfd_508M,
2657 .enable_reg = MXC_CCM_CCGR5,
2658 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
2659 .enable = _clk_enable,
2660 .disable = _clk_disable,
2661 .set_parent = _clk_ssi3_set_parent,
2662 .set_rate = _clk_ssi3_set_rate,
2663 .round_rate = _clk_ssi_round_rate,
2664 .get_rate = _clk_ssi3_get_rate,
2665 #ifdef CONFIG_SND_MXC_SOC_IRAM
2666 .secondary = &ocram_clk,
2668 .secondary = &mmdc_ch0_axi_clk[0],
2672 static unsigned long _clk_ldb_di_round_rate(struct clk *clk,
2675 u32 parent_rate = clk_get_rate(clk->parent);
2677 if (rate * 7 <= parent_rate + parent_rate/20)
2678 return parent_rate / 7;
2680 return 2 * parent_rate / 7;
2683 static unsigned long _clk_ldb_di0_get_rate(struct clk *clk)
2687 div = __raw_readl(MXC_CCM_CSCMR2) &
2688 MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
2691 return clk_get_rate(clk->parent) / 7;
2693 return (2 * clk_get_rate(clk->parent)) / 7;
2696 static int _clk_ldb_di0_set_rate(struct clk *clk, unsigned long rate)
2699 u32 parent_rate = clk_get_rate(clk->parent);
2701 if (rate * 7 <= parent_rate + parent_rate/20) {
2703 rate = parent_rate / 7;
2705 rate = 2 * parent_rate / 7;
2707 reg = __raw_readl(MXC_CCM_CSCMR2);
2709 reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
2711 reg &= ~MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
2713 __raw_writel(reg, MXC_CCM_CSCMR2);
2718 static int _clk_ldb_di0_set_parent(struct clk *clk, struct clk *parent)
2722 reg = __raw_readl(MXC_CCM_CS2CDR)
2723 & ~MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK;
2725 mux = _get_mux6(parent, &pll5_video_main_clk,
2726 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M,
2727 &pll3_usb_otg_main_clk, NULL);
2728 reg |= (mux << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET);
2730 __raw_writel(reg, MXC_CCM_CS2CDR);
2735 static struct clk ldb_di0_clk = {
2736 __INIT_CLK_DEBUG(ldb_di0_clk)
2738 .parent = &pll3_pfd_540M,
2739 .enable_reg = MXC_CCM_CCGR3,
2740 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
2741 .enable = _clk_enable,
2742 .disable = _clk_disable,
2743 .set_parent = _clk_ldb_di0_set_parent,
2744 .set_rate = _clk_ldb_di0_set_rate,
2745 .round_rate = _clk_ldb_di_round_rate,
2746 .get_rate = _clk_ldb_di0_get_rate,
2747 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2750 static unsigned long _clk_ldb_di1_get_rate(struct clk *clk)
2754 div = __raw_readl(MXC_CCM_CSCMR2) &
2755 MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
2758 return clk_get_rate(clk->parent) / 7;
2760 return (2 * clk_get_rate(clk->parent)) / 7;
2763 static int _clk_ldb_di1_set_rate(struct clk *clk, unsigned long rate)
2766 u32 parent_rate = clk_get_rate(clk->parent);
2768 if (rate * 7 <= parent_rate + parent_rate/20) {
2770 rate = parent_rate / 7;
2772 rate = 2 * parent_rate / 7;
2774 reg = __raw_readl(MXC_CCM_CSCMR2);
2776 reg |= MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
2778 reg &= ~MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
2780 __raw_writel(reg, MXC_CCM_CSCMR2);
2785 static int _clk_ldb_di1_set_parent(struct clk *clk, struct clk *parent)
2789 reg = __raw_readl(MXC_CCM_CS2CDR)
2790 & ~MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK;
2792 mux = _get_mux6(parent, &pll5_video_main_clk,
2793 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M,
2794 &pll3_usb_otg_main_clk, NULL);
2795 reg |= (mux << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
2797 __raw_writel(reg, MXC_CCM_CS2CDR);
2802 static struct clk ldb_di1_clk = {
2803 __INIT_CLK_DEBUG(ldb_di1_clk)
2805 .parent = &pll3_pfd_540M,
2806 .enable_reg = MXC_CCM_CCGR3,
2807 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
2808 .enable = _clk_enable,
2809 .disable = _clk_disable,
2810 .set_parent = _clk_ldb_di1_set_parent,
2811 .set_rate = _clk_ldb_di1_set_rate,
2812 .round_rate = _clk_ldb_di_round_rate,
2813 .get_rate = _clk_ldb_di1_get_rate,
2814 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2818 static unsigned long _clk_ipu_di_round_rate(struct clk *clk,
2822 u32 parent_rate = clk_get_rate(clk->parent);
2824 if ((clk->parent == &ldb_di0_clk) ||
2825 (clk->parent == &ldb_di1_clk))
2828 div = parent_rate / rate;
2829 /* Round to closest divisor */
2830 if ((parent_rate % rate) > (rate / 2))
2833 /* Make sure rate is not greater than the maximum value for the clock.
2834 * Also prevent a div of 0.
2842 return parent_rate / div;
2845 static unsigned long _clk_ipu1_di0_get_rate(struct clk *clk)
2849 if ((clk->parent == &ldb_di0_clk) ||
2850 (clk->parent == &ldb_di1_clk))
2851 return clk_get_rate(clk->parent);
2853 reg = __raw_readl(MXC_CCM_CHSCCDR);
2855 div = ((reg & MXC_CCM_CHSCCDR_IPU1_DI0_PODF_MASK) >>
2856 MXC_CCM_CHSCCDR_IPU1_DI0_PODF_OFFSET) + 1;
2858 return clk_get_rate(clk->parent) / div;
2861 static int _clk_ipu1_di0_set_rate(struct clk *clk, unsigned long rate)
2864 u32 parent_rate = clk_get_rate(clk->parent);
2866 if ((clk->parent == &ldb_di0_clk) ||
2867 (clk->parent == &ldb_di1_clk)) {
2868 if (parent_rate == rate)
2874 div = parent_rate / rate;
2877 if (((parent_rate / div) != rate) || (div > 8))
2880 reg = __raw_readl(MXC_CCM_CHSCCDR);
2881 reg &= ~MXC_CCM_CHSCCDR_IPU1_DI0_PODF_MASK;
2882 reg |= (div - 1) << MXC_CCM_CHSCCDR_IPU1_DI0_PODF_OFFSET;
2883 __raw_writel(reg, MXC_CCM_CHSCCDR);
2889 static int _clk_ipu1_di0_set_parent(struct clk *clk, struct clk *parent)
2893 if (parent == &ldb_di0_clk)
2895 else if (parent == &ldb_di1_clk)
2898 reg = __raw_readl(MXC_CCM_CHSCCDR)
2899 & ~MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_MASK;
2901 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2902 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
2903 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
2904 reg |= (mux << MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_OFFSET);
2906 __raw_writel(reg, MXC_CCM_CHSCCDR);
2908 /* Derive clock from divided pre-muxed ipu1_di0 clock.*/
2912 reg = __raw_readl(MXC_CCM_CHSCCDR)
2913 & ~MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_MASK;
2914 __raw_writel(reg | (mux << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET),
2920 static unsigned long _clk_ipu1_di1_get_rate(struct clk *clk)
2924 if ((clk->parent == &ldb_di0_clk) ||
2925 (clk->parent == &ldb_di1_clk))
2926 return clk_get_rate(clk->parent);
2928 reg = __raw_readl(MXC_CCM_CHSCCDR);
2930 div = ((reg & MXC_CCM_CHSCCDR_IPU1_DI1_PODF_MASK)
2931 >> MXC_CCM_CHSCCDR_IPU1_DI1_PODF_OFFSET) + 1;
2933 return clk_get_rate(clk->parent) / div;
2936 static int _clk_ipu1_di1_set_rate(struct clk *clk, unsigned long rate)
2939 u32 parent_rate = clk_get_rate(clk->parent);
2941 if ((clk->parent == &ldb_di0_clk) ||
2942 (clk->parent == &ldb_di1_clk)) {
2943 if (parent_rate == rate)
2949 div = parent_rate / rate;
2952 if (((parent_rate / div) != rate) || (div > 8))
2955 reg = __raw_readl(MXC_CCM_CHSCCDR);
2956 reg &= ~MXC_CCM_CHSCCDR_IPU1_DI1_PODF_MASK;
2957 reg |= (div - 1) << MXC_CCM_CHSCCDR_IPU1_DI1_PODF_OFFSET;
2958 __raw_writel(reg, MXC_CCM_CHSCCDR);
2964 static int _clk_ipu1_di1_set_parent(struct clk *clk, struct clk *parent)
2968 if (parent == &ldb_di0_clk)
2970 else if (parent == &ldb_di1_clk)
2973 reg = __raw_readl(MXC_CCM_CHSCCDR)
2974 & ~MXC_CCM_CHSCCDR_IPU1_DI1_PRE_CLK_SEL_MASK;
2976 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2977 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
2978 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
2979 reg |= (mux << MXC_CCM_CHSCCDR_IPU1_DI1_PRE_CLK_SEL_OFFSET);
2981 __raw_writel(reg, MXC_CCM_CHSCCDR);
2983 /* Derive clock from divided pre-muxed ipu1_di0 clock.*/
2986 reg = __raw_readl(MXC_CCM_CHSCCDR)
2987 & ~MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_MASK;
2988 __raw_writel(reg | (mux << MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET),
2994 static struct clk ipu1_di_clk[] = {
2996 __INIT_CLK_DEBUG(ipu1_di_clk_0)
2998 .parent = &pll5_video_main_clk,
2999 .enable_reg = MXC_CCM_CCGR3,
3000 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
3001 .enable = _clk_enable,
3002 .disable = _clk_disable,
3003 .set_parent = _clk_ipu1_di0_set_parent,
3004 .set_rate = _clk_ipu1_di0_set_rate,
3005 .round_rate = _clk_ipu_di_round_rate,
3006 .get_rate = _clk_ipu1_di0_get_rate,
3007 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3010 __INIT_CLK_DEBUG(ipu1_di_clk_1)
3012 .parent = &pll5_video_main_clk,
3013 .enable_reg = MXC_CCM_CCGR3,
3014 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
3015 .enable = _clk_enable,
3016 .disable = _clk_disable,
3017 .set_parent = _clk_ipu1_di1_set_parent,
3018 .set_rate = _clk_ipu1_di1_set_rate,
3019 .round_rate = _clk_ipu_di_round_rate,
3020 .get_rate = _clk_ipu1_di1_get_rate,
3021 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3025 static unsigned long _clk_ipu2_di0_get_rate(struct clk *clk)
3029 if ((clk->parent == &ldb_di0_clk) ||
3030 (clk->parent == &ldb_di1_clk))
3031 return clk_get_rate(clk->parent);
3033 reg = __raw_readl(MXC_CCM_CSCDR2);
3035 div = ((reg & MXC_CCM_CSCDR2_IPU2_DI0_PODF_MASK) >>
3036 MXC_CCM_CSCDR2_IPU2_DI0_PODF_OFFSET) + 1;
3038 return clk_get_rate(clk->parent) / div;
3041 static int _clk_ipu2_di0_set_rate(struct clk *clk, unsigned long rate)
3044 u32 parent_rate = clk_get_rate(clk->parent);
3046 if ((clk->parent == &ldb_di0_clk) ||
3047 (clk->parent == &ldb_di1_clk)) {
3048 if (parent_rate == rate)
3054 div = parent_rate / rate;
3057 if (((parent_rate / div) != rate) || (div > 8))
3060 reg = __raw_readl(MXC_CCM_CSCDR2);
3061 reg &= ~MXC_CCM_CSCDR2_IPU2_DI0_PODF_MASK;
3062 reg |= (div - 1) << MXC_CCM_CSCDR2_IPU2_DI0_PODF_OFFSET;
3063 __raw_writel(reg, MXC_CCM_CSCDR2);
3068 static int _clk_ipu2_di0_set_parent(struct clk *clk, struct clk *parent)
3072 if (parent == &ldb_di0_clk)
3074 else if (parent == &ldb_di1_clk)
3077 reg = __raw_readl(MXC_CCM_CSCDR2)
3078 & ~MXC_CCM_CSCDR2_IPU2_DI0_PRE_CLK_SEL_MASK;
3080 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
3081 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
3082 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
3083 reg |= (mux << MXC_CCM_CSCDR2_IPU2_DI0_PRE_CLK_SEL_OFFSET);
3085 __raw_writel(reg, MXC_CCM_CSCDR2);
3087 /* Derive clock from divided pre-muxed ipu2_di0 clock.*/
3090 reg = __raw_readl(MXC_CCM_CSCDR2)
3091 & ~MXC_CCM_CSCDR2_IPU2_DI0_CLK_SEL_MASK;
3092 __raw_writel(reg | (mux << MXC_CCM_CSCDR2_IPU2_DI0_CLK_SEL_OFFSET),
3098 static unsigned long _clk_ipu2_di1_get_rate(struct clk *clk)
3102 if ((clk->parent == &ldb_di0_clk) ||
3103 (clk->parent == &ldb_di1_clk))
3104 return clk_get_rate(clk->parent);
3106 reg = __raw_readl(MXC_CCM_CSCDR2);
3108 div = ((reg & MXC_CCM_CSCDR2_IPU2_DI1_PODF_MASK)
3109 >> MXC_CCM_CSCDR2_IPU2_DI1_PODF_OFFSET) + 1;
3111 return clk_get_rate(clk->parent) / div;
3114 static int _clk_ipu2_di1_set_rate(struct clk *clk, unsigned long rate)
3117 u32 parent_rate = clk_get_rate(clk->parent);
3119 if ((clk->parent == &ldb_di0_clk) ||
3120 (clk->parent == &ldb_di1_clk)) {
3121 if (parent_rate == rate)
3127 div = parent_rate / rate;
3130 if (((parent_rate / div) != rate) || (div > 8))
3133 reg = __raw_readl(MXC_CCM_CSCDR2);
3134 reg &= ~MXC_CCM_CSCDR2_IPU2_DI1_PODF_MASK;
3135 reg |= (div - 1) << MXC_CCM_CSCDR2_IPU2_DI1_PODF_OFFSET;
3136 __raw_writel(reg, MXC_CCM_CSCDR2);
3141 static int _clk_ipu2_di1_set_parent(struct clk *clk, struct clk *parent)
3145 if (parent == &ldb_di0_clk)
3147 else if (parent == &ldb_di1_clk)
3150 reg = __raw_readl(MXC_CCM_CSCDR2)
3151 & ~MXC_CCM_CSCDR2_IPU2_DI1_PRE_CLK_SEL_MASK;
3153 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
3154 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
3155 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
3156 reg |= (mux << MXC_CCM_CSCDR2_IPU2_DI1_PRE_CLK_SEL_OFFSET);
3158 __raw_writel(reg, MXC_CCM_CSCDR2);
3160 /* Derive clock from divided pre-muxed ipu1_di0 clock.*/
3163 reg = __raw_readl(MXC_CCM_CSCDR2)
3164 & ~MXC_CCM_CSCDR2_IPU2_DI1_CLK_SEL_MASK;
3165 __raw_writel(reg | (mux << MXC_CCM_CSCDR2_IPU2_DI1_CLK_SEL_OFFSET),
3171 static struct clk ipu2_di_clk[] = {
3173 __INIT_CLK_DEBUG(ipu2_di_clk_0)
3175 .parent = &pll5_video_main_clk,
3176 .enable_reg = MXC_CCM_CCGR3,
3177 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
3178 .enable = _clk_enable,
3179 .disable = _clk_disable,
3180 .set_parent = _clk_ipu2_di0_set_parent,
3181 .set_rate = _clk_ipu2_di0_set_rate,
3182 .round_rate = _clk_ipu_di_round_rate,
3183 .get_rate = _clk_ipu2_di0_get_rate,
3184 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3187 __INIT_CLK_DEBUG(ipu2_di_clk_1)
3189 .parent = &pll5_video_main_clk,
3190 .enable_reg = MXC_CCM_CCGR3,
3191 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
3192 .enable = _clk_enable,
3193 .disable = _clk_disable,
3194 .set_parent = _clk_ipu2_di1_set_parent,
3195 .set_rate = _clk_ipu2_di1_set_rate,
3196 .round_rate = _clk_ipu_di_round_rate,
3197 .get_rate = _clk_ipu2_di1_get_rate,
3198 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3202 static unsigned long _clk_can_root_round_rate(struct clk *clk,
3206 u32 parent_rate = clk_get_rate(clk->parent);
3208 div = parent_rate / rate;
3210 /* Make sure rate is not greater than the maximum value for the clock.
3211 * Also prevent a div of 0.
3219 return parent_rate / div;
3222 static int _clk_can_root_set_rate(struct clk *clk, unsigned long rate)
3225 u32 parent_rate = clk_get_rate(clk->parent);
3227 div = parent_rate / rate;
3230 if (((parent_rate / div) != rate) || (div > 64))
3233 reg = __raw_readl(MXC_CCM_CSCMR2) & MXC_CCM_CSCMR2_CAN_CLK_PODF_MASK;
3234 reg |= ((div - 1) << MXC_CCM_CSCMR2_CAN_CLK_PODF_OFFSET);
3236 __raw_writel(reg, MXC_CCM_CSCMR2);
3241 static unsigned long _clk_can_root_get_rate(struct clk *clk)
3246 reg = __raw_readl(MXC_CCM_CSCMR2) & MXC_CCM_CSCMR2_CAN_CLK_PODF_MASK;
3247 div = (reg >> MXC_CCM_CSCMR2_CAN_CLK_PODF_OFFSET) + 1;
3248 val = clk_get_rate(clk->parent) / div;
3253 static struct clk can_clk_root = {
3254 __INIT_CLK_DEBUG(can_clk_root)
3255 .parent = &pll3_60M,
3256 .set_rate = _clk_can_root_set_rate,
3257 .get_rate = _clk_can_root_get_rate,
3258 .round_rate = _clk_can_root_round_rate,
3261 static struct clk can2_clk[] = {
3263 __INIT_CLK_DEBUG(can2_module_clk)
3265 .parent = &can_clk_root,
3266 .enable_reg = MXC_CCM_CCGR0,
3267 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
3268 .enable = _clk_enable,
3269 .disable = _clk_disable,
3270 .secondary = &can2_clk[1],
3271 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3274 __INIT_CLK_DEBUG(can2_serial_clk)
3276 .parent = &can_clk_root,
3277 .enable_reg = MXC_CCM_CCGR0,
3278 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
3279 .enable = _clk_enable,
3280 .disable = _clk_disable,
3285 static struct clk can1_clk[] = {
3287 __INIT_CLK_DEBUG(can1_module_clk)
3289 .parent = &can_clk_root,
3290 .enable_reg = MXC_CCM_CCGR0,
3291 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
3292 .enable = _clk_enable,
3293 .disable = _clk_disable,
3294 .secondary = &can1_clk[1],
3295 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3298 __INIT_CLK_DEBUG(can1_serial_clk)
3300 .parent = &can_clk_root,
3301 .enable_reg = MXC_CCM_CCGR0,
3302 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
3303 .enable = _clk_enable,
3304 .disable = _clk_disable,
3308 static unsigned long _clk_spdif_round_rate(struct clk *clk,
3312 u32 parent_rate = clk_get_rate(clk->parent);
3313 u32 div = parent_rate / rate;
3315 if (parent_rate % rate)
3318 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3320 return parent_rate / (pre * post);
3323 static int _clk_spdif0_set_parent(struct clk *clk, struct clk *parent)
3327 reg = __raw_readl(MXC_CCM_CDCDR)
3328 & ~MXC_CCM_CDCDR_SPDIF0_CLK_SEL_MASK;
3330 mux = _get_mux6(parent, &pll4_audio_main_clk,
3331 &pll3_pfd_508M, &pll3_pfd_454M,
3332 &pll3_sw_clk, NULL, NULL);
3333 reg |= mux << MXC_CCM_CDCDR_SPDIF0_CLK_SEL_OFFSET;
3335 __raw_writel(reg, MXC_CCM_CDCDR);
3340 static unsigned long _clk_spdif0_get_rate(struct clk *clk)
3342 u32 reg, pred, podf;
3344 reg = __raw_readl(MXC_CCM_CDCDR);
3346 pred = ((reg & MXC_CCM_CDCDR_SPDIF0_CLK_PRED_MASK)
3347 >> MXC_CCM_CDCDR_SPDIF0_CLK_PRED_OFFSET) + 1;
3348 podf = ((reg & MXC_CCM_CDCDR_SPDIF0_CLK_PODF_MASK)
3349 >> MXC_CCM_CDCDR_SPDIF0_CLK_PODF_OFFSET) + 1;
3351 return clk_get_rate(clk->parent) / (pred * podf);
3354 static int _clk_spdif0_set_rate(struct clk *clk, unsigned long rate)
3356 u32 reg, div, pre, post;
3357 u32 parent_rate = clk_get_rate(clk->parent);
3359 div = parent_rate / rate;
3362 if (((parent_rate / div) != rate) || div > 64)
3365 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3367 reg = __raw_readl(MXC_CCM_CDCDR);
3368 reg &= ~(MXC_CCM_CDCDR_SPDIF0_CLK_PRED_MASK|
3369 MXC_CCM_CDCDR_SPDIF0_CLK_PODF_MASK);
3370 reg |= (post - 1) << MXC_CCM_CDCDR_SPDIF0_CLK_PODF_OFFSET;
3371 reg |= (pre - 1) << MXC_CCM_CDCDR_SPDIF0_CLK_PRED_OFFSET;
3373 __raw_writel(reg, MXC_CCM_CDCDR);
3378 static struct clk spdif0_clk[] = {
3380 __INIT_CLK_DEBUG(spdif0_clk_0)
3382 .parent = &pll3_sw_clk,
3383 .enable = _clk_enable,
3384 .enable_reg = MXC_CCM_CCGR5,
3385 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
3386 .disable = _clk_disable,
3387 .secondary = &spdif0_clk[1],
3388 .set_rate = _clk_spdif0_set_rate,
3389 .get_rate = _clk_spdif0_get_rate,
3390 .set_parent = _clk_spdif0_set_parent,
3391 .round_rate = _clk_spdif_round_rate,
3392 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3395 __INIT_CLK_DEBUG(spdif0_clk_1)
3398 .secondary = &spba_clk,
3402 static unsigned long _clk_esai_round_rate(struct clk *clk,
3406 u32 parent_rate = clk_get_rate(clk->parent);
3407 u32 div = parent_rate / rate;
3409 if (parent_rate % rate)
3412 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3414 return parent_rate / (pre * post);
3417 static int _clk_esai_set_parent(struct clk *clk, struct clk *parent)
3421 reg = __raw_readl(MXC_CCM_CSCMR2) & ~MXC_CCM_CSCMR2_ESAI_CLK_SEL_MASK;
3423 mux = _get_mux6(parent, &pll4_audio_main_clk, &pll3_pfd_508M,
3424 &pll3_pfd_454M, &pll3_sw_clk, NULL, NULL);
3425 reg |= mux << MXC_CCM_CSCMR2_ESAI_CLK_SEL_OFFSET;
3427 __raw_writel(reg, MXC_CCM_CSCMR2);
3432 static unsigned long _clk_esai_get_rate(struct clk *clk)
3434 u32 reg, pred, podf;
3436 reg = __raw_readl(MXC_CCM_CS1CDR);
3438 pred = ((reg & MXC_CCM_CS1CDR_ESAI_CLK_PRED_MASK)
3439 >> MXC_CCM_CS1CDR_ESAI_CLK_PRED_OFFSET) + 1;
3440 podf = ((reg & MXC_CCM_CS1CDR_ESAI_CLK_PODF_MASK)
3441 >> MXC_CCM_CS1CDR_ESAI_CLK_PODF_OFFSET) + 1;
3443 return clk_get_rate(clk->parent) / (pred * podf);
3446 static int _clk_esai_set_rate(struct clk *clk, unsigned long rate)
3448 u32 reg, div, pre, post;
3449 u32 parent_rate = clk_get_rate(clk->parent);
3451 div = parent_rate / rate;
3454 if (((parent_rate / div) != rate) || div > 64)
3457 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3459 reg = __raw_readl(MXC_CCM_CS1CDR);
3460 reg &= ~(MXC_CCM_CS1CDR_ESAI_CLK_PRED_MASK|
3461 MXC_CCM_CS1CDR_ESAI_CLK_PODF_MASK);
3462 reg |= (post - 1) << MXC_CCM_CS1CDR_ESAI_CLK_PODF_OFFSET;
3463 reg |= (pre - 1) << MXC_CCM_CS1CDR_ESAI_CLK_PRED_OFFSET;
3465 __raw_writel(reg, MXC_CCM_CS1CDR);
3470 static struct clk esai_clk = {
3471 __INIT_CLK_DEBUG(esai_clk)
3473 .parent = &pll3_sw_clk,
3474 .secondary = &spba_clk,
3475 .enable_reg = MXC_CCM_CCGR1,
3476 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
3477 .enable = _clk_enable,
3478 .disable = _clk_disable,
3479 .set_rate = _clk_esai_set_rate,
3480 .get_rate = _clk_esai_get_rate,
3481 .set_parent = _clk_esai_set_parent,
3482 .round_rate = _clk_esai_round_rate,
3485 static int _clk_enet_enable(struct clk *clk)
3489 /* Enable ENET ref clock */
3490 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
3491 reg &= ~ANADIG_PLL_BYPASS;
3492 reg |= ANADIG_PLL_ENABLE;
3493 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
3499 static void _clk_enet_disable(struct clk *clk)
3505 /* Enable ENET ref clock */
3506 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
3507 reg |= ANADIG_PLL_BYPASS;
3508 reg &= ~ANADIG_PLL_ENABLE;
3509 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
3512 static int _clk_enet_set_rate(struct clk *clk, unsigned long rate)
3514 unsigned int reg, div = 1;
3532 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
3533 reg &= ~ANADIG_PLL_ENET_DIV_SELECT_MASK;
3534 reg |= (div << ANADIG_PLL_ENET_DIV_SELECT_OFFSET);
3535 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
3540 static unsigned long _clk_enet_get_rate(struct clk *clk)
3544 div = (__raw_readl(PLL8_ENET_BASE_ADDR))
3545 & ANADIG_PLL_ENET_DIV_SELECT_MASK;
3562 return 500000000 / div;
3565 static struct clk enet_clk[] = {
3567 __INIT_CLK_DEBUG(enet_clk)
3569 .parent = &pll8_enet_main_clk,
3570 .enable_reg = MXC_CCM_CCGR1,
3571 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
3572 .enable = _clk_enet_enable,
3573 .disable = _clk_enet_disable,
3574 .set_rate = _clk_enet_set_rate,
3575 .get_rate = _clk_enet_get_rate,
3576 .secondary = &enet_clk[1],
3577 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3580 .parent = &mmdc_ch0_axi_clk[0],
3581 .secondary = &mx6per1_clk,
3585 static struct clk ecspi_clk[] = {
3587 __INIT_CLK_DEBUG(ecspi0_clk)
3589 .parent = &pll3_60M,
3590 .secondary = &spba_clk,
3591 .enable_reg = MXC_CCM_CCGR1,
3592 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
3593 .enable = _clk_enable,
3594 .disable = _clk_disable,
3597 __INIT_CLK_DEBUG(ecspi1_clk)
3599 .parent = &pll3_60M,
3600 .secondary = &spba_clk,
3601 .enable_reg = MXC_CCM_CCGR1,
3602 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
3603 .enable = _clk_enable,
3604 .disable = _clk_disable,
3607 __INIT_CLK_DEBUG(ecspi2_clk)
3609 .parent = &pll3_60M,
3610 .secondary = &spba_clk,
3611 .enable_reg = MXC_CCM_CCGR1,
3612 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
3613 .enable = _clk_enable,
3614 .disable = _clk_disable,
3617 __INIT_CLK_DEBUG(ecspi3_clk)
3619 .parent = &pll3_60M,
3620 .secondary = &spba_clk,
3621 .enable_reg = MXC_CCM_CCGR1,
3622 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
3623 .enable = _clk_enable,
3624 .disable = _clk_disable,
3627 __INIT_CLK_DEBUG(ecspi4_clk)
3629 .parent = &pll3_60M,
3630 .secondary = &spba_clk,
3631 .enable_reg = MXC_CCM_CCGR1,
3632 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
3633 .enable = _clk_enable,
3634 .disable = _clk_disable,
3638 static unsigned long _clk_emi_slow_round_rate(struct clk *clk,
3642 u32 parent_rate = clk_get_rate(clk->parent);
3644 div = parent_rate / rate;
3646 /* Make sure rate is not greater than the maximum value for the clock.
3647 * Also prevent a div of 0.
3655 return parent_rate / div;
3658 static int _clk_emi_slow_set_parent(struct clk *clk, struct clk *parent)
3661 u32 reg = __raw_readl(MXC_CCM_CSCMR1)
3662 & ~MXC_CCM_CSCMR1_ACLK_EMI_SLOW_MASK;
3664 mux = _get_mux6(parent, &axi_clk, &pll3_usb_otg_main_clk,
3665 &pll2_pfd_400M, &pll2_pfd_352M, NULL, NULL);
3666 reg |= (mux << MXC_CCM_CSCMR1_ACLK_EMI_SLOW_OFFSET);
3667 __raw_writel(reg, MXC_CCM_CSCMR1);
3672 static unsigned long _clk_emi_slow_get_rate(struct clk *clk)
3676 reg = __raw_readl(MXC_CCM_CSCMR1);
3677 div = ((reg & MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK) >>
3678 MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET) + 1;
3680 return clk_get_rate(clk->parent) / div;
3683 static int _clk_emi_slow_set_rate(struct clk *clk, unsigned long rate)
3686 u32 parent_rate = clk_get_rate(clk->parent);
3688 div = parent_rate / rate;
3691 if (((parent_rate / div) != rate) || (div > 8))
3694 reg = __raw_readl(MXC_CCM_CSCMR1);
3695 reg &= ~MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK;
3696 reg |= (div - 1) << MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET;
3697 __raw_writel(reg, MXC_CCM_CSCMR1);
3702 static struct clk emi_slow_clk = {
3703 __INIT_CLK_DEBUG(emi_slow_clk)
3706 .enable_reg = MXC_CCM_CCGR6,
3707 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
3708 .enable = _clk_enable,
3709 .disable = _clk_disable,
3710 .set_rate = _clk_emi_slow_set_rate,
3711 .get_rate = _clk_emi_slow_get_rate,
3712 .round_rate = _clk_emi_slow_round_rate,
3713 .set_parent = _clk_emi_slow_set_parent,
3716 static unsigned long _clk_emi_round_rate(struct clk *clk,
3720 u32 parent_rate = clk_get_rate(clk->parent);
3722 div = parent_rate / rate;
3724 /* Make sure rate is not greater than the maximum value for the clock.
3725 * Also prevent a div of 0.
3733 return parent_rate / div;
3736 static int _clk_emi_set_parent(struct clk *clk, struct clk *parent)
3739 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_ACLK_EMI_MASK;
3741 mux = _get_mux6(parent, &axi_clk, &pll3_usb_otg_main_clk,
3742 &pll2_pfd_400M, &pll2_pfd_352M, NULL, NULL);
3743 reg |= (mux << MXC_CCM_CSCMR1_ACLK_EMI_OFFSET);
3744 __raw_writel(reg, MXC_CCM_CSCMR1);
3749 static unsigned long _clk_emi_get_rate(struct clk *clk)
3753 reg = __raw_readl(MXC_CCM_CSCMR1);
3754 div = ((reg & MXC_CCM_CSCMR1_ACLK_EMI_PODF_MASK) >>
3755 MXC_CCM_CSCMR1_ACLK_EMI_PODF_OFFSET) + 1;
3757 return clk_get_rate(clk->parent) / div;
3760 static int _clk_emi_set_rate(struct clk *clk, unsigned long rate)
3763 u32 parent_rate = clk_get_rate(clk->parent);
3765 div = parent_rate / rate;
3768 if (((parent_rate / div) != rate) || (div > 8))
3771 reg = __raw_readl(MXC_CCM_CSCMR1);
3772 reg &= ~MXC_CCM_CSCMR1_ACLK_EMI_PODF_MASK;
3773 reg |= (div - 1) << MXC_CCM_CSCMR1_ACLK_EMI_PODF_OFFSET;
3774 __raw_writel(reg, MXC_CCM_CSCMR1);
3779 static struct clk emi_clk = {
3780 __INIT_CLK_DEBUG(emi_clk)
3783 .set_rate = _clk_emi_set_rate,
3784 .get_rate = _clk_emi_get_rate,
3785 .round_rate = _clk_emi_round_rate,
3786 .set_parent = _clk_emi_set_parent,
3789 static unsigned long _clk_enfc_round_rate(struct clk *clk,
3793 u32 parent_rate = clk_get_rate(clk->parent);
3794 u32 div = parent_rate / rate;
3796 if (parent_rate % rate)
3799 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
3801 return parent_rate / (pre * post);
3804 static int _clk_enfc_set_parent(struct clk *clk, struct clk *parent)
3808 reg = __raw_readl(MXC_CCM_CS2CDR)
3809 & ~MXC_CCM_CS2CDR_ENFC_CLK_SEL_MASK;
3811 mux = _get_mux6(parent, &pll2_pfd_352M,
3812 &pll2_528_bus_main_clk, &pll3_usb_otg_main_clk,
3813 &pll2_pfd_400M, NULL, NULL);
3814 reg |= mux << MXC_CCM_CS2CDR_ENFC_CLK_SEL_OFFSET;
3816 __raw_writel(reg, MXC_CCM_CS2CDR);
3821 static unsigned long _clk_enfc_get_rate(struct clk *clk)
3823 u32 reg, pred, podf;
3825 reg = __raw_readl(MXC_CCM_CS2CDR);
3827 pred = ((reg & MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK)
3828 >> MXC_CCM_CS2CDR_ENFC_CLK_PRED_OFFSET) + 1;
3829 podf = ((reg & MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK)
3830 >> MXC_CCM_CS2CDR_ENFC_CLK_PODF_OFFSET) + 1;
3832 return clk_get_rate(clk->parent) / (pred * podf);
3835 static int _clk_enfc_set_rate(struct clk *clk, unsigned long rate)
3837 u32 reg, div, pre, post;
3838 u32 parent_rate = clk_get_rate(clk->parent);
3840 div = parent_rate / rate;
3843 if (((parent_rate / div) != rate) || div > 512)
3846 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
3848 reg = __raw_readl(MXC_CCM_CS2CDR);
3849 reg &= ~(MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK|
3850 MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK);
3851 reg |= (post - 1) << MXC_CCM_CS2CDR_ENFC_CLK_PODF_OFFSET;
3852 reg |= (pre - 1) << MXC_CCM_CS2CDR_ENFC_CLK_PRED_OFFSET;
3854 __raw_writel(reg, MXC_CCM_CS2CDR);
3859 static struct clk enfc_clk = {
3860 __INIT_CLK_DEBUG(enfc_clk)
3862 .parent = &pll2_pfd_352M,
3863 .enable_reg = MXC_CCM_CCGR2,
3864 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
3865 .enable = _clk_enable,
3866 .disable = _clk_disable,
3867 .set_rate = _clk_enfc_set_rate,
3868 .get_rate = _clk_enfc_get_rate,
3869 .round_rate = _clk_enfc_round_rate,
3870 .set_parent = _clk_enfc_set_parent,
3873 static unsigned long _clk_uart_round_rate(struct clk *clk,
3877 u32 parent_rate = clk_get_rate(clk->parent);
3879 div = parent_rate / rate;
3881 /* Make sure rate is not greater than the maximum value for the clock.
3882 * Also prevent a div of 0.
3890 return parent_rate / div;
3893 static int _clk_uart_set_rate(struct clk *clk, unsigned long rate)
3896 u32 parent_rate = clk_get_rate(clk->parent);
3898 div = parent_rate / rate;
3901 if (((parent_rate / div) != rate) || (div > 64))
3904 reg = __raw_readl(MXC_CCM_CSCDR1) & MXC_CCM_CSCDR1_UART_CLK_PODF_MASK;
3905 reg |= ((div - 1) << MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET);
3907 __raw_writel(reg, MXC_CCM_CSCDR1);
3912 static unsigned long _clk_uart_get_rate(struct clk *clk)
3917 reg = __raw_readl(MXC_CCM_CSCDR1) & MXC_CCM_CSCDR1_UART_CLK_PODF_MASK;
3918 div = (reg >> MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET) + 1;
3919 val = clk_get_rate(clk->parent) / div;
3924 static struct clk uart_clk[] = {
3926 __INIT_CLK_DEBUG(uart_clk)
3928 .parent = &pll3_80M,
3929 .enable_reg = MXC_CCM_CCGR5,
3930 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
3931 .enable = _clk_enable,
3932 .disable = _clk_disable,
3933 .secondary = &uart_clk[1],
3934 .set_rate = _clk_uart_set_rate,
3935 .get_rate = _clk_uart_get_rate,
3936 .round_rate = _clk_uart_round_rate,
3939 __INIT_CLK_DEBUG(uart_serial_clk)
3941 .enable_reg = MXC_CCM_CCGR5,
3942 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
3943 .enable = _clk_enable,
3944 .disable = _clk_disable,
3948 static unsigned long _clk_hsi_tx_round_rate(struct clk *clk,
3952 u32 parent_rate = clk_get_rate(clk->parent);
3954 div = parent_rate / rate;
3956 /* Make sure rate is not greater than the maximum value for the clock.
3957 * Also prevent a div of 0.
3965 return parent_rate / div;
3968 static int _clk_hsi_tx_set_parent(struct clk *clk, struct clk *parent)
3970 u32 reg = __raw_readl(MXC_CCM_CDCDR) & ~MXC_CCM_CDCDR_HSI_TX_CLK_SEL;
3972 if (parent == &pll2_pfd_400M)
3973 reg |= (MXC_CCM_CDCDR_HSI_TX_CLK_SEL);
3975 __raw_writel(reg, MXC_CCM_CDCDR);
3980 static unsigned long _clk_hsi_tx_get_rate(struct clk *clk)
3984 reg = __raw_readl(MXC_CCM_CDCDR);
3985 div = ((reg & MXC_CCM_CDCDR_HSI_TX_PODF_MASK) >>
3986 MXC_CCM_CDCDR_HSI_TX_PODF_OFFSET) + 1;
3988 return clk_get_rate(clk->parent) / div;
3991 static int _clk_hsi_tx_set_rate(struct clk *clk, unsigned long rate)
3994 u32 parent_rate = clk_get_rate(clk->parent);
3996 div = parent_rate / rate;
3999 if (((parent_rate / div) != rate) || (div > 8))
4002 reg = __raw_readl(MXC_CCM_CDCDR);
4003 reg &= ~MXC_CCM_CDCDR_HSI_TX_PODF_MASK;
4004 reg |= (div - 1) << MXC_CCM_CDCDR_HSI_TX_PODF_OFFSET;
4005 __raw_writel(reg, MXC_CCM_CDCDR);
4010 static struct clk hsi_tx_clk[] = {
4012 __INIT_CLK_DEBUG(hsi_tx_clk)
4014 .parent = &pll2_pfd_400M,
4015 .enable_reg = MXC_CCM_CCGR3,
4016 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
4017 .enable = _clk_enable,
4018 .disable = _clk_disable,
4019 .set_parent = _clk_hsi_tx_set_parent,
4020 .round_rate = _clk_hsi_tx_round_rate,
4021 .set_rate = _clk_hsi_tx_set_rate,
4022 .get_rate = _clk_hsi_tx_get_rate,
4023 .secondary = &hsi_tx_clk[1],
4024 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4027 .parent = &mx6per1_clk,
4028 .secondary = &mx6per2_clk,
4032 static struct clk mipi_pllref_clk = {
4033 __INIT_CLK_DEBUG(mipi_pllref_clk)
4035 .parent = &pll3_pfd_540M,
4036 .enable_reg = MXC_CCM_CCGR3,
4037 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
4038 .enable = _clk_enable,
4039 .disable = _clk_disable,
4042 static struct clk hdmi_clk[] = {
4044 __INIT_CLK_DEBUG(hdmi_isfr_clk)
4046 .parent = &pll3_pfd_540M,
4047 .enable_reg = MXC_CCM_CCGR2,
4048 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
4049 .enable = _clk_enable,
4050 .disable = _clk_disable,
4051 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4054 __INIT_CLK_DEBUG(hdmi_iahb_clk)
4057 .enable_reg = MXC_CCM_CCGR2,
4058 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4059 .enable = _clk_enable,
4060 .disable = _clk_disable,
4064 static struct clk caam_clk[] = {
4066 __INIT_CLK_DEBUG(caam_mem_clk)
4068 .enable_reg = MXC_CCM_CCGR0,
4069 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
4070 .enable = _clk_enable,
4071 .disable = _clk_disable,
4072 .secondary = &caam_clk[1],
4073 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4076 __INIT_CLK_DEBUG(caam_aclk_clk)
4078 .enable_reg = MXC_CCM_CCGR0,
4079 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
4080 .enable = _clk_enable,
4081 .disable = _clk_disable,
4082 .secondary = &caam_clk[2],
4085 __INIT_CLK_DEBUG(caam_ipg_clk)
4087 .enable_reg = MXC_CCM_CCGR0,
4088 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
4089 .enable = _clk_enable,
4090 .disable = _clk_disable,
4091 .parent = &mmdc_ch0_axi_clk[0],
4092 .secondary = &mx6per1_clk,
4096 static int _clk_asrc_serial_set_parent(struct clk *clk, struct clk *parent)
4100 reg = __raw_readl(MXC_CCM_CDCDR) & ~MXC_CCM_CDCDR_SPDIF1_CLK_SEL_MASK;
4102 mux = _get_mux6(parent, &pll4_audio_main_clk, &pll3_pfd_508M,
4103 &pll3_pfd_454M, &pll3_sw_clk, NULL, NULL);
4104 reg |= mux << MXC_CCM_CDCDR_SPDIF1_CLK_SEL_OFFSET;
4106 __raw_writel(reg, MXC_CCM_CDCDR);
4111 static unsigned long _clk_asrc_serial_get_rate(struct clk *clk)
4113 u32 reg, pred, podf;
4115 reg = __raw_readl(MXC_CCM_CDCDR);
4117 pred = ((reg & MXC_CCM_CDCDR_SPDIF1_CLK_PRED_MASK)
4118 >> MXC_CCM_CDCDR_SPDIF1_CLK_PRED_OFFSET) + 1;
4119 podf = ((reg & MXC_CCM_CDCDR_SPDIF1_CLK_PODF_MASK)
4120 >> MXC_CCM_CDCDR_SPDIF1_CLK_PODF_OFFSET) + 1;
4122 return clk_get_rate(clk->parent) / (pred * podf);
4125 static int _clk_asrc_serial_set_rate(struct clk *clk, unsigned long rate)
4127 u32 reg, div, pre, post;
4128 u32 parent_rate = clk_get_rate(clk->parent);
4130 div = parent_rate / rate;
4133 if (((parent_rate / div) != rate) || div > 64)
4136 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
4138 reg = __raw_readl(MXC_CCM_CDCDR);
4139 reg &= ~(MXC_CCM_CDCDR_SPDIF1_CLK_PRED_MASK|
4140 MXC_CCM_CDCDR_SPDIF1_CLK_PODF_MASK);
4141 reg |= (post - 1) << MXC_CCM_CDCDR_SPDIF1_CLK_PODF_OFFSET;
4142 reg |= (pre - 1) << MXC_CCM_CDCDR_SPDIF1_CLK_PRED_OFFSET;
4144 __raw_writel(reg, MXC_CCM_CDCDR);
4149 static unsigned long _clk_asrc_serial_round_rate(struct clk *clk,
4153 u32 parent_rate = clk_get_rate(clk->parent);
4154 u32 div = parent_rate / rate;
4156 if (parent_rate % rate)
4159 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
4161 return parent_rate / (pre * post);
4164 static struct clk asrc_clk[] = {
4166 __INIT_CLK_DEBUG(asrc_clk)
4168 .parent = &pll4_audio_main_clk,
4169 .enable_reg = MXC_CCM_CCGR0,
4170 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
4171 .enable = _clk_enable,
4172 .disable = _clk_disable,
4173 .secondary = &spba_clk,
4176 /*In the MX6 spec, asrc_serial_clk is listed as SPDIF1 clk
4177 * This clock can never be gated and does not have any
4178 * CCGR bits associated with it.
4180 __INIT_CLK_DEBUG(asrc_serial_clk)
4182 .parent = &pll3_sw_clk,
4183 .set_rate = _clk_asrc_serial_set_rate,
4184 .get_rate = _clk_asrc_serial_get_rate,
4185 .set_parent = _clk_asrc_serial_set_parent,
4186 .round_rate = _clk_asrc_serial_round_rate,
4190 static struct clk apbh_dma_clk = {
4191 __INIT_CLK_DEBUG(apbh_dma_clk)
4192 .parent = &usdhc3_clk,
4193 .secondary = &mx6per1_clk,
4194 .enable = _clk_enable,
4195 .disable = _clk_disable_inwait,
4196 .enable_reg = MXC_CCM_CCGR0,
4197 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
4200 static struct clk aips_tz2_clk = {
4201 __INIT_CLK_DEBUG(aips_tz2_clk)
4203 .enable_reg = MXC_CCM_CCGR0,
4204 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
4205 .enable = _clk_enable,
4206 .disable = _clk_disable_inwait,
4209 static struct clk aips_tz1_clk = {
4210 __INIT_CLK_DEBUG(aips_tz1_clk)
4212 .enable_reg = MXC_CCM_CCGR0,
4213 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4214 .enable = _clk_enable,
4215 .disable = _clk_disable_inwait,
4219 static struct clk openvg_axi_clk = {
4220 __INIT_CLK_DEBUG(openvg_axi_clk)
4221 .parent = &gpu2d_axi_clk,
4222 .enable = _clk_enable,
4223 .enable_reg = MXC_CCM_CCGR3,
4224 .enable_shift = MXC_CCM_CCGRx_CG15_OFFSET,
4225 .disable = _clk_disable,
4226 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4229 static unsigned long _clk_gpu3d_core_round_rate(struct clk *clk,
4233 u32 parent_rate = clk_get_rate(clk->parent);
4235 div = parent_rate / rate;
4237 /* Make sure rate is not greater than the maximum value for the clock.
4238 * Also prevent a div of 0.
4246 return parent_rate / div;
4249 static int _clk_gpu3d_core_set_parent(struct clk *clk, struct clk *parent)
4252 u32 reg = __raw_readl(MXC_CCM_CBCMR)
4253 & ~MXC_CCM_CBCMR_GPU3D_CORE_CLK_SEL_MASK;
4255 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
4256 &pll3_usb_otg_main_clk,
4257 &pll2_pfd_594M, &pll2_pfd_400M, NULL, NULL);
4258 reg |= (mux << MXC_CCM_CBCMR_GPU3D_CORE_CLK_SEL_OFFSET);
4259 __raw_writel(reg, MXC_CCM_CBCMR);
4264 static unsigned long _clk_gpu3d_core_get_rate(struct clk *clk)
4268 reg = __raw_readl(MXC_CCM_CBCMR);
4269 div = ((reg & MXC_CCM_CBCMR_GPU3D_CORE_PODF_MASK) >>
4270 MXC_CCM_CBCMR_GPU3D_CORE_PODF_OFFSET) + 1;
4272 return clk_get_rate(clk->parent) / div;
4275 static int _clk_gpu3d_core_set_rate(struct clk *clk, unsigned long rate)
4278 u32 parent_rate = clk_get_rate(clk->parent);
4280 div = parent_rate / rate;
4286 reg = __raw_readl(MXC_CCM_CBCMR);
4287 reg &= ~MXC_CCM_CBCMR_GPU3D_CORE_PODF_MASK;
4288 reg |= (div - 1) << MXC_CCM_CBCMR_GPU3D_CORE_PODF_OFFSET;
4289 __raw_writel(reg, MXC_CCM_CBCMR);
4294 static struct clk gpu3d_core_clk[] = {
4296 __INIT_CLK_DEBUG(gpu3d_core_clk)
4297 .parent = &pll2_pfd_594M,
4298 .enable = _clk_enable,
4299 .enable_reg = MXC_CCM_CCGR1,
4300 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
4301 .disable = _clk_disable,
4302 .set_parent = _clk_gpu3d_core_set_parent,
4303 .set_rate = _clk_gpu3d_core_set_rate,
4304 .get_rate = _clk_gpu3d_core_get_rate,
4305 .round_rate = _clk_gpu3d_core_round_rate,
4306 .secondary = &gpu3d_core_clk[1],
4307 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4310 .parent = &gpu3d_axi_clk,
4311 .secondary = &mx6fast1_clk,
4315 static unsigned long _clk_gpu2d_core_round_rate(struct clk *clk,
4319 u32 parent_rate = clk_get_rate(clk->parent);
4321 div = parent_rate / rate;
4323 /* Make sure rate is not greater than the maximum value for the clock.
4324 * Also prevent a div of 0.
4332 return parent_rate / div;
4335 static int _clk_gpu2d_core_set_parent(struct clk *clk, struct clk *parent)
4338 u32 reg = __raw_readl(MXC_CCM_CBCMR) &
4339 ~MXC_CCM_CBCMR_GPU2D_CLK_SEL_MASK;
4341 mux = _get_mux6(parent, &axi_clk, &pll3_usb_otg_main_clk,
4342 &pll2_pfd_352M, &pll2_pfd_400M, NULL, NULL);
4343 reg |= (mux << MXC_CCM_CBCMR_GPU2D_CLK_SEL_OFFSET);
4344 __raw_writel(reg, MXC_CCM_CBCMR);
4349 static unsigned long _clk_gpu2d_core_get_rate(struct clk *clk)
4353 reg = __raw_readl(MXC_CCM_CBCMR);
4354 div = ((reg & MXC_CCM_CBCMR_GPU2D_CORE_PODF_MASK) >>
4355 MXC_CCM_CBCMR_GPU2D_CORE_PODF_OFFSET) + 1;
4357 return clk_get_rate(clk->parent) / div;
4360 static int _clk_gpu2d_core_set_rate(struct clk *clk, unsigned long rate)
4363 u32 parent_rate = clk_get_rate(clk->parent);
4365 div = parent_rate / rate;
4368 if (((parent_rate / div) != rate) || (div > 8))
4371 reg = __raw_readl(MXC_CCM_CBCMR);
4372 reg &= ~MXC_CCM_CBCMR_GPU2D_CORE_PODF_MASK;
4373 reg |= (div - 1) << MXC_CCM_CBCMR_GPU2D_CORE_PODF_OFFSET;
4374 __raw_writel(reg, MXC_CCM_CBCMR);
4378 static struct clk gpu2d_core_clk[] = {
4380 __INIT_CLK_DEBUG(gpu2d_core_clk)
4381 .parent = &pll2_pfd_352M,
4382 .enable = _clk_enable,
4383 .enable_reg = MXC_CCM_CCGR1,
4384 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
4385 .disable = _clk_disable,
4386 .set_parent = _clk_gpu2d_core_set_parent,
4387 .set_rate = _clk_gpu2d_core_set_rate,
4388 .get_rate = _clk_gpu2d_core_get_rate,
4389 .round_rate = _clk_gpu2d_core_round_rate,
4390 .secondary = &gpu2d_core_clk[1],
4391 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4394 .parent = &gpu2d_axi_clk,
4395 .secondary = &mx6fast1_clk,
4399 static unsigned long _clk_gpu3d_shader_round_rate(struct clk *clk,
4403 u32 parent_rate = clk_get_rate(clk->parent);
4405 div = parent_rate / rate;
4407 /* Make sure rate is not greater than the maximum value for the clock.
4408 * Also prevent a div of 0.
4416 return parent_rate / div;
4419 static int _clk_gpu3d_shader_set_parent(struct clk *clk, struct clk *parent)
4422 u32 reg = __raw_readl(MXC_CCM_CBCMR)
4423 & ~MXC_CCM_CBCMR_GPU3D_SHADER_CLK_SEL_MASK;
4425 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
4426 &pll3_usb_otg_main_clk,
4427 &pll2_pfd_594M, &pll3_pfd_720M, NULL, NULL);
4428 reg |= (mux << MXC_CCM_CBCMR_GPU3D_SHADER_CLK_SEL_OFFSET);
4429 __raw_writel(reg, MXC_CCM_CBCMR);
4434 static unsigned long _clk_gpu3d_shader_get_rate(struct clk *clk)
4438 reg = __raw_readl(MXC_CCM_CBCMR);
4439 div = ((reg & MXC_CCM_CBCMR_GPU3D_SHADER_PODF_MASK) >>
4440 MXC_CCM_CBCMR_GPU3D_SHADER_PODF_OFFSET) + 1;
4442 return clk_get_rate(clk->parent) / div;
4445 static int _clk_gpu3d_shader_set_rate(struct clk *clk, unsigned long rate)
4448 u32 parent_rate = clk_get_rate(clk->parent);
4450 div = parent_rate / rate;
4456 reg = __raw_readl(MXC_CCM_CBCMR);
4457 reg &= ~MXC_CCM_CBCMR_GPU3D_SHADER_PODF_MASK;
4458 reg |= (div - 1) << MXC_CCM_CBCMR_GPU3D_SHADER_PODF_OFFSET;
4459 __raw_writel(reg, MXC_CCM_CBCMR);
4465 static struct clk gpu3d_shader_clk = {
4466 __INIT_CLK_DEBUG(gpu3d_shader_clk)
4467 .parent = &pll3_pfd_720M,
4468 .secondary = &mmdc_ch0_axi_clk[0],
4469 .enable = _clk_enable,
4470 .enable_reg = MXC_CCM_CCGR1,
4471 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
4472 .disable = _clk_disable,
4473 .set_parent = _clk_gpu3d_shader_set_parent,
4474 .set_rate = _clk_gpu3d_shader_set_rate,
4475 .get_rate = _clk_gpu3d_shader_get_rate,
4476 .round_rate = _clk_gpu3d_shader_round_rate,
4477 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4480 /* set the parent by the ipcg table */
4481 static struct clk gpmi_nand_clk[] = {
4483 __INIT_CLK_DEBUG(gpmi_io_clk)
4484 .parent = &enfc_clk,
4485 .secondary = &gpmi_nand_clk[1],
4486 .enable = _clk_enable,
4487 .enable_reg = MXC_CCM_CCGR4,
4488 .enable_shift = MXC_CCM_CCGRx_CG14_OFFSET,
4489 .disable = _clk_disable,
4491 { /* gpmi_apb_clk */
4492 __INIT_CLK_DEBUG(gpmi_apb_clk)
4493 .parent = &usdhc3_clk,
4494 .secondary = &gpmi_nand_clk[2],
4495 .enable = _clk_enable,
4496 .enable_reg = MXC_CCM_CCGR4,
4497 .enable_shift = MXC_CCM_CCGRx_CG15_OFFSET,
4498 .disable = _clk_disable,
4501 __INIT_CLK_DEBUG(gpmi_bch_clk)
4502 .parent = &usdhc4_clk,
4503 .secondary = &gpmi_nand_clk[3],
4504 .enable = _clk_enable,
4505 .enable_reg = MXC_CCM_CCGR4,
4506 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
4507 .disable = _clk_disable,
4510 __INIT_CLK_DEBUG(gpmi_bch_apb_clk)
4511 .parent = &usdhc3_clk,
4512 .secondary = &gpmi_nand_clk[4],
4513 .enable = _clk_enable,
4514 .enable_reg = MXC_CCM_CCGR4,
4515 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
4516 .disable = _clk_disable,
4518 { /* bch relative clk */
4519 __INIT_CLK_DEBUG(pl301_mx6qperl_bch)
4520 .parent = &mx6per1_clk,
4521 .secondary = &mmdc_ch0_axi_clk[0],
4525 static struct clk pwm_clk[] = {
4527 __INIT_CLK_DEBUG(pwm_clk_0)
4528 .parent = &ipg_perclk,
4530 .enable_reg = MXC_CCM_CCGR4,
4531 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
4532 .enable = _clk_enable,
4533 .disable = _clk_disable,
4536 __INIT_CLK_DEBUG(pwm_clk_1)
4537 .parent = &ipg_perclk,
4539 .enable_reg = MXC_CCM_CCGR4,
4540 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
4541 .enable = _clk_enable,
4542 .disable = _clk_disable,
4545 __INIT_CLK_DEBUG(pwm_clk_2)
4546 .parent = &ipg_perclk,
4548 .enable_reg = MXC_CCM_CCGR4,
4549 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
4550 .enable = _clk_enable,
4551 .disable = _clk_disable,
4554 __INIT_CLK_DEBUG(pwm_clk_3)
4555 .parent = &ipg_perclk,
4557 .enable_reg = MXC_CCM_CCGR4,
4558 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
4559 .enable = _clk_enable,
4560 .disable = _clk_disable,
4564 static int _clk_pcie_enable(struct clk *clk)
4568 /* Enable SATA ref clock */
4569 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4570 reg |= ANADIG_PLL_ENET_EN_PCIE;
4571 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4578 static void _clk_pcie_disable(struct clk *clk)
4584 /* Disable SATA ref clock */
4585 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4586 reg &= ~ANADIG_PLL_ENET_EN_PCIE;
4587 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4590 static struct clk pcie_clk[] = {
4592 __INIT_CLK_DEBUG(pcie_clk)
4593 .parent = &pcie_axi_clk,
4594 .enable = _clk_pcie_enable,
4595 .disable = _clk_pcie_disable,
4596 .enable_reg = MXC_CCM_CCGR4,
4597 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4598 .secondary = &pcie_clk[1],
4599 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4602 .parent = &mmdc_ch0_axi_clk[0],
4603 .secondary = &mx6fast1_clk,
4607 static int _clk_sata_enable(struct clk *clk)
4611 /* Clear Power Down and Enable PLLs */
4612 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4613 reg &= ~ANADIG_PLL_ENET_POWER_DOWN;
4614 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4616 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4617 reg |= ANADIG_PLL_ENET_EN;
4618 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4620 /* Waiting for the PLL is locked */
4621 if (!WAIT(ANADIG_PLL_ENET_LOCK & __raw_readl(PLL8_ENET_BASE_ADDR),
4623 panic("pll8 lock failed\n");
4625 /* Disable the bypass */
4626 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4627 reg &= ~ANADIG_PLL_ENET_BYPASS;
4628 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4630 /* Enable SATA ref clock */
4631 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4632 reg |= ANADIG_PLL_ENET_EN_SATA;
4633 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4640 static void _clk_sata_disable(struct clk *clk)
4646 /* Disable SATA ref clock */
4647 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4648 reg &= ~ANADIG_PLL_ENET_EN_SATA;
4649 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4652 static struct clk sata_clk[] = {
4654 __INIT_CLK_DEBUG(sata_clk)
4656 .enable = _clk_sata_enable,
4657 .enable_reg = MXC_CCM_CCGR5,
4658 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
4659 .disable = _clk_sata_disable,
4660 .secondary = &sata_clk[1],
4661 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4664 .parent = &mmdc_ch0_axi_clk[0],
4665 .secondary = &mx6per1_clk,
4669 static struct clk usboh3_clk[] = {
4671 __INIT_CLK_DEBUG(usboh3_clk)
4673 .enable = _clk_enable,
4674 .enable_reg = MXC_CCM_CCGR6,
4675 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4676 .disable = _clk_disable,
4677 .secondary = &usboh3_clk[1],
4678 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4681 .parent = &mmdc_ch0_axi_clk[0],
4682 .secondary = &mx6per1_clk,
4686 static struct clk mlb150_clk = {
4687 __INIT_CLK_DEBUG(mlb150_clk)
4690 .enable_reg = MXC_CCM_CCGR3,
4691 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
4692 .enable = _clk_enable,
4693 .disable = _clk_disable,
4696 static int _clk_enable1(struct clk *clk)
4699 reg = __raw_readl(clk->enable_reg);
4700 reg |= 1 << clk->enable_shift;
4701 __raw_writel(reg, clk->enable_reg);
4706 static void _clk_disable1(struct clk *clk)
4709 reg = __raw_readl(clk->enable_reg);
4710 reg &= ~(1 << clk->enable_shift);
4711 __raw_writel(reg, clk->enable_reg);
4714 static int _clk_clko_set_parent(struct clk *clk, struct clk *parent)
4718 if (parent == &pll3_usb_otg_main_clk)
4720 else if (parent == &pll2_528_bus_main_clk)
4722 else if (parent == &pll1_sys_main_clk)
4724 else if (parent == &pll5_video_main_clk)
4726 else if (parent == &axi_clk)
4728 else if (parent == &enfc_clk)
4730 else if (parent == &ipu1_di_clk[0])
4732 else if (parent == &ipu1_di_clk[1])
4734 else if (parent == &ipu2_di_clk[0])
4736 else if (parent == &ipu2_di_clk[1])
4738 else if (parent == &ahb_clk)
4740 else if (parent == &ipg_clk)
4742 else if (parent == &ipg_perclk)
4744 else if (parent == &ckil_clk)
4746 else if (parent == &pll4_audio_main_clk)
4751 reg = __raw_readl(MXC_CCM_CCOSR);
4752 reg &= ~MXC_CCM_CCOSR_CKOL_SEL_MASK;
4753 reg |= sel << MXC_CCM_CCOSR_CKOL_SEL_OFFSET;
4754 __raw_writel(reg, MXC_CCM_CCOSR);
4758 static unsigned long _clk_clko_get_rate(struct clk *clk)
4760 u32 reg = __raw_readl(MXC_CCM_CCOSR);
4761 u32 div = ((reg & MXC_CCM_CCOSR_CKOL_DIV_MASK) >>
4762 MXC_CCM_CCOSR_CKOL_DIV_OFFSET) + 1;
4763 return clk_get_rate(clk->parent) / div;
4766 static int _clk_clko_set_rate(struct clk *clk, unsigned long rate)
4769 u32 parent_rate = clk_get_rate(clk->parent);
4770 u32 div = parent_rate / rate;
4774 if (((parent_rate / div) != rate) || (div > 8))
4777 reg = __raw_readl(MXC_CCM_CCOSR);
4778 reg &= ~MXC_CCM_CCOSR_CKOL_DIV_MASK;
4779 reg |= (div - 1) << MXC_CCM_CCOSR_CKOL_DIV_OFFSET;
4780 __raw_writel(reg, MXC_CCM_CCOSR);
4784 static unsigned long _clk_clko_round_rate(struct clk *clk,
4787 u32 parent_rate = clk_get_rate(clk->parent);
4788 u32 div = parent_rate / rate;
4790 /* Make sure rate is not greater than the maximum value for the clock.
4791 * Also prevent a div of 0.
4797 return parent_rate / div;
4800 static int _clk_clko2_set_parent(struct clk *clk, struct clk *parent)
4804 if (parent == &mmdc_ch0_axi_clk[0])
4806 else if (parent == &mmdc_ch1_axi_clk[0])
4808 else if (parent == &usdhc4_clk)
4810 else if (parent == &usdhc1_clk)
4812 else if (parent == &gpu2d_axi_clk)
4814 else if (parent == &ecspi_clk[0])
4816 else if (parent == &gpu3d_axi_clk)
4818 else if (parent == &usdhc3_clk)
4820 else if (parent == &pcie_clk[0])
4822 else if (parent == &ipu1_clk)
4824 else if (parent == &ipu2_clk)
4826 else if (parent == &vdo_axi_clk)
4828 else if (parent == &osc_clk)
4830 else if (parent == &gpu2d_core_clk[0])
4832 else if (parent == &gpu3d_core_clk[0])
4834 else if (parent == &usdhc2_clk)
4836 else if (parent == &ssi1_clk)
4838 else if (parent == &ssi2_clk)
4840 else if (parent == &ssi3_clk)
4842 else if (parent == &gpu3d_shader_clk)
4844 else if (parent == &can_clk_root)
4846 else if (parent == &ldb_di0_clk)
4848 else if (parent == &ldb_di1_clk)
4850 else if (parent == &esai_clk)
4852 else if (parent == &uart_clk[0])
4854 else if (parent == &spdif0_clk[0])
4856 else if (parent == &hsi_tx_clk[0])
4861 reg = __raw_readl(MXC_CCM_CCOSR);
4862 reg &= ~MXC_CCM_CCOSR_CKO2_SEL_MASK;
4863 reg |= sel << MXC_CCM_CCOSR_CKO2_SEL_OFFSET;
4864 __raw_writel(reg, MXC_CCM_CCOSR);
4868 static unsigned long _clk_clko2_get_rate(struct clk *clk)
4870 u32 reg = __raw_readl(MXC_CCM_CCOSR);
4871 u32 div = ((reg & MXC_CCM_CCOSR_CKO2_DIV_MASK) >>
4872 MXC_CCM_CCOSR_CKO2_DIV_OFFSET) + 1;
4873 return clk_get_rate(clk->parent) / div;
4876 static int _clk_clko2_set_rate(struct clk *clk, unsigned long rate)
4879 u32 parent_rate = clk_get_rate(clk->parent);
4880 u32 div = parent_rate / rate;
4884 if (((parent_rate / div) != rate) || (div > 8))
4887 reg = __raw_readl(MXC_CCM_CCOSR);
4888 reg &= ~MXC_CCM_CCOSR_CKO2_DIV_MASK;
4889 reg |= (div - 1) << MXC_CCM_CCOSR_CKO2_DIV_OFFSET;
4890 __raw_writel(reg, MXC_CCM_CCOSR);
4894 static struct clk clko_clk = {
4895 __INIT_CLK_DEBUG(clko_clk)
4896 .parent = &pll2_528_bus_main_clk,
4897 .enable = _clk_enable1,
4898 .enable_reg = MXC_CCM_CCOSR,
4899 .enable_shift = MXC_CCM_CCOSR_CKOL_EN_OFFSET,
4900 .disable = _clk_disable1,
4901 .set_parent = _clk_clko_set_parent,
4902 .set_rate = _clk_clko_set_rate,
4903 .get_rate = _clk_clko_get_rate,
4904 .round_rate = _clk_clko_round_rate,
4907 static struct clk clko2_clk = {
4908 __INIT_CLK_DEBUG(clko2_clk)
4909 .parent = &usdhc4_clk,
4910 .enable = _clk_enable1,
4911 .enable_reg = MXC_CCM_CCOSR,
4912 .enable_shift = MXC_CCM_CCOSR_CKO2_EN_OFFSET,
4913 .disable = _clk_disable1,
4914 .set_parent = _clk_clko2_set_parent,
4915 .set_rate = _clk_clko2_set_rate,
4916 .get_rate = _clk_clko2_get_rate,
4917 .round_rate = _clk_clko_round_rate,
4920 static struct clk perfmon0_clk = {
4921 __INIT_CLK_DEBUG(perfmon0_clk)
4922 .parent = &mmdc_ch0_axi_clk[0],
4923 .enable = _clk_enable1,
4924 .enable_reg = MXC_CCM_CCGR4,
4925 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
4926 .disable = _clk_disable1,
4929 static struct clk perfmon1_clk = {
4930 __INIT_CLK_DEBUG(perfmon1_clk)
4931 .parent = &ipu1_clk,
4932 .enable = _clk_enable1,
4933 .enable_reg = MXC_CCM_CCGR4,
4934 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
4935 .disable = _clk_disable1,
4938 static struct clk perfmon2_clk = {
4939 __INIT_CLK_DEBUG(perfmon2_clk)
4940 .parent = &mmdc_ch0_axi_clk[0],
4941 .enable = _clk_enable1,
4942 .enable_reg = MXC_CCM_CCGR4,
4943 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
4944 .disable = _clk_disable1,
4947 static struct clk dummy_clk = {
4951 #define _REGISTER_CLOCK(d, n, c) \
4959 static struct clk_lookup lookups[] = {
4960 _REGISTER_CLOCK(NULL, "osc", osc_clk),
4961 _REGISTER_CLOCK(NULL, "ckih", ckih_clk),
4962 _REGISTER_CLOCK(NULL, "ckih2", ckih2_clk),
4963 _REGISTER_CLOCK(NULL, "ckil", ckil_clk),
4964 _REGISTER_CLOCK(NULL, "pll1_main_clk", pll1_sys_main_clk),
4965 _REGISTER_CLOCK(NULL, "pll1_sw_clk", pll1_sw_clk),
4966 _REGISTER_CLOCK(NULL, "pll2", pll2_528_bus_main_clk),
4967 _REGISTER_CLOCK(NULL, "pll2_pfd_400M", pll2_pfd_400M),
4968 _REGISTER_CLOCK(NULL, "pll2_pfd_352M", pll2_pfd_352M),
4969 _REGISTER_CLOCK(NULL, "pll2_pfd_594M", pll2_pfd_594M),
4970 _REGISTER_CLOCK(NULL, "pll2_200M", pll2_200M),
4971 _REGISTER_CLOCK(NULL, "pll3_main_clk", pll3_usb_otg_main_clk),
4972 _REGISTER_CLOCK(NULL, "pll3_pfd_508M", pll3_pfd_508M),
4973 _REGISTER_CLOCK(NULL, "pll3_pfd_454M", pll3_pfd_454M),
4974 _REGISTER_CLOCK(NULL, "pll3_pfd_720M", pll3_pfd_720M),
4975 _REGISTER_CLOCK(NULL, "pll3_pfd_540M", pll3_pfd_540M),
4976 _REGISTER_CLOCK(NULL, "pll3_sw_clk", pll3_sw_clk),
4977 _REGISTER_CLOCK(NULL, "pll3_120M", pll3_120M),
4978 _REGISTER_CLOCK(NULL, "pll3_120M", pll3_80M),
4979 _REGISTER_CLOCK(NULL, "pll3_120M", pll3_60M),
4980 _REGISTER_CLOCK(NULL, "pll4", pll4_audio_main_clk),
4981 _REGISTER_CLOCK(NULL, "pll5", pll5_video_main_clk),
4982 _REGISTER_CLOCK(NULL, "pll6", pll6_mlb150_main_clk),
4983 _REGISTER_CLOCK(NULL, "pll3", pll7_usb_host_main_clk),
4984 _REGISTER_CLOCK(NULL, "pll4", pll8_enet_main_clk),
4985 _REGISTER_CLOCK(NULL, "cpu_clk", cpu_clk),
4986 _REGISTER_CLOCK(NULL, "periph_clk", periph_clk),
4987 _REGISTER_CLOCK(NULL, "axi_clk", axi_clk),
4988 _REGISTER_CLOCK(NULL, "mmdc_ch0_axi", mmdc_ch0_axi_clk[0]),
4989 _REGISTER_CLOCK(NULL, "mmdc_ch1_axi", mmdc_ch1_axi_clk[0]),
4990 _REGISTER_CLOCK(NULL, "ahb", ahb_clk),
4991 _REGISTER_CLOCK(NULL, "ipg_clk", ipg_clk),
4992 _REGISTER_CLOCK(NULL, "ipg_perclk", ipg_perclk),
4993 _REGISTER_CLOCK(NULL, "spba", spba_clk),
4994 _REGISTER_CLOCK("imx-sdma", NULL, sdma_clk[0]),
4995 _REGISTER_CLOCK(NULL, "gpu2d_axi_clk", gpu2d_axi_clk),
4996 _REGISTER_CLOCK(NULL, "gpu3d_axi_clk", gpu3d_axi_clk),
4997 _REGISTER_CLOCK(NULL, "pcie_axi_clk", pcie_axi_clk),
4998 _REGISTER_CLOCK(NULL, "vdo_axi_clk", vdo_axi_clk),
4999 _REGISTER_CLOCK(NULL, "iim_clk", iim_clk),
5000 _REGISTER_CLOCK(NULL, "i2c_clk", i2c_clk[0]),
5001 _REGISTER_CLOCK("imx-i2c.1", NULL, i2c_clk[1]),
5002 _REGISTER_CLOCK("imx-i2c.2", NULL, i2c_clk[2]),
5003 _REGISTER_CLOCK(NULL, "vpu_clk", vpu_clk[0]),
5004 _REGISTER_CLOCK(NULL, "ipu1_clk", ipu1_clk),
5005 _REGISTER_CLOCK(NULL, "ipu2_clk", ipu2_clk),
5006 _REGISTER_CLOCK(NULL, "cko1_clk0", cko1_clk0),
5007 _REGISTER_CLOCK("sdhci-esdhc-imx.0", NULL, usdhc1_clk),
5008 _REGISTER_CLOCK("sdhci-esdhc-imx.1", NULL, usdhc2_clk),
5009 _REGISTER_CLOCK("sdhci-esdhc-imx.2", NULL, usdhc3_clk),
5010 _REGISTER_CLOCK("sdhci-esdhc-imx.3", NULL, usdhc4_clk),
5011 _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk),
5012 _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk),
5013 _REGISTER_CLOCK("imx-ssi.2", NULL, ssi3_clk),
5014 _REGISTER_CLOCK(NULL, "ipu1_di0_clk", ipu1_di_clk[0]),
5015 _REGISTER_CLOCK(NULL, "ipu1_di1_clk", ipu1_di_clk[1]),
5016 _REGISTER_CLOCK(NULL, "ipu2_di0_clk", ipu2_di_clk[0]),
5017 _REGISTER_CLOCK(NULL, "ipu2_di1_clk", ipu2_di_clk[1]),
5018 _REGISTER_CLOCK(NULL, "can_root_clk", can_clk_root),
5019 _REGISTER_CLOCK("imx6q-flexcan.0", NULL, can1_clk[0]),
5020 _REGISTER_CLOCK("imx6q-flexcan.1", NULL, can2_clk[0]),
5021 _REGISTER_CLOCK(NULL, "ldb_di0_clk", ldb_di0_clk),
5022 _REGISTER_CLOCK(NULL, "ldb_di1_clk", ldb_di1_clk),
5023 _REGISTER_CLOCK("mxc_spdif.0", NULL, spdif0_clk[0]),
5024 _REGISTER_CLOCK(NULL, "esai_clk", esai_clk),
5025 _REGISTER_CLOCK("imx6q-ecspi.0", NULL, ecspi_clk[0]),
5026 _REGISTER_CLOCK("imx6q-ecspi.1", NULL, ecspi_clk[1]),
5027 _REGISTER_CLOCK("imx6q-ecspi.2", NULL, ecspi_clk[2]),
5028 _REGISTER_CLOCK("imx6q-ecspi.3", NULL, ecspi_clk[3]),
5029 _REGISTER_CLOCK("imx6q-ecspi.4", NULL, ecspi_clk[4]),
5030 _REGISTER_CLOCK(NULL, "emi_slow_clk", emi_slow_clk),
5031 _REGISTER_CLOCK(NULL, "emi_clk", emi_clk),
5032 _REGISTER_CLOCK(NULL, "enfc_clk", enfc_clk),
5033 _REGISTER_CLOCK("imx-uart.0", NULL, uart_clk[0]),
5034 _REGISTER_CLOCK("imx-uart.1", NULL, uart_clk[0]),
5035 _REGISTER_CLOCK("imx-uart.2", NULL, uart_clk[0]),
5036 _REGISTER_CLOCK("imx-uart.3", NULL, uart_clk[0]),
5037 _REGISTER_CLOCK(NULL, "hsi_tx", hsi_tx_clk[0]),
5038 _REGISTER_CLOCK(NULL, "caam_clk", caam_clk[0]),
5039 _REGISTER_CLOCK(NULL, "asrc_clk", asrc_clk[0]),
5040 _REGISTER_CLOCK(NULL, "asrc_serial_clk", asrc_clk[1]),
5041 _REGISTER_CLOCK("mxs-dma-apbh", NULL, apbh_dma_clk),
5042 _REGISTER_CLOCK(NULL, "openvg_axi_clk", openvg_axi_clk),
5043 _REGISTER_CLOCK(NULL, "gpu3d_clk", gpu3d_core_clk[0]),
5044 _REGISTER_CLOCK(NULL, "gpu2d_clk", gpu2d_core_clk[0]),
5045 _REGISTER_CLOCK(NULL, "gpu3d_shader_clk", gpu3d_shader_clk),
5046 _REGISTER_CLOCK(NULL, "gpt", gpt_clk[0]),
5047 _REGISTER_CLOCK("imx6q-gpmi-nand.0", NULL, gpmi_nand_clk[0]),
5048 _REGISTER_CLOCK(NULL, "gpmi-apb", gpmi_nand_clk[1]),
5049 _REGISTER_CLOCK(NULL, "bch", gpmi_nand_clk[2]),
5050 _REGISTER_CLOCK(NULL, "bch-apb", gpmi_nand_clk[3]),
5051 _REGISTER_CLOCK(NULL, "pl301_mx6qperl-bch", gpmi_nand_clk[4]),
5052 _REGISTER_CLOCK("mxc_pwm.0", NULL, pwm_clk[0]),
5053 _REGISTER_CLOCK("mxc_pwm.1", NULL, pwm_clk[1]),
5054 _REGISTER_CLOCK("mxc_pwm.2", NULL, pwm_clk[2]),
5055 _REGISTER_CLOCK("mxc_pwm.3", NULL, pwm_clk[3]),
5056 _REGISTER_CLOCK(NULL, "pcie_clk", pcie_clk[0]),
5057 _REGISTER_CLOCK("fec.0", NULL, enet_clk[0]),
5058 _REGISTER_CLOCK(NULL, "imx_sata_clk", sata_clk[0]),
5059 _REGISTER_CLOCK(NULL, "usboh3_clk", usboh3_clk[0]),
5060 _REGISTER_CLOCK(NULL, "usb_phy1_clk", usb_phy1_clk),
5061 _REGISTER_CLOCK(NULL, "usb_phy3_clk", usb_phy3_clk),
5062 _REGISTER_CLOCK(NULL, "usb_phy4_clk", usb_phy4_clk),
5063 _REGISTER_CLOCK("imx2-wdt.0", NULL, dummy_clk),
5064 _REGISTER_CLOCK("imx2-wdt.1", NULL, dummy_clk),
5065 _REGISTER_CLOCK(NULL, "hdmi_isfr_clk", hdmi_clk[0]),
5066 _REGISTER_CLOCK(NULL, "hdmi_iahb_clk", hdmi_clk[1]),
5067 _REGISTER_CLOCK(NULL, "mipi_pllref_clk", mipi_pllref_clk),
5068 _REGISTER_CLOCK(NULL, NULL, vdoa_clk),
5069 _REGISTER_CLOCK(NULL, NULL, aips_tz2_clk),
5070 _REGISTER_CLOCK(NULL, NULL, aips_tz1_clk),
5071 _REGISTER_CLOCK(NULL, "clko_clk", clko_clk),
5072 _REGISTER_CLOCK(NULL, "clko2_clk", clko2_clk),
5073 _REGISTER_CLOCK("mxs-perfmon.0", "perfmon", perfmon0_clk),
5074 _REGISTER_CLOCK("mxs-perfmon.1", "perfmon", perfmon1_clk),
5075 _REGISTER_CLOCK("mxs-perfmon.2", "perfmon", perfmon2_clk),
5076 _REGISTER_CLOCK(NULL, "mlb150_clk", mlb150_clk),
5079 static void clk_tree_init(void)
5084 reg = __raw_readl(MMDC_MDMISC_OFFSET);
5085 if ((reg & MMDC_MDMISC_DDR_TYPE_MASK) ==
5086 (0x1 << MMDC_MDMISC_DDR_TYPE_OFFSET)) {
5087 clk_set_parent(&periph_clk, &pll2_pfd_400M);
5088 printk(KERN_INFO "Set periph_clk's parent to pll2_pfd_400M!\n");
5093 int __init mx6_clocks_init(unsigned long ckil, unsigned long osc,
5094 unsigned long ckih1, unsigned long ckih2)
5099 external_low_reference = ckil;
5100 external_high_reference = ckih1;
5101 ckih2_reference = ckih2;
5102 oscillator_reference = osc;
5104 apll_base = ioremap(ANATOP_BASE_ADDR, SZ_4K);
5106 for (i = 0; i < ARRAY_SIZE(lookups); i++) {
5107 clkdev_add(&lookups[i]);
5108 clk_debug_register(lookups[i].clk);
5111 /* Disable un-necessary PFDs & PLLs */
5113 /* keep correct count. */
5114 clk_enable(&cpu_clk);
5115 clk_enable(&periph_clk);
5119 if (pll2_pfd_400M.usecount == 0 && cpu_is_mx6q())
5120 pll2_pfd_400M.disable(&pll2_pfd_400M);
5121 pll2_pfd_352M.disable(&pll2_pfd_352M);
5122 pll2_pfd_594M.disable(&pll2_pfd_594M);
5124 #if !defined(CONFIG_FEC_1588)
5125 pll3_pfd_454M.disable(&pll3_pfd_454M);
5126 pll3_pfd_508M.disable(&pll3_pfd_508M);
5127 pll3_pfd_540M.disable(&pll3_pfd_540M);
5128 pll3_pfd_720M.disable(&pll3_pfd_720M);
5130 pll3_usb_otg_main_clk.disable(&pll3_usb_otg_main_clk);
5132 pll4_audio_main_clk.disable(&pll4_audio_main_clk);
5133 pll5_video_main_clk.disable(&pll5_video_main_clk);
5134 pll6_mlb150_main_clk.disable(&pll6_mlb150_main_clk);
5135 pll7_usb_host_main_clk.disable(&pll7_usb_host_main_clk);
5136 pll8_enet_main_clk.disable(&pll8_enet_main_clk);
5138 sata_clk[0].disable(&sata_clk[0]);
5139 pcie_clk[0].disable(&pcie_clk[0]);
5141 /* Initialize Audio and Video PLLs to valid frequency (650MHz). */
5142 clk_set_rate(&pll4_audio_main_clk, 650000000);
5143 clk_set_rate(&pll5_video_main_clk, 650000000);
5145 clk_set_parent(&ipu1_di_clk[0], &pll5_video_main_clk);
5146 clk_set_parent(&ipu1_di_clk[1], &pll5_video_main_clk);
5147 clk_set_parent(&ipu2_di_clk[0], &pll5_video_main_clk);
5148 clk_set_parent(&ipu2_di_clk[1], &pll5_video_main_clk);
5150 clk_set_parent(&cko1_clk0, &ipg_clk);
5151 clk_set_rate(&cko1_clk0, 22000000);
5152 clk_enable(&cko1_clk0);
5154 clk_set_parent(&emi_clk, &pll2_pfd_400M);
5155 clk_set_rate(&emi_clk, 200000000);
5157 clk_set_parent(&gpu3d_shader_clk, &pll2_pfd_594M);
5158 clk_set_rate(&gpu3d_shader_clk, 594000000);
5159 clk_set_parent(&gpu3d_core_clk[0], &mmdc_ch0_axi_clk[0]);
5160 clk_set_rate(&gpu3d_core_clk[0], 528000000);
5162 /* PCLK camera - J5 */
5163 clk_set_parent(&clko2_clk, &osc_clk);
5164 clk_set_rate(&clko2_clk, 2400000);
5167 * FIXME: asrc needs to use asrc_serial(spdif1) clock to do sample
5168 * rate convertion and this clock frequency can not be too high, set
5169 * it to the minimum value 7.5Mhz to make asrc work properly.
5171 clk_set_parent(&asrc_clk[1], &pll3_sw_clk);
5172 clk_set_rate(&asrc_clk[1], 7500000);
5174 /* set the GPMI clock to default frequency : 20MHz */
5175 clk_set_rate(&enfc_clk, enfc_clk.round_rate(&enfc_clk, 20000000));
5178 cpu_op_tbl = get_cpu_op(&cpu_op_nr);
5180 /* Gate off all possible clocks */
5181 if (mxc_jtag_enabled) {
5182 __raw_writel(3 << MXC_CCM_CCGRx_CG11_OFFSET |
5183 3 << MXC_CCM_CCGRx_CG2_OFFSET |
5184 3 << MXC_CCM_CCGRx_CG1_OFFSET |
5185 3 << MXC_CCM_CCGRx_CG0_OFFSET, MXC_CCM_CCGR0);
5187 __raw_writel(1 << MXC_CCM_CCGRx_CG11_OFFSET |
5188 3 << MXC_CCM_CCGRx_CG2_OFFSET |
5189 3 << MXC_CCM_CCGRx_CG1_OFFSET |
5190 3 << MXC_CCM_CCGRx_CG0_OFFSET, MXC_CCM_CCGR0);
5192 __raw_writel(3 << MXC_CCM_CCGRx_CG10_OFFSET, MXC_CCM_CCGR1);
5193 __raw_writel(1 << MXC_CCM_CCGRx_CG12_OFFSET |
5194 1 << MXC_CCM_CCGRx_CG11_OFFSET |
5195 3 << MXC_CCM_CCGRx_CG10_OFFSET |
5196 3 << MXC_CCM_CCGRx_CG9_OFFSET |
5197 3 << MXC_CCM_CCGRx_CG8_OFFSET, MXC_CCM_CCGR2);
5198 __raw_writel(1 << MXC_CCM_CCGRx_CG14_OFFSET |
5199 3 << MXC_CCM_CCGRx_CG13_OFFSET |
5200 3 << MXC_CCM_CCGRx_CG12_OFFSET |
5201 3 << MXC_CCM_CCGRx_CG11_OFFSET |
5202 3 << MXC_CCM_CCGRx_CG10_OFFSET, MXC_CCM_CCGR3);
5203 __raw_writel(3 << MXC_CCM_CCGRx_CG7_OFFSET |
5204 1 << MXC_CCM_CCGRx_CG6_OFFSET |
5205 1 << MXC_CCM_CCGRx_CG4_OFFSET, MXC_CCM_CCGR4);
5206 __raw_writel(1 << MXC_CCM_CCGRx_CG0_OFFSET, MXC_CCM_CCGR5);
5208 __raw_writel(0, MXC_CCM_CCGR6);
5210 /* Lower the ipg_perclk frequency to 8.25MHz. */
5211 clk_set_rate(&ipg_perclk, 8250000);
5214 clk_set_parent(&spdif0_clk[0], &pll3_pfd_454M);
5216 if (mx6q_revision() == IMX_CHIP_REVISION_1_0) {
5217 gpt_clk[0].parent = &ipg_perclk;
5218 gpt_clk[0].get_rate = NULL;
5221 base = ioremap(GPT_BASE_ADDR, SZ_4K);
5222 mxc_timer_init(&gpt_clk[0], base, MXC_INT_GPT);