2 * arch/arm/mach-pnx4008/clock.c
4 * Clock control driver for PNX4008
6 * Authors: Vitaly Wool, Dmitry Chigirev <source@mvista.com>
7 * Generic clock management functions are partially based on:
8 * linux/arch/arm/mach-omap/clock.c
10 * 2005-2006 (c) MontaVista Software, Inc. This file is licensed under
11 * the terms of the GNU General Public License version 2. This program
12 * is licensed "as is" without any warranty of any kind, whether express
16 #include <linux/module.h>
17 #include <linux/kernel.h>
18 #include <linux/list.h>
19 #include <linux/errno.h>
20 #include <linux/device.h>
21 #include <linux/err.h>
22 #include <linux/delay.h>
24 #include <asm/hardware.h>
27 #include <asm/arch/clock.h>
30 /*forward declaration*/
31 static struct clk per_ck;
32 static struct clk hclk_ck;
33 static struct clk ck_1MHz;
34 static struct clk ck_13MHz;
35 static struct clk ck_pll1;
36 static int local_set_rate(struct clk *clk, u32 rate);
38 static inline void clock_lock(void)
43 static inline void clock_unlock(void)
48 static void propagate_rate(struct clk *clk)
53 while (tmp_clk->propagate_next) {
54 tmp_clk = tmp_clk->propagate_next;
55 local_set_rate(tmp_clk, tmp_clk->user_rate);
59 static inline void clk_reg_disable(struct clk *clk)
62 __raw_writel(__raw_readl(clk->enable_reg) &
63 ~(1 << clk->enable_shift), clk->enable_reg);
66 static inline void clk_reg_enable(struct clk *clk)
69 __raw_writel(__raw_readl(clk->enable_reg) |
70 (1 << clk->enable_shift), clk->enable_reg);
73 static inline void clk_reg_disable1(struct clk *clk)
76 __raw_writel(__raw_readl(clk->enable_reg1) &
77 ~(1 << clk->enable_shift1), clk->enable_reg1);
80 static inline void clk_reg_enable1(struct clk *clk)
83 __raw_writel(__raw_readl(clk->enable_reg1) |
84 (1 << clk->enable_shift1), clk->enable_reg1);
87 static int clk_wait_for_pll_lock(struct clk *clk)
91 while (i++ < 0xFFF && !(__raw_readl(clk->scale_reg) & 1)) ; /*wait for PLL to lock */
93 if (!(__raw_readl(clk->scale_reg) & 1)) {
95 "%s ERROR: failed to lock, scale reg data: %x\n",
96 clk->name, __raw_readl(clk->scale_reg));
102 static int switch_to_dirty_13mhz(struct clk *clk)
111 clk_reg_enable1(clk);
113 tmp_reg = __raw_readl(clk->parent_switch_reg);
114 /*if 13Mhz clock selected, select 13'MHz (dirty) source from OSC */
115 if (!(tmp_reg & 1)) {
116 tmp_reg |= (1 << 1); /* Trigger switch to 13'MHz (dirty) clock */
117 __raw_writel(tmp_reg, clk->parent_switch_reg);
119 while (i++ < 0xFFF && !(__raw_readl(clk->parent_switch_reg) & 1)) ; /*wait for 13'MHz selection status */
121 if (!(__raw_readl(clk->parent_switch_reg) & 1)) {
123 "%s ERROR: failed to select 13'MHz, parent sw reg data: %x\n",
124 clk->name, __raw_readl(clk->parent_switch_reg));
130 clk_reg_disable1(clk);
135 static int switch_to_clean_13mhz(struct clk *clk)
144 clk_reg_enable1(clk);
146 tmp_reg = __raw_readl(clk->parent_switch_reg);
147 /*if 13'Mhz clock selected, select 13MHz (clean) source from OSC */
149 tmp_reg &= ~(1 << 1); /* Trigger switch to 13MHz (clean) clock */
150 __raw_writel(tmp_reg, clk->parent_switch_reg);
152 while (i++ < 0xFFF && (__raw_readl(clk->parent_switch_reg) & 1)) ; /*wait for 13MHz selection status */
154 if (__raw_readl(clk->parent_switch_reg) & 1) {
156 "%s ERROR: failed to select 13MHz, parent sw reg data: %x\n",
157 clk->name, __raw_readl(clk->parent_switch_reg));
163 clk_reg_disable1(clk);
168 static int set_13MHz_parent(struct clk *clk, struct clk *parent)
172 if (parent == &ck_13MHz)
173 ret = switch_to_clean_13mhz(clk);
174 else if (parent == &ck_pll1)
175 ret = switch_to_dirty_13mhz(clk);
180 #define PLL160_MIN_FCCO 156000
181 #define PLL160_MAX_FCCO 320000
184 * Calculate pll160 settings.
185 * Possible input: up to 320MHz with step of clk->parent->rate.
186 * In PNX4008 parent rate for pll160s may be either 1 or 13MHz.
187 * Ignored paths: "feedback" (bit 13 set), "div-by-N".
188 * Setting ARM PLL4 rate to 0 will put CPU into direct run mode.
189 * Setting PLL5 and PLL3 rate to 0 will disable USB and DSP clock input.
190 * Please refer to PNX4008 IC manual for details.
193 static int pll160_set_rate(struct clk *clk, u32 rate)
195 u32 tmp_reg, tmp_m, tmp_2p, i;
199 parent_rate = clk->parent->rate;
204 /* set direct run for ARM or disable output for others */
205 clk_reg_disable(clk);
207 /* disable source input as well (ignored for ARM) */
208 clk_reg_disable1(clk);
210 tmp_reg = __raw_readl(clk->scale_reg);
211 tmp_reg &= ~0x1ffff; /*clear all settings, power down */
212 __raw_writel(tmp_reg, clk->scale_reg);
214 rate -= rate % parent_rate; /*round down the input */
216 if (rate > PLL160_MAX_FCCO)
217 rate = PLL160_MAX_FCCO;
225 clk_reg_enable1(clk);
226 tmp_reg = __raw_readl(clk->scale_reg);
228 if (rate == parent_rate) {
229 /*enter direct bypass mode */
230 tmp_reg |= ((1 << 14) | (1 << 15));
231 __raw_writel(tmp_reg, clk->scale_reg);
232 clk->rate = parent_rate;
239 for (tmp_2p = 1; tmp_2p < 16; tmp_2p <<= 1) {
240 if (rate * tmp_2p >= PLL160_MIN_FCCO)
246 tmp_reg |= ((i - 1) << 11);
248 tmp_reg |= (1 << 14); /*direct mode, no divide */
250 tmp_m = rate * tmp_2p;
251 tmp_m /= parent_rate;
253 tmp_reg |= (tmp_m - 1) << 1; /*calculate M */
254 tmp_reg |= (1 << 16); /*power up PLL */
255 __raw_writel(tmp_reg, clk->scale_reg);
257 if (clk_wait_for_pll_lock(clk) < 0) {
258 clk_reg_disable(clk);
259 clk_reg_disable1(clk);
261 tmp_reg = __raw_readl(clk->scale_reg);
262 tmp_reg &= ~0x1ffff; /*clear all settings, power down */
263 __raw_writel(tmp_reg, clk->scale_reg);
269 clk->rate = (tmp_m * parent_rate) / tmp_2p;
271 if (clk->flags & RATE_PROPAGATES)
281 /*configure PER_CLK*/
282 static int per_clk_set_rate(struct clk *clk, u32 rate)
286 tmp = __raw_readl(clk->scale_reg);
288 tmp |= ((clk->parent->rate / clk->rate) - 1) << 2;
289 __raw_writel(tmp, clk->scale_reg);
295 static int hclk_set_rate(struct clk *clk, u32 rate)
298 tmp = __raw_readl(clk->scale_reg);
311 __raw_writel(tmp, clk->scale_reg);
316 static u32 hclk_round_rate(struct clk *clk, u32 rate)
326 static u32 per_clk_round_rate(struct clk *clk, u32 rate)
328 return CLK_RATE_13MHZ;
331 static int on_off_set_rate(struct clk *clk, u32 rate)
337 clk_reg_disable(clk);
343 static int on_off_inv_set_rate(struct clk *clk, u32 rate)
346 clk_reg_disable(clk); /*enable bit is inverted */
355 static u32 on_off_round_rate(struct clk *clk, u32 rate)
357 return (rate ? 1 : 0);
360 static u32 pll4_round_rate(struct clk *clk, u32 rate)
362 if (rate > CLK_RATE_208MHZ)
363 rate = CLK_RATE_208MHZ;
364 if (rate == CLK_RATE_208MHZ && hclk_ck.user_rate == 1)
365 rate = CLK_RATE_208MHZ - CLK_RATE_13MHZ;
366 return (rate - (rate % (hclk_ck.user_rate * CLK_RATE_13MHZ)));
369 static u32 pll3_round_rate(struct clk *clk, u32 rate)
371 if (rate > CLK_RATE_208MHZ)
372 rate = CLK_RATE_208MHZ;
373 return (rate - rate % CLK_RATE_13MHZ);
376 static u32 pll5_round_rate(struct clk *clk, u32 rate)
378 return (rate ? CLK_RATE_48MHZ : 0);
381 static u32 ck_13MHz_round_rate(struct clk *clk, u32 rate)
383 return (rate ? CLK_RATE_13MHZ : 0);
386 static int ck_13MHz_set_rate(struct clk *clk, u32 rate)
389 clk_reg_disable(clk); /*enable bit is inverted */
391 clk->rate = CLK_RATE_13MHZ;
392 ck_1MHz.rate = CLK_RATE_1MHZ;
401 static int pll1_set_rate(struct clk *clk, u32 rate)
403 #if 0 /* doesn't work on some boards, probably a HW BUG */
405 clk_reg_disable(clk); /*enable bit is inverted */
406 if (!clk_wait_for_pll_lock(clk)) {
407 clk->rate = CLK_RATE_13MHZ;
423 static struct clk osc_13MHz = {
426 .rate = CLK_RATE_13MHZ,
429 static struct clk ck_13MHz = {
431 .parent = &osc_13MHz,
432 .flags = NEEDS_INITIALIZATION,
433 .round_rate = &ck_13MHz_round_rate,
434 .set_rate = &ck_13MHz_set_rate,
435 .enable_reg = OSC13CTRL_REG,
437 .rate = CLK_RATE_13MHZ,
440 static struct clk osc_32KHz = {
443 .rate = CLK_RATE_32KHZ,
447 static struct clk ck_1MHz = {
449 .flags = FIXED_RATE | PARENT_SET_RATE,
453 /* PLL1 (397) - provides 13' MHz clock */
454 static struct clk ck_pll1 = {
456 .parent = &osc_32KHz,
457 .flags = NEEDS_INITIALIZATION,
458 .round_rate = &ck_13MHz_round_rate,
459 .set_rate = &pll1_set_rate,
460 .enable_reg = PLLCTRL_REG,
462 .scale_reg = PLLCTRL_REG,
463 .rate = CLK_RATE_13MHZ,
467 static struct clk ck_pll4 = {
470 .flags = RATE_PROPAGATES | NEEDS_INITIALIZATION,
471 .propagate_next = &per_ck,
472 .round_rate = &pll4_round_rate,
473 .set_rate = &pll160_set_rate,
474 .rate = CLK_RATE_208MHZ,
475 .scale_reg = HCLKPLLCTRL_REG,
476 .enable_reg = PWRCTRL_REG,
478 .parent_switch_reg = SYSCLKCTRL_REG,
479 .set_parent = &set_13MHz_parent,
483 static struct clk ck_pll5 = {
486 .flags = NEEDS_INITIALIZATION,
487 .round_rate = &pll5_round_rate,
488 .set_rate = &pll160_set_rate,
489 .scale_reg = USBCTRL_REG,
490 .enable_reg = USBCTRL_REG,
492 .enable_reg1 = USBCTRL_REG,
496 /* XPERTTeak DSP PLL */
497 static struct clk ck_pll3 = {
500 .flags = NEEDS_INITIALIZATION,
501 .round_rate = &pll3_round_rate,
502 .set_rate = &pll160_set_rate,
503 .scale_reg = DSPPLLCTRL_REG,
504 .enable_reg = DSPCLKCTRL_REG,
506 .enable_reg1 = DSPCLKCTRL_REG,
508 .parent_switch_reg = DSPCLKCTRL_REG,
509 .set_parent = &set_13MHz_parent,
512 static struct clk hclk_ck = {
515 .flags = PARENT_SET_RATE,
516 .set_rate = &hclk_set_rate,
517 .round_rate = &hclk_round_rate,
518 .scale_reg = HCLKDIVCTRL_REG,
523 static struct clk per_ck = {
527 .propagate_next = &hclk_ck,
528 .set_rate = &per_clk_set_rate,
529 .round_rate = &per_clk_round_rate,
530 .scale_reg = HCLKDIVCTRL_REG,
531 .rate = CLK_RATE_13MHZ,
532 .user_rate = CLK_RATE_13MHZ,
535 static struct clk m2hclk_ck = {
538 .flags = NEEDS_INITIALIZATION,
539 .round_rate = &on_off_round_rate,
540 .set_rate = &on_off_inv_set_rate,
543 .enable_reg = PWRCTRL_REG,
546 static struct clk vfp9_ck = {
549 .flags = NEEDS_INITIALIZATION,
550 .round_rate = &on_off_round_rate,
551 .set_rate = &on_off_set_rate,
554 .enable_reg = VFP9CLKCTRL_REG,
557 static struct clk keyscan_ck = {
558 .name = "keyscan_ck",
559 .parent = &osc_32KHz,
560 .flags = NEEDS_INITIALIZATION,
561 .round_rate = &on_off_round_rate,
562 .set_rate = &on_off_set_rate,
564 .enable_reg = KEYCLKCTRL_REG,
567 static struct clk touch_ck = {
569 .parent = &osc_32KHz,
570 .flags = NEEDS_INITIALIZATION,
571 .round_rate = &on_off_round_rate,
572 .set_rate = &on_off_set_rate,
574 .enable_reg = TSCLKCTRL_REG,
577 static struct clk pwm1_ck = {
579 .parent = &osc_32KHz,
580 .flags = NEEDS_INITIALIZATION,
581 .round_rate = &on_off_round_rate,
582 .set_rate = &on_off_set_rate,
584 .enable_reg = PWMCLKCTRL_REG,
587 static struct clk pwm2_ck = {
589 .parent = &osc_32KHz,
590 .flags = NEEDS_INITIALIZATION,
591 .round_rate = &on_off_round_rate,
592 .set_rate = &on_off_set_rate,
594 .enable_reg = PWMCLKCTRL_REG,
597 static struct clk jpeg_ck = {
600 .flags = NEEDS_INITIALIZATION,
601 .round_rate = &on_off_round_rate,
602 .set_rate = &on_off_set_rate,
604 .enable_reg = JPEGCLKCTRL_REG,
607 static struct clk ms_ck = {
610 .flags = NEEDS_INITIALIZATION,
611 .round_rate = &on_off_round_rate,
612 .set_rate = &on_off_set_rate,
614 .enable_reg = MSCTRL_REG,
617 static struct clk dum_ck = {
620 .flags = NEEDS_INITIALIZATION,
621 .round_rate = &on_off_round_rate,
622 .set_rate = &on_off_set_rate,
624 .enable_reg = DUMCLKCTRL_REG,
627 static struct clk flash_ck = {
630 .round_rate = &on_off_round_rate,
631 .set_rate = &on_off_set_rate,
632 .enable_shift = 1, /* Only MLC clock supported */
633 .enable_reg = FLASHCLKCTRL_REG,
636 static struct clk i2c0_ck = {
639 .flags = NEEDS_INITIALIZATION,
640 .round_rate = &on_off_round_rate,
641 .set_rate = &on_off_set_rate,
643 .enable_reg = I2CCLKCTRL_REG,
646 static struct clk i2c1_ck = {
649 .flags = NEEDS_INITIALIZATION,
650 .round_rate = &on_off_round_rate,
651 .set_rate = &on_off_set_rate,
653 .enable_reg = I2CCLKCTRL_REG,
656 static struct clk i2c2_ck = {
659 .flags = NEEDS_INITIALIZATION,
660 .round_rate = &on_off_round_rate,
661 .set_rate = &on_off_set_rate,
663 .enable_reg = USB_OTG_CLKCTRL_REG,
666 static struct clk spi0_ck = {
669 .flags = NEEDS_INITIALIZATION,
670 .round_rate = &on_off_round_rate,
671 .set_rate = &on_off_set_rate,
673 .enable_reg = SPICTRL_REG,
676 static struct clk spi1_ck = {
679 .flags = NEEDS_INITIALIZATION,
680 .round_rate = &on_off_round_rate,
681 .set_rate = &on_off_set_rate,
683 .enable_reg = SPICTRL_REG,
686 static struct clk dma_ck = {
689 .round_rate = &on_off_round_rate,
690 .set_rate = &on_off_set_rate,
692 .enable_reg = DMACLKCTRL_REG,
695 static struct clk uart3_ck = {
698 .flags = NEEDS_INITIALIZATION,
699 .round_rate = &on_off_round_rate,
700 .set_rate = &on_off_set_rate,
703 .enable_reg = UARTCLKCTRL_REG,
706 static struct clk uart4_ck = {
709 .flags = NEEDS_INITIALIZATION,
710 .round_rate = &on_off_round_rate,
711 .set_rate = &on_off_set_rate,
713 .enable_reg = UARTCLKCTRL_REG,
716 static struct clk uart5_ck = {
719 .flags = NEEDS_INITIALIZATION,
720 .round_rate = &on_off_round_rate,
721 .set_rate = &on_off_set_rate,
724 .enable_reg = UARTCLKCTRL_REG,
727 static struct clk uart6_ck = {
730 .flags = NEEDS_INITIALIZATION,
731 .round_rate = &on_off_round_rate,
732 .set_rate = &on_off_set_rate,
734 .enable_reg = UARTCLKCTRL_REG,
737 static struct clk wdt_ck = {
740 .flags = NEEDS_INITIALIZATION,
741 .round_rate = &on_off_round_rate,
742 .set_rate = &on_off_set_rate,
744 .enable_reg = TIMCLKCTRL_REG,
747 /* These clocks are visible outside this module
748 * and can be initialized
750 static struct clk *onchip_clks[] = {
780 static int local_clk_enable(struct clk *clk)
784 if (!(clk->flags & FIXED_RATE) && !clk->rate && clk->set_rate
786 ret = clk->set_rate(clk, clk->user_rate);
790 static void local_clk_disable(struct clk *clk)
792 if (!(clk->flags & FIXED_RATE) && clk->rate && clk->set_rate)
793 clk->set_rate(clk, 0);
796 static void local_clk_unuse(struct clk *clk)
798 if (clk->usecount > 0 && !(--clk->usecount)) {
799 local_clk_disable(clk);
801 local_clk_unuse(clk->parent);
805 static int local_clk_use(struct clk *clk)
808 if (clk->usecount++ == 0) {
810 ret = local_clk_use(clk->parent);
817 ret = local_clk_enable(clk);
819 if (ret != 0 && clk->parent) {
820 local_clk_unuse(clk->parent);
828 static int local_set_rate(struct clk *clk, u32 rate)
833 if (clk->user_rate == clk->rate && clk->parent->rate) {
834 /* if clock enabled or rate not set */
835 clk->user_rate = clk->round_rate(clk, rate);
836 ret = clk->set_rate(clk, clk->user_rate);
838 clk->user_rate = clk->round_rate(clk, rate);
844 int clk_set_rate(struct clk *clk, unsigned long rate)
848 if (clk->flags & FIXED_RATE)
852 if ((clk->flags & PARENT_SET_RATE) && clk->parent) {
854 clk->user_rate = clk->round_rate(clk, rate);
855 /* parent clock needs to be refreshed
856 for the setting to take effect */
858 ret = local_set_rate(clk, rate);
867 EXPORT_SYMBOL(clk_set_rate);
869 struct clk *clk_get(struct device *dev, const char *id)
871 struct clk *clk = ERR_PTR(-ENOENT);
875 for (clkp = onchip_clks; clkp < onchip_clks + ARRAY_SIZE(onchip_clks);
877 if (strcmp(id, (*clkp)->name) == 0
878 && try_module_get((*clkp)->owner)) {
887 EXPORT_SYMBOL(clk_get);
889 void clk_put(struct clk *clk)
892 if (clk && !IS_ERR(clk))
893 module_put(clk->owner);
896 EXPORT_SYMBOL(clk_put);
898 unsigned long clk_get_rate(struct clk *clk)
906 EXPORT_SYMBOL(clk_get_rate);
908 int clk_enable(struct clk *clk)
913 ret = local_clk_use(clk);
918 EXPORT_SYMBOL(clk_enable);
920 void clk_disable(struct clk *clk)
923 local_clk_unuse(clk);
927 EXPORT_SYMBOL(clk_disable);
929 long clk_round_rate(struct clk *clk, unsigned long rate)
934 ret = clk->round_rate(clk, rate);
941 EXPORT_SYMBOL(clk_round_rate);
943 int clk_set_parent(struct clk *clk, struct clk *parent)
946 if (!clk->set_parent)
950 ret = clk->set_parent(clk, parent);
952 clk->parent = parent;
959 EXPORT_SYMBOL(clk_set_parent);
961 static int __init clk_init(void)
965 /* Disable autoclocking, as it doesn't seem to work */
966 __raw_writel(0xff, AUTOCLK_CTRL);
968 for (clkp = onchip_clks; clkp < onchip_clks + ARRAY_SIZE(onchip_clks);
970 if (((*clkp)->flags & NEEDS_INITIALIZATION)
971 && ((*clkp)->set_rate)) {
972 (*clkp)->user_rate = (*clkp)->rate;
973 local_set_rate((*clkp), (*clkp)->user_rate);
974 if ((*clkp)->set_parent)
975 (*clkp)->set_parent((*clkp), (*clkp)->parent);
977 pr_debug("%s: clock %s, rate %ld\n",
978 __func__, (*clkp)->name, (*clkp)->rate);
981 local_clk_use(&ck_pll4);
983 /* if ck_13MHz is not used, disable it. */
984 if (ck_13MHz.usecount == 0)
985 local_clk_disable(&ck_13MHz);
987 /* Disable autoclocking */
988 __raw_writeb(0xff, AUTOCLK_CTRL);
993 arch_initcall(clk_init);