Hi Geert, Thanks for your review. On Thursday, September 06, 2018, Geert Uytterhoeven wrote: > > +#define CPG_FRQCR 0x00 > > +#define CPG_CKIOSEL 0xF0 > > +#define CPG_SCLKSEL 0xF4 > > The last two are unused? In this driver they are not. I can remove them. > > + > > +#define PORTL_PIDR 0xFCFFE074 > > Unused? Oops. That was left over from when I first was reading the port pin to find out the mode. But then I realize I could get the info from DT. > > > +static u8 cpg_mode; > > + > > +/* Internal Clock ratio table */ > > +static const unsigned int ratio_tab[5][5] = { > > + /* I, G, B, P1, P0 */ > > Use a struct instead? > > struct { > unsigned int i; > unsigned int g; > unsigned int ib > unsigned int p1; > unsigned int p0; > } ratio_tab[5] = { ... } That's a good idea. Thanks. > > > + { 2, 4, 8, 16, 32 }, /* FRQCR = 0x012 */ > > + { 4, 4, 8, 16, 32 }, /* FRQCR = 0x112 */ > > + { 8, 4, 8, 16, 32 }, /* FRQCR = 0x212 */ > > + { 16, 8, 16, 16, 32 }, /* FRQCR = 0x322 */ > > + { 16, 16, 32, 32, 32 }, /* FRQCR = 0x333 */ > > The P0 divider is fixed to 32, so you can remove it from the table? OK, I can do that. I was just doing it to be consistent. > > + /* Internal Core Clocks */ > > + CLK_MAIN, > > + CLK_PLL, > > + CLK_I, > > + CLK_G, > > + CLK_B, > > + CLK_P1, > > + CLK_P1C, > > + CLK_P0, > > The last six are not used and can be removed > (the driver uses R7S9210_CLK_* instead). OK. > > +static const struct mssr_mod_clk r7s9210_mod_clks[] __initconst = { > > + DEF_MOD_STB("ostm0", 36, R7S9210_CLK_P1C), > > + DEF_MOD_STB("ostm1", 35, R7S9210_CLK_P1C), > > + DEF_MOD_STB("ostm2", 34, R7S9210_CLK_P1C), > > I think the table is easier to read if you sort by MSTP number. OK. I will switch them all around. > > + /* Adjust the dividers based on the current FRQCR setting */ > > + if (core->id == CLK_MAIN) { > > + > > + /* If EXTAL is above 12MHz, then we know it is Mode 1 */ > > + if (clk_get_rate((struct clk *)parent) > 12000000) > > Why the cast? I was getting compiler warning because parent was const. const struct clk *parent; ../drivers/clk/renesas/r7s9210-cpg-mssr.c:144:20: warning: passing argument 1 of ‘clk_get_rate’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] if (clk_get_rate(parent) > 12000000) ^ In file included from ../drivers/clk/renesas/r7s9210-cpg-mssr.c:12:0: ../include/linux/clk.h:463:15: note: expected ‘struct clk *’ but argument is of type ‘const struct clk *’ unsigned long clk_get_rate(struct clk *clk); ^ make[1]: Leaving directory '/home/renesas/tools/upstream/renesas-drivers/.out_rza2m' I can remove const, then I don't need the cast anymore. > > + /* Module Clocks */ > > + .mod_clks = r7s9210_mod_clks, > > + .num_mod_clks = ARRAY_SIZE(r7s9210_mod_clks), > > + .num_hw_mod_clks = 11 * 32, /* includes STBCR0/1/2 which don't > exist */ > > According to the HW manual, STBCR1/2 do not exist? The problem is that there are registers named "STBCR1" and "STBCR2", but they are not pure MSTP registers, and they sit at a different address location. Would it be better if I say the MSTP registers start at STBCR3, and just subtract "30" from the numbers in the device tree? > > +static const u16 stbcr[] = { > > + 0x000, 0x000, 0x014, 0x410, 0x414, 0x418, 0x41C, 0x420, > > stbcr[1] should be 0x010? Technically, stbcr[0] = 0x10, stbcr[1] = 0x14, I was just thinking that I would never be access it anyway since they are not really MSTP registers. > > > + 0x424, 0x428, 0x42C, 0x430, 0x434, 0x460, > > The last 3 don't exist? Opps, you're right! They are left over from when I change the table around. Thanks. > > + } else { > > + idx = MOD_CLK_PACK_10(clkidx); > > MOD_CLK_PACK() Good find! I would have broken existing drivers! > > +#ifdef CONFIG_CLK_R7S9210 > > + { > > + .compatible = "renesas,r7s9210-cpg-mssr", > > + .data = &r7s9210_cpg_mssr_info, > > + }, > > Please preserve sort order. > > extern const struct cpg_mssr_info r8a77980_cpg_mssr_info; > > extern const struct cpg_mssr_info r8a77990_cpg_mssr_info; > > extern const struct cpg_mssr_info r8a77995_cpg_mssr_info; > > +extern const struct cpg_mssr_info r7s9210_cpg_mssr_info; > > Please preserve sort order. OK > > +/* R7S9210 CPG Core Clocks */ > > +#define R7S9210_CLK_PLL 0 > > Should that be an internal clock, not referred to from DT? > There's already the internal CLK_PLL clock. OK, I see what you mean. I will leave it out of this header file. > > +#define R7S9210_CLK_I 1 > > +#define R7S9210_CLK_G 2 > > +#define R7S9210_CLK_B 3 > > +#define R7S9210_CLK_P1 4 > > +#define R7S9210_CLK_P1C 5 > > +#define R7S9210_CLK_P0 6 > > The comment in Figure 6.1 suggests there's also P0C, but that may be a > mistake, as I can find no other references to it? Funny, I didn't see that in there before. Like you said, it's probably just a mistake. I'll point that out to the device team. > What about other clocks: BSCCLK, OCTCLK, HYPCLK, and SPICLK? At this time, I'm considering them 'out of scope' from this driver as they really need to be set up early in device boot (ie, u-boot). Unless you were just thinking of adding them as #defines, but never really using them. Chris