Quoting Maxime Ripard (2022-01-14 08:15:56) > On Thu, Jan 13, 2022 at 01:44:25PM -0800, Stephen Boyd wrote: > > > > > I don't see a problem with re-evaluating the rate every time we call > > clk_set_rate_range(). That's probably the bug that I can't recall. Can > > you fix the API so it works that way? > > Yep, I'll work on it next week. I started to think about it this week, > and there's two things I'm not entirely sure about: > > - Keeping the clock at its minimum rate is essentially policy. Do we > want to guard that behavior by a flag, and do we want to do the same > thing if we want to max it? The policy should be to re-evaluate the rate based on constraints each time the constraints or rate is changed. The clk provider can decide if it wants to max it out or keep it minimized in the determine_rate clk_op. If you're worried about breaking somebody, there's only one other user I see in the tree, Tegra, so the risk seems low. If Tegra is relying on the existing behavior (very possible) then we can hopefully change that clk provider to keep the rate where it is if it's within the constraints vs. round it down to the minimum acceptable. > > - How should we deal with a clk_set_rate call while we have a range? > Something like: > > clk_set_min_rate(hdmi1_clk, 1000); > clk_set_min_rate(hdmi2_clk, 2000) > clk_set_rate(hdmi1_clk, 3000); > clk_drop_range(hdmi2_clk); > > If we just try to minimize the rate all the time, we'll set the rate > back to 1000Hz, but I think it would make more sense to keep the > rate at 3000? This assumes the rate after clk_set_rate() is 3000. It all depends on the provider what the rate actually is. > > Maybe we can test if the range is still at the boundary we remove, > and only if it is, drop it to whatever boundary we have left? > >From the consumer API perspective it looks like hdmi1 is saying it can accept a frequency as low as 1000 but would like 3000. The clk provider will look at the constraints and decide to try to get close to 3000, or exceed 3000, or set it lower than 3000 but not lower than 2000. I don't want to enforce anything in the framework here. Let the clk provider decide what frequency it should set the rate to based on the constraints. When there are constraints mixed with a clk_set_rate() we should give the provider all the facts, i.e. the rate and the constraints and let it decide what to do.