diff mbox

clk: renesas: r9a06g032: Avoid needless probe deferring

Message ID 1531924476-23261-1-git-send-email-phil.edworthy@renesas.com (mailing list archive)
State Changes Requested, archived
Headers show

Commit Message

Phil Edworthy July 18, 2018, 2:34 p.m. UTC
To avoid all SoC peripheral drivers deferring their probes, both clock and
pinctrl drivers should already be probed. Since the pinctrl driver requires
a clock to access the registers, the clock driver should be probed before
the pinctrl driver.

Therefore, move the clock driver from subsys_initcall to core_initcall.

Signed-off-by: Phil Edworthy <phil.edworthy@renesas.com>
---
 drivers/clk/renesas/r9a06g032-clocks.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

Comments

Geert Uytterhoeven July 20, 2018, 11:21 a.m. UTC | #1
Hi Phil,

On Wed, Jul 18, 2018 at 4:34 PM Phil Edworthy <phil.edworthy@renesas.com> wrote:
> To avoid all SoC peripheral drivers deferring their probes, both clock and
> pinctrl drivers should already be probed. Since the pinctrl driver requires
> a clock to access the registers, the clock driver should be probed before
> the pinctrl driver.
>
> Therefore, move the clock driver from subsys_initcall to core_initcall.
>
> Signed-off-by: Phil Edworthy <phil.edworthy@renesas.com>

Thanks for your patch!

The (not yet upstreamed) pinctrl driver uses postcore_initcall(), right?

> --- a/drivers/clk/renesas/r9a06g032-clocks.c
> +++ b/drivers/clk/renesas/r9a06g032-clocks.c
> @@ -877,17 +877,18 @@ static const struct of_device_id r9a06g032_match[] = {
>         { }
>  };
>
> -static struct platform_driver r9a06g032_clock_driver = {
> +static struct platform_driver r9a06g032_clock_driver __refdata = {
>         .driver         = {
>                 .name   = "renesas,r9a06g032-sysctrl",
>                 .of_match_table = r9a06g032_match,
>         },
> +       .probe = r9a06g032_clocks_probe,
>  };
>
>  static int __init r9a06g032_clocks_init(void)
>  {
> -       return platform_driver_probe(&r9a06g032_clock_driver,
> -                       r9a06g032_clocks_probe);
> +       platform_driver_register(&r9a06g032_clock_driver);
> +       return 0;
>  }

Why are all of the above changes needed?
Shouldn't the platform_driver_probe() keep on working?
If it does not, it means the clock driver has some other dependency, and
cannot be bound immediately.  This is potentially a dangerous situation,
as r9a06g032_clocks_probe() is __init, but can still be called at any time
later.  Hence using platform_driver_probe() is the safe thing to do,
possibly with a different reshuffling of the clock and pinctrl initcall
priorities.

> -subsys_initcall(r9a06g032_clocks_init);
> +core_initcall(r9a06g032_clocks_init);

Gr{oetje,eeting}s,

                        Geert
Phil Edworthy July 20, 2018, 12:06 p.m. UTC | #2
Hi Geert,

On 20 July 2018 12:21, Geert Uytterhoeven wrote:
> On Wed, Jul 18, 2018 at 4:34 PM Phil Edworthy wrote:

> > To avoid all SoC peripheral drivers deferring their probes, both clock

> > and pinctrl drivers should already be probed. Since the pinctrl driver

> > requires a clock to access the registers, the clock driver should be

> > probed before the pinctrl driver.

> >

> > Therefore, move the clock driver from subsys_initcall to core_initcall.

> >

> > Signed-off-by: Phil Edworthy <phil.edworthy@renesas.com>

> 

> Thanks for your patch!

Thanks for your review!

> The (not yet upstreamed) pinctrl driver uses postcore_initcall(), right?

No, the pinctrl driver uses subsys_initcall, but postcore_initcall or 
arch_initcall may be better to make it clear about the dependencies.

> > --- a/drivers/clk/renesas/r9a06g032-clocks.c

> > +++ b/drivers/clk/renesas/r9a06g032-clocks.c

> > @@ -877,17 +877,18 @@ static const struct of_device_id

> r9a06g032_match[] = {

> >         { }

> >  };

> >

> > -static struct platform_driver r9a06g032_clock_driver = {

> > +static struct platform_driver r9a06g032_clock_driver __refdata = {

> >         .driver         = {

> >                 .name   = "renesas,r9a06g032-sysctrl",

> >                 .of_match_table = r9a06g032_match,

> >         },

> > +       .probe = r9a06g032_clocks_probe,

> >  };

> >

> >  static int __init r9a06g032_clocks_init(void)  {

> > -       return platform_driver_probe(&r9a06g032_clock_driver,

> > -                       r9a06g032_clocks_probe);

> > +       platform_driver_register(&r9a06g032_clock_driver);

> > +       return 0;

That should be:
+       return platform_driver_register(&r9a06g032_clock_driver);

> >  }

> 

> Why are all of the above changes needed?

> Shouldn't the platform_driver_probe() keep on working?

> If it does not, it means the clock driver has some other dependency, and

> cannot be bound immediately.  This is potentially a dangerous situation, as

> r9a06g032_clocks_probe() is __init, but can still be called at any time later.

> Hence using platform_driver_probe() is the safe thing to do, possibly with a

> different reshuffling of the clock and pinctrl initcall priorities.

No, you cannot call platform_driver_probe() from core_initcall.
All drivers that are in core_initcall call platform_driver_register().

Thanks
Phil

> > -subsys_initcall(r9a06g032_clocks_init);

> > +core_initcall(r9a06g032_clocks_init);

> 

> Gr{oetje,eeting}s,

> 

>                         Geert

> 

> --

> Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-

> m68k.org

> 

> In personal conversations with technical people, I call myself a hacker. But

> when I'm talking to journalists I just say "programmer" or something like that.

>                                 -- Linus Torvalds
Geert Uytterhoeven July 20, 2018, 12:12 p.m. UTC | #3
Hi Phil,

On Fri, Jul 20, 2018 at 2:06 PM Phil Edworthy <phil.edworthy@renesas.com> wrote:
> On 20 July 2018 12:21, Geert Uytterhoeven wrote:
> > On Wed, Jul 18, 2018 at 4:34 PM Phil Edworthy wrote:
> > > To avoid all SoC peripheral drivers deferring their probes, both clock
> > > and pinctrl drivers should already be probed. Since the pinctrl driver
> > > requires a clock to access the registers, the clock driver should be
> > > probed before the pinctrl driver.
> > >
> > > Therefore, move the clock driver from subsys_initcall to core_initcall.
> > >
> > > Signed-off-by: Phil Edworthy <phil.edworthy@renesas.com>
> >
> > Thanks for your patch!
> Thanks for your review!
>
> > The (not yet upstreamed) pinctrl driver uses postcore_initcall(), right?
> No, the pinctrl driver uses subsys_initcall, but postcore_initcall or
> arch_initcall may be better to make it clear about the dependencies.

if the pinctrl driver uses subsys_initcall(), ...

> > > --- a/drivers/clk/renesas/r9a06g032-clocks.c
> > > +++ b/drivers/clk/renesas/r9a06g032-clocks.c
> > > @@ -877,17 +877,18 @@ static const struct of_device_id
> > r9a06g032_match[] = {
> > >         { }
> > >  };
> > >
> > > -static struct platform_driver r9a06g032_clock_driver = {
> > > +static struct platform_driver r9a06g032_clock_driver __refdata = {
> > >         .driver         = {
> > >                 .name   = "renesas,r9a06g032-sysctrl",
> > >                 .of_match_table = r9a06g032_match,
> > >         },
> > > +       .probe = r9a06g032_clocks_probe,
> > >  };
> > >
> > >  static int __init r9a06g032_clocks_init(void)  {
> > > -       return platform_driver_probe(&r9a06g032_clock_driver,
> > > -                       r9a06g032_clocks_probe);
> > > +       platform_driver_register(&r9a06g032_clock_driver);
> > > +       return 0;
> That should be:
> +       return platform_driver_register(&r9a06g032_clock_driver);
>
> > >  }
> >
> > Why are all of the above changes needed?
> > Shouldn't the platform_driver_probe() keep on working?
> > If it does not, it means the clock driver has some other dependency, and
> > cannot be bound immediately.  This is potentially a dangerous situation, as
> > r9a06g032_clocks_probe() is __init, but can still be called at any time later.
> > Hence using platform_driver_probe() is the safe thing to do, possibly with a
> > different reshuffling of the clock and pinctrl initcall priorities.
> No, you cannot call platform_driver_probe() from core_initcall.
> All drivers that are in core_initcall call platform_driver_register().

Hence they cannot have their probe function __init.

>
> Thanks
> Phil
>
> > > -subsys_initcall(r9a06g032_clocks_init);
> > > +core_initcall(r9a06g032_clocks_init);

... using postcore_initcall() or arch_initcall() here, should work with
platform_driver_probe()?

Gr{oetje,eeting}s,

                        Geert
Phil Edworthy July 20, 2018, 12:26 p.m. UTC | #4
SGkgR2VlcnQsDQoNCk9uIDIwIEp1bHkgMjAxOCAxMzoxMiwgR2VlcnQgVXl0dGVyaG9ldmVuIHdy
b3RlOg0KPiBPbiBGcmksIEp1bCAyMCwgMjAxOCBhdCAyOjA2IFBNIFBoaWwgRWR3b3J0aHkgIHdy
b3RlOg0KPiA+IE9uIDIwIEp1bHkgMjAxOCAxMjoyMSwgR2VlcnQgVXl0dGVyaG9ldmVuIHdyb3Rl
Og0KPiA+ID4gT24gV2VkLCBKdWwgMTgsIDIwMTggYXQgNDozNCBQTSBQaGlsIEVkd29ydGh5IHdy
b3RlOg0KPiA+ID4gPiBUbyBhdm9pZCBhbGwgU29DIHBlcmlwaGVyYWwgZHJpdmVycyBkZWZlcnJp
bmcgdGhlaXIgcHJvYmVzLCBib3RoDQo+ID4gPiA+IGNsb2NrIGFuZCBwaW5jdHJsIGRyaXZlcnMg
c2hvdWxkIGFscmVhZHkgYmUgcHJvYmVkLiBTaW5jZSB0aGUNCj4gPiA+ID4gcGluY3RybCBkcml2
ZXIgcmVxdWlyZXMgYSBjbG9jayB0byBhY2Nlc3MgdGhlIHJlZ2lzdGVycywgdGhlIGNsb2NrDQo+
ID4gPiA+IGRyaXZlciBzaG91bGQgYmUgcHJvYmVkIGJlZm9yZSB0aGUgcGluY3RybCBkcml2ZXIu
DQo+ID4gPiA+DQo+ID4gPiA+IFRoZXJlZm9yZSwgbW92ZSB0aGUgY2xvY2sgZHJpdmVyIGZyb20g
c3Vic3lzX2luaXRjYWxsIHRvIGNvcmVfaW5pdGNhbGwuDQo+ID4gPiA+DQo+ID4gPiA+IFNpZ25l
ZC1vZmYtYnk6IFBoaWwgRWR3b3J0aHkgPHBoaWwuZWR3b3J0aHlAcmVuZXNhcy5jb20+DQo+ID4g
Pg0KPiA+ID4gVGhhbmtzIGZvciB5b3VyIHBhdGNoIQ0KPiA+IFRoYW5rcyBmb3IgeW91ciByZXZp
ZXchDQo+ID4NCj4gPiA+IFRoZSAobm90IHlldCB1cHN0cmVhbWVkKSBwaW5jdHJsIGRyaXZlciB1
c2VzIHBvc3Rjb3JlX2luaXRjYWxsKCksIHJpZ2h0Pw0KPiA+IE5vLCB0aGUgcGluY3RybCBkcml2
ZXIgdXNlcyBzdWJzeXNfaW5pdGNhbGwsIGJ1dCBwb3N0Y29yZV9pbml0Y2FsbCBvcg0KPiA+IGFy
Y2hfaW5pdGNhbGwgbWF5IGJlIGJldHRlciB0byBtYWtlIGl0IGNsZWFyIGFib3V0IHRoZSBkZXBl
bmRlbmNpZXMuDQo+IA0KPiBpZiB0aGUgcGluY3RybCBkcml2ZXIgdXNlcyBzdWJzeXNfaW5pdGNh
bGwoKSwgLi4uDQo+IA0KPiA+ID4gPiAtLS0gYS9kcml2ZXJzL2Nsay9yZW5lc2FzL3I5YTA2ZzAz
Mi1jbG9ja3MuYw0KPiA+ID4gPiArKysgYi9kcml2ZXJzL2Nsay9yZW5lc2FzL3I5YTA2ZzAzMi1j
bG9ja3MuYw0KPiA+ID4gPiBAQCAtODc3LDE3ICs4NzcsMTggQEAgc3RhdGljIGNvbnN0IHN0cnVj
dCBvZl9kZXZpY2VfaWQNCj4gPiA+IHI5YTA2ZzAzMl9tYXRjaFtdID0gew0KPiA+ID4gPiAgICAg
ICAgIHsgfQ0KPiA+ID4gPiAgfTsNCj4gPiA+ID4NCj4gPiA+ID4gLXN0YXRpYyBzdHJ1Y3QgcGxh
dGZvcm1fZHJpdmVyIHI5YTA2ZzAzMl9jbG9ja19kcml2ZXIgPSB7DQo+ID4gPiA+ICtzdGF0aWMg
c3RydWN0IHBsYXRmb3JtX2RyaXZlciByOWEwNmcwMzJfY2xvY2tfZHJpdmVyIF9fcmVmZGF0YSA9
DQo+ID4gPiA+ICt7DQo+ID4gPiA+ICAgICAgICAgLmRyaXZlciAgICAgICAgID0gew0KPiA+ID4g
PiAgICAgICAgICAgICAgICAgLm5hbWUgICA9ICJyZW5lc2FzLHI5YTA2ZzAzMi1zeXNjdHJsIiwN
Cj4gPiA+ID4gICAgICAgICAgICAgICAgIC5vZl9tYXRjaF90YWJsZSA9IHI5YTA2ZzAzMl9tYXRj
aCwNCj4gPiA+ID4gICAgICAgICB9LA0KPiA+ID4gPiArICAgICAgIC5wcm9iZSA9IHI5YTA2ZzAz
Ml9jbG9ja3NfcHJvYmUsDQo+ID4gPiA+ICB9Ow0KPiA+ID4gPg0KPiA+ID4gPiAgc3RhdGljIGlu
dCBfX2luaXQgcjlhMDZnMDMyX2Nsb2Nrc19pbml0KHZvaWQpICB7DQo+ID4gPiA+IC0gICAgICAg
cmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmcjlhMDZnMDMyX2Nsb2NrX2RyaXZlciwNCj4g
PiA+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgcjlhMDZnMDMyX2Nsb2Nrc19wcm9iZSk7DQo+
ID4gPiA+ICsgICAgICAgcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZyOWEwNmcwMzJfY2xvY2tf
ZHJpdmVyKTsNCj4gPiA+ID4gKyAgICAgICByZXR1cm4gMDsNCj4gPiBUaGF0IHNob3VsZCBiZToN
Cj4gPiArICAgICAgIHJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnI5YTA2ZzAzMl9j
bG9ja19kcml2ZXIpOw0KPiA+DQo+ID4gPiA+ICB9DQo+ID4gPg0KPiA+ID4gV2h5IGFyZSBhbGwg
b2YgdGhlIGFib3ZlIGNoYW5nZXMgbmVlZGVkPw0KPiA+ID4gU2hvdWxkbid0IHRoZSBwbGF0Zm9y
bV9kcml2ZXJfcHJvYmUoKSBrZWVwIG9uIHdvcmtpbmc/DQo+ID4gPiBJZiBpdCBkb2VzIG5vdCwg
aXQgbWVhbnMgdGhlIGNsb2NrIGRyaXZlciBoYXMgc29tZSBvdGhlciBkZXBlbmRlbmN5LA0KPiA+
ID4gYW5kIGNhbm5vdCBiZSBib3VuZCBpbW1lZGlhdGVseS4gIFRoaXMgaXMgcG90ZW50aWFsbHkg
YSBkYW5nZXJvdXMNCj4gPiA+IHNpdHVhdGlvbiwgYXMNCj4gPiA+IHI5YTA2ZzAzMl9jbG9ja3Nf
cHJvYmUoKSBpcyBfX2luaXQsIGJ1dCBjYW4gc3RpbGwgYmUgY2FsbGVkIGF0IGFueSB0aW1lIGxh
dGVyLg0KPiA+ID4gSGVuY2UgdXNpbmcgcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCkgaXMgdGhlIHNh
ZmUgdGhpbmcgdG8gZG8sDQo+ID4gPiBwb3NzaWJseSB3aXRoIGEgZGlmZmVyZW50IHJlc2h1ZmZs
aW5nIG9mIHRoZSBjbG9jayBhbmQgcGluY3RybCBpbml0Y2FsbA0KPiBwcmlvcml0aWVzLg0KPiA+
IE5vLCB5b3UgY2Fubm90IGNhbGwgcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCkgZnJvbSBjb3JlX2lu
aXRjYWxsLg0KPiA+IEFsbCBkcml2ZXJzIHRoYXQgYXJlIGluIGNvcmVfaW5pdGNhbGwgY2FsbCBw
bGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoKS4NCj4gDQo+IEhlbmNlIHRoZXkgY2Fubm90IGhhdmUg
dGhlaXIgcHJvYmUgZnVuY3Rpb24gX19pbml0Lg0KPiANCj4gPg0KPiA+IFRoYW5rcw0KPiA+IFBo
aWwNCj4gPg0KPiA+ID4gPiAtc3Vic3lzX2luaXRjYWxsKHI5YTA2ZzAzMl9jbG9ja3NfaW5pdCk7
DQo+ID4gPiA+ICtjb3JlX2luaXRjYWxsKHI5YTA2ZzAzMl9jbG9ja3NfaW5pdCk7DQo+IA0KPiAu
Li4gdXNpbmcgcG9zdGNvcmVfaW5pdGNhbGwoKSBvciBhcmNoX2luaXRjYWxsKCkgaGVyZSwgc2hv
dWxkIHdvcmsgd2l0aA0KPiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoKT8NCk5vcGUsIHlvdSBoYXZl
IHRvIHVzZSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoKSBmb3IgRFQgYmFzZWQgZHJpdmVycy4N
CnN1YnN5c19pbml0Y2FsbCBpcyB0aGUgZWFybGllc3QgeW91IGNhbiB1c2UgcGxhdGZvcm1fZHJp
dmVyX3Byb2JlKCkuDQoNClRoYW5rcw0KUGhpbA0KDQo+IEdye29ldGplLGVldGluZ31zLA0KPiAN
Cj4gICAgICAgICAgICAgICAgICAgICAgICAgR2VlcnQNCj4gDQo+IC0tDQo+IEdlZXJ0IFV5dHRl
cmhvZXZlbiAtLSBUaGVyZSdzIGxvdHMgb2YgTGludXggYmV5b25kIGlhMzIgLS0gZ2VlcnRAbGlu
dXgtDQo+IG02OGsub3JnDQo+IA0KPiBJbiBwZXJzb25hbCBjb252ZXJzYXRpb25zIHdpdGggdGVj
aG5pY2FsIHBlb3BsZSwgSSBjYWxsIG15c2VsZiBhIGhhY2tlci4gQnV0DQo+IHdoZW4gSSdtIHRh
bGtpbmcgdG8gam91cm5hbGlzdHMgSSBqdXN0IHNheSAicHJvZ3JhbW1lciIgb3Igc29tZXRoaW5n
IGxpa2UgdGhhdC4NCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBMaW51cyBU
b3J2YWxkcw0K
--
To unsubscribe from this list: send the line "unsubscribe linux-clk" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Geert Uytterhoeven July 20, 2018, 12:41 p.m. UTC | #5
Hi Phil,

On Fri, Jul 20, 2018 at 2:26 PM Phil Edworthy <phil.edworthy@renesas.com> wrote:
> On 20 July 2018 13:12, Geert Uytterhoeven wrote:
> > On Fri, Jul 20, 2018 at 2:06 PM Phil Edworthy  wrote:
> > > On 20 July 2018 12:21, Geert Uytterhoeven wrote:
> > > > On Wed, Jul 18, 2018 at 4:34 PM Phil Edworthy wrote:
> > > > > To avoid all SoC peripheral drivers deferring their probes, both
> > > > > clock and pinctrl drivers should already be probed. Since the
> > > > > pinctrl driver requires a clock to access the registers, the clock
> > > > > driver should be probed before the pinctrl driver.
> > > > >
> > > > > Therefore, move the clock driver from subsys_initcall to core_initcall.
> > > > >
> > > > > Signed-off-by: Phil Edworthy <phil.edworthy@renesas.com>
> > > >
> > > > Thanks for your patch!
> > > Thanks for your review!
> > >
> > > > The (not yet upstreamed) pinctrl driver uses postcore_initcall(), right?
> > > No, the pinctrl driver uses subsys_initcall, but postcore_initcall or
> > > arch_initcall may be better to make it clear about the dependencies.
> >
> > if the pinctrl driver uses subsys_initcall(), ...

> > > > > -subsys_initcall(r9a06g032_clocks_init);
> > > > > +core_initcall(r9a06g032_clocks_init);
> >
> > ... using postcore_initcall() or arch_initcall() here, should work with
> > platform_driver_probe()?
> Nope, you have to use platform_driver_register() for DT based drivers.
> subsys_initcall is the earliest you can use platform_driver_probe().

So drivers/misc/atmel_tclib.c and drivers/pinctrl/pinctrl-coh901.c, which
use arch_initcall(), cannot work?

If that is really true, you can still use subsys_initcall() in the clock driver,
and subsys_initcall_sync() in the pinctrl driver.

Gr{oetje,eeting}s,

                        Geert
Phil Edworthy July 20, 2018, 1:57 p.m. UTC | #6
Hi Geert,

On 20 July 2018 13:41, Geert Uytterhoeven wrote:
> On Fri, Jul 20, 2018 at 2:26 PM Phil Edworthy wrote:

> > On 20 July 2018 13:12, Geert Uytterhoeven wrote:

> > > On Fri, Jul 20, 2018 at 2:06 PM Phil Edworthy  wrote:

> > > > On 20 July 2018 12:21, Geert Uytterhoeven wrote:

> > > > > On Wed, Jul 18, 2018 at 4:34 PM Phil Edworthy wrote:

> > > > > > To avoid all SoC peripheral drivers deferring their probes,

> > > > > > both clock and pinctrl drivers should already be probed. Since

> > > > > > the pinctrl driver requires a clock to access the registers,

> > > > > > the clock driver should be probed before the pinctrl driver.

> > > > > >

> > > > > > Therefore, move the clock driver from subsys_initcall to

> core_initcall.

> > > > > >

> > > > > > Signed-off-by: Phil Edworthy <phil.edworthy@renesas.com>

> > > > >

> > > > > Thanks for your patch!

> > > > Thanks for your review!

> > > >

> > > > > The (not yet upstreamed) pinctrl driver uses postcore_initcall(), right?

> > > > No, the pinctrl driver uses subsys_initcall, but postcore_initcall

> > > > or arch_initcall may be better to make it clear about the dependencies.

> > >

> > > if the pinctrl driver uses subsys_initcall(), ...

> 

> > > > > > -subsys_initcall(r9a06g032_clocks_init);

> > > > > > +core_initcall(r9a06g032_clocks_init);

> > >

> > > ... using postcore_initcall() or arch_initcall() here, should work

> > > with platform_driver_probe()?

> > Nope, you have to use platform_driver_register() for DT based drivers.

> > subsys_initcall is the earliest you can use platform_driver_probe().

> 

> So drivers/misc/atmel_tclib.c and drivers/pinctrl/pinctrl-coh901.c, which use

> arch_initcall(), cannot work?

How those drivers work I do not know. However, I tried with the rzn1 clock
driver and it does not work.

> If that is really true, you can still use subsys_initcall() in the clock driver, and

> subsys_initcall_sync() in the pinctrl driver.

True, I'm not sure how people decide which initcall to use and whether the
_sync variants of the initcalls have a special meaning or intention. As far as
I know they were introduced for threaded probes, so are we supposed to
use them for driver dependencies like this?

Do you know why the rza1 pinctrl driver is running from core_initcall()?

Thanks
Phil
Geert Uytterhoeven Aug. 1, 2018, 12:35 p.m. UTC | #7
Hi Phil,

CC Jacopo

On Fri, Jul 20, 2018 at 3:57 PM Phil Edworthy <phil.edworthy@renesas.com> wrote:
> On 20 July 2018 13:41, Geert Uytterhoeven wrote:
> > On Fri, Jul 20, 2018 at 2:26 PM Phil Edworthy wrote:
> > > On 20 July 2018 13:12, Geert Uytterhoeven wrote:
> > > > On Fri, Jul 20, 2018 at 2:06 PM Phil Edworthy  wrote:
> > > > > On 20 July 2018 12:21, Geert Uytterhoeven wrote:
> > > > > > On Wed, Jul 18, 2018 at 4:34 PM Phil Edworthy wrote:
> > > > > > > To avoid all SoC peripheral drivers deferring their probes,
> > > > > > > both clock and pinctrl drivers should already be probed. Since
> > > > > > > the pinctrl driver requires a clock to access the registers,
> > > > > > > the clock driver should be probed before the pinctrl driver.
> > > > > > >
> > > > > > > Therefore, move the clock driver from subsys_initcall to
> > core_initcall.
> > > > > > >
> > > > > > > Signed-off-by: Phil Edworthy <phil.edworthy@renesas.com>
> > > > > >
> > > > > > Thanks for your patch!
> > > > > Thanks for your review!
> > > > >
> > > > > > The (not yet upstreamed) pinctrl driver uses postcore_initcall(), right?
> > > > > No, the pinctrl driver uses subsys_initcall, but postcore_initcall
> > > > > or arch_initcall may be better to make it clear about the dependencies.
> > > >
> > > > if the pinctrl driver uses subsys_initcall(), ...
> >
> > > > > > > -subsys_initcall(r9a06g032_clocks_init);
> > > > > > > +core_initcall(r9a06g032_clocks_init);
> > > >
> > > > ... using postcore_initcall() or arch_initcall() here, should work
> > > > with platform_driver_probe()?
> > > Nope, you have to use platform_driver_register() for DT based drivers.
> > > subsys_initcall is the earliest you can use platform_driver_probe().
> >
> > So drivers/misc/atmel_tclib.c and drivers/pinctrl/pinctrl-coh901.c, which use
> > arch_initcall(), cannot work?
> How those drivers work I do not know. However, I tried with the rzn1 clock
> driver and it does not work.
>
> > If that is really true, you can still use subsys_initcall() in the clock driver, and
> > subsys_initcall_sync() in the pinctrl driver.
> True, I'm not sure how people decide which initcall to use and whether the
> _sync variants of the initcalls have a special meaning or intention. As far as
> I know they were introduced for threaded probes, so are we supposed to
> use them for driver dependencies like this?
>
> Do you know why the rza1 pinctrl driver is running from core_initcall()?

Probably because it can?
Note that drivers/clk/renesas/clk-rz.c uses CLK_OF_DECLARE().

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
--
To unsubscribe from this list: send the line "unsubscribe linux-clk" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/clk/renesas/r9a06g032-clocks.c b/drivers/clk/renesas/r9a06g032-clocks.c
index a0b6ecd..b03d616 100644
--- a/drivers/clk/renesas/r9a06g032-clocks.c
+++ b/drivers/clk/renesas/r9a06g032-clocks.c
@@ -877,17 +877,18 @@  static const struct of_device_id r9a06g032_match[] = {
 	{ }
 };
 
-static struct platform_driver r9a06g032_clock_driver = {
+static struct platform_driver r9a06g032_clock_driver __refdata = {
 	.driver		= {
 		.name	= "renesas,r9a06g032-sysctrl",
 		.of_match_table = r9a06g032_match,
 	},
+	.probe = r9a06g032_clocks_probe,
 };
 
 static int __init r9a06g032_clocks_init(void)
 {
-	return platform_driver_probe(&r9a06g032_clock_driver,
-			r9a06g032_clocks_probe);
+	platform_driver_register(&r9a06g032_clock_driver);
+	return 0;
 }
 
-subsys_initcall(r9a06g032_clocks_init);
+core_initcall(r9a06g032_clocks_init);