]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/arm/plat-omap/clock.c
OMAP: dmtimer: enable all timers to be wakeup events
[linux-2.6-omap-h63xx.git] / arch / arm / plat-omap / clock.c
index 6a1737a74477a9c033d9e8bb01aac23bfcc497ce..2e0614552ac89c2d014959d596e43c81f1c62d26 100644 (file)
@@ -76,22 +76,6 @@ out:
 }
 EXPORT_SYMBOL(clk_disable);
 
-int clk_get_usecount(struct clk *clk)
-{
-       unsigned long flags;
-       int ret = 0;
-
-       if (clk == NULL || IS_ERR(clk))
-               return 0;
-
-       spin_lock_irqsave(&clockfw_lock, flags);
-       ret = clk->usecount;
-       spin_unlock_irqrestore(&clockfw_lock, flags);
-
-       return ret;
-}
-EXPORT_SYMBOL(clk_get_usecount);
-
 unsigned long clk_get_rate(struct clk *clk)
 {
        unsigned long flags;
@@ -142,7 +126,7 @@ int clk_set_rate(struct clk *clk, unsigned long rate)
                ret = arch_clock->clk_set_rate(clk, rate);
        if (ret == 0) {
                if (clk->recalc)
-                       clk->recalc(clk);
+                       clk->rate = clk->recalc(clk);
                propagate_rate(clk);
        }
        spin_unlock_irqrestore(&clockfw_lock, flags);
@@ -160,13 +144,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 (ret == 0) {
-               if (clk->recalc)
-                       clk->recalc(clk);
-               propagate_rate(clk);
-       }
+       if (clk->usecount == 0) {
+               if (arch_clock->clk_set_parent)
+                       ret = arch_clock->clk_set_parent(clk, parent);
+               if (ret == 0) {
+                       if (clk->recalc)
+                               clk->rate = clk->recalc(clk);
+                       propagate_rate(clk);
+               }
+       } else
+               ret = -EBUSY;
        spin_unlock_irqrestore(&clockfw_lock, flags);
 
        return ret;
@@ -204,12 +191,9 @@ static int __init omap_clk_setup(char *str)
 __setup("mpurate=", omap_clk_setup);
 
 /* Used for clocks that always have same value as the parent clock */
-void followparent_recalc(struct clk *clk)
+unsigned long followparent_recalc(struct clk *clk)
 {
-       if (clk == NULL || IS_ERR(clk))
-               return;
-
-       clk->rate = clk->parent->rate;
+       return clk->parent->rate;
 }
 
 void clk_reparent(struct clk *child, struct clk *parent)
@@ -230,7 +214,7 @@ void propagate_rate(struct clk * tclk)
 
        list_for_each_entry(clkp, &tclk->children, sibling) {
                if (clkp->recalc)
-                       clkp->recalc(clkp);
+                       clkp->rate = clkp->recalc(clkp);
                propagate_rate(clkp);
        }
 }
@@ -250,7 +234,7 @@ void recalculate_root_clocks(void)
 
        list_for_each_entry(clkp, &root_clks, sibling) {
                if (clkp->recalc)
-                       clkp->recalc(clkp);
+                       clkp->rate = clkp->recalc(clkp);
                propagate_rate(clkp);
        }
 }