Dne petek, 05. maj 2023 ob 13:25:47 CEST je Maxime Ripard napisal(a): > The Allwinner sun6i RTC clock implements a mux with a set_parent hook, > but doesn't provide a determine_rate implementation. > > This is a bit odd, since set_parent() is there to, as its name implies, > change the parent of a clock. However, the most likely candidates to > trigger that parent change are either the assigned-clock-parents device > tree property or a call to clk_set_rate(), with determine_rate() > figuring out which parent is the best suited for a given rate. > > The other trigger would be a call to clk_set_parent(), but it's far less > used, and it doesn't look like there's any obvious user for that clock. > > Similarly, it doesn't look like the device tree using that clock driver > uses any of the assigned-clock properties on that clock. > > So, the set_parent hook is effectively unused, possibly because of an > oversight. However, it could also be an explicit decision by the > original author to avoid any reparenting but through an explicit call to > clk_set_parent(). > > The latter case would be equivalent to setting the determine_rate > implementation to clk_hw_determine_rate_no_reparent(). Indeed, if no > determine_rate implementation is provided, clk_round_rate() (through > clk_core_round_rate_nolock()) will call itself on the parent if > CLK_SET_RATE_PARENT is set, and will not change the clock rate > otherwise. > > And if it was an oversight, then we are at least explicit about our > behavior now and it can be further refined down the line. > > Cc: Alessandro Zummo <a.zummo@xxxxxxxxxxxx> > Cc: Alexandre Belloni <alexandre.belloni@xxxxxxxxxxx> > Cc: Chen-Yu Tsai <wens@xxxxxxxx> > Cc: Jernej Skrabec <jernej.skrabec@xxxxxxxxx> > Cc: Samuel Holland <samuel@xxxxxxxxxxxx> > Cc: linux-arm-kernel@xxxxxxxxxxxxxxxxxxx > Cc: linux-rtc@xxxxxxxxxxxxxxx > Cc: linux-sunxi@xxxxxxxxxxxxxxx > Signed-off-by: Maxime Ripard <maxime@xxxxxxxxxx> Acked-by: Jernej Skrabec <jernej.skrabec@xxxxxxxxx> Best regards, Jernej > --- > drivers/rtc/rtc-sun6i.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c > index dc76537f1b62..71548dd59a3a 100644 > --- a/drivers/rtc/rtc-sun6i.c > +++ b/drivers/rtc/rtc-sun6i.c > @@ -214,6 +214,7 @@ static int sun6i_rtc_osc_set_parent(struct clk_hw *hw, > u8 index) > > static const struct clk_ops sun6i_rtc_osc_ops = { > .recalc_rate = sun6i_rtc_osc_recalc_rate, > + .determine_rate = clk_hw_determine_rate_no_reparent, > > .get_parent = sun6i_rtc_osc_get_parent, > .set_parent = sun6i_rtc_osc_set_parent,