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 usdhc3_clk;
65 static struct cpu_op *cpu_op_tbl;
68 #define SPIN_DELAY 1200000 /* in nanoseconds */
70 #define AUDIO_VIDEO_MIN_CLK_FREQ 650000000
71 #define AUDIO_VIDEO_MAX_CLK_FREQ 1300000000
73 /* We need to check the exp status again after timer expiration,
74 * as there might be interrupt coming between the first time exp
75 * and the time reading, then the time reading may be several ms
76 * after the exp checking due to the irq handle, so we need to
77 * check it to make sure the exp return the right value after
78 * timer expiration. */
79 #define WAIT(exp, timeout) \
81 struct timespec nstimeofday; \
82 struct timespec curtime; \
84 getnstimeofday(&nstimeofday); \
86 getnstimeofday(&curtime); \
87 if ((curtime.tv_nsec - nstimeofday.tv_nsec) > (timeout)) { \
96 /* External clock values passed-in by the board code */
97 static unsigned long external_high_reference, external_low_reference;
98 static unsigned long oscillator_reference, ckih2_reference;
99 static unsigned long anaclk_1_reference, anaclk_2_reference;
101 /* For MX 6DL/S, Video PLL may be used by synchronous display devices,
102 * such as HDMI or LVDS, and also by the EPDC. If EPDC is in use,
103 * it must use the Video PLL to achieve the clock frequencies it needs.
104 * So if EPDC is in use, the "epdc" string should be added to kernel
105 * parameters, in order to set the EPDC parent clock to the Video PLL.
106 * This will have an impact on the behavior of HDMI and LVDS.
109 static int __init epdc_setup(char *__unused)
114 __setup("epdc", epdc_setup);
116 static void __calc_pre_post_dividers(u32 max_podf, u32 div, u32 *pre, u32 *post)
118 u32 min_pre, temp_pre, old_err, err;
120 /* Some of the podfs are 3 bits while others are 6 bits.
121 * Handle both cases here.
123 if (div >= 512 && (max_podf == 64)) {
124 /* For pre = 3bits and podf = 6 bits, max divider is 512. */
127 } else if (div >= 64 && (max_podf == 8)) {
128 /* For pre = 3bits and podf = 3 bits, max divider is 64. */
131 } else if (div >= 8) {
132 /* Find the minimum pre-divider for a max podf */
134 min_pre = (div - 1) / (1 << 6) + 1;
136 min_pre = (div - 1) / (1 << 3) + 1;
138 /* Now loop through to find the max pre-divider. */
139 for (temp_pre = 8; temp_pre >= min_pre; temp_pre--) {
140 err = div % temp_pre;
145 err = temp_pre - err;
151 *post = (div + *pre - 1) / *pre;
152 } else if (div < 8) {
158 static int _clk_enable(struct clk *clk)
161 reg = __raw_readl(clk->enable_reg);
162 reg |= MXC_CCM_CCGRx_CG_MASK << clk->enable_shift;
163 __raw_writel(reg, clk->enable_reg);
165 if (clk->flags & AHB_HIGH_SET_POINT)
167 else if (clk->flags & AHB_MED_SET_POINT)
173 static void _clk_disable(struct clk *clk)
176 reg = __raw_readl(clk->enable_reg);
177 reg &= ~(MXC_CCM_CCGRx_CG_MASK << clk->enable_shift);
178 __raw_writel(reg, clk->enable_reg);
180 if (clk->flags & AHB_HIGH_SET_POINT)
182 else if (clk->flags & AHB_MED_SET_POINT)
186 static void _clk_disable_inwait(struct clk *clk)
189 reg = __raw_readl(clk->enable_reg);
190 reg &= ~(MXC_CCM_CCGRx_CG_MASK << clk->enable_shift);
191 reg |= 1 << clk->enable_shift;
192 __raw_writel(reg, clk->enable_reg);
196 * For the 4-to-1 muxed input clock
198 static inline u32 _get_mux(struct clk *parent, struct clk *m0,
199 struct clk *m1, struct clk *m2, struct clk *m3)
203 else if (parent == m1)
205 else if (parent == m2)
207 else if (parent == m3)
215 static inline void __iomem *_get_pll_base(struct clk *pll)
217 if (pll == &pll1_sys_main_clk)
218 return PLL1_SYS_BASE_ADDR;
219 else if (pll == &pll2_528_bus_main_clk)
220 return PLL2_528_BASE_ADDR;
221 else if (pll == &pll3_usb_otg_main_clk)
222 return PLL3_480_USB1_BASE_ADDR;
223 else if (pll == &pll4_audio_main_clk)
224 return PLL4_AUDIO_BASE_ADDR;
225 else if (pll == &pll5_video_main_clk)
226 return PLL5_VIDEO_BASE_ADDR;
227 else if (pll == &pll6_mlb150_main_clk)
228 return PLL6_MLB_BASE_ADDR;
229 else if (pll == &pll7_usb_host_main_clk)
230 return PLL7_480_USB2_BASE_ADDR;
231 else if (pll == &pll8_enet_main_clk)
232 return PLL8_ENET_BASE_ADDR;
240 * For the 6-to-1 muxed input clock
242 static inline u32 _get_mux6(struct clk *parent, struct clk *m0, struct clk *m1,
243 struct clk *m2, struct clk *m3, struct clk *m4,
248 else if (parent == m1)
250 else if (parent == m2)
252 else if (parent == m3)
254 else if (parent == m4)
256 else if (parent == m5)
263 static unsigned long get_high_reference_clock_rate(struct clk *clk)
265 return external_high_reference;
268 static unsigned long get_low_reference_clock_rate(struct clk *clk)
270 return external_low_reference;
273 static unsigned long get_oscillator_reference_clock_rate(struct clk *clk)
275 return oscillator_reference;
278 static unsigned long get_ckih2_reference_clock_rate(struct clk *clk)
280 return ckih2_reference;
283 static unsigned long _clk_anaclk_1_get_rate(struct clk *clk)
285 return anaclk_1_reference;
288 static int _clk_anaclk_1_set_rate(struct clk *clk, unsigned long rate)
290 anaclk_1_reference = rate;
294 static unsigned long _clk_anaclk_2_get_rate(struct clk *clk)
296 return anaclk_2_reference;
299 static int _clk_anaclk_2_set_rate(struct clk *clk, unsigned long rate)
301 anaclk_2_reference = rate;
305 /* External high frequency clock */
306 static struct clk ckih_clk = {
307 __INIT_CLK_DEBUG(ckih_clk)
308 .get_rate = get_high_reference_clock_rate,
311 static struct clk ckih2_clk = {
312 __INIT_CLK_DEBUG(ckih2_clk)
313 .get_rate = get_ckih2_reference_clock_rate,
316 static struct clk osc_clk = {
317 __INIT_CLK_DEBUG(osc_clk)
318 .get_rate = get_oscillator_reference_clock_rate,
321 /* External low frequency (32kHz) clock */
322 static struct clk ckil_clk = {
323 __INIT_CLK_DEBUG(ckil_clk)
324 .get_rate = get_low_reference_clock_rate,
327 static struct clk anaclk_1 = {
328 __INIT_CLK_DEBUG(anaclk_1)
329 .get_rate = _clk_anaclk_1_get_rate,
330 .set_rate = _clk_anaclk_1_set_rate,
333 static struct clk anaclk_2 = {
334 __INIT_CLK_DEBUG(anaclk_2)
335 .get_rate = _clk_anaclk_2_get_rate,
336 .set_rate = _clk_anaclk_2_set_rate,
339 static unsigned long pfd_round_rate(struct clk *clk, unsigned long rate)
344 tmp = (u64)clk_get_rate(clk->parent) * 18;
348 frac = frac < 12 ? 12 : frac;
349 frac = frac > 35 ? 35 : frac;
350 tmp = (u64)clk_get_rate(clk->parent) * 18;
355 static unsigned long pfd_get_rate(struct clk *clk)
359 tmp = (u64)clk_get_rate(clk->parent) * 18;
361 if (apbh_dma_clk.usecount == 0)
362 apbh_dma_clk.enable(&apbh_dma_clk);
364 frac = (__raw_readl(clk->enable_reg) >> clk->enable_shift) &
365 ANADIG_PFD_FRAC_MASK;
372 static int pfd_set_rate(struct clk *clk, unsigned long rate)
376 tmp = (u64)clk_get_rate(clk->parent) * 18;
378 if (apbh_dma_clk.usecount == 0)
379 apbh_dma_clk.enable(&apbh_dma_clk);
381 /* Round up the divider so that we don't set a rate
382 * higher than what is requested. */
386 frac = frac < 12 ? 12 : frac;
387 frac = frac > 35 ? 35 : frac;
388 /* clear clk frac bits */
389 __raw_writel(ANADIG_PFD_FRAC_MASK << clk->enable_shift,
390 (int)clk->enable_reg + 8);
391 /* set clk frac bits */
392 __raw_writel(frac << clk->enable_shift,
393 (int)clk->enable_reg + 4);
395 if (apbh_dma_clk.usecount == 0)
396 apbh_dma_clk.disable(&apbh_dma_clk);
400 static int _clk_pfd_enable(struct clk *clk)
402 if (apbh_dma_clk.usecount == 0)
403 apbh_dma_clk.enable(&apbh_dma_clk);
405 /* clear clk gate bit */
406 __raw_writel((1 << (clk->enable_shift + 7)),
407 (int)clk->enable_reg + 8);
409 if (apbh_dma_clk.usecount == 0)
410 apbh_dma_clk.disable(&apbh_dma_clk);
415 static void _clk_pfd_disable(struct clk *clk)
417 if (apbh_dma_clk.usecount == 0)
418 apbh_dma_clk.enable(&apbh_dma_clk);
420 /* set clk gate bit */
421 __raw_writel((1 << (clk->enable_shift + 7)),
422 (int)clk->enable_reg + 4);
424 if (apbh_dma_clk.usecount == 0)
425 apbh_dma_clk.disable(&apbh_dma_clk);
428 static int _clk_pll_enable(struct clk *clk)
431 void __iomem *pllbase;
433 pllbase = _get_pll_base(clk);
435 reg = __raw_readl(pllbase);
436 reg &= ~ANADIG_PLL_BYPASS;
437 reg &= ~ANADIG_PLL_POWER_DOWN;
439 /* The 480MHz PLLs have the opposite definition for power bit. */
440 if (clk == &pll3_usb_otg_main_clk || clk == &pll7_usb_host_main_clk)
441 reg |= ANADIG_PLL_POWER_DOWN;
443 __raw_writel(reg, pllbase);
445 /* It will power on pll3 */
446 if (clk == &pll3_usb_otg_main_clk)
447 __raw_writel(BM_ANADIG_ANA_MISC2_CONTROL0, apll_base + HW_ANADIG_ANA_MISC2_CLR);
449 /* Wait for PLL to lock */
450 if (!WAIT(__raw_readl(pllbase) & ANADIG_PLL_LOCK,
452 panic("pll enable failed\n");
454 /* Enable the PLL output now*/
455 reg = __raw_readl(pllbase);
456 reg |= ANADIG_PLL_ENABLE;
457 __raw_writel(reg, pllbase);
462 static void _clk_pll_disable(struct clk *clk)
465 void __iomem *pllbase;
467 pllbase = _get_pll_base(clk);
469 reg = __raw_readl(pllbase);
470 reg |= ANADIG_PLL_BYPASS;
471 reg &= ~ANADIG_PLL_ENABLE;
473 __raw_writel(reg, pllbase);
476 * It will power off PLL3's power, it is the TO1.1 fix
477 * Please see TKT064178 for detail.
479 if (clk == &pll3_usb_otg_main_clk)
480 __raw_writel(BM_ANADIG_ANA_MISC2_CONTROL0, apll_base + HW_ANADIG_ANA_MISC2_SET);
483 static unsigned long _clk_pll1_main_get_rate(struct clk *clk)
488 div = __raw_readl(PLL1_SYS_BASE_ADDR) & ANADIG_PLL_SYS_DIV_SELECT_MASK;
489 val = (clk_get_rate(clk->parent) * div) / 2;
493 static int _clk_pll1_main_set_rate(struct clk *clk, unsigned long rate)
495 unsigned int reg, div;
497 if (rate < AUDIO_VIDEO_MIN_CLK_FREQ || rate > AUDIO_VIDEO_MAX_CLK_FREQ)
500 div = (rate * 2) / clk_get_rate(clk->parent) ;
502 reg = __raw_readl(PLL1_SYS_BASE_ADDR) & ~ANADIG_PLL_SYS_DIV_SELECT_MASK;
504 __raw_writel(reg, PLL1_SYS_BASE_ADDR);
509 static struct clk pll1_sys_main_clk = {
510 __INIT_CLK_DEBUG(pll1_sys_main_clk)
512 .get_rate = _clk_pll1_main_get_rate,
513 .set_rate = _clk_pll1_main_set_rate,
514 .enable = _clk_pll_enable,
515 .disable = _clk_pll_disable,
518 static int _clk_pll1_sw_set_parent(struct clk *clk, struct clk *parent)
522 reg = __raw_readl(MXC_CCM_CCSR);
524 if (parent == &pll1_sys_main_clk) {
525 reg &= ~MXC_CCM_CCSR_PLL1_SW_CLK_SEL;
526 __raw_writel(reg, MXC_CCM_CCSR);
527 /* Set the step_clk parent to be lp_apm, to save power. */
528 reg = __raw_readl(MXC_CCM_CCSR);
529 reg = (reg & ~MXC_CCM_CCSR_STEP_SEL);
531 /* Set STEP_CLK to be the parent*/
532 if (parent == &osc_clk) {
533 /* Set STEP_CLK to be sourced from LPAPM. */
534 reg = __raw_readl(MXC_CCM_CCSR);
535 reg = (reg & ~MXC_CCM_CCSR_STEP_SEL);
536 __raw_writel(reg, MXC_CCM_CCSR);
538 /* Set STEP_CLK to be sourced from PLL2-PDF (400MHz). */
539 reg = __raw_readl(MXC_CCM_CCSR);
540 reg |= MXC_CCM_CCSR_STEP_SEL;
541 __raw_writel(reg, MXC_CCM_CCSR);
544 reg = __raw_readl(MXC_CCM_CCSR);
545 reg |= MXC_CCM_CCSR_PLL1_SW_CLK_SEL;
547 __raw_writel(reg, MXC_CCM_CCSR);
551 static unsigned long _clk_pll1_sw_get_rate(struct clk *clk)
553 return clk_get_rate(clk->parent);
556 static struct clk pll1_sw_clk = {
557 __INIT_CLK_DEBUG(pll1_sw_clk)
558 .parent = &pll1_sys_main_clk,
559 .set_parent = _clk_pll1_sw_set_parent,
560 .get_rate = _clk_pll1_sw_get_rate,
563 static unsigned long _clk_pll2_main_get_rate(struct clk *clk)
568 div = __raw_readl(PLL2_528_BASE_ADDR) & ANADIG_PLL_528_DIV_SELECT;
571 val = clk_get_rate(clk->parent) * 22;
574 val = clk_get_rate(clk->parent) * 20;
579 static int _clk_pll2_main_set_rate(struct clk *clk, unsigned long rate)
581 unsigned int reg, div;
583 if (rate == 528000000)
585 else if (rate == 480000000)
590 reg = __raw_readl(PLL2_528_BASE_ADDR);
591 reg &= ~ANADIG_PLL_528_DIV_SELECT;
593 __raw_writel(reg, PLL2_528_BASE_ADDR);
598 static struct clk pll2_528_bus_main_clk = {
599 __INIT_CLK_DEBUG(pll2_528_bus_main_clk)
601 .get_rate = _clk_pll2_main_get_rate,
602 .set_rate = _clk_pll2_main_set_rate,
603 .enable = _clk_pll_enable,
604 .disable = _clk_pll_disable,
607 static struct clk pll2_pfd_400M = {
608 __INIT_CLK_DEBUG(pll2_pfd_400M)
609 .parent = &pll2_528_bus_main_clk,
610 .enable_reg = (void *)PFD_528_BASE_ADDR,
611 .enable_shift = ANADIG_PFD2_FRAC_OFFSET,
612 .enable = _clk_pfd_enable,
613 .disable = _clk_pfd_disable,
614 .get_rate = pfd_get_rate,
615 .set_rate = pfd_set_rate,
616 .get_rate = pfd_get_rate,
617 .round_rate = pfd_round_rate,
620 static struct clk pll2_pfd_352M = {
621 __INIT_CLK_DEBUG(pll2_pfd_352M)
622 .parent = &pll2_528_bus_main_clk,
623 .enable_reg = (void *)PFD_528_BASE_ADDR,
624 .enable_shift = ANADIG_PFD0_FRAC_OFFSET,
625 .enable = _clk_pfd_enable,
626 .disable = _clk_pfd_disable,
627 .set_rate = pfd_set_rate,
628 .get_rate = pfd_get_rate,
629 .round_rate = pfd_round_rate,
632 static struct clk pll2_pfd_594M = {
633 __INIT_CLK_DEBUG(pll2_pfd_594M)
634 .parent = &pll2_528_bus_main_clk,
635 .enable_reg = (void *)PFD_528_BASE_ADDR,
636 .enable_shift = ANADIG_PFD1_FRAC_OFFSET,
637 .enable = _clk_pfd_enable,
638 .disable = _clk_pfd_disable,
639 .set_rate = pfd_set_rate,
640 .get_rate = pfd_get_rate,
641 .round_rate = pfd_round_rate,
644 static unsigned long _clk_pll2_200M_get_rate(struct clk *clk)
646 return clk_get_rate(clk->parent) / 2;
649 static struct clk pll2_200M = {
650 __INIT_CLK_DEBUG(pll2_200M)
651 .parent = &pll2_pfd_400M,
652 .get_rate = _clk_pll2_200M_get_rate,
655 static unsigned long _clk_pll3_usb_otg_get_rate(struct clk *clk)
660 div = __raw_readl(PLL3_480_USB1_BASE_ADDR)
661 & ANADIG_PLL_480_DIV_SELECT_MASK;
664 val = clk_get_rate(clk->parent) * 22;
666 val = clk_get_rate(clk->parent) * 20;
670 static int _clk_pll3_usb_otg_set_rate(struct clk *clk, unsigned long rate)
672 unsigned int reg, div;
674 if (rate == 528000000)
676 else if (rate == 480000000)
681 reg = __raw_readl(PLL3_480_USB1_BASE_ADDR);
682 reg &= ~ANADIG_PLL_480_DIV_SELECT_MASK;
684 __raw_writel(reg, PLL3_480_USB1_BASE_ADDR);
690 /* same as pll3_main_clk. These two clocks should always be the same */
691 static struct clk pll3_usb_otg_main_clk = {
692 __INIT_CLK_DEBUG(pll3_usb_otg_main_clk)
694 .enable = _clk_pll_enable,
695 .disable = _clk_pll_disable,
696 .set_rate = _clk_pll3_usb_otg_set_rate,
697 .get_rate = _clk_pll3_usb_otg_get_rate,
701 static struct clk usb_phy1_clk = {
702 __INIT_CLK_DEBUG(usb_phy1_clk)
703 .parent = &pll3_usb_otg_main_clk,
704 .set_rate = _clk_pll3_usb_otg_set_rate,
705 .get_rate = _clk_pll3_usb_otg_get_rate,
708 /* For HSIC port 1 */
709 static struct clk usb_phy3_clk = {
710 __INIT_CLK_DEBUG(usb_phy3_clk)
711 .parent = &pll3_usb_otg_main_clk,
712 .set_rate = _clk_pll3_usb_otg_set_rate,
713 .get_rate = _clk_pll3_usb_otg_get_rate,
716 /* For HSIC port 2 */
717 static struct clk usb_phy4_clk = {
718 __INIT_CLK_DEBUG(usb_phy4_clk)
719 .parent = &pll3_usb_otg_main_clk,
720 .set_rate = _clk_pll3_usb_otg_set_rate,
721 .get_rate = _clk_pll3_usb_otg_get_rate,
724 static struct clk pll3_pfd_508M = {
725 __INIT_CLK_DEBUG(pll3_pfd_508M)
726 .parent = &pll3_usb_otg_main_clk,
727 .enable_reg = (void *)PFD_480_BASE_ADDR,
728 .enable_shift = ANADIG_PFD2_FRAC_OFFSET,
729 .enable = _clk_pfd_enable,
730 .disable = _clk_pfd_disable,
731 .set_rate = pfd_set_rate,
732 .get_rate = pfd_get_rate,
733 .round_rate = pfd_round_rate,
736 static struct clk pll3_pfd_454M = {
737 __INIT_CLK_DEBUG(pll3_pfd_454M)
738 .parent = &pll3_usb_otg_main_clk,
739 .enable_reg = (void *)PFD_480_BASE_ADDR,
740 .enable_shift = ANADIG_PFD3_FRAC_OFFSET,
741 .enable = _clk_pfd_enable,
742 .disable = _clk_pfd_disable,
743 .set_rate = pfd_set_rate,
744 .get_rate = pfd_get_rate,
745 .round_rate = pfd_round_rate,
748 static struct clk pll3_pfd_720M = {
749 __INIT_CLK_DEBUG(pll3_pfd_720M)
750 .parent = &pll3_usb_otg_main_clk,
751 .enable_reg = (void *)PFD_480_BASE_ADDR,
752 .enable_shift = ANADIG_PFD0_FRAC_OFFSET,
753 .enable = _clk_pfd_enable,
754 .disable = _clk_pfd_disable,
755 .set_rate = pfd_set_rate,
756 .get_rate = pfd_get_rate,
757 .round_rate = pfd_round_rate,
760 static struct clk pll3_pfd_540M = {
761 __INIT_CLK_DEBUG(pll3_pfd_540M)
762 .parent = &pll3_usb_otg_main_clk,
763 .enable_reg = (void *)PFD_480_BASE_ADDR,
764 .enable_shift = ANADIG_PFD1_FRAC_OFFSET,
765 .enable = _clk_pfd_enable,
766 .disable = _clk_pfd_disable,
767 .set_rate = pfd_set_rate,
768 .get_rate = pfd_get_rate,
769 .round_rate = pfd_round_rate,
770 .get_rate = pfd_get_rate,
773 static unsigned long _clk_pll3_sw_get_rate(struct clk *clk)
775 return clk_get_rate(clk->parent);
778 /* same as pll3_main_clk. These two clocks should always be the same */
779 static struct clk pll3_sw_clk = {
780 __INIT_CLK_DEBUG(pll3_sw_clk)
781 .parent = &pll3_usb_otg_main_clk,
782 .get_rate = _clk_pll3_sw_get_rate,
785 static unsigned long _clk_pll3_120M_get_rate(struct clk *clk)
787 return clk_get_rate(clk->parent) / 4;
790 static struct clk pll3_120M = {
791 __INIT_CLK_DEBUG(pll3_120M)
792 .parent = &pll3_sw_clk,
793 .get_rate = _clk_pll3_120M_get_rate,
796 static unsigned long _clk_pll3_80M_get_rate(struct clk *clk)
798 return clk_get_rate(clk->parent) / 6;
801 static struct clk pll3_80M = {
802 __INIT_CLK_DEBUG(pll3_80M)
803 .parent = &pll3_sw_clk,
804 .get_rate = _clk_pll3_80M_get_rate,
807 static unsigned long _clk_pll3_60M_get_rate(struct clk *clk)
809 return clk_get_rate(clk->parent) / 8;
812 static struct clk pll3_60M = {
813 __INIT_CLK_DEBUG(pll3_60M)
814 .parent = &pll3_sw_clk,
815 .get_rate = _clk_pll3_60M_get_rate,
818 static unsigned long _clk_audio_video_get_rate(struct clk *clk)
820 unsigned int div, mfn, mfd;
822 unsigned int parent_rate = clk_get_rate(clk->parent);
823 void __iomem *pllbase;
824 int rev = mx6q_revision();
825 unsigned int test_div_sel, control3, post_div = 1;
827 if (clk == &pll4_audio_main_clk)
828 pllbase = PLL4_AUDIO_BASE_ADDR;
830 pllbase = PLL5_VIDEO_BASE_ADDR;
832 if ((rev >= IMX_CHIP_REVISION_1_1) || cpu_is_mx6dl()) {
833 test_div_sel = (__raw_readl(pllbase)
834 & ANADIG_PLL_AV_TEST_DIV_SEL_MASK)
835 >> ANADIG_PLL_AV_TEST_DIV_SEL_OFFSET;
836 if (test_div_sel == 0)
838 else if (test_div_sel == 1)
841 if (clk == &pll5_video_main_clk) {
842 control3 = (__raw_readl(ANA_MISC2_BASE_ADDR)
843 & ANADIG_ANA_MISC2_CONTROL3_MASK)
844 >> ANADIG_ANA_MISC2_CONTROL3_OFFSET;
847 else if (control3 == 3)
852 div = __raw_readl(pllbase) & ANADIG_PLL_SYS_DIV_SELECT_MASK;
853 mfn = __raw_readl(pllbase + PLL_NUM_DIV_OFFSET);
854 mfd = __raw_readl(pllbase + PLL_DENOM_DIV_OFFSET);
856 rate = (parent_rate * div) + ((parent_rate / mfd) * mfn);
857 rate = rate / post_div;
862 static int _clk_audio_video_set_rate(struct clk *clk, unsigned long rate)
864 unsigned int reg, div;
865 unsigned int mfn, mfd = 1000000;
867 unsigned int parent_rate = clk_get_rate(clk->parent);
868 void __iomem *pllbase;
869 unsigned long min_clk_rate, pre_div_rate;
870 int rev = mx6q_revision();
871 u32 test_div_sel = 2;
874 if ((rev < IMX_CHIP_REVISION_1_1) && !cpu_is_mx6dl())
875 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ;
876 else if (clk == &pll4_audio_main_clk)
877 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ / 4;
879 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ / 16;
881 if ((rate < min_clk_rate) || (rate > AUDIO_VIDEO_MAX_CLK_FREQ))
884 if (clk == &pll4_audio_main_clk)
885 pllbase = PLL4_AUDIO_BASE_ADDR;
887 pllbase = PLL5_VIDEO_BASE_ADDR;
890 if ((rev >= IMX_CHIP_REVISION_1_1) || cpu_is_mx6dl()) {
891 while (pre_div_rate < AUDIO_VIDEO_MIN_CLK_FREQ) {
894 * test_div_sel field values:
899 * control3 field values:
904 if (test_div_sel != 0)
914 div = pre_div_rate / parent_rate;
915 temp64 = (u64) (pre_div_rate - (div * parent_rate));
917 do_div(temp64, parent_rate);
920 reg = __raw_readl(pllbase)
921 & ~ANADIG_PLL_SYS_DIV_SELECT_MASK
922 & ~ANADIG_PLL_AV_TEST_DIV_SEL_MASK;
924 (test_div_sel << ANADIG_PLL_AV_TEST_DIV_SEL_OFFSET);
925 __raw_writel(reg, pllbase);
926 __raw_writel(mfn, pllbase + PLL_NUM_DIV_OFFSET);
927 __raw_writel(mfd, pllbase + PLL_DENOM_DIV_OFFSET);
929 if (rev >= IMX_CHIP_REVISION_1_1) {
930 reg = __raw_readl(ANA_MISC2_BASE_ADDR)
931 & ~ANADIG_ANA_MISC2_CONTROL3_MASK;
932 reg |= control3 << ANADIG_ANA_MISC2_CONTROL3_OFFSET;
933 __raw_writel(reg, ANA_MISC2_BASE_ADDR);
939 static unsigned long _clk_audio_video_round_rate(struct clk *clk,
942 unsigned long min_clk_rate;
943 unsigned int div, post_div = 1;
944 unsigned int mfn, mfd = 1000000;
946 unsigned int parent_rate = clk_get_rate(clk->parent);
947 unsigned long pre_div_rate;
948 u32 test_div_sel = 2;
950 unsigned long final_rate;
951 int rev = mx6q_revision();
953 if ((rev < IMX_CHIP_REVISION_1_1) && !cpu_is_mx6dl())
954 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ;
955 else if (clk == &pll4_audio_main_clk)
956 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ / 4;
958 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ / 16;
960 if (rate < min_clk_rate)
963 if (rate > AUDIO_VIDEO_MAX_CLK_FREQ)
964 return AUDIO_VIDEO_MAX_CLK_FREQ;
967 if ((rev >= IMX_CHIP_REVISION_1_1) || cpu_is_mx6dl()) {
968 while (pre_div_rate < AUDIO_VIDEO_MIN_CLK_FREQ) {
971 if (test_div_sel != 0)
981 div = pre_div_rate / parent_rate;
982 temp64 = (u64) (pre_div_rate - (div * parent_rate));
984 do_div(temp64, parent_rate);
987 final_rate = (parent_rate * div) + ((parent_rate / mfd) * mfn);
988 final_rate = final_rate / post_div;
993 static int _clk_audio_video_set_parent(struct clk *clk, struct clk *parent)
997 void __iomem *pllbase;
999 if (clk == &pll4_audio_main_clk)
1000 pllbase = PLL4_AUDIO_BASE_ADDR;
1002 pllbase = PLL5_VIDEO_BASE_ADDR;
1004 reg = __raw_readl(pllbase) & ~ANADIG_PLL_BYPASS_CLK_SRC_MASK;
1005 mux = _get_mux6(parent, &osc_clk, &anaclk_1, &anaclk_2,
1007 reg |= mux << ANADIG_PLL_BYPASS_CLK_SRC_OFFSET;
1008 __raw_writel(reg, pllbase);
1010 /* Set anaclk_x as input */
1011 if (parent == &anaclk_1) {
1012 reg = __raw_readl(ANADIG_MISC1_REG);
1013 reg |= (ANATOP_LVDS_CLK1_IBEN_MASK &
1014 ~ANATOP_LVDS_CLK1_OBEN_MASK);
1015 __raw_writel(reg, ANADIG_MISC1_REG);
1016 } else if (parent == &anaclk_2) {
1017 reg = __raw_readl(ANADIG_MISC1_REG);
1018 reg |= (ANATOP_LVDS_CLK2_IBEN_MASK &
1019 ~ANATOP_LVDS_CLK2_OBEN_MASK);
1020 __raw_writel(reg, ANADIG_MISC1_REG);
1026 static struct clk pll4_audio_main_clk = {
1027 __INIT_CLK_DEBUG(pll4_audio_main_clk)
1029 .enable = _clk_pll_enable,
1030 .disable = _clk_pll_disable,
1031 .set_rate = _clk_audio_video_set_rate,
1032 .get_rate = _clk_audio_video_get_rate,
1033 .round_rate = _clk_audio_video_round_rate,
1034 .set_parent = _clk_audio_video_set_parent,
1037 static struct clk pll5_video_main_clk = {
1038 __INIT_CLK_DEBUG(pll5_video_main_clk)
1040 .enable = _clk_pll_enable,
1041 .disable = _clk_pll_disable,
1042 .set_rate = _clk_audio_video_set_rate,
1043 .get_rate = _clk_audio_video_get_rate,
1044 .round_rate = _clk_audio_video_round_rate,
1045 .set_parent = _clk_audio_video_set_parent,
1048 static int _clk_pll_mlb_main_enable(struct clk *clk)
1051 void __iomem *pllbase;
1053 pllbase = _get_pll_base(clk);
1055 reg = __raw_readl(pllbase);
1056 reg &= ~ANADIG_PLL_BYPASS;
1059 __raw_writel(reg, pllbase);
1061 /* Wait for PLL to lock */
1062 if (!WAIT(__raw_readl(pllbase) & ANADIG_PLL_LOCK,
1064 panic("pll enable failed\n");
1069 static struct clk pll6_mlb150_main_clk = {
1070 __INIT_CLK_DEBUG(pll6_mlb150_main_clk)
1072 .enable = _clk_pll_mlb_main_enable,
1073 .disable = _clk_pll_disable,
1076 static unsigned long _clk_pll7_usb_otg_get_rate(struct clk *clk)
1081 div = __raw_readl(PLL7_480_USB2_BASE_ADDR)
1082 & ANADIG_PLL_480_DIV_SELECT_MASK;
1085 val = clk_get_rate(clk->parent) * 22;
1087 val = clk_get_rate(clk->parent) * 20;
1091 static int _clk_pll7_usb_otg_set_rate(struct clk *clk, unsigned long rate)
1093 unsigned int reg, div;
1095 if (rate == 528000000)
1097 else if (rate == 480000000)
1102 reg = __raw_readl(PLL7_480_USB2_BASE_ADDR);
1103 reg &= ~ANADIG_PLL_480_DIV_SELECT_MASK;
1105 __raw_writel(reg, PLL7_480_USB2_BASE_ADDR);
1110 static struct clk pll7_usb_host_main_clk = {
1111 __INIT_CLK_DEBUG(pll7_usb_host_main_clk)
1113 .enable = _clk_pll_enable,
1114 .disable = _clk_pll_disable,
1115 .set_rate = _clk_pll7_usb_otg_set_rate,
1116 .get_rate = _clk_pll7_usb_otg_get_rate,
1120 static struct clk pll8_enet_main_clk = {
1121 __INIT_CLK_DEBUG(pll8_enet_main_clk)
1123 .enable = _clk_pll_enable,
1124 .disable = _clk_pll_disable,
1127 static unsigned long _clk_arm_get_rate(struct clk *clk)
1131 cacrr = __raw_readl(MXC_CCM_CACRR);
1132 div = (cacrr & MXC_CCM_CACRR_ARM_PODF_MASK) + 1;
1133 return clk_get_rate(clk->parent) / div;
1136 static int _clk_arm_set_rate(struct clk *clk, unsigned long rate)
1143 for (i = 0; i < cpu_op_nr; i++) {
1144 if (rate == cpu_op_tbl[i].cpu_rate)
1150 if (cpu_op_tbl[i].pll_rate != clk_get_rate(&pll1_sys_main_clk)) {
1151 /* Change the PLL1 rate. */
1152 if (pll2_pfd_400M.usecount != 0)
1153 pll1_sw_clk.set_parent(&pll1_sw_clk, &pll2_pfd_400M);
1155 pll1_sw_clk.set_parent(&pll1_sw_clk, &osc_clk);
1156 pll1_sys_main_clk.set_rate(&pll1_sys_main_clk, cpu_op_tbl[i].pll_rate);
1157 pll1_sw_clk.set_parent(&pll1_sw_clk, &pll1_sys_main_clk);
1160 parent_rate = clk_get_rate(clk->parent);
1161 div = parent_rate / rate;
1166 if ((parent_rate / div) > rate)
1172 __raw_writel(div - 1, MXC_CCM_CACRR);
1177 static struct clk cpu_clk = {
1178 __INIT_CLK_DEBUG(cpu_clk)
1179 .parent = &pll1_sw_clk,
1180 .set_rate = _clk_arm_set_rate,
1181 .get_rate = _clk_arm_get_rate,
1184 static int _clk_periph_set_parent(struct clk *clk, struct clk *parent)
1189 mux = _get_mux6(parent, &pll2_528_bus_main_clk, &pll2_pfd_400M,
1190 &pll2_pfd_352M, &pll2_200M, &pll3_sw_clk, &osc_clk);
1193 /* Set the pre_periph_clk multiplexer */
1194 reg = __raw_readl(MXC_CCM_CBCMR);
1195 reg &= ~MXC_CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK;
1196 reg |= mux << MXC_CCM_CBCMR_PRE_PERIPH_CLK_SEL_OFFSET;
1197 __raw_writel(reg, MXC_CCM_CBCMR);
1199 /* Set the periph_clk_sel multiplexer. */
1200 reg = __raw_readl(MXC_CCM_CBCDR);
1201 reg &= ~MXC_CCM_CBCDR_PERIPH_CLK_SEL;
1202 __raw_writel(reg, MXC_CCM_CBCDR);
1204 reg = __raw_readl(MXC_CCM_CBCDR);
1205 /* Set the periph_clk2_podf divider to divide by 1. */
1206 reg &= ~MXC_CCM_CBCDR_PERIPH_CLK2_PODF_MASK;
1207 __raw_writel(reg, MXC_CCM_CBCDR);
1209 /* Set the periph_clk2_sel mux. */
1210 reg = __raw_readl(MXC_CCM_CBCMR);
1211 reg &= ~MXC_CCM_CBCMR_PERIPH_CLK2_SEL_MASK;
1212 reg |= ((mux - 4) << MXC_CCM_CBCMR_PERIPH_CLK2_SEL_OFFSET);
1213 __raw_writel(reg, MXC_CCM_CBCMR);
1215 while (__raw_readl(MXC_CCM_CDHIPR))
1218 reg = __raw_readl(MXC_CCM_CBCDR);
1219 /* Set periph_clk_sel to select periph_clk2. */
1220 reg |= MXC_CCM_CBCDR_PERIPH_CLK_SEL;
1221 __raw_writel(reg, MXC_CCM_CBCDR);
1224 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1225 & MXC_CCM_CDHIPR_PERIPH_CLK_SEL_BUSY), SPIN_DELAY))
1226 panic("_clk_periph_set_parent failed\n");
1231 static unsigned long _clk_periph_get_rate(struct clk *clk)
1237 if ((clk->parent == &pll3_sw_clk) || (clk->parent == &osc_clk)) {
1238 reg = __raw_readl(MXC_CCM_CBCDR)
1239 & MXC_CCM_CBCDR_PERIPH_CLK2_PODF_MASK;
1240 div = (reg >> MXC_CCM_CBCDR_PERIPH_CLK2_PODF_OFFSET) + 1;
1242 val = clk_get_rate(clk->parent) / div;
1246 static struct clk periph_clk = {
1247 __INIT_CLK_DEBUG(periph_clk)
1248 .parent = &pll2_528_bus_main_clk,
1249 .set_parent = _clk_periph_set_parent,
1250 .get_rate = _clk_periph_get_rate,
1253 static unsigned long _clk_axi_get_rate(struct clk *clk)
1258 reg = __raw_readl(MXC_CCM_CBCDR) & MXC_CCM_CBCDR_AXI_PODF_MASK;
1259 div = (reg >> MXC_CCM_CBCDR_AXI_PODF_OFFSET);
1261 val = clk_get_rate(clk->parent) / (div + 1);
1265 static int _clk_axi_set_rate(struct clk *clk, unsigned long rate)
1268 u32 parent_rate = clk_get_rate(clk->parent);
1270 div = parent_rate / rate;
1274 if (((parent_rate / div) != rate) || (div > 8))
1277 reg = __raw_readl(MXC_CCM_CBCDR);
1278 reg &= ~MXC_CCM_CBCDR_AXI_PODF_MASK;
1279 reg |= (div - 1) << MXC_CCM_CBCDR_AXI_PODF_OFFSET;
1280 __raw_writel(reg, MXC_CCM_CBCDR);
1282 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1283 & MXC_CCM_CDHIPR_AXI_PODF_BUSY), SPIN_DELAY))
1284 panic("pll _clk_axi_a_set_rate failed\n");
1289 static unsigned long _clk_axi_round_rate(struct clk *clk,
1293 u32 parent_rate = clk_get_rate(clk->parent);
1295 div = parent_rate / rate;
1297 /* Make sure rate is not greater than the maximum
1298 * value for the clock.
1299 * Also prevent a div of 0.
1307 return parent_rate / div;
1310 static int _clk_axi_set_parent(struct clk *clk, struct clk *parent)
1315 mux = _get_mux6(parent, &periph_clk, &pll2_pfd_400M,
1316 &pll3_pfd_540M, NULL, NULL, NULL);
1319 /* Set the AXI_SEL mux */
1320 reg = __raw_readl(MXC_CCM_CBCDR) & ~MXC_CCM_CBCDR_AXI_SEL;
1321 __raw_writel(reg, MXC_CCM_CBCDR);
1323 /* Set the AXI_ALT_SEL mux. */
1324 reg = __raw_readl(MXC_CCM_CBCDR)
1325 & ~MXC_CCM_CBCDR_AXI_ALT_SEL_MASK;
1326 reg |= ((mux - 1) << MXC_CCM_CBCDR_AXI_ALT_SEL_OFFSET);
1327 __raw_writel(reg, MXC_CCM_CBCDR);
1329 /* Set the AXI_SEL mux */
1330 reg = __raw_readl(MXC_CCM_CBCDR) & ~MXC_CCM_CBCDR_AXI_SEL;
1331 reg |= MXC_CCM_CBCDR_AXI_SEL;
1332 __raw_writel(reg, MXC_CCM_CBCDR);
1337 static struct clk axi_clk = {
1338 __INIT_CLK_DEBUG(axi_clk)
1339 .parent = &periph_clk,
1340 .set_parent = _clk_axi_set_parent,
1341 .set_rate = _clk_axi_set_rate,
1342 .get_rate = _clk_axi_get_rate,
1343 .round_rate = _clk_axi_round_rate,
1346 static unsigned long _clk_ahb_get_rate(struct clk *clk)
1350 reg = __raw_readl(MXC_CCM_CBCDR);
1351 div = ((reg & MXC_CCM_CBCDR_AHB_PODF_MASK) >>
1352 MXC_CCM_CBCDR_AHB_PODF_OFFSET) + 1;
1354 return clk_get_rate(clk->parent) / div;
1357 static int _clk_ahb_set_rate(struct clk *clk, unsigned long rate)
1360 u32 parent_rate = clk_get_rate(clk->parent);
1362 div = parent_rate / rate;
1365 if (((parent_rate / div) != rate) || (div > 8))
1368 reg = __raw_readl(MXC_CCM_CBCDR);
1369 reg &= ~MXC_CCM_CBCDR_AHB_PODF_MASK;
1370 reg |= (div - 1) << MXC_CCM_CBCDR_AHB_PODF_OFFSET;
1371 __raw_writel(reg, MXC_CCM_CBCDR);
1373 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR) & MXC_CCM_CDHIPR_AHB_PODF_BUSY),
1375 panic("_clk_ahb_set_rate failed\n");
1380 static unsigned long _clk_ahb_round_rate(struct clk *clk,
1384 u32 parent_rate = clk_get_rate(clk->parent);
1386 div = parent_rate / rate;
1388 /* Make sure rate is not greater than the maximum value for the clock.
1389 * Also prevent a div of 0.
1397 return parent_rate / div;
1400 static struct clk ahb_clk = {
1401 __INIT_CLK_DEBUG(ahb_clk)
1402 .parent = &periph_clk,
1403 .get_rate = _clk_ahb_get_rate,
1404 .set_rate = _clk_ahb_set_rate,
1405 .round_rate = _clk_ahb_round_rate,
1408 static unsigned long _clk_ipg_get_rate(struct clk *clk)
1412 reg = __raw_readl(MXC_CCM_CBCDR);
1413 div = ((reg & MXC_CCM_CBCDR_IPG_PODF_MASK) >>
1414 MXC_CCM_CBCDR_IPG_PODF_OFFSET) + 1;
1416 return clk_get_rate(clk->parent) / div;
1420 static struct clk ipg_clk = {
1421 __INIT_CLK_DEBUG(ipg_clk)
1423 .get_rate = _clk_ipg_get_rate,
1426 static struct clk tzasc1_clk = {
1427 __INIT_CLK_DEBUG(tzasc1_clk)
1430 .enable_reg = MXC_CCM_CCGR2,
1431 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
1432 .enable = _clk_enable,
1433 .disable = _clk_disable_inwait,
1436 static struct clk tzasc2_clk = {
1437 __INIT_CLK_DEBUG(tzasc2_clk)
1440 .enable_reg = MXC_CCM_CCGR2,
1441 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
1442 .enable = _clk_enable,
1443 .disable = _clk_disable_inwait,
1446 static struct clk mx6fast1_clk = {
1447 __INIT_CLK_DEBUG(mx6fast1_clk)
1450 .enable_reg = MXC_CCM_CCGR4,
1451 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
1452 .enable = _clk_enable,
1453 .disable = _clk_disable_inwait,
1456 static struct clk mx6per1_clk = {
1457 __INIT_CLK_DEBUG(mx6per1_clk)
1460 .secondary = &mx6fast1_clk,
1461 .enable_reg = MXC_CCM_CCGR4,
1462 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1463 .enable = _clk_enable,
1464 .disable = _clk_disable_inwait,
1467 static struct clk mx6per2_clk = {
1468 __INIT_CLK_DEBUG(mx6per2_clk)
1471 .enable_reg = MXC_CCM_CCGR4,
1472 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
1473 .enable = _clk_enable,
1474 .disable = _clk_disable_inwait,
1477 static unsigned long _clk_mmdc_ch0_axi_get_rate(struct clk *clk)
1481 reg = __raw_readl(MXC_CCM_CBCDR);
1482 div = ((reg & MXC_CCM_CBCDR_MMDC_CH0_PODF_MASK) >>
1483 MXC_CCM_CBCDR_MMDC_CH0_PODF_OFFSET) + 1;
1485 return clk_get_rate(clk->parent) / div;
1488 static int _clk_mmdc_ch0_axi_set_rate(struct clk *clk, unsigned long rate)
1491 u32 parent_rate = clk_get_rate(clk->parent);
1493 div = parent_rate / rate;
1496 if (((parent_rate / div) != rate) || (div > 8))
1499 reg = __raw_readl(MXC_CCM_CBCDR);
1500 reg &= ~MXC_CCM_CBCDR_MMDC_CH0_PODF_MASK;
1501 reg |= (div - 1) << MXC_CCM_CBCDR_MMDC_CH0_PODF_OFFSET;
1502 __raw_writel(reg, MXC_CCM_CBCDR);
1504 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1505 & MXC_CCM_CDHIPR_MMDC_CH0_PODF_BUSY),
1507 panic("_clk_mmdc_ch0_axi_set_rate failed\n");
1512 static unsigned long _clk_mmdc_ch0_axi_round_rate(struct clk *clk,
1516 u32 parent_rate = clk_get_rate(clk->parent);
1518 div = parent_rate / rate;
1520 /* Make sure rate is not greater than the maximum value for the clock.
1521 * Also prevent a div of 0.
1529 return parent_rate / div;
1532 static struct clk mmdc_ch0_axi_clk[] = {
1534 __INIT_CLK_DEBUG(mmdc_ch0_axi_clk)
1536 .parent = &periph_clk,
1537 .enable = _clk_enable,
1538 .disable = _clk_disable_inwait,
1539 .enable_reg = MXC_CCM_CCGR3,
1540 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
1541 .secondary = &mmdc_ch0_axi_clk[1],
1542 .get_rate = _clk_mmdc_ch0_axi_get_rate,
1543 .set_rate = _clk_mmdc_ch0_axi_set_rate,
1544 .round_rate = _clk_mmdc_ch0_axi_round_rate,
1547 __INIT_CLK_DEBUG(mmdc_ch0_ipg_clk)
1550 .enable = _clk_enable,
1551 .disable = _clk_disable_inwait,
1552 .enable_reg = MXC_CCM_CCGR3,
1553 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
1554 .secondary = &tzasc1_clk,
1558 static unsigned long _clk_mmdc_ch1_axi_get_rate(struct clk *clk)
1562 reg = __raw_readl(MXC_CCM_CBCDR);
1563 div = ((reg & MXC_CCM_CBCDR_MMDC_CH1_PODF_MASK) >>
1564 MXC_CCM_CBCDR_MMDC_CH1_PODF_OFFSET) + 1;
1566 return clk_get_rate(clk->parent) / div;
1569 static int _clk_mmdc_ch1_axi_set_rate(struct clk *clk, unsigned long rate)
1572 u32 parent_rate = clk_get_rate(clk->parent);
1574 div = parent_rate / rate;
1577 if (((parent_rate / div) != rate) || (div > 8))
1580 reg = __raw_readl(MXC_CCM_CBCDR);
1581 reg &= ~MXC_CCM_CBCDR_MMDC_CH1_PODF_MASK;
1582 reg |= (div - 1) << MXC_CCM_CBCDR_MMDC_CH1_PODF_OFFSET;
1583 __raw_writel(reg, MXC_CCM_CBCDR);
1585 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1586 & MXC_CCM_CDHIPR_MMDC_CH1_PODF_BUSY), SPIN_DELAY))
1587 panic("_clk_mmdc_ch1_axi_set_rate failed\n");
1592 static unsigned long _clk_mmdc_ch1_axi_round_rate(struct clk *clk,
1596 u32 parent_rate = clk_get_rate(clk->parent);
1598 div = parent_rate / rate;
1600 /* Make sure rate is not greater than the maximum value for the clock.
1601 * Also prevent a div of 0.
1609 return parent_rate / div;
1612 static struct clk mmdc_ch1_axi_clk[] = {
1614 __INIT_CLK_DEBUG(mmdc_ch1_axi_clk)
1616 .parent = &pll2_pfd_400M,
1617 .enable = _clk_enable,
1618 .disable = _clk_disable,
1619 .enable_reg = MXC_CCM_CCGR3,
1620 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
1621 .secondary = &mmdc_ch1_axi_clk[1],
1622 .get_rate = _clk_mmdc_ch1_axi_get_rate,
1623 .set_rate = _clk_mmdc_ch1_axi_set_rate,
1624 .round_rate = _clk_mmdc_ch1_axi_round_rate,
1628 __INIT_CLK_DEBUG(mmdc_ch1_ipg_clk)
1630 .enable = _clk_enable,
1631 .disable = _clk_disable,
1632 .enable_reg = MXC_CCM_CCGR3,
1633 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
1634 .secondary = &tzasc2_clk,
1638 static struct clk ocram_clk = {
1639 __INIT_CLK_DEBUG(ocram_clk)
1642 .enable_reg = MXC_CCM_CCGR3,
1643 .enable_shift = MXC_CCM_CCGRx_CG14_OFFSET,
1644 .enable = _clk_enable,
1645 .disable = _clk_disable_inwait,
1648 static unsigned long _clk_ipg_perclk_get_rate(struct clk *clk)
1652 reg = __raw_readl(MXC_CCM_CSCMR1);
1653 div = ((reg & MXC_CCM_CSCMR1_PERCLK_PODF_MASK) >>
1654 MXC_CCM_CSCMR1_PERCLK_PODF_OFFSET) + 1;
1656 return clk_get_rate(clk->parent) / div;
1659 static int _clk_ipg_perclk_set_rate(struct clk *clk, unsigned long rate)
1662 u32 parent_rate = clk_get_rate(clk->parent);
1664 div = parent_rate / rate;
1667 if (((parent_rate / div) != rate) || (div > 64))
1670 reg = __raw_readl(MXC_CCM_CSCMR1);
1671 reg &= ~MXC_CCM_CSCMR1_PERCLK_PODF_MASK;
1672 reg |= (div - 1) << MXC_CCM_CSCMR1_PERCLK_PODF_OFFSET;
1673 __raw_writel(reg, MXC_CCM_CSCMR1);
1679 static unsigned long _clk_ipg_perclk_round_rate(struct clk *clk,
1683 u32 parent_rate = clk_get_rate(clk->parent);
1685 div = parent_rate / rate;
1687 /* Make sure rate is not greater than the maximum value for the clock.
1688 * Also prevent a div of 0.
1696 return parent_rate / div;
1699 static struct clk ipg_perclk = {
1700 __INIT_CLK_DEBUG(ipg_perclk)
1702 .get_rate = _clk_ipg_perclk_get_rate,
1703 .set_rate = _clk_ipg_perclk_set_rate,
1704 .round_rate = _clk_ipg_perclk_round_rate,
1707 static struct clk spba_clk = {
1708 __INIT_CLK_DEBUG(spba_clk)
1710 .enable_reg = MXC_CCM_CCGR5,
1711 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1712 .enable = _clk_enable,
1713 .disable = _clk_disable,
1716 static struct clk sdma_clk[] = {
1718 __INIT_CLK_DEBUG(sdma_clk)
1720 .enable_reg = MXC_CCM_CCGR5,
1721 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
1722 .enable = _clk_enable,
1723 .disable = _clk_disable,
1724 .secondary = &sdma_clk[1],
1727 .parent = &mx6per1_clk,
1728 #ifdef CONFIG_SDMA_IRAM
1729 .secondary = &ocram_clk,
1731 .secondary = &mmdc_ch0_axi_clk[0],
1736 static int _clk_gpu2d_axi_set_parent(struct clk *clk, struct clk *parent)
1738 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_GPU2D_AXI_CLK_SEL;
1740 if (parent == &ahb_clk)
1741 reg |= MXC_CCM_CBCMR_GPU2D_AXI_CLK_SEL;
1743 __raw_writel(reg, MXC_CCM_CBCMR);
1748 static struct clk gpu2d_axi_clk = {
1749 __INIT_CLK_DEBUG(gpu2d_axi_clk)
1751 .secondary = &openvg_axi_clk,
1752 .set_parent = _clk_gpu2d_axi_set_parent,
1755 static int _clk_gpu3d_axi_set_parent(struct clk *clk, struct clk *parent)
1757 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_GPU3D_AXI_CLK_SEL;
1759 if (parent == &ahb_clk)
1760 reg |= MXC_CCM_CBCMR_GPU3D_AXI_CLK_SEL;
1762 __raw_writel(reg, MXC_CCM_CBCMR);
1767 static struct clk gpu3d_axi_clk = {
1768 __INIT_CLK_DEBUG(gpu3d_axi_clk)
1770 .secondary = &mmdc_ch0_axi_clk[0],
1771 .set_parent = _clk_gpu3d_axi_set_parent,
1774 static int _clk_pcie_axi_set_parent(struct clk *clk, struct clk *parent)
1776 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_PCIE_AXI_CLK_SEL;
1778 if (parent == &ahb_clk)
1779 reg |= MXC_CCM_CBCMR_PCIE_AXI_CLK_SEL;
1781 __raw_writel(reg, MXC_CCM_CBCMR);
1786 static struct clk pcie_axi_clk = {
1787 __INIT_CLK_DEBUG(pcie_axi_clk)
1789 .set_parent = _clk_pcie_axi_set_parent,
1792 static int _clk_vdo_axi_set_parent(struct clk *clk, struct clk *parent)
1794 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_VDOAXI_CLK_SEL;
1796 if (parent == &ahb_clk)
1797 reg |= MXC_CCM_CBCMR_VDOAXI_CLK_SEL;
1799 __raw_writel(reg, MXC_CCM_CBCMR);
1804 static struct clk vdo_axi_clk = {
1805 __INIT_CLK_DEBUG(vdo_axi_clk)
1807 .enable_reg = MXC_CCM_CCGR6,
1808 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1809 .enable = _clk_enable,
1810 .disable = _clk_disable,
1811 .set_parent = _clk_vdo_axi_set_parent,
1814 static struct clk vdoa_clk = {
1815 __INIT_CLK_DEBUG(vdoa_clk)
1818 .secondary = &mx6fast1_clk,
1819 .enable_reg = MXC_CCM_CCGR2,
1820 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
1821 .enable = _clk_enable,
1822 .disable = _clk_disable,
1825 static unsigned long _clk_gpt_get_rate(struct clk *clk)
1829 if (mx6q_revision() == IMX_CHIP_REVISION_1_0)
1830 return clk_get_rate(clk->parent);
1832 rate = mx6_timer_rate();
1834 return clk_get_rate(clk->parent);
1839 static struct clk gpt_clk[] = {
1841 __INIT_CLK_DEBUG(gpt_clk)
1844 .enable_reg = MXC_CCM_CCGR1,
1845 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
1846 .enable = _clk_enable,
1847 .disable = _clk_disable,
1848 .get_rate = _clk_gpt_get_rate,
1849 .secondary = &gpt_clk[1],
1852 __INIT_CLK_DEBUG(gpt_serial_clk)
1854 .enable_reg = MXC_CCM_CCGR1,
1855 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
1856 .enable = _clk_enable,
1857 .disable = _clk_disable,
1861 static unsigned long _clk_iim_get_rate(struct clk *clk)
1863 return clk_get_rate(clk->parent);
1866 static struct clk iim_clk = {
1867 __INIT_CLK_DEBUG(iim_clk)
1869 .enable = _clk_enable,
1870 .enable_reg = MXC_CCM_CCGR2,
1871 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1872 .disable = _clk_disable,
1873 .get_rate = _clk_iim_get_rate,
1876 static struct clk i2c_clk[] = {
1878 __INIT_CLK_DEBUG(i2c_clk_0)
1880 .parent = &ipg_perclk,
1881 .enable_reg = MXC_CCM_CCGR2,
1882 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
1883 .enable = _clk_enable,
1884 .disable = _clk_disable,
1887 __INIT_CLK_DEBUG(i2c_clk_1)
1889 .parent = &ipg_perclk,
1890 .enable_reg = MXC_CCM_CCGR2,
1891 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
1892 .enable = _clk_enable,
1893 .disable = _clk_disable,
1896 __INIT_CLK_DEBUG(i2c_clk_2)
1898 .parent = &ipg_perclk,
1899 .enable_reg = MXC_CCM_CCGR2,
1900 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
1901 .enable = _clk_enable,
1902 .disable = _clk_disable,
1906 static int _clk_vpu_axi_set_parent(struct clk *clk, struct clk *parent)
1909 u32 reg = __raw_readl(MXC_CCM_CBCMR)
1910 & ~MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_MASK;
1912 mux = _get_mux6(parent, &axi_clk, &pll2_pfd_400M,
1913 &pll2_pfd_352M, NULL, NULL, NULL);
1915 reg |= (mux << MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_OFFSET);
1917 __raw_writel(reg, MXC_CCM_CBCMR);
1922 static unsigned long _clk_vpu_axi_get_rate(struct clk *clk)
1926 reg = __raw_readl(MXC_CCM_CSCDR1);
1927 div = ((reg & MXC_CCM_CSCDR1_VPU_AXI_PODF_MASK) >>
1928 MXC_CCM_CSCDR1_VPU_AXI_PODF_OFFSET) + 1;
1930 return clk_get_rate(clk->parent) / div;
1933 static int _clk_vpu_axi_set_rate(struct clk *clk, unsigned long rate)
1936 u32 parent_rate = clk_get_rate(clk->parent);
1938 div = parent_rate / rate;
1941 if (((parent_rate / div) != rate) || (div > 8))
1944 reg = __raw_readl(MXC_CCM_CSCDR1);
1945 reg &= ~MXC_CCM_CSCDR1_VPU_AXI_PODF_MASK;
1946 reg |= (div - 1) << MXC_CCM_CSCDR1_VPU_AXI_PODF_OFFSET;
1947 __raw_writel(reg, MXC_CCM_CSCDR1);
1952 static unsigned long _clk_vpu_axi_round_rate(struct clk *clk,
1956 u32 parent_rate = clk_get_rate(clk->parent);
1958 div = parent_rate / rate;
1960 /* Make sure rate is not greater than the maximum value for the clock.
1961 * Also prevent a div of 0.
1969 return parent_rate / div;
1972 static struct clk vpu_clk[] = {
1974 __INIT_CLK_DEBUG(vpu_clk)
1976 .enable_reg = MXC_CCM_CCGR6,
1977 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
1978 .enable = _clk_enable,
1979 .disable = _clk_disable,
1980 .set_parent = _clk_vpu_axi_set_parent,
1981 .round_rate = _clk_vpu_axi_round_rate,
1982 .set_rate = _clk_vpu_axi_set_rate,
1983 .get_rate = _clk_vpu_axi_get_rate,
1984 .secondary = &vpu_clk[1],
1987 .parent = &mmdc_ch0_axi_clk[0],
1988 .secondary = &vpu_clk[2],
1991 .parent = &mx6fast1_clk,
1992 .secondary = &ocram_clk,
1997 static int _clk_ipu1_set_parent(struct clk *clk, struct clk *parent)
2000 u32 reg = __raw_readl(MXC_CCM_CSCDR3)
2001 & ~MXC_CCM_CSCDR3_IPU1_HSP_CLK_SEL_MASK;
2003 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2004 &pll2_pfd_400M, &pll3_120M, &pll3_pfd_540M, NULL, NULL);
2006 reg |= (mux << MXC_CCM_CSCDR3_IPU1_HSP_CLK_SEL_OFFSET);
2008 __raw_writel(reg, MXC_CCM_CSCDR3);
2013 static unsigned long _clk_ipu1_get_rate(struct clk *clk)
2017 reg = __raw_readl(MXC_CCM_CSCDR3);
2018 div = ((reg & MXC_CCM_CSCDR3_IPU1_HSP_PODF_MASK) >>
2019 MXC_CCM_CSCDR3_IPU1_HSP_PODF_OFFSET) + 1;
2021 return clk_get_rate(clk->parent) / div;
2024 static int _clk_ipu1_set_rate(struct clk *clk, unsigned long rate)
2027 u32 parent_rate = clk_get_rate(clk->parent);
2029 div = parent_rate / rate;
2032 if (((parent_rate / div) != rate) || (div > 8))
2035 reg = __raw_readl(MXC_CCM_CSCDR3);
2036 reg &= ~MXC_CCM_CSCDR3_IPU1_HSP_PODF_MASK;
2037 reg |= (div - 1) << MXC_CCM_CSCDR3_IPU1_HSP_PODF_OFFSET;
2038 __raw_writel(reg, MXC_CCM_CSCDR3);
2043 static unsigned long _clk_ipu_round_rate(struct clk *clk,
2047 u32 parent_rate = clk_get_rate(clk->parent);
2049 div = parent_rate / rate;
2051 /* Make sure rate is not greater than the maximum value for the clock.
2052 * Also prevent a div of 0.
2060 return parent_rate / div;
2063 static struct clk ipu1_clk = {
2064 __INIT_CLK_DEBUG(ipu1_clk)
2065 .parent = &mmdc_ch0_axi_clk[0],
2066 .secondary = &mmdc_ch0_axi_clk[0],
2067 .enable_reg = MXC_CCM_CCGR3,
2068 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
2069 .enable = _clk_enable,
2070 .disable = _clk_disable,
2071 .set_parent = _clk_ipu1_set_parent,
2072 .round_rate = _clk_ipu_round_rate,
2073 .set_rate = _clk_ipu1_set_rate,
2074 .get_rate = _clk_ipu1_get_rate,
2075 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2078 static int _clk_ipu2_set_parent(struct clk *clk, struct clk *parent)
2081 u32 reg = __raw_readl(MXC_CCM_CSCDR3)
2082 & ~MXC_CCM_CSCDR3_IPU2_HSP_CLK_SEL_MASK;
2084 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2085 &pll2_pfd_400M, &pll3_120M, &pll3_pfd_540M, NULL, NULL);
2087 reg |= (mux << MXC_CCM_CSCDR3_IPU2_HSP_CLK_SEL_OFFSET);
2089 __raw_writel(reg, MXC_CCM_CSCDR3);
2094 static unsigned long _clk_ipu2_get_rate(struct clk *clk)
2098 reg = __raw_readl(MXC_CCM_CSCDR3);
2099 div = ((reg & MXC_CCM_CSCDR3_IPU2_HSP_PODF_MASK) >>
2100 MXC_CCM_CSCDR3_IPU2_HSP_PODF_OFFSET) + 1;
2102 return clk_get_rate(clk->parent) / div;
2105 static int _clk_ipu2_set_rate(struct clk *clk, unsigned long rate)
2108 u32 parent_rate = clk_get_rate(clk->parent);
2110 div = parent_rate / rate;
2113 if (((parent_rate / div) != rate) || (div > 8))
2116 reg = __raw_readl(MXC_CCM_CSCDR3);
2117 reg &= ~MXC_CCM_CSCDR3_IPU2_HSP_PODF_MASK;
2118 reg |= (div - 1) << MXC_CCM_CSCDR3_IPU2_HSP_PODF_OFFSET;
2119 __raw_writel(reg, MXC_CCM_CSCDR3);
2124 static struct clk ipu2_clk = {
2125 __INIT_CLK_DEBUG(ipu2_clk)
2126 .parent = &mmdc_ch0_axi_clk[0],
2127 .secondary = &mmdc_ch0_axi_clk[0],
2128 .enable_reg = MXC_CCM_CCGR3,
2129 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
2130 .enable = _clk_enable,
2131 .disable = _clk_disable,
2132 .set_parent = _clk_ipu2_set_parent,
2133 .round_rate = _clk_ipu_round_rate,
2134 .set_rate = _clk_ipu2_set_rate,
2135 .get_rate = _clk_ipu2_get_rate,
2136 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2139 static struct clk usdhc_dep_clk = {
2140 .parent = &mmdc_ch0_axi_clk[0],
2141 .secondary = &mx6per1_clk,
2142 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2145 static unsigned long _clk_usdhc_round_rate(struct clk *clk,
2149 u32 parent_rate = clk_get_rate(clk->parent);
2151 div = parent_rate / rate;
2153 /* Make sure rate is not greater than the maximum value for the clock.
2154 * Also prevent a div of 0.
2162 return parent_rate / div;
2165 static int _clk_usdhc1_set_parent(struct clk *clk, struct clk *parent)
2167 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC1_CLK_SEL;
2169 if (parent == &pll2_pfd_352M)
2170 reg |= (MXC_CCM_CSCMR1_USDHC1_CLK_SEL);
2172 __raw_writel(reg, MXC_CCM_CSCMR1);
2177 static unsigned long _clk_usdhc1_get_rate(struct clk *clk)
2181 reg = __raw_readl(MXC_CCM_CSCDR1);
2182 div = ((reg & MXC_CCM_CSCDR1_USDHC1_PODF_MASK) >>
2183 MXC_CCM_CSCDR1_USDHC1_PODF_OFFSET) + 1;
2185 return clk_get_rate(clk->parent) / div;
2188 static int _clk_usdhc1_set_rate(struct clk *clk, unsigned long rate)
2191 u32 parent_rate = clk_get_rate(clk->parent);
2193 div = parent_rate / rate;
2196 if (((parent_rate / div) != rate) || (div > 8))
2199 reg = __raw_readl(MXC_CCM_CSCDR1);
2200 reg &= ~MXC_CCM_CSCDR1_USDHC1_PODF_MASK;
2201 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC1_PODF_OFFSET;
2202 __raw_writel(reg, MXC_CCM_CSCDR1);
2207 static struct clk usdhc1_clk = {
2208 __INIT_CLK_DEBUG(usdhc1_clk)
2210 .parent = &pll2_pfd_400M,
2211 .secondary = &usdhc_dep_clk,
2212 .enable_reg = MXC_CCM_CCGR6,
2213 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
2214 .enable = _clk_enable,
2215 .disable = _clk_disable,
2216 .set_parent = _clk_usdhc1_set_parent,
2217 .round_rate = _clk_usdhc_round_rate,
2218 .set_rate = _clk_usdhc1_set_rate,
2219 .get_rate = _clk_usdhc1_get_rate,
2220 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2223 static int _clk_usdhc2_set_parent(struct clk *clk, struct clk *parent)
2225 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC2_CLK_SEL;
2227 if (parent == &pll2_pfd_352M)
2228 reg |= (MXC_CCM_CSCMR1_USDHC2_CLK_SEL);
2230 __raw_writel(reg, MXC_CCM_CSCMR1);
2235 static unsigned long _clk_usdhc2_get_rate(struct clk *clk)
2239 reg = __raw_readl(MXC_CCM_CSCDR1);
2240 div = ((reg & MXC_CCM_CSCDR1_USDHC2_PODF_MASK) >>
2241 MXC_CCM_CSCDR1_USDHC2_PODF_OFFSET) + 1;
2243 return clk_get_rate(clk->parent) / div;
2246 static int _clk_usdhc2_set_rate(struct clk *clk, unsigned long rate)
2249 u32 parent_rate = clk_get_rate(clk->parent);
2251 div = parent_rate / rate;
2254 if (((parent_rate / div) != rate) || (div > 8))
2257 reg = __raw_readl(MXC_CCM_CSCDR1);
2258 reg &= ~MXC_CCM_CSCDR1_USDHC2_PODF_MASK;
2259 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC2_PODF_OFFSET;
2260 __raw_writel(reg, MXC_CCM_CSCDR1);
2265 static struct clk usdhc2_clk = {
2266 __INIT_CLK_DEBUG(usdhc2_clk)
2268 .parent = &pll2_pfd_400M,
2269 .secondary = &usdhc_dep_clk,
2270 .enable_reg = MXC_CCM_CCGR6,
2271 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
2272 .enable = _clk_enable,
2273 .disable = _clk_disable,
2274 .set_parent = _clk_usdhc2_set_parent,
2275 .round_rate = _clk_usdhc_round_rate,
2276 .set_rate = _clk_usdhc2_set_rate,
2277 .get_rate = _clk_usdhc2_get_rate,
2278 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2281 static int _clk_usdhc3_set_parent(struct clk *clk, struct clk *parent)
2283 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC3_CLK_SEL;
2285 if (parent == &pll2_pfd_352M)
2286 reg |= (MXC_CCM_CSCMR1_USDHC3_CLK_SEL);
2288 __raw_writel(reg, MXC_CCM_CSCMR1);
2293 static unsigned long _clk_usdhc3_get_rate(struct clk *clk)
2297 reg = __raw_readl(MXC_CCM_CSCDR1);
2298 div = ((reg & MXC_CCM_CSCDR1_USDHC3_PODF_MASK) >>
2299 MXC_CCM_CSCDR1_USDHC3_PODF_OFFSET) + 1;
2301 return clk_get_rate(clk->parent) / div;
2304 static int _clk_usdhc3_set_rate(struct clk *clk, unsigned long rate)
2307 u32 parent_rate = clk_get_rate(clk->parent);
2309 div = parent_rate / rate;
2312 if (((parent_rate / div) != rate) || (div > 8))
2315 reg = __raw_readl(MXC_CCM_CSCDR1);
2316 reg &= ~MXC_CCM_CSCDR1_USDHC3_PODF_MASK;
2317 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC3_PODF_OFFSET;
2318 __raw_writel(reg, MXC_CCM_CSCDR1);
2324 static struct clk usdhc3_clk = {
2325 __INIT_CLK_DEBUG(usdhc3_clk)
2327 .parent = &pll2_pfd_400M,
2328 .secondary = &usdhc_dep_clk,
2329 .enable_reg = MXC_CCM_CCGR6,
2330 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
2331 .enable = _clk_enable,
2332 .disable = _clk_disable,
2333 .set_parent = _clk_usdhc3_set_parent,
2334 .round_rate = _clk_usdhc_round_rate,
2335 .set_rate = _clk_usdhc3_set_rate,
2336 .get_rate = _clk_usdhc3_get_rate,
2337 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2340 static int _clk_usdhc4_set_parent(struct clk *clk, struct clk *parent)
2342 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC4_CLK_SEL;
2344 if (parent == &pll2_pfd_352M)
2345 reg |= (MXC_CCM_CSCMR1_USDHC4_CLK_SEL);
2347 __raw_writel(reg, MXC_CCM_CSCMR1);
2352 static unsigned long _clk_usdhc4_get_rate(struct clk *clk)
2356 reg = __raw_readl(MXC_CCM_CSCDR1);
2357 div = ((reg & MXC_CCM_CSCDR1_USDHC4_PODF_MASK) >>
2358 MXC_CCM_CSCDR1_USDHC4_PODF_OFFSET) + 1;
2360 return clk_get_rate(clk->parent) / div;
2363 static int _clk_usdhc4_set_rate(struct clk *clk, unsigned long rate)
2366 u32 parent_rate = clk_get_rate(clk->parent);
2368 div = parent_rate / rate;
2371 if (((parent_rate / div) != rate) || (div > 8))
2374 reg = __raw_readl(MXC_CCM_CSCDR1);
2375 reg &= ~MXC_CCM_CSCDR1_USDHC4_PODF_MASK;
2376 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC4_PODF_OFFSET;
2377 __raw_writel(reg, MXC_CCM_CSCDR1);
2383 static struct clk usdhc4_clk = {
2384 __INIT_CLK_DEBUG(usdhc4_clk)
2386 .parent = &pll2_pfd_400M,
2387 .secondary = &usdhc_dep_clk,
2388 .enable_reg = MXC_CCM_CCGR6,
2389 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
2390 .enable = _clk_enable,
2391 .disable = _clk_disable,
2392 .set_parent = _clk_usdhc4_set_parent,
2393 .round_rate = _clk_usdhc_round_rate,
2394 .set_rate = _clk_usdhc4_set_rate,
2395 .get_rate = _clk_usdhc4_get_rate,
2396 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2399 static unsigned long _clk_ssi_round_rate(struct clk *clk,
2403 u32 parent_rate = clk_get_rate(clk->parent);
2404 u32 div = parent_rate / rate;
2406 if (parent_rate % rate)
2409 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2411 return parent_rate / (pre * post);
2414 static unsigned long _clk_ssi1_get_rate(struct clk *clk)
2416 u32 reg, prediv, podf;
2418 reg = __raw_readl(MXC_CCM_CS1CDR);
2420 prediv = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK)
2421 >> MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET) + 1;
2422 podf = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK)
2423 >> MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET) + 1;
2425 return clk_get_rate(clk->parent) / (prediv * podf);
2428 static int _clk_ssi1_set_rate(struct clk *clk, unsigned long rate)
2430 u32 reg, div, pre, post;
2431 u32 parent_rate = clk_get_rate(clk->parent);
2433 div = parent_rate / rate;
2436 if (((parent_rate / div) != rate) || div > 512)
2439 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2441 reg = __raw_readl(MXC_CCM_CS1CDR);
2442 reg &= ~(MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK |
2443 MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK);
2444 reg |= (post - 1) << MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET;
2445 reg |= (pre - 1) << MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET;
2447 __raw_writel(reg, MXC_CCM_CS1CDR);
2453 static int _clk_ssi1_set_parent(struct clk *clk, struct clk *parent)
2457 reg = __raw_readl(MXC_CCM_CSCMR1)
2458 & ~MXC_CCM_CSCMR1_SSI1_CLK_SEL_MASK;
2460 mux = _get_mux6(parent, &pll3_pfd_508M, &pll3_pfd_454M,
2461 &pll4_audio_main_clk, NULL, NULL, NULL);
2462 reg |= (mux << MXC_CCM_CSCMR1_SSI1_CLK_SEL_OFFSET);
2464 __raw_writel(reg, MXC_CCM_CSCMR1);
2469 static struct clk ssi1_clk = {
2470 __INIT_CLK_DEBUG(ssi1_clk)
2471 .parent = &pll3_pfd_508M,
2472 .enable_reg = MXC_CCM_CCGR5,
2473 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
2474 .enable = _clk_enable,
2475 .disable = _clk_disable,
2476 .set_parent = _clk_ssi1_set_parent,
2477 .set_rate = _clk_ssi1_set_rate,
2478 .round_rate = _clk_ssi_round_rate,
2479 .get_rate = _clk_ssi1_get_rate,
2480 #ifdef CONFIG_SND_MXC_SOC_IRAM
2481 .secondary = &ocram_clk,
2483 .secondary = &mmdc_ch0_axi_clk[0],
2487 static unsigned long _clk_ssi2_get_rate(struct clk *clk)
2489 u32 reg, prediv, podf;
2491 reg = __raw_readl(MXC_CCM_CS2CDR);
2493 prediv = ((reg & MXC_CCM_CS2CDR_SSI2_CLK_PRED_MASK)
2494 >> MXC_CCM_CS2CDR_SSI2_CLK_PRED_OFFSET) + 1;
2495 podf = ((reg & MXC_CCM_CS2CDR_SSI2_CLK_PODF_MASK)
2496 >> MXC_CCM_CS2CDR_SSI2_CLK_PODF_OFFSET) + 1;
2498 return clk_get_rate(clk->parent) / (prediv * podf);
2501 static int _clk_ssi2_set_rate(struct clk *clk, unsigned long rate)
2503 u32 reg, div, pre, post;
2504 u32 parent_rate = clk_get_rate(clk->parent);
2506 div = parent_rate / rate;
2509 if (((parent_rate / div) != rate) || div > 512)
2512 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2514 reg = __raw_readl(MXC_CCM_CS2CDR);
2515 reg &= ~(MXC_CCM_CS2CDR_SSI2_CLK_PRED_MASK |
2516 MXC_CCM_CS2CDR_SSI2_CLK_PODF_MASK);
2517 reg |= (post - 1) << MXC_CCM_CS2CDR_SSI2_CLK_PODF_OFFSET;
2518 reg |= (pre - 1) << MXC_CCM_CS2CDR_SSI2_CLK_PRED_OFFSET;
2520 __raw_writel(reg, MXC_CCM_CS2CDR);
2526 static int _clk_ssi2_set_parent(struct clk *clk, struct clk *parent)
2530 reg = __raw_readl(MXC_CCM_CSCMR1)
2531 & ~MXC_CCM_CSCMR1_SSI2_CLK_SEL_MASK;
2533 mux = _get_mux6(parent, &pll3_pfd_508M, &pll3_pfd_454M,
2534 &pll4_audio_main_clk, NULL, NULL, NULL);
2535 reg |= (mux << MXC_CCM_CSCMR1_SSI2_CLK_SEL_OFFSET);
2537 __raw_writel(reg, MXC_CCM_CSCMR1);
2542 static struct clk ssi2_clk = {
2543 __INIT_CLK_DEBUG(ssi2_clk)
2544 .parent = &pll3_pfd_508M,
2545 .enable_reg = MXC_CCM_CCGR5,
2546 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
2547 .enable = _clk_enable,
2548 .disable = _clk_disable,
2549 .set_parent = _clk_ssi2_set_parent,
2550 .set_rate = _clk_ssi2_set_rate,
2551 .round_rate = _clk_ssi_round_rate,
2552 .get_rate = _clk_ssi2_get_rate,
2553 #ifdef CONFIG_SND_MXC_SOC_IRAM
2554 .secondary = &ocram_clk,
2556 .secondary = &mmdc_ch0_axi_clk[0],
2560 static unsigned long _clk_ssi3_get_rate(struct clk *clk)
2562 u32 reg, prediv, podf;
2564 reg = __raw_readl(MXC_CCM_CS1CDR);
2566 prediv = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK)
2567 >> MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET) + 1;
2568 podf = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK)
2569 >> MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET) + 1;
2571 return clk_get_rate(clk->parent) / (prediv * podf);
2574 static int _clk_ssi3_set_rate(struct clk *clk, unsigned long rate)
2576 u32 reg, div, pre, post;
2577 u32 parent_rate = clk_get_rate(clk->parent);
2579 div = parent_rate / rate;
2582 if (((parent_rate / div) != rate) || div > 512)
2585 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2587 reg = __raw_readl(MXC_CCM_CS1CDR);
2588 reg &= ~(MXC_CCM_CS1CDR_SSI3_CLK_PODF_MASK|
2589 MXC_CCM_CS1CDR_SSI3_CLK_PRED_MASK);
2590 reg |= (post - 1) << MXC_CCM_CS1CDR_SSI3_CLK_PODF_OFFSET;
2591 reg |= (pre - 1) << MXC_CCM_CS1CDR_SSI3_CLK_PRED_OFFSET;
2593 __raw_writel(reg, MXC_CCM_CS1CDR);
2599 static int _clk_ssi3_set_parent(struct clk *clk, struct clk *parent)
2603 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_SSI3_CLK_SEL_MASK;
2605 mux = _get_mux6(parent, &pll3_pfd_508M, &pll3_pfd_454M,
2606 &pll4_audio_main_clk, NULL, NULL, NULL);
2607 reg |= (mux << MXC_CCM_CSCMR1_SSI3_CLK_SEL_OFFSET);
2609 __raw_writel(reg, MXC_CCM_CSCMR1);
2614 static struct clk ssi3_clk = {
2615 __INIT_CLK_DEBUG(ssi3_clk)
2616 .parent = &pll3_pfd_508M,
2617 .enable_reg = MXC_CCM_CCGR5,
2618 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
2619 .enable = _clk_enable,
2620 .disable = _clk_disable,
2621 .set_parent = _clk_ssi3_set_parent,
2622 .set_rate = _clk_ssi3_set_rate,
2623 .round_rate = _clk_ssi_round_rate,
2624 .get_rate = _clk_ssi3_get_rate,
2625 #ifdef CONFIG_SND_MXC_SOC_IRAM
2626 .secondary = &ocram_clk,
2628 .secondary = &mmdc_ch0_axi_clk[0],
2632 static unsigned long _clk_ldb_di_round_rate(struct clk *clk,
2635 u32 parent_rate = clk_get_rate(clk->parent);
2637 if (rate * 7 <= parent_rate + parent_rate/20)
2638 return parent_rate / 7;
2640 return 2 * parent_rate / 7;
2643 static unsigned long _clk_ldb_di0_get_rate(struct clk *clk)
2647 div = __raw_readl(MXC_CCM_CSCMR2) &
2648 MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
2651 return clk_get_rate(clk->parent) / 7;
2653 return (2 * clk_get_rate(clk->parent)) / 7;
2656 static int _clk_ldb_di0_set_rate(struct clk *clk, unsigned long rate)
2659 u32 parent_rate = clk_get_rate(clk->parent);
2661 if (rate * 7 <= parent_rate + parent_rate/20) {
2663 rate = parent_rate / 7;
2665 rate = 2 * parent_rate / 7;
2667 reg = __raw_readl(MXC_CCM_CSCMR2);
2669 reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
2671 reg &= ~MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
2673 __raw_writel(reg, MXC_CCM_CSCMR2);
2678 static int _clk_ldb_di0_set_parent(struct clk *clk, struct clk *parent)
2682 reg = __raw_readl(MXC_CCM_CS2CDR)
2683 & ~MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK;
2685 mux = _get_mux6(parent, &pll5_video_main_clk,
2686 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M,
2687 &pll3_usb_otg_main_clk, NULL);
2688 reg |= (mux << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET);
2690 __raw_writel(reg, MXC_CCM_CS2CDR);
2695 static struct clk ldb_di0_clk = {
2696 __INIT_CLK_DEBUG(ldb_di0_clk)
2698 .parent = &pll3_pfd_540M,
2699 .enable_reg = MXC_CCM_CCGR3,
2700 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
2701 .enable = _clk_enable,
2702 .disable = _clk_disable,
2703 .set_parent = _clk_ldb_di0_set_parent,
2704 .set_rate = _clk_ldb_di0_set_rate,
2705 .round_rate = _clk_ldb_di_round_rate,
2706 .get_rate = _clk_ldb_di0_get_rate,
2707 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2710 static unsigned long _clk_ldb_di1_get_rate(struct clk *clk)
2714 div = __raw_readl(MXC_CCM_CSCMR2) &
2715 MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
2718 return clk_get_rate(clk->parent) / 7;
2720 return (2 * clk_get_rate(clk->parent)) / 7;
2723 static int _clk_ldb_di1_set_rate(struct clk *clk, unsigned long rate)
2726 u32 parent_rate = clk_get_rate(clk->parent);
2728 if (rate * 7 <= parent_rate + parent_rate/20) {
2730 rate = parent_rate / 7;
2732 rate = 2 * parent_rate / 7;
2734 reg = __raw_readl(MXC_CCM_CSCMR2);
2736 reg |= MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
2738 reg &= ~MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
2740 __raw_writel(reg, MXC_CCM_CSCMR2);
2745 static int _clk_ldb_di1_set_parent(struct clk *clk, struct clk *parent)
2749 reg = __raw_readl(MXC_CCM_CS2CDR)
2750 & ~MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK;
2752 mux = _get_mux6(parent, &pll5_video_main_clk,
2753 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M,
2754 &pll3_usb_otg_main_clk, NULL);
2755 reg |= (mux << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
2757 __raw_writel(reg, MXC_CCM_CS2CDR);
2762 static struct clk ldb_di1_clk = {
2763 __INIT_CLK_DEBUG(ldb_di1_clk)
2765 .parent = &pll3_pfd_540M,
2766 .enable_reg = MXC_CCM_CCGR3,
2767 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
2768 .enable = _clk_enable,
2769 .disable = _clk_disable,
2770 .set_parent = _clk_ldb_di1_set_parent,
2771 .set_rate = _clk_ldb_di1_set_rate,
2772 .round_rate = _clk_ldb_di_round_rate,
2773 .get_rate = _clk_ldb_di1_get_rate,
2774 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2778 static unsigned long _clk_ipu_di_round_rate(struct clk *clk,
2782 u32 parent_rate = clk_get_rate(clk->parent);
2784 if ((clk->parent == &ldb_di0_clk) ||
2785 (clk->parent == &ldb_di1_clk))
2788 div = parent_rate / rate;
2789 /* Round to closest divisor */
2790 if ((parent_rate % rate) > (rate / 2))
2793 /* Make sure rate is not greater than the maximum value for the clock.
2794 * Also prevent a div of 0.
2802 return parent_rate / div;
2805 static unsigned long _clk_ipu1_di0_get_rate(struct clk *clk)
2809 if ((clk->parent == &ldb_di0_clk) ||
2810 (clk->parent == &ldb_di1_clk))
2811 return clk_get_rate(clk->parent);
2813 reg = __raw_readl(MXC_CCM_CHSCCDR);
2815 div = ((reg & MXC_CCM_CHSCCDR_IPU1_DI0_PODF_MASK) >>
2816 MXC_CCM_CHSCCDR_IPU1_DI0_PODF_OFFSET) + 1;
2818 return clk_get_rate(clk->parent) / div;
2821 static int _clk_ipu1_di0_set_rate(struct clk *clk, unsigned long rate)
2824 u32 parent_rate = clk_get_rate(clk->parent);
2826 if ((clk->parent == &ldb_di0_clk) ||
2827 (clk->parent == &ldb_di1_clk)) {
2828 if (parent_rate == rate)
2834 div = parent_rate / rate;
2837 if (((parent_rate / div) != rate) || (div > 8))
2840 reg = __raw_readl(MXC_CCM_CHSCCDR);
2841 reg &= ~MXC_CCM_CHSCCDR_IPU1_DI0_PODF_MASK;
2842 reg |= (div - 1) << MXC_CCM_CHSCCDR_IPU1_DI0_PODF_OFFSET;
2843 __raw_writel(reg, MXC_CCM_CHSCCDR);
2849 static int _clk_ipu1_di0_set_parent(struct clk *clk, struct clk *parent)
2853 if (parent == &ldb_di0_clk)
2855 else if (parent == &ldb_di1_clk)
2858 reg = __raw_readl(MXC_CCM_CHSCCDR)
2859 & ~MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_MASK;
2861 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2862 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
2863 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
2864 reg |= (mux << MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_OFFSET);
2866 __raw_writel(reg, MXC_CCM_CHSCCDR);
2868 /* Derive clock from divided pre-muxed ipu1_di0 clock.*/
2872 reg = __raw_readl(MXC_CCM_CHSCCDR)
2873 & ~MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_MASK;
2874 __raw_writel(reg | (mux << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET),
2880 static unsigned long _clk_ipu1_di1_get_rate(struct clk *clk)
2884 if ((clk->parent == &ldb_di0_clk) ||
2885 (clk->parent == &ldb_di1_clk))
2886 return clk_get_rate(clk->parent);
2888 reg = __raw_readl(MXC_CCM_CHSCCDR);
2890 div = ((reg & MXC_CCM_CHSCCDR_IPU1_DI1_PODF_MASK)
2891 >> MXC_CCM_CHSCCDR_IPU1_DI1_PODF_OFFSET) + 1;
2893 return clk_get_rate(clk->parent) / div;
2896 static int _clk_ipu1_di1_set_rate(struct clk *clk, unsigned long rate)
2899 u32 parent_rate = clk_get_rate(clk->parent);
2901 if ((clk->parent == &ldb_di0_clk) ||
2902 (clk->parent == &ldb_di1_clk)) {
2903 if (parent_rate == rate)
2909 div = parent_rate / rate;
2912 if (((parent_rate / div) != rate) || (div > 8))
2915 reg = __raw_readl(MXC_CCM_CHSCCDR);
2916 reg &= ~MXC_CCM_CHSCCDR_IPU1_DI1_PODF_MASK;
2917 reg |= (div - 1) << MXC_CCM_CHSCCDR_IPU1_DI1_PODF_OFFSET;
2918 __raw_writel(reg, MXC_CCM_CHSCCDR);
2924 static int _clk_ipu1_di1_set_parent(struct clk *clk, struct clk *parent)
2928 if (parent == &ldb_di0_clk)
2930 else if (parent == &ldb_di1_clk)
2933 reg = __raw_readl(MXC_CCM_CHSCCDR)
2934 & ~MXC_CCM_CHSCCDR_IPU1_DI1_PRE_CLK_SEL_MASK;
2936 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2937 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
2938 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
2939 reg |= (mux << MXC_CCM_CHSCCDR_IPU1_DI1_PRE_CLK_SEL_OFFSET);
2941 __raw_writel(reg, MXC_CCM_CHSCCDR);
2943 /* Derive clock from divided pre-muxed ipu1_di0 clock.*/
2946 reg = __raw_readl(MXC_CCM_CHSCCDR)
2947 & ~MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_MASK;
2948 __raw_writel(reg | (mux << MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET),
2954 static struct clk ipu1_di_clk[] = {
2956 __INIT_CLK_DEBUG(ipu1_di_clk_0)
2958 .parent = &pll5_video_main_clk,
2959 .enable_reg = MXC_CCM_CCGR3,
2960 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
2961 .enable = _clk_enable,
2962 .disable = _clk_disable,
2963 .set_parent = _clk_ipu1_di0_set_parent,
2964 .set_rate = _clk_ipu1_di0_set_rate,
2965 .round_rate = _clk_ipu_di_round_rate,
2966 .get_rate = _clk_ipu1_di0_get_rate,
2967 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2970 __INIT_CLK_DEBUG(ipu1_di_clk_1)
2972 .parent = &pll5_video_main_clk,
2973 .enable_reg = MXC_CCM_CCGR3,
2974 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
2975 .enable = _clk_enable,
2976 .disable = _clk_disable,
2977 .set_parent = _clk_ipu1_di1_set_parent,
2978 .set_rate = _clk_ipu1_di1_set_rate,
2979 .round_rate = _clk_ipu_di_round_rate,
2980 .get_rate = _clk_ipu1_di1_get_rate,
2981 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2985 static unsigned long _clk_ipu2_di0_get_rate(struct clk *clk)
2989 if ((clk->parent == &ldb_di0_clk) ||
2990 (clk->parent == &ldb_di1_clk))
2991 return clk_get_rate(clk->parent);
2993 reg = __raw_readl(MXC_CCM_CSCDR2);
2995 div = ((reg & MXC_CCM_CSCDR2_IPU2_DI0_PODF_MASK) >>
2996 MXC_CCM_CSCDR2_IPU2_DI0_PODF_OFFSET) + 1;
2998 return clk_get_rate(clk->parent) / div;
3001 static int _clk_ipu2_di0_set_rate(struct clk *clk, unsigned long rate)
3004 u32 parent_rate = clk_get_rate(clk->parent);
3006 if ((clk->parent == &ldb_di0_clk) ||
3007 (clk->parent == &ldb_di1_clk)) {
3008 if (parent_rate == rate)
3014 div = parent_rate / rate;
3017 if (((parent_rate / div) != rate) || (div > 8))
3020 reg = __raw_readl(MXC_CCM_CSCDR2);
3021 reg &= ~MXC_CCM_CSCDR2_IPU2_DI0_PODF_MASK;
3022 reg |= (div - 1) << MXC_CCM_CSCDR2_IPU2_DI0_PODF_OFFSET;
3023 __raw_writel(reg, MXC_CCM_CSCDR2);
3028 static int _clk_ipu2_di0_set_parent(struct clk *clk, struct clk *parent)
3032 if (parent == &ldb_di0_clk)
3034 else if (parent == &ldb_di1_clk)
3037 reg = __raw_readl(MXC_CCM_CSCDR2)
3038 & ~MXC_CCM_CSCDR2_IPU2_DI0_PRE_CLK_SEL_MASK;
3040 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
3041 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
3042 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
3043 reg |= (mux << MXC_CCM_CSCDR2_IPU2_DI0_PRE_CLK_SEL_OFFSET);
3045 __raw_writel(reg, MXC_CCM_CSCDR2);
3047 /* Derive clock from divided pre-muxed ipu2_di0 clock.*/
3050 reg = __raw_readl(MXC_CCM_CSCDR2)
3051 & ~MXC_CCM_CSCDR2_IPU2_DI0_CLK_SEL_MASK;
3052 __raw_writel(reg | (mux << MXC_CCM_CSCDR2_IPU2_DI0_CLK_SEL_OFFSET),
3058 static unsigned long _clk_ipu2_di1_get_rate(struct clk *clk)
3062 if ((clk->parent == &ldb_di0_clk) ||
3063 (clk->parent == &ldb_di1_clk))
3064 return clk_get_rate(clk->parent);
3066 reg = __raw_readl(MXC_CCM_CSCDR2);
3068 div = ((reg & MXC_CCM_CSCDR2_IPU2_DI1_PODF_MASK)
3069 >> MXC_CCM_CSCDR2_IPU2_DI1_PODF_OFFSET) + 1;
3071 return clk_get_rate(clk->parent) / div;
3074 static int _clk_ipu2_di1_set_rate(struct clk *clk, unsigned long rate)
3077 u32 parent_rate = clk_get_rate(clk->parent);
3079 if ((clk->parent == &ldb_di0_clk) ||
3080 (clk->parent == &ldb_di1_clk)) {
3081 if (parent_rate == rate)
3087 div = parent_rate / rate;
3090 if (((parent_rate / div) != rate) || (div > 8))
3093 reg = __raw_readl(MXC_CCM_CSCDR2);
3094 reg &= ~MXC_CCM_CSCDR2_IPU2_DI1_PODF_MASK;
3095 reg |= (div - 1) << MXC_CCM_CSCDR2_IPU2_DI1_PODF_OFFSET;
3096 __raw_writel(reg, MXC_CCM_CSCDR2);
3101 static int _clk_ipu2_di1_set_parent(struct clk *clk, struct clk *parent)
3105 if (parent == &ldb_di0_clk)
3107 else if (parent == &ldb_di1_clk)
3110 reg = __raw_readl(MXC_CCM_CSCDR2)
3111 & ~MXC_CCM_CSCDR2_IPU2_DI1_PRE_CLK_SEL_MASK;
3113 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
3114 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
3115 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
3116 reg |= (mux << MXC_CCM_CSCDR2_IPU2_DI1_PRE_CLK_SEL_OFFSET);
3118 __raw_writel(reg, MXC_CCM_CSCDR2);
3120 /* Derive clock from divided pre-muxed ipu1_di0 clock.*/
3123 reg = __raw_readl(MXC_CCM_CSCDR2)
3124 & ~MXC_CCM_CSCDR2_IPU2_DI1_CLK_SEL_MASK;
3125 __raw_writel(reg | (mux << MXC_CCM_CSCDR2_IPU2_DI1_CLK_SEL_OFFSET),
3131 static struct clk ipu2_di_clk[] = {
3133 __INIT_CLK_DEBUG(ipu2_di_clk_0)
3135 .parent = &pll5_video_main_clk,
3136 .enable_reg = MXC_CCM_CCGR3,
3137 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
3138 .enable = _clk_enable,
3139 .disable = _clk_disable,
3140 .set_parent = _clk_ipu2_di0_set_parent,
3141 .set_rate = _clk_ipu2_di0_set_rate,
3142 .round_rate = _clk_ipu_di_round_rate,
3143 .get_rate = _clk_ipu2_di0_get_rate,
3144 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3147 __INIT_CLK_DEBUG(ipu2_di_clk_1)
3149 .parent = &pll5_video_main_clk,
3150 .enable_reg = MXC_CCM_CCGR3,
3151 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
3152 .enable = _clk_enable,
3153 .disable = _clk_disable,
3154 .set_parent = _clk_ipu2_di1_set_parent,
3155 .set_rate = _clk_ipu2_di1_set_rate,
3156 .round_rate = _clk_ipu_di_round_rate,
3157 .get_rate = _clk_ipu2_di1_get_rate,
3158 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3162 static unsigned long _clk_can_root_round_rate(struct clk *clk,
3166 u32 parent_rate = clk_get_rate(clk->parent);
3168 div = parent_rate / rate;
3170 /* Make sure rate is not greater than the maximum value for the clock.
3171 * Also prevent a div of 0.
3179 return parent_rate / div;
3182 static int _clk_can_root_set_rate(struct clk *clk, unsigned long rate)
3185 u32 parent_rate = clk_get_rate(clk->parent);
3187 div = parent_rate / rate;
3190 if (((parent_rate / div) != rate) || (div > 64))
3193 reg = __raw_readl(MXC_CCM_CSCMR2) & MXC_CCM_CSCMR2_CAN_CLK_PODF_MASK;
3194 reg |= ((div - 1) << MXC_CCM_CSCMR2_CAN_CLK_PODF_OFFSET);
3196 __raw_writel(reg, MXC_CCM_CSCMR2);
3201 static unsigned long _clk_can_root_get_rate(struct clk *clk)
3206 reg = __raw_readl(MXC_CCM_CSCMR2) & MXC_CCM_CSCMR2_CAN_CLK_PODF_MASK;
3207 div = (reg >> MXC_CCM_CSCMR2_CAN_CLK_PODF_OFFSET) + 1;
3208 val = clk_get_rate(clk->parent) / div;
3213 static struct clk can_clk_root = {
3214 __INIT_CLK_DEBUG(can_clk_root)
3215 .parent = &pll3_60M,
3216 .set_rate = _clk_can_root_set_rate,
3217 .get_rate = _clk_can_root_get_rate,
3218 .round_rate = _clk_can_root_round_rate,
3221 static struct clk can2_clk[] = {
3223 __INIT_CLK_DEBUG(can2_module_clk)
3225 .parent = &can_clk_root,
3226 .enable_reg = MXC_CCM_CCGR0,
3227 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
3228 .enable = _clk_enable,
3229 .disable = _clk_disable,
3230 .secondary = &can2_clk[1],
3231 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3234 __INIT_CLK_DEBUG(can2_serial_clk)
3236 .parent = &can_clk_root,
3237 .enable_reg = MXC_CCM_CCGR0,
3238 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
3239 .enable = _clk_enable,
3240 .disable = _clk_disable,
3245 static struct clk can1_clk[] = {
3247 __INIT_CLK_DEBUG(can1_module_clk)
3249 .parent = &can_clk_root,
3250 .enable_reg = MXC_CCM_CCGR0,
3251 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
3252 .enable = _clk_enable,
3253 .disable = _clk_disable,
3254 .secondary = &can1_clk[1],
3255 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3258 __INIT_CLK_DEBUG(can1_serial_clk)
3260 .parent = &can_clk_root,
3261 .enable_reg = MXC_CCM_CCGR0,
3262 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
3263 .enable = _clk_enable,
3264 .disable = _clk_disable,
3268 static unsigned long _clk_spdif_round_rate(struct clk *clk,
3272 u32 parent_rate = clk_get_rate(clk->parent);
3273 u32 div = parent_rate / rate;
3275 if (parent_rate % rate)
3278 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3280 return parent_rate / (pre * post);
3283 static int _clk_spdif0_set_parent(struct clk *clk, struct clk *parent)
3287 reg = __raw_readl(MXC_CCM_CDCDR)
3288 & ~MXC_CCM_CDCDR_SPDIF0_CLK_SEL_MASK;
3290 mux = _get_mux6(parent, &pll4_audio_main_clk,
3291 &pll3_pfd_508M, &pll3_pfd_454M,
3292 &pll3_sw_clk, NULL, NULL);
3293 reg |= mux << MXC_CCM_CDCDR_SPDIF0_CLK_SEL_OFFSET;
3295 __raw_writel(reg, MXC_CCM_CDCDR);
3300 static unsigned long _clk_spdif0_get_rate(struct clk *clk)
3302 u32 reg, pred, podf;
3304 reg = __raw_readl(MXC_CCM_CDCDR);
3306 pred = ((reg & MXC_CCM_CDCDR_SPDIF0_CLK_PRED_MASK)
3307 >> MXC_CCM_CDCDR_SPDIF0_CLK_PRED_OFFSET) + 1;
3308 podf = ((reg & MXC_CCM_CDCDR_SPDIF0_CLK_PODF_MASK)
3309 >> MXC_CCM_CDCDR_SPDIF0_CLK_PODF_OFFSET) + 1;
3311 return clk_get_rate(clk->parent) / (pred * podf);
3314 static int _clk_spdif0_set_rate(struct clk *clk, unsigned long rate)
3316 u32 reg, div, pre, post;
3317 u32 parent_rate = clk_get_rate(clk->parent);
3319 div = parent_rate / rate;
3322 if (((parent_rate / div) != rate) || div > 64)
3325 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3327 reg = __raw_readl(MXC_CCM_CDCDR);
3328 reg &= ~(MXC_CCM_CDCDR_SPDIF0_CLK_PRED_MASK|
3329 MXC_CCM_CDCDR_SPDIF0_CLK_PODF_MASK);
3330 reg |= (post - 1) << MXC_CCM_CDCDR_SPDIF0_CLK_PODF_OFFSET;
3331 reg |= (pre - 1) << MXC_CCM_CDCDR_SPDIF0_CLK_PRED_OFFSET;
3333 __raw_writel(reg, MXC_CCM_CDCDR);
3338 static struct clk spdif0_clk[] = {
3340 __INIT_CLK_DEBUG(spdif0_clk_0)
3342 .parent = &pll3_sw_clk,
3343 .enable = _clk_enable,
3344 .enable_reg = MXC_CCM_CCGR5,
3345 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
3346 .disable = _clk_disable,
3347 .secondary = &spdif0_clk[1],
3348 .set_rate = _clk_spdif0_set_rate,
3349 .get_rate = _clk_spdif0_get_rate,
3350 .set_parent = _clk_spdif0_set_parent,
3351 .round_rate = _clk_spdif_round_rate,
3352 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3355 __INIT_CLK_DEBUG(spdif0_clk_1)
3358 .secondary = &spba_clk,
3362 static unsigned long _clk_esai_round_rate(struct clk *clk,
3366 u32 parent_rate = clk_get_rate(clk->parent);
3367 u32 div = parent_rate / rate;
3369 if (parent_rate % rate)
3372 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3374 return parent_rate / (pre * post);
3377 static int _clk_esai_set_parent(struct clk *clk, struct clk *parent)
3381 reg = __raw_readl(MXC_CCM_CSCMR2) & ~MXC_CCM_CSCMR2_ESAI_CLK_SEL_MASK;
3383 mux = _get_mux6(parent, &pll4_audio_main_clk, &pll3_pfd_508M,
3384 &pll3_pfd_454M, &pll3_sw_clk, NULL, NULL);
3385 reg |= mux << MXC_CCM_CSCMR2_ESAI_CLK_SEL_OFFSET;
3387 __raw_writel(reg, MXC_CCM_CSCMR2);
3392 static unsigned long _clk_esai_get_rate(struct clk *clk)
3394 u32 reg, pred, podf;
3396 reg = __raw_readl(MXC_CCM_CS1CDR);
3398 pred = ((reg & MXC_CCM_CS1CDR_ESAI_CLK_PRED_MASK)
3399 >> MXC_CCM_CS1CDR_ESAI_CLK_PRED_OFFSET) + 1;
3400 podf = ((reg & MXC_CCM_CS1CDR_ESAI_CLK_PODF_MASK)
3401 >> MXC_CCM_CS1CDR_ESAI_CLK_PODF_OFFSET) + 1;
3403 return clk_get_rate(clk->parent) / (pred * podf);
3406 static int _clk_esai_set_rate(struct clk *clk, unsigned long rate)
3408 u32 reg, div, pre, post;
3409 u32 parent_rate = clk_get_rate(clk->parent);
3411 div = parent_rate / rate;
3414 if (((parent_rate / div) != rate) || div > 64)
3417 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3419 reg = __raw_readl(MXC_CCM_CS1CDR);
3420 reg &= ~(MXC_CCM_CS1CDR_ESAI_CLK_PRED_MASK|
3421 MXC_CCM_CS1CDR_ESAI_CLK_PODF_MASK);
3422 reg |= (post - 1) << MXC_CCM_CS1CDR_ESAI_CLK_PODF_OFFSET;
3423 reg |= (pre - 1) << MXC_CCM_CS1CDR_ESAI_CLK_PRED_OFFSET;
3425 __raw_writel(reg, MXC_CCM_CS1CDR);
3430 static struct clk esai_clk = {
3431 __INIT_CLK_DEBUG(esai_clk)
3433 .parent = &pll3_sw_clk,
3434 .secondary = &spba_clk,
3435 .enable_reg = MXC_CCM_CCGR1,
3436 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
3437 .enable = _clk_enable,
3438 .disable = _clk_disable,
3439 .set_rate = _clk_esai_set_rate,
3440 .get_rate = _clk_esai_get_rate,
3441 .set_parent = _clk_esai_set_parent,
3442 .round_rate = _clk_esai_round_rate,
3445 static int _clk_enet_enable(struct clk *clk)
3449 /* Enable ENET ref clock */
3450 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
3451 reg &= ~ANADIG_PLL_BYPASS;
3452 reg |= ANADIG_PLL_ENABLE;
3453 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
3459 static void _clk_enet_disable(struct clk *clk)
3465 /* Enable ENET ref clock */
3466 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
3467 reg |= ANADIG_PLL_BYPASS;
3468 reg &= ~ANADIG_PLL_ENABLE;
3469 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
3472 static int _clk_enet_set_rate(struct clk *clk, unsigned long rate)
3474 unsigned int reg, div = 1;
3492 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
3493 reg &= ~ANADIG_PLL_ENET_DIV_SELECT_MASK;
3494 reg |= (div << ANADIG_PLL_ENET_DIV_SELECT_OFFSET);
3495 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
3500 static unsigned long _clk_enet_get_rate(struct clk *clk)
3504 div = (__raw_readl(PLL8_ENET_BASE_ADDR))
3505 & ANADIG_PLL_ENET_DIV_SELECT_MASK;
3522 return 500000000 / div;
3525 static struct clk enet_clk[] = {
3527 __INIT_CLK_DEBUG(enet_clk)
3529 .parent = &pll8_enet_main_clk,
3530 .enable_reg = MXC_CCM_CCGR1,
3531 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
3532 .enable = _clk_enet_enable,
3533 .disable = _clk_enet_disable,
3534 .set_rate = _clk_enet_set_rate,
3535 .get_rate = _clk_enet_get_rate,
3536 .secondary = &enet_clk[1],
3537 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3540 .parent = &mmdc_ch0_axi_clk[0],
3541 .secondary = &mx6per1_clk,
3545 static struct clk ecspi_clk[] = {
3547 __INIT_CLK_DEBUG(ecspi0_clk)
3549 .parent = &pll3_60M,
3550 .secondary = &spba_clk,
3551 .enable_reg = MXC_CCM_CCGR1,
3552 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
3553 .enable = _clk_enable,
3554 .disable = _clk_disable,
3557 __INIT_CLK_DEBUG(ecspi1_clk)
3559 .parent = &pll3_60M,
3560 .secondary = &spba_clk,
3561 .enable_reg = MXC_CCM_CCGR1,
3562 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
3563 .enable = _clk_enable,
3564 .disable = _clk_disable,
3567 __INIT_CLK_DEBUG(ecspi2_clk)
3569 .parent = &pll3_60M,
3570 .secondary = &spba_clk,
3571 .enable_reg = MXC_CCM_CCGR1,
3572 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
3573 .enable = _clk_enable,
3574 .disable = _clk_disable,
3577 __INIT_CLK_DEBUG(ecspi3_clk)
3579 .parent = &pll3_60M,
3580 .secondary = &spba_clk,
3581 .enable_reg = MXC_CCM_CCGR1,
3582 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
3583 .enable = _clk_enable,
3584 .disable = _clk_disable,
3587 __INIT_CLK_DEBUG(ecspi4_clk)
3589 .parent = &pll3_60M,
3590 .secondary = &spba_clk,
3591 .enable_reg = MXC_CCM_CCGR1,
3592 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
3593 .enable = _clk_enable,
3594 .disable = _clk_disable,
3598 static unsigned long _clk_emi_slow_round_rate(struct clk *clk,
3602 u32 parent_rate = clk_get_rate(clk->parent);
3604 div = parent_rate / rate;
3606 /* Make sure rate is not greater than the maximum value for the clock.
3607 * Also prevent a div of 0.
3615 return parent_rate / div;
3618 static int _clk_emi_slow_set_parent(struct clk *clk, struct clk *parent)
3621 u32 reg = __raw_readl(MXC_CCM_CSCMR1)
3622 & ~MXC_CCM_CSCMR1_ACLK_EMI_SLOW_MASK;
3624 mux = _get_mux6(parent, &axi_clk, &pll3_usb_otg_main_clk,
3625 &pll2_pfd_400M, &pll2_pfd_352M, NULL, NULL);
3626 reg |= (mux << MXC_CCM_CSCMR1_ACLK_EMI_SLOW_OFFSET);
3627 __raw_writel(reg, MXC_CCM_CSCMR1);
3632 static unsigned long _clk_emi_slow_get_rate(struct clk *clk)
3636 reg = __raw_readl(MXC_CCM_CSCMR1);
3637 div = ((reg & MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK) >>
3638 MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET) + 1;
3640 return clk_get_rate(clk->parent) / div;
3643 static int _clk_emi_slow_set_rate(struct clk *clk, unsigned long rate)
3646 u32 parent_rate = clk_get_rate(clk->parent);
3648 div = parent_rate / rate;
3651 if (((parent_rate / div) != rate) || (div > 8))
3654 reg = __raw_readl(MXC_CCM_CSCMR1);
3655 reg &= ~MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK;
3656 reg |= (div - 1) << MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET;
3657 __raw_writel(reg, MXC_CCM_CSCMR1);
3662 static struct clk emi_slow_clk = {
3663 __INIT_CLK_DEBUG(emi_slow_clk)
3666 .enable_reg = MXC_CCM_CCGR6,
3667 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
3668 .enable = _clk_enable,
3669 .disable = _clk_disable,
3670 .set_rate = _clk_emi_slow_set_rate,
3671 .get_rate = _clk_emi_slow_get_rate,
3672 .round_rate = _clk_emi_slow_round_rate,
3673 .set_parent = _clk_emi_slow_set_parent,
3676 static unsigned long _clk_emi_round_rate(struct clk *clk,
3680 u32 parent_rate = clk_get_rate(clk->parent);
3682 div = parent_rate / rate;
3684 /* Make sure rate is not greater than the maximum value for the clock.
3685 * Also prevent a div of 0.
3693 return parent_rate / div;
3696 static int _clk_emi_set_parent(struct clk *clk, struct clk *parent)
3699 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_ACLK_EMI_MASK;
3701 mux = _get_mux6(parent, &axi_clk, &pll3_usb_otg_main_clk,
3702 &pll2_pfd_400M, &pll2_pfd_352M, NULL, NULL);
3703 reg |= (mux << MXC_CCM_CSCMR1_ACLK_EMI_OFFSET);
3704 __raw_writel(reg, MXC_CCM_CSCMR1);
3709 static unsigned long _clk_emi_get_rate(struct clk *clk)
3713 reg = __raw_readl(MXC_CCM_CSCMR1);
3714 div = ((reg & MXC_CCM_CSCMR1_ACLK_EMI_PODF_MASK) >>
3715 MXC_CCM_CSCMR1_ACLK_EMI_PODF_OFFSET) + 1;
3717 return clk_get_rate(clk->parent) / div;
3720 static int _clk_emi_set_rate(struct clk *clk, unsigned long rate)
3723 u32 parent_rate = clk_get_rate(clk->parent);
3725 div = parent_rate / rate;
3728 if (((parent_rate / div) != rate) || (div > 8))
3731 reg = __raw_readl(MXC_CCM_CSCMR1);
3732 reg &= ~MXC_CCM_CSCMR1_ACLK_EMI_PODF_MASK;
3733 reg |= (div - 1) << MXC_CCM_CSCMR1_ACLK_EMI_PODF_OFFSET;
3734 __raw_writel(reg, MXC_CCM_CSCMR1);
3739 static struct clk emi_clk = {
3740 __INIT_CLK_DEBUG(emi_clk)
3743 .set_rate = _clk_emi_set_rate,
3744 .get_rate = _clk_emi_get_rate,
3745 .round_rate = _clk_emi_round_rate,
3746 .set_parent = _clk_emi_set_parent,
3749 static unsigned long _clk_enfc_round_rate(struct clk *clk,
3753 u32 parent_rate = clk_get_rate(clk->parent);
3754 u32 div = parent_rate / rate;
3756 if (parent_rate % rate)
3759 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
3761 return parent_rate / (pre * post);
3764 static int _clk_enfc_set_parent(struct clk *clk, struct clk *parent)
3768 reg = __raw_readl(MXC_CCM_CS2CDR)
3769 & ~MXC_CCM_CS2CDR_ENFC_CLK_SEL_MASK;
3771 mux = _get_mux6(parent, &pll2_pfd_352M,
3772 &pll2_528_bus_main_clk, &pll3_usb_otg_main_clk,
3773 &pll2_pfd_400M, NULL, NULL);
3774 reg |= mux << MXC_CCM_CS2CDR_ENFC_CLK_SEL_OFFSET;
3776 __raw_writel(reg, MXC_CCM_CS2CDR);
3781 static unsigned long _clk_enfc_get_rate(struct clk *clk)
3783 u32 reg, pred, podf;
3785 reg = __raw_readl(MXC_CCM_CS2CDR);
3787 pred = ((reg & MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK)
3788 >> MXC_CCM_CS2CDR_ENFC_CLK_PRED_OFFSET) + 1;
3789 podf = ((reg & MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK)
3790 >> MXC_CCM_CS2CDR_ENFC_CLK_PODF_OFFSET) + 1;
3792 return clk_get_rate(clk->parent) / (pred * podf);
3795 static int _clk_enfc_set_rate(struct clk *clk, unsigned long rate)
3797 u32 reg, div, pre, post;
3798 u32 parent_rate = clk_get_rate(clk->parent);
3800 div = parent_rate / rate;
3803 if (((parent_rate / div) != rate) || div > 512)
3806 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
3808 reg = __raw_readl(MXC_CCM_CS2CDR);
3809 reg &= ~(MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK|
3810 MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK);
3811 reg |= (post - 1) << MXC_CCM_CS2CDR_ENFC_CLK_PODF_OFFSET;
3812 reg |= (pre - 1) << MXC_CCM_CS2CDR_ENFC_CLK_PRED_OFFSET;
3814 __raw_writel(reg, MXC_CCM_CS2CDR);
3819 static struct clk enfc_clk = {
3820 __INIT_CLK_DEBUG(enfc_clk)
3822 .parent = &pll2_pfd_352M,
3823 .enable_reg = MXC_CCM_CCGR2,
3824 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
3825 .enable = _clk_enable,
3826 .disable = _clk_disable,
3827 .set_rate = _clk_enfc_set_rate,
3828 .get_rate = _clk_enfc_get_rate,
3829 .round_rate = _clk_enfc_round_rate,
3830 .set_parent = _clk_enfc_set_parent,
3833 static unsigned long _clk_uart_round_rate(struct clk *clk,
3837 u32 parent_rate = clk_get_rate(clk->parent);
3839 div = parent_rate / rate;
3841 /* Make sure rate is not greater than the maximum value for the clock.
3842 * Also prevent a div of 0.
3850 return parent_rate / div;
3853 static int _clk_uart_set_rate(struct clk *clk, unsigned long rate)
3856 u32 parent_rate = clk_get_rate(clk->parent);
3858 div = parent_rate / rate;
3861 if (((parent_rate / div) != rate) || (div > 64))
3864 reg = __raw_readl(MXC_CCM_CSCDR1) & MXC_CCM_CSCDR1_UART_CLK_PODF_MASK;
3865 reg |= ((div - 1) << MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET);
3867 __raw_writel(reg, MXC_CCM_CSCDR1);
3872 static unsigned long _clk_uart_get_rate(struct clk *clk)
3877 reg = __raw_readl(MXC_CCM_CSCDR1) & MXC_CCM_CSCDR1_UART_CLK_PODF_MASK;
3878 div = (reg >> MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET) + 1;
3879 val = clk_get_rate(clk->parent) / div;
3884 static struct clk uart_clk[] = {
3886 __INIT_CLK_DEBUG(uart_clk)
3888 .parent = &pll3_80M,
3889 .enable_reg = MXC_CCM_CCGR5,
3890 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
3891 .enable = _clk_enable,
3892 .disable = _clk_disable,
3893 .secondary = &uart_clk[1],
3894 .set_rate = _clk_uart_set_rate,
3895 .get_rate = _clk_uart_get_rate,
3896 .round_rate = _clk_uart_round_rate,
3899 __INIT_CLK_DEBUG(uart_serial_clk)
3901 .enable_reg = MXC_CCM_CCGR5,
3902 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
3903 .enable = _clk_enable,
3904 .disable = _clk_disable,
3908 static unsigned long _clk_hsi_tx_round_rate(struct clk *clk,
3912 u32 parent_rate = clk_get_rate(clk->parent);
3914 div = parent_rate / rate;
3916 /* Make sure rate is not greater than the maximum value for the clock.
3917 * Also prevent a div of 0.
3925 return parent_rate / div;
3928 static int _clk_hsi_tx_set_parent(struct clk *clk, struct clk *parent)
3930 u32 reg = __raw_readl(MXC_CCM_CDCDR) & ~MXC_CCM_CDCDR_HSI_TX_CLK_SEL;
3932 if (parent == &pll2_pfd_400M)
3933 reg |= (MXC_CCM_CDCDR_HSI_TX_CLK_SEL);
3935 __raw_writel(reg, MXC_CCM_CDCDR);
3940 static unsigned long _clk_hsi_tx_get_rate(struct clk *clk)
3944 reg = __raw_readl(MXC_CCM_CDCDR);
3945 div = ((reg & MXC_CCM_CDCDR_HSI_TX_PODF_MASK) >>
3946 MXC_CCM_CDCDR_HSI_TX_PODF_OFFSET) + 1;
3948 return clk_get_rate(clk->parent) / div;
3951 static int _clk_hsi_tx_set_rate(struct clk *clk, unsigned long rate)
3954 u32 parent_rate = clk_get_rate(clk->parent);
3956 div = parent_rate / rate;
3959 if (((parent_rate / div) != rate) || (div > 8))
3962 reg = __raw_readl(MXC_CCM_CDCDR);
3963 reg &= ~MXC_CCM_CDCDR_HSI_TX_PODF_MASK;
3964 reg |= (div - 1) << MXC_CCM_CDCDR_HSI_TX_PODF_OFFSET;
3965 __raw_writel(reg, MXC_CCM_CDCDR);
3970 static struct clk hsi_tx_clk[] = {
3972 __INIT_CLK_DEBUG(hsi_tx_clk)
3974 .parent = &pll2_pfd_400M,
3975 .enable_reg = MXC_CCM_CCGR3,
3976 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
3977 .enable = _clk_enable,
3978 .disable = _clk_disable,
3979 .set_parent = _clk_hsi_tx_set_parent,
3980 .round_rate = _clk_hsi_tx_round_rate,
3981 .set_rate = _clk_hsi_tx_set_rate,
3982 .get_rate = _clk_hsi_tx_get_rate,
3983 .secondary = &hsi_tx_clk[1],
3984 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3987 .parent = &mx6per1_clk,
3988 .secondary = &mx6per2_clk,
3992 static struct clk mipi_pllref_clk = {
3993 __INIT_CLK_DEBUG(mipi_pllref_clk)
3995 .parent = &pll3_pfd_540M,
3996 .enable_reg = MXC_CCM_CCGR3,
3997 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
3998 .enable = _clk_enable,
3999 .disable = _clk_disable,
4002 static struct clk hdmi_clk[] = {
4004 __INIT_CLK_DEBUG(hdmi_isfr_clk)
4006 .parent = &pll3_pfd_540M,
4007 .enable_reg = MXC_CCM_CCGR2,
4008 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
4009 .enable = _clk_enable,
4010 .disable = _clk_disable,
4011 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4014 __INIT_CLK_DEBUG(hdmi_iahb_clk)
4017 .enable_reg = MXC_CCM_CCGR2,
4018 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4019 .enable = _clk_enable,
4020 .disable = _clk_disable,
4024 static struct clk caam_clk[] = {
4026 __INIT_CLK_DEBUG(caam_mem_clk)
4028 .enable_reg = MXC_CCM_CCGR0,
4029 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
4030 .enable = _clk_enable,
4031 .disable = _clk_disable,
4032 .secondary = &caam_clk[1],
4033 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4036 __INIT_CLK_DEBUG(caam_aclk_clk)
4038 .enable_reg = MXC_CCM_CCGR0,
4039 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
4040 .enable = _clk_enable,
4041 .disable = _clk_disable,
4042 .secondary = &caam_clk[2],
4045 __INIT_CLK_DEBUG(caam_ipg_clk)
4047 .enable_reg = MXC_CCM_CCGR0,
4048 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
4049 .enable = _clk_enable,
4050 .disable = _clk_disable,
4051 .parent = &mmdc_ch0_axi_clk[0],
4052 .secondary = &mx6per1_clk,
4056 static int _clk_asrc_serial_set_parent(struct clk *clk, struct clk *parent)
4060 reg = __raw_readl(MXC_CCM_CDCDR) & ~MXC_CCM_CDCDR_SPDIF1_CLK_SEL_MASK;
4062 mux = _get_mux6(parent, &pll4_audio_main_clk, &pll3_pfd_508M,
4063 &pll3_pfd_454M, &pll3_sw_clk, NULL, NULL);
4064 reg |= mux << MXC_CCM_CDCDR_SPDIF1_CLK_SEL_OFFSET;
4066 __raw_writel(reg, MXC_CCM_CDCDR);
4071 static unsigned long _clk_asrc_serial_get_rate(struct clk *clk)
4073 u32 reg, pred, podf;
4075 reg = __raw_readl(MXC_CCM_CDCDR);
4077 pred = ((reg & MXC_CCM_CDCDR_SPDIF1_CLK_PRED_MASK)
4078 >> MXC_CCM_CDCDR_SPDIF1_CLK_PRED_OFFSET) + 1;
4079 podf = ((reg & MXC_CCM_CDCDR_SPDIF1_CLK_PODF_MASK)
4080 >> MXC_CCM_CDCDR_SPDIF1_CLK_PODF_OFFSET) + 1;
4082 return clk_get_rate(clk->parent) / (pred * podf);
4085 static int _clk_asrc_serial_set_rate(struct clk *clk, unsigned long rate)
4087 u32 reg, div, pre, post;
4088 u32 parent_rate = clk_get_rate(clk->parent);
4090 div = parent_rate / rate;
4093 if (((parent_rate / div) != rate) || div > 64)
4096 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
4098 reg = __raw_readl(MXC_CCM_CDCDR);
4099 reg &= ~(MXC_CCM_CDCDR_SPDIF1_CLK_PRED_MASK|
4100 MXC_CCM_CDCDR_SPDIF1_CLK_PODF_MASK);
4101 reg |= (post - 1) << MXC_CCM_CDCDR_SPDIF1_CLK_PODF_OFFSET;
4102 reg |= (pre - 1) << MXC_CCM_CDCDR_SPDIF1_CLK_PRED_OFFSET;
4104 __raw_writel(reg, MXC_CCM_CDCDR);
4109 static unsigned long _clk_asrc_serial_round_rate(struct clk *clk,
4113 u32 parent_rate = clk_get_rate(clk->parent);
4114 u32 div = parent_rate / rate;
4116 if (parent_rate % rate)
4119 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
4121 return parent_rate / (pre * post);
4124 static struct clk asrc_clk[] = {
4126 __INIT_CLK_DEBUG(asrc_clk)
4128 .parent = &pll4_audio_main_clk,
4129 .enable_reg = MXC_CCM_CCGR0,
4130 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
4131 .enable = _clk_enable,
4132 .disable = _clk_disable,
4133 .secondary = &spba_clk,
4136 /*In the MX6 spec, asrc_serial_clk is listed as SPDIF1 clk
4137 * This clock can never be gated and does not have any
4138 * CCGR bits associated with it.
4140 __INIT_CLK_DEBUG(asrc_serial_clk)
4142 .parent = &pll3_sw_clk,
4143 .set_rate = _clk_asrc_serial_set_rate,
4144 .get_rate = _clk_asrc_serial_get_rate,
4145 .set_parent = _clk_asrc_serial_set_parent,
4146 .round_rate = _clk_asrc_serial_round_rate,
4150 static struct clk apbh_dma_clk = {
4151 __INIT_CLK_DEBUG(apbh_dma_clk)
4152 .parent = &usdhc3_clk,
4153 .secondary = &mx6per1_clk,
4154 .enable = _clk_enable,
4155 .disable = _clk_disable_inwait,
4156 .enable_reg = MXC_CCM_CCGR0,
4157 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
4160 static struct clk aips_tz2_clk = {
4161 __INIT_CLK_DEBUG(aips_tz2_clk)
4163 .enable_reg = MXC_CCM_CCGR0,
4164 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
4165 .enable = _clk_enable,
4166 .disable = _clk_disable_inwait,
4169 static struct clk aips_tz1_clk = {
4170 __INIT_CLK_DEBUG(aips_tz1_clk)
4172 .enable_reg = MXC_CCM_CCGR0,
4173 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4174 .enable = _clk_enable,
4175 .disable = _clk_disable_inwait,
4179 static struct clk openvg_axi_clk = {
4180 __INIT_CLK_DEBUG(openvg_axi_clk)
4181 .parent = &gpu2d_axi_clk,
4182 .enable = _clk_enable,
4183 .enable_reg = MXC_CCM_CCGR3,
4184 .enable_shift = MXC_CCM_CCGRx_CG15_OFFSET,
4185 .disable = _clk_disable,
4186 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4189 static unsigned long _clk_gpu3d_core_round_rate(struct clk *clk,
4193 u32 parent_rate = clk_get_rate(clk->parent);
4195 div = parent_rate / rate;
4197 /* Make sure rate is not greater than the maximum value for the clock.
4198 * Also prevent a div of 0.
4206 return parent_rate / div;
4209 static int _clk_gpu3d_core_set_parent(struct clk *clk, struct clk *parent)
4212 u32 reg = __raw_readl(MXC_CCM_CBCMR)
4213 & ~MXC_CCM_CBCMR_GPU3D_CORE_CLK_SEL_MASK;
4215 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
4216 &pll3_usb_otg_main_clk,
4217 &pll2_pfd_594M, &pll2_pfd_400M, NULL, NULL);
4218 reg |= (mux << MXC_CCM_CBCMR_GPU3D_CORE_CLK_SEL_OFFSET);
4219 __raw_writel(reg, MXC_CCM_CBCMR);
4224 static unsigned long _clk_gpu3d_core_get_rate(struct clk *clk)
4228 reg = __raw_readl(MXC_CCM_CBCMR);
4229 div = ((reg & MXC_CCM_CBCMR_GPU3D_CORE_PODF_MASK) >>
4230 MXC_CCM_CBCMR_GPU3D_CORE_PODF_OFFSET) + 1;
4232 return clk_get_rate(clk->parent) / div;
4235 static int _clk_gpu3d_core_set_rate(struct clk *clk, unsigned long rate)
4238 u32 parent_rate = clk_get_rate(clk->parent);
4240 div = parent_rate / rate;
4246 reg = __raw_readl(MXC_CCM_CBCMR);
4247 reg &= ~MXC_CCM_CBCMR_GPU3D_CORE_PODF_MASK;
4248 reg |= (div - 1) << MXC_CCM_CBCMR_GPU3D_CORE_PODF_OFFSET;
4249 __raw_writel(reg, MXC_CCM_CBCMR);
4254 static struct clk gpu3d_core_clk[] = {
4256 __INIT_CLK_DEBUG(gpu3d_core_clk)
4257 .parent = &pll2_pfd_594M,
4258 .enable = _clk_enable,
4259 .enable_reg = MXC_CCM_CCGR1,
4260 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
4261 .disable = _clk_disable,
4262 .set_parent = _clk_gpu3d_core_set_parent,
4263 .set_rate = _clk_gpu3d_core_set_rate,
4264 .get_rate = _clk_gpu3d_core_get_rate,
4265 .round_rate = _clk_gpu3d_core_round_rate,
4266 .secondary = &gpu3d_core_clk[1],
4267 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4270 .parent = &gpu3d_axi_clk,
4271 .secondary = &mx6fast1_clk,
4275 static unsigned long _clk_gpu2d_core_round_rate(struct clk *clk,
4279 u32 parent_rate = clk_get_rate(clk->parent);
4281 div = parent_rate / rate;
4283 /* Make sure rate is not greater than the maximum value for the clock.
4284 * Also prevent a div of 0.
4292 return parent_rate / div;
4295 static int _clk_gpu2d_core_set_parent(struct clk *clk, struct clk *parent)
4298 u32 reg = __raw_readl(MXC_CCM_CBCMR) &
4299 ~MXC_CCM_CBCMR_GPU2D_CLK_SEL_MASK;
4301 /*on mx6dl, 2d core clock sources from 3d shader core clock*/
4302 if (!cpu_is_mx6dl()) {
4303 mux = _get_mux6(parent, &axi_clk, &pll3_usb_otg_main_clk,
4304 &pll2_pfd_352M, &pll2_pfd_400M, NULL, NULL);
4305 reg |= (mux << MXC_CCM_CBCMR_GPU2D_CLK_SEL_OFFSET);
4306 __raw_writel(reg, MXC_CCM_CBCMR);
4312 static unsigned long _clk_gpu2d_core_get_rate(struct clk *clk)
4316 reg = __raw_readl(MXC_CCM_CBCMR);
4318 div = ((reg & MXC_CCM_CBCMR_GPU2D_CORE_PODF_MASK) >>
4319 MXC_CCM_CBCMR_GPU2D_CORE_PODF_OFFSET) + 1;
4320 else if (cpu_is_mx6dl())
4321 /* on i.mx6dl, gpu2d_core_clk source from gpu3d_shader_clk */
4322 return clk_get_rate(clk->parent);
4324 return clk_get_rate(clk->parent) / div;
4327 static int _clk_gpu2d_core_set_rate(struct clk *clk, unsigned long rate)
4330 u32 parent_rate = clk_get_rate(clk->parent);
4332 div = parent_rate / rate;
4335 if (((parent_rate / div) != rate) || (div > 8))
4338 reg = __raw_readl(MXC_CCM_CBCMR);
4339 reg &= ~MXC_CCM_CBCMR_GPU2D_CORE_PODF_MASK;
4340 reg |= (div - 1) << MXC_CCM_CBCMR_GPU2D_CORE_PODF_OFFSET;
4341 __raw_writel(reg, MXC_CCM_CBCMR);
4345 static struct clk gpu2d_core_clk[] = {
4347 __INIT_CLK_DEBUG(gpu2d_core_clk)
4348 .parent = &pll2_pfd_352M,
4349 .enable = _clk_enable,
4350 .enable_reg = MXC_CCM_CCGR1,
4351 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
4352 .disable = _clk_disable,
4353 .set_parent = _clk_gpu2d_core_set_parent,
4354 .set_rate = _clk_gpu2d_core_set_rate,
4355 .get_rate = _clk_gpu2d_core_get_rate,
4356 .round_rate = _clk_gpu2d_core_round_rate,
4357 .secondary = &gpu2d_core_clk[1],
4358 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4361 .parent = &gpu2d_axi_clk,
4362 .secondary = &mx6fast1_clk,
4366 static unsigned long _clk_gpu3d_shader_round_rate(struct clk *clk,
4370 u32 parent_rate = clk_get_rate(clk->parent);
4372 div = parent_rate / rate;
4374 /* Make sure rate is not greater than the maximum value for the clock.
4375 * Also prevent a div of 0.
4383 return parent_rate / div;
4386 static int _clk_gpu3d_shader_set_parent(struct clk *clk, struct clk *parent)
4389 u32 reg = __raw_readl(MXC_CCM_CBCMR)
4390 & ~MXC_CCM_CBCMR_GPU3D_SHADER_CLK_SEL_MASK;
4392 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
4393 &pll3_usb_otg_main_clk,
4394 &pll2_pfd_594M, &pll3_pfd_720M, NULL, NULL);
4395 reg |= (mux << MXC_CCM_CBCMR_GPU3D_SHADER_CLK_SEL_OFFSET);
4396 __raw_writel(reg, MXC_CCM_CBCMR);
4401 static unsigned long _clk_gpu3d_shader_get_rate(struct clk *clk)
4405 reg = __raw_readl(MXC_CCM_CBCMR);
4406 div = ((reg & MXC_CCM_CBCMR_GPU3D_SHADER_PODF_MASK) >>
4407 MXC_CCM_CBCMR_GPU3D_SHADER_PODF_OFFSET) + 1;
4409 return clk_get_rate(clk->parent) / div;
4412 static int _clk_gpu3d_shader_set_rate(struct clk *clk, unsigned long rate)
4415 u32 parent_rate = clk_get_rate(clk->parent);
4417 div = parent_rate / rate;
4423 reg = __raw_readl(MXC_CCM_CBCMR);
4424 reg &= ~MXC_CCM_CBCMR_GPU3D_SHADER_PODF_MASK;
4425 reg |= (div - 1) << MXC_CCM_CBCMR_GPU3D_SHADER_PODF_OFFSET;
4426 __raw_writel(reg, MXC_CCM_CBCMR);
4432 static struct clk gpu3d_shader_clk = {
4433 __INIT_CLK_DEBUG(gpu3d_shader_clk)
4434 .parent = &pll3_pfd_720M,
4435 .secondary = &mmdc_ch0_axi_clk[0],
4436 .enable = _clk_enable,
4437 .enable_reg = MXC_CCM_CCGR1,
4438 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
4439 .disable = _clk_disable,
4440 .set_parent = _clk_gpu3d_shader_set_parent,
4441 .set_rate = _clk_gpu3d_shader_set_rate,
4442 .get_rate = _clk_gpu3d_shader_get_rate,
4443 .round_rate = _clk_gpu3d_shader_round_rate,
4444 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4447 /* set the parent by the ipcg table */
4448 static struct clk gpmi_nand_clk[] = {
4450 __INIT_CLK_DEBUG(gpmi_io_clk)
4451 .parent = &enfc_clk,
4452 .secondary = &gpmi_nand_clk[1],
4453 .enable = _clk_enable,
4454 .enable_reg = MXC_CCM_CCGR4,
4455 .enable_shift = MXC_CCM_CCGRx_CG14_OFFSET,
4456 .disable = _clk_disable,
4458 { /* gpmi_apb_clk */
4459 __INIT_CLK_DEBUG(gpmi_apb_clk)
4460 .parent = &usdhc3_clk,
4461 .secondary = &gpmi_nand_clk[2],
4462 .enable = _clk_enable,
4463 .enable_reg = MXC_CCM_CCGR4,
4464 .enable_shift = MXC_CCM_CCGRx_CG15_OFFSET,
4465 .disable = _clk_disable,
4468 __INIT_CLK_DEBUG(gpmi_bch_clk)
4469 .parent = &usdhc4_clk,
4470 .secondary = &gpmi_nand_clk[3],
4471 .enable = _clk_enable,
4472 .enable_reg = MXC_CCM_CCGR4,
4473 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
4474 .disable = _clk_disable,
4477 __INIT_CLK_DEBUG(gpmi_bch_apb_clk)
4478 .parent = &usdhc3_clk,
4479 .secondary = &gpmi_nand_clk[4],
4480 .enable = _clk_enable,
4481 .enable_reg = MXC_CCM_CCGR4,
4482 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
4483 .disable = _clk_disable,
4485 { /* bch relative clk */
4486 __INIT_CLK_DEBUG(pl301_mx6qperl_bch)
4487 .parent = &mx6per1_clk,
4488 .secondary = &mmdc_ch0_axi_clk[0],
4492 static struct clk pwm_clk[] = {
4494 __INIT_CLK_DEBUG(pwm_clk_0)
4495 .parent = &ipg_perclk,
4497 .enable_reg = MXC_CCM_CCGR4,
4498 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
4499 .enable = _clk_enable,
4500 .disable = _clk_disable,
4503 __INIT_CLK_DEBUG(pwm_clk_1)
4504 .parent = &ipg_perclk,
4506 .enable_reg = MXC_CCM_CCGR4,
4507 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
4508 .enable = _clk_enable,
4509 .disable = _clk_disable,
4512 __INIT_CLK_DEBUG(pwm_clk_2)
4513 .parent = &ipg_perclk,
4515 .enable_reg = MXC_CCM_CCGR4,
4516 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
4517 .enable = _clk_enable,
4518 .disable = _clk_disable,
4521 __INIT_CLK_DEBUG(pwm_clk_3)
4522 .parent = &ipg_perclk,
4524 .enable_reg = MXC_CCM_CCGR4,
4525 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
4526 .enable = _clk_enable,
4527 .disable = _clk_disable,
4531 static int _clk_pcie_enable(struct clk *clk)
4535 /* Clear Power Down and Enable PLLs */
4536 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4537 reg &= ~ANADIG_PLL_ENET_POWER_DOWN;
4538 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4540 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4541 reg |= ANADIG_PLL_ENET_EN;
4542 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4544 /* Waiting for the PLL is locked */
4545 if (!WAIT(ANADIG_PLL_ENET_LOCK & __raw_readl(PLL8_ENET_BASE_ADDR),
4547 panic("pll8 lock failed\n");
4549 /* Disable the bypass */
4550 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4551 reg &= ~ANADIG_PLL_ENET_BYPASS;
4552 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4555 * Enable SATA ref clock.
4556 * PCIe needs both sides to have the same source of refernce clock,
4557 * The SATA reference clock is taken out on clk out
4559 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4560 reg |= ANADIG_PLL_ENET_EN_SATA;
4561 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4563 /* Activate LVDS CLK1 (the MiniPCIe slot clock input) */
4564 reg = __raw_readl(ANADIG_MISC1_REG);
4565 reg &= ~ANATOP_LVDS_CLK1_IBEN_MASK;
4566 __raw_writel(reg, ANADIG_MISC1_REG);
4568 reg = __raw_readl(ANADIG_MISC1_REG);
4569 reg |= ANATOP_LVDS_CLK1_SRC_SATA;
4570 __raw_writel(reg, ANADIG_MISC1_REG);
4572 reg = __raw_readl(ANADIG_MISC1_REG);
4573 reg |= ANATOP_LVDS_CLK1_OBEN_MASK;
4574 __raw_writel(reg, ANADIG_MISC1_REG);
4576 /* Enable PCIE ref clock */
4577 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4578 reg |= ANADIG_PLL_ENET_EN_PCIE;
4579 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4586 static void _clk_pcie_disable(struct clk *clk)
4592 /* Disable SATA ref clock */
4593 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4594 reg &= ~ANADIG_PLL_ENET_EN_PCIE;
4595 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4598 static struct clk pcie_clk[] = {
4600 __INIT_CLK_DEBUG(pcie_clk)
4601 .parent = &pcie_axi_clk,
4602 .enable = _clk_pcie_enable,
4603 .disable = _clk_pcie_disable,
4604 .enable_reg = MXC_CCM_CCGR4,
4605 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4606 .secondary = &pcie_clk[1],
4607 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4610 .parent = &mmdc_ch0_axi_clk[0],
4611 .secondary = &mx6fast1_clk,
4615 static int _clk_sata_enable(struct clk *clk)
4619 /* Clear Power Down and Enable PLLs */
4620 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4621 reg &= ~ANADIG_PLL_ENET_POWER_DOWN;
4622 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4624 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4625 reg |= ANADIG_PLL_ENET_EN;
4626 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4628 /* Waiting for the PLL is locked */
4629 if (!WAIT(ANADIG_PLL_ENET_LOCK & __raw_readl(PLL8_ENET_BASE_ADDR),
4631 panic("pll8 lock failed\n");
4633 /* Disable the bypass */
4634 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4635 reg &= ~ANADIG_PLL_ENET_BYPASS;
4636 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4638 /* Enable SATA ref clock */
4639 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4640 reg |= ANADIG_PLL_ENET_EN_SATA;
4641 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4648 static void _clk_sata_disable(struct clk *clk)
4654 /* Disable SATA ref clock */
4655 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4656 reg &= ~ANADIG_PLL_ENET_EN_SATA;
4657 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4660 static struct clk sata_clk[] = {
4662 __INIT_CLK_DEBUG(sata_clk)
4664 .enable = _clk_sata_enable,
4665 .enable_reg = MXC_CCM_CCGR5,
4666 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
4667 .disable = _clk_sata_disable,
4668 .secondary = &sata_clk[1],
4669 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4672 .parent = &mmdc_ch0_axi_clk[0],
4673 .secondary = &mx6per1_clk,
4677 static struct clk usboh3_clk[] = {
4679 __INIT_CLK_DEBUG(usboh3_clk)
4681 .enable = _clk_enable,
4682 .enable_reg = MXC_CCM_CCGR6,
4683 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4684 .disable = _clk_disable,
4685 .secondary = &usboh3_clk[1],
4686 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4689 .parent = &mmdc_ch0_axi_clk[0],
4690 .secondary = &mx6per1_clk,
4694 static struct clk mlb150_clk = {
4695 __INIT_CLK_DEBUG(mlb150_clk)
4698 .enable_reg = MXC_CCM_CCGR3,
4699 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
4700 .enable = _clk_enable,
4701 .disable = _clk_disable,
4704 static int _clk_enable1(struct clk *clk)
4707 reg = __raw_readl(clk->enable_reg);
4708 reg |= 1 << clk->enable_shift;
4709 __raw_writel(reg, clk->enable_reg);
4714 static void _clk_disable1(struct clk *clk)
4717 reg = __raw_readl(clk->enable_reg);
4718 reg &= ~(1 << clk->enable_shift);
4719 __raw_writel(reg, clk->enable_reg);
4722 static int _clk_clko_set_parent(struct clk *clk, struct clk *parent)
4726 if (parent == &pll3_usb_otg_main_clk)
4728 else if (parent == &pll2_528_bus_main_clk)
4730 else if (parent == &pll1_sys_main_clk)
4732 else if (parent == &pll5_video_main_clk)
4734 else if (parent == &axi_clk)
4736 else if (parent == &enfc_clk)
4738 else if (parent == &ipu1_di_clk[0])
4740 else if (parent == &ipu1_di_clk[1])
4742 else if (parent == &ipu2_di_clk[0])
4744 else if (parent == &ipu2_di_clk[1])
4746 else if (parent == &ahb_clk)
4748 else if (parent == &ipg_clk)
4750 else if (parent == &ipg_perclk)
4752 else if (parent == &ckil_clk)
4754 else if (parent == &pll4_audio_main_clk)
4759 reg = __raw_readl(MXC_CCM_CCOSR);
4760 reg &= ~MXC_CCM_CCOSR_CKOL_SEL_MASK;
4761 reg |= sel << MXC_CCM_CCOSR_CKOL_SEL_OFFSET;
4762 __raw_writel(reg, MXC_CCM_CCOSR);
4766 static unsigned long _clk_clko_get_rate(struct clk *clk)
4768 u32 reg = __raw_readl(MXC_CCM_CCOSR);
4769 u32 div = ((reg & MXC_CCM_CCOSR_CKOL_DIV_MASK) >>
4770 MXC_CCM_CCOSR_CKOL_DIV_OFFSET) + 1;
4771 return clk_get_rate(clk->parent) / div;
4774 static int _clk_clko_set_rate(struct clk *clk, unsigned long rate)
4777 u32 parent_rate = clk_get_rate(clk->parent);
4778 u32 div = parent_rate / rate;
4782 if (((parent_rate / div) != rate) || (div > 8))
4785 reg = __raw_readl(MXC_CCM_CCOSR);
4786 reg &= ~MXC_CCM_CCOSR_CKOL_DIV_MASK;
4787 reg |= (div - 1) << MXC_CCM_CCOSR_CKOL_DIV_OFFSET;
4788 __raw_writel(reg, MXC_CCM_CCOSR);
4792 static unsigned long _clk_clko_round_rate(struct clk *clk,
4795 u32 parent_rate = clk_get_rate(clk->parent);
4796 u32 div = parent_rate / rate;
4798 /* Make sure rate is not greater than the maximum value for the clock.
4799 * Also prevent a div of 0.
4805 return parent_rate / div;
4808 static int _clk_clko2_set_parent(struct clk *clk, struct clk *parent)
4812 if (parent == &mmdc_ch0_axi_clk[0])
4814 else if (parent == &mmdc_ch1_axi_clk[0])
4816 else if (parent == &usdhc4_clk)
4818 else if (parent == &usdhc1_clk)
4820 else if (parent == &gpu2d_axi_clk)
4822 else if (parent == &ecspi_clk[0])
4824 else if (parent == &gpu3d_axi_clk)
4826 else if (parent == &usdhc3_clk)
4828 else if (parent == &pcie_clk[0])
4830 else if (parent == &ipu1_clk)
4832 else if (parent == &ipu2_clk)
4834 else if (parent == &vdo_axi_clk)
4836 else if (parent == &osc_clk)
4838 else if (parent == &gpu2d_core_clk[0])
4840 else if (parent == &gpu3d_core_clk[0])
4842 else if (parent == &usdhc2_clk)
4844 else if (parent == &ssi1_clk)
4846 else if (parent == &ssi2_clk)
4848 else if (parent == &ssi3_clk)
4850 else if (parent == &gpu3d_shader_clk)
4852 else if (parent == &can_clk_root)
4854 else if (parent == &ldb_di0_clk)
4856 else if (parent == &ldb_di1_clk)
4858 else if (parent == &esai_clk)
4860 else if (parent == &uart_clk[0])
4862 else if (parent == &spdif0_clk[0])
4864 else if (parent == &hsi_tx_clk[0])
4869 reg = __raw_readl(MXC_CCM_CCOSR);
4870 reg &= ~MXC_CCM_CCOSR_CKO2_SEL_MASK;
4871 reg |= sel << MXC_CCM_CCOSR_CKO2_SEL_OFFSET;
4872 __raw_writel(reg, MXC_CCM_CCOSR);
4876 static unsigned long _clk_clko2_get_rate(struct clk *clk)
4878 u32 reg = __raw_readl(MXC_CCM_CCOSR);
4879 u32 div = ((reg & MXC_CCM_CCOSR_CKO2_DIV_MASK) >>
4880 MXC_CCM_CCOSR_CKO2_DIV_OFFSET) + 1;
4881 return clk_get_rate(clk->parent) / div;
4884 static int _clk_clko2_set_rate(struct clk *clk, unsigned long rate)
4887 u32 parent_rate = clk_get_rate(clk->parent);
4888 u32 div = parent_rate / rate;
4892 if (((parent_rate / div) != rate) || (div > 8))
4895 reg = __raw_readl(MXC_CCM_CCOSR);
4896 reg &= ~MXC_CCM_CCOSR_CKO2_DIV_MASK;
4897 reg |= (div - 1) << MXC_CCM_CCOSR_CKO2_DIV_OFFSET;
4898 __raw_writel(reg, MXC_CCM_CCOSR);
4902 static struct clk clko_clk = {
4903 __INIT_CLK_DEBUG(clko_clk)
4904 .parent = &pll2_528_bus_main_clk,
4905 .enable = _clk_enable1,
4906 .enable_reg = MXC_CCM_CCOSR,
4907 .enable_shift = MXC_CCM_CCOSR_CKOL_EN_OFFSET,
4908 .disable = _clk_disable1,
4909 .set_parent = _clk_clko_set_parent,
4910 .set_rate = _clk_clko_set_rate,
4911 .get_rate = _clk_clko_get_rate,
4912 .round_rate = _clk_clko_round_rate,
4915 static struct clk clko2_clk = {
4916 __INIT_CLK_DEBUG(clko2_clk)
4917 .parent = &usdhc4_clk,
4918 .enable = _clk_enable1,
4919 .enable_reg = MXC_CCM_CCOSR,
4920 .enable_shift = MXC_CCM_CCOSR_CKO2_EN_OFFSET,
4921 .disable = _clk_disable1,
4922 .set_parent = _clk_clko2_set_parent,
4923 .set_rate = _clk_clko2_set_rate,
4924 .get_rate = _clk_clko2_get_rate,
4925 .round_rate = _clk_clko_round_rate,
4928 static struct clk perfmon0_clk = {
4929 __INIT_CLK_DEBUG(perfmon0_clk)
4930 .parent = &mmdc_ch0_axi_clk[0],
4931 .enable = _clk_enable1,
4932 .enable_reg = MXC_CCM_CCGR4,
4933 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
4934 .disable = _clk_disable1,
4937 static struct clk perfmon1_clk = {
4938 __INIT_CLK_DEBUG(perfmon1_clk)
4939 .parent = &ipu1_clk,
4940 .enable = _clk_enable1,
4941 .enable_reg = MXC_CCM_CCGR4,
4942 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
4943 .disable = _clk_disable1,
4946 static struct clk perfmon2_clk = {
4947 __INIT_CLK_DEBUG(perfmon2_clk)
4948 .parent = &mmdc_ch0_axi_clk[0],
4949 .enable = _clk_enable1,
4950 .enable_reg = MXC_CCM_CCGR4,
4951 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
4952 .disable = _clk_disable1,
4955 static struct clk dummy_clk = {
4959 #define _REGISTER_CLOCK(d, n, c) \
4967 static struct clk_lookup lookups[] = {
4968 _REGISTER_CLOCK(NULL, "osc", osc_clk),
4969 _REGISTER_CLOCK(NULL, "ckih", ckih_clk),
4970 _REGISTER_CLOCK(NULL, "ckih2", ckih2_clk),
4971 _REGISTER_CLOCK(NULL, "ckil", ckil_clk),
4972 _REGISTER_CLOCK(NULL, "pll1_main_clk", pll1_sys_main_clk),
4973 _REGISTER_CLOCK(NULL, "pll1_sw_clk", pll1_sw_clk),
4974 _REGISTER_CLOCK(NULL, "pll2", pll2_528_bus_main_clk),
4975 _REGISTER_CLOCK(NULL, "pll2_pfd_400M", pll2_pfd_400M),
4976 _REGISTER_CLOCK(NULL, "pll2_pfd_352M", pll2_pfd_352M),
4977 _REGISTER_CLOCK(NULL, "pll2_pfd_594M", pll2_pfd_594M),
4978 _REGISTER_CLOCK(NULL, "pll2_200M", pll2_200M),
4979 _REGISTER_CLOCK(NULL, "pll3_main_clk", pll3_usb_otg_main_clk),
4980 _REGISTER_CLOCK(NULL, "pll3_pfd_508M", pll3_pfd_508M),
4981 _REGISTER_CLOCK(NULL, "pll3_pfd_454M", pll3_pfd_454M),
4982 _REGISTER_CLOCK(NULL, "pll3_pfd_720M", pll3_pfd_720M),
4983 _REGISTER_CLOCK(NULL, "pll3_pfd_540M", pll3_pfd_540M),
4984 _REGISTER_CLOCK(NULL, "pll3_sw_clk", pll3_sw_clk),
4985 _REGISTER_CLOCK(NULL, "pll3_120M", pll3_120M),
4986 _REGISTER_CLOCK(NULL, "pll3_120M", pll3_80M),
4987 _REGISTER_CLOCK(NULL, "pll3_120M", pll3_60M),
4988 _REGISTER_CLOCK(NULL, "pll4", pll4_audio_main_clk),
4989 _REGISTER_CLOCK(NULL, "pll5", pll5_video_main_clk),
4990 _REGISTER_CLOCK(NULL, "pll6", pll6_mlb150_main_clk),
4991 _REGISTER_CLOCK(NULL, "pll3", pll7_usb_host_main_clk),
4992 _REGISTER_CLOCK(NULL, "pll4", pll8_enet_main_clk),
4993 _REGISTER_CLOCK(NULL, "cpu_clk", cpu_clk),
4994 _REGISTER_CLOCK(NULL, "periph_clk", periph_clk),
4995 _REGISTER_CLOCK(NULL, "axi_clk", axi_clk),
4996 _REGISTER_CLOCK(NULL, "mmdc_ch0_axi", mmdc_ch0_axi_clk[0]),
4997 _REGISTER_CLOCK(NULL, "mmdc_ch1_axi", mmdc_ch1_axi_clk[0]),
4998 _REGISTER_CLOCK(NULL, "ahb", ahb_clk),
4999 _REGISTER_CLOCK(NULL, "ipg_clk", ipg_clk),
5000 _REGISTER_CLOCK(NULL, "ipg_perclk", ipg_perclk),
5001 _REGISTER_CLOCK(NULL, "spba", spba_clk),
5002 _REGISTER_CLOCK("imx-sdma", NULL, sdma_clk[0]),
5003 _REGISTER_CLOCK(NULL, "gpu2d_axi_clk", gpu2d_axi_clk),
5004 _REGISTER_CLOCK(NULL, "gpu3d_axi_clk", gpu3d_axi_clk),
5005 _REGISTER_CLOCK(NULL, "pcie_axi_clk", pcie_axi_clk),
5006 _REGISTER_CLOCK(NULL, "vdo_axi_clk", vdo_axi_clk),
5007 _REGISTER_CLOCK(NULL, "iim_clk", iim_clk),
5008 _REGISTER_CLOCK(NULL, "i2c_clk", i2c_clk[0]),
5009 _REGISTER_CLOCK("imx-i2c.1", NULL, i2c_clk[1]),
5010 _REGISTER_CLOCK("imx-i2c.2", NULL, i2c_clk[2]),
5011 _REGISTER_CLOCK(NULL, "vpu_clk", vpu_clk[0]),
5012 _REGISTER_CLOCK(NULL, "ipu1_clk", ipu1_clk),
5013 _REGISTER_CLOCK(NULL, "ipu2_clk", ipu2_clk),
5014 _REGISTER_CLOCK("sdhci-esdhc-imx.0", NULL, usdhc1_clk),
5015 _REGISTER_CLOCK("sdhci-esdhc-imx.1", NULL, usdhc2_clk),
5016 _REGISTER_CLOCK("sdhci-esdhc-imx.2", NULL, usdhc3_clk),
5017 _REGISTER_CLOCK("sdhci-esdhc-imx.3", NULL, usdhc4_clk),
5018 _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk),
5019 _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk),
5020 _REGISTER_CLOCK("imx-ssi.2", NULL, ssi3_clk),
5021 _REGISTER_CLOCK(NULL, "ipu1_di0_clk", ipu1_di_clk[0]),
5022 _REGISTER_CLOCK(NULL, "ipu1_di1_clk", ipu1_di_clk[1]),
5023 _REGISTER_CLOCK(NULL, "ipu2_di0_clk", ipu2_di_clk[0]),
5024 _REGISTER_CLOCK(NULL, "ipu2_di1_clk", ipu2_di_clk[1]),
5025 _REGISTER_CLOCK(NULL, "can_root_clk", can_clk_root),
5026 _REGISTER_CLOCK("imx6q-flexcan.0", NULL, can1_clk[0]),
5027 _REGISTER_CLOCK("imx6q-flexcan.1", NULL, can2_clk[0]),
5028 _REGISTER_CLOCK(NULL, "ldb_di0_clk", ldb_di0_clk),
5029 _REGISTER_CLOCK(NULL, "ldb_di1_clk", ldb_di1_clk),
5030 _REGISTER_CLOCK("mxc_spdif.0", NULL, spdif0_clk[0]),
5031 _REGISTER_CLOCK(NULL, "esai_clk", esai_clk),
5032 _REGISTER_CLOCK("imx6q-ecspi.0", NULL, ecspi_clk[0]),
5033 _REGISTER_CLOCK("imx6q-ecspi.1", NULL, ecspi_clk[1]),
5034 _REGISTER_CLOCK("imx6q-ecspi.2", NULL, ecspi_clk[2]),
5035 _REGISTER_CLOCK("imx6q-ecspi.3", NULL, ecspi_clk[3]),
5036 _REGISTER_CLOCK("imx6q-ecspi.4", NULL, ecspi_clk[4]),
5037 _REGISTER_CLOCK(NULL, "emi_slow_clk", emi_slow_clk),
5038 _REGISTER_CLOCK(NULL, "emi_clk", emi_clk),
5039 _REGISTER_CLOCK(NULL, "enfc_clk", enfc_clk),
5040 _REGISTER_CLOCK("imx-uart.0", NULL, uart_clk[0]),
5041 _REGISTER_CLOCK("imx-uart.1", NULL, uart_clk[0]),
5042 _REGISTER_CLOCK("imx-uart.2", NULL, uart_clk[0]),
5043 _REGISTER_CLOCK("imx-uart.3", NULL, uart_clk[0]),
5044 _REGISTER_CLOCK(NULL, "hsi_tx", hsi_tx_clk[0]),
5045 _REGISTER_CLOCK(NULL, "caam_clk", caam_clk[0]),
5046 _REGISTER_CLOCK(NULL, "asrc_clk", asrc_clk[0]),
5047 _REGISTER_CLOCK(NULL, "asrc_serial_clk", asrc_clk[1]),
5048 _REGISTER_CLOCK("mxs-dma-apbh", NULL, apbh_dma_clk),
5049 _REGISTER_CLOCK(NULL, "openvg_axi_clk", openvg_axi_clk),
5050 _REGISTER_CLOCK(NULL, "gpu3d_clk", gpu3d_core_clk[0]),
5051 _REGISTER_CLOCK(NULL, "gpu2d_clk", gpu2d_core_clk[0]),
5052 _REGISTER_CLOCK(NULL, "gpu3d_shader_clk", gpu3d_shader_clk),
5053 _REGISTER_CLOCK(NULL, "gpt", gpt_clk[0]),
5054 _REGISTER_CLOCK("imx6q-gpmi-nand.0", NULL, gpmi_nand_clk[0]),
5055 _REGISTER_CLOCK(NULL, "gpmi-apb", gpmi_nand_clk[1]),
5056 _REGISTER_CLOCK(NULL, "bch", gpmi_nand_clk[2]),
5057 _REGISTER_CLOCK(NULL, "bch-apb", gpmi_nand_clk[3]),
5058 _REGISTER_CLOCK(NULL, "pl301_mx6qperl-bch", gpmi_nand_clk[4]),
5059 _REGISTER_CLOCK("mxc_pwm.0", NULL, pwm_clk[0]),
5060 _REGISTER_CLOCK("mxc_pwm.1", NULL, pwm_clk[1]),
5061 _REGISTER_CLOCK("mxc_pwm.2", NULL, pwm_clk[2]),
5062 _REGISTER_CLOCK("mxc_pwm.3", NULL, pwm_clk[3]),
5063 _REGISTER_CLOCK(NULL, "pcie_clk", pcie_clk[0]),
5064 _REGISTER_CLOCK("fec.0", NULL, enet_clk[0]),
5065 _REGISTER_CLOCK(NULL, "imx_sata_clk", sata_clk[0]),
5066 _REGISTER_CLOCK(NULL, "usboh3_clk", usboh3_clk[0]),
5067 _REGISTER_CLOCK(NULL, "usb_phy1_clk", usb_phy1_clk),
5068 _REGISTER_CLOCK(NULL, "usb_phy3_clk", usb_phy3_clk),
5069 _REGISTER_CLOCK(NULL, "usb_phy4_clk", usb_phy4_clk),
5070 _REGISTER_CLOCK("imx2-wdt.0", NULL, dummy_clk),
5071 _REGISTER_CLOCK("imx2-wdt.1", NULL, dummy_clk),
5072 _REGISTER_CLOCK(NULL, "hdmi_isfr_clk", hdmi_clk[0]),
5073 _REGISTER_CLOCK(NULL, "hdmi_iahb_clk", hdmi_clk[1]),
5074 _REGISTER_CLOCK(NULL, "mipi_pllref_clk", mipi_pllref_clk),
5075 _REGISTER_CLOCK(NULL, NULL, vdoa_clk),
5076 _REGISTER_CLOCK(NULL, NULL, aips_tz2_clk),
5077 _REGISTER_CLOCK(NULL, NULL, aips_tz1_clk),
5078 _REGISTER_CLOCK(NULL, "clko_clk", clko_clk),
5079 _REGISTER_CLOCK(NULL, "clko2_clk", clko2_clk),
5080 _REGISTER_CLOCK(NULL, "pxp_axi", ipu2_clk),
5081 _REGISTER_CLOCK(NULL, "epdc_axi", ipu2_clk),
5082 _REGISTER_CLOCK(NULL, "epdc_pix", ipu2_di_clk[1]),
5083 _REGISTER_CLOCK("mxs-perfmon.0", "perfmon", perfmon0_clk),
5084 _REGISTER_CLOCK("mxs-perfmon.1", "perfmon", perfmon1_clk),
5085 _REGISTER_CLOCK("mxs-perfmon.2", "perfmon", perfmon2_clk),
5086 _REGISTER_CLOCK(NULL, "mlb150_clk", mlb150_clk),
5087 _REGISTER_CLOCK(NULL, "anaclk_1", anaclk_1),
5088 _REGISTER_CLOCK(NULL, "anaclk_2", anaclk_2),
5091 static void clk_tree_init(void)
5096 reg = __raw_readl(MMDC_MDMISC_OFFSET);
5097 if ((reg & MMDC_MDMISC_DDR_TYPE_MASK) ==
5098 (0x1 << MMDC_MDMISC_DDR_TYPE_OFFSET) ||
5100 clk_set_parent(&periph_clk, &pll2_pfd_400M);
5101 printk(KERN_INFO "Set periph_clk's parent to pll2_pfd_400M!\n");
5106 int __init mx6_clocks_init(unsigned long ckil, unsigned long osc,
5107 unsigned long ckih1, unsigned long ckih2)
5112 external_low_reference = ckil;
5113 external_high_reference = ckih1;
5114 ckih2_reference = ckih2;
5115 oscillator_reference = osc;
5117 apll_base = ioremap(ANATOP_BASE_ADDR, SZ_4K);
5119 for (i = 0; i < ARRAY_SIZE(lookups); i++) {
5120 clkdev_add(&lookups[i]);
5121 clk_debug_register(lookups[i].clk);
5124 /* Disable un-necessary PFDs & PLLs */
5126 /* keep correct count. */
5127 clk_enable(&cpu_clk);
5128 clk_enable(&periph_clk);
5132 if (pll2_pfd_400M.usecount == 0 && cpu_is_mx6q())
5133 pll2_pfd_400M.disable(&pll2_pfd_400M);
5134 pll2_pfd_352M.disable(&pll2_pfd_352M);
5135 pll2_pfd_594M.disable(&pll2_pfd_594M);
5137 #if !defined(CONFIG_FEC_1588)
5138 pll3_pfd_454M.disable(&pll3_pfd_454M);
5139 pll3_pfd_508M.disable(&pll3_pfd_508M);
5140 pll3_pfd_540M.disable(&pll3_pfd_540M);
5141 pll3_pfd_720M.disable(&pll3_pfd_720M);
5143 pll3_usb_otg_main_clk.disable(&pll3_usb_otg_main_clk);
5145 pll4_audio_main_clk.disable(&pll4_audio_main_clk);
5146 pll5_video_main_clk.disable(&pll5_video_main_clk);
5147 pll6_mlb150_main_clk.disable(&pll6_mlb150_main_clk);
5148 pll7_usb_host_main_clk.disable(&pll7_usb_host_main_clk);
5149 pll8_enet_main_clk.disable(&pll8_enet_main_clk);
5151 sata_clk[0].disable(&sata_clk[0]);
5152 pcie_clk[0].disable(&pcie_clk[0]);
5154 /* Initialize Audio and Video PLLs to valid frequency (650MHz). */
5155 clk_set_rate(&pll4_audio_main_clk, 650000000);
5156 clk_set_rate(&pll5_video_main_clk, 650000000);
5158 clk_set_parent(&ipu1_di_clk[0], &pll5_video_main_clk);
5159 clk_set_parent(&ipu1_di_clk[1], &pll5_video_main_clk);
5160 clk_set_parent(&ipu2_di_clk[0], &pll5_video_main_clk);
5161 clk_set_parent(&ipu2_di_clk[1], &pll5_video_main_clk);
5163 clk_set_parent(&emi_clk, &pll2_pfd_400M);
5164 clk_set_rate(&emi_clk, 200000000);
5166 clk_set_parent(&gpu3d_shader_clk, &pll2_pfd_594M);
5167 clk_set_rate(&gpu3d_shader_clk, 594000000);
5168 clk_set_parent(&gpu3d_core_clk[0], &mmdc_ch0_axi_clk[0]);
5169 clk_set_rate(&gpu3d_core_clk[0], 528000000);
5170 if (cpu_is_mx6dl()) {
5171 /*on mx6dl, 2d core clock sources from 3d shader core clock*/
5172 clk_set_parent(&gpu2d_core_clk[0], &gpu3d_shader_clk);
5173 /* on mx6dl gpu3d_axi_clk source from mmdc0 directly */
5174 clk_set_parent(&gpu3d_axi_clk, &mmdc_ch0_axi_clk[0]);
5175 /* on mx6dl gpu2d_axi_clk source from mmdc0 directly */
5176 clk_set_parent(&gpu2d_axi_clk, &mmdc_ch0_axi_clk[0]);
5177 gpu2d_axi_clk.secondary = NULL;
5179 /* set axi_clk parent to pll3_pfd_540M */
5180 clk_set_parent(&axi_clk, &pll3_pfd_540M);
5182 /* on mx6dl, max ipu clock is 274M */
5183 clk_set_parent(&ipu1_clk, &pll3_pfd_540M);
5184 clk_set_parent(&ldb_di0_clk, &pll2_pfd_352M);
5185 clk_set_parent(&ldb_di1_clk, &pll2_pfd_352M);
5188 clk_set_parent(&gpu2d_core_clk[0], &pll3_usb_otg_main_clk);
5190 /* PCLK camera - J5 */
5191 clk_set_parent(&clko2_clk, &osc_clk);
5192 clk_set_rate(&clko2_clk, 2400000);
5194 clk_set_parent(&clko_clk, &ipg_clk);
5196 * FIXME: asrc needs to use asrc_serial(spdif1) clock to do sample
5197 * rate convertion and this clock frequency can not be too high, set
5198 * it to the minimum value 7.5Mhz to make asrc work properly.
5200 clk_set_parent(&asrc_clk[1], &pll3_sw_clk);
5201 clk_set_rate(&asrc_clk[1], 7500000);
5203 /* set the GPMI clock to default frequency : 20MHz */
5204 clk_set_rate(&enfc_clk, enfc_clk.round_rate(&enfc_clk, 20000000));
5207 cpu_op_tbl = get_cpu_op(&cpu_op_nr);
5209 /* Gate off all possible clocks */
5210 if (mxc_jtag_enabled) {
5211 __raw_writel(3 << MXC_CCM_CCGRx_CG11_OFFSET |
5212 3 << MXC_CCM_CCGRx_CG2_OFFSET |
5213 3 << MXC_CCM_CCGRx_CG1_OFFSET |
5214 3 << MXC_CCM_CCGRx_CG0_OFFSET, MXC_CCM_CCGR0);
5216 __raw_writel(1 << MXC_CCM_CCGRx_CG11_OFFSET |
5217 3 << MXC_CCM_CCGRx_CG2_OFFSET |
5218 3 << MXC_CCM_CCGRx_CG1_OFFSET |
5219 3 << MXC_CCM_CCGRx_CG0_OFFSET, MXC_CCM_CCGR0);
5221 __raw_writel(3 << MXC_CCM_CCGRx_CG10_OFFSET, MXC_CCM_CCGR1);
5222 __raw_writel(1 << MXC_CCM_CCGRx_CG12_OFFSET |
5223 1 << MXC_CCM_CCGRx_CG11_OFFSET |
5224 3 << MXC_CCM_CCGRx_CG10_OFFSET |
5225 3 << MXC_CCM_CCGRx_CG9_OFFSET |
5226 3 << MXC_CCM_CCGRx_CG8_OFFSET, MXC_CCM_CCGR2);
5227 __raw_writel(1 << MXC_CCM_CCGRx_CG14_OFFSET |
5228 3 << MXC_CCM_CCGRx_CG13_OFFSET |
5229 3 << MXC_CCM_CCGRx_CG12_OFFSET |
5230 3 << MXC_CCM_CCGRx_CG11_OFFSET |
5231 3 << MXC_CCM_CCGRx_CG10_OFFSET, MXC_CCM_CCGR3);
5232 __raw_writel(3 << MXC_CCM_CCGRx_CG7_OFFSET |
5233 1 << MXC_CCM_CCGRx_CG6_OFFSET |
5234 1 << MXC_CCM_CCGRx_CG4_OFFSET, MXC_CCM_CCGR4);
5235 __raw_writel(1 << MXC_CCM_CCGRx_CG0_OFFSET, MXC_CCM_CCGR5);
5237 __raw_writel(0, MXC_CCM_CCGR6);
5239 /* Lower the ipg_perclk frequency to 8.25MHz. */
5240 clk_set_rate(&ipg_perclk, 8250000);
5243 clk_set_parent(&spdif0_clk[0], &pll3_pfd_454M);
5246 clk_set_parent(&ipu2_clk, &pll2_pfd_400M);
5247 clk_set_rate(&ipu2_clk, 200000000);
5249 if (mx6q_revision() == IMX_CHIP_REVISION_1_0) {
5250 gpt_clk[0].parent = &ipg_perclk;
5251 gpt_clk[0].get_rate = NULL;
5253 /* Here we use OSC 24M as GPT's clock source, no need to
5254 enable gpt serial clock*/
5255 gpt_clk[0].secondary = NULL;
5258 if (cpu_is_mx6dl()) {
5260 clk_set_parent(&ipu2_di_clk[1], &pll5_video_main_clk);
5262 clk_set_parent(&ipu2_di_clk[1], &pll3_pfd_540M);
5265 base = ioremap(GPT_BASE_ADDR, SZ_4K);
5266 mxc_timer_init(&gpt_clk[0], base, MXC_INT_GPT);