Re: [PATCH 4/4] clk: Warn if we register a mux without determine_rate

Stephen Boyd
2022-10-26T02:08:06Z

Quoting Maxime Ripard (2022-10-18 06:52:59)
> The determine_rate hook allows to select the proper parent and its rate
> for a given clock configuration. On another hand, set_parent is there to
> change the parent of a mux.
>
> Some clocks provide a set_parent hook but don't implement
> determine_rate. In such a case, set_parent is pretty much useless since
> the clock framework will always assume the current parent is to be used,
> and we will thus never change it.
>
> This situation can be solved in two ways:
> - either we don't need to change the parent, and we thus shouldn't
> implement set_parent;
> - or we don't want to change the parent, in this case we should set
> CLK_SET_RATE_NO_REPARENT;
> - or we're missing a determine_rate implementation.
>
> The latter is probably just an oversight from the driver's author, and
> we should thus raise their awareness about the fact that the current
> state of the driver is confusing.

There is another case which is a leaf clk that is a mux where you only
expect clk_set_parent() to be used, and not clk_set_rate(). This use
case is odd though, so I'm not sure how much we care.

>
> It's not clear at this point how many drivers are affected though, so
> let's make it a warning instead of an error for now.
>
> Signed-off-by: Maxime Ripard <maxime@cerno.tech>
> ---
> drivers/clk/clk.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
> index 57b83665e5c3..11c41d987ff4 100644
> --- a/drivers/clk/clk.c
> +++ b/drivers/clk/clk.c
> @@ -3700,6 +3700,11 @@ static int __clk_core_init(struct clk_core *core)
> goto out;
> }
>
> + /* TODO: Promote to an error */

The documentation should be updated in this patch (see the table of
hardware characteristics in Documentation/driver-api/clk.rst).

> + if (core->ops->set_parent && !core->ops->determine_rate)
> + pr_warn("%s: %s must implement .set_parent & .determine_rate\n",

You can grep for it:

$ git grep -W 'struct clk_ops .*='

but I'm fairly certain a coccinelle script can detect most of these
because clk_ops are usually statically defined (although not always).

Either way I already see that 'owl_comp_div_ops' will trigger this
warning. And 'at91sam9x5_smd_ops' looks even more likely. Given that I'm
not super keen on applying this patch.