On Tue, Oct 12, 2021 at 11:08 PM Emil Renner Berthing <kernel@xxxxxxxx> wrote: > On Tue, 12 Oct 2021 at 17:40, Andy Shevchenko <andy.shevchenko@xxxxxxxxx> wrote: > > On Tue, Oct 12, 2021 at 4:42 PM Emil Renner Berthing <kernel@xxxxxxxx> wrote: ... > > > + value |= readl_relaxed(reg) & ~mask; > > > > value is not masked, is it okay? > > > > Usual pattern for this kind of operations is > > > > value = (current & ~mask) | (value & mask); > > This function is only ever called with constants, already masked > values or the parent number from the clk framework, so it should be > ok. Up to you, but I think it's better to have a usual pattern. > > > + writel_relaxed(value, reg); ... > > > + rate = parent / div; > > > + if (rate < req->min_rate && div > 1) { > > > + div -= 1; > > > + rate = parent / div; > > > + } > > > > Seems like homegrown DIV_ROUND_UP() or so. Who will guarantee that > > decreasing div by 1 will satisfy the conditional again? > > Maths unless I'm mistaken: div = DIV_ROUND_UP(parent, target), so in > rational numbers > div - 1 < parent / target > But the target is clamped by min_rate and max_rate, so > min_rate <= target < parent / (div - 1) = rate > > Sorry, re-using the rate varable for both the target and result is > confusing. I'll fix that. Also needs a comment, I believe. ... > > > +#ifdef CONFIG_DEBUG_FS > > > > Perhaps __maybe_unused? > > I can definitely use __maybe_unused for the function declaration, but > then I'll need a conditional every time clk_ops.debug_init needs to be > initialized to either the function or NULL depending on > CONFIG_DEBUG_FS below. Is that better? Actually, why can't you always initialize the field? Shouldn't CLK core take care about this conditional? > > > +#else > > > +#define jh7100_clk_debug_init NULL > > > +#endif ... > > > + while (idx > 0) > > > + clk_hw_unregister(&priv->reg[--idx].hw); > > > > The > > > > while (idx--) > > clk_hw_unregister(&priv->reg[idx].hw); > > > > is slightly better to read. > > It's not something I'll insist hard on, but I must admit I disagree. > To me the above looks like cartoon characters running off a cliff and > back. As a middle ground could we maybe do this? > > while (idx) > clk_hw_unregister(&priv->reg[--idx].hw); My point is exactly in having the common pattern for error paths, i.e. while (counter--) ...bla-bla-bla... Your second approach is better, but I think that proposed by me is even better. ... > > > +subsys_initcall(clk_starfive_jh7100_init); > > > > Any explanation why subsys_initcall() is in use? > > TBH I just inherited that from Geert's first mock driver and never > thought to question it. What would be a better alternative to try? At least add a comment to explain the choice. -- With Best Regards, Andy Shevchenko