RE: [PATCH v7 06/10] clk: Add Sunplus SP7021 clock driver

From: qinjian[覃健]
Date: Mon Jan 10 2022 - 01:51:35 EST


> > > > +
> > > > +CLK_OF_DECLARE_DRIVER(sp_clkc, "sunplus,sp7021-clkc", sp_clk_setup);
> > >
> > > Why CLK_OF_DECLARE_DRIVER? There should be a comment but better would be
> > > to make a platform driver instead. If the platform driver can't be used,
> > > we need to know what other device driver is probing based on this clkc
> > > compatible string.
> >
> > Dear Stephen,
> >
> > Sorry, I don't understand your comment.
> > Did you mean, like below:
> >
> > static int sp7021_clk_probe(struct platform_device *pdev)
> > {
> > ......
> > sp_clk_data->num = CLK_MAX;
> > return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, sp_clk_data);
> > }
> >
> > static const struct of_device_id sp7021_clk_dt_ids[] = {
> > { .compatible = "sunplus,sp7021-clkc", },
> > { }
> > };
> > MODULE_DEVICE_TABLE(of, sp7021_clk_dt_ids);
> >
> > static struct platform_driver sp7021_clk_driver = {
> > .probe = sp7021_clk_probe,
> > .driver = {
> > .name = "sp7021-clk",
> > .of_match_table = sp7021_clk_dt_ids,
> > },
> > };
> > builtin_platform_driver(sp7021_clk_driver);
> >
> >
> > But, It's doesn't work.
>
> Why doesn't it work?
>
> > Most other clk drivers used CLK_OF_DECLARE_DRIVER or CLK_OF_DECLARE.
> > I just take these as the reference and it's working.
>
> CLK_OF_DECLARE is for clks that need to be registered so the main
> irqchip and/or clocksource/clockevent can operate properly.
> CLK_OF_DECLARE_DRIVER is for the case that there's another driver that
> will attach to the device node that has the compatible string.

After some trace, I found:
In our dts, 'clkc' node defined @ clocks:
clocks {
...
clkc: clock-controller@9c000000 {
#clock-cells = <1>;
compatible = "sunplus,sp7021-clkc";
reg = <0x9c000000 0x280>; // G0:CLKEN ~ G4:PLL
clocks = <&extclk>, <&clkc PLL_SYS>;
clock-names = "extclk", "pllsys";
};
};
soc {
...
}
In this case, clk driver write as platform driver not work (sp7021_clk_probe not called)
But, CLK_OF_DECLARE and CLK_OF_DECLARE_DRIVER both worked (called from clk_of_init)

Then, I move the 'clkc' mode from 'clocks' to 'soc':
clocks {
...
};
soc {
...
clkc: clock-controller@9c000000 {
#clock-cells = <1>;
compatible = "sunplus,sp7021-clkc";
reg = <0x9c000000 0x280>; // G0:CLKEN ~ G4:PLL
clocks = <&extclk>, <&clkc PLL_SYS>;
clock-names = "extclk", "pllsys";
};
}
In this case, clk driver write as platform driver worked (called from platform_probe)
CLK_OF_DECLARE and CLK_OF_DECLARE_DRIVER also both worked. (still called from clk_of_init, more early than platform_probe)

It looks like CLK_OF_DECLARE/CLK_OF_DECLARE_DRIVER is better than platform driver.
Why you prefer platform driver?