Revert "clk: Drop the rate range on clk_put()"
[linux-2.6-microblaze.git] / drivers / clk / clk.c
index 07a27b6..ed11918 100644 (file)
@@ -2332,15 +2332,19 @@ int clk_set_rate_exclusive(struct clk *clk, unsigned long rate)
 }
 EXPORT_SYMBOL_GPL(clk_set_rate_exclusive);
 
-static int clk_set_rate_range_nolock(struct clk *clk,
-                                    unsigned long min,
-                                    unsigned long max)
+/**
+ * clk_set_rate_range - set a rate range for a clock source
+ * @clk: clock source
+ * @min: desired minimum clock rate in Hz, inclusive
+ * @max: desired maximum clock rate in Hz, inclusive
+ *
+ * Returns success (0) or negative errno.
+ */
+int clk_set_rate_range(struct clk *clk, unsigned long min, unsigned long max)
 {
        int ret = 0;
        unsigned long old_min, old_max, rate;
 
-       lockdep_assert_held(&prepare_lock);
-
        if (!clk)
                return 0;
 
@@ -2353,6 +2357,8 @@ static int clk_set_rate_range_nolock(struct clk *clk,
                return -EINVAL;
        }
 
+       clk_prepare_lock();
+
        if (clk->exclusive_count)
                clk_core_rate_unprotect(clk->core);
 
@@ -2396,28 +2402,6 @@ out:
        if (clk->exclusive_count)
                clk_core_rate_protect(clk->core);
 
-       return ret;
-}
-
-/**
- * clk_set_rate_range - set a rate range for a clock source
- * @clk: clock source
- * @min: desired minimum clock rate in Hz, inclusive
- * @max: desired maximum clock rate in Hz, inclusive
- *
- * Return: 0 for success or negative errno on failure.
- */
-int clk_set_rate_range(struct clk *clk, unsigned long min, unsigned long max)
-{
-       int ret;
-
-       if (!clk)
-               return 0;
-
-       clk_prepare_lock();
-
-       ret = clk_set_rate_range_nolock(clk, min, max);
-
        clk_prepare_unlock();
 
        return ret;
@@ -4419,7 +4403,9 @@ void __clk_put(struct clk *clk)
        }
 
        hlist_del(&clk->clks_node);
-       clk_set_rate_range_nolock(clk, 0, ULONG_MAX);
+       if (clk->min_rate > clk->core->req_rate ||
+           clk->max_rate < clk->core->req_rate)
+               clk_core_set_rate_nolock(clk->core, clk->core->req_rate);
 
        owner = clk->core->owner;
        kref_put(&clk->core->ref, __clk_release);