]> git.dujemihanovic.xyz Git - linux.git/commitdiff
clk: Skip clamping when rounding if there's no boundaries
authorMaxime Ripard <maxime@cerno.tech>
Tue, 16 Aug 2022 11:25:08 +0000 (13:25 +0200)
committerStephen Boyd <sboyd@kernel.org>
Thu, 15 Sep 2022 16:30:23 +0000 (09:30 -0700)
Commit 948fb0969eae ("clk: Always clamp the rounded rate") recently
started to clamp the request rate in the clk_rate_request passed as an
argument of clk_core_determine_round_nolock() with the min_rate and
max_rate fields of that same request.

While the clk_rate_requests created by the framework itself always have
those fields set, some drivers will create it themselves and don't
always fill min_rate and max_rate.

In such a case, we end up clamping the rate with a minimum and maximum
of 0, thus always rounding the rate to 0.

Let's skip the clamping if both min_rate and max_rate are set to 0 and
complain so that it gets fixed.

Fixes: 948fb0969eae ("clk: Always clamp the rounded rate")
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Link: https://lore.kernel.org/r/20220816112530.1837489-4-maxime@cerno.tech
Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
Tested-by: Naresh Kamboju <naresh.kamboju@linaro.org>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
drivers/clk/clk.c

index a5e0ab8bd6be1c65bc994aface993626c539e62d..9d63163244d4601ecd11d9c5d030da644aaf7661 100644 (file)
@@ -1341,7 +1341,19 @@ static int clk_core_determine_round_nolock(struct clk_core *core,
        if (!core)
                return 0;
 
-       req->rate = clamp(req->rate, req->min_rate, req->max_rate);
+       /*
+        * Some clock providers hand-craft their clk_rate_requests and
+        * might not fill min_rate and max_rate.
+        *
+        * If it's the case, clamping the rate is equivalent to setting
+        * the rate to 0 which is bad. Skip the clamping but complain so
+        * that it gets fixed, hopefully.
+        */
+       if (!req->min_rate && !req->max_rate)
+               pr_warn("%s: %s: clk_rate_request has initialized min or max rate.\n",
+                       __func__, core->name);
+       else
+               req->rate = clamp(req->rate, req->min_rate, req->max_rate);
 
        /*
         * At this point, core protection will be disabled