Re: [PATCH v2 1/3] clk: Introduce a clock request API

From: Stephen Boyd
Date: Fri Jan 14 2022 - 17:38:50 EST


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.