gpio: omap: Allow building as a loadable module
Subsystems (2)
PATCH 1/1 gpio: omap: Allow building as a loadable module
We currently get all kinds of errors building the omap gpio driver as a module starting with:
undefined reference to omap2_gpio_resume_after_idle' undefined reference to omap2_gpio_prepare_for_idle'
...
Let's fix the issue by adding inline functions to the header. Note that we can now also remove the two unused functions for omap_set_gpio_debounce and omap_set_gpio_debounce_time.
Then doing rmmod on the module produces further warnings because of missing exit related functions. Let's add those.
And finally, we can make the Kconfig entry just a tristate option that's selected for omaps.
--- drivers/gpio/Kconfig | 2 +- drivers/gpio/gpio-omap.c | 24 ++++++++++++++++++++++++ include/linux/platform_data/gpio-omap.h | 12 ++++++++++-- 3 files changed, 35 insertions(+), 3 deletions(-)
drivers/gpio/Kconfig +1 -1
@@ -308,7 +308,7 @@ config GPIO_OCTEON family of SOCs. config GPIO_OMAP - bool "TI OMAP GPIO support" if COMPILE_TEST && !ARCH_OMAP2PLUS + tristate "TI OMAP GPIO support" if ARCH_OMAP2PLUS || COMPILE_TEST default y if ARCH_OMAP depends on ARM select GENERIC_IRQ_CHIP
drivers/gpio/gpio-omap.c +24 -0
@@ -1202,6 +1202,17 @@ static int omap_gpio_probe(struct platform_device *pdev)return 0 ; } +static int omap_gpio_remove (struct platform_device *pdev) +{ +struct gpio_bank *bank =platform_get_drvdata (pdev); + +list_del (&bank->node); +gpiochip_remove (&bank->chip); +pm_runtime_disable (bank->dev); + +return 0 ; +} +#ifdef CONFIG_ARCH_OMAP2PLUS #if defined(CONFIG_PM )
@@ -1387,6 +1398,7 @@ static int omap_gpio_runtime_resume(struct device *dev) }#endif /* CONFIG_PM */ +#if IS_BUILTIN (CONFIG_GPIO_OMAP )void omap2_gpio_prepare_for_idle (int pwr_mode) {struct gpio_bank *bank;
@@ -1412,6 +1424,7 @@ void omap2_gpio_resume_after_idle(void) pm_runtime_get_sync(bank->dev); } } +#endif #if defined(CONFIG_PM )static void omap_gpio_init_context (struct gpio_bank *p)
@@ -1567,6 +1580,7 @@ MODULE_DEVICE_TABLE(of, omap_gpio_match);static struct platform_driver omap_gpio_driver = { .probe = omap_gpio_probe, + .remove = omap_gpio_remove, .driver = { .name ="omap_gpio" , .pm = &gpio_pm_ops,
@@ -1584,3 +1598,13 @@ static int __init omap_gpio_drv_reg(void)return platform_driver_register (&omap_gpio_driver); }postcore_initcall (omap_gpio_drv_reg); + +static void __exit omap_gpio_exit(void) +{ +platform_driver_unregister (&omap_gpio_driver); +} +module_exit (omap_gpio_exit); + +MODULE_DESCRIPTION ("omap gpio driver" ); +MODULE_ALIAS ("platform:gpio-omap" ); +MODULE_LICENSE ("GPL v2" );
include/linux/platform_data/gpio-omap.h +10 -2
@@ -208,9 +208,17 @@ struct omap_gpio_platform_data { int (*get_context_loss_count)(struct device *dev); }; +#if IS_BUILTIN (CONFIG_GPIO_OMAP )extern void omap2_gpio_prepare_for_idle (int off_mode);extern void omap2_gpio_resume_after_idle (void ); -extern void omap_set_gpio_debounce (int gpio,int enable); -extern void omap_set_gpio_debounce_time (int gpio,int enable); +#else +static inline void omap2_gpio_prepare_for_idle (int off_mode) +{ +} + +static inline void omap2_gpio_resume_after_idle (void ) +{ +} +#endif #endif
Signature · 1 line
2.1.4
PATCH 1/1 gpio: omap: Allow building as a loadable module
Quoted 11 lines · Tony Lindgren
We currently get all kinds of errors building the omap gpio driver as a module starting with:
undefined reference to
omap2_gpio_resume_after_idle' undefined reference toomap2_gpio_prepare_for_idle'
...Let's fix the issue by adding inline functions to the header. Note that we can now also remove the two unused functions for
omap_set_gpio_debounceandomap_set_gpio_debounce_time.
Quoted 5 lines
Then doing rmmod on the module produces further warnings because of missing exit related functions. Let's add those.
And finally, we can make the
Kconfigentry just a tristate option that's selected for omaps.
boot tested on: dra7-evm with gpio-omap.ko
Quoted 112 lines
Cc Felipe Balbi <[email protected]>Cc Javier Martinez Canillas <[email protected]>Cc Grygorii Strashko <[email protected]>Cc Kevin Hilman <[email protected]>Cc Nishanth Menon <[email protected]>Cc Santosh Shilimkar <[email protected]>Signed-off-by Tony Lindgren <[email protected]>--- drivers/gpio/Kconfig | 2 +- drivers/gpio/gpio-omap.c | 24 ++++++++++++++++++++++++ include/linux/platform_data/gpio-omap.h | 12 ++++++++++-- 3 files changed, 35 insertions(+), 3 deletions(-)drivers/gpio/Kconfig +1
-1@@ -308,7 +308,7 @@ config GPIO_OCTEON family of SOCs. config GPIO_OMAP - bool "TI OMAP GPIO support" if COMPILE_TEST && !ARCH_OMAP2PLUS + tristate "TI OMAP GPIO support" if ARCH_OMAP2PLUS || COMPILE_TEST default y if ARCH_OMAP depends on ARM select GENERIC_IRQ_CHIPdrivers/gpio/gpio-omap.c +24
-0@@ -1202,6 +1202,17 @@ static int omap_gpio_probe(struct platform_device *pdev)return 0 ; } +static int omap_gpio_remove (struct platform_device *pdev) +{ +struct gpio_bank *bank =platform_get_drvdata (pdev); + +list_del (&bank->node); +gpiochip_remove (&bank->chip); +pm_runtime_disable (bank->dev); + +return 0 ; +} +#ifdef CONFIG_ARCH_OMAP2PLUS #if defined(CONFIG_PM )@@ -1387,6 +1398,7 @@ static int omap_gpio_runtime_resume(struct device *dev) }#endif /* CONFIG_PM */ +#if IS_BUILTIN (CONFIG_GPIO_OMAP )void omap2_gpio_prepare_for_idle (int pwr_mode) {struct gpio_bank *bank;@@ -1412,6 +1424,7 @@ void omap2_gpio_resume_after_idle(void) pm_runtime_get_sync(bank->dev); } } +#endif #if defined(CONFIG_PM )static void omap_gpio_init_context (struct gpio_bank *p)@@ -1567,6 +1580,7 @@ MODULE_DEVICE_TABLE(of, omap_gpio_match);static struct platform_driver omap_gpio_driver = { .probe = omap_gpio_probe, + .remove = omap_gpio_remove, .driver = { .name ="omap_gpio" , .pm = &gpio_pm_ops,@@ -1584,3 +1598,13 @@ static int __init omap_gpio_drv_reg(void)return platform_driver_register (&omap_gpio_driver); }postcore_initcall (omap_gpio_drv_reg); + +static void __exit omap_gpio_exit(void) +{ +platform_driver_unregister (&omap_gpio_driver); +} +module_exit (omap_gpio_exit); + +MODULE_DESCRIPTION ("omap gpio driver" ); +MODULE_ALIAS ("platform:gpio-omap" ); +MODULE_LICENSE ("GPL v2" );include/linux/platform_data/gpio-omap.h +10
-2@@ -208,9 +208,17 @@ struct omap_gpio_platform_data { int (*get_context_loss_count)(struct device *dev); }; +#if IS_BUILTIN (CONFIG_GPIO_OMAP )extern void omap2_gpio_prepare_for_idle (int off_mode);extern void omap2_gpio_resume_after_idle (void ); -extern void omap_set_gpio_debounce (int gpio,int enable); -extern void omap_set_gpio_debounce_time (int gpio,int enable); +#else +static inline void omap2_gpio_prepare_for_idle (int off_mode) +{ +} + +static inline void omap2_gpio_resume_after_idle (void ) +{ +} +#endif #endif
Signature · 2 lines
regards, -grygorii
PATCH 1/1 gpio: omap: Allow building as a loadable module
In reply to Tony LindgrenQuoted 24 lines · Tony Lindgren
We currently get all kinds of errors building the omap gpio driver as a module starting with:
undefined reference to
omap2_gpio_resume_after_idle' undefined reference toomap2_gpio_prepare_for_idle'
...Let's fix the issue by adding inline functions to the header. Note that we can now also remove the two unused functions for
omap_set_gpio_debounceandomap_set_gpio_debounce_time.Then doing rmmod on the module produces further warnings because of missing exit related functions. Let's add those.
And finally, we can make the
Kconfigentry just a tristate option that's selected for omaps.Cc Felipe Balbi <[email protected]>Cc Javier Martinez Canillas <[email protected]>Cc Grygorii Strashko <[email protected]>Cc Kevin Hilman <[email protected]>Cc Nishanth Menon <[email protected]>Cc Santosh Shilimkar <[email protected]>Signed-off-by Tony Lindgren <[email protected]>
Quoted 6 lines
--- drivers/gpio/Kconfig | 2 +- drivers/gpio/gpio-omap.c | 24 ++++++++++++++++++++++++ include/linux/platform_data/gpio-omap.h | 12 ++++++++++-- 3 files changed, 35 insertions(+), 3 deletions(-)
That platform header needs serious clean-up and we now add two more inlines there.
But, being able to use gpio as loadable module
might be good enough reason to take this one.
PATCH 1/1 gpio: omap: Allow building as a loadable module
In reply to Tony LindgrenQuoted 17 lines · Tony Lindgren
We currently get all kinds of errors building the omap gpio driver as a module starting with:
undefined reference to
omap2_gpio_resume_after_idle' undefined reference toomap2_gpio_prepare_for_idle'
...Let's fix the issue by adding inline functions to the header. Note that we can now also remove the two unused functions for
omap_set_gpio_debounceandomap_set_gpio_debounce_time.Then doing rmmod on the module produces further warnings because of missing exit related functions. Let's add those.
And finally, we can make the
Kconfigentry just a tristate option that's selected for omaps.
Quoted 7 lines
Cc Felipe Balbi <[email protected]>Cc Javier Martinez Canillas <[email protected]>Cc Grygorii Strashko <[email protected]>Cc Kevin Hilman <[email protected]>Cc Nishanth Menon <[email protected]>Cc Santosh Shilimkar <[email protected]>Signed-off-by Tony Lindgren <[email protected]>
Just to be clear: when GPIO is a module, we can't really idle, can we ?
Quoted 106 lines
--- drivers/gpio/Kconfig | 2 +- drivers/gpio/gpio-omap.c | 24 ++++++++++++++++++++++++ include/linux/platform_data/gpio-omap.h | 12 ++++++++++-- 3 files changed, 35 insertions(+), 3 deletions(-)drivers/gpio/Kconfig +1
-1@@ -308,7 +308,7 @@ config GPIO_OCTEON family of SOCs. config GPIO_OMAP - bool "TI OMAP GPIO support" if COMPILE_TEST && !ARCH_OMAP2PLUS + tristate "TI OMAP GPIO support" if ARCH_OMAP2PLUS || COMPILE_TEST default y if ARCH_OMAP depends on ARM select GENERIC_IRQ_CHIPdrivers/gpio/gpio-omap.c +24
-0@@ -1202,6 +1202,17 @@ static int omap_gpio_probe(struct platform_device *pdev)return 0 ; } +static int omap_gpio_remove (struct platform_device *pdev) +{ +struct gpio_bank *bank =platform_get_drvdata (pdev); + +list_del (&bank->node); +gpiochip_remove (&bank->chip); +pm_runtime_disable (bank->dev); + +return 0 ; +} +#ifdef CONFIG_ARCH_OMAP2PLUS #if defined(CONFIG_PM )@@ -1387,6 +1398,7 @@ static int omap_gpio_runtime_resume(struct device *dev) }#endif /* CONFIG_PM */ +#if IS_BUILTIN (CONFIG_GPIO_OMAP )void omap2_gpio_prepare_for_idle (int pwr_mode) {struct gpio_bank *bank;@@ -1412,6 +1424,7 @@ void omap2_gpio_resume_after_idle(void) pm_runtime_get_sync(bank->dev); } } +#endif #if defined(CONFIG_PM )static void omap_gpio_init_context (struct gpio_bank *p)@@ -1567,6 +1580,7 @@ MODULE_DEVICE_TABLE(of, omap_gpio_match);static struct platform_driver omap_gpio_driver = { .probe = omap_gpio_probe, + .remove = omap_gpio_remove, .driver = { .name ="omap_gpio" , .pm = &gpio_pm_ops,@@ -1584,3 +1598,13 @@ static int __init omap_gpio_drv_reg(void)return platform_driver_register (&omap_gpio_driver); }postcore_initcall (omap_gpio_drv_reg); + +static void __exit omap_gpio_exit(void) +{ +platform_driver_unregister (&omap_gpio_driver); +} +module_exit (omap_gpio_exit); + +MODULE_DESCRIPTION ("omap gpio driver" ); +MODULE_ALIAS ("platform:gpio-omap" ); +MODULE_LICENSE ("GPL v2" );include/linux/platform_data/gpio-omap.h +10
-2@@ -208,9 +208,17 @@ struct omap_gpio_platform_data { int (*get_context_loss_count)(struct device *dev); }; +#if IS_BUILTIN (CONFIG_GPIO_OMAP )extern void omap2_gpio_prepare_for_idle (int off_mode);extern void omap2_gpio_resume_after_idle (void ); -extern void omap_set_gpio_debounce (int gpio,int enable); -extern void omap_set_gpio_debounce_time (int gpio,int enable); +#else +static inline void omap2_gpio_prepare_for_idle (int off_mode) +{ +} + +static inline void omap2_gpio_resume_after_idle (void ) +{ +} +#endif #endif Signature · 1 line
2.1.4
Signature · 8 lines
balbi -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20150424/e9d135df/attachment-0001.sig>
PATCH 1/1 gpio: omap: Allow building as a loadable module
Quoted 26 lines · Felipe Balbi
Quoted 17 lines · Tony Lindgren
We currently get all kinds of errors building the omap gpio driver as a module starting with:
undefined reference to
omap2_gpio_resume_after_idle' undefined reference toomap2_gpio_prepare_for_idle'
...Let's fix the issue by adding inline functions to the header. Note that we can now also remove the two unused functions for
omap_set_gpio_debounceandomap_set_gpio_debounce_time.Then doing rmmod on the module produces further warnings because of missing exit related functions. Let's add those.
And finally, we can make the
Kconfigentry just a tristate option that's selected for omaps.Quoted 7 lines
Cc Felipe Balbi <[email protected]>Cc Javier Martinez Canillas <[email protected]>Cc Grygorii Strashko <[email protected]>Cc Kevin Hilman <[email protected]>Cc Nishanth Menon <[email protected]>Cc Santosh Shilimkar <[email protected]>Signed-off-by Tony Lindgren <[email protected]>
Quoted 1 line
Just to be clear: when GPIO is a module, we can't really idle, can we ?
Right we cannot do off idle because of the context loss until we have some way to register driver specific idle functions.
Regards,
Tony
PATCH 1/1 gpio: omap: Allow building as a loadable module
In reply to Tony LindgrenQuoted 17 lines · Tony Lindgren
We currently get all kinds of errors building the omap gpio driver as a module starting with:
undefined reference to
omap2_gpio_resume_after_idle' undefined reference toomap2_gpio_prepare_for_idle'
...Let's fix the issue by adding inline functions to the header. Note that we can now also remove the two unused functions for
omap_set_gpio_debounceandomap_set_gpio_debounce_time.Then doing rmmod on the module produces further warnings because of missing exit related functions. Let's add those.
And finally, we can make the
Kconfigentry just a tristate option that's selected for omaps.
Quoted 7 lines
Cc Felipe Balbi <[email protected]>Cc Javier Martinez Canillas <[email protected]>Cc Grygorii Strashko <[email protected]>Cc Kevin Hilman <[email protected]>Cc Nishanth Menon <[email protected]>Cc Santosh Shilimkar <[email protected]>Signed-off-by Tony Lindgren <[email protected]>
Patch applied for v4.2.
Yours,
Linus Walleij