diff mbox

[BUG] omap: mfd/regulator: twl/core: init order

Message ID 516BD479.2020904@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Grygorii Strashko April 15, 2013, 10:20 a.m. UTC
On 04/13/2013 09:27 PM, Christoph Fritz wrote:
> Hi
>
>   while testing an omap3 board with device tree support I stumbled upon a
> bug which is due to wrong initialization order of twl-core and
> twl-regulator (I suppose): In the boot process they get loaded way too
> late so that a lot of drivers before where configured wrong or just
> refuse to load.
>
> For example the real time clock driver: The RTC kicks in way before
> twl_probe() and due to that it configures its register map wrong
> (at this time twl_priv->twl_id isn't configured yet).
>
> Another example is the omap display subsystem. It (DSS) fails loading
> while trying to register some not yet existent regulators and because it
> lacks EPROBE_DEFER.
>
> USB and MMC is also not working and I'm suspicious of the same cause.
>
> Any ideas?
Hi Christoph,

It happens, because I2C probes execution  have been deferred due to
"pinctrl-single" driver (, which is not ready at i2c bus initialization 
time:

[    0.525939] omap_i2c 48070000.i2c: could not find pctldev for node 
/ocp/pinmux@4a100040/pinmux_i2c1_pins, deferring probe
[    0.526000] platform 48070000.i2c: Driver omap_i2c requests probe 
deferral
[    0.526062] omap_i2c 48072000.i2c: could not find pctldev for node 
/ocp/pinmux@4a100040/pinmux_i2c2_pins, deferring probe
[    0.526092] platform 48072000.i2c: Driver omap_i2c requests probe 
deferral
[    0.526153] omap_i2c 48060000.i2c: could not find pctldev for node 
/ocp/pinmux@4a100040/pinmux_i2c3_pins, deferring probe
[    0.526184] platform 48060000.i2c: Driver omap_i2c requests probe 
deferral
[    0.526245] omap_i2c 48350000.i2c: could not find pctldev for node 
/ocp/pinmux@4a100040/pinmux_i2c4_pins, deferring probe
[    0.526275] platform 48350000.i2c: Driver omap_i2c requests probe 
deferral

I think following change should fix it, could you try it, pls:
pinctrl driver");

>   Thanks
>    -- Christoph
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Christoph Fritz April 15, 2013, 10:56 a.m. UTC | #1
On Mon, 2013-04-15 at 13:20 +0300, Grygorii Strashko wrote:
> On 04/13/2013 09:27 PM, Christoph Fritz wrote:
> > Hi
> >
> >   while testing an omap3 board with device tree support I stumbled upon a
> > bug which is due to wrong initialization order of twl-core and
> > twl-regulator (I suppose): In the boot process they get loaded way too
> > late so that a lot of drivers before where configured wrong or just
> > refuse to load.
> >
> > For example the real time clock driver: The RTC kicks in way before
> > twl_probe() and due to that it configures its register map wrong
> > (at this time twl_priv->twl_id isn't configured yet).
> >
> > Another example is the omap display subsystem. It (DSS) fails loading
> > while trying to register some not yet existent regulators and because it
> > lacks EPROBE_DEFER.
> >
> > USB and MMC is also not working and I'm suspicious of the same cause.
> >
> > Any ideas?
> Hi Christoph,
> 
> It happens, because I2C probes execution  have been deferred due to
> "pinctrl-single" driver (, which is not ready at i2c bus initialization 
> time:
> 
> [    0.525939] omap_i2c 48070000.i2c: could not find pctldev for node 
> /ocp/pinmux@4a100040/pinmux_i2c1_pins, deferring probe
> [    0.526000] platform 48070000.i2c: Driver omap_i2c requests probe 
> deferral
> [    0.526062] omap_i2c 48072000.i2c: could not find pctldev for node 
> /ocp/pinmux@4a100040/pinmux_i2c2_pins, deferring probe
> [    0.526092] platform 48072000.i2c: Driver omap_i2c requests probe 
> deferral
> [    0.526153] omap_i2c 48060000.i2c: could not find pctldev for node 
> /ocp/pinmux@4a100040/pinmux_i2c3_pins, deferring probe
> [    0.526184] platform 48060000.i2c: Driver omap_i2c requests probe 
> deferral
> [    0.526245] omap_i2c 48350000.i2c: could not find pctldev for node 
> /ocp/pinmux@4a100040/pinmux_i2c4_pins, deferring probe
> [    0.526275] platform 48350000.i2c: Driver omap_i2c requests probe 
> deferral
> 
> I think following change should fix it, could you try it, pls:
> diff --git a/drivers/pinctrl/pinctrl-single.c 
> b/drivers/pinctrl/pinctrl-single.c
> index 5c32e88..b2a9d4b 100644
> --- a/drivers/pinctrl/pinctrl-single.c
> +++ b/drivers/pinctrl/pinctrl-single.c
> @@ -1014,7 +1014,18 @@ static struct platform_driver pcs_driver = {
>          },
>   };
> 
> -module_platform_driver(pcs_driver);
> +static int __init pcs_driver_drv_init(void)
> +{
> +       return platform_driver_register(&pcs_driver);
> +}
> +postcore_initcall(pcs_driver_drv_init);
> +
> +static void __exit pcs_driver_drv_exit(void)
> +{
> +       platform_driver_unregister(&pcs_driver);
> +}
> +module_exit(pcs_driver_drv_exit);
> +

Hi Grygorii,
 thanks - indeed it does fix the problem. I checked at least the rtc
which is now configured right and working :-)

Do you consider the patch above as a hack or will it go mainline?

 Thanks
  -- Christoph



--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Grygorii Strashko April 15, 2013, 10:59 a.m. UTC | #2
On 04/15/2013 01:56 PM, Christoph Fritz wrote:
> On Mon, 2013-04-15 at 13:20 +0300, Grygorii Strashko wrote:
>> On 04/13/2013 09:27 PM, Christoph Fritz wrote:
>>> Hi
>>>
>>>    while testing an omap3 board with device tree support I stumbled upon a
>>> bug which is due to wrong initialization order of twl-core and
>>> twl-regulator (I suppose): In the boot process they get loaded way too
>>> late so that a lot of drivers before where configured wrong or just
>>> refuse to load.
>>>
>>> For example the real time clock driver: The RTC kicks in way before
>>> twl_probe() and due to that it configures its register map wrong
>>> (at this time twl_priv->twl_id isn't configured yet).
>>>
>>> Another example is the omap display subsystem. It (DSS) fails loading
>>> while trying to register some not yet existent regulators and because it
>>> lacks EPROBE_DEFER.
>>>
>>> USB and MMC is also not working and I'm suspicious of the same cause.
>>>
>>> Any ideas?
>> Hi Christoph,
>>
>> It happens, because I2C probes execution  have been deferred due to
>> "pinctrl-single" driver (, which is not ready at i2c bus initialization
>> time:
>>
>> [    0.525939] omap_i2c 48070000.i2c: could not find pctldev for node
>> /ocp/pinmux@4a100040/pinmux_i2c1_pins, deferring probe
>> [    0.526000] platform 48070000.i2c: Driver omap_i2c requests probe
>> deferral
>> [    0.526062] omap_i2c 48072000.i2c: could not find pctldev for node
>> /ocp/pinmux@4a100040/pinmux_i2c2_pins, deferring probe
>> [    0.526092] platform 48072000.i2c: Driver omap_i2c requests probe
>> deferral
>> [    0.526153] omap_i2c 48060000.i2c: could not find pctldev for node
>> /ocp/pinmux@4a100040/pinmux_i2c3_pins, deferring probe
>> [    0.526184] platform 48060000.i2c: Driver omap_i2c requests probe
>> deferral
>> [    0.526245] omap_i2c 48350000.i2c: could not find pctldev for node
>> /ocp/pinmux@4a100040/pinmux_i2c4_pins, deferring probe
>> [    0.526275] platform 48350000.i2c: Driver omap_i2c requests probe
>> deferral
>>
>> I think following change should fix it, could you try it, pls:
>> diff --git a/drivers/pinctrl/pinctrl-single.c
>> b/drivers/pinctrl/pinctrl-single.c
>> index 5c32e88..b2a9d4b 100644
>> --- a/drivers/pinctrl/pinctrl-single.c
>> +++ b/drivers/pinctrl/pinctrl-single.c
>> @@ -1014,7 +1014,18 @@ static struct platform_driver pcs_driver = {
>>           },
>>    };
>>
>> -module_platform_driver(pcs_driver);
>> +static int __init pcs_driver_drv_init(void)
>> +{
>> +       return platform_driver_register(&pcs_driver);
>> +}
>> +postcore_initcall(pcs_driver_drv_init);
>> +
>> +static void __exit pcs_driver_drv_exit(void)
>> +{
>> +       platform_driver_unregister(&pcs_driver);
>> +}
>> +module_exit(pcs_driver_drv_exit);
>> +
> Hi Grygorii,
>   thanks - indeed it does fix the problem. I checked at least the rtc
> which is now configured right and working :-)
>
> Do you consider the patch above as a hack or will it go mainline?
I think, need more opinions on this from community )
I'm just trying to solve my problem and found similar issue.
>
>   Thanks
>    -- Christoph
>
>
>

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Tony Lindgren April 15, 2013, 4:25 p.m. UTC | #3
* Grygorii Strashko <grygorii.strashko@ti.com> [130415 04:05]:
> On 04/15/2013 01:56 PM, Christoph Fritz wrote:
> >On Mon, 2013-04-15 at 13:20 +0300, Grygorii Strashko wrote:
> >>--- a/drivers/pinctrl/pinctrl-single.c
> >>+++ b/drivers/pinctrl/pinctrl-single.c
> >>@@ -1014,7 +1014,18 @@ static struct platform_driver pcs_driver = {
> >>          },
> >>   };
> >>
> >>-module_platform_driver(pcs_driver);
> >>+static int __init pcs_driver_drv_init(void)
> >>+{
> >>+       return platform_driver_register(&pcs_driver);
> >>+}
> >>+postcore_initcall(pcs_driver_drv_init);
> >>+
> >>+static void __exit pcs_driver_drv_exit(void)
> >>+{
> >>+       platform_driver_unregister(&pcs_driver);
> >>+}
> >>+module_exit(pcs_driver_drv_exit);
> >>+
> >Hi Grygorii,
> >  thanks - indeed it does fix the problem. I checked at least the rtc
> >which is now configured right and working :-)
> >
> >Do you consider the patch above as a hack or will it go mainline?
> I think, need more opinions on this from community )
> I'm just trying to solve my problem and found similar issue.

This fix should not be needed. It just means the real
problem is somewhere else. Pinctrl is already before the i2c
in drivers/Makefile. Maybe one of the MFD drivers has
a wrong initcall level?

Regards,

Tony
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Peter Ujfalusi April 16, 2013, 7:45 a.m. UTC | #4
On 04/15/2013 06:25 PM, Tony Lindgren wrote:
> This fix should not be needed. It just means the real
> problem is somewhere else. Pinctrl is already before the i2c
> in drivers/Makefile. Maybe one of the MFD drivers has
> a wrong initcall level?

FYI; I just sent a patch which I believe is the correct way to fix this issue.
Grygorii Strashko April 16, 2013, 8:33 a.m. UTC | #5
On 04/16/2013 10:45 AM, Peter Ujfalusi wrote:
> On 04/15/2013 06:25 PM, Tony Lindgren wrote:
>> This fix should not be needed. It just means the real
>> problem is somewhere else. Pinctrl is already before the i2c
>> in drivers/Makefile. Maybe one of the MFD drivers has
>> a wrong initcall level?
> FYI; I just sent a patch which I believe is the correct way to fix this issue.
>
Hi Tony, Peter

OMAP i2c/pin-control initialization isn't controlled by Makefiles now (:
- i2c initialized at subsys_initcall(omap_i2c_init_driver);
- pinctrl-single at module_platform_driver(pcs_driver) => module_init => 
device_initcall (if built-in)

And pls, pay attention on overall BUG description - twl-regulators
initialization has been delayed as result all Regulators consumers
(drivers which use regulators) will need to defer it's probe correctly too.
For now it isn't true for many drivers and, for example,
omap_hsmmc driver's probe will just fail if it can't get regulator.
(+ problems with DSS - most probably Panel/DSI driver probe can't handle 
pin configuration)

Before, on early kernel versions, the OMAP pinmux was ready to work at 
arch_initcall time
and most of the code has been created with this assumption.

Unfortunately, RTC is just a small part of problem.

-grygorii
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Tony Lindgren April 16, 2013, 5:54 p.m. UTC | #6
* Grygorii Strashko <grygorii.strashko@ti.com> [130416 01:39]:
> On 04/16/2013 10:45 AM, Peter Ujfalusi wrote:
> >On 04/15/2013 06:25 PM, Tony Lindgren wrote:
> >>This fix should not be needed. It just means the real
> >>problem is somewhere else. Pinctrl is already before the i2c
> >>in drivers/Makefile. Maybe one of the MFD drivers has
> >>a wrong initcall level?
> >FYI; I just sent a patch which I believe is the correct way to fix this issue.
> >
> Hi Tony, Peter
> 
> OMAP i2c/pin-control initialization isn't controlled by Makefiles now (:
> - i2c initialized at subsys_initcall(omap_i2c_init_driver);

AFAIK there should be no reason to have this as subsys_initcall
any longer. It should be just regular module init.

> - pinctrl-single at module_platform_driver(pcs_driver) =>
> module_init => device_initcall (if built-in)

Yes but still, the deferred probe should handle this case too,
I wonder why we're not seeing this issue on omap4 for example?
 
> And pls, pay attention on overall BUG description - twl-regulators
> initialization has been delayed as result all Regulators consumers
> (drivers which use regulators) will need to defer it's probe correctly too.
> For now it isn't true for many drivers and, for example,
> omap_hsmmc driver's probe will just fail if it can't get regulator.
> (+ problems with DSS - most probably Panel/DSI driver probe can't
> handle pin configuration)

Sounds like there are a few places to fix. Got something available
for these?
 
> Before, on early kernel versions, the OMAP pinmux was ready to work
> at arch_initcall time
> and most of the code has been created with this assumption.

Yes. In general we've been moving to initializing things later
on rather than earlier so we have a real console available for
error messages instead of earlyprintk if something goes wrong.

BTW, the legacy omap pinmux code will be going away as soon as
we have moved platforms to use DT only booting. I think we can
make omap4 DT only after v3.10, omap3 later on.
 
> Unfortunately, RTC is just a small part of problem.

Can you try just setting the related drivers to be regular
module initcalls and see if that solves the problem?

Regards,

Tony
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" 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/pinctrl/pinctrl-single.c 
b/drivers/pinctrl/pinctrl-single.c
index 5c32e88..b2a9d4b 100644
--- a/drivers/pinctrl/pinctrl-single.c
+++ b/drivers/pinctrl/pinctrl-single.c
@@ -1014,7 +1014,18 @@  static struct platform_driver pcs_driver = {
         },
  };

-module_platform_driver(pcs_driver);
+static int __init pcs_driver_drv_init(void)
+{
+       return platform_driver_register(&pcs_driver);
+}
+postcore_initcall(pcs_driver_drv_init);
+
+static void __exit pcs_driver_drv_exit(void)
+{
+       platform_driver_unregister(&pcs_driver);
+}
+module_exit(pcs_driver_drv_exit);
+

  MODULE_AUTHOR("Tony Lindgren <tony@atomide.com>");
  MODULE_DESCRIPTION("One-register-per-pin type device tree based