[PATCH] gpiolib: make legacy interfaces optional

Arnd Bergmann posted 1 patch 2 months, 2 weeks ago
drivers/gpio/Kconfig  |  3 +++
drivers/gpio/Makefile |  2 +-
include/linux/gpio.h  | 10 ++++++----
3 files changed, 10 insertions(+), 5 deletions(-)
[PATCH] gpiolib: make legacy interfaces optional
Posted by Arnd Bergmann 2 months, 2 weeks ago
From: Arnd Bergmann <arnd@arndb.de>

The traditional interfaces are only used on a small number of ancient
boards. Make these optional now so they can be disabled by default.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
This is the first patch of a series to turn off the legacy interfaces
by default. If we can still have this one in linux-6.17, we can more
easily merge the other patches for 6.18.

See for the longer series:
https://git.kernel.org/pub/scm/linux/kernel/git/arnd/playground.git/log/?h=config-gpio-legacy

I'm sure there are still problems in the other patches, but it
does pass my randconfig build tests on the three architectures
I'm testing on. I plan to post them after some more testing
once -rc1 is out.

 drivers/gpio/Kconfig  |  3 +++
 drivers/gpio/Makefile |  2 +-
 include/linux/gpio.h  | 10 ++++++----
 3 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 12bdf6e965f1..8bda3c9d47b4 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -14,6 +14,9 @@ menuconfig GPIOLIB
 
 if GPIOLIB
 
+config GPIOLIB_LEGACY
+	def_bool y
+
 config GPIOLIB_FASTPATH_LIMIT
 	int "Maximum number of GPIOs for fast path"
 	range 32 512
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index 88dedd298256..b01ff2b68bf6 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -5,7 +5,7 @@ ccflags-$(CONFIG_DEBUG_GPIO)	+= -DDEBUG
 
 obj-$(CONFIG_GPIOLIB)		+= gpiolib.o
 obj-$(CONFIG_GPIOLIB)		+= gpiolib-devres.o
-obj-$(CONFIG_GPIOLIB)		+= gpiolib-legacy.o
+obj-$(CONFIG_GPIOLIB_LEGACY)	+= gpiolib-legacy.o
 obj-$(CONFIG_OF_GPIO)		+= gpiolib-of.o
 obj-$(CONFIG_GPIO_CDEV)		+= gpiolib-cdev.o
 obj-$(CONFIG_GPIO_SYSFS)	+= gpiolib-sysfs.o
diff --git a/include/linux/gpio.h b/include/linux/gpio.h
index ff99ed76fdc3..8f85ddb26429 100644
--- a/include/linux/gpio.h
+++ b/include/linux/gpio.h
@@ -13,6 +13,11 @@
 #define __LINUX_GPIO_H
 
 #include <linux/types.h>
+#ifdef CONFIG_GPIOLIB
+#include <linux/gpio/consumer.h>
+#endif
+
+#ifdef CONFIG_GPIOLIB_LEGACY
 
 struct device;
 
@@ -22,9 +27,6 @@ struct device;
 #define GPIOF_OUT_INIT_HIGH	((0 << 0) | (1 << 1))
 
 #ifdef CONFIG_GPIOLIB
-
-#include <linux/gpio/consumer.h>
-
 /*
  * "valid" GPIO numbers are nonnegative and may be passed to
  * setup routines like gpio_request().  Only some valid numbers
@@ -170,5 +172,5 @@ static inline int devm_gpio_request_one(struct device *dev, unsigned gpio,
 }
 
 #endif /* ! CONFIG_GPIOLIB */
-
+#endif /* CONFIG_GPIOLIB_LEGACY */
 #endif /* __LINUX_GPIO_H */
-- 
2.39.5
Re: (subset) [PATCH] gpiolib: make legacy interfaces optional
Posted by Bartosz Golaszewski 2 months, 1 week ago
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>


On Tue, 22 Jul 2025 17:35:43 +0200, Arnd Bergmann wrote:
> The traditional interfaces are only used on a small number of ancient
> boards. Make these optional now so they can be disabled by default.
> 
> 

Applied, thanks!

[1/1] gpiolib: make legacy interfaces optional
      https://git.kernel.org/brgl/linux/c/678bae2eaa812662929a83b3de399645e9de93ad

Best regards,
-- 
Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Re: [PATCH] gpiolib: make legacy interfaces optional
Posted by Andy Shevchenko 2 months, 2 weeks ago
On Tue, Jul 22, 2025 at 05:35:43PM +0200, Arnd Bergmann wrote:
> 
> The traditional interfaces are only used on a small number of ancient
> boards. Make these optional now so they can be disabled by default.

...

> +#ifdef CONFIG_GPIOLIB
> +#include <linux/gpio/consumer.h>
> +#endif

>  #ifdef CONFIG_GPIOLIB
> -
> -#include <linux/gpio/consumer.h>
> -

Why is the above needed to be changed?

-- 
With Best Regards,
Andy Shevchenko
Re: [PATCH] gpiolib: make legacy interfaces optional
Posted by Bartosz Golaszewski 2 months, 2 weeks ago
On Tue, Jul 22, 2025 at 5:36 PM Arnd Bergmann <arnd@kernel.org> wrote:
>
> From: Arnd Bergmann <arnd@arndb.de>
>
> The traditional interfaces are only used on a small number of ancient
> boards. Make these optional now so they can be disabled by default.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
> This is the first patch of a series to turn off the legacy interfaces
> by default. If we can still have this one in linux-6.17, we can more
> easily merge the other patches for 6.18.
>
> See for the longer series:
> https://git.kernel.org/pub/scm/linux/kernel/git/arnd/playground.git/log/?h=config-gpio-legacy
>
> I'm sure there are still problems in the other patches, but it
> does pass my randconfig build tests on the three architectures
> I'm testing on. I plan to post them after some more testing
> once -rc1 is out.
>
>  drivers/gpio/Kconfig  |  3 +++
>  drivers/gpio/Makefile |  2 +-
>  include/linux/gpio.h  | 10 ++++++----
>  3 files changed, 10 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
> index 12bdf6e965f1..8bda3c9d47b4 100644
> --- a/drivers/gpio/Kconfig
> +++ b/drivers/gpio/Kconfig
> @@ -14,6 +14,9 @@ menuconfig GPIOLIB
>
>  if GPIOLIB
>
> +config GPIOLIB_LEGACY
> +       def_bool y
> +
>  config GPIOLIB_FASTPATH_LIMIT
>         int "Maximum number of GPIOs for fast path"
>         range 32 512
> diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
> index 88dedd298256..b01ff2b68bf6 100644
> --- a/drivers/gpio/Makefile
> +++ b/drivers/gpio/Makefile
> @@ -5,7 +5,7 @@ ccflags-$(CONFIG_DEBUG_GPIO)    += -DDEBUG
>
>  obj-$(CONFIG_GPIOLIB)          += gpiolib.o
>  obj-$(CONFIG_GPIOLIB)          += gpiolib-devres.o
> -obj-$(CONFIG_GPIOLIB)          += gpiolib-legacy.o
> +obj-$(CONFIG_GPIOLIB_LEGACY)   += gpiolib-legacy.o
>  obj-$(CONFIG_OF_GPIO)          += gpiolib-of.o
>  obj-$(CONFIG_GPIO_CDEV)                += gpiolib-cdev.o
>  obj-$(CONFIG_GPIO_SYSFS)       += gpiolib-sysfs.o
> diff --git a/include/linux/gpio.h b/include/linux/gpio.h
> index ff99ed76fdc3..8f85ddb26429 100644
> --- a/include/linux/gpio.h
> +++ b/include/linux/gpio.h
> @@ -13,6 +13,11 @@
>  #define __LINUX_GPIO_H
>
>  #include <linux/types.h>
> +#ifdef CONFIG_GPIOLIB
> +#include <linux/gpio/consumer.h>

I want to queue this ASAP but do we really need this guard here?
consumer.h already guards against !CONFIG_GPIOLIB internally, right?

Bart

> +#endif
> +
> +#ifdef CONFIG_GPIOLIB_LEGACY
>
>  struct device;
>
> @@ -22,9 +27,6 @@ struct device;
>  #define GPIOF_OUT_INIT_HIGH    ((0 << 0) | (1 << 1))
>
>  #ifdef CONFIG_GPIOLIB
> -
> -#include <linux/gpio/consumer.h>
> -
>  /*
>   * "valid" GPIO numbers are nonnegative and may be passed to
>   * setup routines like gpio_request().  Only some valid numbers
> @@ -170,5 +172,5 @@ static inline int devm_gpio_request_one(struct device *dev, unsigned gpio,
>  }
>
>  #endif /* ! CONFIG_GPIOLIB */
> -
> +#endif /* CONFIG_GPIOLIB_LEGACY */
>  #endif /* __LINUX_GPIO_H */
> --
> 2.39.5
>
Re: [PATCH] gpiolib: make legacy interfaces optional
Posted by Andy Shevchenko 2 months, 2 weeks ago
On Wed, Jul 23, 2025 at 10:39:32AM +0200, Bartosz Golaszewski wrote:
> On Tue, Jul 22, 2025 at 5:36 PM Arnd Bergmann <arnd@kernel.org> wrote:

...

> > +#ifdef CONFIG_GPIOLIB
> > +#include <linux/gpio/consumer.h>
> 
> I want to queue this ASAP but do we really need this guard here?
> consumer.h already guards against !CONFIG_GPIOLIB internally, right?

I probably missed something, but I do not understand why we need this include
at all in the gpio.h.

> > +#endif


-- 
With Best Regards,
Andy Shevchenko


Re: [PATCH] gpiolib: make legacy interfaces optional
Posted by Arnd Bergmann 2 months, 1 week ago
On Wed, Jul 23, 2025, at 16:17, Andy Shevchenko wrote:
> On Wed, Jul 23, 2025 at 10:39:32AM +0200, Bartosz Golaszewski wrote:
>> On Tue, Jul 22, 2025 at 5:36 PM Arnd Bergmann <arnd@kernel.org> wrote:
>
> ...
>
>> > +#ifdef CONFIG_GPIOLIB
>> > +#include <linux/gpio/consumer.h>
>> 
>> I want to queue this ASAP but do we really need this guard here?
>> consumer.h already guards against !CONFIG_GPIOLIB internally, right?
>
> I probably missed something, but I do not understand why we need this include
> at all in the gpio.h.

We've been thinning out linux/gpio.h over the years on both the contents
and the inclusions, but I'm fairly sure that out of the 173 files that
still include it, the majority actually need the consumer interfaces.

One thing I've considered doing here was to make this file only contain
two lines

#include <linux/gpio/consumer.h>
#include <linux/gpio/legacy.h>

then then replace all of the remaining users with one or the other
in order to remove linux/gpio.h completely.

I think both approaches are useful and can be combined, but the
CONFIG_GPIOLIB_LEGACY patch seems sufficient for now.

If you want to experiment with the other one, you could try
my whole series and drop the #include <linux/gpio/consumer.h>
line to find all the instances in allmodconfig builds that should
use that in place of linux/gpio.h.

      Arnd
Re: [PATCH] gpiolib: make legacy interfaces optional
Posted by Alexander Sverdlin 2 months, 2 weeks ago
On Tue, 2025-07-22 at 17:35 +0200, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd@arndb.de>
> 
> The traditional interfaces are only used on a small number of ancient
> boards. Make these optional now so they can be disabled by default.
> 
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

Reviewed-by: Alexander Sverdlin <alexander.sverdlin@gmail.com>

> ---
> This is the first patch of a series to turn off the legacy interfaces
> by default. If we can still have this one in linux-6.17, we can more
> easily merge the other patches for 6.18.
> 
> See for the longer series:
> https://git.kernel.org/pub/scm/linux/kernel/git/arnd/playground.git/log/?h=config-gpio-legacy
> 
> I'm sure there are still problems in the other patches, but it
> does pass my randconfig build tests on the three architectures
> I'm testing on. I plan to post them after some more testing
> once -rc1 is out.
> 
>  drivers/gpio/Kconfig  |  3 +++
>  drivers/gpio/Makefile |  2 +-
>  include/linux/gpio.h  | 10 ++++++----
>  3 files changed, 10 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
> index 12bdf6e965f1..8bda3c9d47b4 100644
> --- a/drivers/gpio/Kconfig
> +++ b/drivers/gpio/Kconfig
> @@ -14,6 +14,9 @@ menuconfig GPIOLIB
>  
>  if GPIOLIB
>  
> +config GPIOLIB_LEGACY
> +	def_bool y
> +
>  config GPIOLIB_FASTPATH_LIMIT
>  	int "Maximum number of GPIOs for fast path"
>  	range 32 512
> diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
> index 88dedd298256..b01ff2b68bf6 100644
> --- a/drivers/gpio/Makefile
> +++ b/drivers/gpio/Makefile
> @@ -5,7 +5,7 @@ ccflags-$(CONFIG_DEBUG_GPIO)	+= -DDEBUG
>  
>  obj-$(CONFIG_GPIOLIB)		+= gpiolib.o
>  obj-$(CONFIG_GPIOLIB)		+= gpiolib-devres.o
> -obj-$(CONFIG_GPIOLIB)		+= gpiolib-legacy.o
> +obj-$(CONFIG_GPIOLIB_LEGACY)	+= gpiolib-legacy.o
>  obj-$(CONFIG_OF_GPIO)		+= gpiolib-of.o
>  obj-$(CONFIG_GPIO_CDEV)		+= gpiolib-cdev.o
>  obj-$(CONFIG_GPIO_SYSFS)	+= gpiolib-sysfs.o
> diff --git a/include/linux/gpio.h b/include/linux/gpio.h
> index ff99ed76fdc3..8f85ddb26429 100644
> --- a/include/linux/gpio.h
> +++ b/include/linux/gpio.h
> @@ -13,6 +13,11 @@
>  #define __LINUX_GPIO_H
>  
>  #include <linux/types.h>
> +#ifdef CONFIG_GPIOLIB
> +#include <linux/gpio/consumer.h>
> +#endif
> +
> +#ifdef CONFIG_GPIOLIB_LEGACY
>  
>  struct device;
>  
> @@ -22,9 +27,6 @@ struct device;
>  #define GPIOF_OUT_INIT_HIGH	((0 << 0) | (1 << 1))
>  
>  #ifdef CONFIG_GPIOLIB
> -
> -#include <linux/gpio/consumer.h>
> -
>  /*
>   * "valid" GPIO numbers are nonnegative and may be passed to
>   * setup routines like gpio_request().  Only some valid numbers
> @@ -170,5 +172,5 @@ static inline int devm_gpio_request_one(struct device *dev, unsigned gpio,
>  }
>  
>  #endif /* ! CONFIG_GPIOLIB */
> -
> +#endif /* CONFIG_GPIOLIB_LEGACY */
>  #endif /* __LINUX_GPIO_H */

-- 
Alexander Sverdlin.