]> pilppa.com Git - linux-2.6-omap-h63xx.git/commitdiff
omap2 clock: generalize initial clock rate setup: recalculate_root_clocks()
authorPaul Walmsley <paul@pwsan.com>
Mon, 27 Aug 2007 08:38:58 +0000 (02:38 -0600)
committerTony Lindgren <tony@atomide.com>
Fri, 31 Aug 2007 17:45:31 +0000 (10:45 -0700)
Add a new clock framework function, recalculate_root_clocks(), that
recalculates all root clocks (i.e., clocks with no parent clock).
Call this function in omap2_clk_arch_init(), rather than manually
propagating specific clocks.  Add propagate_rate() recalcs to func_32k_ck
and osc_ck.

Signed-off-by: Paul Walmsley <paul@pwsan.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/mach-omap2/clock.c
arch/arm/mach-omap2/clock.h
arch/arm/plat-omap/clock.c
include/asm-arm/arch-omap/clock.h

index 44f9a2ee6c0a327a49d5a5f406758e5bde96a15e..61c089021574f7483a91823dba3a927b7a10f590 100644 (file)
@@ -1179,8 +1179,7 @@ static int __init omap2_clk_arch_init(void)
        if (omap2_select_table_rate(&virt_prcm_set, mpurate))
                printk(KERN_ERR "Could not find matching MPU rate\n");
 
-       propagate_rate(&osc_ck);                /* update main root fast */
-       propagate_rate(&func_32k_ck);           /* update main root slow */
+       recalculate_root_clocks();
 
        printk(KERN_INFO "Switched to new clocking rate (Crystal/DPLL/MPU): "
               "%ld.%01ld/%ld/%ld MHz\n",
@@ -1231,8 +1230,7 @@ int __init omap2_clk_init(void)
        }
        curr_prcm_set = prcm;
 
-       propagate_rate(&osc_ck);                /* update main root fast */
-       propagate_rate(&func_32k_ck);           /* update main root slow */
+       recalculate_root_clocks();
 
        printk(KERN_INFO "Clocking rate (Crystal/DPLL/MPU): "
               "%ld.%01ld/%ld/%ld MHz\n",
index 07afa7564ea92631c1df287c27b36eff620f72ea..b7faf9d3345012ecc2027363ce93ebf54c69401f 100644 (file)
@@ -592,7 +592,8 @@ static struct clk func_32k_ck = {
        .name           = "func_32k_ck",
        .rate           = 32000,
        .flags          = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X |
-                               RATE_FIXED | ALWAYS_ENABLED,
+                               RATE_FIXED | ALWAYS_ENABLED | RATE_PROPAGATES,
+       .recalc         = &propagate_rate,
 };
 
 /* Typical 12/13MHz in standalone mode, will be 26Mhz in chassis mode */
@@ -601,6 +602,7 @@ static struct clk osc_ck = {                /* (*12, *13, 19.2, *26, 38.4)MHz */
        .rate           = 26000000,             /* fixed up in clock init */
        .flags          = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X |
                                RATE_FIXED | RATE_PROPAGATES,
+       .recalc         = &propagate_rate,
 };
 
 /* With out modem likely 12MHz, with modem likely 13MHz */
index 20a789df60df5155a8880dbd6bafc3e014f40474..08c1ce2f2e9081da4f18edfd84cb8c9685fa163e 100644 (file)
@@ -312,6 +312,23 @@ void propagate_rate(struct clk * tclk)
        }
 }
 
+/**
+ * recalculate_root_clocks - recalculate and propagate all root clocks
+ *
+ * Recalculates all root clocks (clocks with no parent), which if the
+ * clock's .recalc is set correctly, should also propagate their rates.
+ * Called at init.
+ */
+void recalculate_root_clocks(void)
+{
+       struct clk *clkp;
+
+       list_for_each_entry(clkp, &clocks, node) {
+               if (unlikely(!clkp->parent) && likely((u32)clkp->recalc))
+                       clkp->recalc(clkp);
+       }
+}
+
 int clk_register(struct clk *clk)
 {
        if (clk == NULL || IS_ERR(clk))
index 2aeca561c66a851cab7466ccf752823352e1b164..a36ef29b8f76e72221b1c307aebdde19a40f9487 100644 (file)
@@ -57,6 +57,7 @@ extern int clk_init(struct clk_functions * custom_clocks);
 extern int clk_register(struct clk *clk);
 extern void clk_unregister(struct clk *clk);
 extern void propagate_rate(struct clk *clk);
+extern void recalculate_root_clocks(void);
 extern void followparent_recalc(struct clk * clk);
 extern void clk_allow_idle(struct clk *clk);
 extern void clk_deny_idle(struct clk *clk);