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);
503 reg = __raw_readl(PLL1_SYS_BASE_ADDR) & ~ANADIG_PLL_SYS_DIV_SELECT_MASK;
505 __raw_writel(reg, PLL1_SYS_BASE_ADDR);
507 /* Wait for PLL1 to lock */
508 if (!WAIT(__raw_readl(PLL1_SYS_BASE_ADDR) & ANADIG_PLL_LOCK,
510 panic("pll1 enable failed\n");
515 static struct clk pll1_sys_main_clk = {
516 __INIT_CLK_DEBUG(pll1_sys_main_clk)
518 .get_rate = _clk_pll1_main_get_rate,
519 .set_rate = _clk_pll1_main_set_rate,
520 .enable = _clk_pll_enable,
521 .disable = _clk_pll_disable,
524 static int _clk_pll1_sw_set_parent(struct clk *clk, struct clk *parent)
528 reg = __raw_readl(MXC_CCM_CCSR);
530 if (parent == &pll1_sys_main_clk) {
531 reg &= ~MXC_CCM_CCSR_PLL1_SW_CLK_SEL;
532 __raw_writel(reg, MXC_CCM_CCSR);
533 /* Set the step_clk parent to be lp_apm, to save power. */
534 reg = __raw_readl(MXC_CCM_CCSR);
535 reg = (reg & ~MXC_CCM_CCSR_STEP_SEL);
537 /* Set STEP_CLK to be the parent*/
538 if (parent == &osc_clk) {
539 /* Set STEP_CLK to be sourced from LPAPM. */
540 reg = __raw_readl(MXC_CCM_CCSR);
541 reg = (reg & ~MXC_CCM_CCSR_STEP_SEL);
542 __raw_writel(reg, MXC_CCM_CCSR);
544 /* Set STEP_CLK to be sourced from PLL2-PDF (400MHz). */
545 reg = __raw_readl(MXC_CCM_CCSR);
546 reg |= MXC_CCM_CCSR_STEP_SEL;
547 __raw_writel(reg, MXC_CCM_CCSR);
550 reg = __raw_readl(MXC_CCM_CCSR);
551 reg |= MXC_CCM_CCSR_PLL1_SW_CLK_SEL;
553 __raw_writel(reg, MXC_CCM_CCSR);
557 static unsigned long _clk_pll1_sw_get_rate(struct clk *clk)
559 return clk_get_rate(clk->parent);
562 static struct clk pll1_sw_clk = {
563 __INIT_CLK_DEBUG(pll1_sw_clk)
564 .parent = &pll1_sys_main_clk,
565 .set_parent = _clk_pll1_sw_set_parent,
566 .get_rate = _clk_pll1_sw_get_rate,
569 static unsigned long _clk_pll2_main_get_rate(struct clk *clk)
574 div = __raw_readl(PLL2_528_BASE_ADDR) & ANADIG_PLL_528_DIV_SELECT;
577 val = clk_get_rate(clk->parent) * 22;
580 val = clk_get_rate(clk->parent) * 20;
585 static int _clk_pll2_main_set_rate(struct clk *clk, unsigned long rate)
587 unsigned int reg, div;
589 if (rate == 528000000)
591 else if (rate == 480000000)
596 reg = __raw_readl(PLL2_528_BASE_ADDR);
597 reg &= ~ANADIG_PLL_528_DIV_SELECT;
599 __raw_writel(reg, PLL2_528_BASE_ADDR);
604 static struct clk pll2_528_bus_main_clk = {
605 __INIT_CLK_DEBUG(pll2_528_bus_main_clk)
607 .get_rate = _clk_pll2_main_get_rate,
608 .set_rate = _clk_pll2_main_set_rate,
609 .enable = _clk_pll_enable,
610 .disable = _clk_pll_disable,
613 static struct clk pll2_pfd_400M = {
614 __INIT_CLK_DEBUG(pll2_pfd_400M)
615 .parent = &pll2_528_bus_main_clk,
616 .enable_reg = (void *)PFD_528_BASE_ADDR,
617 .enable_shift = ANADIG_PFD2_FRAC_OFFSET,
618 .enable = _clk_pfd_enable,
619 .disable = _clk_pfd_disable,
620 .get_rate = pfd_get_rate,
621 .set_rate = pfd_set_rate,
622 .get_rate = pfd_get_rate,
623 .round_rate = pfd_round_rate,
626 static struct clk pll2_pfd_352M = {
627 __INIT_CLK_DEBUG(pll2_pfd_352M)
628 .parent = &pll2_528_bus_main_clk,
629 .enable_reg = (void *)PFD_528_BASE_ADDR,
630 .enable_shift = ANADIG_PFD0_FRAC_OFFSET,
631 .enable = _clk_pfd_enable,
632 .disable = _clk_pfd_disable,
633 .set_rate = pfd_set_rate,
634 .get_rate = pfd_get_rate,
635 .round_rate = pfd_round_rate,
638 static struct clk pll2_pfd_594M = {
639 __INIT_CLK_DEBUG(pll2_pfd_594M)
640 .parent = &pll2_528_bus_main_clk,
641 .enable_reg = (void *)PFD_528_BASE_ADDR,
642 .enable_shift = ANADIG_PFD1_FRAC_OFFSET,
643 .enable = _clk_pfd_enable,
644 .disable = _clk_pfd_disable,
645 .set_rate = pfd_set_rate,
646 .get_rate = pfd_get_rate,
647 .round_rate = pfd_round_rate,
650 static unsigned long _clk_pll2_200M_get_rate(struct clk *clk)
652 return clk_get_rate(clk->parent) / 2;
655 static struct clk pll2_200M = {
656 __INIT_CLK_DEBUG(pll2_200M)
657 .parent = &pll2_pfd_400M,
658 .get_rate = _clk_pll2_200M_get_rate,
661 static unsigned long _clk_pll3_usb_otg_get_rate(struct clk *clk)
666 div = __raw_readl(PLL3_480_USB1_BASE_ADDR)
667 & ANADIG_PLL_480_DIV_SELECT_MASK;
670 val = clk_get_rate(clk->parent) * 22;
672 val = clk_get_rate(clk->parent) * 20;
676 static int _clk_pll3_usb_otg_set_rate(struct clk *clk, unsigned long rate)
678 unsigned int reg, div;
680 if (rate == 528000000)
682 else if (rate == 480000000)
687 reg = __raw_readl(PLL3_480_USB1_BASE_ADDR);
688 reg &= ~ANADIG_PLL_480_DIV_SELECT_MASK;
690 __raw_writel(reg, PLL3_480_USB1_BASE_ADDR);
696 /* same as pll3_main_clk. These two clocks should always be the same */
697 static struct clk pll3_usb_otg_main_clk = {
698 __INIT_CLK_DEBUG(pll3_usb_otg_main_clk)
700 .enable = _clk_pll_enable,
701 .disable = _clk_pll_disable,
702 .set_rate = _clk_pll3_usb_otg_set_rate,
703 .get_rate = _clk_pll3_usb_otg_get_rate,
707 static struct clk usb_phy1_clk = {
708 __INIT_CLK_DEBUG(usb_phy1_clk)
709 .parent = &pll3_usb_otg_main_clk,
710 .set_rate = _clk_pll3_usb_otg_set_rate,
711 .get_rate = _clk_pll3_usb_otg_get_rate,
714 /* For HSIC port 1 */
715 static struct clk usb_phy3_clk = {
716 __INIT_CLK_DEBUG(usb_phy3_clk)
717 .parent = &pll3_usb_otg_main_clk,
718 .set_rate = _clk_pll3_usb_otg_set_rate,
719 .get_rate = _clk_pll3_usb_otg_get_rate,
722 /* For HSIC port 2 */
723 static struct clk usb_phy4_clk = {
724 __INIT_CLK_DEBUG(usb_phy4_clk)
725 .parent = &pll3_usb_otg_main_clk,
726 .set_rate = _clk_pll3_usb_otg_set_rate,
727 .get_rate = _clk_pll3_usb_otg_get_rate,
730 static struct clk pll3_pfd_508M = {
731 __INIT_CLK_DEBUG(pll3_pfd_508M)
732 .parent = &pll3_usb_otg_main_clk,
733 .enable_reg = (void *)PFD_480_BASE_ADDR,
734 .enable_shift = ANADIG_PFD2_FRAC_OFFSET,
735 .enable = _clk_pfd_enable,
736 .disable = _clk_pfd_disable,
737 .set_rate = pfd_set_rate,
738 .get_rate = pfd_get_rate,
739 .round_rate = pfd_round_rate,
742 static struct clk pll3_pfd_454M = {
743 __INIT_CLK_DEBUG(pll3_pfd_454M)
744 .parent = &pll3_usb_otg_main_clk,
745 .enable_reg = (void *)PFD_480_BASE_ADDR,
746 .enable_shift = ANADIG_PFD3_FRAC_OFFSET,
747 .enable = _clk_pfd_enable,
748 .disable = _clk_pfd_disable,
749 .set_rate = pfd_set_rate,
750 .get_rate = pfd_get_rate,
751 .round_rate = pfd_round_rate,
754 static struct clk pll3_pfd_720M = {
755 __INIT_CLK_DEBUG(pll3_pfd_720M)
756 .parent = &pll3_usb_otg_main_clk,
757 .enable_reg = (void *)PFD_480_BASE_ADDR,
758 .enable_shift = ANADIG_PFD0_FRAC_OFFSET,
759 .enable = _clk_pfd_enable,
760 .disable = _clk_pfd_disable,
761 .set_rate = pfd_set_rate,
762 .get_rate = pfd_get_rate,
763 .round_rate = pfd_round_rate,
766 static struct clk pll3_pfd_540M = {
767 __INIT_CLK_DEBUG(pll3_pfd_540M)
768 .parent = &pll3_usb_otg_main_clk,
769 .enable_reg = (void *)PFD_480_BASE_ADDR,
770 .enable_shift = ANADIG_PFD1_FRAC_OFFSET,
771 .enable = _clk_pfd_enable,
772 .disable = _clk_pfd_disable,
773 .set_rate = pfd_set_rate,
774 .get_rate = pfd_get_rate,
775 .round_rate = pfd_round_rate,
776 .get_rate = pfd_get_rate,
779 static unsigned long _clk_pll3_sw_get_rate(struct clk *clk)
781 return clk_get_rate(clk->parent);
784 /* same as pll3_main_clk. These two clocks should always be the same */
785 static struct clk pll3_sw_clk = {
786 __INIT_CLK_DEBUG(pll3_sw_clk)
787 .parent = &pll3_usb_otg_main_clk,
788 .get_rate = _clk_pll3_sw_get_rate,
791 static unsigned long _clk_pll3_120M_get_rate(struct clk *clk)
793 return clk_get_rate(clk->parent) / 4;
796 static struct clk pll3_120M = {
797 __INIT_CLK_DEBUG(pll3_120M)
798 .parent = &pll3_sw_clk,
799 .get_rate = _clk_pll3_120M_get_rate,
802 static unsigned long _clk_pll3_80M_get_rate(struct clk *clk)
804 return clk_get_rate(clk->parent) / 6;
807 static struct clk pll3_80M = {
808 __INIT_CLK_DEBUG(pll3_80M)
809 .parent = &pll3_sw_clk,
810 .get_rate = _clk_pll3_80M_get_rate,
813 static unsigned long _clk_pll3_60M_get_rate(struct clk *clk)
815 return clk_get_rate(clk->parent) / 8;
818 static struct clk pll3_60M = {
819 __INIT_CLK_DEBUG(pll3_60M)
820 .parent = &pll3_sw_clk,
821 .get_rate = _clk_pll3_60M_get_rate,
824 static unsigned long _clk_audio_video_get_rate(struct clk *clk)
826 unsigned int div, mfn, mfd;
828 unsigned int parent_rate = clk_get_rate(clk->parent);
829 void __iomem *pllbase;
830 int rev = mx6q_revision();
831 unsigned int test_div_sel, control3, post_div = 1;
833 if (clk == &pll4_audio_main_clk)
834 pllbase = PLL4_AUDIO_BASE_ADDR;
836 pllbase = PLL5_VIDEO_BASE_ADDR;
838 if ((rev >= IMX_CHIP_REVISION_1_1) || cpu_is_mx6dl()) {
839 test_div_sel = (__raw_readl(pllbase)
840 & ANADIG_PLL_AV_TEST_DIV_SEL_MASK)
841 >> ANADIG_PLL_AV_TEST_DIV_SEL_OFFSET;
842 if (test_div_sel == 0)
844 else if (test_div_sel == 1)
847 if (clk == &pll5_video_main_clk) {
848 control3 = (__raw_readl(ANA_MISC2_BASE_ADDR)
849 & ANADIG_ANA_MISC2_CONTROL3_MASK)
850 >> ANADIG_ANA_MISC2_CONTROL3_OFFSET;
853 else if (control3 == 3)
858 div = __raw_readl(pllbase) & ANADIG_PLL_SYS_DIV_SELECT_MASK;
859 mfn = __raw_readl(pllbase + PLL_NUM_DIV_OFFSET);
860 mfd = __raw_readl(pllbase + PLL_DENOM_DIV_OFFSET);
862 rate = (parent_rate * div) + ((parent_rate / mfd) * mfn);
863 rate = rate / post_div;
868 static int _clk_audio_video_set_rate(struct clk *clk, unsigned long rate)
870 unsigned int reg, div;
871 unsigned int mfn, mfd = 1000000;
873 unsigned int parent_rate = clk_get_rate(clk->parent);
874 void __iomem *pllbase;
875 unsigned long min_clk_rate, pre_div_rate;
876 int rev = mx6q_revision();
877 u32 test_div_sel = 2;
880 if ((rev < IMX_CHIP_REVISION_1_1) && !cpu_is_mx6dl())
881 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ;
882 else if (clk == &pll4_audio_main_clk)
883 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ / 4;
885 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ / 16;
887 if ((rate < min_clk_rate) || (rate > AUDIO_VIDEO_MAX_CLK_FREQ))
890 if (clk == &pll4_audio_main_clk)
891 pllbase = PLL4_AUDIO_BASE_ADDR;
893 pllbase = PLL5_VIDEO_BASE_ADDR;
896 if ((rev >= IMX_CHIP_REVISION_1_1) || cpu_is_mx6dl()) {
897 while (pre_div_rate < AUDIO_VIDEO_MIN_CLK_FREQ) {
900 * test_div_sel field values:
905 * control3 field values:
910 if (test_div_sel != 0)
920 div = pre_div_rate / parent_rate;
921 temp64 = (u64) (pre_div_rate - (div * parent_rate));
923 do_div(temp64, parent_rate);
926 reg = __raw_readl(pllbase)
927 & ~ANADIG_PLL_SYS_DIV_SELECT_MASK
928 & ~ANADIG_PLL_AV_TEST_DIV_SEL_MASK;
930 (test_div_sel << ANADIG_PLL_AV_TEST_DIV_SEL_OFFSET);
931 __raw_writel(reg, pllbase);
932 __raw_writel(mfn, pllbase + PLL_NUM_DIV_OFFSET);
933 __raw_writel(mfd, pllbase + PLL_DENOM_DIV_OFFSET);
935 if (rev >= IMX_CHIP_REVISION_1_1) {
936 reg = __raw_readl(ANA_MISC2_BASE_ADDR)
937 & ~ANADIG_ANA_MISC2_CONTROL3_MASK;
938 reg |= control3 << ANADIG_ANA_MISC2_CONTROL3_OFFSET;
939 __raw_writel(reg, ANA_MISC2_BASE_ADDR);
945 static unsigned long _clk_audio_video_round_rate(struct clk *clk,
948 unsigned long min_clk_rate;
949 unsigned int div, post_div = 1;
950 unsigned int mfn, mfd = 1000000;
952 unsigned int parent_rate = clk_get_rate(clk->parent);
953 unsigned long pre_div_rate;
954 u32 test_div_sel = 2;
956 unsigned long final_rate;
957 int rev = mx6q_revision();
959 if ((rev < IMX_CHIP_REVISION_1_1) && !cpu_is_mx6dl())
960 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ;
961 else if (clk == &pll4_audio_main_clk)
962 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ / 4;
964 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ / 16;
966 if (rate < min_clk_rate)
969 if (rate > AUDIO_VIDEO_MAX_CLK_FREQ)
970 return AUDIO_VIDEO_MAX_CLK_FREQ;
973 if ((rev >= IMX_CHIP_REVISION_1_1) || cpu_is_mx6dl()) {
974 while (pre_div_rate < AUDIO_VIDEO_MIN_CLK_FREQ) {
977 if (test_div_sel != 0)
987 div = pre_div_rate / parent_rate;
988 temp64 = (u64) (pre_div_rate - (div * parent_rate));
990 do_div(temp64, parent_rate);
993 final_rate = (parent_rate * div) + ((parent_rate / mfd) * mfn);
994 final_rate = final_rate / post_div;
999 static int _clk_audio_video_set_parent(struct clk *clk, struct clk *parent)
1003 void __iomem *pllbase;
1005 if (clk == &pll4_audio_main_clk)
1006 pllbase = PLL4_AUDIO_BASE_ADDR;
1008 pllbase = PLL5_VIDEO_BASE_ADDR;
1010 reg = __raw_readl(pllbase) & ~ANADIG_PLL_BYPASS_CLK_SRC_MASK;
1011 mux = _get_mux6(parent, &osc_clk, &anaclk_1, &anaclk_2,
1013 reg |= mux << ANADIG_PLL_BYPASS_CLK_SRC_OFFSET;
1014 __raw_writel(reg, pllbase);
1016 /* Set anaclk_x as input */
1017 if (parent == &anaclk_1) {
1018 reg = __raw_readl(ANADIG_MISC1_REG);
1019 reg |= (ANATOP_LVDS_CLK1_IBEN_MASK &
1020 ~ANATOP_LVDS_CLK1_OBEN_MASK);
1021 __raw_writel(reg, ANADIG_MISC1_REG);
1022 } else if (parent == &anaclk_2) {
1023 reg = __raw_readl(ANADIG_MISC1_REG);
1024 reg |= (ANATOP_LVDS_CLK2_IBEN_MASK &
1025 ~ANATOP_LVDS_CLK2_OBEN_MASK);
1026 __raw_writel(reg, ANADIG_MISC1_REG);
1032 static struct clk pll4_audio_main_clk = {
1033 __INIT_CLK_DEBUG(pll4_audio_main_clk)
1035 .enable = _clk_pll_enable,
1036 .disable = _clk_pll_disable,
1037 .set_rate = _clk_audio_video_set_rate,
1038 .get_rate = _clk_audio_video_get_rate,
1039 .round_rate = _clk_audio_video_round_rate,
1040 .set_parent = _clk_audio_video_set_parent,
1043 static struct clk pll5_video_main_clk = {
1044 __INIT_CLK_DEBUG(pll5_video_main_clk)
1046 .enable = _clk_pll_enable,
1047 .disable = _clk_pll_disable,
1048 .set_rate = _clk_audio_video_set_rate,
1049 .get_rate = _clk_audio_video_get_rate,
1050 .round_rate = _clk_audio_video_round_rate,
1051 .set_parent = _clk_audio_video_set_parent,
1054 static int _clk_pll_mlb_main_enable(struct clk *clk)
1057 void __iomem *pllbase;
1059 pllbase = _get_pll_base(clk);
1061 reg = __raw_readl(pllbase);
1062 reg &= ~ANADIG_PLL_BYPASS;
1065 __raw_writel(reg, pllbase);
1067 /* Wait for PLL to lock */
1068 if (!WAIT(__raw_readl(pllbase) & ANADIG_PLL_LOCK,
1070 panic("pll enable failed\n");
1075 static struct clk pll6_mlb150_main_clk = {
1076 __INIT_CLK_DEBUG(pll6_mlb150_main_clk)
1078 .enable = _clk_pll_mlb_main_enable,
1079 .disable = _clk_pll_disable,
1082 static unsigned long _clk_pll7_usb_otg_get_rate(struct clk *clk)
1087 div = __raw_readl(PLL7_480_USB2_BASE_ADDR)
1088 & ANADIG_PLL_480_DIV_SELECT_MASK;
1091 val = clk_get_rate(clk->parent) * 22;
1093 val = clk_get_rate(clk->parent) * 20;
1097 static int _clk_pll7_usb_otg_set_rate(struct clk *clk, unsigned long rate)
1099 unsigned int reg, div;
1101 if (rate == 528000000)
1103 else if (rate == 480000000)
1108 reg = __raw_readl(PLL7_480_USB2_BASE_ADDR);
1109 reg &= ~ANADIG_PLL_480_DIV_SELECT_MASK;
1111 __raw_writel(reg, PLL7_480_USB2_BASE_ADDR);
1116 static struct clk pll7_usb_host_main_clk = {
1117 __INIT_CLK_DEBUG(pll7_usb_host_main_clk)
1119 .enable = _clk_pll_enable,
1120 .disable = _clk_pll_disable,
1121 .set_rate = _clk_pll7_usb_otg_set_rate,
1122 .get_rate = _clk_pll7_usb_otg_get_rate,
1126 static struct clk pll8_enet_main_clk = {
1127 __INIT_CLK_DEBUG(pll8_enet_main_clk)
1129 .enable = _clk_pll_enable,
1130 .disable = _clk_pll_disable,
1133 static unsigned long _clk_arm_get_rate(struct clk *clk)
1137 cacrr = __raw_readl(MXC_CCM_CACRR);
1138 div = (cacrr & MXC_CCM_CACRR_ARM_PODF_MASK) + 1;
1139 return clk_get_rate(clk->parent) / div;
1142 static int _clk_arm_set_rate(struct clk *clk, unsigned long rate)
1149 for (i = 0; i < cpu_op_nr; i++) {
1150 if (rate == cpu_op_tbl[i].cpu_rate)
1156 if (cpu_op_tbl[i].pll_rate != clk_get_rate(&pll1_sys_main_clk)) {
1157 /* Change the PLL1 rate. */
1158 if (pll2_pfd_400M.usecount != 0)
1159 pll1_sw_clk.set_parent(&pll1_sw_clk, &pll2_pfd_400M);
1161 pll1_sw_clk.set_parent(&pll1_sw_clk, &osc_clk);
1162 pll1_sys_main_clk.set_rate(&pll1_sys_main_clk, cpu_op_tbl[i].pll_rate);
1163 pll1_sw_clk.set_parent(&pll1_sw_clk, &pll1_sys_main_clk);
1166 parent_rate = clk_get_rate(clk->parent);
1167 div = parent_rate / rate;
1172 if ((parent_rate / div) > rate)
1178 __raw_writel(div - 1, MXC_CCM_CACRR);
1183 static struct clk cpu_clk = {
1184 __INIT_CLK_DEBUG(cpu_clk)
1185 .parent = &pll1_sw_clk,
1186 .set_rate = _clk_arm_set_rate,
1187 .get_rate = _clk_arm_get_rate,
1190 static unsigned long _clk_twd_get_rate(struct clk *clk)
1192 return clk_get_rate(clk->parent) / 2;
1195 static struct clk twd_clk = {
1196 __INIT_CLK_DEBUG(twd_clk)
1198 .get_rate = _clk_twd_get_rate,
1201 static int _clk_periph_set_parent(struct clk *clk, struct clk *parent)
1206 mux = _get_mux6(parent, &pll2_528_bus_main_clk, &pll2_pfd_400M,
1207 &pll2_pfd_352M, &pll2_200M, &pll3_sw_clk, &osc_clk);
1210 /* Set the pre_periph_clk multiplexer */
1211 reg = __raw_readl(MXC_CCM_CBCMR);
1212 reg &= ~MXC_CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK;
1213 reg |= mux << MXC_CCM_CBCMR_PRE_PERIPH_CLK_SEL_OFFSET;
1214 __raw_writel(reg, MXC_CCM_CBCMR);
1216 /* Set the periph_clk_sel multiplexer. */
1217 reg = __raw_readl(MXC_CCM_CBCDR);
1218 reg &= ~MXC_CCM_CBCDR_PERIPH_CLK_SEL;
1219 __raw_writel(reg, MXC_CCM_CBCDR);
1221 reg = __raw_readl(MXC_CCM_CBCDR);
1222 /* Set the periph_clk2_podf divider to divide by 1. */
1223 reg &= ~MXC_CCM_CBCDR_PERIPH_CLK2_PODF_MASK;
1224 __raw_writel(reg, MXC_CCM_CBCDR);
1226 /* Set the periph_clk2_sel mux. */
1227 reg = __raw_readl(MXC_CCM_CBCMR);
1228 reg &= ~MXC_CCM_CBCMR_PERIPH_CLK2_SEL_MASK;
1229 reg |= ((mux - 4) << MXC_CCM_CBCMR_PERIPH_CLK2_SEL_OFFSET);
1230 __raw_writel(reg, MXC_CCM_CBCMR);
1232 while (__raw_readl(MXC_CCM_CDHIPR))
1235 reg = __raw_readl(MXC_CCM_CBCDR);
1236 /* Set periph_clk_sel to select periph_clk2. */
1237 reg |= MXC_CCM_CBCDR_PERIPH_CLK_SEL;
1238 __raw_writel(reg, MXC_CCM_CBCDR);
1241 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1242 & MXC_CCM_CDHIPR_PERIPH_CLK_SEL_BUSY), SPIN_DELAY))
1243 panic("_clk_periph_set_parent failed\n");
1248 static unsigned long _clk_periph_get_rate(struct clk *clk)
1254 if ((clk->parent == &pll3_sw_clk) || (clk->parent == &osc_clk)) {
1255 reg = __raw_readl(MXC_CCM_CBCDR)
1256 & MXC_CCM_CBCDR_PERIPH_CLK2_PODF_MASK;
1257 div = (reg >> MXC_CCM_CBCDR_PERIPH_CLK2_PODF_OFFSET) + 1;
1259 val = clk_get_rate(clk->parent) / div;
1263 static struct clk periph_clk = {
1264 __INIT_CLK_DEBUG(periph_clk)
1265 .parent = &pll2_528_bus_main_clk,
1266 .set_parent = _clk_periph_set_parent,
1267 .get_rate = _clk_periph_get_rate,
1270 static unsigned long _clk_axi_get_rate(struct clk *clk)
1275 reg = __raw_readl(MXC_CCM_CBCDR) & MXC_CCM_CBCDR_AXI_PODF_MASK;
1276 div = (reg >> MXC_CCM_CBCDR_AXI_PODF_OFFSET);
1278 val = clk_get_rate(clk->parent) / (div + 1);
1282 static int _clk_axi_set_rate(struct clk *clk, unsigned long rate)
1285 u32 parent_rate = clk_get_rate(clk->parent);
1287 div = parent_rate / rate;
1291 if (((parent_rate / div) != rate) || (div > 8))
1294 reg = __raw_readl(MXC_CCM_CBCDR);
1295 reg &= ~MXC_CCM_CBCDR_AXI_PODF_MASK;
1296 reg |= (div - 1) << MXC_CCM_CBCDR_AXI_PODF_OFFSET;
1297 __raw_writel(reg, MXC_CCM_CBCDR);
1299 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1300 & MXC_CCM_CDHIPR_AXI_PODF_BUSY), SPIN_DELAY))
1301 panic("pll _clk_axi_a_set_rate failed\n");
1306 static unsigned long _clk_axi_round_rate(struct clk *clk,
1310 u32 parent_rate = clk_get_rate(clk->parent);
1312 div = parent_rate / rate;
1314 /* Make sure rate is not greater than the maximum
1315 * value for the clock.
1316 * Also prevent a div of 0.
1324 return parent_rate / div;
1327 static int _clk_axi_set_parent(struct clk *clk, struct clk *parent)
1332 mux = _get_mux6(parent, &periph_clk, &pll2_pfd_400M,
1333 &pll3_pfd_540M, NULL, NULL, NULL);
1336 /* Set the AXI_SEL mux */
1337 reg = __raw_readl(MXC_CCM_CBCDR) & ~MXC_CCM_CBCDR_AXI_SEL;
1338 __raw_writel(reg, MXC_CCM_CBCDR);
1340 /* Set the AXI_ALT_SEL mux. */
1341 reg = __raw_readl(MXC_CCM_CBCDR)
1342 & ~MXC_CCM_CBCDR_AXI_ALT_SEL_MASK;
1343 reg |= ((mux - 1) << MXC_CCM_CBCDR_AXI_ALT_SEL_OFFSET);
1344 __raw_writel(reg, MXC_CCM_CBCDR);
1346 /* Set the AXI_SEL mux */
1347 reg = __raw_readl(MXC_CCM_CBCDR) & ~MXC_CCM_CBCDR_AXI_SEL;
1348 reg |= MXC_CCM_CBCDR_AXI_SEL;
1349 __raw_writel(reg, MXC_CCM_CBCDR);
1354 static struct clk axi_clk = {
1355 __INIT_CLK_DEBUG(axi_clk)
1356 .parent = &periph_clk,
1357 .set_parent = _clk_axi_set_parent,
1358 .set_rate = _clk_axi_set_rate,
1359 .get_rate = _clk_axi_get_rate,
1360 .round_rate = _clk_axi_round_rate,
1363 static unsigned long _clk_ahb_get_rate(struct clk *clk)
1367 reg = __raw_readl(MXC_CCM_CBCDR);
1368 div = ((reg & MXC_CCM_CBCDR_AHB_PODF_MASK) >>
1369 MXC_CCM_CBCDR_AHB_PODF_OFFSET) + 1;
1371 return clk_get_rate(clk->parent) / div;
1374 static int _clk_ahb_set_rate(struct clk *clk, unsigned long rate)
1377 u32 parent_rate = clk_get_rate(clk->parent);
1379 div = parent_rate / rate;
1382 if (((parent_rate / div) != rate) || (div > 8))
1385 reg = __raw_readl(MXC_CCM_CBCDR);
1386 reg &= ~MXC_CCM_CBCDR_AHB_PODF_MASK;
1387 reg |= (div - 1) << MXC_CCM_CBCDR_AHB_PODF_OFFSET;
1388 __raw_writel(reg, MXC_CCM_CBCDR);
1390 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR) & MXC_CCM_CDHIPR_AHB_PODF_BUSY),
1392 panic("_clk_ahb_set_rate failed\n");
1397 static unsigned long _clk_ahb_round_rate(struct clk *clk,
1401 u32 parent_rate = clk_get_rate(clk->parent);
1403 div = parent_rate / rate;
1405 /* Make sure rate is not greater than the maximum value for the clock.
1406 * Also prevent a div of 0.
1414 return parent_rate / div;
1417 static struct clk ahb_clk = {
1418 __INIT_CLK_DEBUG(ahb_clk)
1419 .parent = &periph_clk,
1420 .get_rate = _clk_ahb_get_rate,
1421 .set_rate = _clk_ahb_set_rate,
1422 .round_rate = _clk_ahb_round_rate,
1425 static unsigned long _clk_ipg_get_rate(struct clk *clk)
1429 reg = __raw_readl(MXC_CCM_CBCDR);
1430 div = ((reg & MXC_CCM_CBCDR_IPG_PODF_MASK) >>
1431 MXC_CCM_CBCDR_IPG_PODF_OFFSET) + 1;
1433 return clk_get_rate(clk->parent) / div;
1437 static struct clk ipg_clk = {
1438 __INIT_CLK_DEBUG(ipg_clk)
1440 .get_rate = _clk_ipg_get_rate,
1443 static struct clk tzasc1_clk = {
1444 __INIT_CLK_DEBUG(tzasc1_clk)
1447 .enable_reg = MXC_CCM_CCGR2,
1448 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
1449 .enable = _clk_enable,
1450 .disable = _clk_disable_inwait,
1453 static struct clk tzasc2_clk = {
1454 __INIT_CLK_DEBUG(tzasc2_clk)
1457 .enable_reg = MXC_CCM_CCGR2,
1458 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
1459 .enable = _clk_enable,
1460 .disable = _clk_disable_inwait,
1463 static struct clk mx6fast1_clk = {
1464 __INIT_CLK_DEBUG(mx6fast1_clk)
1467 .enable_reg = MXC_CCM_CCGR4,
1468 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
1469 .enable = _clk_enable,
1470 .disable = _clk_disable_inwait,
1473 static struct clk mx6per1_clk = {
1474 __INIT_CLK_DEBUG(mx6per1_clk)
1477 .secondary = &mx6fast1_clk,
1478 .enable_reg = MXC_CCM_CCGR4,
1479 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1480 .enable = _clk_enable,
1481 .disable = _clk_disable_inwait,
1484 static struct clk mx6per2_clk = {
1485 __INIT_CLK_DEBUG(mx6per2_clk)
1488 .enable_reg = MXC_CCM_CCGR4,
1489 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
1490 .enable = _clk_enable,
1491 .disable = _clk_disable_inwait,
1494 static unsigned long _clk_mmdc_ch0_axi_get_rate(struct clk *clk)
1498 reg = __raw_readl(MXC_CCM_CBCDR);
1499 div = ((reg & MXC_CCM_CBCDR_MMDC_CH0_PODF_MASK) >>
1500 MXC_CCM_CBCDR_MMDC_CH0_PODF_OFFSET) + 1;
1502 return clk_get_rate(clk->parent) / div;
1505 static int _clk_mmdc_ch0_axi_set_rate(struct clk *clk, unsigned long rate)
1508 u32 parent_rate = clk_get_rate(clk->parent);
1510 div = parent_rate / rate;
1513 if (((parent_rate / div) != rate) || (div > 8))
1516 reg = __raw_readl(MXC_CCM_CBCDR);
1517 reg &= ~MXC_CCM_CBCDR_MMDC_CH0_PODF_MASK;
1518 reg |= (div - 1) << MXC_CCM_CBCDR_MMDC_CH0_PODF_OFFSET;
1519 __raw_writel(reg, MXC_CCM_CBCDR);
1521 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1522 & MXC_CCM_CDHIPR_MMDC_CH0_PODF_BUSY),
1524 panic("_clk_mmdc_ch0_axi_set_rate failed\n");
1529 static unsigned long _clk_mmdc_ch0_axi_round_rate(struct clk *clk,
1533 u32 parent_rate = clk_get_rate(clk->parent);
1535 div = parent_rate / rate;
1537 /* Make sure rate is not greater than the maximum value for the clock.
1538 * Also prevent a div of 0.
1546 return parent_rate / div;
1549 static struct clk mmdc_ch0_axi_clk[] = {
1551 __INIT_CLK_DEBUG(mmdc_ch0_axi_clk)
1553 .parent = &periph_clk,
1554 .enable = _clk_enable,
1555 .disable = _clk_disable_inwait,
1556 .enable_reg = MXC_CCM_CCGR3,
1557 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
1558 .secondary = &mmdc_ch0_axi_clk[1],
1559 .get_rate = _clk_mmdc_ch0_axi_get_rate,
1560 .set_rate = _clk_mmdc_ch0_axi_set_rate,
1561 .round_rate = _clk_mmdc_ch0_axi_round_rate,
1564 __INIT_CLK_DEBUG(mmdc_ch0_ipg_clk)
1567 .enable = _clk_enable,
1568 .disable = _clk_disable_inwait,
1569 .enable_reg = MXC_CCM_CCGR3,
1570 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
1571 .secondary = &tzasc1_clk,
1575 static unsigned long _clk_mmdc_ch1_axi_get_rate(struct clk *clk)
1579 reg = __raw_readl(MXC_CCM_CBCDR);
1580 div = ((reg & MXC_CCM_CBCDR_MMDC_CH1_PODF_MASK) >>
1581 MXC_CCM_CBCDR_MMDC_CH1_PODF_OFFSET) + 1;
1583 return clk_get_rate(clk->parent) / div;
1586 static int _clk_mmdc_ch1_axi_set_rate(struct clk *clk, unsigned long rate)
1589 u32 parent_rate = clk_get_rate(clk->parent);
1591 div = parent_rate / rate;
1594 if (((parent_rate / div) != rate) || (div > 8))
1597 reg = __raw_readl(MXC_CCM_CBCDR);
1598 reg &= ~MXC_CCM_CBCDR_MMDC_CH1_PODF_MASK;
1599 reg |= (div - 1) << MXC_CCM_CBCDR_MMDC_CH1_PODF_OFFSET;
1600 __raw_writel(reg, MXC_CCM_CBCDR);
1602 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1603 & MXC_CCM_CDHIPR_MMDC_CH1_PODF_BUSY), SPIN_DELAY))
1604 panic("_clk_mmdc_ch1_axi_set_rate failed\n");
1609 static unsigned long _clk_mmdc_ch1_axi_round_rate(struct clk *clk,
1613 u32 parent_rate = clk_get_rate(clk->parent);
1615 div = parent_rate / rate;
1617 /* Make sure rate is not greater than the maximum value for the clock.
1618 * Also prevent a div of 0.
1626 return parent_rate / div;
1629 static struct clk mmdc_ch1_axi_clk[] = {
1631 __INIT_CLK_DEBUG(mmdc_ch1_axi_clk)
1633 .parent = &pll2_pfd_400M,
1634 .enable = _clk_enable,
1635 .disable = _clk_disable,
1636 .enable_reg = MXC_CCM_CCGR3,
1637 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
1638 .secondary = &mmdc_ch1_axi_clk[1],
1639 .get_rate = _clk_mmdc_ch1_axi_get_rate,
1640 .set_rate = _clk_mmdc_ch1_axi_set_rate,
1641 .round_rate = _clk_mmdc_ch1_axi_round_rate,
1645 __INIT_CLK_DEBUG(mmdc_ch1_ipg_clk)
1647 .enable = _clk_enable,
1648 .disable = _clk_disable,
1649 .enable_reg = MXC_CCM_CCGR3,
1650 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
1651 .secondary = &tzasc2_clk,
1655 static struct clk ocram_clk = {
1656 __INIT_CLK_DEBUG(ocram_clk)
1659 .enable_reg = MXC_CCM_CCGR3,
1660 .enable_shift = MXC_CCM_CCGRx_CG14_OFFSET,
1661 .enable = _clk_enable,
1662 .disable = _clk_disable_inwait,
1665 static unsigned long _clk_ipg_perclk_get_rate(struct clk *clk)
1669 reg = __raw_readl(MXC_CCM_CSCMR1);
1670 div = ((reg & MXC_CCM_CSCMR1_PERCLK_PODF_MASK) >>
1671 MXC_CCM_CSCMR1_PERCLK_PODF_OFFSET) + 1;
1673 return clk_get_rate(clk->parent) / div;
1676 static int _clk_ipg_perclk_set_rate(struct clk *clk, unsigned long rate)
1679 u32 parent_rate = clk_get_rate(clk->parent);
1681 div = parent_rate / rate;
1684 if (((parent_rate / div) != rate) || (div > 64))
1687 reg = __raw_readl(MXC_CCM_CSCMR1);
1688 reg &= ~MXC_CCM_CSCMR1_PERCLK_PODF_MASK;
1689 reg |= (div - 1) << MXC_CCM_CSCMR1_PERCLK_PODF_OFFSET;
1690 __raw_writel(reg, MXC_CCM_CSCMR1);
1696 static unsigned long _clk_ipg_perclk_round_rate(struct clk *clk,
1700 u32 parent_rate = clk_get_rate(clk->parent);
1702 div = parent_rate / rate;
1704 /* Make sure rate is not greater than the maximum value for the clock.
1705 * Also prevent a div of 0.
1713 return parent_rate / div;
1716 static struct clk ipg_perclk = {
1717 __INIT_CLK_DEBUG(ipg_perclk)
1719 .get_rate = _clk_ipg_perclk_get_rate,
1720 .set_rate = _clk_ipg_perclk_set_rate,
1721 .round_rate = _clk_ipg_perclk_round_rate,
1724 static struct clk spba_clk = {
1725 __INIT_CLK_DEBUG(spba_clk)
1727 .enable_reg = MXC_CCM_CCGR5,
1728 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1729 .enable = _clk_enable,
1730 .disable = _clk_disable,
1733 static struct clk sdma_clk[] = {
1735 __INIT_CLK_DEBUG(sdma_clk)
1737 .enable_reg = MXC_CCM_CCGR5,
1738 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
1739 .enable = _clk_enable,
1740 .disable = _clk_disable,
1741 .secondary = &sdma_clk[1],
1744 .parent = &mx6per1_clk,
1745 #ifdef CONFIG_SDMA_IRAM
1746 .secondary = &ocram_clk,
1748 .secondary = &mmdc_ch0_axi_clk[0],
1753 static int _clk_gpu2d_axi_set_parent(struct clk *clk, struct clk *parent)
1755 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_GPU2D_AXI_CLK_SEL;
1757 if (parent == &ahb_clk)
1758 reg |= MXC_CCM_CBCMR_GPU2D_AXI_CLK_SEL;
1760 __raw_writel(reg, MXC_CCM_CBCMR);
1765 static struct clk gpu2d_axi_clk = {
1766 __INIT_CLK_DEBUG(gpu2d_axi_clk)
1768 .set_parent = _clk_gpu2d_axi_set_parent,
1771 static int _clk_gpu3d_axi_set_parent(struct clk *clk, struct clk *parent)
1773 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_GPU3D_AXI_CLK_SEL;
1775 if (parent == &ahb_clk)
1776 reg |= MXC_CCM_CBCMR_GPU3D_AXI_CLK_SEL;
1778 __raw_writel(reg, MXC_CCM_CBCMR);
1783 static struct clk gpu3d_axi_clk = {
1784 __INIT_CLK_DEBUG(gpu3d_axi_clk)
1786 .secondary = &mmdc_ch0_axi_clk[0],
1787 .set_parent = _clk_gpu3d_axi_set_parent,
1790 static int _clk_pcie_axi_set_parent(struct clk *clk, struct clk *parent)
1792 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_PCIE_AXI_CLK_SEL;
1794 if (parent == &ahb_clk)
1795 reg |= MXC_CCM_CBCMR_PCIE_AXI_CLK_SEL;
1797 __raw_writel(reg, MXC_CCM_CBCMR);
1802 static struct clk pcie_axi_clk = {
1803 __INIT_CLK_DEBUG(pcie_axi_clk)
1805 .set_parent = _clk_pcie_axi_set_parent,
1808 static int _clk_vdo_axi_set_parent(struct clk *clk, struct clk *parent)
1810 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_VDOAXI_CLK_SEL;
1812 if (parent == &ahb_clk)
1813 reg |= MXC_CCM_CBCMR_VDOAXI_CLK_SEL;
1815 __raw_writel(reg, MXC_CCM_CBCMR);
1820 static struct clk vdo_axi_clk = {
1821 __INIT_CLK_DEBUG(vdo_axi_clk)
1823 .enable_reg = MXC_CCM_CCGR6,
1824 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1825 .enable = _clk_enable,
1826 .disable = _clk_disable,
1827 .set_parent = _clk_vdo_axi_set_parent,
1830 static struct clk vdoa_clk = {
1831 __INIT_CLK_DEBUG(vdoa_clk)
1834 .secondary = &mx6fast1_clk,
1835 .enable_reg = MXC_CCM_CCGR2,
1836 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
1837 .enable = _clk_enable,
1838 .disable = _clk_disable,
1841 static unsigned long _clk_gpt_get_rate(struct clk *clk)
1845 if (mx6q_revision() == IMX_CHIP_REVISION_1_0)
1846 return clk_get_rate(clk->parent);
1848 rate = mx6_timer_rate();
1850 return clk_get_rate(clk->parent);
1855 static struct clk gpt_clk[] = {
1857 __INIT_CLK_DEBUG(gpt_clk)
1860 .enable_reg = MXC_CCM_CCGR1,
1861 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
1862 .enable = _clk_enable,
1863 .disable = _clk_disable,
1864 .get_rate = _clk_gpt_get_rate,
1865 .secondary = &gpt_clk[1],
1868 __INIT_CLK_DEBUG(gpt_serial_clk)
1870 .enable_reg = MXC_CCM_CCGR1,
1871 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
1872 .enable = _clk_enable,
1873 .disable = _clk_disable,
1877 static unsigned long _clk_iim_get_rate(struct clk *clk)
1879 return clk_get_rate(clk->parent);
1882 static struct clk iim_clk = {
1883 __INIT_CLK_DEBUG(iim_clk)
1885 .enable = _clk_enable,
1886 .enable_reg = MXC_CCM_CCGR2,
1887 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1888 .disable = _clk_disable,
1889 .get_rate = _clk_iim_get_rate,
1892 static struct clk i2c_clk[] = {
1894 __INIT_CLK_DEBUG(i2c_clk_0)
1896 .parent = &ipg_perclk,
1897 .enable_reg = MXC_CCM_CCGR2,
1898 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
1899 .enable = _clk_enable,
1900 .disable = _clk_disable,
1903 __INIT_CLK_DEBUG(i2c_clk_1)
1905 .parent = &ipg_perclk,
1906 .enable_reg = MXC_CCM_CCGR2,
1907 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
1908 .enable = _clk_enable,
1909 .disable = _clk_disable,
1912 __INIT_CLK_DEBUG(i2c_clk_2)
1914 .parent = &ipg_perclk,
1915 .enable_reg = MXC_CCM_CCGR2,
1916 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
1917 .enable = _clk_enable,
1918 .disable = _clk_disable,
1922 static int _clk_vpu_axi_set_parent(struct clk *clk, struct clk *parent)
1925 u32 reg = __raw_readl(MXC_CCM_CBCMR)
1926 & ~MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_MASK;
1928 mux = _get_mux6(parent, &axi_clk, &pll2_pfd_400M,
1929 &pll2_pfd_352M, NULL, NULL, NULL);
1931 reg |= (mux << MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_OFFSET);
1933 __raw_writel(reg, MXC_CCM_CBCMR);
1938 static unsigned long _clk_vpu_axi_get_rate(struct clk *clk)
1942 reg = __raw_readl(MXC_CCM_CSCDR1);
1943 div = ((reg & MXC_CCM_CSCDR1_VPU_AXI_PODF_MASK) >>
1944 MXC_CCM_CSCDR1_VPU_AXI_PODF_OFFSET) + 1;
1946 return clk_get_rate(clk->parent) / div;
1949 static int _clk_vpu_axi_set_rate(struct clk *clk, unsigned long rate)
1952 u32 parent_rate = clk_get_rate(clk->parent);
1954 div = parent_rate / rate;
1957 if (((parent_rate / div) != rate) || (div > 8))
1960 reg = __raw_readl(MXC_CCM_CSCDR1);
1961 reg &= ~MXC_CCM_CSCDR1_VPU_AXI_PODF_MASK;
1962 reg |= (div - 1) << MXC_CCM_CSCDR1_VPU_AXI_PODF_OFFSET;
1963 __raw_writel(reg, MXC_CCM_CSCDR1);
1968 static unsigned long _clk_vpu_axi_round_rate(struct clk *clk,
1972 u32 parent_rate = clk_get_rate(clk->parent);
1974 div = parent_rate / rate;
1976 /* Make sure rate is not greater than the maximum value for the clock.
1977 * Also prevent a div of 0.
1985 return parent_rate / div;
1988 static struct clk vpu_clk[] = {
1990 __INIT_CLK_DEBUG(vpu_clk)
1992 .enable_reg = MXC_CCM_CCGR6,
1993 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
1994 .enable = _clk_enable,
1995 .disable = _clk_disable,
1996 .set_parent = _clk_vpu_axi_set_parent,
1997 .round_rate = _clk_vpu_axi_round_rate,
1998 .set_rate = _clk_vpu_axi_set_rate,
1999 .get_rate = _clk_vpu_axi_get_rate,
2000 .secondary = &vpu_clk[1],
2003 .parent = &mmdc_ch0_axi_clk[0],
2004 .secondary = &vpu_clk[2],
2007 .parent = &mx6fast1_clk,
2008 .secondary = &ocram_clk,
2013 static int _clk_ipu1_set_parent(struct clk *clk, struct clk *parent)
2016 u32 reg = __raw_readl(MXC_CCM_CSCDR3)
2017 & ~MXC_CCM_CSCDR3_IPU1_HSP_CLK_SEL_MASK;
2019 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2020 &pll2_pfd_400M, &pll3_120M, &pll3_pfd_540M, NULL, NULL);
2022 reg |= (mux << MXC_CCM_CSCDR3_IPU1_HSP_CLK_SEL_OFFSET);
2024 __raw_writel(reg, MXC_CCM_CSCDR3);
2029 static unsigned long _clk_ipu1_get_rate(struct clk *clk)
2033 reg = __raw_readl(MXC_CCM_CSCDR3);
2034 div = ((reg & MXC_CCM_CSCDR3_IPU1_HSP_PODF_MASK) >>
2035 MXC_CCM_CSCDR3_IPU1_HSP_PODF_OFFSET) + 1;
2037 return clk_get_rate(clk->parent) / div;
2040 static int _clk_ipu1_set_rate(struct clk *clk, unsigned long rate)
2043 u32 parent_rate = clk_get_rate(clk->parent);
2045 div = parent_rate / rate;
2048 if (((parent_rate / div) != rate) || (div > 8))
2051 reg = __raw_readl(MXC_CCM_CSCDR3);
2052 reg &= ~MXC_CCM_CSCDR3_IPU1_HSP_PODF_MASK;
2053 reg |= (div - 1) << MXC_CCM_CSCDR3_IPU1_HSP_PODF_OFFSET;
2054 __raw_writel(reg, MXC_CCM_CSCDR3);
2059 static unsigned long _clk_ipu_round_rate(struct clk *clk,
2063 u32 parent_rate = clk_get_rate(clk->parent);
2065 div = parent_rate / rate;
2067 /* Make sure rate is not greater than the maximum value for the clock.
2068 * Also prevent a div of 0.
2076 return parent_rate / div;
2079 static struct clk ipu1_clk = {
2080 __INIT_CLK_DEBUG(ipu1_clk)
2081 .parent = &mmdc_ch0_axi_clk[0],
2082 .secondary = &mmdc_ch0_axi_clk[0],
2083 .enable_reg = MXC_CCM_CCGR3,
2084 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
2085 .enable = _clk_enable,
2086 .disable = _clk_disable,
2087 .set_parent = _clk_ipu1_set_parent,
2088 .round_rate = _clk_ipu_round_rate,
2089 .set_rate = _clk_ipu1_set_rate,
2090 .get_rate = _clk_ipu1_get_rate,
2091 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2094 static int _clk_ipu2_set_parent(struct clk *clk, struct clk *parent)
2097 u32 reg = __raw_readl(MXC_CCM_CSCDR3)
2098 & ~MXC_CCM_CSCDR3_IPU2_HSP_CLK_SEL_MASK;
2100 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2101 &pll2_pfd_400M, &pll3_120M, &pll3_pfd_540M, NULL, NULL);
2103 reg |= (mux << MXC_CCM_CSCDR3_IPU2_HSP_CLK_SEL_OFFSET);
2105 __raw_writel(reg, MXC_CCM_CSCDR3);
2110 static unsigned long _clk_ipu2_get_rate(struct clk *clk)
2114 reg = __raw_readl(MXC_CCM_CSCDR3);
2115 div = ((reg & MXC_CCM_CSCDR3_IPU2_HSP_PODF_MASK) >>
2116 MXC_CCM_CSCDR3_IPU2_HSP_PODF_OFFSET) + 1;
2118 return clk_get_rate(clk->parent) / div;
2121 static int _clk_ipu2_set_rate(struct clk *clk, unsigned long rate)
2124 u32 parent_rate = clk_get_rate(clk->parent);
2126 div = parent_rate / rate;
2129 if (((parent_rate / div) != rate) || (div > 8))
2132 reg = __raw_readl(MXC_CCM_CSCDR3);
2133 reg &= ~MXC_CCM_CSCDR3_IPU2_HSP_PODF_MASK;
2134 reg |= (div - 1) << MXC_CCM_CSCDR3_IPU2_HSP_PODF_OFFSET;
2135 __raw_writel(reg, MXC_CCM_CSCDR3);
2140 static struct clk ipu2_clk = {
2141 __INIT_CLK_DEBUG(ipu2_clk)
2142 .parent = &mmdc_ch0_axi_clk[0],
2143 .secondary = &mmdc_ch0_axi_clk[0],
2144 .enable_reg = MXC_CCM_CCGR3,
2145 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
2146 .enable = _clk_enable,
2147 .disable = _clk_disable,
2148 .set_parent = _clk_ipu2_set_parent,
2149 .round_rate = _clk_ipu_round_rate,
2150 .set_rate = _clk_ipu2_set_rate,
2151 .get_rate = _clk_ipu2_get_rate,
2152 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2155 static struct clk usdhc_dep_clk = {
2156 .parent = &mmdc_ch0_axi_clk[0],
2157 .secondary = &mx6per1_clk,
2158 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2161 static unsigned long _clk_usdhc_round_rate(struct clk *clk,
2165 u32 parent_rate = clk_get_rate(clk->parent);
2167 div = parent_rate / rate;
2169 /* Make sure rate is not greater than the maximum value for the clock.
2170 * Also prevent a div of 0.
2178 return parent_rate / div;
2181 static int _clk_usdhc1_set_parent(struct clk *clk, struct clk *parent)
2183 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC1_CLK_SEL;
2185 if (parent == &pll2_pfd_352M)
2186 reg |= (MXC_CCM_CSCMR1_USDHC1_CLK_SEL);
2188 __raw_writel(reg, MXC_CCM_CSCMR1);
2193 static unsigned long _clk_usdhc1_get_rate(struct clk *clk)
2197 reg = __raw_readl(MXC_CCM_CSCDR1);
2198 div = ((reg & MXC_CCM_CSCDR1_USDHC1_PODF_MASK) >>
2199 MXC_CCM_CSCDR1_USDHC1_PODF_OFFSET) + 1;
2201 return clk_get_rate(clk->parent) / div;
2204 static int _clk_usdhc1_set_rate(struct clk *clk, unsigned long rate)
2207 u32 parent_rate = clk_get_rate(clk->parent);
2209 div = parent_rate / rate;
2212 if (((parent_rate / div) != rate) || (div > 8))
2215 reg = __raw_readl(MXC_CCM_CSCDR1);
2216 reg &= ~MXC_CCM_CSCDR1_USDHC1_PODF_MASK;
2217 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC1_PODF_OFFSET;
2218 __raw_writel(reg, MXC_CCM_CSCDR1);
2223 static struct clk usdhc1_clk = {
2224 __INIT_CLK_DEBUG(usdhc1_clk)
2226 .parent = &pll2_pfd_400M,
2227 .secondary = &usdhc_dep_clk,
2228 .enable_reg = MXC_CCM_CCGR6,
2229 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
2230 .enable = _clk_enable,
2231 .disable = _clk_disable,
2232 .set_parent = _clk_usdhc1_set_parent,
2233 .round_rate = _clk_usdhc_round_rate,
2234 .set_rate = _clk_usdhc1_set_rate,
2235 .get_rate = _clk_usdhc1_get_rate,
2236 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2239 static int _clk_usdhc2_set_parent(struct clk *clk, struct clk *parent)
2241 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC2_CLK_SEL;
2243 if (parent == &pll2_pfd_352M)
2244 reg |= (MXC_CCM_CSCMR1_USDHC2_CLK_SEL);
2246 __raw_writel(reg, MXC_CCM_CSCMR1);
2251 static unsigned long _clk_usdhc2_get_rate(struct clk *clk)
2255 reg = __raw_readl(MXC_CCM_CSCDR1);
2256 div = ((reg & MXC_CCM_CSCDR1_USDHC2_PODF_MASK) >>
2257 MXC_CCM_CSCDR1_USDHC2_PODF_OFFSET) + 1;
2259 return clk_get_rate(clk->parent) / div;
2262 static int _clk_usdhc2_set_rate(struct clk *clk, unsigned long rate)
2265 u32 parent_rate = clk_get_rate(clk->parent);
2267 div = parent_rate / rate;
2270 if (((parent_rate / div) != rate) || (div > 8))
2273 reg = __raw_readl(MXC_CCM_CSCDR1);
2274 reg &= ~MXC_CCM_CSCDR1_USDHC2_PODF_MASK;
2275 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC2_PODF_OFFSET;
2276 __raw_writel(reg, MXC_CCM_CSCDR1);
2281 static struct clk usdhc2_clk = {
2282 __INIT_CLK_DEBUG(usdhc2_clk)
2284 .parent = &pll2_pfd_400M,
2285 .secondary = &usdhc_dep_clk,
2286 .enable_reg = MXC_CCM_CCGR6,
2287 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
2288 .enable = _clk_enable,
2289 .disable = _clk_disable,
2290 .set_parent = _clk_usdhc2_set_parent,
2291 .round_rate = _clk_usdhc_round_rate,
2292 .set_rate = _clk_usdhc2_set_rate,
2293 .get_rate = _clk_usdhc2_get_rate,
2294 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2297 static int _clk_usdhc3_set_parent(struct clk *clk, struct clk *parent)
2299 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC3_CLK_SEL;
2301 if (parent == &pll2_pfd_352M)
2302 reg |= (MXC_CCM_CSCMR1_USDHC3_CLK_SEL);
2304 __raw_writel(reg, MXC_CCM_CSCMR1);
2309 static unsigned long _clk_usdhc3_get_rate(struct clk *clk)
2313 reg = __raw_readl(MXC_CCM_CSCDR1);
2314 div = ((reg & MXC_CCM_CSCDR1_USDHC3_PODF_MASK) >>
2315 MXC_CCM_CSCDR1_USDHC3_PODF_OFFSET) + 1;
2317 return clk_get_rate(clk->parent) / div;
2320 static int _clk_usdhc3_set_rate(struct clk *clk, unsigned long rate)
2323 u32 parent_rate = clk_get_rate(clk->parent);
2325 div = parent_rate / rate;
2328 if (((parent_rate / div) != rate) || (div > 8))
2331 reg = __raw_readl(MXC_CCM_CSCDR1);
2332 reg &= ~MXC_CCM_CSCDR1_USDHC3_PODF_MASK;
2333 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC3_PODF_OFFSET;
2334 __raw_writel(reg, MXC_CCM_CSCDR1);
2340 static struct clk usdhc3_clk = {
2341 __INIT_CLK_DEBUG(usdhc3_clk)
2343 .parent = &pll2_pfd_400M,
2344 .secondary = &usdhc_dep_clk,
2345 .enable_reg = MXC_CCM_CCGR6,
2346 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
2347 .enable = _clk_enable,
2348 .disable = _clk_disable,
2349 .set_parent = _clk_usdhc3_set_parent,
2350 .round_rate = _clk_usdhc_round_rate,
2351 .set_rate = _clk_usdhc3_set_rate,
2352 .get_rate = _clk_usdhc3_get_rate,
2353 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2356 static int _clk_usdhc4_set_parent(struct clk *clk, struct clk *parent)
2358 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC4_CLK_SEL;
2360 if (parent == &pll2_pfd_352M)
2361 reg |= (MXC_CCM_CSCMR1_USDHC4_CLK_SEL);
2363 __raw_writel(reg, MXC_CCM_CSCMR1);
2368 static unsigned long _clk_usdhc4_get_rate(struct clk *clk)
2372 reg = __raw_readl(MXC_CCM_CSCDR1);
2373 div = ((reg & MXC_CCM_CSCDR1_USDHC4_PODF_MASK) >>
2374 MXC_CCM_CSCDR1_USDHC4_PODF_OFFSET) + 1;
2376 return clk_get_rate(clk->parent) / div;
2379 static int _clk_usdhc4_set_rate(struct clk *clk, unsigned long rate)
2382 u32 parent_rate = clk_get_rate(clk->parent);
2384 div = parent_rate / rate;
2387 if (((parent_rate / div) != rate) || (div > 8))
2390 reg = __raw_readl(MXC_CCM_CSCDR1);
2391 reg &= ~MXC_CCM_CSCDR1_USDHC4_PODF_MASK;
2392 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC4_PODF_OFFSET;
2393 __raw_writel(reg, MXC_CCM_CSCDR1);
2399 static struct clk usdhc4_clk = {
2400 __INIT_CLK_DEBUG(usdhc4_clk)
2402 .parent = &pll2_pfd_400M,
2403 .secondary = &usdhc_dep_clk,
2404 .enable_reg = MXC_CCM_CCGR6,
2405 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
2406 .enable = _clk_enable,
2407 .disable = _clk_disable,
2408 .set_parent = _clk_usdhc4_set_parent,
2409 .round_rate = _clk_usdhc_round_rate,
2410 .set_rate = _clk_usdhc4_set_rate,
2411 .get_rate = _clk_usdhc4_get_rate,
2412 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2415 static unsigned long _clk_ssi_round_rate(struct clk *clk,
2419 u32 parent_rate = clk_get_rate(clk->parent);
2420 u32 div = parent_rate / rate;
2422 if (parent_rate % rate)
2425 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2427 return parent_rate / (pre * post);
2430 static unsigned long _clk_ssi1_get_rate(struct clk *clk)
2432 u32 reg, prediv, podf;
2434 reg = __raw_readl(MXC_CCM_CS1CDR);
2436 prediv = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK)
2437 >> MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET) + 1;
2438 podf = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK)
2439 >> MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET) + 1;
2441 return clk_get_rate(clk->parent) / (prediv * podf);
2444 static int _clk_ssi1_set_rate(struct clk *clk, unsigned long rate)
2446 u32 reg, div, pre, post;
2447 u32 parent_rate = clk_get_rate(clk->parent);
2449 div = parent_rate / rate;
2452 if (((parent_rate / div) != rate) || div > 512)
2455 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2457 reg = __raw_readl(MXC_CCM_CS1CDR);
2458 reg &= ~(MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK |
2459 MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK);
2460 reg |= (post - 1) << MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET;
2461 reg |= (pre - 1) << MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET;
2463 __raw_writel(reg, MXC_CCM_CS1CDR);
2469 static int _clk_ssi1_set_parent(struct clk *clk, struct clk *parent)
2473 reg = __raw_readl(MXC_CCM_CSCMR1)
2474 & ~MXC_CCM_CSCMR1_SSI1_CLK_SEL_MASK;
2476 mux = _get_mux6(parent, &pll3_pfd_508M, &pll3_pfd_454M,
2477 &pll4_audio_main_clk, NULL, NULL, NULL);
2478 reg |= (mux << MXC_CCM_CSCMR1_SSI1_CLK_SEL_OFFSET);
2480 __raw_writel(reg, MXC_CCM_CSCMR1);
2485 static struct clk ssi1_clk = {
2486 __INIT_CLK_DEBUG(ssi1_clk)
2487 .parent = &pll3_pfd_508M,
2488 .enable_reg = MXC_CCM_CCGR5,
2489 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
2490 .enable = _clk_enable,
2491 .disable = _clk_disable,
2492 .set_parent = _clk_ssi1_set_parent,
2493 .set_rate = _clk_ssi1_set_rate,
2494 .round_rate = _clk_ssi_round_rate,
2495 .get_rate = _clk_ssi1_get_rate,
2496 #ifdef CONFIG_SND_MXC_SOC_IRAM
2497 .secondary = &ocram_clk,
2499 .secondary = &mmdc_ch0_axi_clk[0],
2503 static unsigned long _clk_ssi2_get_rate(struct clk *clk)
2505 u32 reg, prediv, podf;
2507 reg = __raw_readl(MXC_CCM_CS2CDR);
2509 prediv = ((reg & MXC_CCM_CS2CDR_SSI2_CLK_PRED_MASK)
2510 >> MXC_CCM_CS2CDR_SSI2_CLK_PRED_OFFSET) + 1;
2511 podf = ((reg & MXC_CCM_CS2CDR_SSI2_CLK_PODF_MASK)
2512 >> MXC_CCM_CS2CDR_SSI2_CLK_PODF_OFFSET) + 1;
2514 return clk_get_rate(clk->parent) / (prediv * podf);
2517 static int _clk_ssi2_set_rate(struct clk *clk, unsigned long rate)
2519 u32 reg, div, pre, post;
2520 u32 parent_rate = clk_get_rate(clk->parent);
2522 div = parent_rate / rate;
2525 if (((parent_rate / div) != rate) || div > 512)
2528 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2530 reg = __raw_readl(MXC_CCM_CS2CDR);
2531 reg &= ~(MXC_CCM_CS2CDR_SSI2_CLK_PRED_MASK |
2532 MXC_CCM_CS2CDR_SSI2_CLK_PODF_MASK);
2533 reg |= (post - 1) << MXC_CCM_CS2CDR_SSI2_CLK_PODF_OFFSET;
2534 reg |= (pre - 1) << MXC_CCM_CS2CDR_SSI2_CLK_PRED_OFFSET;
2536 __raw_writel(reg, MXC_CCM_CS2CDR);
2542 static int _clk_ssi2_set_parent(struct clk *clk, struct clk *parent)
2546 reg = __raw_readl(MXC_CCM_CSCMR1)
2547 & ~MXC_CCM_CSCMR1_SSI2_CLK_SEL_MASK;
2549 mux = _get_mux6(parent, &pll3_pfd_508M, &pll3_pfd_454M,
2550 &pll4_audio_main_clk, NULL, NULL, NULL);
2551 reg |= (mux << MXC_CCM_CSCMR1_SSI2_CLK_SEL_OFFSET);
2553 __raw_writel(reg, MXC_CCM_CSCMR1);
2558 static struct clk ssi2_clk = {
2559 __INIT_CLK_DEBUG(ssi2_clk)
2560 .parent = &pll3_pfd_508M,
2561 .enable_reg = MXC_CCM_CCGR5,
2562 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
2563 .enable = _clk_enable,
2564 .disable = _clk_disable,
2565 .set_parent = _clk_ssi2_set_parent,
2566 .set_rate = _clk_ssi2_set_rate,
2567 .round_rate = _clk_ssi_round_rate,
2568 .get_rate = _clk_ssi2_get_rate,
2569 #ifdef CONFIG_SND_MXC_SOC_IRAM
2570 .secondary = &ocram_clk,
2572 .secondary = &mmdc_ch0_axi_clk[0],
2576 static unsigned long _clk_ssi3_get_rate(struct clk *clk)
2578 u32 reg, prediv, podf;
2580 reg = __raw_readl(MXC_CCM_CS1CDR);
2582 prediv = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK)
2583 >> MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET) + 1;
2584 podf = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK)
2585 >> MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET) + 1;
2587 return clk_get_rate(clk->parent) / (prediv * podf);
2590 static int _clk_ssi3_set_rate(struct clk *clk, unsigned long rate)
2592 u32 reg, div, pre, post;
2593 u32 parent_rate = clk_get_rate(clk->parent);
2595 div = parent_rate / rate;
2598 if (((parent_rate / div) != rate) || div > 512)
2601 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2603 reg = __raw_readl(MXC_CCM_CS1CDR);
2604 reg &= ~(MXC_CCM_CS1CDR_SSI3_CLK_PODF_MASK|
2605 MXC_CCM_CS1CDR_SSI3_CLK_PRED_MASK);
2606 reg |= (post - 1) << MXC_CCM_CS1CDR_SSI3_CLK_PODF_OFFSET;
2607 reg |= (pre - 1) << MXC_CCM_CS1CDR_SSI3_CLK_PRED_OFFSET;
2609 __raw_writel(reg, MXC_CCM_CS1CDR);
2615 static int _clk_ssi3_set_parent(struct clk *clk, struct clk *parent)
2619 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_SSI3_CLK_SEL_MASK;
2621 mux = _get_mux6(parent, &pll3_pfd_508M, &pll3_pfd_454M,
2622 &pll4_audio_main_clk, NULL, NULL, NULL);
2623 reg |= (mux << MXC_CCM_CSCMR1_SSI3_CLK_SEL_OFFSET);
2625 __raw_writel(reg, MXC_CCM_CSCMR1);
2630 static struct clk ssi3_clk = {
2631 __INIT_CLK_DEBUG(ssi3_clk)
2632 .parent = &pll3_pfd_508M,
2633 .enable_reg = MXC_CCM_CCGR5,
2634 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
2635 .enable = _clk_enable,
2636 .disable = _clk_disable,
2637 .set_parent = _clk_ssi3_set_parent,
2638 .set_rate = _clk_ssi3_set_rate,
2639 .round_rate = _clk_ssi_round_rate,
2640 .get_rate = _clk_ssi3_get_rate,
2641 #ifdef CONFIG_SND_MXC_SOC_IRAM
2642 .secondary = &ocram_clk,
2644 .secondary = &mmdc_ch0_axi_clk[0],
2648 static unsigned long _clk_ldb_di_round_rate(struct clk *clk,
2651 u32 parent_rate = clk_get_rate(clk->parent);
2653 if (rate * 7 <= parent_rate + parent_rate/20)
2654 return parent_rate / 7;
2656 return 2 * parent_rate / 7;
2659 static unsigned long _clk_ldb_di0_get_rate(struct clk *clk)
2663 div = __raw_readl(MXC_CCM_CSCMR2) &
2664 MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
2667 return clk_get_rate(clk->parent) / 7;
2669 return (2 * clk_get_rate(clk->parent)) / 7;
2672 static int _clk_ldb_di0_set_rate(struct clk *clk, unsigned long rate)
2675 u32 parent_rate = clk_get_rate(clk->parent);
2677 if (rate * 7 <= parent_rate + parent_rate/20) {
2679 rate = parent_rate / 7;
2681 rate = 2 * parent_rate / 7;
2683 reg = __raw_readl(MXC_CCM_CSCMR2);
2685 reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
2687 reg &= ~MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
2689 __raw_writel(reg, MXC_CCM_CSCMR2);
2694 static int _clk_ldb_di0_set_parent(struct clk *clk, struct clk *parent)
2698 reg = __raw_readl(MXC_CCM_CS2CDR)
2699 & ~MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK;
2701 mux = _get_mux6(parent, &pll5_video_main_clk,
2702 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M,
2703 &pll3_usb_otg_main_clk, NULL);
2704 reg |= (mux << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET);
2706 __raw_writel(reg, MXC_CCM_CS2CDR);
2711 static struct clk ldb_di0_clk = {
2712 __INIT_CLK_DEBUG(ldb_di0_clk)
2714 .parent = &pll3_pfd_540M,
2715 .enable_reg = MXC_CCM_CCGR3,
2716 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
2717 .enable = _clk_enable,
2718 .disable = _clk_disable,
2719 .set_parent = _clk_ldb_di0_set_parent,
2720 .set_rate = _clk_ldb_di0_set_rate,
2721 .round_rate = _clk_ldb_di_round_rate,
2722 .get_rate = _clk_ldb_di0_get_rate,
2723 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2726 static unsigned long _clk_ldb_di1_get_rate(struct clk *clk)
2730 div = __raw_readl(MXC_CCM_CSCMR2) &
2731 MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
2734 return clk_get_rate(clk->parent) / 7;
2736 return (2 * clk_get_rate(clk->parent)) / 7;
2739 static int _clk_ldb_di1_set_rate(struct clk *clk, unsigned long rate)
2742 u32 parent_rate = clk_get_rate(clk->parent);
2744 if (rate * 7 <= parent_rate + parent_rate/20) {
2746 rate = parent_rate / 7;
2748 rate = 2 * parent_rate / 7;
2750 reg = __raw_readl(MXC_CCM_CSCMR2);
2752 reg |= MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
2754 reg &= ~MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
2756 __raw_writel(reg, MXC_CCM_CSCMR2);
2761 static int _clk_ldb_di1_set_parent(struct clk *clk, struct clk *parent)
2765 reg = __raw_readl(MXC_CCM_CS2CDR)
2766 & ~MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK;
2768 mux = _get_mux6(parent, &pll5_video_main_clk,
2769 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M,
2770 &pll3_usb_otg_main_clk, NULL);
2771 reg |= (mux << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
2773 __raw_writel(reg, MXC_CCM_CS2CDR);
2778 static struct clk ldb_di1_clk = {
2779 __INIT_CLK_DEBUG(ldb_di1_clk)
2781 .parent = &pll3_pfd_540M,
2782 .enable_reg = MXC_CCM_CCGR3,
2783 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
2784 .enable = _clk_enable,
2785 .disable = _clk_disable,
2786 .set_parent = _clk_ldb_di1_set_parent,
2787 .set_rate = _clk_ldb_di1_set_rate,
2788 .round_rate = _clk_ldb_di_round_rate,
2789 .get_rate = _clk_ldb_di1_get_rate,
2790 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2794 static unsigned long _clk_ipu_di_round_rate(struct clk *clk,
2798 u32 parent_rate = clk_get_rate(clk->parent);
2800 if ((clk->parent == &ldb_di0_clk) ||
2801 (clk->parent == &ldb_di1_clk))
2804 div = parent_rate / rate;
2805 /* Round to closest divisor */
2806 if ((parent_rate % rate) > (rate / 2))
2809 /* Make sure rate is not greater than the maximum value for the clock.
2810 * Also prevent a div of 0.
2818 return parent_rate / div;
2821 static unsigned long _clk_ipu1_di0_get_rate(struct clk *clk)
2825 if ((clk->parent == &ldb_di0_clk) ||
2826 (clk->parent == &ldb_di1_clk))
2827 return clk_get_rate(clk->parent);
2829 reg = __raw_readl(MXC_CCM_CHSCCDR);
2831 div = ((reg & MXC_CCM_CHSCCDR_IPU1_DI0_PODF_MASK) >>
2832 MXC_CCM_CHSCCDR_IPU1_DI0_PODF_OFFSET) + 1;
2834 return clk_get_rate(clk->parent) / div;
2837 static int _clk_ipu1_di0_set_rate(struct clk *clk, unsigned long rate)
2840 u32 parent_rate = clk_get_rate(clk->parent);
2842 if ((clk->parent == &ldb_di0_clk) ||
2843 (clk->parent == &ldb_di1_clk)) {
2844 if (parent_rate == rate)
2850 div = parent_rate / rate;
2853 if (((parent_rate / div) != rate) || (div > 8))
2856 reg = __raw_readl(MXC_CCM_CHSCCDR);
2857 reg &= ~MXC_CCM_CHSCCDR_IPU1_DI0_PODF_MASK;
2858 reg |= (div - 1) << MXC_CCM_CHSCCDR_IPU1_DI0_PODF_OFFSET;
2859 __raw_writel(reg, MXC_CCM_CHSCCDR);
2865 static int _clk_ipu1_di0_set_parent(struct clk *clk, struct clk *parent)
2869 if (parent == &ldb_di0_clk)
2871 else if (parent == &ldb_di1_clk)
2874 reg = __raw_readl(MXC_CCM_CHSCCDR)
2875 & ~MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_MASK;
2877 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2878 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
2879 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
2880 reg |= (mux << MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_OFFSET);
2882 __raw_writel(reg, MXC_CCM_CHSCCDR);
2884 /* Derive clock from divided pre-muxed ipu1_di0 clock.*/
2888 reg = __raw_readl(MXC_CCM_CHSCCDR)
2889 & ~MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_MASK;
2890 __raw_writel(reg | (mux << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET),
2896 static unsigned long _clk_ipu1_di1_get_rate(struct clk *clk)
2900 if ((clk->parent == &ldb_di0_clk) ||
2901 (clk->parent == &ldb_di1_clk))
2902 return clk_get_rate(clk->parent);
2904 reg = __raw_readl(MXC_CCM_CHSCCDR);
2906 div = ((reg & MXC_CCM_CHSCCDR_IPU1_DI1_PODF_MASK)
2907 >> MXC_CCM_CHSCCDR_IPU1_DI1_PODF_OFFSET) + 1;
2909 return clk_get_rate(clk->parent) / div;
2912 static int _clk_ipu1_di1_set_rate(struct clk *clk, unsigned long rate)
2915 u32 parent_rate = clk_get_rate(clk->parent);
2917 if ((clk->parent == &ldb_di0_clk) ||
2918 (clk->parent == &ldb_di1_clk)) {
2919 if (parent_rate == rate)
2925 div = parent_rate / rate;
2928 if (((parent_rate / div) != rate) || (div > 8))
2931 reg = __raw_readl(MXC_CCM_CHSCCDR);
2932 reg &= ~MXC_CCM_CHSCCDR_IPU1_DI1_PODF_MASK;
2933 reg |= (div - 1) << MXC_CCM_CHSCCDR_IPU1_DI1_PODF_OFFSET;
2934 __raw_writel(reg, MXC_CCM_CHSCCDR);
2940 static int _clk_ipu1_di1_set_parent(struct clk *clk, struct clk *parent)
2944 if (parent == &ldb_di0_clk)
2946 else if (parent == &ldb_di1_clk)
2949 reg = __raw_readl(MXC_CCM_CHSCCDR)
2950 & ~MXC_CCM_CHSCCDR_IPU1_DI1_PRE_CLK_SEL_MASK;
2952 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2953 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
2954 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
2955 reg |= (mux << MXC_CCM_CHSCCDR_IPU1_DI1_PRE_CLK_SEL_OFFSET);
2957 __raw_writel(reg, MXC_CCM_CHSCCDR);
2959 /* Derive clock from divided pre-muxed ipu1_di0 clock.*/
2962 reg = __raw_readl(MXC_CCM_CHSCCDR)
2963 & ~MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_MASK;
2964 __raw_writel(reg | (mux << MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET),
2970 static struct clk ipu1_di_clk[] = {
2972 __INIT_CLK_DEBUG(ipu1_di_clk_0)
2974 .parent = &pll5_video_main_clk,
2975 .enable_reg = MXC_CCM_CCGR3,
2976 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
2977 .enable = _clk_enable,
2978 .disable = _clk_disable,
2979 .set_parent = _clk_ipu1_di0_set_parent,
2980 .set_rate = _clk_ipu1_di0_set_rate,
2981 .round_rate = _clk_ipu_di_round_rate,
2982 .get_rate = _clk_ipu1_di0_get_rate,
2983 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2986 __INIT_CLK_DEBUG(ipu1_di_clk_1)
2988 .parent = &pll5_video_main_clk,
2989 .enable_reg = MXC_CCM_CCGR3,
2990 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
2991 .enable = _clk_enable,
2992 .disable = _clk_disable,
2993 .set_parent = _clk_ipu1_di1_set_parent,
2994 .set_rate = _clk_ipu1_di1_set_rate,
2995 .round_rate = _clk_ipu_di_round_rate,
2996 .get_rate = _clk_ipu1_di1_get_rate,
2997 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3001 static unsigned long _clk_ipu2_di0_get_rate(struct clk *clk)
3005 if ((clk->parent == &ldb_di0_clk) ||
3006 (clk->parent == &ldb_di1_clk))
3007 return clk_get_rate(clk->parent);
3009 reg = __raw_readl(MXC_CCM_CSCDR2);
3011 div = ((reg & MXC_CCM_CSCDR2_IPU2_DI0_PODF_MASK) >>
3012 MXC_CCM_CSCDR2_IPU2_DI0_PODF_OFFSET) + 1;
3014 return clk_get_rate(clk->parent) / div;
3017 static int _clk_ipu2_di0_set_rate(struct clk *clk, unsigned long rate)
3020 u32 parent_rate = clk_get_rate(clk->parent);
3022 if ((clk->parent == &ldb_di0_clk) ||
3023 (clk->parent == &ldb_di1_clk)) {
3024 if (parent_rate == rate)
3030 div = parent_rate / rate;
3033 if (((parent_rate / div) != rate) || (div > 8))
3036 reg = __raw_readl(MXC_CCM_CSCDR2);
3037 reg &= ~MXC_CCM_CSCDR2_IPU2_DI0_PODF_MASK;
3038 reg |= (div - 1) << MXC_CCM_CSCDR2_IPU2_DI0_PODF_OFFSET;
3039 __raw_writel(reg, MXC_CCM_CSCDR2);
3044 static int _clk_ipu2_di0_set_parent(struct clk *clk, struct clk *parent)
3048 if (parent == &ldb_di0_clk)
3050 else if (parent == &ldb_di1_clk)
3053 reg = __raw_readl(MXC_CCM_CSCDR2)
3054 & ~MXC_CCM_CSCDR2_IPU2_DI0_PRE_CLK_SEL_MASK;
3056 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
3057 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
3058 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
3059 reg |= (mux << MXC_CCM_CSCDR2_IPU2_DI0_PRE_CLK_SEL_OFFSET);
3061 __raw_writel(reg, MXC_CCM_CSCDR2);
3063 /* Derive clock from divided pre-muxed ipu2_di0 clock.*/
3066 reg = __raw_readl(MXC_CCM_CSCDR2)
3067 & ~MXC_CCM_CSCDR2_IPU2_DI0_CLK_SEL_MASK;
3068 __raw_writel(reg | (mux << MXC_CCM_CSCDR2_IPU2_DI0_CLK_SEL_OFFSET),
3074 static unsigned long _clk_ipu2_di1_get_rate(struct clk *clk)
3078 if ((clk->parent == &ldb_di0_clk) ||
3079 (clk->parent == &ldb_di1_clk))
3080 return clk_get_rate(clk->parent);
3082 reg = __raw_readl(MXC_CCM_CSCDR2);
3084 div = ((reg & MXC_CCM_CSCDR2_IPU2_DI1_PODF_MASK)
3085 >> MXC_CCM_CSCDR2_IPU2_DI1_PODF_OFFSET) + 1;
3087 return clk_get_rate(clk->parent) / div;
3090 static int _clk_ipu2_di1_set_rate(struct clk *clk, unsigned long rate)
3093 u32 parent_rate = clk_get_rate(clk->parent);
3095 if ((clk->parent == &ldb_di0_clk) ||
3096 (clk->parent == &ldb_di1_clk)) {
3097 if (parent_rate == rate)
3103 div = parent_rate / rate;
3106 if (((parent_rate / div) != rate) || (div > 8))
3109 reg = __raw_readl(MXC_CCM_CSCDR2);
3110 reg &= ~MXC_CCM_CSCDR2_IPU2_DI1_PODF_MASK;
3111 reg |= (div - 1) << MXC_CCM_CSCDR2_IPU2_DI1_PODF_OFFSET;
3112 __raw_writel(reg, MXC_CCM_CSCDR2);
3117 static int _clk_ipu2_di1_set_parent(struct clk *clk, struct clk *parent)
3121 if (parent == &ldb_di0_clk)
3123 else if (parent == &ldb_di1_clk)
3126 reg = __raw_readl(MXC_CCM_CSCDR2)
3127 & ~MXC_CCM_CSCDR2_IPU2_DI1_PRE_CLK_SEL_MASK;
3129 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
3130 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
3131 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
3132 reg |= (mux << MXC_CCM_CSCDR2_IPU2_DI1_PRE_CLK_SEL_OFFSET);
3134 __raw_writel(reg, MXC_CCM_CSCDR2);
3136 /* Derive clock from divided pre-muxed ipu1_di0 clock.*/
3139 reg = __raw_readl(MXC_CCM_CSCDR2)
3140 & ~MXC_CCM_CSCDR2_IPU2_DI1_CLK_SEL_MASK;
3141 __raw_writel(reg | (mux << MXC_CCM_CSCDR2_IPU2_DI1_CLK_SEL_OFFSET),
3147 static struct clk ipu2_di_clk[] = {
3149 __INIT_CLK_DEBUG(ipu2_di_clk_0)
3151 .parent = &pll5_video_main_clk,
3152 .enable_reg = MXC_CCM_CCGR3,
3153 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
3154 .enable = _clk_enable,
3155 .disable = _clk_disable,
3156 .set_parent = _clk_ipu2_di0_set_parent,
3157 .set_rate = _clk_ipu2_di0_set_rate,
3158 .round_rate = _clk_ipu_di_round_rate,
3159 .get_rate = _clk_ipu2_di0_get_rate,
3160 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3163 __INIT_CLK_DEBUG(ipu2_di_clk_1)
3165 .parent = &pll5_video_main_clk,
3166 .enable_reg = MXC_CCM_CCGR3,
3167 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
3168 .enable = _clk_enable,
3169 .disable = _clk_disable,
3170 .set_parent = _clk_ipu2_di1_set_parent,
3171 .set_rate = _clk_ipu2_di1_set_rate,
3172 .round_rate = _clk_ipu_di_round_rate,
3173 .get_rate = _clk_ipu2_di1_get_rate,
3174 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3178 static unsigned long _clk_can_root_round_rate(struct clk *clk,
3182 u32 parent_rate = clk_get_rate(clk->parent);
3184 div = parent_rate / rate;
3186 /* Make sure rate is not greater than the maximum value for the clock.
3187 * Also prevent a div of 0.
3195 return parent_rate / div;
3198 static int _clk_can_root_set_rate(struct clk *clk, unsigned long rate)
3201 u32 parent_rate = clk_get_rate(clk->parent);
3203 div = parent_rate / rate;
3206 if (((parent_rate / div) != rate) || (div > 64))
3209 reg = __raw_readl(MXC_CCM_CSCMR2) & MXC_CCM_CSCMR2_CAN_CLK_PODF_MASK;
3210 reg |= ((div - 1) << MXC_CCM_CSCMR2_CAN_CLK_PODF_OFFSET);
3212 __raw_writel(reg, MXC_CCM_CSCMR2);
3217 static unsigned long _clk_can_root_get_rate(struct clk *clk)
3222 reg = __raw_readl(MXC_CCM_CSCMR2) & MXC_CCM_CSCMR2_CAN_CLK_PODF_MASK;
3223 div = (reg >> MXC_CCM_CSCMR2_CAN_CLK_PODF_OFFSET) + 1;
3224 val = clk_get_rate(clk->parent) / div;
3229 static struct clk can_clk_root = {
3230 __INIT_CLK_DEBUG(can_clk_root)
3231 .parent = &pll3_60M,
3232 .set_rate = _clk_can_root_set_rate,
3233 .get_rate = _clk_can_root_get_rate,
3234 .round_rate = _clk_can_root_round_rate,
3237 static struct clk can2_clk[] = {
3239 __INIT_CLK_DEBUG(can2_module_clk)
3241 .parent = &can_clk_root,
3242 .enable_reg = MXC_CCM_CCGR0,
3243 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
3244 .enable = _clk_enable,
3245 .disable = _clk_disable,
3246 .secondary = &can2_clk[1],
3247 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3250 __INIT_CLK_DEBUG(can2_serial_clk)
3252 .parent = &can_clk_root,
3253 .enable_reg = MXC_CCM_CCGR0,
3254 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
3255 .enable = _clk_enable,
3256 .disable = _clk_disable,
3261 static struct clk can1_clk[] = {
3263 __INIT_CLK_DEBUG(can1_module_clk)
3265 .parent = &can_clk_root,
3266 .enable_reg = MXC_CCM_CCGR0,
3267 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
3268 .enable = _clk_enable,
3269 .disable = _clk_disable,
3270 .secondary = &can1_clk[1],
3271 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3274 __INIT_CLK_DEBUG(can1_serial_clk)
3276 .parent = &can_clk_root,
3277 .enable_reg = MXC_CCM_CCGR0,
3278 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
3279 .enable = _clk_enable,
3280 .disable = _clk_disable,
3284 static unsigned long _clk_spdif_round_rate(struct clk *clk,
3288 u32 parent_rate = clk_get_rate(clk->parent);
3289 u32 div = parent_rate / rate;
3291 if (parent_rate % rate)
3294 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3296 return parent_rate / (pre * post);
3299 static int _clk_spdif0_set_parent(struct clk *clk, struct clk *parent)
3303 reg = __raw_readl(MXC_CCM_CDCDR)
3304 & ~MXC_CCM_CDCDR_SPDIF0_CLK_SEL_MASK;
3306 mux = _get_mux6(parent, &pll4_audio_main_clk,
3307 &pll3_pfd_508M, &pll3_pfd_454M,
3308 &pll3_sw_clk, NULL, NULL);
3309 reg |= mux << MXC_CCM_CDCDR_SPDIF0_CLK_SEL_OFFSET;
3311 __raw_writel(reg, MXC_CCM_CDCDR);
3316 static unsigned long _clk_spdif0_get_rate(struct clk *clk)
3318 u32 reg, pred, podf;
3320 reg = __raw_readl(MXC_CCM_CDCDR);
3322 pred = ((reg & MXC_CCM_CDCDR_SPDIF0_CLK_PRED_MASK)
3323 >> MXC_CCM_CDCDR_SPDIF0_CLK_PRED_OFFSET) + 1;
3324 podf = ((reg & MXC_CCM_CDCDR_SPDIF0_CLK_PODF_MASK)
3325 >> MXC_CCM_CDCDR_SPDIF0_CLK_PODF_OFFSET) + 1;
3327 return clk_get_rate(clk->parent) / (pred * podf);
3330 static int _clk_spdif0_set_rate(struct clk *clk, unsigned long rate)
3332 u32 reg, div, pre, post;
3333 u32 parent_rate = clk_get_rate(clk->parent);
3335 div = parent_rate / rate;
3338 if (((parent_rate / div) != rate) || div > 64)
3341 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3343 reg = __raw_readl(MXC_CCM_CDCDR);
3344 reg &= ~(MXC_CCM_CDCDR_SPDIF0_CLK_PRED_MASK|
3345 MXC_CCM_CDCDR_SPDIF0_CLK_PODF_MASK);
3346 reg |= (post - 1) << MXC_CCM_CDCDR_SPDIF0_CLK_PODF_OFFSET;
3347 reg |= (pre - 1) << MXC_CCM_CDCDR_SPDIF0_CLK_PRED_OFFSET;
3349 __raw_writel(reg, MXC_CCM_CDCDR);
3354 static struct clk spdif0_clk[] = {
3356 __INIT_CLK_DEBUG(spdif0_clk_0)
3358 .parent = &pll3_sw_clk,
3359 .enable = _clk_enable,
3360 .enable_reg = MXC_CCM_CCGR5,
3361 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
3362 .disable = _clk_disable,
3363 .secondary = &spdif0_clk[1],
3364 .set_rate = _clk_spdif0_set_rate,
3365 .get_rate = _clk_spdif0_get_rate,
3366 .set_parent = _clk_spdif0_set_parent,
3367 .round_rate = _clk_spdif_round_rate,
3368 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3371 __INIT_CLK_DEBUG(spdif0_clk_1)
3374 .secondary = &spba_clk,
3378 static unsigned long _clk_esai_round_rate(struct clk *clk,
3382 u32 parent_rate = clk_get_rate(clk->parent);
3383 u32 div = parent_rate / rate;
3385 if (parent_rate % rate)
3388 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3390 return parent_rate / (pre * post);
3393 static int _clk_esai_set_parent(struct clk *clk, struct clk *parent)
3397 reg = __raw_readl(MXC_CCM_CSCMR2) & ~MXC_CCM_CSCMR2_ESAI_CLK_SEL_MASK;
3399 mux = _get_mux6(parent, &pll4_audio_main_clk, &pll3_pfd_508M,
3400 &pll3_pfd_454M, &pll3_sw_clk, NULL, NULL);
3401 reg |= mux << MXC_CCM_CSCMR2_ESAI_CLK_SEL_OFFSET;
3403 __raw_writel(reg, MXC_CCM_CSCMR2);
3408 static unsigned long _clk_esai_get_rate(struct clk *clk)
3410 u32 reg, pred, podf;
3412 reg = __raw_readl(MXC_CCM_CS1CDR);
3414 pred = ((reg & MXC_CCM_CS1CDR_ESAI_CLK_PRED_MASK)
3415 >> MXC_CCM_CS1CDR_ESAI_CLK_PRED_OFFSET) + 1;
3416 podf = ((reg & MXC_CCM_CS1CDR_ESAI_CLK_PODF_MASK)
3417 >> MXC_CCM_CS1CDR_ESAI_CLK_PODF_OFFSET) + 1;
3419 return clk_get_rate(clk->parent) / (pred * podf);
3422 static int _clk_esai_set_rate(struct clk *clk, unsigned long rate)
3424 u32 reg, div, pre, post;
3425 u32 parent_rate = clk_get_rate(clk->parent);
3427 div = parent_rate / rate;
3430 if (((parent_rate / div) != rate) || div > 64)
3433 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3435 reg = __raw_readl(MXC_CCM_CS1CDR);
3436 reg &= ~(MXC_CCM_CS1CDR_ESAI_CLK_PRED_MASK|
3437 MXC_CCM_CS1CDR_ESAI_CLK_PODF_MASK);
3438 reg |= (post - 1) << MXC_CCM_CS1CDR_ESAI_CLK_PODF_OFFSET;
3439 reg |= (pre - 1) << MXC_CCM_CS1CDR_ESAI_CLK_PRED_OFFSET;
3441 __raw_writel(reg, MXC_CCM_CS1CDR);
3446 static struct clk esai_clk = {
3447 __INIT_CLK_DEBUG(esai_clk)
3449 .parent = &pll3_sw_clk,
3450 .secondary = &spba_clk,
3451 .enable_reg = MXC_CCM_CCGR1,
3452 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
3453 .enable = _clk_enable,
3454 .disable = _clk_disable,
3455 .set_rate = _clk_esai_set_rate,
3456 .get_rate = _clk_esai_get_rate,
3457 .set_parent = _clk_esai_set_parent,
3458 .round_rate = _clk_esai_round_rate,
3461 static int _clk_enet_enable(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);
3475 static void _clk_enet_disable(struct clk *clk)
3481 /* Enable ENET ref clock */
3482 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
3483 reg |= ANADIG_PLL_BYPASS;
3484 reg &= ~ANADIG_PLL_ENABLE;
3485 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
3488 static int _clk_enet_set_rate(struct clk *clk, unsigned long rate)
3490 unsigned int reg, div = 1;
3508 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
3509 reg &= ~ANADIG_PLL_ENET_DIV_SELECT_MASK;
3510 reg |= (div << ANADIG_PLL_ENET_DIV_SELECT_OFFSET);
3511 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
3516 static unsigned long _clk_enet_get_rate(struct clk *clk)
3520 div = (__raw_readl(PLL8_ENET_BASE_ADDR))
3521 & ANADIG_PLL_ENET_DIV_SELECT_MASK;
3538 return 500000000 / div;
3541 static struct clk enet_clk[] = {
3543 __INIT_CLK_DEBUG(enet_clk)
3545 .parent = &pll8_enet_main_clk,
3546 .enable_reg = MXC_CCM_CCGR1,
3547 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
3548 .enable = _clk_enet_enable,
3549 .disable = _clk_enet_disable,
3550 .set_rate = _clk_enet_set_rate,
3551 .get_rate = _clk_enet_get_rate,
3552 .secondary = &enet_clk[1],
3553 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3556 .parent = &mmdc_ch0_axi_clk[0],
3557 .secondary = &mx6per1_clk,
3561 static struct clk ecspi_clk[] = {
3563 __INIT_CLK_DEBUG(ecspi0_clk)
3565 .parent = &pll3_60M,
3566 .secondary = &spba_clk,
3567 .enable_reg = MXC_CCM_CCGR1,
3568 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
3569 .enable = _clk_enable,
3570 .disable = _clk_disable,
3573 __INIT_CLK_DEBUG(ecspi1_clk)
3575 .parent = &pll3_60M,
3576 .secondary = &spba_clk,
3577 .enable_reg = MXC_CCM_CCGR1,
3578 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
3579 .enable = _clk_enable,
3580 .disable = _clk_disable,
3583 __INIT_CLK_DEBUG(ecspi2_clk)
3585 .parent = &pll3_60M,
3586 .secondary = &spba_clk,
3587 .enable_reg = MXC_CCM_CCGR1,
3588 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
3589 .enable = _clk_enable,
3590 .disable = _clk_disable,
3593 __INIT_CLK_DEBUG(ecspi3_clk)
3595 .parent = &pll3_60M,
3596 .secondary = &spba_clk,
3597 .enable_reg = MXC_CCM_CCGR1,
3598 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
3599 .enable = _clk_enable,
3600 .disable = _clk_disable,
3603 __INIT_CLK_DEBUG(ecspi4_clk)
3605 .parent = &pll3_60M,
3606 .secondary = &spba_clk,
3607 .enable_reg = MXC_CCM_CCGR1,
3608 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
3609 .enable = _clk_enable,
3610 .disable = _clk_disable,
3614 static unsigned long _clk_emi_slow_round_rate(struct clk *clk,
3618 u32 parent_rate = clk_get_rate(clk->parent);
3620 div = parent_rate / rate;
3622 /* Make sure rate is not greater than the maximum value for the clock.
3623 * Also prevent a div of 0.
3631 return parent_rate / div;
3634 static int _clk_emi_slow_set_parent(struct clk *clk, struct clk *parent)
3637 u32 reg = __raw_readl(MXC_CCM_CSCMR1)
3638 & ~MXC_CCM_CSCMR1_ACLK_EMI_SLOW_MASK;
3640 mux = _get_mux6(parent, &axi_clk, &pll3_usb_otg_main_clk,
3641 &pll2_pfd_400M, &pll2_pfd_352M, NULL, NULL);
3642 reg |= (mux << MXC_CCM_CSCMR1_ACLK_EMI_SLOW_OFFSET);
3643 __raw_writel(reg, MXC_CCM_CSCMR1);
3648 static unsigned long _clk_emi_slow_get_rate(struct clk *clk)
3652 reg = __raw_readl(MXC_CCM_CSCMR1);
3653 div = ((reg & MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK) >>
3654 MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET) + 1;
3656 return clk_get_rate(clk->parent) / div;
3659 static int _clk_emi_slow_set_rate(struct clk *clk, unsigned long rate)
3662 u32 parent_rate = clk_get_rate(clk->parent);
3664 div = parent_rate / rate;
3667 if (((parent_rate / div) != rate) || (div > 8))
3670 reg = __raw_readl(MXC_CCM_CSCMR1);
3671 reg &= ~MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK;
3672 reg |= (div - 1) << MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET;
3673 __raw_writel(reg, MXC_CCM_CSCMR1);
3678 static struct clk emi_slow_clk = {
3679 __INIT_CLK_DEBUG(emi_slow_clk)
3682 .enable_reg = MXC_CCM_CCGR6,
3683 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
3684 .enable = _clk_enable,
3685 .disable = _clk_disable,
3686 .set_rate = _clk_emi_slow_set_rate,
3687 .get_rate = _clk_emi_slow_get_rate,
3688 .round_rate = _clk_emi_slow_round_rate,
3689 .set_parent = _clk_emi_slow_set_parent,
3692 static unsigned long _clk_emi_round_rate(struct clk *clk,
3696 u32 parent_rate = clk_get_rate(clk->parent);
3698 div = parent_rate / rate;
3700 /* Make sure rate is not greater than the maximum value for the clock.
3701 * Also prevent a div of 0.
3709 return parent_rate / div;
3712 static int _clk_emi_set_parent(struct clk *clk, struct clk *parent)
3715 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_ACLK_EMI_MASK;
3717 mux = _get_mux6(parent, &axi_clk, &pll3_usb_otg_main_clk,
3718 &pll2_pfd_400M, &pll2_pfd_352M, NULL, NULL);
3719 reg |= (mux << MXC_CCM_CSCMR1_ACLK_EMI_OFFSET);
3720 __raw_writel(reg, MXC_CCM_CSCMR1);
3725 static unsigned long _clk_emi_get_rate(struct clk *clk)
3729 reg = __raw_readl(MXC_CCM_CSCMR1);
3730 div = ((reg & MXC_CCM_CSCMR1_ACLK_EMI_PODF_MASK) >>
3731 MXC_CCM_CSCMR1_ACLK_EMI_PODF_OFFSET) + 1;
3733 return clk_get_rate(clk->parent) / div;
3736 static int _clk_emi_set_rate(struct clk *clk, unsigned long rate)
3739 u32 parent_rate = clk_get_rate(clk->parent);
3741 div = parent_rate / rate;
3744 if (((parent_rate / div) != rate) || (div > 8))
3747 reg = __raw_readl(MXC_CCM_CSCMR1);
3748 reg &= ~MXC_CCM_CSCMR1_ACLK_EMI_PODF_MASK;
3749 reg |= (div - 1) << MXC_CCM_CSCMR1_ACLK_EMI_PODF_OFFSET;
3750 __raw_writel(reg, MXC_CCM_CSCMR1);
3755 static struct clk emi_clk = {
3756 __INIT_CLK_DEBUG(emi_clk)
3759 .set_rate = _clk_emi_set_rate,
3760 .get_rate = _clk_emi_get_rate,
3761 .round_rate = _clk_emi_round_rate,
3762 .set_parent = _clk_emi_set_parent,
3765 static unsigned long _clk_enfc_round_rate(struct clk *clk,
3769 u32 parent_rate = clk_get_rate(clk->parent);
3770 u32 div = parent_rate / rate;
3772 if (parent_rate % rate)
3775 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
3777 return parent_rate / (pre * post);
3780 static int _clk_enfc_set_parent(struct clk *clk, struct clk *parent)
3784 reg = __raw_readl(MXC_CCM_CS2CDR)
3785 & ~MXC_CCM_CS2CDR_ENFC_CLK_SEL_MASK;
3787 mux = _get_mux6(parent, &pll2_pfd_352M,
3788 &pll2_528_bus_main_clk, &pll3_usb_otg_main_clk,
3789 &pll2_pfd_400M, NULL, NULL);
3790 reg |= mux << MXC_CCM_CS2CDR_ENFC_CLK_SEL_OFFSET;
3792 __raw_writel(reg, MXC_CCM_CS2CDR);
3797 static unsigned long _clk_enfc_get_rate(struct clk *clk)
3799 u32 reg, pred, podf;
3801 reg = __raw_readl(MXC_CCM_CS2CDR);
3803 pred = ((reg & MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK)
3804 >> MXC_CCM_CS2CDR_ENFC_CLK_PRED_OFFSET) + 1;
3805 podf = ((reg & MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK)
3806 >> MXC_CCM_CS2CDR_ENFC_CLK_PODF_OFFSET) + 1;
3808 return clk_get_rate(clk->parent) / (pred * podf);
3811 static int _clk_enfc_set_rate(struct clk *clk, unsigned long rate)
3813 u32 reg, div, pre, post;
3814 u32 parent_rate = clk_get_rate(clk->parent);
3816 div = parent_rate / rate;
3819 if (((parent_rate / div) != rate) || div > 512)
3822 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
3824 reg = __raw_readl(MXC_CCM_CS2CDR);
3825 reg &= ~(MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK|
3826 MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK);
3827 reg |= (post - 1) << MXC_CCM_CS2CDR_ENFC_CLK_PODF_OFFSET;
3828 reg |= (pre - 1) << MXC_CCM_CS2CDR_ENFC_CLK_PRED_OFFSET;
3830 __raw_writel(reg, MXC_CCM_CS2CDR);
3835 static struct clk enfc_clk = {
3836 __INIT_CLK_DEBUG(enfc_clk)
3838 .parent = &pll2_pfd_352M,
3839 .enable_reg = MXC_CCM_CCGR2,
3840 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
3841 .enable = _clk_enable,
3842 .disable = _clk_disable,
3843 .set_rate = _clk_enfc_set_rate,
3844 .get_rate = _clk_enfc_get_rate,
3845 .round_rate = _clk_enfc_round_rate,
3846 .set_parent = _clk_enfc_set_parent,
3849 static unsigned long _clk_uart_round_rate(struct clk *clk,
3853 u32 parent_rate = clk_get_rate(clk->parent);
3855 div = parent_rate / rate;
3857 /* Make sure rate is not greater than the maximum value for the clock.
3858 * Also prevent a div of 0.
3866 return parent_rate / div;
3869 static int _clk_uart_set_rate(struct clk *clk, unsigned long rate)
3872 u32 parent_rate = clk_get_rate(clk->parent);
3874 div = parent_rate / rate;
3877 if (((parent_rate / div) != rate) || (div > 64))
3880 reg = __raw_readl(MXC_CCM_CSCDR1) & MXC_CCM_CSCDR1_UART_CLK_PODF_MASK;
3881 reg |= ((div - 1) << MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET);
3883 __raw_writel(reg, MXC_CCM_CSCDR1);
3888 static unsigned long _clk_uart_get_rate(struct clk *clk)
3893 reg = __raw_readl(MXC_CCM_CSCDR1) & MXC_CCM_CSCDR1_UART_CLK_PODF_MASK;
3894 div = (reg >> MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET) + 1;
3895 val = clk_get_rate(clk->parent) / div;
3900 static struct clk uart_clk[] = {
3902 __INIT_CLK_DEBUG(uart_clk)
3904 .parent = &pll3_80M,
3905 .enable_reg = MXC_CCM_CCGR5,
3906 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
3907 .enable = _clk_enable,
3908 .disable = _clk_disable,
3909 .secondary = &uart_clk[1],
3910 .set_rate = _clk_uart_set_rate,
3911 .get_rate = _clk_uart_get_rate,
3912 .round_rate = _clk_uart_round_rate,
3915 __INIT_CLK_DEBUG(uart_serial_clk)
3917 .enable_reg = MXC_CCM_CCGR5,
3918 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
3919 .enable = _clk_enable,
3920 .disable = _clk_disable,
3924 static unsigned long _clk_hsi_tx_round_rate(struct clk *clk,
3928 u32 parent_rate = clk_get_rate(clk->parent);
3930 div = parent_rate / rate;
3932 /* Make sure rate is not greater than the maximum value for the clock.
3933 * Also prevent a div of 0.
3941 return parent_rate / div;
3944 static int _clk_hsi_tx_set_parent(struct clk *clk, struct clk *parent)
3946 u32 reg = __raw_readl(MXC_CCM_CDCDR) & ~MXC_CCM_CDCDR_HSI_TX_CLK_SEL;
3948 if (parent == &pll2_pfd_400M)
3949 reg |= (MXC_CCM_CDCDR_HSI_TX_CLK_SEL);
3951 __raw_writel(reg, MXC_CCM_CDCDR);
3956 static unsigned long _clk_hsi_tx_get_rate(struct clk *clk)
3960 reg = __raw_readl(MXC_CCM_CDCDR);
3961 div = ((reg & MXC_CCM_CDCDR_HSI_TX_PODF_MASK) >>
3962 MXC_CCM_CDCDR_HSI_TX_PODF_OFFSET) + 1;
3964 return clk_get_rate(clk->parent) / div;
3967 static int _clk_hsi_tx_set_rate(struct clk *clk, unsigned long rate)
3970 u32 parent_rate = clk_get_rate(clk->parent);
3972 div = parent_rate / rate;
3975 if (((parent_rate / div) != rate) || (div > 8))
3978 reg = __raw_readl(MXC_CCM_CDCDR);
3979 reg &= ~MXC_CCM_CDCDR_HSI_TX_PODF_MASK;
3980 reg |= (div - 1) << MXC_CCM_CDCDR_HSI_TX_PODF_OFFSET;
3981 __raw_writel(reg, MXC_CCM_CDCDR);
3986 static struct clk hsi_tx_clk[] = {
3988 __INIT_CLK_DEBUG(hsi_tx_clk)
3990 .parent = &pll2_pfd_400M,
3991 .enable_reg = MXC_CCM_CCGR3,
3992 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
3993 .enable = _clk_enable,
3994 .disable = _clk_disable,
3995 .set_parent = _clk_hsi_tx_set_parent,
3996 .round_rate = _clk_hsi_tx_round_rate,
3997 .set_rate = _clk_hsi_tx_set_rate,
3998 .get_rate = _clk_hsi_tx_get_rate,
3999 .secondary = &hsi_tx_clk[1],
4000 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4003 .parent = &mx6per1_clk,
4004 .secondary = &mx6per2_clk,
4008 static struct clk mipi_pllref_clk = {
4009 __INIT_CLK_DEBUG(mipi_pllref_clk)
4011 .parent = &pll3_pfd_540M,
4012 .enable_reg = MXC_CCM_CCGR3,
4013 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
4014 .enable = _clk_enable,
4015 .disable = _clk_disable,
4018 static struct clk hdmi_clk[] = {
4020 __INIT_CLK_DEBUG(hdmi_isfr_clk)
4022 .parent = &pll3_pfd_540M,
4023 .enable_reg = MXC_CCM_CCGR2,
4024 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
4025 .enable = _clk_enable,
4026 .disable = _clk_disable,
4027 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4030 __INIT_CLK_DEBUG(hdmi_iahb_clk)
4033 .enable_reg = MXC_CCM_CCGR2,
4034 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4035 .enable = _clk_enable,
4036 .disable = _clk_disable,
4040 static struct clk caam_clk[] = {
4042 __INIT_CLK_DEBUG(caam_mem_clk)
4044 .enable_reg = MXC_CCM_CCGR0,
4045 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
4046 .enable = _clk_enable,
4047 .disable = _clk_disable,
4048 .secondary = &caam_clk[1],
4049 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4052 __INIT_CLK_DEBUG(caam_aclk_clk)
4054 .enable_reg = MXC_CCM_CCGR0,
4055 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
4056 .enable = _clk_enable,
4057 .disable = _clk_disable,
4058 .secondary = &caam_clk[2],
4061 __INIT_CLK_DEBUG(caam_ipg_clk)
4063 .enable_reg = MXC_CCM_CCGR0,
4064 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
4065 .enable = _clk_enable,
4066 .disable = _clk_disable,
4067 .parent = &mmdc_ch0_axi_clk[0],
4068 .secondary = &mx6per1_clk,
4072 static int _clk_asrc_serial_set_parent(struct clk *clk, struct clk *parent)
4076 reg = __raw_readl(MXC_CCM_CDCDR) & ~MXC_CCM_CDCDR_SPDIF1_CLK_SEL_MASK;
4078 mux = _get_mux6(parent, &pll4_audio_main_clk, &pll3_pfd_508M,
4079 &pll3_pfd_454M, &pll3_sw_clk, NULL, NULL);
4080 reg |= mux << MXC_CCM_CDCDR_SPDIF1_CLK_SEL_OFFSET;
4082 __raw_writel(reg, MXC_CCM_CDCDR);
4087 static unsigned long _clk_asrc_serial_get_rate(struct clk *clk)
4089 u32 reg, pred, podf;
4091 reg = __raw_readl(MXC_CCM_CDCDR);
4093 pred = ((reg & MXC_CCM_CDCDR_SPDIF1_CLK_PRED_MASK)
4094 >> MXC_CCM_CDCDR_SPDIF1_CLK_PRED_OFFSET) + 1;
4095 podf = ((reg & MXC_CCM_CDCDR_SPDIF1_CLK_PODF_MASK)
4096 >> MXC_CCM_CDCDR_SPDIF1_CLK_PODF_OFFSET) + 1;
4098 return clk_get_rate(clk->parent) / (pred * podf);
4101 static int _clk_asrc_serial_set_rate(struct clk *clk, unsigned long rate)
4103 u32 reg, div, pre, post;
4104 u32 parent_rate = clk_get_rate(clk->parent);
4106 div = parent_rate / rate;
4109 if (((parent_rate / div) != rate) || div > 64)
4112 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
4114 reg = __raw_readl(MXC_CCM_CDCDR);
4115 reg &= ~(MXC_CCM_CDCDR_SPDIF1_CLK_PRED_MASK|
4116 MXC_CCM_CDCDR_SPDIF1_CLK_PODF_MASK);
4117 reg |= (post - 1) << MXC_CCM_CDCDR_SPDIF1_CLK_PODF_OFFSET;
4118 reg |= (pre - 1) << MXC_CCM_CDCDR_SPDIF1_CLK_PRED_OFFSET;
4120 __raw_writel(reg, MXC_CCM_CDCDR);
4125 static unsigned long _clk_asrc_serial_round_rate(struct clk *clk,
4129 u32 parent_rate = clk_get_rate(clk->parent);
4130 u32 div = parent_rate / rate;
4132 if (parent_rate % rate)
4135 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
4137 return parent_rate / (pre * post);
4140 static struct clk asrc_clk[] = {
4142 __INIT_CLK_DEBUG(asrc_clk)
4144 .parent = &pll4_audio_main_clk,
4145 .enable_reg = MXC_CCM_CCGR0,
4146 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
4147 .enable = _clk_enable,
4148 .disable = _clk_disable,
4149 .secondary = &spba_clk,
4152 /*In the MX6 spec, asrc_serial_clk is listed as SPDIF1 clk
4153 * This clock can never be gated and does not have any
4154 * CCGR bits associated with it.
4156 __INIT_CLK_DEBUG(asrc_serial_clk)
4158 .parent = &pll3_sw_clk,
4159 .set_rate = _clk_asrc_serial_set_rate,
4160 .get_rate = _clk_asrc_serial_get_rate,
4161 .set_parent = _clk_asrc_serial_set_parent,
4162 .round_rate = _clk_asrc_serial_round_rate,
4166 static struct clk apbh_dma_clk = {
4167 __INIT_CLK_DEBUG(apbh_dma_clk)
4168 .parent = &usdhc3_clk,
4169 .secondary = &mx6per1_clk,
4170 .enable = _clk_enable,
4171 .disable = _clk_disable_inwait,
4172 .enable_reg = MXC_CCM_CCGR0,
4173 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
4176 static struct clk aips_tz2_clk = {
4177 __INIT_CLK_DEBUG(aips_tz2_clk)
4179 .enable_reg = MXC_CCM_CCGR0,
4180 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
4181 .enable = _clk_enable,
4182 .disable = _clk_disable_inwait,
4185 static struct clk aips_tz1_clk = {
4186 __INIT_CLK_DEBUG(aips_tz1_clk)
4188 .enable_reg = MXC_CCM_CCGR0,
4189 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4190 .enable = _clk_enable,
4191 .disable = _clk_disable_inwait,
4195 static struct clk openvg_axi_clk = {
4196 __INIT_CLK_DEBUG(openvg_axi_clk)
4197 .parent = &gpu2d_axi_clk,
4198 .enable = _clk_enable,
4199 .enable_reg = MXC_CCM_CCGR3,
4200 .enable_shift = MXC_CCM_CCGRx_CG15_OFFSET,
4201 .disable = _clk_disable,
4202 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4205 static unsigned long _clk_gpu3d_core_round_rate(struct clk *clk,
4209 u32 parent_rate = clk_get_rate(clk->parent);
4211 div = parent_rate / rate;
4213 /* Make sure rate is not greater than the maximum value for the clock.
4214 * Also prevent a div of 0.
4222 return parent_rate / div;
4225 static int _clk_gpu3d_core_set_parent(struct clk *clk, struct clk *parent)
4228 u32 reg = __raw_readl(MXC_CCM_CBCMR)
4229 & ~MXC_CCM_CBCMR_GPU3D_CORE_CLK_SEL_MASK;
4231 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
4232 &pll3_usb_otg_main_clk,
4233 &pll2_pfd_594M, &pll2_pfd_400M, NULL, NULL);
4234 reg |= (mux << MXC_CCM_CBCMR_GPU3D_CORE_CLK_SEL_OFFSET);
4235 __raw_writel(reg, MXC_CCM_CBCMR);
4240 static unsigned long _clk_gpu3d_core_get_rate(struct clk *clk)
4244 reg = __raw_readl(MXC_CCM_CBCMR);
4245 div = ((reg & MXC_CCM_CBCMR_GPU3D_CORE_PODF_MASK) >>
4246 MXC_CCM_CBCMR_GPU3D_CORE_PODF_OFFSET) + 1;
4248 return clk_get_rate(clk->parent) / div;
4251 static int _clk_gpu3d_core_set_rate(struct clk *clk, unsigned long rate)
4254 u32 parent_rate = clk_get_rate(clk->parent);
4256 div = parent_rate / rate;
4262 reg = __raw_readl(MXC_CCM_CBCMR);
4263 reg &= ~MXC_CCM_CBCMR_GPU3D_CORE_PODF_MASK;
4264 reg |= (div - 1) << MXC_CCM_CBCMR_GPU3D_CORE_PODF_OFFSET;
4265 __raw_writel(reg, MXC_CCM_CBCMR);
4270 static struct clk gpu3d_core_clk[] = {
4272 __INIT_CLK_DEBUG(gpu3d_core_clk)
4273 .parent = &pll2_pfd_594M,
4274 .enable = _clk_enable,
4275 .enable_reg = MXC_CCM_CCGR1,
4276 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
4277 .disable = _clk_disable,
4278 .set_parent = _clk_gpu3d_core_set_parent,
4279 .set_rate = _clk_gpu3d_core_set_rate,
4280 .get_rate = _clk_gpu3d_core_get_rate,
4281 .round_rate = _clk_gpu3d_core_round_rate,
4282 .secondary = &gpu3d_core_clk[1],
4283 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4286 .parent = &gpu3d_axi_clk,
4287 .secondary = &mx6fast1_clk,
4291 static unsigned long _clk_gpu2d_core_round_rate(struct clk *clk,
4295 u32 parent_rate = clk_get_rate(clk->parent);
4297 div = parent_rate / rate;
4299 /* Make sure rate is not greater than the maximum value for the clock.
4300 * Also prevent a div of 0.
4308 return parent_rate / div;
4311 static int _clk_gpu2d_core_set_parent(struct clk *clk, struct clk *parent)
4314 u32 reg = __raw_readl(MXC_CCM_CBCMR) &
4315 ~MXC_CCM_CBCMR_GPU2D_CLK_SEL_MASK;
4317 /*on mx6dl, 2d core clock sources from 3d shader core clock*/
4318 if (!cpu_is_mx6dl()) {
4319 mux = _get_mux6(parent, &axi_clk, &pll3_usb_otg_main_clk,
4320 &pll2_pfd_352M, &pll2_pfd_400M, NULL, NULL);
4321 reg |= (mux << MXC_CCM_CBCMR_GPU2D_CLK_SEL_OFFSET);
4322 __raw_writel(reg, MXC_CCM_CBCMR);
4328 static unsigned long _clk_gpu2d_core_get_rate(struct clk *clk)
4332 reg = __raw_readl(MXC_CCM_CBCMR);
4334 div = ((reg & MXC_CCM_CBCMR_GPU2D_CORE_PODF_MASK) >>
4335 MXC_CCM_CBCMR_GPU2D_CORE_PODF_OFFSET) + 1;
4336 else if (cpu_is_mx6dl())
4337 /* on i.mx6dl, gpu2d_core_clk source from gpu3d_shader_clk */
4338 return clk_get_rate(clk->parent);
4340 return clk_get_rate(clk->parent) / div;
4343 static int _clk_gpu2d_core_set_rate(struct clk *clk, unsigned long rate)
4346 u32 parent_rate = clk_get_rate(clk->parent);
4348 div = parent_rate / rate;
4351 if (((parent_rate / div) != rate) || (div > 8))
4354 reg = __raw_readl(MXC_CCM_CBCMR);
4355 reg &= ~MXC_CCM_CBCMR_GPU2D_CORE_PODF_MASK;
4356 reg |= (div - 1) << MXC_CCM_CBCMR_GPU2D_CORE_PODF_OFFSET;
4357 __raw_writel(reg, MXC_CCM_CBCMR);
4361 static struct clk gpu2d_core_clk[] = {
4363 __INIT_CLK_DEBUG(gpu2d_core_clk)
4364 .parent = &pll2_pfd_352M,
4365 .enable = _clk_enable,
4366 .enable_reg = MXC_CCM_CCGR1,
4367 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
4368 .disable = _clk_disable,
4369 .set_parent = _clk_gpu2d_core_set_parent,
4370 .set_rate = _clk_gpu2d_core_set_rate,
4371 .get_rate = _clk_gpu2d_core_get_rate,
4372 .round_rate = _clk_gpu2d_core_round_rate,
4373 .secondary = &mx6fast1_clk,
4374 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4378 static unsigned long _clk_gpu3d_shader_round_rate(struct clk *clk,
4382 u32 parent_rate = clk_get_rate(clk->parent);
4384 div = parent_rate / rate;
4386 /* Make sure rate is not greater than the maximum value for the clock.
4387 * Also prevent a div of 0.
4395 return parent_rate / div;
4398 static int _clk_gpu3d_shader_set_parent(struct clk *clk, struct clk *parent)
4401 u32 reg = __raw_readl(MXC_CCM_CBCMR)
4402 & ~MXC_CCM_CBCMR_GPU3D_SHADER_CLK_SEL_MASK;
4404 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
4405 &pll3_usb_otg_main_clk,
4406 &pll2_pfd_594M, &pll3_pfd_720M, NULL, NULL);
4407 reg |= (mux << MXC_CCM_CBCMR_GPU3D_SHADER_CLK_SEL_OFFSET);
4408 __raw_writel(reg, MXC_CCM_CBCMR);
4413 static unsigned long _clk_gpu3d_shader_get_rate(struct clk *clk)
4417 reg = __raw_readl(MXC_CCM_CBCMR);
4418 div = ((reg & MXC_CCM_CBCMR_GPU3D_SHADER_PODF_MASK) >>
4419 MXC_CCM_CBCMR_GPU3D_SHADER_PODF_OFFSET) + 1;
4421 return clk_get_rate(clk->parent) / div;
4424 static int _clk_gpu3d_shader_set_rate(struct clk *clk, unsigned long rate)
4427 u32 parent_rate = clk_get_rate(clk->parent);
4429 div = parent_rate / rate;
4435 reg = __raw_readl(MXC_CCM_CBCMR);
4436 reg &= ~MXC_CCM_CBCMR_GPU3D_SHADER_PODF_MASK;
4437 reg |= (div - 1) << MXC_CCM_CBCMR_GPU3D_SHADER_PODF_OFFSET;
4438 __raw_writel(reg, MXC_CCM_CBCMR);
4444 static struct clk gpu3d_shader_clk = {
4445 __INIT_CLK_DEBUG(gpu3d_shader_clk)
4446 .parent = &pll3_pfd_720M,
4447 .secondary = &mmdc_ch0_axi_clk[0],
4448 .enable = _clk_enable,
4449 .enable_reg = MXC_CCM_CCGR1,
4450 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
4451 .disable = _clk_disable,
4452 .set_parent = _clk_gpu3d_shader_set_parent,
4453 .set_rate = _clk_gpu3d_shader_set_rate,
4454 .get_rate = _clk_gpu3d_shader_get_rate,
4455 .round_rate = _clk_gpu3d_shader_round_rate,
4456 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4459 /* set the parent by the ipcg table */
4460 static struct clk gpmi_nand_clk[] = {
4462 __INIT_CLK_DEBUG(gpmi_io_clk)
4463 .parent = &enfc_clk,
4464 .secondary = &gpmi_nand_clk[1],
4465 .enable = _clk_enable,
4466 .enable_reg = MXC_CCM_CCGR4,
4467 .enable_shift = MXC_CCM_CCGRx_CG14_OFFSET,
4468 .disable = _clk_disable,
4470 { /* gpmi_apb_clk */
4471 __INIT_CLK_DEBUG(gpmi_apb_clk)
4472 .parent = &usdhc3_clk,
4473 .secondary = &gpmi_nand_clk[2],
4474 .enable = _clk_enable,
4475 .enable_reg = MXC_CCM_CCGR4,
4476 .enable_shift = MXC_CCM_CCGRx_CG15_OFFSET,
4477 .disable = _clk_disable,
4480 __INIT_CLK_DEBUG(gpmi_bch_clk)
4481 .parent = &usdhc4_clk,
4482 .secondary = &gpmi_nand_clk[3],
4483 .enable = _clk_enable,
4484 .enable_reg = MXC_CCM_CCGR4,
4485 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
4486 .disable = _clk_disable,
4489 __INIT_CLK_DEBUG(gpmi_bch_apb_clk)
4490 .parent = &usdhc3_clk,
4491 .secondary = &gpmi_nand_clk[4],
4492 .enable = _clk_enable,
4493 .enable_reg = MXC_CCM_CCGR4,
4494 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
4495 .disable = _clk_disable,
4497 { /* bch relative clk */
4498 __INIT_CLK_DEBUG(pl301_mx6qperl_bch)
4499 .parent = &mx6per1_clk,
4500 .secondary = &mmdc_ch0_axi_clk[0],
4504 static struct clk pwm_clk[] = {
4506 __INIT_CLK_DEBUG(pwm_clk_0)
4507 .parent = &ipg_perclk,
4509 .enable_reg = MXC_CCM_CCGR4,
4510 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
4511 .enable = _clk_enable,
4512 .disable = _clk_disable,
4515 __INIT_CLK_DEBUG(pwm_clk_1)
4516 .parent = &ipg_perclk,
4518 .enable_reg = MXC_CCM_CCGR4,
4519 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
4520 .enable = _clk_enable,
4521 .disable = _clk_disable,
4524 __INIT_CLK_DEBUG(pwm_clk_2)
4525 .parent = &ipg_perclk,
4527 .enable_reg = MXC_CCM_CCGR4,
4528 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
4529 .enable = _clk_enable,
4530 .disable = _clk_disable,
4533 __INIT_CLK_DEBUG(pwm_clk_3)
4534 .parent = &ipg_perclk,
4536 .enable_reg = MXC_CCM_CCGR4,
4537 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
4538 .enable = _clk_enable,
4539 .disable = _clk_disable,
4543 static int _clk_pcie_enable(struct clk *clk)
4547 /* Clear Power Down and Enable PLLs */
4548 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4549 reg &= ~ANADIG_PLL_ENET_POWER_DOWN;
4550 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4552 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4553 reg |= ANADIG_PLL_ENET_EN;
4554 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4556 /* Waiting for the PLL is locked */
4557 if (!WAIT(ANADIG_PLL_ENET_LOCK & __raw_readl(PLL8_ENET_BASE_ADDR),
4559 panic("pll8 lock failed\n");
4561 /* Disable the bypass */
4562 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4563 reg &= ~ANADIG_PLL_ENET_BYPASS;
4564 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4567 * Enable SATA ref clock.
4568 * PCIe needs both sides to have the same source of refernce clock,
4569 * The SATA reference clock is taken out on clk out
4571 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4572 reg |= ANADIG_PLL_ENET_EN_SATA;
4573 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4575 /* Activate LVDS CLK1 (the MiniPCIe slot clock input) */
4576 reg = __raw_readl(ANADIG_MISC1_REG);
4577 reg &= ~ANATOP_LVDS_CLK1_IBEN_MASK;
4578 __raw_writel(reg, ANADIG_MISC1_REG);
4580 reg = __raw_readl(ANADIG_MISC1_REG);
4581 reg |= ANATOP_LVDS_CLK1_SRC_SATA;
4582 __raw_writel(reg, ANADIG_MISC1_REG);
4584 reg = __raw_readl(ANADIG_MISC1_REG);
4585 reg |= ANATOP_LVDS_CLK1_OBEN_MASK;
4586 __raw_writel(reg, ANADIG_MISC1_REG);
4588 /* Enable PCIE ref clock */
4589 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4590 reg |= ANADIG_PLL_ENET_EN_PCIE;
4591 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4598 static void _clk_pcie_disable(struct clk *clk)
4604 /* Disable SATA ref clock */
4605 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4606 reg &= ~ANADIG_PLL_ENET_EN_PCIE;
4607 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4610 static struct clk pcie_clk[] = {
4612 __INIT_CLK_DEBUG(pcie_clk)
4613 .parent = &pcie_axi_clk,
4614 .enable = _clk_pcie_enable,
4615 .disable = _clk_pcie_disable,
4616 .enable_reg = MXC_CCM_CCGR4,
4617 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4618 .secondary = &pcie_clk[1],
4619 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4622 .parent = &mmdc_ch0_axi_clk[0],
4623 .secondary = &mx6fast1_clk,
4627 static int _clk_sata_enable(struct clk *clk)
4631 /* Clear Power Down and Enable PLLs */
4632 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4633 reg &= ~ANADIG_PLL_ENET_POWER_DOWN;
4634 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4636 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4637 reg |= ANADIG_PLL_ENET_EN;
4638 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4640 /* Waiting for the PLL is locked */
4641 if (!WAIT(ANADIG_PLL_ENET_LOCK & __raw_readl(PLL8_ENET_BASE_ADDR),
4643 panic("pll8 lock failed\n");
4645 /* Disable the bypass */
4646 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4647 reg &= ~ANADIG_PLL_ENET_BYPASS;
4648 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4650 /* Enable SATA ref clock */
4651 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4652 reg |= ANADIG_PLL_ENET_EN_SATA;
4653 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4660 static void _clk_sata_disable(struct clk *clk)
4666 /* Disable SATA ref clock */
4667 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4668 reg &= ~ANADIG_PLL_ENET_EN_SATA;
4669 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4672 static struct clk sata_clk[] = {
4674 __INIT_CLK_DEBUG(sata_clk)
4676 .enable = _clk_sata_enable,
4677 .enable_reg = MXC_CCM_CCGR5,
4678 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
4679 .disable = _clk_sata_disable,
4680 .secondary = &sata_clk[1],
4681 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4684 .parent = &mmdc_ch0_axi_clk[0],
4685 .secondary = &mx6per1_clk,
4689 static struct clk usboh3_clk[] = {
4691 __INIT_CLK_DEBUG(usboh3_clk)
4693 .enable = _clk_enable,
4694 .enable_reg = MXC_CCM_CCGR6,
4695 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4696 .disable = _clk_disable,
4697 .secondary = &usboh3_clk[1],
4698 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4701 .parent = &mmdc_ch0_axi_clk[0],
4702 .secondary = &mx6per1_clk,
4706 static struct clk mlb150_clk = {
4707 __INIT_CLK_DEBUG(mlb150_clk)
4710 .enable_reg = MXC_CCM_CCGR3,
4711 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
4712 .enable = _clk_enable,
4713 .disable = _clk_disable,
4716 static int _clk_enable1(struct clk *clk)
4719 reg = __raw_readl(clk->enable_reg);
4720 reg |= 1 << clk->enable_shift;
4721 __raw_writel(reg, clk->enable_reg);
4726 static void _clk_disable1(struct clk *clk)
4729 reg = __raw_readl(clk->enable_reg);
4730 reg &= ~(1 << clk->enable_shift);
4731 __raw_writel(reg, clk->enable_reg);
4734 static int _clk_clko_set_parent(struct clk *clk, struct clk *parent)
4738 if (parent == &pll3_usb_otg_main_clk)
4740 else if (parent == &pll2_528_bus_main_clk)
4742 else if (parent == &pll1_sys_main_clk)
4744 else if (parent == &pll5_video_main_clk)
4746 else if (parent == &axi_clk)
4748 else if (parent == &enfc_clk)
4750 else if (parent == &ipu1_di_clk[0])
4752 else if (parent == &ipu1_di_clk[1])
4754 else if (parent == &ipu2_di_clk[0])
4756 else if (parent == &ipu2_di_clk[1])
4758 else if (parent == &ahb_clk)
4760 else if (parent == &ipg_clk)
4762 else if (parent == &ipg_perclk)
4764 else if (parent == &ckil_clk)
4766 else if (parent == &pll4_audio_main_clk)
4771 reg = __raw_readl(MXC_CCM_CCOSR);
4772 reg &= ~MXC_CCM_CCOSR_CKOL_SEL_MASK;
4773 reg |= sel << MXC_CCM_CCOSR_CKOL_SEL_OFFSET;
4774 __raw_writel(reg, MXC_CCM_CCOSR);
4778 static unsigned long _clk_clko_get_rate(struct clk *clk)
4780 u32 reg = __raw_readl(MXC_CCM_CCOSR);
4781 u32 div = ((reg & MXC_CCM_CCOSR_CKOL_DIV_MASK) >>
4782 MXC_CCM_CCOSR_CKOL_DIV_OFFSET) + 1;
4783 return clk_get_rate(clk->parent) / div;
4786 static int _clk_clko_set_rate(struct clk *clk, unsigned long rate)
4789 u32 parent_rate = clk_get_rate(clk->parent);
4790 u32 div = parent_rate / rate;
4794 if (((parent_rate / div) != rate) || (div > 8))
4797 reg = __raw_readl(MXC_CCM_CCOSR);
4798 reg &= ~MXC_CCM_CCOSR_CKOL_DIV_MASK;
4799 reg |= (div - 1) << MXC_CCM_CCOSR_CKOL_DIV_OFFSET;
4800 __raw_writel(reg, MXC_CCM_CCOSR);
4804 static unsigned long _clk_clko_round_rate(struct clk *clk,
4807 u32 parent_rate = clk_get_rate(clk->parent);
4808 u32 div = parent_rate / rate;
4810 /* Make sure rate is not greater than the maximum value for the clock.
4811 * Also prevent a div of 0.
4817 return parent_rate / div;
4820 static int _clk_clko2_set_parent(struct clk *clk, struct clk *parent)
4824 if (parent == &mmdc_ch0_axi_clk[0])
4826 else if (parent == &mmdc_ch1_axi_clk[0])
4828 else if (parent == &usdhc4_clk)
4830 else if (parent == &usdhc1_clk)
4832 else if (parent == &gpu2d_axi_clk)
4834 else if (parent == &ecspi_clk[0])
4836 else if (parent == &gpu3d_axi_clk)
4838 else if (parent == &usdhc3_clk)
4840 else if (parent == &pcie_clk[0])
4842 else if (parent == &ipu1_clk)
4844 else if (parent == &ipu2_clk)
4846 else if (parent == &vdo_axi_clk)
4848 else if (parent == &osc_clk)
4850 else if (parent == &gpu2d_core_clk[0])
4852 else if (parent == &gpu3d_core_clk[0])
4854 else if (parent == &usdhc2_clk)
4856 else if (parent == &ssi1_clk)
4858 else if (parent == &ssi2_clk)
4860 else if (parent == &ssi3_clk)
4862 else if (parent == &gpu3d_shader_clk)
4864 else if (parent == &can_clk_root)
4866 else if (parent == &ldb_di0_clk)
4868 else if (parent == &ldb_di1_clk)
4870 else if (parent == &esai_clk)
4872 else if (parent == &uart_clk[0])
4874 else if (parent == &spdif0_clk[0])
4876 else if (parent == &hsi_tx_clk[0])
4881 reg = __raw_readl(MXC_CCM_CCOSR);
4882 reg &= ~MXC_CCM_CCOSR_CKO2_SEL_MASK;
4883 reg |= sel << MXC_CCM_CCOSR_CKO2_SEL_OFFSET;
4884 __raw_writel(reg, MXC_CCM_CCOSR);
4888 static unsigned long _clk_clko2_get_rate(struct clk *clk)
4890 u32 reg = __raw_readl(MXC_CCM_CCOSR);
4891 u32 div = ((reg & MXC_CCM_CCOSR_CKO2_DIV_MASK) >>
4892 MXC_CCM_CCOSR_CKO2_DIV_OFFSET) + 1;
4893 return clk_get_rate(clk->parent) / div;
4896 static int _clk_clko2_set_rate(struct clk *clk, unsigned long rate)
4899 u32 parent_rate = clk_get_rate(clk->parent);
4900 u32 div = parent_rate / rate;
4904 if (((parent_rate / div) != rate) || (div > 8))
4907 reg = __raw_readl(MXC_CCM_CCOSR);
4908 reg &= ~MXC_CCM_CCOSR_CKO2_DIV_MASK;
4909 reg |= (div - 1) << MXC_CCM_CCOSR_CKO2_DIV_OFFSET;
4910 __raw_writel(reg, MXC_CCM_CCOSR);
4914 static struct clk clko_clk = {
4915 __INIT_CLK_DEBUG(clko_clk)
4916 .parent = &pll2_528_bus_main_clk,
4917 .enable = _clk_enable1,
4918 .enable_reg = MXC_CCM_CCOSR,
4919 .enable_shift = MXC_CCM_CCOSR_CKOL_EN_OFFSET,
4920 .disable = _clk_disable1,
4921 .set_parent = _clk_clko_set_parent,
4922 .set_rate = _clk_clko_set_rate,
4923 .get_rate = _clk_clko_get_rate,
4924 .round_rate = _clk_clko_round_rate,
4927 static struct clk clko2_clk = {
4928 __INIT_CLK_DEBUG(clko2_clk)
4929 .parent = &usdhc4_clk,
4930 .enable = _clk_enable1,
4931 .enable_reg = MXC_CCM_CCOSR,
4932 .enable_shift = MXC_CCM_CCOSR_CKO2_EN_OFFSET,
4933 .disable = _clk_disable1,
4934 .set_parent = _clk_clko2_set_parent,
4935 .set_rate = _clk_clko2_set_rate,
4936 .get_rate = _clk_clko2_get_rate,
4937 .round_rate = _clk_clko_round_rate,
4940 static struct clk perfmon0_clk = {
4941 __INIT_CLK_DEBUG(perfmon0_clk)
4942 .parent = &mmdc_ch0_axi_clk[0],
4943 .enable = _clk_enable1,
4944 .enable_reg = MXC_CCM_CCGR4,
4945 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
4946 .disable = _clk_disable1,
4949 static struct clk perfmon1_clk = {
4950 __INIT_CLK_DEBUG(perfmon1_clk)
4951 .parent = &ipu1_clk,
4952 .enable = _clk_enable1,
4953 .enable_reg = MXC_CCM_CCGR4,
4954 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
4955 .disable = _clk_disable1,
4958 static struct clk perfmon2_clk = {
4959 __INIT_CLK_DEBUG(perfmon2_clk)
4960 .parent = &mmdc_ch0_axi_clk[0],
4961 .enable = _clk_enable1,
4962 .enable_reg = MXC_CCM_CCGR4,
4963 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
4964 .disable = _clk_disable1,
4967 static struct clk dummy_clk = {
4971 #define _REGISTER_CLOCK(d, n, c) \
4979 static struct clk_lookup lookups[] = {
4980 _REGISTER_CLOCK(NULL, "osc", osc_clk),
4981 _REGISTER_CLOCK(NULL, "ckih", ckih_clk),
4982 _REGISTER_CLOCK(NULL, "ckih2", ckih2_clk),
4983 _REGISTER_CLOCK(NULL, "ckil", ckil_clk),
4984 _REGISTER_CLOCK(NULL, "pll1_main_clk", pll1_sys_main_clk),
4985 _REGISTER_CLOCK(NULL, "pll1_sw_clk", pll1_sw_clk),
4986 _REGISTER_CLOCK(NULL, "pll2", pll2_528_bus_main_clk),
4987 _REGISTER_CLOCK(NULL, "pll2_pfd_400M", pll2_pfd_400M),
4988 _REGISTER_CLOCK(NULL, "pll2_pfd_352M", pll2_pfd_352M),
4989 _REGISTER_CLOCK(NULL, "pll2_pfd_594M", pll2_pfd_594M),
4990 _REGISTER_CLOCK(NULL, "pll2_200M", pll2_200M),
4991 _REGISTER_CLOCK(NULL, "pll3_main_clk", pll3_usb_otg_main_clk),
4992 _REGISTER_CLOCK(NULL, "pll3_pfd_508M", pll3_pfd_508M),
4993 _REGISTER_CLOCK(NULL, "pll3_pfd_454M", pll3_pfd_454M),
4994 _REGISTER_CLOCK(NULL, "pll3_pfd_720M", pll3_pfd_720M),
4995 _REGISTER_CLOCK(NULL, "pll3_pfd_540M", pll3_pfd_540M),
4996 _REGISTER_CLOCK(NULL, "pll3_sw_clk", pll3_sw_clk),
4997 _REGISTER_CLOCK(NULL, "pll3_120M", pll3_120M),
4998 _REGISTER_CLOCK(NULL, "pll3_120M", pll3_80M),
4999 _REGISTER_CLOCK(NULL, "pll3_120M", pll3_60M),
5000 _REGISTER_CLOCK(NULL, "pll4", pll4_audio_main_clk),
5001 _REGISTER_CLOCK(NULL, "pll5", pll5_video_main_clk),
5002 _REGISTER_CLOCK(NULL, "pll6", pll6_mlb150_main_clk),
5003 _REGISTER_CLOCK(NULL, "pll3", pll7_usb_host_main_clk),
5004 _REGISTER_CLOCK(NULL, "pll4", pll8_enet_main_clk),
5005 _REGISTER_CLOCK(NULL, "cpu_clk", cpu_clk),
5006 _REGISTER_CLOCK("smp_twd", NULL, twd_clk),
5007 _REGISTER_CLOCK(NULL, "periph_clk", periph_clk),
5008 _REGISTER_CLOCK(NULL, "axi_clk", axi_clk),
5009 _REGISTER_CLOCK(NULL, "mmdc_ch0_axi", mmdc_ch0_axi_clk[0]),
5010 _REGISTER_CLOCK(NULL, "mmdc_ch1_axi", mmdc_ch1_axi_clk[0]),
5011 _REGISTER_CLOCK(NULL, "ahb", ahb_clk),
5012 _REGISTER_CLOCK(NULL, "ipg_clk", ipg_clk),
5013 _REGISTER_CLOCK(NULL, "ipg_perclk", ipg_perclk),
5014 _REGISTER_CLOCK(NULL, "spba", spba_clk),
5015 _REGISTER_CLOCK("imx-sdma", NULL, sdma_clk[0]),
5016 _REGISTER_CLOCK(NULL, "gpu2d_axi_clk", gpu2d_axi_clk),
5017 _REGISTER_CLOCK(NULL, "gpu3d_axi_clk", gpu3d_axi_clk),
5018 _REGISTER_CLOCK(NULL, "pcie_axi_clk", pcie_axi_clk),
5019 _REGISTER_CLOCK(NULL, "vdo_axi_clk", vdo_axi_clk),
5020 _REGISTER_CLOCK(NULL, "iim_clk", iim_clk),
5021 _REGISTER_CLOCK(NULL, "i2c_clk", i2c_clk[0]),
5022 _REGISTER_CLOCK("imx-i2c.1", NULL, i2c_clk[1]),
5023 _REGISTER_CLOCK("imx-i2c.2", NULL, i2c_clk[2]),
5024 _REGISTER_CLOCK(NULL, "vpu_clk", vpu_clk[0]),
5025 _REGISTER_CLOCK(NULL, "ipu1_clk", ipu1_clk),
5026 _REGISTER_CLOCK(NULL, "ipu2_clk", ipu2_clk),
5027 _REGISTER_CLOCK("sdhci-esdhc-imx.0", NULL, usdhc1_clk),
5028 _REGISTER_CLOCK("sdhci-esdhc-imx.1", NULL, usdhc2_clk),
5029 _REGISTER_CLOCK("sdhci-esdhc-imx.2", NULL, usdhc3_clk),
5030 _REGISTER_CLOCK("sdhci-esdhc-imx.3", NULL, usdhc4_clk),
5031 _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk),
5032 _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk),
5033 _REGISTER_CLOCK("imx-ssi.2", NULL, ssi3_clk),
5034 _REGISTER_CLOCK(NULL, "ipu1_di0_clk", ipu1_di_clk[0]),
5035 _REGISTER_CLOCK(NULL, "ipu1_di1_clk", ipu1_di_clk[1]),
5036 _REGISTER_CLOCK(NULL, "ipu2_di0_clk", ipu2_di_clk[0]),
5037 _REGISTER_CLOCK(NULL, "ipu2_di1_clk", ipu2_di_clk[1]),
5038 _REGISTER_CLOCK(NULL, "can_root_clk", can_clk_root),
5039 _REGISTER_CLOCK("imx6q-flexcan.0", NULL, can1_clk[0]),
5040 _REGISTER_CLOCK("imx6q-flexcan.1", NULL, can2_clk[0]),
5041 _REGISTER_CLOCK(NULL, "ldb_di0_clk", ldb_di0_clk),
5042 _REGISTER_CLOCK(NULL, "ldb_di1_clk", ldb_di1_clk),
5043 _REGISTER_CLOCK("mxc_spdif.0", NULL, spdif0_clk[0]),
5044 _REGISTER_CLOCK(NULL, "esai_clk", esai_clk),
5045 _REGISTER_CLOCK("imx6q-ecspi.0", NULL, ecspi_clk[0]),
5046 _REGISTER_CLOCK("imx6q-ecspi.1", NULL, ecspi_clk[1]),
5047 _REGISTER_CLOCK("imx6q-ecspi.2", NULL, ecspi_clk[2]),
5048 _REGISTER_CLOCK("imx6q-ecspi.3", NULL, ecspi_clk[3]),
5049 _REGISTER_CLOCK("imx6q-ecspi.4", NULL, ecspi_clk[4]),
5050 _REGISTER_CLOCK(NULL, "emi_slow_clk", emi_slow_clk),
5051 _REGISTER_CLOCK(NULL, "emi_clk", emi_clk),
5052 _REGISTER_CLOCK(NULL, "enfc_clk", enfc_clk),
5053 _REGISTER_CLOCK("imx-uart.0", NULL, uart_clk[0]),
5054 _REGISTER_CLOCK("imx-uart.1", NULL, uart_clk[0]),
5055 _REGISTER_CLOCK("imx-uart.2", NULL, uart_clk[0]),
5056 _REGISTER_CLOCK("imx-uart.3", NULL, uart_clk[0]),
5057 _REGISTER_CLOCK(NULL, "hsi_tx", hsi_tx_clk[0]),
5058 _REGISTER_CLOCK(NULL, "caam_clk", caam_clk[0]),
5059 _REGISTER_CLOCK(NULL, "asrc_clk", asrc_clk[0]),
5060 _REGISTER_CLOCK(NULL, "asrc_serial_clk", asrc_clk[1]),
5061 _REGISTER_CLOCK("mxs-dma-apbh", NULL, apbh_dma_clk),
5062 _REGISTER_CLOCK(NULL, "openvg_axi_clk", openvg_axi_clk),
5063 _REGISTER_CLOCK(NULL, "gpu3d_clk", gpu3d_core_clk[0]),
5064 _REGISTER_CLOCK(NULL, "gpu2d_clk", gpu2d_core_clk[0]),
5065 _REGISTER_CLOCK(NULL, "gpu3d_shader_clk", gpu3d_shader_clk),
5066 _REGISTER_CLOCK(NULL, "gpt", gpt_clk[0]),
5067 _REGISTER_CLOCK("imx6q-gpmi-nand.0", NULL, gpmi_nand_clk[0]),
5068 _REGISTER_CLOCK(NULL, "gpmi-apb", gpmi_nand_clk[1]),
5069 _REGISTER_CLOCK(NULL, "bch", gpmi_nand_clk[2]),
5070 _REGISTER_CLOCK(NULL, "bch-apb", gpmi_nand_clk[3]),
5071 _REGISTER_CLOCK(NULL, "pl301_mx6qperl-bch", gpmi_nand_clk[4]),
5072 _REGISTER_CLOCK("mxc_pwm.0", NULL, pwm_clk[0]),
5073 _REGISTER_CLOCK("mxc_pwm.1", NULL, pwm_clk[1]),
5074 _REGISTER_CLOCK("mxc_pwm.2", NULL, pwm_clk[2]),
5075 _REGISTER_CLOCK("mxc_pwm.3", NULL, pwm_clk[3]),
5076 _REGISTER_CLOCK(NULL, "pcie_clk", pcie_clk[0]),
5077 _REGISTER_CLOCK("fec.0", NULL, enet_clk[0]),
5078 _REGISTER_CLOCK(NULL, "imx_sata_clk", sata_clk[0]),
5079 _REGISTER_CLOCK(NULL, "usboh3_clk", usboh3_clk[0]),
5080 _REGISTER_CLOCK(NULL, "usb_phy1_clk", usb_phy1_clk),
5081 _REGISTER_CLOCK(NULL, "usb_phy3_clk", usb_phy3_clk),
5082 _REGISTER_CLOCK(NULL, "usb_phy4_clk", usb_phy4_clk),
5083 _REGISTER_CLOCK("imx2-wdt.0", NULL, dummy_clk),
5084 _REGISTER_CLOCK("imx2-wdt.1", NULL, dummy_clk),
5085 _REGISTER_CLOCK(NULL, "hdmi_isfr_clk", hdmi_clk[0]),
5086 _REGISTER_CLOCK(NULL, "hdmi_iahb_clk", hdmi_clk[1]),
5087 _REGISTER_CLOCK(NULL, "mipi_pllref_clk", mipi_pllref_clk),
5088 _REGISTER_CLOCK(NULL, NULL, vdoa_clk),
5089 _REGISTER_CLOCK(NULL, NULL, aips_tz2_clk),
5090 _REGISTER_CLOCK(NULL, NULL, aips_tz1_clk),
5091 _REGISTER_CLOCK(NULL, "clko_clk", clko_clk),
5092 _REGISTER_CLOCK(NULL, "clko2_clk", clko2_clk),
5093 _REGISTER_CLOCK(NULL, "pxp_axi", ipu2_clk),
5094 _REGISTER_CLOCK(NULL, "epdc_axi", ipu2_clk),
5095 _REGISTER_CLOCK(NULL, "epdc_pix", ipu2_di_clk[1]),
5096 _REGISTER_CLOCK("mxs-perfmon.0", "perfmon", perfmon0_clk),
5097 _REGISTER_CLOCK("mxs-perfmon.1", "perfmon", perfmon1_clk),
5098 _REGISTER_CLOCK("mxs-perfmon.2", "perfmon", perfmon2_clk),
5099 _REGISTER_CLOCK(NULL, "mlb150_clk", mlb150_clk),
5100 _REGISTER_CLOCK(NULL, "anaclk_1", anaclk_1),
5101 _REGISTER_CLOCK(NULL, "anaclk_2", anaclk_2),
5104 static void clk_tree_init(void)
5109 reg = __raw_readl(MMDC_MDMISC_OFFSET);
5110 if ((reg & MMDC_MDMISC_DDR_TYPE_MASK) ==
5111 (0x1 << MMDC_MDMISC_DDR_TYPE_OFFSET) ||
5113 clk_set_parent(&periph_clk, &pll2_pfd_400M);
5114 printk(KERN_INFO "Set periph_clk's parent to pll2_pfd_400M!\n");
5119 int __init mx6_clocks_init(unsigned long ckil, unsigned long osc,
5120 unsigned long ckih1, unsigned long ckih2)
5125 external_low_reference = ckil;
5126 external_high_reference = ckih1;
5127 ckih2_reference = ckih2;
5128 oscillator_reference = osc;
5130 apll_base = ioremap(ANATOP_BASE_ADDR, SZ_4K);
5132 for (i = 0; i < ARRAY_SIZE(lookups); i++) {
5133 clkdev_add(&lookups[i]);
5134 clk_debug_register(lookups[i].clk);
5137 /* Disable un-necessary PFDs & PLLs */
5139 /* keep correct count. */
5140 clk_enable(&cpu_clk);
5141 clk_enable(&periph_clk);
5145 if (pll2_pfd_400M.usecount == 0 && cpu_is_mx6q())
5146 pll2_pfd_400M.disable(&pll2_pfd_400M);
5147 pll2_pfd_352M.disable(&pll2_pfd_352M);
5148 pll2_pfd_594M.disable(&pll2_pfd_594M);
5150 #if !defined(CONFIG_FEC_1588)
5151 pll3_pfd_454M.disable(&pll3_pfd_454M);
5152 pll3_pfd_508M.disable(&pll3_pfd_508M);
5153 pll3_pfd_540M.disable(&pll3_pfd_540M);
5154 pll3_pfd_720M.disable(&pll3_pfd_720M);
5156 pll3_usb_otg_main_clk.disable(&pll3_usb_otg_main_clk);
5158 pll4_audio_main_clk.disable(&pll4_audio_main_clk);
5159 pll5_video_main_clk.disable(&pll5_video_main_clk);
5160 pll6_mlb150_main_clk.disable(&pll6_mlb150_main_clk);
5161 pll7_usb_host_main_clk.disable(&pll7_usb_host_main_clk);
5162 pll8_enet_main_clk.disable(&pll8_enet_main_clk);
5164 sata_clk[0].disable(&sata_clk[0]);
5165 pcie_clk[0].disable(&pcie_clk[0]);
5167 /* Initialize Audio and Video PLLs to valid frequency (650MHz). */
5168 clk_set_rate(&pll4_audio_main_clk, 650000000);
5169 clk_set_rate(&pll5_video_main_clk, 650000000);
5171 clk_set_parent(&ipu1_di_clk[0], &pll5_video_main_clk);
5172 clk_set_parent(&ipu1_di_clk[1], &pll5_video_main_clk);
5173 clk_set_parent(&ipu2_di_clk[0], &pll5_video_main_clk);
5174 clk_set_parent(&ipu2_di_clk[1], &pll5_video_main_clk);
5176 clk_set_parent(&emi_clk, &pll2_pfd_400M);
5177 clk_set_rate(&emi_clk, 200000000);
5179 clk_set_parent(&gpu3d_shader_clk, &pll2_pfd_594M);
5180 clk_set_rate(&gpu3d_shader_clk, 594000000);
5181 clk_set_parent(&gpu3d_core_clk[0], &mmdc_ch0_axi_clk[0]);
5182 clk_set_rate(&gpu3d_core_clk[0], 528000000);
5183 if (cpu_is_mx6dl()) {
5184 /*on mx6dl, 2d core clock sources from 3d shader core clock*/
5185 clk_set_parent(&gpu2d_core_clk[0], &gpu3d_shader_clk);
5186 /* on mx6dl gpu3d_axi_clk source from mmdc0 directly */
5187 clk_set_parent(&gpu3d_axi_clk, &mmdc_ch0_axi_clk[0]);
5188 /* on mx6dl gpu2d_axi_clk source from mmdc0 directly */
5189 clk_set_parent(&gpu2d_axi_clk, &mmdc_ch0_axi_clk[0]);
5191 /* set axi_clk parent to pll3_pfd_540M */
5192 clk_set_parent(&axi_clk, &pll3_pfd_540M);
5194 /* on mx6dl, max ipu clock is 274M */
5195 clk_set_parent(&ipu1_clk, &pll3_pfd_540M);
5196 clk_set_parent(&ldb_di0_clk, &pll2_pfd_352M);
5197 clk_set_parent(&ldb_di1_clk, &pll2_pfd_352M);
5200 clk_set_parent(&gpu2d_core_clk[0], &pll3_usb_otg_main_clk);
5202 /* PCLK camera - J5 */
5203 clk_set_parent(&clko2_clk, &osc_clk);
5204 clk_set_rate(&clko2_clk, 2400000);
5206 clk_set_parent(&clko_clk, &ipg_clk);
5208 * FIXME: asrc needs to use asrc_serial(spdif1) clock to do sample
5209 * rate convertion and this clock frequency can not be too high, set
5210 * it to the minimum value 7.5Mhz to make asrc work properly.
5212 clk_set_parent(&asrc_clk[1], &pll3_sw_clk);
5213 clk_set_rate(&asrc_clk[1], 7500000);
5215 /* set the GPMI clock to default frequency : 20MHz */
5216 clk_set_rate(&enfc_clk, enfc_clk.round_rate(&enfc_clk, 20000000));
5219 cpu_op_tbl = get_cpu_op(&cpu_op_nr);
5221 /* Gate off all possible clocks */
5222 if (mxc_jtag_enabled) {
5223 __raw_writel(3 << MXC_CCM_CCGRx_CG11_OFFSET |
5224 3 << MXC_CCM_CCGRx_CG2_OFFSET |
5225 3 << MXC_CCM_CCGRx_CG1_OFFSET |
5226 3 << MXC_CCM_CCGRx_CG0_OFFSET, MXC_CCM_CCGR0);
5228 __raw_writel(1 << MXC_CCM_CCGRx_CG11_OFFSET |
5229 3 << MXC_CCM_CCGRx_CG2_OFFSET |
5230 3 << MXC_CCM_CCGRx_CG1_OFFSET |
5231 3 << MXC_CCM_CCGRx_CG0_OFFSET, MXC_CCM_CCGR0);
5233 __raw_writel(3 << MXC_CCM_CCGRx_CG10_OFFSET, MXC_CCM_CCGR1);
5234 __raw_writel(1 << MXC_CCM_CCGRx_CG12_OFFSET |
5235 1 << MXC_CCM_CCGRx_CG11_OFFSET |
5236 3 << MXC_CCM_CCGRx_CG10_OFFSET |
5237 3 << MXC_CCM_CCGRx_CG9_OFFSET |
5238 3 << MXC_CCM_CCGRx_CG8_OFFSET, MXC_CCM_CCGR2);
5239 __raw_writel(1 << MXC_CCM_CCGRx_CG14_OFFSET |
5240 3 << MXC_CCM_CCGRx_CG13_OFFSET |
5241 3 << MXC_CCM_CCGRx_CG12_OFFSET |
5242 3 << MXC_CCM_CCGRx_CG11_OFFSET |
5243 3 << MXC_CCM_CCGRx_CG10_OFFSET, MXC_CCM_CCGR3);
5244 __raw_writel(3 << MXC_CCM_CCGRx_CG7_OFFSET |
5245 1 << MXC_CCM_CCGRx_CG6_OFFSET |
5246 1 << MXC_CCM_CCGRx_CG4_OFFSET, MXC_CCM_CCGR4);
5247 __raw_writel(1 << MXC_CCM_CCGRx_CG0_OFFSET, MXC_CCM_CCGR5);
5249 __raw_writel(0, MXC_CCM_CCGR6);
5251 /* Lower the ipg_perclk frequency to 8.25MHz. */
5252 clk_set_rate(&ipg_perclk, 8250000);
5255 clk_set_parent(&spdif0_clk[0], &pll3_pfd_454M);
5258 clk_set_parent(&ipu2_clk, &pll2_pfd_400M);
5259 clk_set_rate(&ipu2_clk, 200000000);
5261 if (mx6q_revision() == IMX_CHIP_REVISION_1_0) {
5262 gpt_clk[0].parent = &ipg_perclk;
5263 gpt_clk[0].get_rate = NULL;
5265 /* Here we use OSC 24M as GPT's clock source, no need to
5266 enable gpt serial clock*/
5267 gpt_clk[0].secondary = NULL;
5270 if (cpu_is_mx6dl()) {
5272 clk_set_parent(&ipu2_di_clk[1], &pll5_video_main_clk);
5274 clk_set_parent(&ipu2_di_clk[1], &pll3_pfd_540M);
5277 base = ioremap(GPT_BASE_ADDR, SZ_4K);
5278 mxc_timer_init(&gpt_clk[0], base, MXC_INT_GPT);