clk: fix clk_round_rate() behaviour
PATCH 1/1 clk: fix clk_round_rate() behaviour
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.
--- drivers/clk/clk.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/clk/clk.c +4 -4
@@ -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)
Signature · 7 lines
2.20.1 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
Hi Denis,
Quoted 25 lines · Denis Orlov
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 breaksclk_set_rate(), which callsclk_round_rate()to check if the resulting frequency would be the same as the one that is already set. Make it so thatclk_round_rate()returns the frequency that was given as argument in this case.Signed-off-by Denis Orlov <[email protected]>--- drivers/clk/clk.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)drivers/clk/clk.c +3
-0@@ -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)
drivers/clk/clk.c long clk_round_rate(struct clk *clk, unsigned long rate) · line 152
Quoted 10 lines
drivers/clk/clk.c +1
-4parent_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); }
I smell problems with this patch. Which clocks do you have that do not have a round_rate hook but still allow to set its rate?
Sascha
Signature · 9 lines
Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
Hi,
Quoted 2 lines · Sascha Hauer
I smell problems with this patch. Which clocks do you have that do not have a
round_ratehook but still allow to set its rate?
Well, the reason for making this patch was actually the lack of any output from the clk_set_rate command if there was no set_rate (together with round_rate) hook set for a given clock. In this case set_rate() would check round_rate() to be equal to the current rate and leave without returning an error. But I would like to actually receive some response about the fact that this clock does not support setting its rate.
However, I agree with you that this solution may lead to problems. Maybe instead we should explicitly check in a command whether the given clock has an appropriate hook set and output some message if this is not the case. What do you think?
Regards,
Denis
_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox