omap: mfd/regulator: twl/core: init order
Subsystems (2)
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?
Thanks
-- Christoph
Quoted 12 lines · Christoph Fritz
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 timetwl_priv->twl_idisn't configured yet).
Quoted 7 lines
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:
drivers/pinctrl/pinctrl-single.c +12 -1
@@ -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 <[email protected]>" ); MODULE_DESCRIPTION("One-register-per-pin type device tree based
pinctrl driver");
Quoted 7 lines
Thanks
-- Christoph--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 56 lines · Grygorii Strashko
Quoted 12 lines · Christoph Fritz
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 timetwl_priv->twl_idisn't configured yet).Quoted 7 lines
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 probedeferral
I think following change should fix it, could you try it, pls:
drivers/pinctrl/pinctrl-single.c +2
-1@@ -1014,7 +1014,18 @@ static struct platform_driver pcs_driver = { }, }; -module_platform_driver (pcs_driver); +static int __init pcs_driver_drv_init (void ) +{
drivers/pinctrl/pinctrl-single.c static struct platform_driver pcs_driver = { · line 1028
Quoted 10 lines
drivers/pinctrl/pinctrl-single.c +10
-0+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
Quoted 71 lines · Christoph Fritz
Quoted 56 lines · Grygorii Strashko
Quoted 12 lines · Christoph Fritz
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 timetwl_priv->twl_idisn't configured yet).Quoted 7 lines
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 probedeferral
I think following change should fix it, could you try it, pls:
drivers/pinctrl/pinctrl-single.c +2
-1@@ -1014,7 +1014,18 @@ static struct platform_driver pcs_driver = { }, }; -module_platform_driver (pcs_driver); +static int __init pcs_driver_drv_init (void ) +{drivers/pinctrl/pinctrl-single.c static struct platform_driver pcs_driver = { · line 1028
Quoted 10 lines
drivers/pinctrl/pinctrl-single.c +10
-0+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 :-)
Quoted 1 line
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.
Quoted 6 lines
Thanks
-- Christoph
Tony Lindgren
maintainerQuoted 25 lines · Grygorii Strashko
Quoted 24 lines · Christoph Fritz
Quoted 9 lines · Grygorii Strashko
drivers/pinctrl/pinctrl-single.c +2
-1@@ -1014,7 +1014,18 @@ static struct platform_driver pcs_driver = { }, }; -module_platform_driver (pcs_driver); +static int __init pcs_driver_drv_init (void ) +{drivers/pinctrl/pinctrl-single.c static struct platform_driver pcs_driver = { · line 1028
Quoted 10 lines
drivers/pinctrl/pinctrl-single.c +10
-0+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 :-)
Quoted 3 lines
Quoted 1 line
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
A message that is not in the archive (sent off-list or not yet received): [email protected]
Quoted 4 lines · Tony Lindgren
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.
Signature · 1 line
Péter
Quoted 7 lines · Peter Ujfalusi
Quoted 4 lines · Tony Lindgren
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
Tony Lindgren
maintainerQuoted 6 lines · Grygorii Strashko
Quoted 5 lines · Peter Ujfalusi
Quoted 4 lines · Tony Lindgren
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?
Quoted 6 lines
Quoted 2 lines
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 atsubsys_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.
Quoted 2 lines
- 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?
Quoted 7 lines
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_hsmmcdriver'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?
Quoted 3 lines
Before, on early kernel versions, the OMAP pinmux was ready to work at
arch_initcalltime
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.
Quoted 1 line
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