public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] gpiolib: move legacy interface into linux/gpio/legacy.h
@ 2026-04-28 15:45 Arnd Bergmann
  2026-04-28 15:53 ` Andy Shevchenko
  2026-05-04  7:59 ` Bartosz Golaszewski
  0 siblings, 2 replies; 5+ messages in thread
From: Arnd Bergmann @ 2026-04-28 15:45 UTC (permalink / raw)
  To: Linus Walleij, Bartosz Golaszewski
  Cc: Arnd Bergmann, Andy Shevchenko, Alexander Sverdlin, linux-kernel,
	linux-gpio

From: Arnd Bergmann <arnd@arndb.de>

Split the old contents from gpio.h for clarity. Ideally any driver
that still includes linux/gpio.h can now be ported over to use
either linux/gpio/legacy.h or linux/gpio/consumer.h, with the
original file getting removed once that is complete.

No functional changes intended for now.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 include/linux/gpio.h        | 161 +--------------------------------
 include/linux/gpio/legacy.h | 172 ++++++++++++++++++++++++++++++++++++
 2 files changed, 175 insertions(+), 158 deletions(-)
 create mode 100644 include/linux/gpio/legacy.h

diff --git a/include/linux/gpio.h b/include/linux/gpio.h
index 8f85ddb26429..149cf580d20b 100644
--- a/include/linux/gpio.h
+++ b/include/linux/gpio.h
@@ -2,12 +2,9 @@
 /*
  * NOTE: This header *must not* be included.
  *
- * This is the LEGACY GPIO bulk include file, including legacy APIs. It is
- * used for GPIO drivers still referencing the global GPIO numberspace,
- * and should not be included in new code.
- *
  * If you're implementing a GPIO driver, only include <linux/gpio/driver.h>
  * If you're implementing a GPIO consumer, only include <linux/gpio/consumer.h>
+ * If you're using the legacy interfaces, include <linux/gpio/legacy.h>
  */
 #ifndef __LINUX_GPIO_H
 #define __LINUX_GPIO_H
@@ -18,159 +15,7 @@
 #endif
 
 #ifdef CONFIG_GPIOLIB_LEGACY
-
-struct device;
-
-/* make these flag values available regardless of GPIO kconfig options */
-#define GPIOF_IN		((1 << 0))
-#define GPIOF_OUT_INIT_LOW	((0 << 0) | (0 << 1))
-#define GPIOF_OUT_INIT_HIGH	((0 << 0) | (1 << 1))
-
-#ifdef CONFIG_GPIOLIB
-/*
- * "valid" GPIO numbers are nonnegative and may be passed to
- * setup routines like gpio_request().  Only some valid numbers
- * can successfully be requested and used.
- *
- * Invalid GPIO numbers are useful for indicating no-such-GPIO in
- * platform data and other tables.
- */
-static inline bool gpio_is_valid(int number)
-{
-	/* only non-negative numbers are valid */
-	return number >= 0;
-}
-
-/*
- * Platforms may implement their GPIO interface with library code,
- * at a small performance cost for non-inlined operations and some
- * extra memory (for code and for per-GPIO table entries).
- */
-
-/* Always use the library code for GPIO management calls,
- * or when sleeping may be involved.
- */
-int gpio_request(unsigned gpio, const char *label);
-void gpio_free(unsigned gpio);
-
-static inline int gpio_direction_input(unsigned gpio)
-{
-	return gpiod_direction_input(gpio_to_desc(gpio));
-}
-static inline int gpio_direction_output(unsigned gpio, int value)
-{
-	return gpiod_direction_output_raw(gpio_to_desc(gpio), value);
-}
-
-static inline int gpio_get_value_cansleep(unsigned gpio)
-{
-	return gpiod_get_raw_value_cansleep(gpio_to_desc(gpio));
-}
-static inline void gpio_set_value_cansleep(unsigned gpio, int value)
-{
-	gpiod_set_raw_value_cansleep(gpio_to_desc(gpio), value);
-}
-
-static inline int gpio_get_value(unsigned gpio)
-{
-	return gpiod_get_raw_value(gpio_to_desc(gpio));
-}
-static inline void gpio_set_value(unsigned gpio, int value)
-{
-	gpiod_set_raw_value(gpio_to_desc(gpio), value);
-}
-
-static inline int gpio_to_irq(unsigned gpio)
-{
-	return gpiod_to_irq(gpio_to_desc(gpio));
-}
-
-int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
-
-int devm_gpio_request_one(struct device *dev, unsigned gpio,
-			  unsigned long flags, const char *label);
-
-#else /* ! CONFIG_GPIOLIB */
-
-#include <linux/kernel.h>
-
-#include <asm/bug.h>
-#include <asm/errno.h>
-
-static inline bool gpio_is_valid(int number)
-{
-	return false;
-}
-
-static inline int gpio_request(unsigned gpio, const char *label)
-{
-	return -ENOSYS;
-}
-
-static inline int gpio_request_one(unsigned gpio,
-					unsigned long flags, const char *label)
-{
-	return -ENOSYS;
-}
-
-static inline void gpio_free(unsigned gpio)
-{
-	might_sleep();
-
-	/* GPIO can never have been requested */
-	WARN_ON(1);
-}
-
-static inline int gpio_direction_input(unsigned gpio)
-{
-	return -ENOSYS;
-}
-
-static inline int gpio_direction_output(unsigned gpio, int value)
-{
-	return -ENOSYS;
-}
-
-static inline int gpio_get_value(unsigned gpio)
-{
-	/* GPIO can never have been requested or set as {in,out}put */
-	WARN_ON(1);
-	return 0;
-}
-
-static inline void gpio_set_value(unsigned gpio, int value)
-{
-	/* GPIO can never have been requested or set as output */
-	WARN_ON(1);
-}
-
-static inline int gpio_get_value_cansleep(unsigned gpio)
-{
-	/* GPIO can never have been requested or set as {in,out}put */
-	WARN_ON(1);
-	return 0;
-}
-
-static inline void gpio_set_value_cansleep(unsigned gpio, int value)
-{
-	/* GPIO can never have been requested or set as output */
-	WARN_ON(1);
-}
-
-static inline int gpio_to_irq(unsigned gpio)
-{
-	/* GPIO can never have been requested or set as input */
-	WARN_ON(1);
-	return -EINVAL;
-}
-
-static inline int devm_gpio_request_one(struct device *dev, unsigned gpio,
-					unsigned long flags, const char *label)
-{
-	WARN_ON(1);
-	return -EINVAL;
-}
-
-#endif /* ! CONFIG_GPIOLIB */
+#include <linux/gpio/legacy.h>
 #endif /* CONFIG_GPIOLIB_LEGACY */
+
 #endif /* __LINUX_GPIO_H */
diff --git a/include/linux/gpio/legacy.h b/include/linux/gpio/legacy.h
new file mode 100644
index 000000000000..da7308a69e8b
--- /dev/null
+++ b/include/linux/gpio/legacy.h
@@ -0,0 +1,172 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * This is the LEGACY GPIO include file, used only for legacy APIs.
+ *
+ * No new code should use this, but instead use the linux/gpio/consumer.h
+ * interfaces directly.
+ */
+#ifndef __LINUX_GPIO_LEGACY_H
+#define __LINUX_GPIO_LEGACY_H
+
+#include <linux/types.h>
+
+#ifdef CONFIG_GPIOLIB_LEGACY
+
+struct device;
+
+/* make these flag values available regardless of GPIO kconfig options */
+#define GPIOF_IN		((1 << 0))
+#define GPIOF_OUT_INIT_LOW	((0 << 0) | (0 << 1))
+#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
+ * can successfully be requested and used.
+ *
+ * Invalid GPIO numbers are useful for indicating no-such-GPIO in
+ * platform data and other tables.
+ */
+static inline bool gpio_is_valid(int number)
+{
+	/* only non-negative numbers are valid */
+	return number >= 0;
+}
+
+/*
+ * Platforms may implement their GPIO interface with library code,
+ * at a small performance cost for non-inlined operations and some
+ * extra memory (for code and for per-GPIO table entries).
+ */
+
+/* Always use the library code for GPIO management calls,
+ * or when sleeping may be involved.
+ */
+int gpio_request(unsigned gpio, const char *label);
+void gpio_free(unsigned gpio);
+
+static inline int gpio_direction_input(unsigned gpio)
+{
+	return gpiod_direction_input(gpio_to_desc(gpio));
+}
+static inline int gpio_direction_output(unsigned gpio, int value)
+{
+	return gpiod_direction_output_raw(gpio_to_desc(gpio), value);
+}
+
+static inline int gpio_get_value_cansleep(unsigned gpio)
+{
+	return gpiod_get_raw_value_cansleep(gpio_to_desc(gpio));
+}
+static inline void gpio_set_value_cansleep(unsigned gpio, int value)
+{
+	gpiod_set_raw_value_cansleep(gpio_to_desc(gpio), value);
+}
+
+static inline int gpio_get_value(unsigned gpio)
+{
+	return gpiod_get_raw_value(gpio_to_desc(gpio));
+}
+static inline void gpio_set_value(unsigned gpio, int value)
+{
+	gpiod_set_raw_value(gpio_to_desc(gpio), value);
+}
+
+static inline int gpio_to_irq(unsigned gpio)
+{
+	return gpiod_to_irq(gpio_to_desc(gpio));
+}
+
+int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
+
+int devm_gpio_request_one(struct device *dev, unsigned gpio,
+			  unsigned long flags, const char *label);
+
+#else /* ! CONFIG_GPIOLIB */
+
+#include <linux/kernel.h>
+
+#include <asm/bug.h>
+#include <asm/errno.h>
+
+static inline bool gpio_is_valid(int number)
+{
+	return false;
+}
+
+static inline int gpio_request(unsigned gpio, const char *label)
+{
+	return -ENOSYS;
+}
+
+static inline int gpio_request_one(unsigned gpio,
+					unsigned long flags, const char *label)
+{
+	return -ENOSYS;
+}
+
+static inline void gpio_free(unsigned gpio)
+{
+	might_sleep();
+
+	/* GPIO can never have been requested */
+	WARN_ON(1);
+}
+
+static inline int gpio_direction_input(unsigned gpio)
+{
+	return -ENOSYS;
+}
+
+static inline int gpio_direction_output(unsigned gpio, int value)
+{
+	return -ENOSYS;
+}
+
+static inline int gpio_get_value(unsigned gpio)
+{
+	/* GPIO can never have been requested or set as {in,out}put */
+	WARN_ON(1);
+	return 0;
+}
+
+static inline void gpio_set_value(unsigned gpio, int value)
+{
+	/* GPIO can never have been requested or set as output */
+	WARN_ON(1);
+}
+
+static inline int gpio_get_value_cansleep(unsigned gpio)
+{
+	/* GPIO can never have been requested or set as {in,out}put */
+	WARN_ON(1);
+	return 0;
+}
+
+static inline void gpio_set_value_cansleep(unsigned gpio, int value)
+{
+	/* GPIO can never have been requested or set as output */
+	WARN_ON(1);
+}
+
+static inline int gpio_to_irq(unsigned gpio)
+{
+	/* GPIO can never have been requested or set as input */
+	WARN_ON(1);
+	return -EINVAL;
+}
+
+static inline int devm_gpio_request_one(struct device *dev, unsigned gpio,
+					unsigned long flags, const char *label)
+{
+	WARN_ON(1);
+	return -EINVAL;
+}
+
+#endif /* ! CONFIG_GPIOLIB */
+#endif /* CONFIG_GPIOLIB_LEGACY */
+#endif /* __LINUX_GPIO_LEGAGY_H */
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] gpiolib: move legacy interface into linux/gpio/legacy.h
  2026-04-28 15:45 [PATCH] gpiolib: move legacy interface into linux/gpio/legacy.h Arnd Bergmann
@ 2026-04-28 15:53 ` Andy Shevchenko
  2026-04-28 16:17   ` Arnd Bergmann
  2026-05-04  7:59 ` Bartosz Golaszewski
  1 sibling, 1 reply; 5+ messages in thread
From: Andy Shevchenko @ 2026-04-28 15:53 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Linus Walleij, Bartosz Golaszewski, Arnd Bergmann,
	Alexander Sverdlin, linux-kernel, linux-gpio

On Tue, Apr 28, 2026 at 05:45:07PM +0200, Arnd Bergmann wrote:

> Split the old contents from gpio.h for clarity. Ideally any driver
> that still includes linux/gpio.h can now be ported over to use
> either linux/gpio/legacy.h or linux/gpio/consumer.h, with the
> original file getting removed once that is complete.
> 
> No functional changes intended for now.

But I'm not sure why. The idea to kill gpio.h completely, no need to keep it
longer than legacy stuff exists. I don't take 'clarity' as a good justification
here, since the old header are still there (however just a shallow wrapper).

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] gpiolib: move legacy interface into linux/gpio/legacy.h
  2026-04-28 15:53 ` Andy Shevchenko
@ 2026-04-28 16:17   ` Arnd Bergmann
  2026-04-29  8:48     ` Bartosz Golaszewski
  0 siblings, 1 reply; 5+ messages in thread
From: Arnd Bergmann @ 2026-04-28 16:17 UTC (permalink / raw)
  To: Andy Shevchenko, Arnd Bergmann
  Cc: Linus Walleij, Bartosz Golaszewski, Alexander Sverdlin,
	linux-kernel, open list:GPIO SUBSYSTEM

On Tue, Apr 28, 2026, at 17:53, Andy Shevchenko wrote:
> On Tue, Apr 28, 2026 at 05:45:07PM +0200, Arnd Bergmann wrote:
>
>> Split the old contents from gpio.h for clarity. Ideally any driver
>> that still includes linux/gpio.h can now be ported over to use
>> either linux/gpio/legacy.h or linux/gpio/consumer.h, with the
>> original file getting removed once that is complete.
>> 
>> No functional changes intended for now.
>
> But I'm not sure why. The idea to kill gpio.h completely, no need to keep it
> longer than legacy stuff exists. I don't take 'clarity' as a good justification
> here, since the old header are still there (however just a shallow wrapper).

I currently count 59 files that use the legacy header,
and I have a patch to change those over to include it
directly. I could post it now, but the exact list seems to
be changing by the day at the moment. It may be better
to split it up by subsystem once the first patch is merged,
or it could go through the gpio tree.

There are another 94 uses of linux/gpio.h that should
be linux/gpio/consumer.h instead. That patch is of course
trivial as well, but I have not prepared it yet.

I don't think the legacy stuff is going away any time soon,
so removing it from linux/gpio.h with the follow-up patch
should help avoid new instances getting merged unnoticed.

    Arnd

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] gpiolib: move legacy interface into linux/gpio/legacy.h
  2026-04-28 16:17   ` Arnd Bergmann
@ 2026-04-29  8:48     ` Bartosz Golaszewski
  0 siblings, 0 replies; 5+ messages in thread
From: Bartosz Golaszewski @ 2026-04-29  8:48 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Andy Shevchenko, Arnd Bergmann, Linus Walleij, Alexander Sverdlin,
	linux-kernel, open list:GPIO SUBSYSTEM

On Tue, Apr 28, 2026 at 6:17 PM Arnd Bergmann <arnd@arndb.de> wrote:
>
> On Tue, Apr 28, 2026, at 17:53, Andy Shevchenko wrote:
> > On Tue, Apr 28, 2026 at 05:45:07PM +0200, Arnd Bergmann wrote:
> >
> >> Split the old contents from gpio.h for clarity. Ideally any driver
> >> that still includes linux/gpio.h can now be ported over to use
> >> either linux/gpio/legacy.h or linux/gpio/consumer.h, with the
> >> original file getting removed once that is complete.
> >>
> >> No functional changes intended for now.
> >
> > But I'm not sure why. The idea to kill gpio.h completely, no need to keep it
> > longer than legacy stuff exists. I don't take 'clarity' as a good justification
> > here, since the old header are still there (however just a shallow wrapper).
>
> I currently count 59 files that use the legacy header,
> and I have a patch to change those over to include it
> directly. I could post it now, but the exact list seems to
> be changing by the day at the moment. It may be better
> to split it up by subsystem once the first patch is merged,
> or it could go through the gpio tree.
>
> There are another 94 uses of linux/gpio.h that should
> be linux/gpio/consumer.h instead. That patch is of course
> trivial as well, but I have not prepared it yet.
>
> I don't think the legacy stuff is going away any time soon,
> so removing it from linux/gpio.h with the follow-up patch
> should help avoid new instances getting merged unnoticed.
>

True and if anything - it at least spells out loud that this is a
"legacy" header, which gpio.h does not.

Bart

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] gpiolib: move legacy interface into linux/gpio/legacy.h
  2026-04-28 15:45 [PATCH] gpiolib: move legacy interface into linux/gpio/legacy.h Arnd Bergmann
  2026-04-28 15:53 ` Andy Shevchenko
@ 2026-05-04  7:59 ` Bartosz Golaszewski
  1 sibling, 0 replies; 5+ messages in thread
From: Bartosz Golaszewski @ 2026-05-04  7:59 UTC (permalink / raw)
  To: Linus Walleij, Bartosz Golaszewski, Arnd Bergmann
  Cc: Bartosz Golaszewski, Arnd Bergmann, Andy Shevchenko,
	Alexander Sverdlin, linux-kernel, linux-gpio


On Tue, 28 Apr 2026 17:45:07 +0200, Arnd Bergmann wrote:
> Split the old contents from gpio.h for clarity. Ideally any driver
> that still includes linux/gpio.h can now be ported over to use
> either linux/gpio/legacy.h or linux/gpio/consumer.h, with the
> original file getting removed once that is complete.
> 
> No functional changes intended for now.
> 
> [...]

Applied, thanks!

[1/1] gpiolib: move legacy interface into linux/gpio/legacy.h
      https://git.kernel.org/brgl/c/bfdc854ba63bc815cf710701f889544a9d27df83

Best regards,
-- 
Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-05-04  7:59 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-28 15:45 [PATCH] gpiolib: move legacy interface into linux/gpio/legacy.h Arnd Bergmann
2026-04-28 15:53 ` Andy Shevchenko
2026-04-28 16:17   ` Arnd Bergmann
2026-04-29  8:48     ` Bartosz Golaszewski
2026-05-04  7:59 ` Bartosz Golaszewski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox