]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/arm/plat-omap/clock.c
OMAP clock: move rate recalc, propagation code up to plat-omap/clock.c
[linux-2.6-omap-h63xx.git] / arch / arm / plat-omap / clock.c
index d13acd2e57bf0d1d6aee4a14e6700e2e056a0e68..9f458cbaa413e51ffd7c42a26b505b39816d673d 100644 (file)
@@ -183,8 +183,16 @@ int clk_set_rate(struct clk *clk, unsigned long rate)
                return ret;
 
        spin_lock_irqsave(&clockfw_lock, flags);
-       if (arch_clock->clk_set_rate)
+
+       if (arch_clock->clk_set_rate) {
                ret = arch_clock->clk_set_rate(clk, rate);
+               if (ret == 0) {
+                       (*clk->recalc)(clk);
+                       if (clk->flags & RATE_PROPAGATES)
+                               propagate_rate(clk);
+               }
+       }
+
        spin_unlock_irqrestore(&clockfw_lock, flags);
 
        return ret;
@@ -200,8 +208,16 @@ int clk_set_parent(struct clk *clk, struct clk *parent)
                return ret;
 
        spin_lock_irqsave(&clockfw_lock, flags);
-       if (arch_clock->clk_set_parent)
-               ret =  arch_clock->clk_set_parent(clk, parent);
+
+       if (arch_clock->clk_set_parent) {
+               ret = arch_clock->clk_set_parent(clk, parent);
+               if (ret == 0) {
+                       (*clk->recalc)(clk);
+                       if (clk->flags & RATE_PROPAGATES)
+                               propagate_rate(clk);
+               }
+       }
+
        spin_unlock_irqrestore(&clockfw_lock, flags);
 
        return ret;
@@ -256,8 +272,6 @@ void followparent_recalc(struct clk *clk)
                return;
 
        clk->rate = clk->parent->rate;
-       if (unlikely(clk->flags & RATE_PROPAGATES))
-               propagate_rate(clk);
 }
 
 /* Propagate rate to children */
@@ -271,8 +285,11 @@ void propagate_rate(struct clk * tclk)
        list_for_each_entry(clkp, &clocks, node) {
                if (likely(clkp->parent != tclk))
                        continue;
-               if (likely((u32)clkp->recalc))
+               if (likely((u32)clkp->recalc)) {
                        clkp->recalc(clkp);
+                       if (clkp->flags & RATE_PROPAGATES)
+                               propagate_rate(clkp);
+               }
        }
 }
 
@@ -288,8 +305,11 @@ void recalculate_root_clocks(void)
        struct clk *clkp;
 
        list_for_each_entry(clkp, &clocks, node) {
-               if (unlikely(!clkp->parent) && likely((u32)clkp->recalc))
+               if (unlikely(!clkp->parent) && likely((u32)clkp->recalc)) {
                        clkp->recalc(clkp);
+                       if (clkp->flags & RATE_PROPAGATES)
+                               propagate_rate(clkp);
+               }
        }
 }