Message ID | 1465808880-12332-1-git-send-email-neidhard.kim@lge.com (mailing list archive) |
---|---|
State | Rejected, archived |
Delegated to: | Stephen Boyd |
Headers | show |
On 06/13, Jongsung Kim wrote: > Without CLK_SET_RATE_PARENT-flag set, clk_factor_round_rate() just > returns the current frequency. A fixed-factor-clock initialzed via > of_fixed_factor_clk_set() (ie, by device-tree) can't have the flag > set. It can be problematic when the parent of a fixed-factor-clock > is rate-controllable clk, because the rounding can't be propagated > to parent, the rounded target frequency is always the current, and > finally the frequency can't be changed. > > This patch sets the flags CLK_SET_RATE_PARENT for all fixed-factor- > clocks, from clk_register_fixed_factor(), and removes checking the > flag from clk_factor_round_rate(). > > Signed-off-by: Jongsung Kim <neidhard.kim@lge.com> > --- Hmm there's another patch for the same problem from Maxime[1] Mike replied there and said that it's worrisome to do this for all users of fixed factors clks, so perhaps you can set this flag when you register the clk instead? Or prove that all the users of this code in mainline are ok to change behavior. [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2016-May/429726.html
diff --git a/drivers/clk/clk-fixed-factor.c b/drivers/clk/clk-fixed-factor.c index 75cd6c7..9568306 100644 --- a/drivers/clk/clk-fixed-factor.c +++ b/drivers/clk/clk-fixed-factor.c @@ -38,13 +38,10 @@ static long clk_factor_round_rate(struct clk_hw *hw, unsigned long rate, unsigned long *prate) { struct clk_fixed_factor *fix = to_clk_fixed_factor(hw); + unsigned long best_parent; - if (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) { - unsigned long best_parent; - - best_parent = (rate / fix->mult) * fix->div; - *prate = clk_hw_round_rate(clk_hw_get_parent(hw), best_parent); - } + best_parent = (rate / fix->mult) * fix->div; + *prate = clk_hw_round_rate(clk_hw_get_parent(hw), best_parent); return (*prate / fix->div) * fix->mult; } @@ -88,7 +85,7 @@ struct clk_hw *clk_hw_register_fixed_factor(struct device *dev, init.name = name; init.ops = &clk_fixed_factor_ops; - init.flags = flags | CLK_IS_BASIC; + init.flags = flags | CLK_IS_BASIC | CLK_SET_RATE_PARENT; init.parent_names = &parent_name; init.num_parents = 1;
Without CLK_SET_RATE_PARENT-flag set, clk_factor_round_rate() just returns the current frequency. A fixed-factor-clock initialzed via of_fixed_factor_clk_set() (ie, by device-tree) can't have the flag set. It can be problematic when the parent of a fixed-factor-clock is rate-controllable clk, because the rounding can't be propagated to parent, the rounded target frequency is always the current, and finally the frequency can't be changed. This patch sets the flags CLK_SET_RATE_PARENT for all fixed-factor- clocks, from clk_register_fixed_factor(), and removes checking the flag from clk_factor_round_rate(). Signed-off-by: Jongsung Kim <neidhard.kim@lge.com> --- drivers/clk/clk-fixed-factor.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)