Commit 2f8d1197 authored by David Brownell's avatar David Brownell Committed by Linus Torvalds

gpio: i2c expanders use subsys_init

Make the I2C external GPIO expander drivers register themselves at
subsys_initcall() time when they're statically linked.

SOC-integrated GPIOs are available starting very early -- early in
arch_initcall() at latest, but often even before initcalls start to run --
so this improves consistency, so more subsystems can rely on GPIOs in
their own subsys_initcall() code.

(This isn't a theoretical problem.  This is one of several patches needed
to resolve oopsing observed when statically linking kernels on a DaVinci
EVM.  Its pcf857x GPIOs needed to be available well before some other
drivers initialized.)
Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Cc: Jean Delvare <khali@linux-fr.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 3d599d1c
...@@ -372,7 +372,10 @@ static int __init max732x_init(void) ...@@ -372,7 +372,10 @@ static int __init max732x_init(void)
{ {
return i2c_add_driver(&max732x_driver); return i2c_add_driver(&max732x_driver);
} }
module_init(max732x_init); /* register after i2c postcore initcall and before
* subsys initcalls that may rely on these GPIOs
*/
subsys_initcall(max732x_init);
static void __exit max732x_exit(void) static void __exit max732x_exit(void)
{ {
......
...@@ -289,7 +289,10 @@ static int __init pca953x_init(void) ...@@ -289,7 +289,10 @@ static int __init pca953x_init(void)
{ {
return i2c_add_driver(&pca953x_driver); return i2c_add_driver(&pca953x_driver);
} }
module_init(pca953x_init); /* register after i2c postcore initcall and before
* subsys initcalls that may rely on these GPIOs
*/
subsys_initcall(pca953x_init);
static void __exit pca953x_exit(void) static void __exit pca953x_exit(void)
{ {
......
...@@ -351,7 +351,10 @@ static int __init pcf857x_init(void) ...@@ -351,7 +351,10 @@ static int __init pcf857x_init(void)
{ {
return i2c_add_driver(&pcf857x_driver); return i2c_add_driver(&pcf857x_driver);
} }
module_init(pcf857x_init); /* register after i2c postcore initcall and before
* subsys initcalls that may rely on these GPIOs
*/
subsys_initcall(pcf857x_init);
static void __exit pcf857x_exit(void) static void __exit pcf857x_exit(void)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment