[PATCH] clk: fix clk_round_rate() behaviour

Denis Orlov denorl2009 at gmail.com
Mon May 16 00:00:49 PDT 2022

Right now this function returns the current rate of the clock in the
case when the round_rate() is not given in the clock's ops. This breaks
clk_set_rate(), which calls clk_round_rate() to check if the resulting
frequency would be the same as the one that is already set.
Make it so that clk_round_rate() returns the frequency that was given as
argument in this case.

Signed-off-by: Denis Orlov <denorl2009 at gmail.com>
 drivers/clk/clk.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 52e309e877..7492717d3c 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -139,16 +139,16 @@ long clk_round_rate(struct clk *clk, unsigned long rate)
 	if (IS_ERR(clk))
 		return 0;
+	if (!clk->ops->round_rate)
+		return rate;
 	parent = clk_get_parent(clk);
 	if (parent)
 		parent_rate = clk_get_rate(parent);
 	hw = clk_to_clk_hw(clk);
-	if (clk->ops->round_rate)
-		return clk->ops->round_rate(hw, rate, &parent_rate);
-	return clk_get_rate(clk);
+	return clk->ops->round_rate(hw, rate, &parent_rate);
 long clk_hw_round_rate(struct clk_hw *hw, unsigned long rate)

More information about the barebox mailing list