summaryrefslogtreecommitdiff
path: root/drivers/clk/clk.c
diff options
context:
space:
mode:
authorStephen Boyd <sboyd@kernel.org>2022-04-02 19:28:18 -0700
committerStephen Boyd <sboyd@kernel.org>2022-04-02 19:28:53 -0700
commit859c2c7b1d0623a6f523f970043db85ce0e5aa60 (patch)
tree71ba7680a5fa02d3778e2a62a754950db48c73c5 /drivers/clk/clk.c
parentcf683abd3913d5e6e51169de75d65ea193452fbd (diff)
Revert "clk: Drop the rate range on clk_put()"
This reverts commit 7dabfa2bc4803eed83d6f22bd6f045495f40636b. There are multiple reports that this breaks boot on various systems. The common theme is that orphan clks are having rates set on them when that isn't expected. Let's revert it out for now so that -rc1 boots. Reported-by: Marek Szyprowski <m.szyprowski@samsung.com> Reported-by: Tony Lindgren <tony@atomide.com> Reported-by: Alexander Stein <alexander.stein@ew.tq-group.com> Reported-by: Naresh Kamboju <naresh.kamboju@linaro.org> Link: https://lore.kernel.org/r/366a0232-bb4a-c357-6aa8-636e398e05eb@samsung.com Cc: Maxime Ripard <maxime@cerno.tech> Signed-off-by: Stephen Boyd <sboyd@kernel.org> Link: https://lore.kernel.org/r/20220403022818.39572-1-sboyd@kernel.org
Diffstat (limited to 'drivers/clk/clk.c')
-rw-r--r--drivers/clk/clk.c42
1 files changed, 14 insertions, 28 deletions
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 07a27b65b773..ed119182aa1b 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -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);