Hi Maxime, On 17/12/2024 at 13:47:53 +01, Maxime Ripard <mripard@xxxxxxxxxx> wrote: > On Thu, Nov 21, 2024 at 06:41:14PM +0100, Miquel Raynal wrote: >> There are mainly two ways to change a clock frequency. > > There's much more than that :) "mainly" Or maybe I should have added "on purpose". > > Off the top of my head, setting/clearing a min/max rate and changing the > parent might also result in a rate change. > > And then, the firmware might get involved too. > >> The active way requires calling ->set_rate() in order to ask "on >> purpose" for a frequency change. Otherwise, a clock can passively see >> its frequency being updated depending on upstream clock frequency >> changes. In most cases it is fine to just accept the new upstream >> frequency - which by definition will have an impact on downstream >> frequencies if we do not recalculate internal divisors. But there are >> cases where, upon an upstream frequency change, we would like to >> maintain a specific rate. > > Why is clk_set_rate_exclusive not enough? I am trying to protect these rate changes from subtree walks, I don't see where setting an exclusive rate would have an effect? But I might be overlooking something, definitely. ... >> @@ -2272,7 +2271,13 @@ static void clk_calc_subtree(struct clk_core *core) >> { >> struct clk_core *child; >> >> - core->new_rate = clk_recalc(core, core->parent->new_rate); >> + if (core->flags & CLK_NO_RATE_CHANGE_DURING_PROPAGATION) { >> + core->new_rate = clk_determine(core, core->rate); >> + if (!core->new_rate) >> + core->new_rate = clk_recalc(core, core->parent->new_rate); >> + } else { >> + core->new_rate = clk_recalc(core, core->parent->new_rate); >> + } > > Sorry, it's not clear to me how it works. How will the parent clocks > will get notified to adjust their dividers in that scenario? Also, what > if they can't? The idea is: if the flag is set, instead of accepting the new upstream rate and recalculate the downstream rate based on a previously set divider value, we change our divider value to match the same frequency as before. But if we cannot, then we just keep the old way. Cheers, Miquèl