]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
sh: clkfwk: Provide a generic clk_set_rate_ex() path for root clocks.
authorPaul Mundt <lethal@linux-sh.org>
Wed, 13 May 2009 08:05:51 +0000 (17:05 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Wed, 13 May 2009 08:05:51 +0000 (17:05 +0900)
In the case of root clocks (such as clkin oscillators, extal, etc.), the
rate information is entirely platform dependent and needs to be lazily
set and propagated from the platform code. This provides a method for
establishing the rate update on these types of clocks that define no
set_rate() op of their own.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/kernel/cpu/clock.c

index 2ced20f870d1c191925da0a06431dc06845fb56c..0a7755cc8a25b25115d755e0bfa5a5a10a41bd66 100644 (file)
@@ -265,20 +265,27 @@ EXPORT_SYMBOL_GPL(clk_set_rate);
 int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id)
 {
        int ret = -EOPNOTSUPP;
+       unsigned long flags;
 
-       if (likely(clk->ops && clk->ops->set_rate)) {
-               unsigned long flags;
+       spin_lock_irqsave(&clock_lock, flags);
 
-               spin_lock_irqsave(&clock_lock, flags);
+       if (likely(clk->ops && clk->ops->set_rate)) {
                ret = clk->ops->set_rate(clk, rate, algo_id);
-               if (ret == 0) {
-                       if (clk->ops->recalc)
-                               clk->rate = clk->ops->recalc(clk);
-                       propagate_rate(clk);
-               }
-               spin_unlock_irqrestore(&clock_lock, flags);
+               if (ret != 0)
+                       goto out_unlock;
+       } else {
+               clk->rate = rate;
+               ret = 0;
        }
 
+       if (clk->ops && clk->ops->recalc)
+               clk->rate = clk->ops->recalc(clk);
+
+       propagate_rate(clk);
+
+out_unlock:
+       spin_unlock_irqrestore(&clock_lock, flags);
+
        return ret;
 }
 EXPORT_SYMBOL_GPL(clk_set_rate_ex);