On Tue, Feb 20, 2024 at 5:04 AM Krzysztof Kozlowski <krzysztof.kozlowski@xxxxxxxxxx> wrote: > > On 16/02/2024 23:32, Sam Protsenko wrote: > > Abstract CPU clock registers by keeping their offsets in a dedicated > > chip specific structure to accommodate for oncoming Exynos850 support, > > which has different offsets for cluster 0 and cluster 1. This rework > > also makes it possible to use exynos_set_safe_div() for all chips, so > > exynos5433_set_safe_div() is removed here to reduce the code > > duplication. > > > > So that's the answer why you could not use flags anymore - you need an > enum, not a bitmap. Such short explanation should be in previous commits > justifying moving reg layout to new property. Will do, thanks. > > > No functional change. > > > > Signed-off-by: Sam Protsenko <semen.protsenko@xxxxxxxxxx> > > --- > > drivers/clk/samsung/clk-cpu.c | 156 +++++++++++++++++++--------------- > > 1 file changed, 86 insertions(+), 70 deletions(-) > > > > diff --git a/drivers/clk/samsung/clk-cpu.c b/drivers/clk/samsung/clk-cpu.c > > index 04394d2166c9..744b609c222d 100644 > > --- a/drivers/clk/samsung/clk-cpu.c > > +++ b/drivers/clk/samsung/clk-cpu.c > > @@ -44,12 +44,14 @@ typedef int (*exynos_rate_change_fn_t)(struct clk_notifier_data *ndata, > > > > /** > > * struct exynos_cpuclk_chip - Chip specific data for CPU clock > > + * @regs: register offsets for CPU related clocks > > * @pre_rate_cb: callback to run before CPU clock rate change > > * @post_rate_cb: callback to run after CPU clock rate change > > */ > > struct exynos_cpuclk_chip { > > - exynos_rate_change_fn_t pre_rate_cb; > > - exynos_rate_change_fn_t post_rate_cb; > > + const void * const regs; > > Why this is void? > Different chips can have very different register layout. For example, older Exynos chips usually keep multiple CPU divider ratios in one single register, whereas more modern chips have a dedicated register for each divider clock. Also, old chips usually split divider ratio vs DIV clock status between different registers, but in modern chips they both live in one single register. Having (void *) makes it possible to keep pointers to different structures, and each function for the particular chip can "know" which exactly structure is stored there, casting (void *) to a needed type. Another way to do that would be to have "one-size-fits-all" structure with all possible registers for all possible chips. I don't know, I just didn't like that for a couple of reasons, so decided to go with (void *). I'll add some explanation in the commit message in v2. > > + exynos_rate_change_fn_t pre_rate_cb; > > + exynos_rate_change_fn_t post_rate_cb; > > }; > > > > > > Best regards, > Krzysztof >