3 * Copyright (C) 2012 Freescale Semiconductor, Inc. All Rights Reserved.
7 * The code contained herein is licensed under the GNU General Public
8 * License. You may obtain a copy of the GNU General Public License
9 * Version 2 or later at the following locations:
11 * http://www.opensource.org/licenses/gpl-license.html
12 * http://www.gnu.org/copyleft/gpl.html
15 #include <linux/kernel.h>
16 #include <linux/init.h>
17 #include <linux/types.h>
18 #include <linux/time.h>
19 #include <linux/hrtimer.h>
21 #include <linux/errno.h>
22 #include <linux/delay.h>
23 #include <linux/clk.h>
25 #include <linux/clkdev.h>
26 #include <linux/regulator/consumer.h>
27 #include <asm/div64.h>
28 #include <mach/hardware.h>
29 #include <mach/common.h>
30 #include <mach/clock.h>
31 #include <mach/mxc_dvfs.h>
33 #include "cpu_op-mx6.h"
34 #include "regs-anadig.h"
36 #ifdef CONFIG_CLK_DEBUG
37 #define __INIT_CLK_DEBUG(n) .name = #n,
39 #define __INIT_CLK_DEBUG(n)
42 extern u32 arm_max_freq;
43 extern int mxc_jtag_enabled;
44 extern struct regulator *cpu_regulator;
45 extern struct cpu_op *(*get_cpu_op)(int *op);
46 extern int lp_high_freq;
47 extern int lp_med_freq;
48 extern int mx6q_revision(void);
50 void __iomem *apll_base;
51 static struct clk pll1_sys_main_clk;
52 static struct clk pll2_528_bus_main_clk;
53 static struct clk pll2_pfd_400M;
54 static struct clk pll3_usb_otg_main_clk;
55 static struct clk pll4_audio_main_clk;
56 static struct clk pll5_video_main_clk;
57 static struct clk pll6_mlb150_main_clk;
58 static struct clk pll7_usb_host_main_clk;
59 static struct clk pll8_enet_main_clk;
60 static struct clk apbh_dma_clk;
61 static struct clk openvg_axi_clk;
62 static struct clk enfc_clk;
63 static struct clk ipu1_di_clk_root;
64 static struct clk ipu2_di_clk_root;
65 static struct clk usdhc3_clk;
67 static struct cpu_op *cpu_op_tbl;
70 #define SPIN_DELAY 1200000 /* in nanoseconds */
72 #define AUDIO_VIDEO_MIN_CLK_FREQ 650000000
73 #define AUDIO_VIDEO_MAX_CLK_FREQ 1300000000
75 /* We need to check the exp status again after timer expiration,
76 * as there might be interrupt coming between the first time exp
77 * and the time reading, then the time reading may be several ms
78 * after the exp checking due to the irq handle, so we need to
79 * check it to make sure the exp return the right value after
80 * timer expiration. */
81 #define WAIT(exp, timeout) \
83 struct timespec nstimeofday; \
84 struct timespec curtime; \
86 getnstimeofday(&nstimeofday); \
88 getnstimeofday(&curtime); \
89 if ((curtime.tv_nsec - nstimeofday.tv_nsec) > (timeout)) { \
98 /* External clock values passed-in by the board code */
99 static unsigned long external_high_reference, external_low_reference;
100 static unsigned long oscillator_reference, ckih2_reference;
102 /* For MX 6DL/S, Video PLL may be used by synchronous display devices,
103 * such as HDMI or LVDS, and also by the EPDC. If EPDC is in use,
104 * it must use the Video PLL to achieve the clock frequencies it needs.
105 * So if EPDC is in use, the "epdc" string should be added to kernel
106 * parameters, in order to set the EPDC parent clock to the Video PLL.
107 * This will have an impact on the behavior of HDMI and LVDS.
109 static int epdc_use_video_pll;
110 static int __init epdc_clk_setup(char *__unused)
112 epdc_use_video_pll = 1;
115 __setup("epdc", epdc_clk_setup);
117 static void __calc_pre_post_dividers(u32 max_podf, u32 div, u32 *pre, u32 *post)
119 u32 min_pre, temp_pre, old_err, err;
121 /* Some of the podfs are 3 bits while others are 6 bits.
122 * Handle both cases here.
124 if (div >= 512 && (max_podf == 64)) {
125 /* For pre = 3bits and podf = 6 bits, max divider is 512. */
128 } else if (div >= 64 && (max_podf == 8)) {
129 /* For pre = 3bits and podf = 3 bits, max divider is 64. */
132 } else if (div >= 8) {
133 /* Find the minimum pre-divider for a max podf */
135 min_pre = (div - 1) / (1 << 6) + 1;
137 min_pre = (div - 1) / (1 << 3) + 1;
139 /* Now loop through to find the max pre-divider. */
140 for (temp_pre = 8; temp_pre >= min_pre; temp_pre--) {
141 err = div % temp_pre;
146 err = temp_pre - err;
152 *post = (div + *pre - 1) / *pre;
153 } else if (div < 8) {
159 static int _clk_enable(struct clk *clk)
162 reg = __raw_readl(clk->enable_reg);
163 reg |= MXC_CCM_CCGRx_CG_MASK << clk->enable_shift;
164 __raw_writel(reg, clk->enable_reg);
166 if (clk->flags & AHB_HIGH_SET_POINT)
168 else if (clk->flags & AHB_MED_SET_POINT)
174 static void _clk_disable(struct clk *clk)
177 reg = __raw_readl(clk->enable_reg);
178 reg &= ~(MXC_CCM_CCGRx_CG_MASK << clk->enable_shift);
179 __raw_writel(reg, clk->enable_reg);
181 if (clk->flags & AHB_HIGH_SET_POINT)
183 else if (clk->flags & AHB_MED_SET_POINT)
187 static void _clk_disable_inwait(struct clk *clk)
190 reg = __raw_readl(clk->enable_reg);
191 reg &= ~(MXC_CCM_CCGRx_CG_MASK << clk->enable_shift);
192 reg |= 1 << clk->enable_shift;
193 __raw_writel(reg, clk->enable_reg);
197 * For the 4-to-1 muxed input clock
199 static inline u32 _get_mux(struct clk *parent, struct clk *m0,
200 struct clk *m1, struct clk *m2, struct clk *m3)
204 else if (parent == m1)
206 else if (parent == m2)
208 else if (parent == m3)
216 static inline void __iomem *_get_pll_base(struct clk *pll)
218 if (pll == &pll1_sys_main_clk)
219 return PLL1_SYS_BASE_ADDR;
220 else if (pll == &pll2_528_bus_main_clk)
221 return PLL2_528_BASE_ADDR;
222 else if (pll == &pll3_usb_otg_main_clk)
223 return PLL3_480_USB1_BASE_ADDR;
224 else if (pll == &pll4_audio_main_clk)
225 return PLL4_AUDIO_BASE_ADDR;
226 else if (pll == &pll5_video_main_clk)
227 return PLL5_VIDEO_BASE_ADDR;
228 else if (pll == &pll6_mlb150_main_clk)
229 return PLL6_MLB_BASE_ADDR;
230 else if (pll == &pll7_usb_host_main_clk)
231 return PLL7_480_USB2_BASE_ADDR;
232 else if (pll == &pll8_enet_main_clk)
233 return PLL8_ENET_BASE_ADDR;
241 * For the 6-to-1 muxed input clock
243 static inline u32 _get_mux6(struct clk *parent, struct clk *m0, struct clk *m1,
244 struct clk *m2, struct clk *m3, struct clk *m4,
249 else if (parent == m1)
251 else if (parent == m2)
253 else if (parent == m3)
255 else if (parent == m4)
257 else if (parent == m5)
264 static unsigned long get_high_reference_clock_rate(struct clk *clk)
266 return external_high_reference;
269 static unsigned long get_low_reference_clock_rate(struct clk *clk)
271 return external_low_reference;
274 static unsigned long get_oscillator_reference_clock_rate(struct clk *clk)
276 return oscillator_reference;
279 static unsigned long get_ckih2_reference_clock_rate(struct clk *clk)
281 return ckih2_reference;
284 /* External high frequency clock */
285 static struct clk ckih_clk = {
286 __INIT_CLK_DEBUG(ckih_clk)
287 .get_rate = get_high_reference_clock_rate,
290 static struct clk ckih2_clk = {
291 __INIT_CLK_DEBUG(ckih2_clk)
292 .get_rate = get_ckih2_reference_clock_rate,
295 static struct clk osc_clk = {
296 __INIT_CLK_DEBUG(osc_clk)
297 .get_rate = get_oscillator_reference_clock_rate,
300 /* External low frequency (32kHz) clock */
301 static struct clk ckil_clk = {
302 __INIT_CLK_DEBUG(ckil_clk)
303 .get_rate = get_low_reference_clock_rate,
306 static unsigned long pfd_round_rate(struct clk *clk, unsigned long rate)
311 tmp = (u64)clk_get_rate(clk->parent) * 18;
315 frac = frac < 12 ? 12 : frac;
316 frac = frac > 35 ? 35 : frac;
317 tmp = (u64)clk_get_rate(clk->parent) * 18;
322 static unsigned long pfd_get_rate(struct clk *clk)
326 tmp = (u64)clk_get_rate(clk->parent) * 18;
328 if (apbh_dma_clk.usecount == 0)
329 apbh_dma_clk.enable(&apbh_dma_clk);
331 frac = (__raw_readl(clk->enable_reg) >> clk->enable_shift) &
332 ANADIG_PFD_FRAC_MASK;
339 static int pfd_set_rate(struct clk *clk, unsigned long rate)
343 tmp = (u64)clk_get_rate(clk->parent) * 18;
345 if (apbh_dma_clk.usecount == 0)
346 apbh_dma_clk.enable(&apbh_dma_clk);
348 /* Round up the divider so that we don't set a rate
349 * higher than what is requested. */
353 frac = frac < 12 ? 12 : frac;
354 frac = frac > 35 ? 35 : frac;
355 /* clear clk frac bits */
356 __raw_writel(ANADIG_PFD_FRAC_MASK << clk->enable_shift,
357 (int)clk->enable_reg + 8);
358 /* set clk frac bits */
359 __raw_writel(frac << clk->enable_shift,
360 (int)clk->enable_reg + 4);
362 if (apbh_dma_clk.usecount == 0)
363 apbh_dma_clk.disable(&apbh_dma_clk);
367 static int _clk_pfd_enable(struct clk *clk)
369 if (apbh_dma_clk.usecount == 0)
370 apbh_dma_clk.enable(&apbh_dma_clk);
372 /* clear clk gate bit */
373 __raw_writel((1 << (clk->enable_shift + 7)),
374 (int)clk->enable_reg + 8);
376 if (apbh_dma_clk.usecount == 0)
377 apbh_dma_clk.disable(&apbh_dma_clk);
382 static void _clk_pfd_disable(struct clk *clk)
384 if (apbh_dma_clk.usecount == 0)
385 apbh_dma_clk.enable(&apbh_dma_clk);
387 /* set clk gate bit */
388 __raw_writel((1 << (clk->enable_shift + 7)),
389 (int)clk->enable_reg + 4);
391 if (apbh_dma_clk.usecount == 0)
392 apbh_dma_clk.disable(&apbh_dma_clk);
395 static int _clk_pll_enable(struct clk *clk)
398 void __iomem *pllbase;
400 pllbase = _get_pll_base(clk);
402 reg = __raw_readl(pllbase);
403 reg &= ~ANADIG_PLL_BYPASS;
404 reg &= ~ANADIG_PLL_POWER_DOWN;
406 /* The 480MHz PLLs have the opposite definition for power bit. */
407 if (clk == &pll3_usb_otg_main_clk || clk == &pll7_usb_host_main_clk)
408 reg |= ANADIG_PLL_POWER_DOWN;
410 __raw_writel(reg, pllbase);
412 /* It will power on pll3 */
413 if (clk == &pll3_usb_otg_main_clk)
414 __raw_writel(BM_ANADIG_ANA_MISC2_CONTROL0, apll_base + HW_ANADIG_ANA_MISC2_CLR);
416 /* Wait for PLL to lock */
417 if (!WAIT(__raw_readl(pllbase) & ANADIG_PLL_LOCK,
419 panic("pll enable failed\n");
421 /* Enable the PLL output now*/
422 reg = __raw_readl(pllbase);
423 reg |= ANADIG_PLL_ENABLE;
424 __raw_writel(reg, pllbase);
429 static void _clk_pll_disable(struct clk *clk)
432 void __iomem *pllbase;
434 pllbase = _get_pll_base(clk);
436 reg = __raw_readl(pllbase);
437 reg |= ANADIG_PLL_BYPASS;
438 reg &= ~ANADIG_PLL_ENABLE;
440 __raw_writel(reg, pllbase);
443 * It will power off PLL3's power, it is the TO1.1 fix
444 * Please see TKT064178 for detail.
446 if (clk == &pll3_usb_otg_main_clk)
447 __raw_writel(BM_ANADIG_ANA_MISC2_CONTROL0, apll_base + HW_ANADIG_ANA_MISC2_SET);
450 static unsigned long _clk_pll1_main_get_rate(struct clk *clk)
455 div = __raw_readl(PLL1_SYS_BASE_ADDR) & ANADIG_PLL_SYS_DIV_SELECT_MASK;
456 val = (clk_get_rate(clk->parent) * div) / 2;
460 static int _clk_pll1_main_set_rate(struct clk *clk, unsigned long rate)
462 unsigned int reg, div;
464 if (rate < AUDIO_VIDEO_MIN_CLK_FREQ || rate > AUDIO_VIDEO_MAX_CLK_FREQ)
467 div = (rate * 2) / clk_get_rate(clk->parent) ;
469 reg = __raw_readl(PLL1_SYS_BASE_ADDR) & ~ANADIG_PLL_SYS_DIV_SELECT_MASK;
471 __raw_writel(reg, PLL1_SYS_BASE_ADDR);
476 static struct clk pll1_sys_main_clk = {
477 __INIT_CLK_DEBUG(pll1_sys_main_clk)
479 .get_rate = _clk_pll1_main_get_rate,
480 .set_rate = _clk_pll1_main_set_rate,
481 .enable = _clk_pll_enable,
482 .disable = _clk_pll_disable,
485 static int _clk_pll1_sw_set_parent(struct clk *clk, struct clk *parent)
489 reg = __raw_readl(MXC_CCM_CCSR);
491 if (parent == &pll1_sys_main_clk) {
492 reg &= ~MXC_CCM_CCSR_PLL1_SW_CLK_SEL;
493 __raw_writel(reg, MXC_CCM_CCSR);
494 /* Set the step_clk parent to be lp_apm, to save power. */
495 reg = __raw_readl(MXC_CCM_CCSR);
496 reg = (reg & ~MXC_CCM_CCSR_STEP_SEL);
498 /* Set STEP_CLK to be the parent*/
499 if (parent == &osc_clk) {
500 /* Set STEP_CLK to be sourced from LPAPM. */
501 reg = __raw_readl(MXC_CCM_CCSR);
502 reg = (reg & ~MXC_CCM_CCSR_STEP_SEL);
503 __raw_writel(reg, MXC_CCM_CCSR);
505 /* Set STEP_CLK to be sourced from PLL2-PDF (400MHz). */
506 reg = __raw_readl(MXC_CCM_CCSR);
507 reg |= MXC_CCM_CCSR_STEP_SEL;
508 __raw_writel(reg, MXC_CCM_CCSR);
511 reg = __raw_readl(MXC_CCM_CCSR);
512 reg |= MXC_CCM_CCSR_PLL1_SW_CLK_SEL;
514 __raw_writel(reg, MXC_CCM_CCSR);
518 static unsigned long _clk_pll1_sw_get_rate(struct clk *clk)
520 return clk_get_rate(clk->parent);
523 static struct clk pll1_sw_clk = {
524 __INIT_CLK_DEBUG(pll1_sw_clk)
525 .parent = &pll1_sys_main_clk,
526 .set_parent = _clk_pll1_sw_set_parent,
527 .get_rate = _clk_pll1_sw_get_rate,
530 static unsigned long _clk_pll2_main_get_rate(struct clk *clk)
535 div = __raw_readl(PLL2_528_BASE_ADDR) & ANADIG_PLL_528_DIV_SELECT;
538 val = clk_get_rate(clk->parent) * 22;
541 val = clk_get_rate(clk->parent) * 20;
546 static int _clk_pll2_main_set_rate(struct clk *clk, unsigned long rate)
548 unsigned int reg, div;
550 if (rate == 528000000)
552 else if (rate == 480000000)
557 reg = __raw_readl(PLL2_528_BASE_ADDR);
558 reg &= ~ANADIG_PLL_528_DIV_SELECT;
560 __raw_writel(reg, PLL2_528_BASE_ADDR);
565 static struct clk pll2_528_bus_main_clk = {
566 __INIT_CLK_DEBUG(pll2_528_bus_main_clk)
568 .get_rate = _clk_pll2_main_get_rate,
569 .set_rate = _clk_pll2_main_set_rate,
570 .enable = _clk_pll_enable,
571 .disable = _clk_pll_disable,
574 static struct clk pll2_pfd_400M = {
575 __INIT_CLK_DEBUG(pll2_pfd_400M)
576 .parent = &pll2_528_bus_main_clk,
577 .enable_reg = (void *)PFD_528_BASE_ADDR,
578 .enable_shift = ANADIG_PFD2_FRAC_OFFSET,
579 .enable = _clk_pfd_enable,
580 .disable = _clk_pfd_disable,
581 .get_rate = pfd_get_rate,
582 .set_rate = pfd_set_rate,
583 .get_rate = pfd_get_rate,
584 .round_rate = pfd_round_rate,
587 static struct clk pll2_pfd_352M = {
588 __INIT_CLK_DEBUG(pll2_pfd_352M)
589 .parent = &pll2_528_bus_main_clk,
590 .enable_reg = (void *)PFD_528_BASE_ADDR,
591 .enable_shift = ANADIG_PFD0_FRAC_OFFSET,
592 .enable = _clk_pfd_enable,
593 .disable = _clk_pfd_disable,
594 .set_rate = pfd_set_rate,
595 .get_rate = pfd_get_rate,
596 .round_rate = pfd_round_rate,
599 static struct clk pll2_pfd_594M = {
600 __INIT_CLK_DEBUG(pll2_pfd_594M)
601 .parent = &pll2_528_bus_main_clk,
602 .enable_reg = (void *)PFD_528_BASE_ADDR,
603 .enable_shift = ANADIG_PFD1_FRAC_OFFSET,
604 .enable = _clk_pfd_enable,
605 .disable = _clk_pfd_disable,
606 .set_rate = pfd_set_rate,
607 .get_rate = pfd_get_rate,
608 .round_rate = pfd_round_rate,
611 static unsigned long _clk_pll2_200M_get_rate(struct clk *clk)
613 return clk_get_rate(clk->parent) / 2;
616 static struct clk pll2_200M = {
617 __INIT_CLK_DEBUG(pll2_200M)
618 .parent = &pll2_pfd_400M,
619 .get_rate = _clk_pll2_200M_get_rate,
622 static unsigned long _clk_pll3_usb_otg_get_rate(struct clk *clk)
627 div = __raw_readl(PLL3_480_USB1_BASE_ADDR)
628 & ANADIG_PLL_480_DIV_SELECT_MASK;
631 val = clk_get_rate(clk->parent) * 22;
633 val = clk_get_rate(clk->parent) * 20;
637 static int _clk_pll3_usb_otg_set_rate(struct clk *clk, unsigned long rate)
639 unsigned int reg, div;
641 if (rate == 528000000)
643 else if (rate == 480000000)
648 reg = __raw_readl(PLL3_480_USB1_BASE_ADDR);
649 reg &= ~ANADIG_PLL_480_DIV_SELECT_MASK;
651 __raw_writel(reg, PLL3_480_USB1_BASE_ADDR);
657 /* same as pll3_main_clk. These two clocks should always be the same */
658 static struct clk pll3_usb_otg_main_clk = {
659 __INIT_CLK_DEBUG(pll3_usb_otg_main_clk)
661 .enable = _clk_pll_enable,
662 .disable = _clk_pll_disable,
663 .set_rate = _clk_pll3_usb_otg_set_rate,
664 .get_rate = _clk_pll3_usb_otg_get_rate,
668 static struct clk usb_phy1_clk = {
669 __INIT_CLK_DEBUG(usb_phy1_clk)
670 .parent = &pll3_usb_otg_main_clk,
671 .set_rate = _clk_pll3_usb_otg_set_rate,
672 .get_rate = _clk_pll3_usb_otg_get_rate,
675 /* For HSIC port 1 */
676 static struct clk usb_phy3_clk = {
677 __INIT_CLK_DEBUG(usb_phy3_clk)
678 .parent = &pll3_usb_otg_main_clk,
679 .set_rate = _clk_pll3_usb_otg_set_rate,
680 .get_rate = _clk_pll3_usb_otg_get_rate,
683 /* For HSIC port 2 */
684 static struct clk usb_phy4_clk = {
685 __INIT_CLK_DEBUG(usb_phy4_clk)
686 .parent = &pll3_usb_otg_main_clk,
687 .set_rate = _clk_pll3_usb_otg_set_rate,
688 .get_rate = _clk_pll3_usb_otg_get_rate,
691 static struct clk pll3_pfd_508M = {
692 __INIT_CLK_DEBUG(pll3_pfd_508M)
693 .parent = &pll3_usb_otg_main_clk,
694 .enable_reg = (void *)PFD_480_BASE_ADDR,
695 .enable_shift = ANADIG_PFD2_FRAC_OFFSET,
696 .enable = _clk_pfd_enable,
697 .disable = _clk_pfd_disable,
698 .set_rate = pfd_set_rate,
699 .get_rate = pfd_get_rate,
700 .round_rate = pfd_round_rate,
703 static struct clk pll3_pfd_454M = {
704 __INIT_CLK_DEBUG(pll3_pfd_454M)
705 .parent = &pll3_usb_otg_main_clk,
706 .enable_reg = (void *)PFD_480_BASE_ADDR,
707 .enable_shift = ANADIG_PFD3_FRAC_OFFSET,
708 .enable = _clk_pfd_enable,
709 .disable = _clk_pfd_disable,
710 .set_rate = pfd_set_rate,
711 .get_rate = pfd_get_rate,
712 .round_rate = pfd_round_rate,
715 static struct clk pll3_pfd_720M = {
716 __INIT_CLK_DEBUG(pll3_pfd_720M)
717 .parent = &pll3_usb_otg_main_clk,
718 .enable_reg = (void *)PFD_480_BASE_ADDR,
719 .enable_shift = ANADIG_PFD0_FRAC_OFFSET,
720 .enable = _clk_pfd_enable,
721 .disable = _clk_pfd_disable,
722 .set_rate = pfd_set_rate,
723 .get_rate = pfd_get_rate,
724 .round_rate = pfd_round_rate,
727 static struct clk pll3_pfd_540M = {
728 __INIT_CLK_DEBUG(pll3_pfd_540M)
729 .parent = &pll3_usb_otg_main_clk,
730 .enable_reg = (void *)PFD_480_BASE_ADDR,
731 .enable_shift = ANADIG_PFD1_FRAC_OFFSET,
732 .enable = _clk_pfd_enable,
733 .disable = _clk_pfd_disable,
734 .set_rate = pfd_set_rate,
735 .get_rate = pfd_get_rate,
736 .round_rate = pfd_round_rate,
737 .get_rate = pfd_get_rate,
740 static unsigned long _clk_pll3_sw_get_rate(struct clk *clk)
742 return clk_get_rate(clk->parent);
745 /* same as pll3_main_clk. These two clocks should always be the same */
746 static struct clk pll3_sw_clk = {
747 __INIT_CLK_DEBUG(pll3_sw_clk)
748 .parent = &pll3_usb_otg_main_clk,
749 .get_rate = _clk_pll3_sw_get_rate,
752 static unsigned long _clk_pll3_120M_get_rate(struct clk *clk)
754 return clk_get_rate(clk->parent) / 4;
757 static struct clk pll3_120M = {
758 __INIT_CLK_DEBUG(pll3_120M)
759 .parent = &pll3_sw_clk,
760 .get_rate = _clk_pll3_120M_get_rate,
763 static unsigned long _clk_pll3_80M_get_rate(struct clk *clk)
765 return clk_get_rate(clk->parent) / 6;
768 static struct clk pll3_80M = {
769 __INIT_CLK_DEBUG(pll3_80M)
770 .parent = &pll3_sw_clk,
771 .get_rate = _clk_pll3_80M_get_rate,
774 static unsigned long _clk_pll3_60M_get_rate(struct clk *clk)
776 return clk_get_rate(clk->parent) / 8;
779 static struct clk pll3_60M = {
780 __INIT_CLK_DEBUG(pll3_60M)
781 .parent = &pll3_sw_clk,
782 .get_rate = _clk_pll3_60M_get_rate,
785 static unsigned long _clk_audio_video_get_rate(struct clk *clk)
787 unsigned int div, mfn, mfd;
789 unsigned int parent_rate = clk_get_rate(clk->parent);
790 void __iomem *pllbase;
791 int rev = mx6q_revision();
792 unsigned int test_div_sel, control3, post_div = 1;
794 if (clk == &pll4_audio_main_clk)
795 pllbase = PLL4_AUDIO_BASE_ADDR;
797 pllbase = PLL5_VIDEO_BASE_ADDR;
799 if ((rev >= IMX_CHIP_REVISION_1_1) || cpu_is_mx6dl()) {
800 test_div_sel = (__raw_readl(pllbase)
801 & ANADIG_PLL_AV_TEST_DIV_SEL_MASK)
802 >> ANADIG_PLL_AV_TEST_DIV_SEL_OFFSET;
803 if (test_div_sel == 0)
805 else if (test_div_sel == 1)
808 if (clk == &pll5_video_main_clk) {
809 control3 = (__raw_readl(ANA_MISC2_BASE_ADDR)
810 & ANADIG_ANA_MISC2_CONTROL3_MASK)
811 >> ANADIG_ANA_MISC2_CONTROL3_OFFSET;
814 else if (control3 == 3)
819 div = __raw_readl(pllbase) & ANADIG_PLL_SYS_DIV_SELECT_MASK;
820 mfn = __raw_readl(pllbase + PLL_NUM_DIV_OFFSET);
821 mfd = __raw_readl(pllbase + PLL_DENOM_DIV_OFFSET);
823 rate = (parent_rate * div) + ((parent_rate / mfd) * mfn);
824 rate = rate / post_div;
829 static int _clk_audio_video_set_rate(struct clk *clk, unsigned long rate)
831 unsigned int reg, div;
832 unsigned int mfn, mfd = 1000000;
834 unsigned int parent_rate = clk_get_rate(clk->parent);
835 void __iomem *pllbase;
836 unsigned long min_clk_rate, pre_div_rate;
837 int rev = mx6q_revision();
838 u32 test_div_sel = 2;
841 if ((rev < IMX_CHIP_REVISION_1_1) && !cpu_is_mx6dl())
842 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ;
843 else if (clk == &pll4_audio_main_clk)
844 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ / 4;
846 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ / 16;
848 if ((rate < min_clk_rate) || (rate > AUDIO_VIDEO_MAX_CLK_FREQ))
851 if (clk == &pll4_audio_main_clk)
852 pllbase = PLL4_AUDIO_BASE_ADDR;
854 pllbase = PLL5_VIDEO_BASE_ADDR;
857 if ((rev >= IMX_CHIP_REVISION_1_1) || cpu_is_mx6dl()) {
858 while (pre_div_rate < AUDIO_VIDEO_MIN_CLK_FREQ) {
861 * test_div_sel field values:
866 * control3 field values:
871 if (test_div_sel != 0)
881 div = pre_div_rate / parent_rate;
882 temp64 = (u64) (pre_div_rate - (div * parent_rate));
884 do_div(temp64, parent_rate);
887 reg = __raw_readl(pllbase)
888 & ~ANADIG_PLL_SYS_DIV_SELECT_MASK
889 & ~ANADIG_PLL_AV_TEST_DIV_SEL_MASK;
891 (test_div_sel << ANADIG_PLL_AV_TEST_DIV_SEL_OFFSET);
892 __raw_writel(reg, pllbase);
893 __raw_writel(mfn, pllbase + PLL_NUM_DIV_OFFSET);
894 __raw_writel(mfd, pllbase + PLL_DENOM_DIV_OFFSET);
896 if (rev >= IMX_CHIP_REVISION_1_1) {
897 reg = __raw_readl(ANA_MISC2_BASE_ADDR)
898 & ~ANADIG_ANA_MISC2_CONTROL3_MASK;
899 reg |= control3 << ANADIG_ANA_MISC2_CONTROL3_OFFSET;
900 __raw_writel(reg, ANA_MISC2_BASE_ADDR);
906 static unsigned long _clk_audio_video_round_rate(struct clk *clk,
909 unsigned long min_clk_rate;
910 unsigned int div, post_div = 1;
911 unsigned int mfn, mfd = 1000000;
913 unsigned int parent_rate = clk_get_rate(clk->parent);
914 unsigned long pre_div_rate;
915 u32 test_div_sel = 2;
917 unsigned long final_rate;
918 int rev = mx6q_revision();
920 if ((rev < IMX_CHIP_REVISION_1_1) && !cpu_is_mx6dl())
921 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ;
922 else if (clk == &pll4_audio_main_clk)
923 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ / 4;
925 min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ / 16;
927 if (rate < min_clk_rate)
930 if (rate > AUDIO_VIDEO_MAX_CLK_FREQ)
931 return AUDIO_VIDEO_MAX_CLK_FREQ;
934 if ((rev >= IMX_CHIP_REVISION_1_1) || cpu_is_mx6dl()) {
935 while (pre_div_rate < AUDIO_VIDEO_MIN_CLK_FREQ) {
938 if (test_div_sel != 0)
948 div = pre_div_rate / parent_rate;
949 temp64 = (u64) (pre_div_rate - (div * parent_rate));
951 do_div(temp64, parent_rate);
954 final_rate = (parent_rate * div) + ((parent_rate / mfd) * mfn);
955 final_rate = final_rate / post_div;
961 static struct clk pll4_audio_main_clk = {
962 __INIT_CLK_DEBUG(pll4_audio_main_clk)
964 .enable = _clk_pll_enable,
965 .disable = _clk_pll_disable,
966 .set_rate = _clk_audio_video_set_rate,
967 .get_rate = _clk_audio_video_get_rate,
968 .round_rate = _clk_audio_video_round_rate,
972 static struct clk pll5_video_main_clk = {
973 __INIT_CLK_DEBUG(pll5_video_main_clk)
975 .enable = _clk_pll_enable,
976 .disable = _clk_pll_disable,
977 .set_rate = _clk_audio_video_set_rate,
978 .get_rate = _clk_audio_video_get_rate,
979 .round_rate = _clk_audio_video_round_rate,
982 static int _clk_pll_mlb_main_enable(struct clk *clk)
985 void __iomem *pllbase;
987 pllbase = _get_pll_base(clk);
989 reg = __raw_readl(pllbase);
990 reg &= ~ANADIG_PLL_BYPASS;
993 __raw_writel(reg, pllbase);
995 /* Wait for PLL to lock */
996 if (!WAIT(__raw_readl(pllbase) & ANADIG_PLL_LOCK,
998 panic("pll enable failed\n");
1003 static struct clk pll6_mlb150_main_clk = {
1004 __INIT_CLK_DEBUG(pll6_mlb150_main_clk)
1006 .enable = _clk_pll_mlb_main_enable,
1007 .disable = _clk_pll_disable,
1010 static unsigned long _clk_pll7_usb_otg_get_rate(struct clk *clk)
1015 div = __raw_readl(PLL7_480_USB2_BASE_ADDR)
1016 & ANADIG_PLL_480_DIV_SELECT_MASK;
1019 val = clk_get_rate(clk->parent) * 22;
1021 val = clk_get_rate(clk->parent) * 20;
1025 static int _clk_pll7_usb_otg_set_rate(struct clk *clk, unsigned long rate)
1027 unsigned int reg, div;
1029 if (rate == 528000000)
1031 else if (rate == 480000000)
1036 reg = __raw_readl(PLL7_480_USB2_BASE_ADDR);
1037 reg &= ~ANADIG_PLL_480_DIV_SELECT_MASK;
1039 __raw_writel(reg, PLL7_480_USB2_BASE_ADDR);
1044 static struct clk pll7_usb_host_main_clk = {
1045 __INIT_CLK_DEBUG(pll7_usb_host_main_clk)
1047 .enable = _clk_pll_enable,
1048 .disable = _clk_pll_disable,
1049 .set_rate = _clk_pll7_usb_otg_set_rate,
1050 .get_rate = _clk_pll7_usb_otg_get_rate,
1054 static struct clk pll8_enet_main_clk = {
1055 __INIT_CLK_DEBUG(pll8_enet_main_clk)
1057 .enable = _clk_pll_enable,
1058 .disable = _clk_pll_disable,
1061 static unsigned long _clk_arm_get_rate(struct clk *clk)
1065 cacrr = __raw_readl(MXC_CCM_CACRR);
1066 div = (cacrr & MXC_CCM_CACRR_ARM_PODF_MASK) + 1;
1067 return clk_get_rate(clk->parent) / div;
1070 static int _clk_arm_set_rate(struct clk *clk, unsigned long rate)
1077 for (i = 0; i < cpu_op_nr; i++) {
1078 if (rate == cpu_op_tbl[i].cpu_rate)
1084 if (cpu_op_tbl[i].pll_rate != clk_get_rate(&pll1_sys_main_clk)) {
1085 /* Change the PLL1 rate. */
1086 if (pll2_pfd_400M.usecount != 0)
1087 pll1_sw_clk.set_parent(&pll1_sw_clk, &pll2_pfd_400M);
1089 pll1_sw_clk.set_parent(&pll1_sw_clk, &osc_clk);
1090 pll1_sys_main_clk.set_rate(&pll1_sys_main_clk, cpu_op_tbl[i].pll_rate);
1091 pll1_sw_clk.set_parent(&pll1_sw_clk, &pll1_sys_main_clk);
1094 parent_rate = clk_get_rate(clk->parent);
1095 div = parent_rate / rate;
1100 if ((parent_rate / div) > rate)
1106 __raw_writel(div - 1, MXC_CCM_CACRR);
1111 static struct clk cpu_clk = {
1112 __INIT_CLK_DEBUG(cpu_clk)
1113 .parent = &pll1_sw_clk,
1114 .set_rate = _clk_arm_set_rate,
1115 .get_rate = _clk_arm_get_rate,
1118 static int _clk_periph_set_parent(struct clk *clk, struct clk *parent)
1123 mux = _get_mux6(parent, &pll2_528_bus_main_clk, &pll2_pfd_400M,
1124 &pll2_pfd_352M, &pll2_200M, &pll3_sw_clk, &osc_clk);
1127 /* Set the pre_periph_clk multiplexer */
1128 reg = __raw_readl(MXC_CCM_CBCMR);
1129 reg &= ~MXC_CCM_CBCMR_PRE_PERIPH_CLK_SEL_MASK;
1130 reg |= mux << MXC_CCM_CBCMR_PRE_PERIPH_CLK_SEL_OFFSET;
1131 __raw_writel(reg, MXC_CCM_CBCMR);
1133 /* Set the periph_clk_sel multiplexer. */
1134 reg = __raw_readl(MXC_CCM_CBCDR);
1135 reg &= ~MXC_CCM_CBCDR_PERIPH_CLK_SEL;
1136 __raw_writel(reg, MXC_CCM_CBCDR);
1138 reg = __raw_readl(MXC_CCM_CBCDR);
1139 /* Set the periph_clk2_podf divider to divide by 1. */
1140 reg &= ~MXC_CCM_CBCDR_PERIPH_CLK2_PODF_MASK;
1141 __raw_writel(reg, MXC_CCM_CBCDR);
1143 /* Set the periph_clk2_sel mux. */
1144 reg = __raw_readl(MXC_CCM_CBCMR);
1145 reg &= ~MXC_CCM_CBCMR_PERIPH_CLK2_SEL_MASK;
1146 reg |= ((mux - 4) << MXC_CCM_CBCMR_PERIPH_CLK2_SEL_OFFSET);
1147 __raw_writel(reg, MXC_CCM_CBCMR);
1149 while (__raw_readl(MXC_CCM_CDHIPR))
1152 reg = __raw_readl(MXC_CCM_CBCDR);
1153 /* Set periph_clk_sel to select periph_clk2. */
1154 reg |= MXC_CCM_CBCDR_PERIPH_CLK_SEL;
1155 __raw_writel(reg, MXC_CCM_CBCDR);
1158 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1159 & MXC_CCM_CDHIPR_PERIPH_CLK_SEL_BUSY), SPIN_DELAY))
1160 panic("_clk_periph_set_parent failed\n");
1165 static unsigned long _clk_periph_get_rate(struct clk *clk)
1171 if ((clk->parent == &pll3_sw_clk) || (clk->parent == &osc_clk)) {
1172 reg = __raw_readl(MXC_CCM_CBCDR)
1173 & MXC_CCM_CBCDR_PERIPH_CLK2_PODF_MASK;
1174 div = (reg >> MXC_CCM_CBCDR_PERIPH_CLK2_PODF_OFFSET) + 1;
1176 val = clk_get_rate(clk->parent) / div;
1180 static struct clk periph_clk = {
1181 __INIT_CLK_DEBUG(periph_clk)
1182 .parent = &pll2_528_bus_main_clk,
1183 .set_parent = _clk_periph_set_parent,
1184 .get_rate = _clk_periph_get_rate,
1187 static unsigned long _clk_axi_get_rate(struct clk *clk)
1192 reg = __raw_readl(MXC_CCM_CBCDR) & MXC_CCM_CBCDR_AXI_PODF_MASK;
1193 div = (reg >> MXC_CCM_CBCDR_AXI_PODF_OFFSET);
1195 val = clk_get_rate(clk->parent) / (div + 1);
1199 static int _clk_axi_set_rate(struct clk *clk, unsigned long rate)
1202 u32 parent_rate = clk_get_rate(clk->parent);
1204 div = parent_rate / rate;
1208 if (((parent_rate / div) != rate) || (div > 8))
1211 reg = __raw_readl(MXC_CCM_CBCDR);
1212 reg &= ~MXC_CCM_CBCDR_AXI_PODF_MASK;
1213 reg |= (div - 1) << MXC_CCM_CBCDR_AXI_PODF_OFFSET;
1214 __raw_writel(reg, MXC_CCM_CBCDR);
1216 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1217 & MXC_CCM_CDHIPR_AXI_PODF_BUSY), SPIN_DELAY))
1218 panic("pll _clk_axi_a_set_rate failed\n");
1223 static unsigned long _clk_axi_round_rate(struct clk *clk,
1227 u32 parent_rate = clk_get_rate(clk->parent);
1229 div = parent_rate / rate;
1231 /* Make sure rate is not greater than the maximum
1232 * value for the clock.
1233 * Also prevent a div of 0.
1241 return parent_rate / div;
1244 static int _clk_axi_set_parent(struct clk *clk, struct clk *parent)
1249 mux = _get_mux6(parent, &periph_clk, &pll2_pfd_400M,
1250 &pll3_pfd_540M, NULL, NULL, NULL);
1253 /* Set the AXI_SEL mux */
1254 reg = __raw_readl(MXC_CCM_CBCDR) & ~MXC_CCM_CBCDR_AXI_SEL;
1255 __raw_writel(reg, MXC_CCM_CBCDR);
1257 /* Set the AXI_ALT_SEL mux. */
1258 reg = __raw_readl(MXC_CCM_CBCDR)
1259 & ~MXC_CCM_CBCDR_AXI_ALT_SEL_MASK;
1260 reg = ((mux - 1) << MXC_CCM_CBCDR_AXI_ALT_SEL_OFFSET);
1261 __raw_writel(reg, MXC_CCM_CBCDR);
1263 /* Set the AXI_SEL mux */
1264 reg = __raw_readl(MXC_CCM_CBCDR) & ~MXC_CCM_CBCDR_AXI_SEL;
1265 reg |= MXC_CCM_CBCDR_AXI_SEL;
1266 __raw_writel(reg, MXC_CCM_CBCDR);
1271 static struct clk axi_clk = {
1272 __INIT_CLK_DEBUG(axi_clk)
1273 .parent = &periph_clk,
1274 .set_parent = _clk_axi_set_parent,
1275 .set_rate = _clk_axi_set_rate,
1276 .get_rate = _clk_axi_get_rate,
1277 .round_rate = _clk_axi_round_rate,
1280 static unsigned long _clk_ahb_get_rate(struct clk *clk)
1284 reg = __raw_readl(MXC_CCM_CBCDR);
1285 div = ((reg & MXC_CCM_CBCDR_AHB_PODF_MASK) >>
1286 MXC_CCM_CBCDR_AHB_PODF_OFFSET) + 1;
1288 return clk_get_rate(clk->parent) / div;
1291 static int _clk_ahb_set_rate(struct clk *clk, unsigned long rate)
1294 u32 parent_rate = clk_get_rate(clk->parent);
1296 div = parent_rate / rate;
1299 if (((parent_rate / div) != rate) || (div > 8))
1302 reg = __raw_readl(MXC_CCM_CBCDR);
1303 reg &= ~MXC_CCM_CBCDR_AHB_PODF_MASK;
1304 reg |= (div - 1) << MXC_CCM_CBCDR_AHB_PODF_OFFSET;
1305 __raw_writel(reg, MXC_CCM_CBCDR);
1307 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR) & MXC_CCM_CDHIPR_AHB_PODF_BUSY),
1309 panic("_clk_ahb_set_rate failed\n");
1314 static unsigned long _clk_ahb_round_rate(struct clk *clk,
1318 u32 parent_rate = clk_get_rate(clk->parent);
1320 div = parent_rate / rate;
1322 /* Make sure rate is not greater than the maximum value for the clock.
1323 * Also prevent a div of 0.
1331 return parent_rate / div;
1334 static struct clk ahb_clk = {
1335 __INIT_CLK_DEBUG(ahb_clk)
1336 .parent = &periph_clk,
1337 .get_rate = _clk_ahb_get_rate,
1338 .set_rate = _clk_ahb_set_rate,
1339 .round_rate = _clk_ahb_round_rate,
1342 static unsigned long _clk_ipg_get_rate(struct clk *clk)
1346 reg = __raw_readl(MXC_CCM_CBCDR);
1347 div = ((reg & MXC_CCM_CBCDR_IPG_PODF_MASK) >>
1348 MXC_CCM_CBCDR_IPG_PODF_OFFSET) + 1;
1350 return clk_get_rate(clk->parent) / div;
1354 static struct clk ipg_clk = {
1355 __INIT_CLK_DEBUG(ipg_clk)
1357 .get_rate = _clk_ipg_get_rate,
1360 static struct clk tzasc1_clk = {
1361 __INIT_CLK_DEBUG(tzasc1_clk)
1364 .enable_reg = MXC_CCM_CCGR2,
1365 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
1366 .enable = _clk_enable,
1367 .disable = _clk_disable_inwait,
1370 static struct clk tzasc2_clk = {
1371 __INIT_CLK_DEBUG(tzasc2_clk)
1374 .enable_reg = MXC_CCM_CCGR2,
1375 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
1376 .enable = _clk_enable,
1377 .disable = _clk_disable_inwait,
1380 static struct clk mx6fast1_clk = {
1381 __INIT_CLK_DEBUG(mx6fast1_clk)
1384 .enable_reg = MXC_CCM_CCGR4,
1385 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
1386 .enable = _clk_enable,
1387 .disable = _clk_disable_inwait,
1390 static struct clk mx6per1_clk = {
1391 __INIT_CLK_DEBUG(mx6per1_clk)
1394 .secondary = &mx6fast1_clk,
1395 .enable_reg = MXC_CCM_CCGR4,
1396 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1397 .enable = _clk_enable,
1398 .disable = _clk_disable_inwait,
1401 static struct clk mx6per2_clk = {
1402 __INIT_CLK_DEBUG(mx6per2_clk)
1405 .enable_reg = MXC_CCM_CCGR4,
1406 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
1407 .enable = _clk_enable,
1408 .disable = _clk_disable_inwait,
1411 static unsigned long _clk_mmdc_ch0_axi_get_rate(struct clk *clk)
1415 reg = __raw_readl(MXC_CCM_CBCDR);
1416 div = ((reg & MXC_CCM_CBCDR_MMDC_CH0_PODF_MASK) >>
1417 MXC_CCM_CBCDR_MMDC_CH0_PODF_OFFSET) + 1;
1419 return clk_get_rate(clk->parent) / div;
1422 static int _clk_mmdc_ch0_axi_set_rate(struct clk *clk, unsigned long rate)
1425 u32 parent_rate = clk_get_rate(clk->parent);
1427 div = parent_rate / rate;
1430 if (((parent_rate / div) != rate) || (div > 8))
1433 reg = __raw_readl(MXC_CCM_CBCDR);
1434 reg &= ~MXC_CCM_CBCDR_MMDC_CH0_PODF_MASK;
1435 reg |= (div - 1) << MXC_CCM_CBCDR_MMDC_CH0_PODF_OFFSET;
1436 __raw_writel(reg, MXC_CCM_CBCDR);
1438 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1439 & MXC_CCM_CDHIPR_MMDC_CH0_PODF_BUSY),
1441 panic("_clk_mmdc_ch0_axi_set_rate failed\n");
1446 static unsigned long _clk_mmdc_ch0_axi_round_rate(struct clk *clk,
1450 u32 parent_rate = clk_get_rate(clk->parent);
1452 div = parent_rate / rate;
1454 /* Make sure rate is not greater than the maximum value for the clock.
1455 * Also prevent a div of 0.
1463 return parent_rate / div;
1466 static struct clk mmdc_ch0_axi_clk[] = {
1468 __INIT_CLK_DEBUG(mmdc_ch0_axi_clk)
1470 .parent = &periph_clk,
1471 .enable = _clk_enable,
1472 .disable = _clk_disable_inwait,
1473 .enable_reg = MXC_CCM_CCGR3,
1474 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
1475 .secondary = &mmdc_ch0_axi_clk[1],
1476 .get_rate = _clk_mmdc_ch0_axi_get_rate,
1477 .set_rate = _clk_mmdc_ch0_axi_set_rate,
1478 .round_rate = _clk_mmdc_ch0_axi_round_rate,
1481 __INIT_CLK_DEBUG(mmdc_ch0_ipg_clk)
1484 .enable = _clk_enable,
1485 .disable = _clk_disable_inwait,
1486 .enable_reg = MXC_CCM_CCGR3,
1487 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
1488 .secondary = &tzasc1_clk,
1492 static unsigned long _clk_mmdc_ch1_axi_get_rate(struct clk *clk)
1496 reg = __raw_readl(MXC_CCM_CBCDR);
1497 div = ((reg & MXC_CCM_CBCDR_MMDC_CH1_PODF_MASK) >>
1498 MXC_CCM_CBCDR_MMDC_CH1_PODF_OFFSET) + 1;
1500 return clk_get_rate(clk->parent) / div;
1503 static int _clk_mmdc_ch1_axi_set_rate(struct clk *clk, unsigned long rate)
1506 u32 parent_rate = clk_get_rate(clk->parent);
1508 div = parent_rate / rate;
1511 if (((parent_rate / div) != rate) || (div > 8))
1514 reg = __raw_readl(MXC_CCM_CBCDR);
1515 reg &= ~MXC_CCM_CBCDR_MMDC_CH1_PODF_MASK;
1516 reg |= (div - 1) << MXC_CCM_CBCDR_MMDC_CH1_PODF_OFFSET;
1517 __raw_writel(reg, MXC_CCM_CBCDR);
1519 if (!WAIT(!(__raw_readl(MXC_CCM_CDHIPR)
1520 & MXC_CCM_CDHIPR_MMDC_CH1_PODF_BUSY), SPIN_DELAY))
1521 panic("_clk_mmdc_ch1_axi_set_rate failed\n");
1526 static unsigned long _clk_mmdc_ch1_axi_round_rate(struct clk *clk,
1530 u32 parent_rate = clk_get_rate(clk->parent);
1532 div = parent_rate / rate;
1534 /* Make sure rate is not greater than the maximum value for the clock.
1535 * Also prevent a div of 0.
1543 return parent_rate / div;
1546 static struct clk mmdc_ch1_axi_clk[] = {
1548 __INIT_CLK_DEBUG(mmdc_ch1_axi_clk)
1550 .parent = &pll2_pfd_400M,
1551 .enable = _clk_enable,
1552 .disable = _clk_disable,
1553 .enable_reg = MXC_CCM_CCGR3,
1554 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
1555 .secondary = &mmdc_ch1_axi_clk[1],
1556 .get_rate = _clk_mmdc_ch1_axi_get_rate,
1557 .set_rate = _clk_mmdc_ch1_axi_set_rate,
1558 .round_rate = _clk_mmdc_ch1_axi_round_rate,
1562 __INIT_CLK_DEBUG(mmdc_ch1_ipg_clk)
1564 .enable = _clk_enable,
1565 .disable = _clk_disable,
1566 .enable_reg = MXC_CCM_CCGR3,
1567 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
1568 .secondary = &tzasc2_clk,
1572 static struct clk ocram_clk = {
1573 __INIT_CLK_DEBUG(ocram_clk)
1576 .enable_reg = MXC_CCM_CCGR3,
1577 .enable_shift = MXC_CCM_CCGRx_CG14_OFFSET,
1578 .enable = _clk_enable,
1579 .disable = _clk_disable_inwait,
1582 static unsigned long _clk_ipg_perclk_get_rate(struct clk *clk)
1586 reg = __raw_readl(MXC_CCM_CSCMR1);
1587 div = ((reg & MXC_CCM_CSCMR1_PERCLK_PODF_MASK) >>
1588 MXC_CCM_CSCMR1_PERCLK_PODF_OFFSET) + 1;
1590 return clk_get_rate(clk->parent) / div;
1593 static int _clk_ipg_perclk_set_rate(struct clk *clk, unsigned long rate)
1596 u32 parent_rate = clk_get_rate(clk->parent);
1598 div = parent_rate / rate;
1601 if (((parent_rate / div) != rate) || (div > 64))
1604 reg = __raw_readl(MXC_CCM_CSCMR1);
1605 reg &= ~MXC_CCM_CSCMR1_PERCLK_PODF_MASK;
1606 reg |= (div - 1) << MXC_CCM_CSCMR1_PERCLK_PODF_OFFSET;
1607 __raw_writel(reg, MXC_CCM_CSCMR1);
1613 static unsigned long _clk_ipg_perclk_round_rate(struct clk *clk,
1617 u32 parent_rate = clk_get_rate(clk->parent);
1619 div = parent_rate / rate;
1621 /* Make sure rate is not greater than the maximum value for the clock.
1622 * Also prevent a div of 0.
1630 return parent_rate / div;
1633 static struct clk ipg_perclk = {
1634 __INIT_CLK_DEBUG(ipg_perclk)
1636 .get_rate = _clk_ipg_perclk_get_rate,
1637 .set_rate = _clk_ipg_perclk_set_rate,
1638 .round_rate = _clk_ipg_perclk_round_rate,
1641 static struct clk spba_clk = {
1642 __INIT_CLK_DEBUG(spba_clk)
1644 .enable_reg = MXC_CCM_CCGR5,
1645 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1646 .enable = _clk_enable,
1647 .disable = _clk_disable,
1650 static struct clk sdma_clk[] = {
1652 __INIT_CLK_DEBUG(sdma_clk)
1654 .enable_reg = MXC_CCM_CCGR5,
1655 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
1656 .enable = _clk_enable,
1657 .disable = _clk_disable,
1658 .secondary = &sdma_clk[1],
1661 .parent = &mx6per1_clk,
1662 #ifdef CONFIG_SDMA_IRAM
1663 .secondary = &ocram_clk,
1665 .secondary = &mmdc_ch0_axi_clk[0],
1670 static int _clk_gpu2d_axi_set_parent(struct clk *clk, struct clk *parent)
1672 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_GPU2D_AXI_CLK_SEL;
1674 if (parent == &ahb_clk)
1675 reg |= MXC_CCM_CBCMR_GPU2D_AXI_CLK_SEL;
1677 __raw_writel(reg, MXC_CCM_CBCMR);
1682 static struct clk gpu2d_axi_clk = {
1683 __INIT_CLK_DEBUG(gpu2d_axi_clk)
1685 .secondary = &openvg_axi_clk,
1686 .set_parent = _clk_gpu2d_axi_set_parent,
1689 static int _clk_gpu3d_axi_set_parent(struct clk *clk, struct clk *parent)
1691 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_GPU3D_AXI_CLK_SEL;
1693 if (parent == &ahb_clk)
1694 reg |= MXC_CCM_CBCMR_GPU3D_AXI_CLK_SEL;
1696 __raw_writel(reg, MXC_CCM_CBCMR);
1701 static struct clk gpu3d_axi_clk = {
1702 __INIT_CLK_DEBUG(gpu3d_axi_clk)
1704 .secondary = &mmdc_ch0_axi_clk[0],
1705 .set_parent = _clk_gpu3d_axi_set_parent,
1708 static int _clk_pcie_axi_set_parent(struct clk *clk, struct clk *parent)
1710 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_PCIE_AXI_CLK_SEL;
1712 if (parent == &ahb_clk)
1713 reg |= MXC_CCM_CBCMR_PCIE_AXI_CLK_SEL;
1715 __raw_writel(reg, MXC_CCM_CBCMR);
1720 static struct clk pcie_axi_clk = {
1721 __INIT_CLK_DEBUG(pcie_axi_clk)
1723 .set_parent = _clk_pcie_axi_set_parent,
1726 static int _clk_vdo_axi_set_parent(struct clk *clk, struct clk *parent)
1728 u32 reg = __raw_readl(MXC_CCM_CBCMR) & ~MXC_CCM_CBCMR_VDOAXI_CLK_SEL;
1730 if (parent == &ahb_clk)
1731 reg |= MXC_CCM_CBCMR_VDOAXI_CLK_SEL;
1733 __raw_writel(reg, MXC_CCM_CBCMR);
1738 static struct clk vdo_axi_clk = {
1739 __INIT_CLK_DEBUG(vdo_axi_clk)
1741 .enable_reg = MXC_CCM_CCGR6,
1742 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1743 .enable = _clk_enable,
1744 .disable = _clk_disable,
1745 .set_parent = _clk_vdo_axi_set_parent,
1748 static struct clk vdoa_clk = {
1749 __INIT_CLK_DEBUG(vdoa_clk)
1752 .secondary = &mx6fast1_clk,
1753 .enable_reg = MXC_CCM_CCGR2,
1754 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
1755 .enable = _clk_enable,
1756 .disable = _clk_disable,
1759 static unsigned long _clk_gpt_get_rate(struct clk *clk)
1763 if (mx6q_revision() == IMX_CHIP_REVISION_1_0)
1764 return clk_get_rate(clk->parent);
1766 rate = mx6_timer_rate();
1768 return clk_get_rate(clk->parent);
1773 static struct clk gpt_clk[] = {
1775 __INIT_CLK_DEBUG(gpt_clk)
1778 .enable_reg = MXC_CCM_CCGR1,
1779 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
1780 .enable = _clk_enable,
1781 .disable = _clk_disable,
1782 .get_rate = _clk_gpt_get_rate,
1783 .secondary = &gpt_clk[1],
1786 __INIT_CLK_DEBUG(gpt_serial_clk)
1788 .enable_reg = MXC_CCM_CCGR1,
1789 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
1790 .enable = _clk_enable,
1791 .disable = _clk_disable,
1795 static unsigned long _clk_iim_get_rate(struct clk *clk)
1797 return clk_get_rate(clk->parent);
1800 static struct clk iim_clk = {
1801 __INIT_CLK_DEBUG(iim_clk)
1803 .enable = _clk_enable,
1804 .enable_reg = MXC_CCM_CCGR2,
1805 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
1806 .disable = _clk_disable,
1807 .get_rate = _clk_iim_get_rate,
1810 static struct clk i2c_clk[] = {
1812 __INIT_CLK_DEBUG(i2c_clk_0)
1814 .parent = &ipg_perclk,
1815 .enable_reg = MXC_CCM_CCGR2,
1816 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
1817 .enable = _clk_enable,
1818 .disable = _clk_disable,
1821 __INIT_CLK_DEBUG(i2c_clk_1)
1823 .parent = &ipg_perclk,
1824 .enable_reg = MXC_CCM_CCGR2,
1825 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
1826 .enable = _clk_enable,
1827 .disable = _clk_disable,
1830 __INIT_CLK_DEBUG(i2c_clk_2)
1832 .parent = &ipg_perclk,
1833 .enable_reg = MXC_CCM_CCGR2,
1834 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
1835 .enable = _clk_enable,
1836 .disable = _clk_disable,
1840 static int _clk_vpu_axi_set_parent(struct clk *clk, struct clk *parent)
1843 u32 reg = __raw_readl(MXC_CCM_CBCMR)
1844 & ~MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_MASK;
1846 mux = _get_mux6(parent, &axi_clk, &pll2_pfd_400M,
1847 &pll2_pfd_352M, NULL, NULL, NULL);
1849 reg |= (mux << MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_OFFSET);
1851 __raw_writel(reg, MXC_CCM_CBCMR);
1856 static unsigned long _clk_vpu_axi_get_rate(struct clk *clk)
1860 reg = __raw_readl(MXC_CCM_CSCDR1);
1861 div = ((reg & MXC_CCM_CSCDR1_VPU_AXI_PODF_MASK) >>
1862 MXC_CCM_CSCDR1_VPU_AXI_PODF_OFFSET) + 1;
1864 return clk_get_rate(clk->parent) / div;
1867 static int _clk_vpu_axi_set_rate(struct clk *clk, unsigned long rate)
1870 u32 parent_rate = clk_get_rate(clk->parent);
1872 div = parent_rate / rate;
1875 if (((parent_rate / div) != rate) || (div > 8))
1878 reg = __raw_readl(MXC_CCM_CSCDR1);
1879 reg &= ~MXC_CCM_CSCDR1_VPU_AXI_PODF_MASK;
1880 reg |= (div - 1) << MXC_CCM_CSCDR1_VPU_AXI_PODF_OFFSET;
1881 __raw_writel(reg, MXC_CCM_CSCDR1);
1886 static unsigned long _clk_vpu_axi_round_rate(struct clk *clk,
1890 u32 parent_rate = clk_get_rate(clk->parent);
1892 div = parent_rate / rate;
1894 /* Make sure rate is not greater than the maximum value for the clock.
1895 * Also prevent a div of 0.
1903 return parent_rate / div;
1906 static struct clk vpu_clk[] = {
1908 __INIT_CLK_DEBUG(vpu_clk)
1910 .enable_reg = MXC_CCM_CCGR6,
1911 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
1912 .enable = _clk_enable,
1913 .disable = _clk_disable,
1914 .set_parent = _clk_vpu_axi_set_parent,
1915 .round_rate = _clk_vpu_axi_round_rate,
1916 .set_rate = _clk_vpu_axi_set_rate,
1917 .get_rate = _clk_vpu_axi_get_rate,
1918 .secondary = &vpu_clk[1],
1921 .parent = &mmdc_ch0_axi_clk[0],
1922 .secondary = &vpu_clk[2],
1925 .parent = &mx6fast1_clk,
1926 .secondary = &ocram_clk,
1931 static int _clk_ipu1_set_parent(struct clk *clk, struct clk *parent)
1934 u32 reg = __raw_readl(MXC_CCM_CSCDR3)
1935 & ~MXC_CCM_CSCDR3_IPU1_HSP_CLK_SEL_MASK;
1937 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
1938 &pll2_pfd_400M, &pll3_120M, &pll3_pfd_540M, NULL, NULL);
1940 reg |= (mux << MXC_CCM_CSCDR3_IPU1_HSP_CLK_SEL_OFFSET);
1942 __raw_writel(reg, MXC_CCM_CSCDR3);
1947 static unsigned long _clk_ipu1_get_rate(struct clk *clk)
1951 reg = __raw_readl(MXC_CCM_CSCDR3);
1952 div = ((reg & MXC_CCM_CSCDR3_IPU1_HSP_PODF_MASK) >>
1953 MXC_CCM_CSCDR3_IPU1_HSP_PODF_OFFSET) + 1;
1955 return clk_get_rate(clk->parent) / div;
1958 static int _clk_ipu1_set_rate(struct clk *clk, unsigned long rate)
1961 u32 parent_rate = clk_get_rate(clk->parent);
1963 div = parent_rate / rate;
1966 if (((parent_rate / div) != rate) || (div > 8))
1969 reg = __raw_readl(MXC_CCM_CSCDR3);
1970 reg &= ~MXC_CCM_CSCDR3_IPU1_HSP_PODF_MASK;
1971 reg |= (div - 1) << MXC_CCM_CSCDR3_IPU1_HSP_PODF_OFFSET;
1972 __raw_writel(reg, MXC_CCM_CSCDR3);
1977 static unsigned long _clk_ipu_round_rate(struct clk *clk,
1981 u32 parent_rate = clk_get_rate(clk->parent);
1983 div = parent_rate / rate;
1985 /* Make sure rate is not greater than the maximum value for the clock.
1986 * Also prevent a div of 0.
1994 return parent_rate / div;
1997 static struct clk ipu1_clk = {
1998 __INIT_CLK_DEBUG(ipu1_clk)
1999 .parent = &mmdc_ch0_axi_clk[0],
2000 .secondary = &mmdc_ch0_axi_clk[0],
2001 .enable_reg = MXC_CCM_CCGR3,
2002 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
2003 .enable = _clk_enable,
2004 .disable = _clk_disable,
2005 .set_parent = _clk_ipu1_set_parent,
2006 .round_rate = _clk_ipu_round_rate,
2007 .set_rate = _clk_ipu1_set_rate,
2008 .get_rate = _clk_ipu1_get_rate,
2009 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2012 static int _clk_cko1_clk0_set_parent(struct clk *clk, struct clk *parent)
2016 if (parent == &pll3_sw_clk)
2018 else if (parent == &pll2_528_bus_main_clk)
2020 else if (parent == &pll1_sys_main_clk)
2022 else if (parent == &pll5_video_main_clk)
2024 else if (parent == &axi_clk)
2026 else if (parent == &enfc_clk)
2028 else if (parent == &ipu1_di_clk_root)
2030 else if (parent == &ipu1_di_clk_root)
2032 else if (parent == &ipu2_di_clk_root)
2034 else if (parent == &ipu2_di_clk_root)
2036 else if (parent == &ahb_clk)
2038 else if (parent == &ipg_clk)
2040 else if (parent == &ipg_perclk)
2042 else if (parent == &ckil_clk)
2044 else if (parent == &pll4_audio_main_clk)
2049 reg = __raw_readl(MXC_CCM_CCOSR);
2050 reg &= ~MXC_CCM_CCOSR_CKOL_SEL_MASK;
2051 reg |= sel << MXC_CCM_CCOSR_CKOL_SEL_OFFSET;
2052 __raw_writel(reg, MXC_CCM_CCOSR);
2056 static unsigned long _clk_cko1_round_rate(struct clk *clk,
2060 u32 parent_rate = clk_get_rate(clk->parent);
2062 div = parent_rate / rate;
2064 /* Make sure rate is not greater than the maximum value for the clock.
2065 * Also prevent a div of 0.
2073 return parent_rate / div;
2076 static int _clk_cko1_set_rate(struct clk *clk, unsigned long rate)
2079 u32 parent_rate = clk_get_rate(clk->parent);
2081 div = parent_rate / rate;
2084 if (((parent_rate / div) != rate) || (div > 8))
2087 reg = __raw_readl(MXC_CCM_CCOSR);
2088 reg &= ~MXC_CCM_CCOSR_CKOL_DIV_MASK;
2089 reg |= div << MXC_CCM_CCOSR_CKOL_DIV_OFFSET;
2090 __raw_writel(reg, MXC_CCM_CCOSR);
2095 static unsigned long _clk_cko1_get_rate(struct clk *clk)
2099 reg = __raw_readl(MXC_CCM_CCOSR);
2100 div = ((reg & MXC_CCM_CCOSR_CKOL_DIV_MASK) >>
2101 MXC_CCM_CCOSR_CKOL_DIV_OFFSET) + 1;
2103 return clk_get_rate(clk->parent) / div;
2106 static int cko1_clk_enable(struct clk *clk)
2109 reg = __raw_readl(clk->enable_reg);
2110 reg |= clk->enable_shift;
2111 __raw_writel(reg, clk->enable_reg);
2116 static struct clk cko1_clk0 = {
2117 __INIT_CLK_DEBUG(cko1_clk0)
2119 .enable_reg = MXC_CCM_CCOSR,
2120 .enable_shift = MXC_CCM_CCOSR_CKOL_EN,
2121 .enable = cko1_clk_enable,
2122 .disable = _clk_disable,
2123 .set_parent = _clk_cko1_clk0_set_parent,
2124 .round_rate = _clk_cko1_round_rate,
2125 .set_rate = _clk_cko1_set_rate,
2126 .get_rate = _clk_cko1_get_rate,
2129 static int _clk_ipu2_set_parent(struct clk *clk, struct clk *parent)
2132 u32 reg = __raw_readl(MXC_CCM_CSCDR3)
2133 & ~MXC_CCM_CSCDR3_IPU2_HSP_CLK_SEL_MASK;
2135 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2136 &pll2_pfd_400M, &pll3_120M, &pll3_pfd_540M, NULL, NULL);
2138 reg |= (mux << MXC_CCM_CSCDR3_IPU2_HSP_CLK_SEL_OFFSET);
2140 __raw_writel(reg, MXC_CCM_CSCDR3);
2145 static unsigned long _clk_ipu2_get_rate(struct clk *clk)
2149 reg = __raw_readl(MXC_CCM_CSCDR3);
2150 div = ((reg & MXC_CCM_CSCDR3_IPU2_HSP_PODF_MASK) >>
2151 MXC_CCM_CSCDR3_IPU2_HSP_PODF_OFFSET) + 1;
2153 return clk_get_rate(clk->parent) / div;
2156 static int _clk_ipu2_set_rate(struct clk *clk, unsigned long rate)
2159 u32 parent_rate = clk_get_rate(clk->parent);
2161 div = parent_rate / rate;
2164 if (((parent_rate / div) != rate) || (div > 8))
2167 reg = __raw_readl(MXC_CCM_CSCDR3);
2168 reg &= ~MXC_CCM_CSCDR3_IPU2_HSP_PODF_MASK;
2169 reg |= (div - 1) << MXC_CCM_CSCDR3_IPU2_HSP_PODF_OFFSET;
2170 __raw_writel(reg, MXC_CCM_CSCDR3);
2175 static struct clk ipu2_clk = {
2176 __INIT_CLK_DEBUG(ipu2_clk)
2177 .parent = &mmdc_ch0_axi_clk[0],
2178 .secondary = &mmdc_ch0_axi_clk[0],
2179 .enable_reg = MXC_CCM_CCGR3,
2180 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
2181 .enable = _clk_enable,
2182 .disable = _clk_disable,
2183 .set_parent = _clk_ipu2_set_parent,
2184 .round_rate = _clk_ipu_round_rate,
2185 .set_rate = _clk_ipu2_set_rate,
2186 .get_rate = _clk_ipu2_get_rate,
2187 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2190 static struct clk usdhc_dep_clk = {
2191 .parent = &mmdc_ch0_axi_clk[0],
2192 .secondary = &mx6per1_clk,
2193 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2196 static unsigned long _clk_usdhc_round_rate(struct clk *clk,
2200 u32 parent_rate = clk_get_rate(clk->parent);
2202 div = parent_rate / rate;
2204 /* Make sure rate is not greater than the maximum value for the clock.
2205 * Also prevent a div of 0.
2213 return parent_rate / div;
2216 static int _clk_usdhc1_set_parent(struct clk *clk, struct clk *parent)
2218 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC1_CLK_SEL;
2220 if (parent == &pll2_pfd_352M)
2221 reg |= (MXC_CCM_CSCMR1_USDHC1_CLK_SEL);
2223 __raw_writel(reg, MXC_CCM_CSCMR1);
2228 static unsigned long _clk_usdhc1_get_rate(struct clk *clk)
2232 reg = __raw_readl(MXC_CCM_CSCDR1);
2233 div = ((reg & MXC_CCM_CSCDR1_USDHC1_PODF_MASK) >>
2234 MXC_CCM_CSCDR1_USDHC1_PODF_OFFSET) + 1;
2236 return clk_get_rate(clk->parent) / div;
2239 static int _clk_usdhc1_set_rate(struct clk *clk, unsigned long rate)
2242 u32 parent_rate = clk_get_rate(clk->parent);
2244 div = parent_rate / rate;
2247 if (((parent_rate / div) != rate) || (div > 8))
2250 reg = __raw_readl(MXC_CCM_CSCDR1);
2251 reg &= ~MXC_CCM_CSCDR1_USDHC1_PODF_MASK;
2252 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC1_PODF_OFFSET;
2253 __raw_writel(reg, MXC_CCM_CSCDR1);
2258 static struct clk usdhc1_clk = {
2259 __INIT_CLK_DEBUG(usdhc1_clk)
2261 .parent = &pll2_pfd_400M,
2262 .secondary = &usdhc_dep_clk,
2263 .enable_reg = MXC_CCM_CCGR6,
2264 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
2265 .enable = _clk_enable,
2266 .disable = _clk_disable,
2267 .set_parent = _clk_usdhc1_set_parent,
2268 .round_rate = _clk_usdhc_round_rate,
2269 .set_rate = _clk_usdhc1_set_rate,
2270 .get_rate = _clk_usdhc1_get_rate,
2271 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2274 static int _clk_usdhc2_set_parent(struct clk *clk, struct clk *parent)
2276 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC2_CLK_SEL;
2278 if (parent == &pll2_pfd_352M)
2279 reg |= (MXC_CCM_CSCMR1_USDHC2_CLK_SEL);
2281 __raw_writel(reg, MXC_CCM_CSCMR1);
2286 static unsigned long _clk_usdhc2_get_rate(struct clk *clk)
2290 reg = __raw_readl(MXC_CCM_CSCDR1);
2291 div = ((reg & MXC_CCM_CSCDR1_USDHC2_PODF_MASK) >>
2292 MXC_CCM_CSCDR1_USDHC2_PODF_OFFSET) + 1;
2294 return clk_get_rate(clk->parent) / div;
2297 static int _clk_usdhc2_set_rate(struct clk *clk, unsigned long rate)
2300 u32 parent_rate = clk_get_rate(clk->parent);
2302 div = parent_rate / rate;
2305 if (((parent_rate / div) != rate) || (div > 8))
2308 reg = __raw_readl(MXC_CCM_CSCDR1);
2309 reg &= ~MXC_CCM_CSCDR1_USDHC2_PODF_MASK;
2310 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC2_PODF_OFFSET;
2311 __raw_writel(reg, MXC_CCM_CSCDR1);
2316 static struct clk usdhc2_clk = {
2317 __INIT_CLK_DEBUG(usdhc2_clk)
2319 .parent = &pll2_pfd_400M,
2320 .secondary = &usdhc_dep_clk,
2321 .enable_reg = MXC_CCM_CCGR6,
2322 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
2323 .enable = _clk_enable,
2324 .disable = _clk_disable,
2325 .set_parent = _clk_usdhc2_set_parent,
2326 .round_rate = _clk_usdhc_round_rate,
2327 .set_rate = _clk_usdhc2_set_rate,
2328 .get_rate = _clk_usdhc2_get_rate,
2329 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2332 static int _clk_usdhc3_set_parent(struct clk *clk, struct clk *parent)
2334 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC3_CLK_SEL;
2336 if (parent == &pll2_pfd_352M)
2337 reg |= (MXC_CCM_CSCMR1_USDHC3_CLK_SEL);
2339 __raw_writel(reg, MXC_CCM_CSCMR1);
2344 static unsigned long _clk_usdhc3_get_rate(struct clk *clk)
2348 reg = __raw_readl(MXC_CCM_CSCDR1);
2349 div = ((reg & MXC_CCM_CSCDR1_USDHC3_PODF_MASK) >>
2350 MXC_CCM_CSCDR1_USDHC3_PODF_OFFSET) + 1;
2352 return clk_get_rate(clk->parent) / div;
2355 static int _clk_usdhc3_set_rate(struct clk *clk, unsigned long rate)
2358 u32 parent_rate = clk_get_rate(clk->parent);
2360 div = parent_rate / rate;
2363 if (((parent_rate / div) != rate) || (div > 8))
2366 reg = __raw_readl(MXC_CCM_CSCDR1);
2367 reg &= ~MXC_CCM_CSCDR1_USDHC3_PODF_MASK;
2368 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC3_PODF_OFFSET;
2369 __raw_writel(reg, MXC_CCM_CSCDR1);
2375 static struct clk usdhc3_clk = {
2376 __INIT_CLK_DEBUG(usdhc3_clk)
2378 .parent = &pll2_pfd_400M,
2379 .secondary = &usdhc_dep_clk,
2380 .enable_reg = MXC_CCM_CCGR6,
2381 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
2382 .enable = _clk_enable,
2383 .disable = _clk_disable,
2384 .set_parent = _clk_usdhc3_set_parent,
2385 .round_rate = _clk_usdhc_round_rate,
2386 .set_rate = _clk_usdhc3_set_rate,
2387 .get_rate = _clk_usdhc3_get_rate,
2388 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2391 static int _clk_usdhc4_set_parent(struct clk *clk, struct clk *parent)
2393 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_USDHC4_CLK_SEL;
2395 if (parent == &pll2_pfd_352M)
2396 reg |= (MXC_CCM_CSCMR1_USDHC4_CLK_SEL);
2398 __raw_writel(reg, MXC_CCM_CSCMR1);
2403 static unsigned long _clk_usdhc4_get_rate(struct clk *clk)
2407 reg = __raw_readl(MXC_CCM_CSCDR1);
2408 div = ((reg & MXC_CCM_CSCDR1_USDHC4_PODF_MASK) >>
2409 MXC_CCM_CSCDR1_USDHC4_PODF_OFFSET) + 1;
2411 return clk_get_rate(clk->parent) / div;
2414 static int _clk_usdhc4_set_rate(struct clk *clk, unsigned long rate)
2417 u32 parent_rate = clk_get_rate(clk->parent);
2419 div = parent_rate / rate;
2422 if (((parent_rate / div) != rate) || (div > 8))
2425 reg = __raw_readl(MXC_CCM_CSCDR1);
2426 reg &= ~MXC_CCM_CSCDR1_USDHC4_PODF_MASK;
2427 reg |= (div - 1) << MXC_CCM_CSCDR1_USDHC4_PODF_OFFSET;
2428 __raw_writel(reg, MXC_CCM_CSCDR1);
2434 static struct clk usdhc4_clk = {
2435 __INIT_CLK_DEBUG(usdhc4_clk)
2437 .parent = &pll2_pfd_400M,
2438 .secondary = &usdhc_dep_clk,
2439 .enable_reg = MXC_CCM_CCGR6,
2440 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
2441 .enable = _clk_enable,
2442 .disable = _clk_disable,
2443 .set_parent = _clk_usdhc4_set_parent,
2444 .round_rate = _clk_usdhc_round_rate,
2445 .set_rate = _clk_usdhc4_set_rate,
2446 .get_rate = _clk_usdhc4_get_rate,
2447 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2450 static unsigned long _clk_ssi_round_rate(struct clk *clk,
2454 u32 parent_rate = clk_get_rate(clk->parent);
2455 u32 div = parent_rate / rate;
2457 if (parent_rate % rate)
2460 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2462 return parent_rate / (pre * post);
2465 static unsigned long _clk_ssi1_get_rate(struct clk *clk)
2467 u32 reg, prediv, podf;
2469 reg = __raw_readl(MXC_CCM_CS1CDR);
2471 prediv = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK)
2472 >> MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET) + 1;
2473 podf = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK)
2474 >> MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET) + 1;
2476 return clk_get_rate(clk->parent) / (prediv * podf);
2479 static int _clk_ssi1_set_rate(struct clk *clk, unsigned long rate)
2481 u32 reg, div, pre, post;
2482 u32 parent_rate = clk_get_rate(clk->parent);
2484 div = parent_rate / rate;
2487 if (((parent_rate / div) != rate) || div > 512)
2490 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2492 reg = __raw_readl(MXC_CCM_CS1CDR);
2493 reg &= ~(MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK |
2494 MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK);
2495 reg |= (post - 1) << MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET;
2496 reg |= (pre - 1) << MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET;
2498 __raw_writel(reg, MXC_CCM_CS1CDR);
2504 static int _clk_ssi1_set_parent(struct clk *clk, struct clk *parent)
2508 reg = __raw_readl(MXC_CCM_CSCMR1)
2509 & ~MXC_CCM_CSCMR1_SSI1_CLK_SEL_MASK;
2511 mux = _get_mux6(parent, &pll3_pfd_508M, &pll3_pfd_454M,
2512 &pll4_audio_main_clk, NULL, NULL, NULL);
2513 reg |= (mux << MXC_CCM_CSCMR1_SSI1_CLK_SEL_OFFSET);
2515 __raw_writel(reg, MXC_CCM_CSCMR1);
2520 static struct clk ssi1_clk = {
2521 __INIT_CLK_DEBUG(ssi1_clk)
2522 .parent = &pll3_pfd_508M,
2523 .enable_reg = MXC_CCM_CCGR5,
2524 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
2525 .enable = _clk_enable,
2526 .disable = _clk_disable,
2527 .set_parent = _clk_ssi1_set_parent,
2528 .set_rate = _clk_ssi1_set_rate,
2529 .round_rate = _clk_ssi_round_rate,
2530 .get_rate = _clk_ssi1_get_rate,
2531 #ifdef CONFIG_SND_MXC_SOC_IRAM
2532 .secondary = &ocram_clk,
2534 .secondary = &mmdc_ch0_axi_clk[0],
2538 static unsigned long _clk_ssi2_get_rate(struct clk *clk)
2540 u32 reg, prediv, podf;
2542 reg = __raw_readl(MXC_CCM_CS2CDR);
2544 prediv = ((reg & MXC_CCM_CS2CDR_SSI2_CLK_PRED_MASK)
2545 >> MXC_CCM_CS2CDR_SSI2_CLK_PRED_OFFSET) + 1;
2546 podf = ((reg & MXC_CCM_CS2CDR_SSI2_CLK_PODF_MASK)
2547 >> MXC_CCM_CS2CDR_SSI2_CLK_PODF_OFFSET) + 1;
2549 return clk_get_rate(clk->parent) / (prediv * podf);
2552 static int _clk_ssi2_set_rate(struct clk *clk, unsigned long rate)
2554 u32 reg, div, pre, post;
2555 u32 parent_rate = clk_get_rate(clk->parent);
2557 div = parent_rate / rate;
2560 if (((parent_rate / div) != rate) || div > 512)
2563 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2565 reg = __raw_readl(MXC_CCM_CS2CDR);
2566 reg &= ~(MXC_CCM_CS2CDR_SSI2_CLK_PRED_MASK |
2567 MXC_CCM_CS2CDR_SSI2_CLK_PODF_MASK);
2568 reg |= (post - 1) << MXC_CCM_CS2CDR_SSI2_CLK_PODF_OFFSET;
2569 reg |= (pre - 1) << MXC_CCM_CS2CDR_SSI2_CLK_PRED_OFFSET;
2571 __raw_writel(reg, MXC_CCM_CS2CDR);
2577 static int _clk_ssi2_set_parent(struct clk *clk, struct clk *parent)
2581 reg = __raw_readl(MXC_CCM_CSCMR1)
2582 & ~MXC_CCM_CSCMR1_SSI2_CLK_SEL_MASK;
2584 mux = _get_mux6(parent, &pll3_pfd_508M, &pll3_pfd_454M,
2585 &pll4_audio_main_clk, NULL, NULL, NULL);
2586 reg |= (mux << MXC_CCM_CSCMR1_SSI2_CLK_SEL_OFFSET);
2588 __raw_writel(reg, MXC_CCM_CSCMR1);
2593 static struct clk ssi2_clk = {
2594 __INIT_CLK_DEBUG(ssi2_clk)
2595 .parent = &pll3_pfd_508M,
2596 .enable_reg = MXC_CCM_CCGR5,
2597 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
2598 .enable = _clk_enable,
2599 .disable = _clk_disable,
2600 .set_parent = _clk_ssi2_set_parent,
2601 .set_rate = _clk_ssi2_set_rate,
2602 .round_rate = _clk_ssi_round_rate,
2603 .get_rate = _clk_ssi2_get_rate,
2604 #ifdef CONFIG_SND_MXC_SOC_IRAM
2605 .secondary = &ocram_clk,
2607 .secondary = &mmdc_ch0_axi_clk[0],
2611 static unsigned long _clk_ssi3_get_rate(struct clk *clk)
2613 u32 reg, prediv, podf;
2615 reg = __raw_readl(MXC_CCM_CS1CDR);
2617 prediv = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK)
2618 >> MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET) + 1;
2619 podf = ((reg & MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK)
2620 >> MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET) + 1;
2622 return clk_get_rate(clk->parent) / (prediv * podf);
2625 static int _clk_ssi3_set_rate(struct clk *clk, unsigned long rate)
2627 u32 reg, div, pre, post;
2628 u32 parent_rate = clk_get_rate(clk->parent);
2630 div = parent_rate / rate;
2633 if (((parent_rate / div) != rate) || div > 512)
2636 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
2638 reg = __raw_readl(MXC_CCM_CS1CDR);
2639 reg &= ~(MXC_CCM_CS1CDR_SSI3_CLK_PODF_MASK|
2640 MXC_CCM_CS1CDR_SSI3_CLK_PRED_MASK);
2641 reg |= (post - 1) << MXC_CCM_CS1CDR_SSI3_CLK_PODF_OFFSET;
2642 reg |= (pre - 1) << MXC_CCM_CS1CDR_SSI3_CLK_PRED_OFFSET;
2644 __raw_writel(reg, MXC_CCM_CS1CDR);
2650 static int _clk_ssi3_set_parent(struct clk *clk, struct clk *parent)
2654 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_SSI3_CLK_SEL_MASK;
2656 mux = _get_mux6(parent, &pll3_pfd_508M, &pll3_pfd_454M,
2657 &pll4_audio_main_clk, NULL, NULL, NULL);
2658 reg |= (mux << MXC_CCM_CSCMR1_SSI3_CLK_SEL_OFFSET);
2660 __raw_writel(reg, MXC_CCM_CSCMR1);
2665 static struct clk ssi3_clk = {
2666 __INIT_CLK_DEBUG(ssi3_clk)
2667 .parent = &pll3_pfd_508M,
2668 .enable_reg = MXC_CCM_CCGR5,
2669 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
2670 .enable = _clk_enable,
2671 .disable = _clk_disable,
2672 .set_parent = _clk_ssi3_set_parent,
2673 .set_rate = _clk_ssi3_set_rate,
2674 .round_rate = _clk_ssi_round_rate,
2675 .get_rate = _clk_ssi3_get_rate,
2676 #ifdef CONFIG_SND_MXC_SOC_IRAM
2677 .secondary = &ocram_clk,
2679 .secondary = &mmdc_ch0_axi_clk[0],
2683 static unsigned long _clk_ldb_di_round_rate(struct clk *clk,
2686 u32 parent_rate = clk_get_rate(clk->parent);
2688 if (rate * 7 <= parent_rate + parent_rate/20)
2689 return parent_rate / 7;
2691 return 2 * parent_rate / 7;
2694 static unsigned long _clk_ldb_di0_get_rate(struct clk *clk)
2698 div = __raw_readl(MXC_CCM_CSCMR2) &
2699 MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
2702 return clk_get_rate(clk->parent) / 7;
2704 return (2 * clk_get_rate(clk->parent)) / 7;
2707 static int _clk_ldb_di0_set_rate(struct clk *clk, unsigned long rate)
2710 u32 parent_rate = clk_get_rate(clk->parent);
2712 if (rate * 7 <= parent_rate + parent_rate/20) {
2714 rate = parent_rate / 7;
2716 rate = 2 * parent_rate / 7;
2718 reg = __raw_readl(MXC_CCM_CSCMR2);
2720 reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
2722 reg &= ~MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
2724 __raw_writel(reg, MXC_CCM_CSCMR2);
2729 static int _clk_ldb_di0_set_parent(struct clk *clk, struct clk *parent)
2733 reg = __raw_readl(MXC_CCM_CS2CDR)
2734 & ~MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK;
2736 mux = _get_mux6(parent, &pll5_video_main_clk,
2737 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M,
2738 &pll3_usb_otg_main_clk, NULL);
2739 reg |= (mux << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET);
2741 __raw_writel(reg, MXC_CCM_CS2CDR);
2746 static struct clk ldb_di0_clk = {
2747 __INIT_CLK_DEBUG(ldb_di0_clk)
2749 .parent = &pll3_pfd_540M,
2750 .enable_reg = MXC_CCM_CCGR3,
2751 .enable_shift = MXC_CCM_CCGRx_CG6_OFFSET,
2752 .enable = _clk_enable,
2753 .disable = _clk_disable,
2754 .set_parent = _clk_ldb_di0_set_parent,
2755 .set_rate = _clk_ldb_di0_set_rate,
2756 .round_rate = _clk_ldb_di_round_rate,
2757 .get_rate = _clk_ldb_di0_get_rate,
2758 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2761 static unsigned long _clk_ldb_di1_get_rate(struct clk *clk)
2765 div = __raw_readl(MXC_CCM_CSCMR2) &
2766 MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
2769 return clk_get_rate(clk->parent) / 7;
2771 return (2 * clk_get_rate(clk->parent)) / 7;
2774 static int _clk_ldb_di1_set_rate(struct clk *clk, unsigned long rate)
2777 u32 parent_rate = clk_get_rate(clk->parent);
2779 if (rate * 7 <= parent_rate + parent_rate/20) {
2781 rate = parent_rate / 7;
2783 rate = 2 * parent_rate / 7;
2785 reg = __raw_readl(MXC_CCM_CSCMR2);
2787 reg |= MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
2789 reg &= ~MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
2791 __raw_writel(reg, MXC_CCM_CSCMR2);
2796 static int _clk_ldb_di1_set_parent(struct clk *clk, struct clk *parent)
2800 reg = __raw_readl(MXC_CCM_CS2CDR)
2801 & ~MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK;
2803 mux = _get_mux6(parent, &pll5_video_main_clk,
2804 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M,
2805 &pll3_usb_otg_main_clk, NULL);
2806 reg |= (mux << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
2808 __raw_writel(reg, MXC_CCM_CS2CDR);
2813 static struct clk ldb_di1_clk = {
2814 __INIT_CLK_DEBUG(ldb_di1_clk)
2816 .parent = &pll3_pfd_540M,
2817 .enable_reg = MXC_CCM_CCGR3,
2818 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
2819 .enable = _clk_enable,
2820 .disable = _clk_disable,
2821 .set_parent = _clk_ldb_di1_set_parent,
2822 .set_rate = _clk_ldb_di1_set_rate,
2823 .round_rate = _clk_ldb_di_round_rate,
2824 .get_rate = _clk_ldb_di1_get_rate,
2825 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
2829 static unsigned long _clk_ipu_di_round_rate(struct clk *clk,
2833 u32 parent_rate = clk_get_rate(clk->parent);
2835 if ((clk->parent == &ldb_di0_clk) ||
2836 (clk->parent == &ldb_di1_clk))
2839 div = parent_rate / rate;
2840 /* Round to closest divisor */
2841 if ((parent_rate % rate) > (rate / 2))
2844 /* Make sure rate is not greater than the maximum value for the clock.
2845 * Also prevent a div of 0.
2853 return parent_rate / div;
2856 static unsigned long _clk_ipu1_di0_get_rate(struct clk *clk)
2860 if ((clk->parent == &ldb_di0_clk) ||
2861 (clk->parent == &ldb_di1_clk))
2862 return clk_get_rate(clk->parent);
2864 reg = __raw_readl(MXC_CCM_CHSCCDR);
2866 div = ((reg & MXC_CCM_CHSCCDR_IPU1_DI0_PODF_MASK) >>
2867 MXC_CCM_CHSCCDR_IPU1_DI0_PODF_OFFSET) + 1;
2869 return clk_get_rate(clk->parent) / div;
2872 static int _clk_ipu1_di0_set_rate(struct clk *clk, unsigned long rate)
2875 u32 parent_rate = clk_get_rate(clk->parent);
2877 if ((clk->parent == &ldb_di0_clk) ||
2878 (clk->parent == &ldb_di1_clk)) {
2879 if (parent_rate == rate)
2885 div = parent_rate / rate;
2888 if (((parent_rate / div) != rate) || (div > 8))
2891 reg = __raw_readl(MXC_CCM_CHSCCDR);
2892 reg &= ~MXC_CCM_CHSCCDR_IPU1_DI0_PODF_MASK;
2893 reg |= (div - 1) << MXC_CCM_CHSCCDR_IPU1_DI0_PODF_OFFSET;
2894 __raw_writel(reg, MXC_CCM_CHSCCDR);
2900 static int _clk_ipu1_di0_set_parent(struct clk *clk, struct clk *parent)
2904 if (parent == &ldb_di0_clk)
2906 else if (parent == &ldb_di1_clk)
2909 reg = __raw_readl(MXC_CCM_CHSCCDR)
2910 & ~MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_MASK;
2912 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2913 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
2914 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
2915 reg |= (mux << MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_OFFSET);
2917 __raw_writel(reg, MXC_CCM_CHSCCDR);
2919 /* Derive clock from divided pre-muxed ipu1_di0 clock.*/
2923 reg = __raw_readl(MXC_CCM_CHSCCDR)
2924 & ~MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_MASK;
2925 __raw_writel(reg | (mux << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET),
2931 static unsigned long _clk_ipu1_di1_get_rate(struct clk *clk)
2935 if ((clk->parent == &ldb_di0_clk) ||
2936 (clk->parent == &ldb_di1_clk))
2937 return clk_get_rate(clk->parent);
2939 reg = __raw_readl(MXC_CCM_CHSCCDR);
2941 div = ((reg & MXC_CCM_CHSCCDR_IPU1_DI1_PODF_MASK)
2942 >> MXC_CCM_CHSCCDR_IPU1_DI1_PODF_OFFSET) + 1;
2944 return clk_get_rate(clk->parent) / div;
2947 static int _clk_ipu1_di1_set_rate(struct clk *clk, unsigned long rate)
2950 u32 parent_rate = clk_get_rate(clk->parent);
2952 if ((clk->parent == &ldb_di0_clk) ||
2953 (clk->parent == &ldb_di1_clk)) {
2954 if (parent_rate == rate)
2960 div = parent_rate / rate;
2963 if (((parent_rate / div) != rate) || (div > 8))
2966 reg = __raw_readl(MXC_CCM_CHSCCDR);
2967 reg &= ~MXC_CCM_CHSCCDR_IPU1_DI1_PODF_MASK;
2968 reg |= (div - 1) << MXC_CCM_CHSCCDR_IPU1_DI1_PODF_OFFSET;
2969 __raw_writel(reg, MXC_CCM_CHSCCDR);
2975 static int _clk_ipu1_di1_set_parent(struct clk *clk, struct clk *parent)
2979 if (parent == &ldb_di0_clk)
2981 else if (parent == &ldb_di1_clk)
2984 reg = __raw_readl(MXC_CCM_CHSCCDR)
2985 & ~MXC_CCM_CHSCCDR_IPU1_DI1_PRE_CLK_SEL_MASK;
2987 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
2988 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
2989 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
2990 reg |= (mux << MXC_CCM_CHSCCDR_IPU1_DI1_PRE_CLK_SEL_OFFSET);
2992 __raw_writel(reg, MXC_CCM_CHSCCDR);
2994 /* Derive clock from divided pre-muxed ipu1_di0 clock.*/
2997 reg = __raw_readl(MXC_CCM_CHSCCDR)
2998 & ~MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_MASK;
2999 __raw_writel(reg | (mux << MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET),
3005 static struct clk ipu1_di_clk[] = {
3007 __INIT_CLK_DEBUG(ipu1_di_clk_0)
3009 .parent = &pll5_video_main_clk,
3010 .enable_reg = MXC_CCM_CCGR3,
3011 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
3012 .enable = _clk_enable,
3013 .disable = _clk_disable,
3014 .set_parent = _clk_ipu1_di0_set_parent,
3015 .set_rate = _clk_ipu1_di0_set_rate,
3016 .round_rate = _clk_ipu_di_round_rate,
3017 .get_rate = _clk_ipu1_di0_get_rate,
3018 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3021 __INIT_CLK_DEBUG(ipu1_di_clk_1)
3023 .parent = &pll5_video_main_clk,
3024 .enable_reg = MXC_CCM_CCGR3,
3025 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
3026 .enable = _clk_enable,
3027 .disable = _clk_disable,
3028 .set_parent = _clk_ipu1_di1_set_parent,
3029 .set_rate = _clk_ipu1_di1_set_rate,
3030 .round_rate = _clk_ipu_di_round_rate,
3031 .get_rate = _clk_ipu1_di1_get_rate,
3032 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3036 static unsigned long _clk_ipu2_di0_get_rate(struct clk *clk)
3040 if ((clk->parent == &ldb_di0_clk) ||
3041 (clk->parent == &ldb_di1_clk))
3042 return clk_get_rate(clk->parent);
3044 reg = __raw_readl(MXC_CCM_CSCDR2);
3046 div = ((reg & MXC_CCM_CSCDR2_IPU2_DI0_PODF_MASK) >>
3047 MXC_CCM_CSCDR2_IPU2_DI0_PODF_OFFSET) + 1;
3049 return clk_get_rate(clk->parent) / div;
3052 static int _clk_ipu2_di0_set_rate(struct clk *clk, unsigned long rate)
3055 u32 parent_rate = clk_get_rate(clk->parent);
3057 if ((clk->parent == &ldb_di0_clk) ||
3058 (clk->parent == &ldb_di1_clk)) {
3059 if (parent_rate == rate)
3065 div = parent_rate / rate;
3068 if (((parent_rate / div) != rate) || (div > 8))
3071 reg = __raw_readl(MXC_CCM_CSCDR2);
3072 reg &= ~MXC_CCM_CSCDR2_IPU2_DI0_PODF_MASK;
3073 reg |= (div - 1) << MXC_CCM_CSCDR2_IPU2_DI0_PODF_OFFSET;
3074 __raw_writel(reg, MXC_CCM_CSCDR2);
3079 static int _clk_ipu2_di0_set_parent(struct clk *clk, struct clk *parent)
3083 if (parent == &ldb_di0_clk)
3085 else if (parent == &ldb_di1_clk)
3088 reg = __raw_readl(MXC_CCM_CSCDR2)
3089 & ~MXC_CCM_CSCDR2_IPU2_DI0_PRE_CLK_SEL_MASK;
3091 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
3092 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
3093 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
3094 reg |= (mux << MXC_CCM_CSCDR2_IPU2_DI0_PRE_CLK_SEL_OFFSET);
3096 __raw_writel(reg, MXC_CCM_CSCDR2);
3098 /* Derive clock from divided pre-muxed ipu2_di0 clock.*/
3101 reg = __raw_readl(MXC_CCM_CSCDR2)
3102 & ~MXC_CCM_CSCDR2_IPU2_DI0_CLK_SEL_MASK;
3103 __raw_writel(reg | (mux << MXC_CCM_CSCDR2_IPU2_DI0_CLK_SEL_OFFSET),
3109 static unsigned long _clk_ipu2_di1_get_rate(struct clk *clk)
3113 if ((clk->parent == &ldb_di0_clk) ||
3114 (clk->parent == &ldb_di1_clk))
3115 return clk_get_rate(clk->parent);
3117 reg = __raw_readl(MXC_CCM_CSCDR2);
3119 div = ((reg & MXC_CCM_CSCDR2_IPU2_DI1_PODF_MASK)
3120 >> MXC_CCM_CSCDR2_IPU2_DI1_PODF_OFFSET) + 1;
3122 return clk_get_rate(clk->parent) / div;
3125 static int _clk_ipu2_di1_set_rate(struct clk *clk, unsigned long rate)
3128 u32 parent_rate = clk_get_rate(clk->parent);
3130 if ((clk->parent == &ldb_di0_clk) ||
3131 (clk->parent == &ldb_di1_clk)) {
3132 if (parent_rate == rate)
3138 div = parent_rate / rate;
3141 if (((parent_rate / div) != rate) || (div > 8))
3144 reg = __raw_readl(MXC_CCM_CSCDR2);
3145 reg &= ~MXC_CCM_CSCDR2_IPU2_DI1_PODF_MASK;
3146 reg |= (div - 1) << MXC_CCM_CSCDR2_IPU2_DI1_PODF_OFFSET;
3147 __raw_writel(reg, MXC_CCM_CSCDR2);
3152 static int _clk_ipu2_di1_set_parent(struct clk *clk, struct clk *parent)
3156 if (parent == &ldb_di0_clk)
3158 else if (parent == &ldb_di1_clk)
3161 reg = __raw_readl(MXC_CCM_CSCDR2)
3162 & ~MXC_CCM_CSCDR2_IPU2_DI1_PRE_CLK_SEL_MASK;
3164 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
3165 &pll3_usb_otg_main_clk, &pll5_video_main_clk,
3166 &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
3167 reg |= (mux << MXC_CCM_CSCDR2_IPU2_DI1_PRE_CLK_SEL_OFFSET);
3169 __raw_writel(reg, MXC_CCM_CSCDR2);
3171 /* Derive clock from divided pre-muxed ipu1_di0 clock.*/
3174 reg = __raw_readl(MXC_CCM_CSCDR2)
3175 & ~MXC_CCM_CSCDR2_IPU2_DI1_CLK_SEL_MASK;
3176 __raw_writel(reg | (mux << MXC_CCM_CSCDR2_IPU2_DI1_CLK_SEL_OFFSET),
3182 static struct clk ipu2_di_clk[] = {
3184 __INIT_CLK_DEBUG(ipu2_di_clk_0)
3186 .parent = &pll5_video_main_clk,
3187 .enable_reg = MXC_CCM_CCGR3,
3188 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
3189 .enable = _clk_enable,
3190 .disable = _clk_disable,
3191 .set_parent = _clk_ipu2_di0_set_parent,
3192 .set_rate = _clk_ipu2_di0_set_rate,
3193 .round_rate = _clk_ipu_di_round_rate,
3194 .get_rate = _clk_ipu2_di0_get_rate,
3195 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3198 __INIT_CLK_DEBUG(ipu2_di_clk_1)
3200 .parent = &pll5_video_main_clk,
3201 .enable_reg = MXC_CCM_CCGR3,
3202 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
3203 .enable = _clk_enable,
3204 .disable = _clk_disable,
3205 .set_parent = _clk_ipu2_di1_set_parent,
3206 .set_rate = _clk_ipu2_di1_set_rate,
3207 .round_rate = _clk_ipu_di_round_rate,
3208 .get_rate = _clk_ipu2_di1_get_rate,
3209 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3213 static unsigned long _clk_can_root_round_rate(struct clk *clk,
3217 u32 parent_rate = clk_get_rate(clk->parent);
3219 div = parent_rate / rate;
3221 /* Make sure rate is not greater than the maximum value for the clock.
3222 * Also prevent a div of 0.
3230 return parent_rate / div;
3233 static int _clk_can_root_set_rate(struct clk *clk, unsigned long rate)
3236 u32 parent_rate = clk_get_rate(clk->parent);
3238 div = parent_rate / rate;
3241 if (((parent_rate / div) != rate) || (div > 64))
3244 reg = __raw_readl(MXC_CCM_CSCMR2) & MXC_CCM_CSCMR2_CAN_CLK_PODF_MASK;
3245 reg |= ((div - 1) << MXC_CCM_CSCMR2_CAN_CLK_PODF_OFFSET);
3247 __raw_writel(reg, MXC_CCM_CSCMR2);
3252 static unsigned long _clk_can_root_get_rate(struct clk *clk)
3257 reg = __raw_readl(MXC_CCM_CSCMR2) & MXC_CCM_CSCMR2_CAN_CLK_PODF_MASK;
3258 div = (reg >> MXC_CCM_CSCMR2_CAN_CLK_PODF_OFFSET) + 1;
3259 val = clk_get_rate(clk->parent) / div;
3264 static struct clk can_clk_root = {
3265 __INIT_CLK_DEBUG(can_clk_root)
3266 .parent = &pll3_60M,
3267 .set_rate = _clk_can_root_set_rate,
3268 .get_rate = _clk_can_root_get_rate,
3269 .round_rate = _clk_can_root_round_rate,
3272 static struct clk can2_clk[] = {
3274 __INIT_CLK_DEBUG(can2_module_clk)
3276 .parent = &can_clk_root,
3277 .enable_reg = MXC_CCM_CCGR0,
3278 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
3279 .enable = _clk_enable,
3280 .disable = _clk_disable,
3281 .secondary = &can2_clk[1],
3282 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3285 __INIT_CLK_DEBUG(can2_serial_clk)
3287 .parent = &can_clk_root,
3288 .enable_reg = MXC_CCM_CCGR0,
3289 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
3290 .enable = _clk_enable,
3291 .disable = _clk_disable,
3296 static struct clk can1_clk[] = {
3298 __INIT_CLK_DEBUG(can1_module_clk)
3300 .parent = &can_clk_root,
3301 .enable_reg = MXC_CCM_CCGR0,
3302 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
3303 .enable = _clk_enable,
3304 .disable = _clk_disable,
3305 .secondary = &can1_clk[1],
3306 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3309 __INIT_CLK_DEBUG(can1_serial_clk)
3311 .parent = &can_clk_root,
3312 .enable_reg = MXC_CCM_CCGR0,
3313 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
3314 .enable = _clk_enable,
3315 .disable = _clk_disable,
3319 static unsigned long _clk_spdif_round_rate(struct clk *clk,
3323 u32 parent_rate = clk_get_rate(clk->parent);
3324 u32 div = parent_rate / rate;
3326 if (parent_rate % rate)
3329 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3331 return parent_rate / (pre * post);
3334 static int _clk_spdif0_set_parent(struct clk *clk, struct clk *parent)
3338 reg = __raw_readl(MXC_CCM_CDCDR)
3339 & ~MXC_CCM_CDCDR_SPDIF0_CLK_SEL_MASK;
3341 mux = _get_mux6(parent, &pll4_audio_main_clk,
3342 &pll3_pfd_508M, &pll3_pfd_454M,
3343 &pll3_sw_clk, NULL, NULL);
3344 reg |= mux << MXC_CCM_CDCDR_SPDIF0_CLK_SEL_OFFSET;
3346 __raw_writel(reg, MXC_CCM_CDCDR);
3351 static unsigned long _clk_spdif0_get_rate(struct clk *clk)
3353 u32 reg, pred, podf;
3355 reg = __raw_readl(MXC_CCM_CDCDR);
3357 pred = ((reg & MXC_CCM_CDCDR_SPDIF0_CLK_PRED_MASK)
3358 >> MXC_CCM_CDCDR_SPDIF0_CLK_PRED_OFFSET) + 1;
3359 podf = ((reg & MXC_CCM_CDCDR_SPDIF0_CLK_PODF_MASK)
3360 >> MXC_CCM_CDCDR_SPDIF0_CLK_PODF_OFFSET) + 1;
3362 return clk_get_rate(clk->parent) / (pred * podf);
3365 static int _clk_spdif0_set_rate(struct clk *clk, unsigned long rate)
3367 u32 reg, div, pre, post;
3368 u32 parent_rate = clk_get_rate(clk->parent);
3370 div = parent_rate / rate;
3373 if (((parent_rate / div) != rate) || div > 64)
3376 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3378 reg = __raw_readl(MXC_CCM_CDCDR);
3379 reg &= ~(MXC_CCM_CDCDR_SPDIF0_CLK_PRED_MASK|
3380 MXC_CCM_CDCDR_SPDIF0_CLK_PODF_MASK);
3381 reg |= (post - 1) << MXC_CCM_CDCDR_SPDIF0_CLK_PODF_OFFSET;
3382 reg |= (pre - 1) << MXC_CCM_CDCDR_SPDIF0_CLK_PRED_OFFSET;
3384 __raw_writel(reg, MXC_CCM_CDCDR);
3389 static struct clk spdif0_clk[] = {
3391 __INIT_CLK_DEBUG(spdif0_clk_0)
3393 .parent = &pll3_sw_clk,
3394 .enable = _clk_enable,
3395 .enable_reg = MXC_CCM_CCGR5,
3396 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
3397 .disable = _clk_disable,
3398 .secondary = &spdif0_clk[1],
3399 .set_rate = _clk_spdif0_set_rate,
3400 .get_rate = _clk_spdif0_get_rate,
3401 .set_parent = _clk_spdif0_set_parent,
3402 .round_rate = _clk_spdif_round_rate,
3403 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3406 __INIT_CLK_DEBUG(spdif0_clk_1)
3409 .secondary = &spba_clk,
3413 static unsigned long _clk_esai_round_rate(struct clk *clk,
3417 u32 parent_rate = clk_get_rate(clk->parent);
3418 u32 div = parent_rate / rate;
3420 if (parent_rate % rate)
3423 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3425 return parent_rate / (pre * post);
3428 static int _clk_esai_set_parent(struct clk *clk, struct clk *parent)
3432 reg = __raw_readl(MXC_CCM_CSCMR2) & ~MXC_CCM_CSCMR2_ESAI_CLK_SEL_MASK;
3434 mux = _get_mux6(parent, &pll4_audio_main_clk, &pll3_pfd_508M,
3435 &pll3_pfd_454M, &pll3_sw_clk, NULL, NULL);
3436 reg |= mux << MXC_CCM_CSCMR2_ESAI_CLK_SEL_OFFSET;
3438 __raw_writel(reg, MXC_CCM_CSCMR2);
3443 static unsigned long _clk_esai_get_rate(struct clk *clk)
3445 u32 reg, pred, podf;
3447 reg = __raw_readl(MXC_CCM_CS1CDR);
3449 pred = ((reg & MXC_CCM_CS1CDR_ESAI_CLK_PRED_MASK)
3450 >> MXC_CCM_CS1CDR_ESAI_CLK_PRED_OFFSET) + 1;
3451 podf = ((reg & MXC_CCM_CS1CDR_ESAI_CLK_PODF_MASK)
3452 >> MXC_CCM_CS1CDR_ESAI_CLK_PODF_OFFSET) + 1;
3454 return clk_get_rate(clk->parent) / (pred * podf);
3457 static int _clk_esai_set_rate(struct clk *clk, unsigned long rate)
3459 u32 reg, div, pre, post;
3460 u32 parent_rate = clk_get_rate(clk->parent);
3462 div = parent_rate / rate;
3465 if (((parent_rate / div) != rate) || div > 64)
3468 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
3470 reg = __raw_readl(MXC_CCM_CS1CDR);
3471 reg &= ~(MXC_CCM_CS1CDR_ESAI_CLK_PRED_MASK|
3472 MXC_CCM_CS1CDR_ESAI_CLK_PODF_MASK);
3473 reg |= (post - 1) << MXC_CCM_CS1CDR_ESAI_CLK_PODF_OFFSET;
3474 reg |= (pre - 1) << MXC_CCM_CS1CDR_ESAI_CLK_PRED_OFFSET;
3476 __raw_writel(reg, MXC_CCM_CS1CDR);
3481 static struct clk esai_clk = {
3482 __INIT_CLK_DEBUG(esai_clk)
3484 .parent = &pll3_sw_clk,
3485 .secondary = &spba_clk,
3486 .enable_reg = MXC_CCM_CCGR1,
3487 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
3488 .enable = _clk_enable,
3489 .disable = _clk_disable,
3490 .set_rate = _clk_esai_set_rate,
3491 .get_rate = _clk_esai_get_rate,
3492 .set_parent = _clk_esai_set_parent,
3493 .round_rate = _clk_esai_round_rate,
3496 static int _clk_enet_enable(struct clk *clk)
3500 /* Enable ENET ref clock */
3501 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
3502 reg &= ~ANADIG_PLL_BYPASS;
3503 reg |= ANADIG_PLL_ENABLE;
3504 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
3510 static void _clk_enet_disable(struct clk *clk)
3516 /* Enable ENET ref clock */
3517 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
3518 reg |= ANADIG_PLL_BYPASS;
3519 reg &= ~ANADIG_PLL_ENABLE;
3520 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
3523 static int _clk_enet_set_rate(struct clk *clk, unsigned long rate)
3525 unsigned int reg, div = 1;
3543 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
3544 reg &= ~ANADIG_PLL_ENET_DIV_SELECT_MASK;
3545 reg |= (div << ANADIG_PLL_ENET_DIV_SELECT_OFFSET);
3546 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
3551 static unsigned long _clk_enet_get_rate(struct clk *clk)
3555 div = (__raw_readl(PLL8_ENET_BASE_ADDR))
3556 & ANADIG_PLL_ENET_DIV_SELECT_MASK;
3573 return 500000000 / div;
3576 static struct clk enet_clk[] = {
3578 __INIT_CLK_DEBUG(enet_clk)
3580 .parent = &pll8_enet_main_clk,
3581 .enable_reg = MXC_CCM_CCGR1,
3582 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
3583 .enable = _clk_enet_enable,
3584 .disable = _clk_enet_disable,
3585 .set_rate = _clk_enet_set_rate,
3586 .get_rate = _clk_enet_get_rate,
3587 .secondary = &enet_clk[1],
3588 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
3591 .parent = &mmdc_ch0_axi_clk[0],
3592 .secondary = &mx6per1_clk,
3596 static struct clk ecspi_clk[] = {
3598 __INIT_CLK_DEBUG(ecspi0_clk)
3600 .parent = &pll3_60M,
3601 .secondary = &spba_clk,
3602 .enable_reg = MXC_CCM_CCGR1,
3603 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
3604 .enable = _clk_enable,
3605 .disable = _clk_disable,
3608 __INIT_CLK_DEBUG(ecspi1_clk)
3610 .parent = &pll3_60M,
3611 .secondary = &spba_clk,
3612 .enable_reg = MXC_CCM_CCGR1,
3613 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
3614 .enable = _clk_enable,
3615 .disable = _clk_disable,
3618 __INIT_CLK_DEBUG(ecspi2_clk)
3620 .parent = &pll3_60M,
3621 .secondary = &spba_clk,
3622 .enable_reg = MXC_CCM_CCGR1,
3623 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
3624 .enable = _clk_enable,
3625 .disable = _clk_disable,
3628 __INIT_CLK_DEBUG(ecspi3_clk)
3630 .parent = &pll3_60M,
3631 .secondary = &spba_clk,
3632 .enable_reg = MXC_CCM_CCGR1,
3633 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
3634 .enable = _clk_enable,
3635 .disable = _clk_disable,
3638 __INIT_CLK_DEBUG(ecspi4_clk)
3640 .parent = &pll3_60M,
3641 .secondary = &spba_clk,
3642 .enable_reg = MXC_CCM_CCGR1,
3643 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
3644 .enable = _clk_enable,
3645 .disable = _clk_disable,
3649 static unsigned long _clk_emi_slow_round_rate(struct clk *clk,
3653 u32 parent_rate = clk_get_rate(clk->parent);
3655 div = parent_rate / rate;
3657 /* Make sure rate is not greater than the maximum value for the clock.
3658 * Also prevent a div of 0.
3666 return parent_rate / div;
3669 static int _clk_emi_slow_set_parent(struct clk *clk, struct clk *parent)
3672 u32 reg = __raw_readl(MXC_CCM_CSCMR1)
3673 & ~MXC_CCM_CSCMR1_ACLK_EMI_SLOW_MASK;
3675 mux = _get_mux6(parent, &axi_clk, &pll3_usb_otg_main_clk,
3676 &pll2_pfd_400M, &pll2_pfd_352M, NULL, NULL);
3677 reg |= (mux << MXC_CCM_CSCMR1_ACLK_EMI_SLOW_OFFSET);
3678 __raw_writel(reg, MXC_CCM_CSCMR1);
3683 static unsigned long _clk_emi_slow_get_rate(struct clk *clk)
3687 reg = __raw_readl(MXC_CCM_CSCMR1);
3688 div = ((reg & MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK) >>
3689 MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET) + 1;
3691 return clk_get_rate(clk->parent) / div;
3694 static int _clk_emi_slow_set_rate(struct clk *clk, unsigned long rate)
3697 u32 parent_rate = clk_get_rate(clk->parent);
3699 div = parent_rate / rate;
3702 if (((parent_rate / div) != rate) || (div > 8))
3705 reg = __raw_readl(MXC_CCM_CSCMR1);
3706 reg &= ~MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK;
3707 reg |= (div - 1) << MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET;
3708 __raw_writel(reg, MXC_CCM_CSCMR1);
3713 static struct clk emi_slow_clk = {
3714 __INIT_CLK_DEBUG(emi_slow_clk)
3717 .enable_reg = MXC_CCM_CCGR6,
3718 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
3719 .enable = _clk_enable,
3720 .disable = _clk_disable,
3721 .set_rate = _clk_emi_slow_set_rate,
3722 .get_rate = _clk_emi_slow_get_rate,
3723 .round_rate = _clk_emi_slow_round_rate,
3724 .set_parent = _clk_emi_slow_set_parent,
3727 static unsigned long _clk_emi_round_rate(struct clk *clk,
3731 u32 parent_rate = clk_get_rate(clk->parent);
3733 div = parent_rate / rate;
3735 /* Make sure rate is not greater than the maximum value for the clock.
3736 * Also prevent a div of 0.
3744 return parent_rate / div;
3747 static int _clk_emi_set_parent(struct clk *clk, struct clk *parent)
3750 u32 reg = __raw_readl(MXC_CCM_CSCMR1) & ~MXC_CCM_CSCMR1_ACLK_EMI_MASK;
3752 mux = _get_mux6(parent, &axi_clk, &pll3_usb_otg_main_clk,
3753 &pll2_pfd_400M, &pll2_pfd_352M, NULL, NULL);
3754 reg |= (mux << MXC_CCM_CSCMR1_ACLK_EMI_OFFSET);
3755 __raw_writel(reg, MXC_CCM_CSCMR1);
3760 static unsigned long _clk_emi_get_rate(struct clk *clk)
3764 reg = __raw_readl(MXC_CCM_CSCMR1);
3765 div = ((reg & MXC_CCM_CSCMR1_ACLK_EMI_PODF_MASK) >>
3766 MXC_CCM_CSCMR1_ACLK_EMI_PODF_OFFSET) + 1;
3768 return clk_get_rate(clk->parent) / div;
3771 static int _clk_emi_set_rate(struct clk *clk, unsigned long rate)
3774 u32 parent_rate = clk_get_rate(clk->parent);
3776 div = parent_rate / rate;
3779 if (((parent_rate / div) != rate) || (div > 8))
3782 reg = __raw_readl(MXC_CCM_CSCMR1);
3783 reg &= ~MXC_CCM_CSCMR1_ACLK_EMI_PODF_MASK;
3784 reg |= (div - 1) << MXC_CCM_CSCMR1_ACLK_EMI_PODF_OFFSET;
3785 __raw_writel(reg, MXC_CCM_CSCMR1);
3790 static struct clk emi_clk = {
3791 __INIT_CLK_DEBUG(emi_clk)
3794 .set_rate = _clk_emi_set_rate,
3795 .get_rate = _clk_emi_get_rate,
3796 .round_rate = _clk_emi_round_rate,
3797 .set_parent = _clk_emi_set_parent,
3800 static unsigned long _clk_enfc_round_rate(struct clk *clk,
3804 u32 parent_rate = clk_get_rate(clk->parent);
3805 u32 div = parent_rate / rate;
3807 if (parent_rate % rate)
3810 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
3812 return parent_rate / (pre * post);
3815 static int _clk_enfc_set_parent(struct clk *clk, struct clk *parent)
3819 reg = __raw_readl(MXC_CCM_CS2CDR)
3820 & ~MXC_CCM_CS2CDR_ENFC_CLK_SEL_MASK;
3822 mux = _get_mux6(parent, &pll2_pfd_352M,
3823 &pll2_528_bus_main_clk, &pll3_usb_otg_main_clk,
3824 &pll2_pfd_400M, NULL, NULL);
3825 reg |= mux << MXC_CCM_CS2CDR_ENFC_CLK_SEL_OFFSET;
3827 __raw_writel(reg, MXC_CCM_CS2CDR);
3832 static unsigned long _clk_enfc_get_rate(struct clk *clk)
3834 u32 reg, pred, podf;
3836 reg = __raw_readl(MXC_CCM_CS2CDR);
3838 pred = ((reg & MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK)
3839 >> MXC_CCM_CS2CDR_ENFC_CLK_PRED_OFFSET) + 1;
3840 podf = ((reg & MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK)
3841 >> MXC_CCM_CS2CDR_ENFC_CLK_PODF_OFFSET) + 1;
3843 return clk_get_rate(clk->parent) / (pred * podf);
3846 static int _clk_enfc_set_rate(struct clk *clk, unsigned long rate)
3848 u32 reg, div, pre, post;
3849 u32 parent_rate = clk_get_rate(clk->parent);
3851 div = parent_rate / rate;
3854 if (((parent_rate / div) != rate) || div > 512)
3857 __calc_pre_post_dividers(1 << 6, div, &pre, &post);
3859 reg = __raw_readl(MXC_CCM_CS2CDR);
3860 reg &= ~(MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK|
3861 MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK);
3862 reg |= (post - 1) << MXC_CCM_CS2CDR_ENFC_CLK_PODF_OFFSET;
3863 reg |= (pre - 1) << MXC_CCM_CS2CDR_ENFC_CLK_PRED_OFFSET;
3865 __raw_writel(reg, MXC_CCM_CS2CDR);
3870 static struct clk enfc_clk = {
3871 __INIT_CLK_DEBUG(enfc_clk)
3873 .parent = &pll2_pfd_352M,
3874 .enable_reg = MXC_CCM_CCGR2,
3875 .enable_shift = MXC_CCM_CCGRx_CG7_OFFSET,
3876 .enable = _clk_enable,
3877 .disable = _clk_disable,
3878 .set_rate = _clk_enfc_set_rate,
3879 .get_rate = _clk_enfc_get_rate,
3880 .round_rate = _clk_enfc_round_rate,
3881 .set_parent = _clk_enfc_set_parent,
3884 static unsigned long _clk_uart_round_rate(struct clk *clk,
3888 u32 parent_rate = clk_get_rate(clk->parent);
3890 div = parent_rate / rate;
3892 /* Make sure rate is not greater than the maximum value for the clock.
3893 * Also prevent a div of 0.
3901 return parent_rate / div;
3904 static int _clk_uart_set_rate(struct clk *clk, unsigned long rate)
3907 u32 parent_rate = clk_get_rate(clk->parent);
3909 div = parent_rate / rate;
3912 if (((parent_rate / div) != rate) || (div > 64))
3915 reg = __raw_readl(MXC_CCM_CSCDR1) & MXC_CCM_CSCDR1_UART_CLK_PODF_MASK;
3916 reg |= ((div - 1) << MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET);
3918 __raw_writel(reg, MXC_CCM_CSCDR1);
3923 static unsigned long _clk_uart_get_rate(struct clk *clk)
3928 reg = __raw_readl(MXC_CCM_CSCDR1) & MXC_CCM_CSCDR1_UART_CLK_PODF_MASK;
3929 div = (reg >> MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET) + 1;
3930 val = clk_get_rate(clk->parent) / div;
3935 static struct clk uart_clk[] = {
3937 __INIT_CLK_DEBUG(uart_clk)
3939 .parent = &pll3_80M,
3940 .enable_reg = MXC_CCM_CCGR5,
3941 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
3942 .enable = _clk_enable,
3943 .disable = _clk_disable,
3944 .secondary = &uart_clk[1],
3945 .set_rate = _clk_uart_set_rate,
3946 .get_rate = _clk_uart_get_rate,
3947 .round_rate = _clk_uart_round_rate,
3950 __INIT_CLK_DEBUG(uart_serial_clk)
3952 .enable_reg = MXC_CCM_CCGR5,
3953 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
3954 .enable = _clk_enable,
3955 .disable = _clk_disable,
3959 static unsigned long _clk_hsi_tx_round_rate(struct clk *clk,
3963 u32 parent_rate = clk_get_rate(clk->parent);
3965 div = parent_rate / rate;
3967 /* Make sure rate is not greater than the maximum value for the clock.
3968 * Also prevent a div of 0.
3976 return parent_rate / div;
3979 static int _clk_hsi_tx_set_parent(struct clk *clk, struct clk *parent)
3981 u32 reg = __raw_readl(MXC_CCM_CDCDR) & ~MXC_CCM_CDCDR_HSI_TX_CLK_SEL;
3983 if (parent == &pll2_pfd_400M)
3984 reg |= (MXC_CCM_CDCDR_HSI_TX_CLK_SEL);
3986 __raw_writel(reg, MXC_CCM_CDCDR);
3991 static unsigned long _clk_hsi_tx_get_rate(struct clk *clk)
3995 reg = __raw_readl(MXC_CCM_CDCDR);
3996 div = ((reg & MXC_CCM_CDCDR_HSI_TX_PODF_MASK) >>
3997 MXC_CCM_CDCDR_HSI_TX_PODF_OFFSET) + 1;
3999 return clk_get_rate(clk->parent) / div;
4002 static int _clk_hsi_tx_set_rate(struct clk *clk, unsigned long rate)
4005 u32 parent_rate = clk_get_rate(clk->parent);
4007 div = parent_rate / rate;
4010 if (((parent_rate / div) != rate) || (div > 8))
4013 reg = __raw_readl(MXC_CCM_CDCDR);
4014 reg &= ~MXC_CCM_CDCDR_HSI_TX_PODF_MASK;
4015 reg |= (div - 1) << MXC_CCM_CDCDR_HSI_TX_PODF_OFFSET;
4016 __raw_writel(reg, MXC_CCM_CDCDR);
4021 static struct clk hsi_tx_clk[] = {
4023 __INIT_CLK_DEBUG(hsi_tx_clk)
4025 .parent = &pll2_pfd_400M,
4026 .enable_reg = MXC_CCM_CCGR3,
4027 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
4028 .enable = _clk_enable,
4029 .disable = _clk_disable,
4030 .set_parent = _clk_hsi_tx_set_parent,
4031 .round_rate = _clk_hsi_tx_round_rate,
4032 .set_rate = _clk_hsi_tx_set_rate,
4033 .get_rate = _clk_hsi_tx_get_rate,
4034 .secondary = &hsi_tx_clk[1],
4035 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4038 .parent = &mx6per1_clk,
4039 .secondary = &mx6per2_clk,
4043 static struct clk mipi_pllref_clk = {
4044 __INIT_CLK_DEBUG(mipi_pllref_clk)
4046 .parent = &pll3_pfd_540M,
4047 .enable_reg = MXC_CCM_CCGR3,
4048 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
4049 .enable = _clk_enable,
4050 .disable = _clk_disable,
4053 static struct clk hdmi_clk[] = {
4055 __INIT_CLK_DEBUG(hdmi_isfr_clk)
4057 .parent = &pll3_pfd_540M,
4058 .enable_reg = MXC_CCM_CCGR2,
4059 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
4060 .enable = _clk_enable,
4061 .disable = _clk_disable,
4062 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4065 __INIT_CLK_DEBUG(hdmi_iahb_clk)
4068 .enable_reg = MXC_CCM_CCGR2,
4069 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4070 .enable = _clk_enable,
4071 .disable = _clk_disable,
4075 static struct clk caam_clk[] = {
4077 __INIT_CLK_DEBUG(caam_mem_clk)
4079 .enable_reg = MXC_CCM_CCGR0,
4080 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
4081 .enable = _clk_enable,
4082 .disable = _clk_disable,
4083 .secondary = &caam_clk[1],
4084 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4087 __INIT_CLK_DEBUG(caam_aclk_clk)
4089 .enable_reg = MXC_CCM_CCGR0,
4090 .enable_shift = MXC_CCM_CCGRx_CG5_OFFSET,
4091 .enable = _clk_enable,
4092 .disable = _clk_disable,
4093 .secondary = &caam_clk[2],
4096 __INIT_CLK_DEBUG(caam_ipg_clk)
4098 .enable_reg = MXC_CCM_CCGR0,
4099 .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
4100 .enable = _clk_enable,
4101 .disable = _clk_disable,
4102 .parent = &mmdc_ch0_axi_clk[0],
4103 .secondary = &mx6per1_clk,
4107 static int _clk_asrc_serial_set_parent(struct clk *clk, struct clk *parent)
4111 reg = __raw_readl(MXC_CCM_CDCDR) & ~MXC_CCM_CDCDR_SPDIF1_CLK_SEL_MASK;
4113 mux = _get_mux6(parent, &pll4_audio_main_clk, &pll3_pfd_508M,
4114 &pll3_pfd_454M, &pll3_sw_clk, NULL, NULL);
4115 reg |= mux << MXC_CCM_CDCDR_SPDIF1_CLK_SEL_OFFSET;
4117 __raw_writel(reg, MXC_CCM_CDCDR);
4122 static unsigned long _clk_asrc_serial_get_rate(struct clk *clk)
4124 u32 reg, pred, podf;
4126 reg = __raw_readl(MXC_CCM_CDCDR);
4128 pred = ((reg & MXC_CCM_CDCDR_SPDIF1_CLK_PRED_MASK)
4129 >> MXC_CCM_CDCDR_SPDIF1_CLK_PRED_OFFSET) + 1;
4130 podf = ((reg & MXC_CCM_CDCDR_SPDIF1_CLK_PODF_MASK)
4131 >> MXC_CCM_CDCDR_SPDIF1_CLK_PODF_OFFSET) + 1;
4133 return clk_get_rate(clk->parent) / (pred * podf);
4136 static int _clk_asrc_serial_set_rate(struct clk *clk, unsigned long rate)
4138 u32 reg, div, pre, post;
4139 u32 parent_rate = clk_get_rate(clk->parent);
4141 div = parent_rate / rate;
4144 if (((parent_rate / div) != rate) || div > 64)
4147 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
4149 reg = __raw_readl(MXC_CCM_CDCDR);
4150 reg &= ~(MXC_CCM_CDCDR_SPDIF1_CLK_PRED_MASK|
4151 MXC_CCM_CDCDR_SPDIF1_CLK_PODF_MASK);
4152 reg |= (post - 1) << MXC_CCM_CDCDR_SPDIF1_CLK_PODF_OFFSET;
4153 reg |= (pre - 1) << MXC_CCM_CDCDR_SPDIF1_CLK_PRED_OFFSET;
4155 __raw_writel(reg, MXC_CCM_CDCDR);
4160 static unsigned long _clk_asrc_serial_round_rate(struct clk *clk,
4164 u32 parent_rate = clk_get_rate(clk->parent);
4165 u32 div = parent_rate / rate;
4167 if (parent_rate % rate)
4170 __calc_pre_post_dividers(1 << 3, div, &pre, &post);
4172 return parent_rate / (pre * post);
4175 static struct clk asrc_clk[] = {
4177 __INIT_CLK_DEBUG(asrc_clk)
4179 .parent = &pll4_audio_main_clk,
4180 .enable_reg = MXC_CCM_CCGR0,
4181 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
4182 .enable = _clk_enable,
4183 .disable = _clk_disable,
4184 .secondary = &spba_clk,
4187 /*In the MX6 spec, asrc_serial_clk is listed as SPDIF1 clk
4188 * This clock can never be gated and does not have any
4189 * CCGR bits associated with it.
4191 __INIT_CLK_DEBUG(asrc_serial_clk)
4193 .parent = &pll3_sw_clk,
4194 .set_rate = _clk_asrc_serial_set_rate,
4195 .get_rate = _clk_asrc_serial_get_rate,
4196 .set_parent = _clk_asrc_serial_set_parent,
4197 .round_rate = _clk_asrc_serial_round_rate,
4201 static struct clk apbh_dma_clk = {
4202 __INIT_CLK_DEBUG(apbh_dma_clk)
4203 .parent = &usdhc3_clk,
4204 .secondary = &mx6per1_clk,
4205 .enable = _clk_enable,
4206 .disable = _clk_disable_inwait,
4207 .enable_reg = MXC_CCM_CCGR0,
4208 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
4211 static struct clk aips_tz2_clk = {
4212 __INIT_CLK_DEBUG(aips_tz2_clk)
4214 .enable_reg = MXC_CCM_CCGR0,
4215 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
4216 .enable = _clk_enable,
4217 .disable = _clk_disable_inwait,
4220 static struct clk aips_tz1_clk = {
4221 __INIT_CLK_DEBUG(aips_tz1_clk)
4223 .enable_reg = MXC_CCM_CCGR0,
4224 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4225 .enable = _clk_enable,
4226 .disable = _clk_disable_inwait,
4230 static struct clk openvg_axi_clk = {
4231 __INIT_CLK_DEBUG(openvg_axi_clk)
4232 .parent = &gpu2d_axi_clk,
4233 .enable = _clk_enable,
4234 .enable_reg = MXC_CCM_CCGR3,
4235 .enable_shift = MXC_CCM_CCGRx_CG15_OFFSET,
4236 .disable = _clk_disable,
4237 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4240 static unsigned long _clk_gpu3d_core_round_rate(struct clk *clk,
4244 u32 parent_rate = clk_get_rate(clk->parent);
4246 div = parent_rate / rate;
4248 /* Make sure rate is not greater than the maximum value for the clock.
4249 * Also prevent a div of 0.
4257 return parent_rate / div;
4260 static int _clk_gpu3d_core_set_parent(struct clk *clk, struct clk *parent)
4263 u32 reg = __raw_readl(MXC_CCM_CBCMR)
4264 & ~MXC_CCM_CBCMR_GPU3D_CORE_CLK_SEL_MASK;
4266 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
4267 &pll3_usb_otg_main_clk,
4268 &pll2_pfd_594M, &pll2_pfd_400M, NULL, NULL);
4269 reg |= (mux << MXC_CCM_CBCMR_GPU3D_CORE_CLK_SEL_OFFSET);
4270 __raw_writel(reg, MXC_CCM_CBCMR);
4275 static unsigned long _clk_gpu3d_core_get_rate(struct clk *clk)
4279 reg = __raw_readl(MXC_CCM_CBCMR);
4280 div = ((reg & MXC_CCM_CBCMR_GPU3D_CORE_PODF_MASK) >>
4281 MXC_CCM_CBCMR_GPU3D_CORE_PODF_OFFSET) + 1;
4283 return clk_get_rate(clk->parent) / div;
4286 static int _clk_gpu3d_core_set_rate(struct clk *clk, unsigned long rate)
4289 u32 parent_rate = clk_get_rate(clk->parent);
4291 div = parent_rate / rate;
4297 reg = __raw_readl(MXC_CCM_CBCMR);
4298 reg &= ~MXC_CCM_CBCMR_GPU3D_CORE_PODF_MASK;
4299 reg |= (div - 1) << MXC_CCM_CBCMR_GPU3D_CORE_PODF_OFFSET;
4300 __raw_writel(reg, MXC_CCM_CBCMR);
4305 static struct clk gpu3d_core_clk[] = {
4307 __INIT_CLK_DEBUG(gpu3d_core_clk)
4308 .parent = &pll2_pfd_594M,
4309 .enable = _clk_enable,
4310 .enable_reg = MXC_CCM_CCGR1,
4311 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
4312 .disable = _clk_disable,
4313 .set_parent = _clk_gpu3d_core_set_parent,
4314 .set_rate = _clk_gpu3d_core_set_rate,
4315 .get_rate = _clk_gpu3d_core_get_rate,
4316 .round_rate = _clk_gpu3d_core_round_rate,
4317 .secondary = &gpu3d_core_clk[1],
4318 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4321 .parent = &gpu3d_axi_clk,
4322 .secondary = &mx6fast1_clk,
4326 static unsigned long _clk_gpu2d_core_round_rate(struct clk *clk,
4330 u32 parent_rate = clk_get_rate(clk->parent);
4332 div = parent_rate / rate;
4334 /* Make sure rate is not greater than the maximum value for the clock.
4335 * Also prevent a div of 0.
4343 return parent_rate / div;
4346 static int _clk_gpu2d_core_set_parent(struct clk *clk, struct clk *parent)
4349 u32 reg = __raw_readl(MXC_CCM_CBCMR) &
4350 ~MXC_CCM_CBCMR_GPU2D_CLK_SEL_MASK;
4352 /*on mx6dl, 2d core clock sources from 3d shader core clock*/
4353 if (!cpu_is_mx6dl()) {
4354 mux = _get_mux6(parent, &axi_clk, &pll3_usb_otg_main_clk,
4355 &pll2_pfd_352M, &pll2_pfd_400M, NULL, NULL);
4356 reg |= (mux << MXC_CCM_CBCMR_GPU2D_CLK_SEL_OFFSET);
4357 __raw_writel(reg, MXC_CCM_CBCMR);
4363 static unsigned long _clk_gpu2d_core_get_rate(struct clk *clk)
4367 reg = __raw_readl(MXC_CCM_CBCMR);
4368 div = ((reg & MXC_CCM_CBCMR_GPU2D_CORE_PODF_MASK) >>
4369 MXC_CCM_CBCMR_GPU2D_CORE_PODF_OFFSET) + 1;
4371 return clk_get_rate(clk->parent) / div;
4374 static int _clk_gpu2d_core_set_rate(struct clk *clk, unsigned long rate)
4377 u32 parent_rate = clk_get_rate(clk->parent);
4379 div = parent_rate / rate;
4382 if (((parent_rate / div) != rate) || (div > 8))
4385 reg = __raw_readl(MXC_CCM_CBCMR);
4386 reg &= ~MXC_CCM_CBCMR_GPU2D_CORE_PODF_MASK;
4387 reg |= (div - 1) << MXC_CCM_CBCMR_GPU2D_CORE_PODF_OFFSET;
4388 __raw_writel(reg, MXC_CCM_CBCMR);
4392 static struct clk gpu2d_core_clk[] = {
4394 __INIT_CLK_DEBUG(gpu2d_core_clk)
4395 .parent = &pll2_pfd_352M,
4396 .enable = _clk_enable,
4397 .enable_reg = MXC_CCM_CCGR1,
4398 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
4399 .disable = _clk_disable,
4400 .set_parent = _clk_gpu2d_core_set_parent,
4401 .set_rate = _clk_gpu2d_core_set_rate,
4402 .get_rate = _clk_gpu2d_core_get_rate,
4403 .round_rate = _clk_gpu2d_core_round_rate,
4404 .secondary = &gpu2d_core_clk[1],
4405 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4408 .parent = &gpu2d_axi_clk,
4409 .secondary = &mx6fast1_clk,
4413 static unsigned long _clk_gpu3d_shader_round_rate(struct clk *clk,
4417 u32 parent_rate = clk_get_rate(clk->parent);
4419 div = parent_rate / rate;
4421 /* Make sure rate is not greater than the maximum value for the clock.
4422 * Also prevent a div of 0.
4430 return parent_rate / div;
4433 static int _clk_gpu3d_shader_set_parent(struct clk *clk, struct clk *parent)
4436 u32 reg = __raw_readl(MXC_CCM_CBCMR)
4437 & ~MXC_CCM_CBCMR_GPU3D_SHADER_CLK_SEL_MASK;
4439 mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
4440 &pll3_usb_otg_main_clk,
4441 &pll2_pfd_594M, &pll3_pfd_720M, NULL, NULL);
4442 reg |= (mux << MXC_CCM_CBCMR_GPU3D_SHADER_CLK_SEL_OFFSET);
4443 __raw_writel(reg, MXC_CCM_CBCMR);
4448 static unsigned long _clk_gpu3d_shader_get_rate(struct clk *clk)
4452 reg = __raw_readl(MXC_CCM_CBCMR);
4453 div = ((reg & MXC_CCM_CBCMR_GPU3D_SHADER_PODF_MASK) >>
4454 MXC_CCM_CBCMR_GPU3D_SHADER_PODF_OFFSET) + 1;
4456 return clk_get_rate(clk->parent) / div;
4459 static int _clk_gpu3d_shader_set_rate(struct clk *clk, unsigned long rate)
4462 u32 parent_rate = clk_get_rate(clk->parent);
4464 div = parent_rate / rate;
4470 reg = __raw_readl(MXC_CCM_CBCMR);
4471 reg &= ~MXC_CCM_CBCMR_GPU3D_SHADER_PODF_MASK;
4472 reg |= (div - 1) << MXC_CCM_CBCMR_GPU3D_SHADER_PODF_OFFSET;
4473 __raw_writel(reg, MXC_CCM_CBCMR);
4479 static struct clk gpu3d_shader_clk = {
4480 __INIT_CLK_DEBUG(gpu3d_shader_clk)
4481 .parent = &pll3_pfd_720M,
4482 .secondary = &mmdc_ch0_axi_clk[0],
4483 .enable = _clk_enable,
4484 .enable_reg = MXC_CCM_CCGR1,
4485 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
4486 .disable = _clk_disable,
4487 .set_parent = _clk_gpu3d_shader_set_parent,
4488 .set_rate = _clk_gpu3d_shader_set_rate,
4489 .get_rate = _clk_gpu3d_shader_get_rate,
4490 .round_rate = _clk_gpu3d_shader_round_rate,
4491 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4494 /* set the parent by the ipcg table */
4495 static struct clk gpmi_nand_clk[] = {
4497 __INIT_CLK_DEBUG(gpmi_io_clk)
4498 .parent = &enfc_clk,
4499 .secondary = &gpmi_nand_clk[1],
4500 .enable = _clk_enable,
4501 .enable_reg = MXC_CCM_CCGR4,
4502 .enable_shift = MXC_CCM_CCGRx_CG14_OFFSET,
4503 .disable = _clk_disable,
4505 { /* gpmi_apb_clk */
4506 __INIT_CLK_DEBUG(gpmi_apb_clk)
4507 .parent = &usdhc3_clk,
4508 .secondary = &gpmi_nand_clk[2],
4509 .enable = _clk_enable,
4510 .enable_reg = MXC_CCM_CCGR4,
4511 .enable_shift = MXC_CCM_CCGRx_CG15_OFFSET,
4512 .disable = _clk_disable,
4515 __INIT_CLK_DEBUG(gpmi_bch_clk)
4516 .parent = &usdhc4_clk,
4517 .secondary = &gpmi_nand_clk[3],
4518 .enable = _clk_enable,
4519 .enable_reg = MXC_CCM_CCGR4,
4520 .enable_shift = MXC_CCM_CCGRx_CG13_OFFSET,
4521 .disable = _clk_disable,
4524 __INIT_CLK_DEBUG(gpmi_bch_apb_clk)
4525 .parent = &usdhc3_clk,
4526 .secondary = &gpmi_nand_clk[4],
4527 .enable = _clk_enable,
4528 .enable_reg = MXC_CCM_CCGR4,
4529 .enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
4530 .disable = _clk_disable,
4532 { /* bch relative clk */
4533 __INIT_CLK_DEBUG(pl301_mx6qperl_bch)
4534 .parent = &mx6per1_clk,
4535 .secondary = &mmdc_ch0_axi_clk[0],
4539 static struct clk pwm_clk[] = {
4541 __INIT_CLK_DEBUG(pwm_clk_0)
4542 .parent = &ipg_perclk,
4544 .enable_reg = MXC_CCM_CCGR4,
4545 .enable_shift = MXC_CCM_CCGRx_CG8_OFFSET,
4546 .enable = _clk_enable,
4547 .disable = _clk_disable,
4550 __INIT_CLK_DEBUG(pwm_clk_1)
4551 .parent = &ipg_perclk,
4553 .enable_reg = MXC_CCM_CCGR4,
4554 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
4555 .enable = _clk_enable,
4556 .disable = _clk_disable,
4559 __INIT_CLK_DEBUG(pwm_clk_2)
4560 .parent = &ipg_perclk,
4562 .enable_reg = MXC_CCM_CCGR4,
4563 .enable_shift = MXC_CCM_CCGRx_CG10_OFFSET,
4564 .enable = _clk_enable,
4565 .disable = _clk_disable,
4568 __INIT_CLK_DEBUG(pwm_clk_3)
4569 .parent = &ipg_perclk,
4571 .enable_reg = MXC_CCM_CCGR4,
4572 .enable_shift = MXC_CCM_CCGRx_CG11_OFFSET,
4573 .enable = _clk_enable,
4574 .disable = _clk_disable,
4578 static int _clk_pcie_enable(struct clk *clk)
4582 /* Clear Power Down and Enable PLLs */
4583 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4584 reg &= ~ANADIG_PLL_ENET_POWER_DOWN;
4585 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4587 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4588 reg |= ANADIG_PLL_ENET_EN;
4589 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4591 /* Waiting for the PLL is locked */
4592 if (!WAIT(ANADIG_PLL_ENET_LOCK & __raw_readl(PLL8_ENET_BASE_ADDR),
4594 panic("pll8 lock failed\n");
4596 /* Disable the bypass */
4597 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4598 reg &= ~ANADIG_PLL_ENET_BYPASS;
4599 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4602 * Enable SATA ref clock.
4603 * PCIe needs both sides to have the same source of refernce clock,
4604 * The SATA reference clock is taken out on clk out
4606 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4607 reg |= ANADIG_PLL_ENET_EN_SATA;
4608 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4610 /* Activate LVDS CLK1 (the MiniPCIe slot clock input) */
4611 reg = __raw_readl(ANADIG_MISC1_REG);
4612 reg &= ~ANATOP_LVDS_CLK1_IBEN_MASK;
4613 __raw_writel(reg, ANADIG_MISC1_REG);
4615 reg = __raw_readl(ANADIG_MISC1_REG);
4616 reg |= ANATOP_LVDS_CLK1_SRC_SATA;
4617 __raw_writel(reg, ANADIG_MISC1_REG);
4619 reg = __raw_readl(ANADIG_MISC1_REG);
4620 reg |= ANATOP_LVDS_CLK1_OBEN_MASK;
4621 __raw_writel(reg, ANADIG_MISC1_REG);
4623 /* Enable PCIE ref clock */
4624 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4625 reg |= ANADIG_PLL_ENET_EN_PCIE;
4626 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4633 static void _clk_pcie_disable(struct clk *clk)
4639 /* Disable SATA ref clock */
4640 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4641 reg &= ~ANADIG_PLL_ENET_EN_PCIE;
4642 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4645 static struct clk pcie_clk[] = {
4647 __INIT_CLK_DEBUG(pcie_clk)
4648 .parent = &pcie_axi_clk,
4649 .enable = _clk_pcie_enable,
4650 .disable = _clk_pcie_disable,
4651 .enable_reg = MXC_CCM_CCGR4,
4652 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4653 .secondary = &pcie_clk[1],
4654 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4657 .parent = &mmdc_ch0_axi_clk[0],
4658 .secondary = &mx6fast1_clk,
4662 static int _clk_sata_enable(struct clk *clk)
4666 /* Clear Power Down and Enable PLLs */
4667 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4668 reg &= ~ANADIG_PLL_ENET_POWER_DOWN;
4669 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4671 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4672 reg |= ANADIG_PLL_ENET_EN;
4673 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4675 /* Waiting for the PLL is locked */
4676 if (!WAIT(ANADIG_PLL_ENET_LOCK & __raw_readl(PLL8_ENET_BASE_ADDR),
4678 panic("pll8 lock failed\n");
4680 /* Disable the bypass */
4681 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4682 reg &= ~ANADIG_PLL_ENET_BYPASS;
4683 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4685 /* Enable SATA ref clock */
4686 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4687 reg |= ANADIG_PLL_ENET_EN_SATA;
4688 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4695 static void _clk_sata_disable(struct clk *clk)
4701 /* Disable SATA ref clock */
4702 reg = __raw_readl(PLL8_ENET_BASE_ADDR);
4703 reg &= ~ANADIG_PLL_ENET_EN_SATA;
4704 __raw_writel(reg, PLL8_ENET_BASE_ADDR);
4707 static struct clk sata_clk[] = {
4709 __INIT_CLK_DEBUG(sata_clk)
4711 .enable = _clk_sata_enable,
4712 .enable_reg = MXC_CCM_CCGR5,
4713 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
4714 .disable = _clk_sata_disable,
4715 .secondary = &sata_clk[1],
4716 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4719 .parent = &mmdc_ch0_axi_clk[0],
4720 .secondary = &mx6per1_clk,
4724 static struct clk usboh3_clk[] = {
4726 __INIT_CLK_DEBUG(usboh3_clk)
4728 .enable = _clk_enable,
4729 .enable_reg = MXC_CCM_CCGR6,
4730 .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
4731 .disable = _clk_disable,
4732 .secondary = &usboh3_clk[1],
4733 .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE,
4736 .parent = &mmdc_ch0_axi_clk[0],
4737 .secondary = &mx6per1_clk,
4741 static struct clk mlb150_clk = {
4742 __INIT_CLK_DEBUG(mlb150_clk)
4745 .enable_reg = MXC_CCM_CCGR3,
4746 .enable_shift = MXC_CCM_CCGRx_CG9_OFFSET,
4747 .enable = _clk_enable,
4748 .disable = _clk_disable,
4751 static int _clk_enable1(struct clk *clk)
4754 reg = __raw_readl(clk->enable_reg);
4755 reg |= 1 << clk->enable_shift;
4756 __raw_writel(reg, clk->enable_reg);
4761 static void _clk_disable1(struct clk *clk)
4764 reg = __raw_readl(clk->enable_reg);
4765 reg &= ~(1 << clk->enable_shift);
4766 __raw_writel(reg, clk->enable_reg);
4769 static int _clk_clko_set_parent(struct clk *clk, struct clk *parent)
4773 if (parent == &pll3_usb_otg_main_clk)
4775 else if (parent == &pll2_528_bus_main_clk)
4777 else if (parent == &pll1_sys_main_clk)
4779 else if (parent == &pll5_video_main_clk)
4781 else if (parent == &axi_clk)
4783 else if (parent == &enfc_clk)
4785 else if (parent == &ipu1_di_clk[0])
4787 else if (parent == &ipu1_di_clk[1])
4789 else if (parent == &ipu2_di_clk[0])
4791 else if (parent == &ipu2_di_clk[1])
4793 else if (parent == &ahb_clk)
4795 else if (parent == &ipg_clk)
4797 else if (parent == &ipg_perclk)
4799 else if (parent == &ckil_clk)
4801 else if (parent == &pll4_audio_main_clk)
4806 reg = __raw_readl(MXC_CCM_CCOSR);
4807 reg &= ~MXC_CCM_CCOSR_CKOL_SEL_MASK;
4808 reg |= sel << MXC_CCM_CCOSR_CKOL_SEL_OFFSET;
4809 __raw_writel(reg, MXC_CCM_CCOSR);
4813 static unsigned long _clk_clko_get_rate(struct clk *clk)
4815 u32 reg = __raw_readl(MXC_CCM_CCOSR);
4816 u32 div = ((reg & MXC_CCM_CCOSR_CKOL_DIV_MASK) >>
4817 MXC_CCM_CCOSR_CKOL_DIV_OFFSET) + 1;
4818 return clk_get_rate(clk->parent) / div;
4821 static int _clk_clko_set_rate(struct clk *clk, unsigned long rate)
4824 u32 parent_rate = clk_get_rate(clk->parent);
4825 u32 div = parent_rate / rate;
4829 if (((parent_rate / div) != rate) || (div > 8))
4832 reg = __raw_readl(MXC_CCM_CCOSR);
4833 reg &= ~MXC_CCM_CCOSR_CKOL_DIV_MASK;
4834 reg |= (div - 1) << MXC_CCM_CCOSR_CKOL_DIV_OFFSET;
4835 __raw_writel(reg, MXC_CCM_CCOSR);
4839 static unsigned long _clk_clko_round_rate(struct clk *clk,
4842 u32 parent_rate = clk_get_rate(clk->parent);
4843 u32 div = parent_rate / rate;
4845 /* Make sure rate is not greater than the maximum value for the clock.
4846 * Also prevent a div of 0.
4852 return parent_rate / div;
4855 static int _clk_clko2_set_parent(struct clk *clk, struct clk *parent)
4859 if (parent == &mmdc_ch0_axi_clk[0])
4861 else if (parent == &mmdc_ch1_axi_clk[0])
4863 else if (parent == &usdhc4_clk)
4865 else if (parent == &usdhc1_clk)
4867 else if (parent == &gpu2d_axi_clk)
4869 else if (parent == &ecspi_clk[0])
4871 else if (parent == &gpu3d_axi_clk)
4873 else if (parent == &usdhc3_clk)
4875 else if (parent == &pcie_clk[0])
4877 else if (parent == &ipu1_clk)
4879 else if (parent == &ipu2_clk)
4881 else if (parent == &vdo_axi_clk)
4883 else if (parent == &osc_clk)
4885 else if (parent == &gpu2d_core_clk[0])
4887 else if (parent == &gpu3d_core_clk[0])
4889 else if (parent == &usdhc2_clk)
4891 else if (parent == &ssi1_clk)
4893 else if (parent == &ssi2_clk)
4895 else if (parent == &ssi3_clk)
4897 else if (parent == &gpu3d_shader_clk)
4899 else if (parent == &can_clk_root)
4901 else if (parent == &ldb_di0_clk)
4903 else if (parent == &ldb_di1_clk)
4905 else if (parent == &esai_clk)
4907 else if (parent == &uart_clk[0])
4909 else if (parent == &spdif0_clk[0])
4911 else if (parent == &hsi_tx_clk[0])
4916 reg = __raw_readl(MXC_CCM_CCOSR);
4917 reg &= ~MXC_CCM_CCOSR_CKO2_SEL_MASK;
4918 reg |= sel << MXC_CCM_CCOSR_CKO2_SEL_OFFSET;
4919 __raw_writel(reg, MXC_CCM_CCOSR);
4923 static unsigned long _clk_clko2_get_rate(struct clk *clk)
4925 u32 reg = __raw_readl(MXC_CCM_CCOSR);
4926 u32 div = ((reg & MXC_CCM_CCOSR_CKO2_DIV_MASK) >>
4927 MXC_CCM_CCOSR_CKO2_DIV_OFFSET) + 1;
4928 return clk_get_rate(clk->parent) / div;
4931 static int _clk_clko2_set_rate(struct clk *clk, unsigned long rate)
4934 u32 parent_rate = clk_get_rate(clk->parent);
4935 u32 div = parent_rate / rate;
4939 if (((parent_rate / div) != rate) || (div > 8))
4942 reg = __raw_readl(MXC_CCM_CCOSR);
4943 reg &= ~MXC_CCM_CCOSR_CKO2_DIV_MASK;
4944 reg |= (div - 1) << MXC_CCM_CCOSR_CKO2_DIV_OFFSET;
4945 __raw_writel(reg, MXC_CCM_CCOSR);
4949 static struct clk clko_clk = {
4950 __INIT_CLK_DEBUG(clko_clk)
4951 .parent = &pll2_528_bus_main_clk,
4952 .enable = _clk_enable1,
4953 .enable_reg = MXC_CCM_CCOSR,
4954 .enable_shift = MXC_CCM_CCOSR_CKOL_EN_OFFSET,
4955 .disable = _clk_disable1,
4956 .set_parent = _clk_clko_set_parent,
4957 .set_rate = _clk_clko_set_rate,
4958 .get_rate = _clk_clko_get_rate,
4959 .round_rate = _clk_clko_round_rate,
4962 static struct clk clko2_clk = {
4963 __INIT_CLK_DEBUG(clko2_clk)
4964 .parent = &usdhc4_clk,
4965 .enable = _clk_enable1,
4966 .enable_reg = MXC_CCM_CCOSR,
4967 .enable_shift = MXC_CCM_CCOSR_CKO2_EN_OFFSET,
4968 .disable = _clk_disable1,
4969 .set_parent = _clk_clko2_set_parent,
4970 .set_rate = _clk_clko2_set_rate,
4971 .get_rate = _clk_clko2_get_rate,
4972 .round_rate = _clk_clko_round_rate,
4975 static struct clk perfmon0_clk = {
4976 __INIT_CLK_DEBUG(perfmon0_clk)
4977 .parent = &mmdc_ch0_axi_clk[0],
4978 .enable = _clk_enable1,
4979 .enable_reg = MXC_CCM_CCGR4,
4980 .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
4981 .disable = _clk_disable1,
4984 static struct clk perfmon1_clk = {
4985 __INIT_CLK_DEBUG(perfmon1_clk)
4986 .parent = &ipu1_clk,
4987 .enable = _clk_enable1,
4988 .enable_reg = MXC_CCM_CCGR4,
4989 .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
4990 .disable = _clk_disable1,
4993 static struct clk perfmon2_clk = {
4994 __INIT_CLK_DEBUG(perfmon2_clk)
4995 .parent = &mmdc_ch0_axi_clk[0],
4996 .enable = _clk_enable1,
4997 .enable_reg = MXC_CCM_CCGR4,
4998 .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
4999 .disable = _clk_disable1,
5002 static struct clk dummy_clk = {
5006 #define _REGISTER_CLOCK(d, n, c) \
5014 static struct clk_lookup lookups[] = {
5015 _REGISTER_CLOCK(NULL, "osc", osc_clk),
5016 _REGISTER_CLOCK(NULL, "ckih", ckih_clk),
5017 _REGISTER_CLOCK(NULL, "ckih2", ckih2_clk),
5018 _REGISTER_CLOCK(NULL, "ckil", ckil_clk),
5019 _REGISTER_CLOCK(NULL, "pll1_main_clk", pll1_sys_main_clk),
5020 _REGISTER_CLOCK(NULL, "pll1_sw_clk", pll1_sw_clk),
5021 _REGISTER_CLOCK(NULL, "pll2", pll2_528_bus_main_clk),
5022 _REGISTER_CLOCK(NULL, "pll2_pfd_400M", pll2_pfd_400M),
5023 _REGISTER_CLOCK(NULL, "pll2_pfd_352M", pll2_pfd_352M),
5024 _REGISTER_CLOCK(NULL, "pll2_pfd_594M", pll2_pfd_594M),
5025 _REGISTER_CLOCK(NULL, "pll2_200M", pll2_200M),
5026 _REGISTER_CLOCK(NULL, "pll3_main_clk", pll3_usb_otg_main_clk),
5027 _REGISTER_CLOCK(NULL, "pll3_pfd_508M", pll3_pfd_508M),
5028 _REGISTER_CLOCK(NULL, "pll3_pfd_454M", pll3_pfd_454M),
5029 _REGISTER_CLOCK(NULL, "pll3_pfd_720M", pll3_pfd_720M),
5030 _REGISTER_CLOCK(NULL, "pll3_pfd_540M", pll3_pfd_540M),
5031 _REGISTER_CLOCK(NULL, "pll3_sw_clk", pll3_sw_clk),
5032 _REGISTER_CLOCK(NULL, "pll3_120M", pll3_120M),
5033 _REGISTER_CLOCK(NULL, "pll3_120M", pll3_80M),
5034 _REGISTER_CLOCK(NULL, "pll3_120M", pll3_60M),
5035 _REGISTER_CLOCK(NULL, "pll4", pll4_audio_main_clk),
5036 _REGISTER_CLOCK(NULL, "pll5", pll5_video_main_clk),
5037 _REGISTER_CLOCK(NULL, "pll6", pll6_mlb150_main_clk),
5038 _REGISTER_CLOCK(NULL, "pll3", pll7_usb_host_main_clk),
5039 _REGISTER_CLOCK(NULL, "pll4", pll8_enet_main_clk),
5040 _REGISTER_CLOCK(NULL, "cpu_clk", cpu_clk),
5041 _REGISTER_CLOCK(NULL, "periph_clk", periph_clk),
5042 _REGISTER_CLOCK(NULL, "axi_clk", axi_clk),
5043 _REGISTER_CLOCK(NULL, "mmdc_ch0_axi", mmdc_ch0_axi_clk[0]),
5044 _REGISTER_CLOCK(NULL, "mmdc_ch1_axi", mmdc_ch1_axi_clk[0]),
5045 _REGISTER_CLOCK(NULL, "ahb", ahb_clk),
5046 _REGISTER_CLOCK(NULL, "ipg_clk", ipg_clk),
5047 _REGISTER_CLOCK(NULL, "ipg_perclk", ipg_perclk),
5048 _REGISTER_CLOCK(NULL, "spba", spba_clk),
5049 _REGISTER_CLOCK("imx-sdma", NULL, sdma_clk[0]),
5050 _REGISTER_CLOCK(NULL, "gpu2d_axi_clk", gpu2d_axi_clk),
5051 _REGISTER_CLOCK(NULL, "gpu3d_axi_clk", gpu3d_axi_clk),
5052 _REGISTER_CLOCK(NULL, "pcie_axi_clk", pcie_axi_clk),
5053 _REGISTER_CLOCK(NULL, "vdo_axi_clk", vdo_axi_clk),
5054 _REGISTER_CLOCK(NULL, "iim_clk", iim_clk),
5055 _REGISTER_CLOCK(NULL, "i2c_clk", i2c_clk[0]),
5056 _REGISTER_CLOCK("imx-i2c.1", NULL, i2c_clk[1]),
5057 _REGISTER_CLOCK("imx-i2c.2", NULL, i2c_clk[2]),
5058 _REGISTER_CLOCK(NULL, "vpu_clk", vpu_clk[0]),
5059 _REGISTER_CLOCK(NULL, "ipu1_clk", ipu1_clk),
5060 _REGISTER_CLOCK(NULL, "ipu2_clk", ipu2_clk),
5061 _REGISTER_CLOCK(NULL, "cko1_clk0", cko1_clk0),
5062 _REGISTER_CLOCK("sdhci-esdhc-imx.0", NULL, usdhc1_clk),
5063 _REGISTER_CLOCK("sdhci-esdhc-imx.1", NULL, usdhc2_clk),
5064 _REGISTER_CLOCK("sdhci-esdhc-imx.2", NULL, usdhc3_clk),
5065 _REGISTER_CLOCK("sdhci-esdhc-imx.3", NULL, usdhc4_clk),
5066 _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk),
5067 _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk),
5068 _REGISTER_CLOCK("imx-ssi.2", NULL, ssi3_clk),
5069 _REGISTER_CLOCK(NULL, "ipu1_di0_clk", ipu1_di_clk[0]),
5070 _REGISTER_CLOCK(NULL, "ipu1_di1_clk", ipu1_di_clk[1]),
5071 _REGISTER_CLOCK(NULL, "ipu2_di0_clk", ipu2_di_clk[0]),
5072 _REGISTER_CLOCK(NULL, "ipu2_di1_clk", ipu2_di_clk[1]),
5073 _REGISTER_CLOCK(NULL, "can_root_clk", can_clk_root),
5074 _REGISTER_CLOCK("imx6q-flexcan.0", NULL, can1_clk[0]),
5075 _REGISTER_CLOCK("imx6q-flexcan.1", NULL, can2_clk[0]),
5076 _REGISTER_CLOCK(NULL, "ldb_di0_clk", ldb_di0_clk),
5077 _REGISTER_CLOCK(NULL, "ldb_di1_clk", ldb_di1_clk),
5078 _REGISTER_CLOCK("mxc_spdif.0", NULL, spdif0_clk[0]),
5079 _REGISTER_CLOCK(NULL, "esai_clk", esai_clk),
5080 _REGISTER_CLOCK("imx6q-ecspi.0", NULL, ecspi_clk[0]),
5081 _REGISTER_CLOCK("imx6q-ecspi.1", NULL, ecspi_clk[1]),
5082 _REGISTER_CLOCK("imx6q-ecspi.2", NULL, ecspi_clk[2]),
5083 _REGISTER_CLOCK("imx6q-ecspi.3", NULL, ecspi_clk[3]),
5084 _REGISTER_CLOCK("imx6q-ecspi.4", NULL, ecspi_clk[4]),
5085 _REGISTER_CLOCK(NULL, "emi_slow_clk", emi_slow_clk),
5086 _REGISTER_CLOCK(NULL, "emi_clk", emi_clk),
5087 _REGISTER_CLOCK(NULL, "enfc_clk", enfc_clk),
5088 _REGISTER_CLOCK("imx-uart.0", NULL, uart_clk[0]),
5089 _REGISTER_CLOCK("imx-uart.1", NULL, uart_clk[0]),
5090 _REGISTER_CLOCK("imx-uart.2", NULL, uart_clk[0]),
5091 _REGISTER_CLOCK("imx-uart.3", NULL, uart_clk[0]),
5092 _REGISTER_CLOCK(NULL, "hsi_tx", hsi_tx_clk[0]),
5093 _REGISTER_CLOCK(NULL, "caam_clk", caam_clk[0]),
5094 _REGISTER_CLOCK(NULL, "asrc_clk", asrc_clk[0]),
5095 _REGISTER_CLOCK(NULL, "asrc_serial_clk", asrc_clk[1]),
5096 _REGISTER_CLOCK("mxs-dma-apbh", NULL, apbh_dma_clk),
5097 _REGISTER_CLOCK(NULL, "openvg_axi_clk", openvg_axi_clk),
5098 _REGISTER_CLOCK(NULL, "gpu3d_clk", gpu3d_core_clk[0]),
5099 _REGISTER_CLOCK(NULL, "gpu2d_clk", gpu2d_core_clk[0]),
5100 _REGISTER_CLOCK(NULL, "gpu3d_shader_clk", gpu3d_shader_clk),
5101 _REGISTER_CLOCK(NULL, "gpt", gpt_clk[0]),
5102 _REGISTER_CLOCK("imx6q-gpmi-nand.0", NULL, gpmi_nand_clk[0]),
5103 _REGISTER_CLOCK(NULL, "gpmi-apb", gpmi_nand_clk[1]),
5104 _REGISTER_CLOCK(NULL, "bch", gpmi_nand_clk[2]),
5105 _REGISTER_CLOCK(NULL, "bch-apb", gpmi_nand_clk[3]),
5106 _REGISTER_CLOCK(NULL, "pl301_mx6qperl-bch", gpmi_nand_clk[4]),
5107 _REGISTER_CLOCK("mxc_pwm.0", NULL, pwm_clk[0]),
5108 _REGISTER_CLOCK("mxc_pwm.1", NULL, pwm_clk[1]),
5109 _REGISTER_CLOCK("mxc_pwm.2", NULL, pwm_clk[2]),
5110 _REGISTER_CLOCK("mxc_pwm.3", NULL, pwm_clk[3]),
5111 _REGISTER_CLOCK(NULL, "pcie_clk", pcie_clk[0]),
5112 _REGISTER_CLOCK("fec.0", NULL, enet_clk[0]),
5113 _REGISTER_CLOCK(NULL, "imx_sata_clk", sata_clk[0]),
5114 _REGISTER_CLOCK(NULL, "usboh3_clk", usboh3_clk[0]),
5115 _REGISTER_CLOCK(NULL, "usb_phy1_clk", usb_phy1_clk),
5116 _REGISTER_CLOCK(NULL, "usb_phy3_clk", usb_phy3_clk),
5117 _REGISTER_CLOCK(NULL, "usb_phy4_clk", usb_phy4_clk),
5118 _REGISTER_CLOCK("imx2-wdt.0", NULL, dummy_clk),
5119 _REGISTER_CLOCK("imx2-wdt.1", NULL, dummy_clk),
5120 _REGISTER_CLOCK(NULL, "hdmi_isfr_clk", hdmi_clk[0]),
5121 _REGISTER_CLOCK(NULL, "hdmi_iahb_clk", hdmi_clk[1]),
5122 _REGISTER_CLOCK(NULL, "mipi_pllref_clk", mipi_pllref_clk),
5123 _REGISTER_CLOCK(NULL, NULL, vdoa_clk),
5124 _REGISTER_CLOCK(NULL, NULL, aips_tz2_clk),
5125 _REGISTER_CLOCK(NULL, NULL, aips_tz1_clk),
5126 _REGISTER_CLOCK(NULL, "clko_clk", clko_clk),
5127 _REGISTER_CLOCK(NULL, "clko2_clk", clko2_clk),
5128 _REGISTER_CLOCK(NULL, "pxp_axi", ipu2_clk),
5129 _REGISTER_CLOCK(NULL, "epdc_axi", ipu2_clk),
5130 _REGISTER_CLOCK(NULL, "epdc_pix", ipu2_di_clk[1]),
5131 _REGISTER_CLOCK("mxs-perfmon.0", "perfmon", perfmon0_clk),
5132 _REGISTER_CLOCK("mxs-perfmon.1", "perfmon", perfmon1_clk),
5133 _REGISTER_CLOCK("mxs-perfmon.2", "perfmon", perfmon2_clk),
5134 _REGISTER_CLOCK(NULL, "mlb150_clk", mlb150_clk),
5137 static void clk_tree_init(void)
5142 reg = __raw_readl(MMDC_MDMISC_OFFSET);
5143 if ((reg & MMDC_MDMISC_DDR_TYPE_MASK) ==
5144 (0x1 << MMDC_MDMISC_DDR_TYPE_OFFSET) ||
5146 clk_set_parent(&periph_clk, &pll2_pfd_400M);
5147 printk(KERN_INFO "Set periph_clk's parent to pll2_pfd_400M!\n");
5152 int __init mx6_clocks_init(unsigned long ckil, unsigned long osc,
5153 unsigned long ckih1, unsigned long ckih2)
5158 external_low_reference = ckil;
5159 external_high_reference = ckih1;
5160 ckih2_reference = ckih2;
5161 oscillator_reference = osc;
5163 apll_base = ioremap(ANATOP_BASE_ADDR, SZ_4K);
5165 for (i = 0; i < ARRAY_SIZE(lookups); i++) {
5166 clkdev_add(&lookups[i]);
5167 clk_debug_register(lookups[i].clk);
5170 /* Disable un-necessary PFDs & PLLs */
5172 /* keep correct count. */
5173 clk_enable(&cpu_clk);
5174 clk_enable(&periph_clk);
5178 if (pll2_pfd_400M.usecount == 0 && cpu_is_mx6q())
5179 pll2_pfd_400M.disable(&pll2_pfd_400M);
5180 pll2_pfd_352M.disable(&pll2_pfd_352M);
5181 pll2_pfd_594M.disable(&pll2_pfd_594M);
5183 #if !defined(CONFIG_FEC_1588)
5184 pll3_pfd_454M.disable(&pll3_pfd_454M);
5185 pll3_pfd_508M.disable(&pll3_pfd_508M);
5186 pll3_pfd_540M.disable(&pll3_pfd_540M);
5187 pll3_pfd_720M.disable(&pll3_pfd_720M);
5189 pll3_usb_otg_main_clk.disable(&pll3_usb_otg_main_clk);
5191 pll4_audio_main_clk.disable(&pll4_audio_main_clk);
5192 pll5_video_main_clk.disable(&pll5_video_main_clk);
5193 pll6_mlb150_main_clk.disable(&pll6_mlb150_main_clk);
5194 pll7_usb_host_main_clk.disable(&pll7_usb_host_main_clk);
5195 pll8_enet_main_clk.disable(&pll8_enet_main_clk);
5197 sata_clk[0].disable(&sata_clk[0]);
5198 pcie_clk[0].disable(&pcie_clk[0]);
5200 /* Initialize Audio and Video PLLs to valid frequency (650MHz). */
5201 clk_set_rate(&pll4_audio_main_clk, 650000000);
5202 clk_set_rate(&pll5_video_main_clk, 650000000);
5204 clk_set_parent(&ipu1_di_clk[0], &pll5_video_main_clk);
5205 clk_set_parent(&ipu1_di_clk[1], &pll5_video_main_clk);
5206 clk_set_parent(&ipu2_di_clk[0], &pll5_video_main_clk);
5207 clk_set_parent(&ipu2_di_clk[1], &pll5_video_main_clk);
5209 clk_set_parent(&cko1_clk0, &ipg_clk);
5210 clk_set_rate(&cko1_clk0, 22000000);
5211 clk_enable(&cko1_clk0);
5213 clk_set_parent(&emi_clk, &pll2_pfd_400M);
5214 clk_set_rate(&emi_clk, 200000000);
5216 clk_set_parent(&gpu3d_shader_clk, &pll2_pfd_594M);
5217 clk_set_rate(&gpu3d_shader_clk, 594000000);
5218 clk_set_parent(&gpu3d_core_clk[0], &mmdc_ch0_axi_clk[0]);
5219 clk_set_rate(&gpu3d_core_clk[0], 528000000);
5220 if (cpu_is_mx6dl()) {
5221 /*on mx6dl, 2d core clock sources from 3d shader core clock*/
5222 clk_set_parent(&gpu2d_core_clk[0], &gpu3d_shader_clk);
5223 /* on mx6dl gpu2d_axi_clk source from mmdc0 directly */
5224 clk_set_parent(&gpu2d_axi_clk, &mmdc_ch0_axi_clk[0]);
5225 gpu2d_axi_clk.secondary = NULL;
5227 /* on mx6dl, max ipu clock is 274M */
5228 clk_set_parent(&ipu1_clk, &pll3_pfd_540M);
5229 clk_set_parent(&ldb_di0_clk, &pll2_pfd_352M);
5230 clk_set_parent(&ldb_di1_clk, &pll2_pfd_352M);
5233 clk_set_parent(&gpu2d_core_clk[0], &pll3_usb_otg_main_clk);
5235 /* PCLK camera - J5 */
5236 clk_set_parent(&clko2_clk, &osc_clk);
5237 clk_set_rate(&clko2_clk, 2400000);
5240 * FIXME: asrc needs to use asrc_serial(spdif1) clock to do sample
5241 * rate convertion and this clock frequency can not be too high, set
5242 * it to the minimum value 7.5Mhz to make asrc work properly.
5244 clk_set_parent(&asrc_clk[1], &pll3_sw_clk);
5245 clk_set_rate(&asrc_clk[1], 7500000);
5247 /* set the GPMI clock to default frequency : 20MHz */
5248 clk_set_rate(&enfc_clk, enfc_clk.round_rate(&enfc_clk, 20000000));
5251 cpu_op_tbl = get_cpu_op(&cpu_op_nr);
5253 /* Gate off all possible clocks */
5254 if (mxc_jtag_enabled) {
5255 __raw_writel(3 << MXC_CCM_CCGRx_CG11_OFFSET |
5256 3 << MXC_CCM_CCGRx_CG2_OFFSET |
5257 3 << MXC_CCM_CCGRx_CG1_OFFSET |
5258 3 << MXC_CCM_CCGRx_CG0_OFFSET, MXC_CCM_CCGR0);
5260 __raw_writel(1 << MXC_CCM_CCGRx_CG11_OFFSET |
5261 3 << MXC_CCM_CCGRx_CG2_OFFSET |
5262 3 << MXC_CCM_CCGRx_CG1_OFFSET |
5263 3 << MXC_CCM_CCGRx_CG0_OFFSET, MXC_CCM_CCGR0);
5265 __raw_writel(3 << MXC_CCM_CCGRx_CG10_OFFSET, MXC_CCM_CCGR1);
5266 __raw_writel(1 << MXC_CCM_CCGRx_CG12_OFFSET |
5267 1 << MXC_CCM_CCGRx_CG11_OFFSET |
5268 3 << MXC_CCM_CCGRx_CG10_OFFSET |
5269 3 << MXC_CCM_CCGRx_CG9_OFFSET |
5270 3 << MXC_CCM_CCGRx_CG8_OFFSET, MXC_CCM_CCGR2);
5271 __raw_writel(1 << MXC_CCM_CCGRx_CG14_OFFSET |
5272 3 << MXC_CCM_CCGRx_CG13_OFFSET |
5273 3 << MXC_CCM_CCGRx_CG12_OFFSET |
5274 3 << MXC_CCM_CCGRx_CG11_OFFSET |
5275 3 << MXC_CCM_CCGRx_CG10_OFFSET, MXC_CCM_CCGR3);
5276 __raw_writel(3 << MXC_CCM_CCGRx_CG7_OFFSET |
5277 1 << MXC_CCM_CCGRx_CG6_OFFSET |
5278 1 << MXC_CCM_CCGRx_CG4_OFFSET, MXC_CCM_CCGR4);
5279 __raw_writel(1 << MXC_CCM_CCGRx_CG0_OFFSET, MXC_CCM_CCGR5);
5281 __raw_writel(0, MXC_CCM_CCGR6);
5283 /* Lower the ipg_perclk frequency to 8.25MHz. */
5284 clk_set_rate(&ipg_perclk, 8250000);
5287 clk_set_parent(&spdif0_clk[0], &pll3_pfd_454M);
5290 clk_set_parent(&ipu2_clk, &pll2_pfd_400M);
5291 clk_set_rate(&ipu2_clk, 200000000);
5293 if (mx6q_revision() == IMX_CHIP_REVISION_1_0) {
5294 gpt_clk[0].parent = &ipg_perclk;
5295 gpt_clk[0].get_rate = NULL;
5297 /* Here we use OSC 24M as GPT's clock source, no need to
5298 enable gpt serial clock*/
5299 gpt_clk[0].secondary = NULL;
5302 if (cpu_is_mx6dl()) {
5303 if (epdc_use_video_pll)
5304 clk_set_parent(&ipu2_di_clk[1], &pll5_video_main_clk);
5306 clk_set_parent(&ipu2_di_clk[1], &pll3_pfd_540M);
5309 base = ioremap(GPT_BASE_ADDR, SZ_4K);
5310 mxc_timer_init(&gpt_clk[0], base, MXC_INT_GPT);