[v2,1/2] clk: Hi3660: change to register crgctrl clock with CLK_OF_DECLARE_DRIVER

Message ID 1495072247-25217-2-git-send-email-leo.yan@linaro.org
State New
Headers show
Series
  • [v2,1/2] clk: Hi3660: change to register crgctrl clock with CLK_OF_DECLARE_DRIVER
Related show

Commit Message

Leo Yan May 18, 2017, 1:50 a.m.
The timer will register into system at very early phase at kernel boot;
if timer needs to use clock, the clock should be get ready in function
of_clk_init() so later the timer driver probe can retrieve clock
successfully. This is finished in below flow on arm64:

  start_kernel()
    `-> time_init()
          `-> of_clk_init(NULL)    => register timer's clock
          `-> clocksource_probe()  => register timer

On Hi3660 the sp804 timer uses clock "osc32k", this clock is registered
as platform driver rather than CLK_OF_DECLARE_DRIVER method. As result,
sp804 timer probe returns failure due if cannot bind clock properly.
To fix the failure, this patch is to change crgctrl clock registration
from platform driver to CLK_OF_DECLARE_DRIVER method so the clocks can
be registered ahead with function of_clk_init() and then timer driver
can use it.

Signed-off-by: Leo Yan <leo.yan@linaro.org>

---
 drivers/clk/hisilicon/clk-hi3660.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

-- 
1.9.1

Comments

Leo Yan May 18, 2017, 9:48 a.m. | #1
Hi Daniel,

On Thu, May 18, 2017 at 11:32:26AM +0200, Daniel Lezcano wrote:
> On Thu, May 18, 2017 at 09:50:46AM +0800, Leo Yan wrote:

> > The timer will register into system at very early phase at kernel boot;

> > if timer needs to use clock, the clock should be get ready in function

> > of_clk_init() so later the timer driver probe can retrieve clock

> > successfully. This is finished in below flow on arm64:

> > 

> >   start_kernel()

> >     `-> time_init()

> >           `-> of_clk_init(NULL)    => register timer's clock

> >           `-> clocksource_probe()  => register timer

> > 

> > On Hi3660 the sp804 timer uses clock "osc32k", this clock is registered

> > as platform driver rather than CLK_OF_DECLARE_DRIVER method. As result,

> > sp804 timer probe returns failure due if cannot bind clock properly.

> > To fix the failure, this patch is to change crgctrl clock registration

> > from platform driver to CLK_OF_DECLARE_DRIVER method so the clocks can

> > be registered ahead with function of_clk_init() and then timer driver

> > can use it.

> > 

> > Signed-off-by: Leo Yan <leo.yan@linaro.org>

> > ---

> >  drivers/clk/hisilicon/clk-hi3660.c | 4 ++--

> >  1 file changed, 2 insertions(+), 2 deletions(-)

> > 

> > diff --git a/drivers/clk/hisilicon/clk-hi3660.c b/drivers/clk/hisilicon/clk-hi3660.c

> > index fd5ce7f..4e5713b 100644

> > --- a/drivers/clk/hisilicon/clk-hi3660.c

> > +++ b/drivers/clk/hisilicon/clk-hi3660.c

> > @@ -547,10 +547,10 @@ static void hi3660_clk_crgctrl_init(struct device_node *np)

> >  				  ARRAY_SIZE(hi3660_crgctrl_divider_clks),

> >  				  clk_data);

> >  }

> > +CLK_OF_DECLARE_DRIVER(hi3660_clk_crgctrl, "hisilicon,hi3660-crgctrl",

> > +		      hi3660_clk_crgctrl_init);

> >  

> >  static const struct of_device_id hi3660_clk_match_table[] = {

> > -	{ .compatible = "hisilicon,hi3660-crgctrl",

> > -	  .data = hi3660_clk_crgctrl_init },

> >  	{ .compatible = "hisilicon,hi3660-pctrl",

> >  	  .data = hi3660_clk_pctrl_init },

> >  	{ .compatible = "hisilicon,hi3660-pmuctrl",

> 

> Why not do the change for all the clocks and remove the

> hi3660_clk_match_table[]? and all the related platform driver code?

> 

> That will be consistent with the other clk-hi* drivers.


I checked a bit with Stephen on IRC, follow the suggestion to 'split
the clks are registsered between CLK_OF_DECLARE_DRIVER() and driver
probe so that the ones you need really early are done through the
CLK_OF path and the other ones are done through regular driver probe'.

Also checked for mainline kernel, now there have some examples,
like: drivers/clk/mediatek/clk-mt2701.c.

Thanks,
Leo Yan
Leo Yan May 19, 2017, 2:01 a.m. | #2
On Thu, May 18, 2017 at 06:51:37PM -0700, Stephen Boyd wrote:
> On 05/18, Leo Yan wrote:

> > diff --git a/drivers/clk/hisilicon/clk-hi3660.c b/drivers/clk/hisilicon/clk-hi3660.c

> > index fd5ce7f..4e5713b 100644

> > --- a/drivers/clk/hisilicon/clk-hi3660.c

> > +++ b/drivers/clk/hisilicon/clk-hi3660.c

> > @@ -547,10 +547,10 @@ static void hi3660_clk_crgctrl_init(struct device_node *np)

> >  				  ARRAY_SIZE(hi3660_crgctrl_divider_clks),

> >  				  clk_data);

> >  }

> > +CLK_OF_DECLARE_DRIVER(hi3660_clk_crgctrl, "hisilicon,hi3660-crgctrl",

> > +		      hi3660_clk_crgctrl_init);

> >  

> >  static const struct of_device_id hi3660_clk_match_table[] = {

> > -	{ .compatible = "hisilicon,hi3660-crgctrl",

> > -	  .data = hi3660_clk_crgctrl_init },

> 

> I'm slightly confused. CLK_OF_DECLARE_DRIVER is for when a

> platform driver _and_ CLK_OF_DELARE need to "probe" the same

> device node. But in this patch, the compatible string is being

> deleted from the driver's match table. Also, are all the

> registered in hi3660_clk_crgctrl_init() actually needed for the

> timer?


No.

> If only a subset, then I would expect to split the code

> and have the CLK_OF_DECLARE_DRIVER() path register just the clks

> that matter for the timer, and then leave the rest of the clks to

> be registered by the probe of the platform driver.


I'm also puzzled if need divide crgctrl clock into two parts. Thanks
for suggestion, will do this.

Thanks,
Leo Yan

Patch hide | download patch | download mbox

diff --git a/drivers/clk/hisilicon/clk-hi3660.c b/drivers/clk/hisilicon/clk-hi3660.c
index fd5ce7f..4e5713b 100644
--- a/drivers/clk/hisilicon/clk-hi3660.c
+++ b/drivers/clk/hisilicon/clk-hi3660.c
@@ -547,10 +547,10 @@  static void hi3660_clk_crgctrl_init(struct device_node *np)
 				  ARRAY_SIZE(hi3660_crgctrl_divider_clks),
 				  clk_data);
 }
+CLK_OF_DECLARE_DRIVER(hi3660_clk_crgctrl, "hisilicon,hi3660-crgctrl",
+		      hi3660_clk_crgctrl_init);
 
 static const struct of_device_id hi3660_clk_match_table[] = {
-	{ .compatible = "hisilicon,hi3660-crgctrl",
-	  .data = hi3660_clk_crgctrl_init },
 	{ .compatible = "hisilicon,hi3660-pctrl",
 	  .data = hi3660_clk_pctrl_init },
 	{ .compatible = "hisilicon,hi3660-pmuctrl",