linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/8] gpiolib cleanups
@ 2023-01-26 13:27 Arnd Bergmann
  2023-01-26 13:27 ` [PATCH 1/8] gpiolib: remove empty asm/gpio.h files Arnd Bergmann
                   ` (7 more replies)
  0 siblings, 8 replies; 35+ messages in thread
From: Arnd Bergmann @ 2023-01-26 13:27 UTC (permalink / raw)
  To: linux-gpio
  Cc: Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, Linus Walleij, linux-kernel

From: Arnd Bergmann <arnd@arndb.de>

These are some older patches I did last year, rebased to linux-next-20230125.

The main goal is to remove some of the legacy bits of the gpiolib
interfaces, where the corner cases are easily avoided or replaced
with gpio descriptor based interfaces.

We seem to all be touching the same functions at the moement, let
me know if this conflicts with your work.

   Arnd

Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: linux-gpio@vger.kernel.org>
Cc: linux-kernel@vger.kernel.org

Arnd Bergmann (8):
  gpiolib: remove empty asm/gpio.h files
  gpiolib: coldfire: remove custom asm/gpio.h
  gpiolib: remove asm-generic/gpio.h
  gpiolib: remove gpio_set_debounce
  gpiolib: remove legacy gpio_export
  gpiolib: split linux/gpio/driver.h out of linux/gpio.h
  gpiolib: split of_mm_gpio_chip out of linux/of_gpio.h
  gpiolib: move of_gpio_flags into gpiolib-of.c

 Documentation/admin-guide/gpio/sysfs.rst      |   2 +-
 Documentation/driver-api/gpio/legacy.rst      |  23 ---
 .../zh_CN/driver-api/gpio/legacy.rst          |  20 ---
 Documentation/translations/zh_TW/gpio.txt     |  18 ---
 MAINTAINERS                                   |   1 -
 arch/arm/Kconfig                              |   1 -
 arch/arm/include/asm/gpio.h                   |  21 ---
 arch/arm/mach-omap1/irq.c                     |   1 +
 arch/arm/mach-omap2/pdata-quirks.c            |   9 +-
 arch/arm/mach-orion5x/board-rd88f5182.c       |   1 +
 arch/arm/mach-s3c/s3c64xx.c                   |   1 +
 arch/arm/mach-sa1100/assabet.c                |   1 +
 arch/arm/plat-orion/gpio.c                    |   1 +
 arch/m68k/Kconfig.cpu                         |   1 -
 arch/m68k/include/asm/gpio.h                  |  95 -----------
 arch/m68k/include/asm/mcfgpio.h               |   2 +-
 arch/powerpc/platforms/44x/Kconfig            |   1 +
 arch/powerpc/platforms/4xx/gpio.c             |   2 +-
 arch/powerpc/platforms/8xx/Kconfig            |   1 +
 arch/powerpc/platforms/8xx/cpm1.c             |   2 +-
 arch/powerpc/platforms/Kconfig                |   2 +
 arch/powerpc/sysdev/cpm_common.c              |   2 +-
 arch/sh/Kconfig                               |   1 -
 arch/sh/boards/board-magicpanelr2.c           |   1 +
 arch/sh/boards/mach-ap325rxa/setup.c          |   7 +-
 arch/sh/include/asm/gpio.h                    |  45 ------
 drivers/gpio/Kconfig                          |  19 ++-
 drivers/gpio/TODO                             |  15 +-
 drivers/gpio/gpio-altera.c                    |   2 +-
 drivers/gpio/gpio-davinci.c                   |   3 +-
 drivers/gpio/gpio-mm-lantiq.c                 |   2 +-
 drivers/gpio/gpio-mpc5200.c                   |   2 +-
 drivers/gpio/gpiolib-of.c                     |  18 +++
 drivers/gpio/gpiolib-sysfs.c                  |   4 +-
 drivers/input/touchscreen/ads7846.c           |  24 +--
 drivers/media/pci/sta2x11/sta2x11_vip.c       |  10 +-
 drivers/net/ieee802154/ca8210.c               |   3 +-
 .../broadcom/brcm80211/brcmsmac/led.c         |   1 +
 drivers/pinctrl/core.c                        |   2 +-
 drivers/soc/fsl/qe/gpio.c                     |   2 +-
 include/asm-generic/gpio.h                    | 147 ------------------
 include/linux/gpio.h                          |  93 ++++++-----
 include/linux/gpio/legacy-of-mm-gpiochip.h    |  36 +++++
 include/linux/mfd/ucb1x00.h                   |   1 +
 include/linux/of_gpio.h                       |  36 -----
 45 files changed, 186 insertions(+), 496 deletions(-)
 delete mode 100644 arch/arm/include/asm/gpio.h
 delete mode 100644 arch/m68k/include/asm/gpio.h
 delete mode 100644 arch/sh/include/asm/gpio.h
 delete mode 100644 include/asm-generic/gpio.h
 create mode 100644 include/linux/gpio/legacy-of-mm-gpiochip.h

-- 
2.39.0


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

* [PATCH 1/8] gpiolib: remove empty asm/gpio.h files
  2023-01-26 13:27 [PATCH 0/8] gpiolib cleanups Arnd Bergmann
@ 2023-01-26 13:27 ` Arnd Bergmann
  2023-01-27  9:41   ` Bartosz Golaszewski
  2023-01-27 13:04   ` Linus Walleij
  2023-01-26 13:27 ` [PATCH 2/8] gpiolib: coldfire: remove custom asm/gpio.h Arnd Bergmann
                   ` (6 subsequent siblings)
  7 siblings, 2 replies; 35+ messages in thread
From: Arnd Bergmann @ 2023-01-26 13:27 UTC (permalink / raw)
  To: linux-gpio
  Cc: Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, Linus Walleij, linux-kernel,
	Geert Uytterhoeven

From: Arnd Bergmann <arnd@arndb.de>

The arm and sh versions of this file are identical to the generic
versions and can just be removed.

The drivers that actually use the sh3 specific version also include
cpu/gpio.h directly, with the exception of magicpanelr2, which is
easily fixed. This leaves coldfire as the only gpio driver
that needs something custom for gpiolib.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/arm/Kconfig                    |  1 -
 arch/arm/include/asm/gpio.h         | 21 --------------
 arch/sh/Kconfig                     |  1 -
 arch/sh/boards/board-magicpanelr2.c |  1 +
 arch/sh/include/asm/gpio.h          | 45 -----------------------------
 5 files changed, 1 insertion(+), 68 deletions(-)
 delete mode 100644 arch/arm/include/asm/gpio.h
 delete mode 100644 arch/sh/include/asm/gpio.h

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 5c8bab8d6009..b4447a055029 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -24,7 +24,6 @@ config ARM
 	select ARCH_HAS_SYNC_DMA_FOR_CPU
 	select ARCH_HAS_TEARDOWN_DMA_OPS if MMU
 	select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
-	select ARCH_HAVE_CUSTOM_GPIO_H
 	select ARCH_HAVE_NMI_SAFE_CMPXCHG if CPU_LDREX
 	select ARCH_HAS_GCOV_PROFILE_ALL
 	select ARCH_KEEP_MEMBLOCK
diff --git a/arch/arm/include/asm/gpio.h b/arch/arm/include/asm/gpio.h
deleted file mode 100644
index 4ebbb58f06ea..000000000000
--- a/arch/arm/include/asm/gpio.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef _ARCH_ARM_GPIO_H
-#define _ARCH_ARM_GPIO_H
-
-#include <asm-generic/gpio.h>
-
-/* The trivial gpiolib dispatchers */
-#define gpio_get_value  __gpio_get_value
-#define gpio_set_value  __gpio_set_value
-#define gpio_cansleep   __gpio_cansleep
-
-/*
- * Provide a default gpio_to_irq() which should satisfy every case.
- * However, some platforms want to do this differently, so allow them
- * to override it.
- */
-#ifndef gpio_to_irq
-#define gpio_to_irq	__gpio_to_irq
-#endif
-
-#endif /* _ARCH_ARM_GPIO_H */
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig
index 0665ac0add0b..ccb866750a88 100644
--- a/arch/sh/Kconfig
+++ b/arch/sh/Kconfig
@@ -4,7 +4,6 @@ config SUPERH
 	select ARCH_32BIT_OFF_T
 	select ARCH_ENABLE_MEMORY_HOTPLUG if SPARSEMEM && MMU
 	select ARCH_ENABLE_MEMORY_HOTREMOVE if SPARSEMEM && MMU
-	select ARCH_HAVE_CUSTOM_GPIO_H
 	select ARCH_HAVE_NMI_SAFE_CMPXCHG if (GUSA_RB || CPU_SH4A)
 	select ARCH_HAS_BINFMT_FLAT if !MMU
 	select ARCH_HAS_CURRENT_STACK_POINTER
diff --git a/arch/sh/boards/board-magicpanelr2.c b/arch/sh/boards/board-magicpanelr2.c
index c3434f0ffc7d..626c716c086c 100644
--- a/arch/sh/boards/board-magicpanelr2.c
+++ b/arch/sh/boards/board-magicpanelr2.c
@@ -21,6 +21,7 @@
 #include <linux/sh_intc.h>
 #include <mach/magicpanelr2.h>
 #include <asm/heartbeat.h>
+#include <cpu/gpio.h>
 #include <cpu/sh7720.h>
 
 /* Dummy supplies, where voltage doesn't matter */
diff --git a/arch/sh/include/asm/gpio.h b/arch/sh/include/asm/gpio.h
deleted file mode 100644
index 588c1380e4cb..000000000000
--- a/arch/sh/include/asm/gpio.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0
- *
- *  include/asm-sh/gpio.h
- *
- * Generic GPIO API and pinmux table support for SuperH.
- *
- * Copyright (c) 2008 Magnus Damm
- */
-#ifndef __ASM_SH_GPIO_H
-#define __ASM_SH_GPIO_H
-
-#include <linux/kernel.h>
-#include <linux/errno.h>
-
-#if defined(CONFIG_CPU_SH3)
-#include <cpu/gpio.h>
-#endif
-
-#include <asm-generic/gpio.h>
-
-#ifdef CONFIG_GPIOLIB
-
-static inline int gpio_get_value(unsigned gpio)
-{
-	return __gpio_get_value(gpio);
-}
-
-static inline void gpio_set_value(unsigned gpio, int value)
-{
-	__gpio_set_value(gpio, value);
-}
-
-static inline int gpio_cansleep(unsigned gpio)
-{
-	return __gpio_cansleep(gpio);
-}
-
-static inline int gpio_to_irq(unsigned gpio)
-{
-	return __gpio_to_irq(gpio);
-}
-
-#endif /* CONFIG_GPIOLIB */
-
-#endif /* __ASM_SH_GPIO_H */
-- 
2.39.0


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

* [PATCH 2/8] gpiolib: coldfire: remove custom asm/gpio.h
  2023-01-26 13:27 [PATCH 0/8] gpiolib cleanups Arnd Bergmann
  2023-01-26 13:27 ` [PATCH 1/8] gpiolib: remove empty asm/gpio.h files Arnd Bergmann
@ 2023-01-26 13:27 ` Arnd Bergmann
  2023-01-27  9:41   ` Bartosz Golaszewski
  2023-01-27 13:05   ` Linus Walleij
  2023-01-26 13:27 ` [PATCH 3/8] gpiolib: remove asm-generic/gpio.h Arnd Bergmann
                   ` (5 subsequent siblings)
  7 siblings, 2 replies; 35+ messages in thread
From: Arnd Bergmann @ 2023-01-26 13:27 UTC (permalink / raw)
  To: linux-gpio
  Cc: Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, Linus Walleij, linux-kernel,
	Geert Uytterhoeven

From: Arnd Bergmann <arnd@arndb.de>

Now that coldfire is the only user of a custom asm/gpio.h, it seems
better to remove this as well, and have the same interface everywhere.

For the gpio_get_value()/gpio_set_value()/gpio_to_irq(), gpio_cansleep()
functions, the custom version is only a micro-optimization to inline the
function for constant GPIO numbers. However, in the coldfire defconfigs,
I was unable to find a single instance where this micro-optimization
was even used, and according to Geert the only user appears to be the
QSPI chip that is disabled everywhere.

The custom gpio_request_one() function is even less useful, as it is
guarded by an #ifdef that is never true.

Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/m68k/Kconfig.cpu        |  1 -
 arch/m68k/include/asm/gpio.h | 95 ------------------------------------
 drivers/gpio/Kconfig         |  8 ---
 include/linux/gpio.h         |  7 ---
 4 files changed, 111 deletions(-)
 delete mode 100644 arch/m68k/include/asm/gpio.h

diff --git a/arch/m68k/Kconfig.cpu b/arch/m68k/Kconfig.cpu
index 9380f6e3bb66..96a0fb4f1af5 100644
--- a/arch/m68k/Kconfig.cpu
+++ b/arch/m68k/Kconfig.cpu
@@ -24,7 +24,6 @@ config M68KCLASSIC
 
 config COLDFIRE
 	bool "Coldfire CPU family support"
-	select ARCH_HAVE_CUSTOM_GPIO_H
 	select CPU_HAS_NO_BITFIELDS
 	select CPU_HAS_NO_CAS
 	select CPU_HAS_NO_MULDIV64
diff --git a/arch/m68k/include/asm/gpio.h b/arch/m68k/include/asm/gpio.h
deleted file mode 100644
index 5cfc0996ba94..000000000000
--- a/arch/m68k/include/asm/gpio.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Coldfire generic GPIO support
- *
- * (C) Copyright 2009, Steven King <sfking@fdwdc.com>
-*/
-
-#ifndef coldfire_gpio_h
-#define coldfire_gpio_h
-
-#include <linux/io.h>
-#include <asm/coldfire.h>
-#include <asm/mcfsim.h>
-#include <asm/mcfgpio.h>
-/*
- * The Generic GPIO functions
- *
- * If the gpio is a compile time constant and is one of the Coldfire gpios,
- * use the inline version, otherwise dispatch thru gpiolib.
- */
-
-static inline int gpio_get_value(unsigned gpio)
-{
-	if (__builtin_constant_p(gpio) && gpio < MCFGPIO_PIN_MAX)
-		return mcfgpio_read(__mcfgpio_ppdr(gpio)) & mcfgpio_bit(gpio);
-	else
-		return __gpio_get_value(gpio);
-}
-
-static inline void gpio_set_value(unsigned gpio, int value)
-{
-	if (__builtin_constant_p(gpio) && gpio < MCFGPIO_PIN_MAX) {
-		if (gpio < MCFGPIO_SCR_START) {
-			unsigned long flags;
-			MCFGPIO_PORTTYPE data;
-
-			local_irq_save(flags);
-			data = mcfgpio_read(__mcfgpio_podr(gpio));
-			if (value)
-				data |= mcfgpio_bit(gpio);
-			else
-				data &= ~mcfgpio_bit(gpio);
-			mcfgpio_write(data, __mcfgpio_podr(gpio));
-			local_irq_restore(flags);
-		} else {
-			if (value)
-				mcfgpio_write(mcfgpio_bit(gpio),
-						MCFGPIO_SETR_PORT(gpio));
-			else
-				mcfgpio_write(~mcfgpio_bit(gpio),
-						MCFGPIO_CLRR_PORT(gpio));
-		}
-	} else
-		__gpio_set_value(gpio, value);
-}
-
-static inline int gpio_to_irq(unsigned gpio)
-{
-#if defined(MCFGPIO_IRQ_MIN)
-	if ((gpio >= MCFGPIO_IRQ_MIN) && (gpio < MCFGPIO_IRQ_MAX))
-#else
-	if (gpio < MCFGPIO_IRQ_MAX)
-#endif
-		return gpio + MCFGPIO_IRQ_VECBASE;
-	else
-		return __gpio_to_irq(gpio);
-}
-
-static inline int gpio_cansleep(unsigned gpio)
-{
-	return gpio < MCFGPIO_PIN_MAX ? 0 : __gpio_cansleep(gpio);
-}
-
-#ifndef CONFIG_GPIOLIB
-static inline int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
-{
-	int err;
-
-	err = gpio_request(gpio, label);
-	if (err)
-		return err;
-
-	if (flags & GPIOF_DIR_IN)
-		err = gpio_direction_input(gpio);
-	else
-		err = gpio_direction_output(gpio,
-			(flags & GPIOF_INIT_HIGH) ? 1 : 0);
-
-	if (err)
-		gpio_free(gpio);
-
-	return err;
-}
-#endif /* !CONFIG_GPIOLIB */
-#endif
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 218d7e4c27ff..06a268d56800 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -3,14 +3,6 @@
 # GPIO infrastructure and drivers
 #
 
-config ARCH_HAVE_CUSTOM_GPIO_H
-	bool
-	help
-	  Selecting this config option from the architecture Kconfig allows
-	  the architecture to provide a custom asm/gpio.h implementation
-	  overriding the default implementations.  New uses of this are
-	  strongly discouraged.
-
 menuconfig GPIOLIB
 	bool "GPIO Support"
 	help
diff --git a/include/linux/gpio.h b/include/linux/gpio.h
index 85beb236c925..2b75017b3aad 100644
--- a/include/linux/gpio.h
+++ b/include/linux/gpio.h
@@ -54,11 +54,6 @@ struct gpio {
 };
 
 #ifdef CONFIG_GPIOLIB
-
-#ifdef CONFIG_ARCH_HAVE_CUSTOM_GPIO_H
-#include <asm/gpio.h>
-#else
-
 #include <asm-generic/gpio.h>
 
 static inline int gpio_get_value(unsigned int gpio)
@@ -81,8 +76,6 @@ static inline int gpio_to_irq(unsigned int gpio)
 	return __gpio_to_irq(gpio);
 }
 
-#endif /* ! CONFIG_ARCH_HAVE_CUSTOM_GPIO_H */
-
 /* CONFIG_GPIOLIB: bindings for managed devices that want to request gpios */
 
 struct device;
-- 
2.39.0


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

* [PATCH 3/8] gpiolib: remove asm-generic/gpio.h
  2023-01-26 13:27 [PATCH 0/8] gpiolib cleanups Arnd Bergmann
  2023-01-26 13:27 ` [PATCH 1/8] gpiolib: remove empty asm/gpio.h files Arnd Bergmann
  2023-01-26 13:27 ` [PATCH 2/8] gpiolib: coldfire: remove custom asm/gpio.h Arnd Bergmann
@ 2023-01-26 13:27 ` Arnd Bergmann
  2023-01-26 13:46   ` Andy Shevchenko
  2023-01-27 13:07   ` Linus Walleij
  2023-01-26 13:27 ` [PATCH 4/8] gpiolib: remove gpio_set_debounce Arnd Bergmann
                   ` (4 subsequent siblings)
  7 siblings, 2 replies; 35+ messages in thread
From: Arnd Bergmann @ 2023-01-26 13:27 UTC (permalink / raw)
  To: linux-gpio
  Cc: Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, Linus Walleij, linux-kernel

From: Arnd Bergmann <arnd@arndb.de>

The asm-generic/gpio.h file is now always included when
using gpiolib, so just move its contents into linux/gpio.h
with a few minor simplifications.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 MAINTAINERS                     |   1 -
 arch/m68k/include/asm/mcfgpio.h |   2 +-
 drivers/gpio/gpio-davinci.c     |   3 +-
 drivers/pinctrl/core.c          |   2 +-
 include/asm-generic/gpio.h      | 147 --------------------------------
 include/linux/gpio.h            |  93 ++++++++++++++++++--
 6 files changed, 87 insertions(+), 161 deletions(-)
 delete mode 100644 include/asm-generic/gpio.h

diff --git a/MAINTAINERS b/MAINTAINERS
index 7d4677efcf02..acda33cbd689 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8729,7 +8729,6 @@ F:	Documentation/admin-guide/gpio/
 F:	Documentation/devicetree/bindings/gpio/
 F:	Documentation/driver-api/gpio/
 F:	drivers/gpio/
-F:	include/asm-generic/gpio.h
 F:	include/dt-bindings/gpio/
 F:	include/linux/gpio.h
 F:	include/linux/gpio/
diff --git a/arch/m68k/include/asm/mcfgpio.h b/arch/m68k/include/asm/mcfgpio.h
index 27f32cc81da6..2cefe8445980 100644
--- a/arch/m68k/include/asm/mcfgpio.h
+++ b/arch/m68k/include/asm/mcfgpio.h
@@ -9,7 +9,7 @@
 #define mcfgpio_h
 
 #ifdef CONFIG_GPIOLIB
-#include <asm-generic/gpio.h>
+#include <linux/gpio.h>
 #else
 
 int __mcfgpio_get_value(unsigned gpio);
diff --git a/drivers/gpio/gpio-davinci.c b/drivers/gpio/gpio-davinci.c
index 26b1f7465e09..411b3102bc47 100644
--- a/drivers/gpio/gpio-davinci.c
+++ b/drivers/gpio/gpio-davinci.c
@@ -7,6 +7,7 @@
  */
 
 #include <linux/gpio/driver.h>
+#include <linux/gpio.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/clk.h>
@@ -24,8 +25,6 @@
 #include <linux/spinlock.h>
 #include <linux/pm_runtime.h>
 
-#include <asm-generic/gpio.h>
-
 #define MAX_REGS_BANKS 5
 #define MAX_INT_PER_BANK 32
 
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
index d6e6c751255f..6114affb642b 100644
--- a/drivers/pinctrl/core.c
+++ b/drivers/pinctrl/core.c
@@ -30,7 +30,7 @@
 
 #ifdef CONFIG_GPIOLIB
 #include "../gpio/gpiolib.h"
-#include <asm-generic/gpio.h>
+#include <linux/gpio.h>
 #endif
 
 #include "core.h"
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
deleted file mode 100644
index 22cb8c9efc1d..000000000000
--- a/include/asm-generic/gpio.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef _ASM_GENERIC_GPIO_H
-#define _ASM_GENERIC_GPIO_H
-
-#include <linux/types.h>
-#include <linux/errno.h>
-
-#ifdef CONFIG_GPIOLIB
-
-#include <linux/compiler.h>
-#include <linux/gpio/driver.h>
-#include <linux/gpio/consumer.h>
-
-/*
- * 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).
- */
-
-/*
- * At the end we want all GPIOs to be dynamically allocated from 0.
- * However, some legacy drivers still perform fixed allocation.
- * Until they are all fixed, leave 0-512 space for them.
- */
-#define GPIO_DYNAMIC_BASE	512
-
-struct device;
-struct gpio;
-struct seq_file;
-struct module;
-struct device_node;
-struct gpio_desc;
-
-/* Always use the library code for GPIO management calls,
- * or when sleeping may be involved.
- */
-extern int gpio_request(unsigned gpio, const char *label);
-extern 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_set_debounce(unsigned gpio, unsigned debounce)
-{
-	return gpiod_set_debounce(gpio_to_desc(gpio), debounce);
-}
-
-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)
-{
-	return gpiod_set_raw_value_cansleep(gpio_to_desc(gpio), value);
-}
-
-
-/* A platform's <asm/gpio.h> code may want to inline the I/O calls when
- * the GPIO is constant and refers to some always-present controller,
- * giving direct access to chip registers and tight bitbanging loops.
- */
-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)
-{
-	return gpiod_set_raw_value(gpio_to_desc(gpio), value);
-}
-
-static inline int __gpio_cansleep(unsigned gpio)
-{
-	return gpiod_cansleep(gpio_to_desc(gpio));
-}
-
-static inline int __gpio_to_irq(unsigned gpio)
-{
-	return gpiod_to_irq(gpio_to_desc(gpio));
-}
-
-extern int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
-extern int gpio_request_array(const struct gpio *array, size_t num);
-extern void gpio_free_array(const struct gpio *array, size_t num);
-
-/*
- * A sysfs interface can be exported by individual drivers if they want,
- * but more typically is configured entirely from userspace.
- */
-static inline int gpio_export(unsigned gpio, bool direction_may_change)
-{
-	return gpiod_export(gpio_to_desc(gpio), direction_may_change);
-}
-
-static inline void gpio_unexport(unsigned gpio)
-{
-	gpiod_unexport(gpio_to_desc(gpio));
-}
-
-#else	/* !CONFIG_GPIOLIB */
-
-#include <linux/kernel.h>
-
-/* platforms that don't directly support access to GPIOs through I2C, SPI,
- * or other blocking infrastructure can use these wrappers.
- */
-
-static inline int gpio_cansleep(unsigned gpio)
-{
-	return 0;
-}
-
-static inline int gpio_get_value_cansleep(unsigned gpio)
-{
-	might_sleep();
-	return __gpio_get_value(gpio);
-}
-
-static inline void gpio_set_value_cansleep(unsigned gpio, int value)
-{
-	might_sleep();
-	__gpio_set_value(gpio, value);
-}
-
-#endif /* !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;
-}
-
-#endif /* _ASM_GENERIC_GPIO_H */
diff --git a/include/linux/gpio.h b/include/linux/gpio.h
index 2b75017b3aad..e273a3287d8e 100644
--- a/include/linux/gpio.h
+++ b/include/linux/gpio.h
@@ -54,26 +54,101 @@ struct gpio {
 };
 
 #ifdef CONFIG_GPIOLIB
-#include <asm-generic/gpio.h>
+#include <linux/compiler.h>
+#include <linux/gpio/driver.h>
+#include <linux/gpio/consumer.h>
 
-static inline int gpio_get_value(unsigned int gpio)
+/*
+ * "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).
+ */
+
+/*
+ * At the end we want all GPIOs to be dynamically allocated from 0.
+ * However, some legacy drivers still perform fixed allocation.
+ * Until they are all fixed, leave 0-512 space for them.
+ */
+#define GPIO_DYNAMIC_BASE	512
+
+/* Always use the library code for GPIO management calls,
+ * or when sleeping may be involved.
+ */
+extern int gpio_request(unsigned gpio, const char *label);
+extern 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 __gpio_get_value(gpio);
+	return gpiod_direction_output_raw(gpio_to_desc(gpio), value);
 }
 
-static inline void gpio_set_value(unsigned int gpio, int value)
+static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
 {
-	__gpio_set_value(gpio, value);
+	return gpiod_set_debounce(gpio_to_desc(gpio), debounce);
 }
 
-static inline int gpio_cansleep(unsigned int gpio)
+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)
 {
-	return __gpio_cansleep(gpio);
+	return gpiod_set_raw_value_cansleep(gpio_to_desc(gpio), value);
 }
 
-static inline int gpio_to_irq(unsigned int gpio)
+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)
+{
+	return gpiod_set_raw_value(gpio_to_desc(gpio), value);
+}
+
+static inline int gpio_cansleep(unsigned gpio)
+{
+	return gpiod_cansleep(gpio_to_desc(gpio));
+}
+
+static inline int gpio_to_irq(unsigned gpio)
+{
+	return gpiod_to_irq(gpio_to_desc(gpio));
+}
+
+extern int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
+extern int gpio_request_array(const struct gpio *array, size_t num);
+extern void gpio_free_array(const struct gpio *array, size_t num);
+
+/*
+ * A sysfs interface can be exported by individual drivers if they want,
+ * but more typically is configured entirely from userspace.
+ */
+static inline int gpio_export(unsigned gpio, bool direction_may_change)
+{
+	return gpiod_export(gpio_to_desc(gpio), direction_may_change);
+}
+
+static inline void gpio_unexport(unsigned gpio)
 {
-	return __gpio_to_irq(gpio);
+	gpiod_unexport(gpio_to_desc(gpio));
 }
 
 /* CONFIG_GPIOLIB: bindings for managed devices that want to request gpios */
-- 
2.39.0


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

* [PATCH 4/8] gpiolib: remove gpio_set_debounce
  2023-01-26 13:27 [PATCH 0/8] gpiolib cleanups Arnd Bergmann
                   ` (2 preceding siblings ...)
  2023-01-26 13:27 ` [PATCH 3/8] gpiolib: remove asm-generic/gpio.h Arnd Bergmann
@ 2023-01-26 13:27 ` Arnd Bergmann
  2023-01-26 13:50   ` Andy Shevchenko
  2023-01-27 13:09   ` Linus Walleij
  2023-01-26 13:27 ` [PATCH 5/8] gpiolib: remove legacy gpio_export Arnd Bergmann
                   ` (3 subsequent siblings)
  7 siblings, 2 replies; 35+ messages in thread
From: Arnd Bergmann @ 2023-01-26 13:27 UTC (permalink / raw)
  To: linux-gpio
  Cc: Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, Linus Walleij, linux-kernel

From: Arnd Bergmann <arnd@arndb.de>

gpio_set_debounce() only has a single user, which is trivially
converted to gpiod_set_debounce().

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 Documentation/driver-api/gpio/legacy.rst |  2 --
 drivers/input/touchscreen/ads7846.c      | 24 +++++++++++++-----------
 include/linux/gpio.h                     | 22 ----------------------
 3 files changed, 13 insertions(+), 35 deletions(-)

diff --git a/Documentation/driver-api/gpio/legacy.rst b/Documentation/driver-api/gpio/legacy.rst
index a0559d93efd1..e0306e78e34b 100644
--- a/Documentation/driver-api/gpio/legacy.rst
+++ b/Documentation/driver-api/gpio/legacy.rst
@@ -238,8 +238,6 @@ setup or driver probe/teardown code, so this is an easy constraint.)::
         ## 	gpio_free_array()
 
                 gpio_free()
-                gpio_set_debounce()
-
 
 
 Claiming and Releasing GPIOs
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c
index 4c3dd01902d0..354da71ff037 100644
--- a/drivers/input/touchscreen/ads7846.c
+++ b/drivers/input/touchscreen/ads7846.c
@@ -27,6 +27,7 @@
 #include <linux/of.h>
 #include <linux/of_gpio.h>
 #include <linux/of_device.h>
+#include <linux/gpio/consumer.h>
 #include <linux/gpio.h>
 #include <linux/spi/spi.h>
 #include <linux/spi/ads7846.h>
@@ -139,7 +140,7 @@ struct ads7846 {
 	int			(*filter)(void *data, int data_idx, int *val);
 	void			*filter_data;
 	int			(*get_pendown_state)(void);
-	int			gpio_pendown;
+	struct gpio_desc	*gpio_pendown;
 
 	void			(*wait_for_sync)(void);
 };
@@ -222,7 +223,7 @@ static int get_pendown_state(struct ads7846 *ts)
 	if (ts->get_pendown_state)
 		return ts->get_pendown_state();
 
-	return !gpio_get_value(ts->gpio_pendown);
+	return !gpiod_get_value(ts->gpio_pendown);
 }
 
 static void ads7846_report_pen_up(struct ads7846 *ts)
@@ -1005,7 +1006,6 @@ static int ads7846_setup_pendown(struct spi_device *spi,
 	if (pdata->get_pendown_state) {
 		ts->get_pendown_state = pdata->get_pendown_state;
 	} else if (gpio_is_valid(pdata->gpio_pendown)) {
-
 		err = devm_gpio_request_one(&spi->dev, pdata->gpio_pendown,
 					    GPIOF_IN, "ads7846_pendown");
 		if (err) {
@@ -1015,15 +1015,17 @@ static int ads7846_setup_pendown(struct spi_device *spi,
 			return err;
 		}
 
-		ts->gpio_pendown = pdata->gpio_pendown;
-
-		if (pdata->gpio_pendown_debounce)
-			gpio_set_debounce(pdata->gpio_pendown,
-					  pdata->gpio_pendown_debounce);
+		ts->gpio_pendown = gpio_to_desc(pdata->gpio_pendown);
 	} else {
-		dev_err(&spi->dev, "no get_pendown_state nor gpio_pendown?\n");
-		return -EINVAL;
+		ts->gpio_pendown = gpiod_get(&spi->dev, "pendown-gpio", GPIOD_IN);
+		if (IS_ERR(ts->gpio_pendown)) {
+			dev_err(&spi->dev, "no get_pendown_state nor gpio_pendown?\n");
+			return PTR_ERR(ts->gpio_pendown);
+		}
 	}
+	if (pdata->gpio_pendown_debounce)
+		gpiod_set_debounce(ts->gpio_pendown,
+				   pdata->gpio_pendown_debounce);
 
 	return 0;
 }
@@ -1192,7 +1194,7 @@ static const struct ads7846_platform_data *ads7846_probe_dt(struct device *dev)
 	pdata->wakeup = of_property_read_bool(node, "wakeup-source") ||
 			of_property_read_bool(node, "linux,wakeup");
 
-	pdata->gpio_pendown = of_get_named_gpio(dev->of_node, "pendown-gpio", 0);
+	pdata->gpio_pendown = -1;
 
 	return pdata;
 }
diff --git a/include/linux/gpio.h b/include/linux/gpio.h
index e273a3287d8e..da7a5ae68e47 100644
--- a/include/linux/gpio.h
+++ b/include/linux/gpio.h
@@ -100,11 +100,6 @@ static inline int gpio_direction_output(unsigned gpio, int value)
 	return gpiod_direction_output_raw(gpio_to_desc(gpio), value);
 }
 
-static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
-{
-	return gpiod_set_debounce(gpio_to_desc(gpio), debounce);
-}
-
 static inline int gpio_get_value_cansleep(unsigned gpio)
 {
 	return gpiod_get_raw_value_cansleep(gpio_to_desc(gpio));
@@ -123,11 +118,6 @@ static inline void gpio_set_value(unsigned gpio, int value)
 	return gpiod_set_raw_value(gpio_to_desc(gpio), value);
 }
 
-static inline int gpio_cansleep(unsigned gpio)
-{
-	return gpiod_cansleep(gpio_to_desc(gpio));
-}
-
 static inline int gpio_to_irq(unsigned gpio)
 {
 	return gpiod_to_irq(gpio_to_desc(gpio));
@@ -215,11 +205,6 @@ static inline int gpio_direction_output(unsigned gpio, int value)
 	return -ENOSYS;
 }
 
-static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
-{
-	return -ENOSYS;
-}
-
 static inline int gpio_get_value(unsigned gpio)
 {
 	/* GPIO can never have been requested or set as {in,out}put */
@@ -233,13 +218,6 @@ static inline void gpio_set_value(unsigned gpio, int value)
 	WARN_ON(1);
 }
 
-static inline int gpio_cansleep(unsigned gpio)
-{
-	/* GPIO can never have been requested or set as {in,out}put */
-	WARN_ON(1);
-	return 0;
-}
-
 static inline int gpio_get_value_cansleep(unsigned gpio)
 {
 	/* GPIO can never have been requested or set as {in,out}put */
-- 
2.39.0


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

* [PATCH 5/8] gpiolib: remove legacy gpio_export
  2023-01-26 13:27 [PATCH 0/8] gpiolib cleanups Arnd Bergmann
                   ` (3 preceding siblings ...)
  2023-01-26 13:27 ` [PATCH 4/8] gpiolib: remove gpio_set_debounce Arnd Bergmann
@ 2023-01-26 13:27 ` Arnd Bergmann
  2023-01-26 14:00   ` Andy Shevchenko
  2023-01-27 13:09   ` Linus Walleij
  2023-01-26 13:27 ` [PATCH 6/8] gpiolib: split linux/gpio/driver.h out of linux/gpio.h Arnd Bergmann
                   ` (2 subsequent siblings)
  7 siblings, 2 replies; 35+ messages in thread
From: Arnd Bergmann @ 2023-01-26 13:27 UTC (permalink / raw)
  To: linux-gpio
  Cc: Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, Linus Walleij, linux-kernel

From: Arnd Bergmann <arnd@arndb.de>

There are only a handful of users of gpio_export() and
related functions.

As these are just wrappers around the modern gpiod_export()
helper, remove the wrappers and open-code the gpio_to_desc
in all callers to shrink the legacy API.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 Documentation/admin-guide/gpio/sysfs.rst      |  2 +-
 Documentation/driver-api/gpio/legacy.rst      | 21 ---------------
 .../zh_CN/driver-api/gpio/legacy.rst          | 20 --------------
 Documentation/translations/zh_TW/gpio.txt     | 18 -------------
 arch/arm/mach-omap2/pdata-quirks.c            |  9 ++++---
 arch/sh/boards/mach-ap325rxa/setup.c          |  7 ++---
 drivers/gpio/gpiolib-sysfs.c                  |  4 +--
 drivers/media/pci/sta2x11/sta2x11_vip.c       | 10 ++++---
 drivers/net/ieee802154/ca8210.c               |  3 ++-
 include/linux/gpio.h                          | 27 -------------------
 10 files changed, 21 insertions(+), 100 deletions(-)

diff --git a/Documentation/admin-guide/gpio/sysfs.rst b/Documentation/admin-guide/gpio/sysfs.rst
index ec09ffd983e7..35171d15f78d 100644
--- a/Documentation/admin-guide/gpio/sysfs.rst
+++ b/Documentation/admin-guide/gpio/sysfs.rst
@@ -145,7 +145,7 @@ requested using gpio_request()::
 	/* export the GPIO to userspace */
 	int gpiod_export(struct gpio_desc *desc, bool direction_may_change);
 
-	/* reverse gpio_export() */
+	/* reverse gpiod_export() */
 	void gpiod_unexport(struct gpio_desc *desc);
 
 	/* create a sysfs link to an exported GPIO node */
diff --git a/Documentation/driver-api/gpio/legacy.rst b/Documentation/driver-api/gpio/legacy.rst
index e0306e78e34b..78372853c6d4 100644
--- a/Documentation/driver-api/gpio/legacy.rst
+++ b/Documentation/driver-api/gpio/legacy.rst
@@ -714,27 +714,6 @@ gpiochip nodes (possibly in conjunction with schematics) to determine
 the correct GPIO number to use for a given signal.
 
 
-Exporting from Kernel code
---------------------------
-Kernel code can explicitly manage exports of GPIOs which have already been
-requested using gpio_request()::
-
-	/* export the GPIO to userspace */
-	int gpio_export(unsigned gpio, bool direction_may_change);
-
-	/* reverse gpio_export() */
-	void gpio_unexport();
-
-After a kernel driver requests a GPIO, it may only be made available in
-the sysfs interface by gpio_export().  The driver can control whether the
-signal direction may change.  This helps drivers prevent userspace code
-from accidentally clobbering important system state.
-
-This explicit exporting can help with debugging (by making some kinds
-of experiments easier), or can provide an always-there interface that's
-suitable for documenting as part of a board support package.
-
-
 API Reference
 =============
 
diff --git a/Documentation/translations/zh_CN/driver-api/gpio/legacy.rst b/Documentation/translations/zh_CN/driver-api/gpio/legacy.rst
index 74fa473bb504..2164999077a6 100644
--- a/Documentation/translations/zh_CN/driver-api/gpio/legacy.rst
+++ b/Documentation/translations/zh_CN/driver-api/gpio/legacy.rst
@@ -654,26 +654,6 @@ GPIO 控制器的路径类似 /sys/class/gpio/gpiochip42/ (对于从#42 GPIO
 确定给定信号所用的 GPIO 编号。
 
 
-从内核代码中导出
-----------------
-
-内核代码可以明确地管理那些已通过 gpio_request()申请的 GPIO 的导出::
-
-	/* 导出 GPIO 到用户空间 */
-	int gpio_export(unsigned gpio, bool direction_may_change);
-
-	/* gpio_export()的逆操作 */
-	void gpio_unexport();
-
-在一个内核驱动申请一个 GPIO 之后,它可以通过 gpio_export()使其在 sysfs
-接口中可见。该驱动可以控制信号方向是否可修改。这有助于防止用户空间代码无意间
-破坏重要的系统状态。
-
-这个明确的导出有助于(通过使某些实验更容易来)调试,也可以提供一个始终存在的接口,
-与文档配合作为板级支持包的一部分。
-
-
-API参考
 =======
 
 本节中列出的函数已被废弃。在新的代码中应该使用基于GPIO描述符的API。
diff --git a/Documentation/translations/zh_TW/gpio.txt b/Documentation/translations/zh_TW/gpio.txt
index 1b986bbb0909..79076f535faa 100644
--- a/Documentation/translations/zh_TW/gpio.txt
+++ b/Documentation/translations/zh_TW/gpio.txt
@@ -615,21 +615,3 @@ GPIO 控制器的路徑類似 /sys/class/gpio/gpiochip42/ (對於從#42 GPIO
 固定的,例如在擴展卡上的 GPIO會根據所使用的主板或所在堆疊架構中其他的板子而
 有所不同。在這種情況下,你可能需要使用 gpiochip 節點(儘可能地結合電路圖)來
 確定給定信號所用的 GPIO 編號。
-
-
-從內核代碼中導出
--------------
-內核代碼可以明確地管理那些已通過 gpio_request()申請的 GPIO 的導出:
-
-	/* 導出 GPIO 到用戶空間 */
-	int gpio_export(unsigned gpio, bool direction_may_change);
-
-	/* gpio_export()的逆操作 */
-	void gpio_unexport();
-
-在一個內核驅動申請一個 GPIO 之後,它可以通過 gpio_export()使其在 sysfs
-接口中可見。該驅動可以控制信號方向是否可修改。這有助於防止用戶空間代碼無意間
-破壞重要的系統狀態。
-
-這個明確的導出有助於(通過使某些實驗更容易來)調試,也可以提供一個始終存在的接口,
-與文檔配合作爲板級支持包的一部分。
diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c
index 248478af5bfa..ee90fb42c955 100644
--- a/arch/arm/mach-omap2/pdata-quirks.c
+++ b/arch/arm/mach-omap2/pdata-quirks.c
@@ -6,6 +6,7 @@
  */
 #include <linux/clk.h>
 #include <linux/davinci_emac.h>
+#include <linux/gpio/consumer.h>
 #include <linux/gpio.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
@@ -108,7 +109,7 @@ static int omap3_sbc_t3730_twl_callback(struct device *dev,
 	if (res)
 		return res;
 
-	gpio_export(gpio, 0);
+	gpiod_export(gpio_to_desc(gpio), 0);
 
 	return 0;
 }
@@ -123,7 +124,7 @@ static void __init omap3_sbc_t3x_usb_hub_init(int gpio, char *hub_name)
 		return;
 	}
 
-	gpio_export(gpio, 0);
+	gpiod_export(gpio_to_desc(gpio), 0);
 
 	udelay(10);
 	gpio_set_value(gpio, 1);
@@ -200,8 +201,8 @@ static void __init omap3_sbc_t3517_wifi_init(void)
 		return;
 	}
 
-	gpio_export(cm_t3517_wlan_gpios[0].gpio, 0);
-	gpio_export(cm_t3517_wlan_gpios[1].gpio, 0);
+	gpiod_export(gpio_to_desc(cm_t3517_wlan_gpios[0].gpio), 0);
+	gpiod_export(gpio_to_desc(cm_t3517_wlan_gpios[1].gpio), 0);
 
 	msleep(100);
 	gpio_set_value(cm_t3517_wlan_gpios[1].gpio, 0);
diff --git a/arch/sh/boards/mach-ap325rxa/setup.c b/arch/sh/boards/mach-ap325rxa/setup.c
index 6e66ac194f7d..48055991152c 100644
--- a/arch/sh/boards/mach-ap325rxa/setup.c
+++ b/arch/sh/boards/mach-ap325rxa/setup.c
@@ -18,6 +18,7 @@
 #include <linux/delay.h>
 #include <linux/device.h>
 #include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/gpio/machine.h>
 #include <linux/i2c.h>
 #include <linux/init.h>
@@ -411,16 +412,16 @@ static int __init ap325rxa_devices_setup(void)
 	/* LD3 and LD4 LEDs */
 	gpio_request(GPIO_PTX5, NULL); /* RUN */
 	gpio_direction_output(GPIO_PTX5, 1);
-	gpio_export(GPIO_PTX5, 0);
+	gpiod_export(gpio_to_desc(GPIO_PTX5), 0);
 
 	gpio_request(GPIO_PTX4, NULL); /* INDICATOR */
 	gpio_direction_output(GPIO_PTX4, 0);
-	gpio_export(GPIO_PTX4, 0);
+	gpiod_export(gpio_to_desc(GPIO_PTX4), 0);
 
 	/* SW1 input */
 	gpio_request(GPIO_PTF7, NULL); /* MODE */
 	gpio_direction_input(GPIO_PTF7);
-	gpio_export(GPIO_PTF7, 0);
+	gpiod_export(gpio_to_desc(GPIO_PTF7), 0);
 
 	/* LCDC */
 	gpio_request(GPIO_FN_LCDD15, NULL);
diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c
index cd27bf173dec..cee135eb768e 100644
--- a/drivers/gpio/gpiolib-sysfs.c
+++ b/drivers/gpio/gpiolib-sysfs.c
@@ -491,7 +491,7 @@ static ssize_t unexport_store(struct class *class,
 		goto done;
 
 	desc = gpio_to_desc(gpio);
-	/* reject bogus commands (gpio_unexport ignores them) */
+	/* reject bogus commands (gpiod_unexport ignores them) */
 	if (!desc) {
 		pr_warn("%s: invalid GPIO %ld\n", __func__, gpio);
 		return -EINVAL;
@@ -790,7 +790,7 @@ static int __init gpiolib_sysfs_init(void)
 	 * early (e.g. before the class_register above was called).
 	 *
 	 * We run before arch_initcall() so chip->dev nodes can have
-	 * registered, and so arch_initcall() can always gpio_export().
+	 * registered, and so arch_initcall() can always gpiod_export().
 	 */
 	spin_lock_irqsave(&gpio_lock, flags);
 	list_for_each_entry(gdev, &gpio_devices, list) {
diff --git a/drivers/media/pci/sta2x11/sta2x11_vip.c b/drivers/media/pci/sta2x11/sta2x11_vip.c
index 8535e49a4c4f..e4cf9d63e926 100644
--- a/drivers/media/pci/sta2x11/sta2x11_vip.c
+++ b/drivers/media/pci/sta2x11/sta2x11_vip.c
@@ -18,6 +18,7 @@
 #include <linux/pci.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
+#include <linux/gpio/consumer.h>
 #include <linux/gpio.h>
 #include <linux/i2c.h>
 #include <linux/delay.h>
@@ -889,6 +890,7 @@ static int sta2x11_vip_init_controls(struct sta2x11_vip *vip)
 static int vip_gpio_reserve(struct device *dev, int pin, int dir,
 			    const char *name)
 {
+	struct gpio_desc *desc = gpio_to_desc(pin);
 	int ret = -ENODEV;
 
 	if (!gpio_is_valid(pin))
@@ -900,7 +902,7 @@ static int vip_gpio_reserve(struct device *dev, int pin, int dir,
 		return ret;
 	}
 
-	ret = gpio_direction_output(pin, dir);
+	ret = gpiod_direction_output(desc, dir);
 	if (ret) {
 		dev_err(dev, "Failed to set direction for pin %d (%s)\n",
 			pin, name);
@@ -908,7 +910,7 @@ static int vip_gpio_reserve(struct device *dev, int pin, int dir,
 		return ret;
 	}
 
-	ret = gpio_export(pin, false);
+	ret = gpiod_export(desc, false);
 	if (ret) {
 		dev_err(dev, "Failed to export pin %d (%s)\n", pin, name);
 		gpio_free(pin);
@@ -928,8 +930,10 @@ static int vip_gpio_reserve(struct device *dev, int pin, int dir,
 static void vip_gpio_release(struct device *dev, int pin, const char *name)
 {
 	if (gpio_is_valid(pin)) {
+		struct gpio_desc *desc = gpio_to_desc(pin);
+
 		dev_dbg(dev, "releasing pin %d (%s)\n",	pin, name);
-		gpio_unexport(pin);
+		gpiod_unexport(desc);
 		gpio_free(pin);
 	}
 }
diff --git a/drivers/net/ieee802154/ca8210.c b/drivers/net/ieee802154/ca8210.c
index e1a569b99e4a..5c0be6a3ec5e 100644
--- a/drivers/net/ieee802154/ca8210.c
+++ b/drivers/net/ieee802154/ca8210.c
@@ -51,6 +51,7 @@
 #include <linux/clk-provider.h>
 #include <linux/debugfs.h>
 #include <linux/delay.h>
+#include <linux/gpio/consumer.h>
 #include <linux/gpio.h>
 #include <linux/ieee802154.h>
 #include <linux/io.h>
@@ -2853,7 +2854,7 @@ static int ca8210_interrupt_init(struct spi_device *spi)
 	);
 	if (ret) {
 		dev_crit(&spi->dev, "request_irq %d failed\n", pdata->irq_id);
-		gpio_unexport(pdata->gpio_irq);
+		gpiod_unexport(gpio_to_desc(pdata->gpio_irq));
 		gpio_free(pdata->gpio_irq);
 	}
 
diff --git a/include/linux/gpio.h b/include/linux/gpio.h
index da7a5ae68e47..57ec3975b656 100644
--- a/include/linux/gpio.h
+++ b/include/linux/gpio.h
@@ -127,20 +127,6 @@ extern int gpio_request_one(unsigned gpio, unsigned long flags, const char *labe
 extern int gpio_request_array(const struct gpio *array, size_t num);
 extern void gpio_free_array(const struct gpio *array, size_t num);
 
-/*
- * A sysfs interface can be exported by individual drivers if they want,
- * but more typically is configured entirely from userspace.
- */
-static inline int gpio_export(unsigned gpio, bool direction_may_change)
-{
-	return gpiod_export(gpio_to_desc(gpio), direction_may_change);
-}
-
-static inline void gpio_unexport(unsigned gpio)
-{
-	gpiod_unexport(gpio_to_desc(gpio));
-}
-
 /* CONFIG_GPIOLIB: bindings for managed devices that want to request gpios */
 
 struct device;
@@ -231,19 +217,6 @@ static inline void gpio_set_value_cansleep(unsigned gpio, int value)
 	WARN_ON(1);
 }
 
-static inline int gpio_export(unsigned gpio, bool direction_may_change)
-{
-	/* GPIO can never have been requested or set as {in,out}put */
-	WARN_ON(1);
-	return -EINVAL;
-}
-
-static inline void gpio_unexport(unsigned gpio)
-{
-	/* GPIO can never have been exported */
-	WARN_ON(1);
-}
-
 static inline int gpio_to_irq(unsigned gpio)
 {
 	/* GPIO can never have been requested or set as input */
-- 
2.39.0


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

* [PATCH 6/8] gpiolib: split linux/gpio/driver.h out of linux/gpio.h
  2023-01-26 13:27 [PATCH 0/8] gpiolib cleanups Arnd Bergmann
                   ` (4 preceding siblings ...)
  2023-01-26 13:27 ` [PATCH 5/8] gpiolib: remove legacy gpio_export Arnd Bergmann
@ 2023-01-26 13:27 ` Arnd Bergmann
  2023-01-26 14:04   ` Andy Shevchenko
  2023-01-27 13:15   ` Linus Walleij
  2023-01-26 13:28 ` [PATCH 7/8] gpiolib: split of_mm_gpio_chip out of linux/of_gpio.h Arnd Bergmann
  2023-01-26 13:28 ` [PATCH 8/8] gpiolib: move of_gpio_flags into gpiolib-of.c Arnd Bergmann
  7 siblings, 2 replies; 35+ messages in thread
From: Arnd Bergmann @ 2023-01-26 13:27 UTC (permalink / raw)
  To: linux-gpio
  Cc: Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, Linus Walleij, linux-kernel

From: Arnd Bergmann <arnd@arndb.de>

Almost all gpio drivers include linux/gpio/driver.h, and other
files should not rely on includes from this header.

Remove the indirect include from here and include the correct
headers directly from where they are used.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/arm/mach-omap1/irq.c                              | 1 +
 arch/arm/mach-orion5x/board-rd88f5182.c                | 1 +
 arch/arm/mach-s3c/s3c64xx.c                            | 1 +
 arch/arm/mach-sa1100/assabet.c                         | 1 +
 arch/arm/plat-orion/gpio.c                             | 1 +
 drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.c | 1 +
 include/linux/gpio.h                                   | 2 --
 include/linux/mfd/ucb1x00.h                            | 1 +
 8 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-omap1/irq.c b/arch/arm/mach-omap1/irq.c
index 9ccc784fd614..bfc7ab010ae2 100644
--- a/arch/arm/mach-omap1/irq.c
+++ b/arch/arm/mach-omap1/irq.c
@@ -41,6 +41,7 @@
 #include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
+#include <linux/irqdomain.h>
 
 #include <asm/irq.h>
 #include <asm/exception.h>
diff --git a/arch/arm/mach-orion5x/board-rd88f5182.c b/arch/arm/mach-orion5x/board-rd88f5182.c
index 596601367989..1c14e49a90a6 100644
--- a/arch/arm/mach-orion5x/board-rd88f5182.c
+++ b/arch/arm/mach-orion5x/board-rd88f5182.c
@@ -9,6 +9,7 @@
 #include <linux/gpio.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
+#include <linux/of.h>
 #include <linux/platform_device.h>
 #include <linux/pci.h>
 #include <linux/irq.h>
diff --git a/arch/arm/mach-s3c/s3c64xx.c b/arch/arm/mach-s3c/s3c64xx.c
index c20163e6a8b4..c5aa4d8ed8bd 100644
--- a/arch/arm/mach-s3c/s3c64xx.c
+++ b/arch/arm/mach-s3c/s3c64xx.c
@@ -24,6 +24,7 @@
 #include <linux/platform_device.h>
 #include <linux/reboot.h>
 #include <linux/io.h>
+#include <linux/of.h>
 #include <linux/clk/samsung.h>
 #include <linux/dma-mapping.h>
 #include <linux/irq.h>
diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c
index 04f8a1680bc1..06e7b1358226 100644
--- a/arch/arm/mach-sa1100/assabet.c
+++ b/arch/arm/mach-sa1100/assabet.c
@@ -12,6 +12,7 @@
 #include <linux/errno.h>
 #include <linux/gpio/gpio-reg.h>
 #include <linux/gpio/machine.h>
+#include <linux/gpio/driver.h>
 #include <linux/gpio_keys.h>
 #include <linux/ioport.h>
 #include <linux/platform_data/sa11x0-serial.h>
diff --git a/arch/arm/plat-orion/gpio.c b/arch/arm/plat-orion/gpio.c
index 3ef9ecdd6343..4946d8066f6a 100644
--- a/arch/arm/plat-orion/gpio.c
+++ b/arch/arm/plat-orion/gpio.c
@@ -19,6 +19,7 @@
 #include <linux/bitops.h>
 #include <linux/io.h>
 #include <linux/gpio.h>
+#include <linux/gpio/driver.h>
 #include <linux/leds.h>
 #include <linux/of.h>
 #include <linux/of_irq.h>
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.c
index 9540a05247c2..89c8829528c2 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.c
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 #include <net/mac80211.h>
 #include <linux/bcma/bcma_driver_chipcommon.h>
+#include <linux/gpio.h>
 #include <linux/gpio/driver.h>
 #include <linux/gpio/machine.h>
 #include <linux/gpio/consumer.h>
diff --git a/include/linux/gpio.h b/include/linux/gpio.h
index 57ec3975b656..06a33339994e 100644
--- a/include/linux/gpio.h
+++ b/include/linux/gpio.h
@@ -54,8 +54,6 @@ struct gpio {
 };
 
 #ifdef CONFIG_GPIOLIB
-#include <linux/compiler.h>
-#include <linux/gpio/driver.h>
 #include <linux/gpio/consumer.h>
 
 /*
diff --git a/include/linux/mfd/ucb1x00.h b/include/linux/mfd/ucb1x00.h
index 9aed2797d3d5..2e65354fc7b8 100644
--- a/include/linux/mfd/ucb1x00.h
+++ b/include/linux/mfd/ucb1x00.h
@@ -9,6 +9,7 @@
 
 #include <linux/device.h>
 #include <linux/mfd/mcp.h>
+#include <linux/gpio/driver.h>
 #include <linux/gpio.h>
 #include <linux/mutex.h>
 
-- 
2.39.0


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

* [PATCH 7/8] gpiolib: split of_mm_gpio_chip out of linux/of_gpio.h
  2023-01-26 13:27 [PATCH 0/8] gpiolib cleanups Arnd Bergmann
                   ` (5 preceding siblings ...)
  2023-01-26 13:27 ` [PATCH 6/8] gpiolib: split linux/gpio/driver.h out of linux/gpio.h Arnd Bergmann
@ 2023-01-26 13:28 ` Arnd Bergmann
  2023-01-26 14:08   ` Andy Shevchenko
  2023-01-27 13:17   ` Linus Walleij
  2023-01-26 13:28 ` [PATCH 8/8] gpiolib: move of_gpio_flags into gpiolib-of.c Arnd Bergmann
  7 siblings, 2 replies; 35+ messages in thread
From: Arnd Bergmann @ 2023-01-26 13:28 UTC (permalink / raw)
  To: linux-gpio
  Cc: Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, Linus Walleij, linux-kernel

From: Arnd Bergmann <arnd@arndb.de>

This is a rarely used feature that has nothing to do with the
client-side of_gpio.h.

Split it out with a separate header file and Kconfig option
so it can be removed on its own timeline aside from removing
the of_gpio consumer interfaces.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/powerpc/platforms/44x/Kconfig         |  1 +
 arch/powerpc/platforms/4xx/gpio.c          |  2 +-
 arch/powerpc/platforms/8xx/Kconfig         |  1 +
 arch/powerpc/platforms/8xx/cpm1.c          |  2 +-
 arch/powerpc/platforms/Kconfig             |  2 ++
 arch/powerpc/sysdev/cpm_common.c           |  2 +-
 drivers/gpio/Kconfig                       | 11 +++++++
 drivers/gpio/TODO                          | 15 ++++++---
 drivers/gpio/gpio-altera.c                 |  2 +-
 drivers/gpio/gpio-mm-lantiq.c              |  2 +-
 drivers/gpio/gpio-mpc5200.c                |  2 +-
 drivers/gpio/gpiolib-of.c                  |  3 ++
 drivers/soc/fsl/qe/gpio.c                  |  2 +-
 include/linux/gpio/legacy-of-mm-gpiochip.h | 36 ++++++++++++++++++++++
 include/linux/of_gpio.h                    | 21 -------------
 15 files changed, 71 insertions(+), 33 deletions(-)
 create mode 100644 include/linux/gpio/legacy-of-mm-gpiochip.h

diff --git a/arch/powerpc/platforms/44x/Kconfig b/arch/powerpc/platforms/44x/Kconfig
index 25b80cd558f8..1624ebf95497 100644
--- a/arch/powerpc/platforms/44x/Kconfig
+++ b/arch/powerpc/platforms/44x/Kconfig
@@ -230,6 +230,7 @@ config PPC4xx_GPIO
 	bool "PPC4xx GPIO support"
 	depends on 44x
 	select GPIOLIB
+	select OF_GPIO_MM_GPIOCHIP
 	help
 	  Enable gpiolib support for ppc440 based boards
 
diff --git a/arch/powerpc/platforms/4xx/gpio.c b/arch/powerpc/platforms/4xx/gpio.c
index 49ee8d365852..e5f2319e5cbe 100644
--- a/arch/powerpc/platforms/4xx/gpio.c
+++ b/arch/powerpc/platforms/4xx/gpio.c
@@ -14,7 +14,7 @@
 #include <linux/spinlock.h>
 #include <linux/io.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>
+#include <linux/gpio/legacy-of-mm-gpiochip.h>
 #include <linux/gpio/driver.h>
 #include <linux/types.h>
 #include <linux/slab.h>
diff --git a/arch/powerpc/platforms/8xx/Kconfig b/arch/powerpc/platforms/8xx/Kconfig
index 60cc5b537a98..a14d9d8997a4 100644
--- a/arch/powerpc/platforms/8xx/Kconfig
+++ b/arch/powerpc/platforms/8xx/Kconfig
@@ -101,6 +101,7 @@ comment "Generic MPC8xx Options"
 config 8xx_GPIO
 	bool "GPIO API Support"
 	select GPIOLIB
+	select OF_GPIO_MM_GPIOCHIP
 	help
 	  Saying Y here will cause the ports on an MPC8xx processor to be used
 	  with the GPIO API.  If you say N here, the kernel needs less memory.
diff --git a/arch/powerpc/platforms/8xx/cpm1.c b/arch/powerpc/platforms/8xx/cpm1.c
index bb38c8d8f8de..56ca14f77543 100644
--- a/arch/powerpc/platforms/8xx/cpm1.c
+++ b/arch/powerpc/platforms/8xx/cpm1.c
@@ -44,7 +44,7 @@
 #include <asm/fs_pd.h>
 
 #ifdef CONFIG_8xx_GPIO
-#include <linux/of_gpio.h>
+#include <linux/gpio/legacy-of-mm-gpiochip.h>
 #endif
 
 #define CPM_MAP_SIZE    (0x4000)
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig
index d41dad227de8..8e4bbd19dec5 100644
--- a/arch/powerpc/platforms/Kconfig
+++ b/arch/powerpc/platforms/Kconfig
@@ -244,6 +244,7 @@ config QE_GPIO
 	bool "QE GPIO support"
 	depends on QUICC_ENGINE
 	select GPIOLIB
+	select OF_GPIO_MM_GPIOCHIP
 	help
 	  Say Y here if you're going to use hardware that connects to the
 	  QE GPIOs.
@@ -254,6 +255,7 @@ config CPM2
 	select CPM
 	select HAVE_PCI
 	select GPIOLIB
+	select OF_GPIO_MM_GPIOCHIP
 	help
 	  The CPM2 (Communications Processor Module) is a coprocessor on
 	  embedded CPUs made by Freescale.  Selecting this option means that
diff --git a/arch/powerpc/sysdev/cpm_common.c b/arch/powerpc/sysdev/cpm_common.c
index 7dc1960f8bdb..8234013a8772 100644
--- a/arch/powerpc/sysdev/cpm_common.c
+++ b/arch/powerpc/sysdev/cpm_common.c
@@ -31,7 +31,7 @@
 #include <mm/mmu_decl.h>
 
 #if defined(CONFIG_CPM2) || defined(CONFIG_8xx_GPIO)
-#include <linux/of_gpio.h>
+#include <linux/gpio/legacy-of-mm-gpiochip.h>
 #endif
 
 static int __init cpm_init(void)
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 06a268d56800..7534a2115d18 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -39,6 +39,14 @@ config GPIOLIB_IRQCHIP
 	select IRQ_DOMAIN
 	bool
 
+config OF_GPIO_MM_GPIOCHIP
+	bool
+	help
+	  This adds support for the legacy 'struct of_mm_gpio_chip' interface
+	  from PowerPC. Existing drivers using this interface need to select
+	  this symbol, but new drivers should use the generic gpio-mmio
+	  infrastructure instead.
+
 config DEBUG_GPIO
 	bool "Debug GPIO calls"
 	depends on DEBUG_KERNEL
@@ -131,6 +139,7 @@ config GPIO_ALTERA
 	tristate "Altera GPIO"
 	depends on OF_GPIO
 	select GPIOLIB_IRQCHIP
+	select OF_GPIO_MM_GPIOCHIP
 	help
 	  Say Y or M here to build support for the Altera PIO device.
 
@@ -403,6 +412,7 @@ config GPIO_MENZ127
 config GPIO_MM_LANTIQ
 	bool "Lantiq Memory mapped GPIOs"
 	depends on LANTIQ && SOC_XWAY
+	select OF_GPIO_MM_GPIOCHIP
 	help
 	  This enables support for memory mapped GPIOs on the External Bus Unit
 	  (EBU) found on Lantiq SoCs. The GPIOs are output only as they are
@@ -411,6 +421,7 @@ config GPIO_MM_LANTIQ
 config GPIO_MPC5200
 	def_bool y
 	depends on PPC_MPC52xx
+	select OF_GPIO_MM_GPIOCHIP
 
 config GPIO_MPC8XXX
 	bool "MPC512x/MPC8xxx/QorIQ GPIO support"
diff --git a/drivers/gpio/TODO b/drivers/gpio/TODO
index 68ada1066941..189c3abe7e79 100644
--- a/drivers/gpio/TODO
+++ b/drivers/gpio/TODO
@@ -59,11 +59,6 @@ the device tree back-end. It is legacy and should not be used in new code.
 
 Work items:
 
-- Get rid of struct of_mm_gpio_chip altogether: use the generic  MMIO
-  GPIO for all current users (see below). Delete struct of_mm_gpio_chip,
-  to_of_mm_gpio_chip(), of_mm_gpiochip_add_data(), of_mm_gpiochip_remove()
-  from the kernel.
-
 - Change all consumer drivers that #include <linux/of_gpio.h> to
   #include <linux/gpio/consumer.h> and stop doing custom parsing of the
   GPIO lines from the device tree. This can be tricky and often ivolves
@@ -81,6 +76,16 @@ Work items:
   uses <linux/gpio/consumer.h> or <linux/gpio/driver.h> instead.
 
 
+Get rid of <linux/gpio/legacy-of-mm-gpiochip.h>
+
+Work items:
+
+- Get rid of struct of_mm_gpio_chip altogether: use the generic  MMIO
+  GPIO for all current users (see below). Delete struct of_mm_gpio_chip,
+  to_of_mm_gpio_chip(), of_mm_gpiochip_add_data(), of_mm_gpiochip_remove(),
+  CONFIG_OF_GPIO_MM_GPIOCHIP from the kernel.
+
+
 Get rid of <linux/gpio.h>
 
 This legacy header is a one stop shop for anything GPIO is closely tied
diff --git a/drivers/gpio/gpio-altera.c b/drivers/gpio/gpio-altera.c
index b59fae993626..99e137f8097e 100644
--- a/drivers/gpio/gpio-altera.c
+++ b/drivers/gpio/gpio-altera.c
@@ -7,7 +7,7 @@
 #include <linux/io.h>
 #include <linux/module.h>
 #include <linux/gpio/driver.h>
-#include <linux/of_gpio.h> /* For of_mm_gpio_chip */
+#include <linux/gpio/legacy-of-mm-gpiochip.h>
 #include <linux/platform_device.h>
 
 #define ALTERA_GPIO_MAX_NGPIO		32
diff --git a/drivers/gpio/gpio-mm-lantiq.c b/drivers/gpio/gpio-mm-lantiq.c
index 538e31fe8903..27ff84c5d162 100644
--- a/drivers/gpio/gpio-mm-lantiq.c
+++ b/drivers/gpio/gpio-mm-lantiq.c
@@ -10,8 +10,8 @@
 #include <linux/platform_device.h>
 #include <linux/mutex.h>
 #include <linux/gpio/driver.h>
+#include <linux/gpio/legacy-of-mm-gpiochip.h.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>
 #include <linux/io.h>
 #include <linux/slab.h>
 
diff --git a/drivers/gpio/gpio-mpc5200.c b/drivers/gpio/gpio-mpc5200.c
index 000494e0c533..3b0bfff8c778 100644
--- a/drivers/gpio/gpio-mpc5200.c
+++ b/drivers/gpio/gpio-mpc5200.c
@@ -8,7 +8,7 @@
 #include <linux/of.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
-#include <linux/of_gpio.h>
+#include <linux/gpio/legacy-of-mm-gpiochip.h>
 #include <linux/io.h>
 #include <linux/of_platform.h>
 #include <linux/module.h>
diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
index edc769d2d338..6a08569a20c1 100644
--- a/drivers/gpio/gpiolib-of.c
+++ b/drivers/gpio/gpiolib-of.c
@@ -877,6 +877,8 @@ static int of_gpio_simple_xlate(struct gpio_chip *gc,
 	return gpiospec->args[0];
 }
 
+#if IS_ENABLED(CONFIG_OF_GPIO_MM_GPIOCHIP)
+#include <linux/gpio/legacy-of-mm-gpiochip.h>
 /**
  * of_mm_gpiochip_add_data - Add memory mapped GPIO chip (bank)
  * @np:		device node of the GPIO chip
@@ -949,6 +951,7 @@ void of_mm_gpiochip_remove(struct of_mm_gpio_chip *mm_gc)
 	kfree(gc->label);
 }
 EXPORT_SYMBOL_GPL(of_mm_gpiochip_remove);
+#endif
 
 #ifdef CONFIG_PINCTRL
 static int of_gpiochip_add_pin_range(struct gpio_chip *chip)
diff --git a/drivers/soc/fsl/qe/gpio.c b/drivers/soc/fsl/qe/gpio.c
index 1c41eb49d5a7..3ef24ba0245b 100644
--- a/drivers/soc/fsl/qe/gpio.c
+++ b/drivers/soc/fsl/qe/gpio.c
@@ -13,7 +13,7 @@
 #include <linux/err.h>
 #include <linux/io.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>	/* for of_mm_gpio_chip */
+#include <linux/gpio/legacy-of-mm-gpiochip.h>
 #include <linux/gpio/consumer.h>
 #include <linux/gpio/driver.h>
 #include <linux/slab.h>
diff --git a/include/linux/gpio/legacy-of-mm-gpiochip.h b/include/linux/gpio/legacy-of-mm-gpiochip.h
new file mode 100644
index 000000000000..2e2bd3b19cc3
--- /dev/null
+++ b/include/linux/gpio/legacy-of-mm-gpiochip.h
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * OF helpers for the old of_mm_gpio_chip, used on ppc32 and nios2,
+ * do not use in new code.
+ *
+ * Copyright (c) 2007-2008  MontaVista Software, Inc.
+ *
+ * Author: Anton Vorontsov <avorontsov@ru.mvista.com>
+ */
+
+#ifndef __LINUX_GPIO_LEGACY_OF_MM_GPIO_CHIP_H
+#define __LINUX_GPIO_LEGACY_OF_MM_GPIO_CHIP_H
+
+#include <linux/gpio/driver.h>
+#include <linux/of.h>
+
+/*
+ * OF GPIO chip for memory mapped banks
+ */
+struct of_mm_gpio_chip {
+	struct gpio_chip gc;
+	void (*save_regs)(struct of_mm_gpio_chip *mm_gc);
+	void __iomem *regs;
+};
+
+static inline struct of_mm_gpio_chip *to_of_mm_gpio_chip(struct gpio_chip *gc)
+{
+	return container_of(gc, struct of_mm_gpio_chip, gc);
+}
+
+extern int of_mm_gpiochip_add_data(struct device_node *np,
+				   struct of_mm_gpio_chip *mm_gc,
+				   void *data);
+extern void of_mm_gpiochip_remove(struct of_mm_gpio_chip *mm_gc);
+
+#endif /* __LINUX_GPIO_LEGACY_OF_MM_GPIO_CHIP_H */
diff --git a/include/linux/of_gpio.h b/include/linux/of_gpio.h
index 935225caf70d..04e1f76acdd7 100644
--- a/include/linux/of_gpio.h
+++ b/include/linux/of_gpio.h
@@ -34,30 +34,9 @@ enum of_gpio_flags {
 
 #ifdef CONFIG_OF_GPIO
 
-#include <linux/container_of.h>
-
-/*
- * OF GPIO chip for memory mapped banks
- */
-struct of_mm_gpio_chip {
-	struct gpio_chip gc;
-	void (*save_regs)(struct of_mm_gpio_chip *mm_gc);
-	void __iomem *regs;
-};
-
-static inline struct of_mm_gpio_chip *to_of_mm_gpio_chip(struct gpio_chip *gc)
-{
-	return container_of(gc, struct of_mm_gpio_chip, gc);
-}
-
 extern int of_get_named_gpio(const struct device_node *np,
 			     const char *list_name, int index);
 
-extern int of_mm_gpiochip_add_data(struct device_node *np,
-				   struct of_mm_gpio_chip *mm_gc,
-				   void *data);
-extern void of_mm_gpiochip_remove(struct of_mm_gpio_chip *mm_gc);
-
 #else /* CONFIG_OF_GPIO */
 
 #include <linux/errno.h>
-- 
2.39.0


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

* [PATCH 8/8] gpiolib: move of_gpio_flags into gpiolib-of.c
  2023-01-26 13:27 [PATCH 0/8] gpiolib cleanups Arnd Bergmann
                   ` (6 preceding siblings ...)
  2023-01-26 13:28 ` [PATCH 7/8] gpiolib: split of_mm_gpio_chip out of linux/of_gpio.h Arnd Bergmann
@ 2023-01-26 13:28 ` Arnd Bergmann
  2023-01-26 14:09   ` Andy Shevchenko
  7 siblings, 1 reply; 35+ messages in thread
From: Arnd Bergmann @ 2023-01-26 13:28 UTC (permalink / raw)
  To: linux-gpio
  Cc: Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, Linus Walleij, linux-kernel

From: Arnd Bergmann <arnd@arndb.de>

There is no need for this in the header any more, it's just
an implementation detail now.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 drivers/gpio/gpiolib-of.c | 15 +++++++++++++++
 include/linux/of_gpio.h   | 15 ---------------
 2 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
index 6a08569a20c1..1563ddcf32d4 100644
--- a/drivers/gpio/gpiolib-of.c
+++ b/drivers/gpio/gpiolib-of.c
@@ -23,6 +23,21 @@
 #include "gpiolib.h"
 #include "gpiolib-of.h"
 
+/*
+ * This is Linux-specific flags. By default controllers' and Linux' mapping
+ * match, but GPIO controllers are free to translate their own flags to
+ * Linux-specific in their .xlate callback. Though, 1:1 mapping is recommended.
+ */
+enum of_gpio_flags {
+	OF_GPIO_ACTIVE_LOW = 0x1,
+	OF_GPIO_SINGLE_ENDED = 0x2,
+	OF_GPIO_OPEN_DRAIN = 0x4,
+	OF_GPIO_TRANSITORY = 0x8,
+	OF_GPIO_PULL_UP = 0x10,
+	OF_GPIO_PULL_DOWN = 0x20,
+	OF_GPIO_PULL_DISABLE = 0x40,
+};
+
 /**
  * of_gpio_named_count() - Count GPIOs for a device
  * @np:		device node to count GPIOs for
diff --git a/include/linux/of_gpio.h b/include/linux/of_gpio.h
index 04e1f76acdd7..d0f66a5e1b2a 100644
--- a/include/linux/of_gpio.h
+++ b/include/linux/of_gpio.h
@@ -17,21 +17,6 @@
 
 struct device_node;
 
-/*
- * This is Linux-specific flags. By default controllers' and Linux' mapping
- * match, but GPIO controllers are free to translate their own flags to
- * Linux-specific in their .xlate callback. Though, 1:1 mapping is recommended.
- */
-enum of_gpio_flags {
-	OF_GPIO_ACTIVE_LOW = 0x1,
-	OF_GPIO_SINGLE_ENDED = 0x2,
-	OF_GPIO_OPEN_DRAIN = 0x4,
-	OF_GPIO_TRANSITORY = 0x8,
-	OF_GPIO_PULL_UP = 0x10,
-	OF_GPIO_PULL_DOWN = 0x20,
-	OF_GPIO_PULL_DISABLE = 0x40,
-};
-
 #ifdef CONFIG_OF_GPIO
 
 extern int of_get_named_gpio(const struct device_node *np,
-- 
2.39.0


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

* Re: [PATCH 3/8] gpiolib: remove asm-generic/gpio.h
  2023-01-26 13:27 ` [PATCH 3/8] gpiolib: remove asm-generic/gpio.h Arnd Bergmann
@ 2023-01-26 13:46   ` Andy Shevchenko
  2023-01-26 15:43     ` Arnd Bergmann
  2023-01-27 13:07   ` Linus Walleij
  1 sibling, 1 reply; 35+ messages in thread
From: Andy Shevchenko @ 2023-01-26 13:46 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linux-gpio, Arnd Bergmann, Bartosz Golaszewski, Christophe Leroy,
	Dmitry Torokhov, Linus Walleij, linux-kernel

On Thu, Jan 26, 2023 at 02:27:56PM +0100, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd@arndb.de>
> 
> The asm-generic/gpio.h file is now always included when
> using gpiolib, so just move its contents into linux/gpio.h
> with a few minor simplifications.

Thanks! Very appreciated, my comments below.

...

> --- a/drivers/gpio/gpio-davinci.c
> +++ b/drivers/gpio/gpio-davinci.c
> @@ -7,6 +7,7 @@
>   */

>  #include <linux/gpio/driver.h>


> +#include <linux/gpio.h>

I believe the driver does not need this.

I have briefly checked all gpio_ places in it and found nothing that requires
this inclusion to be done.

>  #include <linux/errno.h>
>  #include <linux/kernel.h>
>  #include <linux/clk.h>
> @@ -24,8 +25,6 @@
>  #include <linux/spinlock.h>
>  #include <linux/pm_runtime.h>
>  
> -#include <asm-generic/gpio.h>
> -
>  #define MAX_REGS_BANKS 5
>  #define MAX_INT_PER_BANK 32

Thanks for this, that was a PITA!

...

> --- a/drivers/pinctrl/core.c
> +++ b/drivers/pinctrl/core.c
> @@ -30,7 +30,7 @@
>  
>  #ifdef CONFIG_GPIOLIB
>  #include "../gpio/gpiolib.h"
> -#include <asm-generic/gpio.h>
> +#include <linux/gpio.h>

Can we actually swap them?

#include <linux/gpio.h>
#include "../gpio/gpiolib.h"

But hold on, why do we even need gpio.h here?!

>  #endif
>  
>  #include "core.h"

...

> --- a/include/linux/gpio.h
> +++ b/include/linux/gpio.h
> @@ -54,26 +54,101 @@ struct gpio {
>  };
>  
>  #ifdef CONFIG_GPIOLIB
> -#include <asm-generic/gpio.h>
> +#include <linux/compiler.h>

> +#include <linux/gpio/driver.h>
> +#include <linux/gpio/consumer.h>

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

...

> +/*
> + * "valid" GPIO numbers are nonnegative and may be passed to
> + * setup routines like gpio_request().  only some valid numbers

While at it, '.  only' --> '. Only'.

> + * can successfully be requested and used.
> + *
> + * Invalid GPIO numbers are useful for indicating no-such-GPIO in
> + * platform data and other tables.
> + */

...

> +extern int gpio_request(unsigned gpio, const char *label);
> +extern void gpio_free(unsigned gpio);

While at it, s/extern//.

...

> +extern int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
> +extern int gpio_request_array(const struct gpio *array, size_t num);
> +extern void gpio_free_array(const struct gpio *array, size_t num);

Ditto.

-- 
With Best Regards,
Andy Shevchenko



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

* Re: [PATCH 4/8] gpiolib: remove gpio_set_debounce
  2023-01-26 13:27 ` [PATCH 4/8] gpiolib: remove gpio_set_debounce Arnd Bergmann
@ 2023-01-26 13:50   ` Andy Shevchenko
  2023-01-26 15:30     ` Arnd Bergmann
  2023-01-27 13:09   ` Linus Walleij
  1 sibling, 1 reply; 35+ messages in thread
From: Andy Shevchenko @ 2023-01-26 13:50 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linux-gpio, Arnd Bergmann, Bartosz Golaszewski, Christophe Leroy,
	Dmitry Torokhov, Linus Walleij, linux-kernel

On Thu, Jan 26, 2023 at 02:27:57PM +0100, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd@arndb.de>
> 
> gpio_set_debounce() only has a single user, which is trivially
> converted to gpiod_set_debounce().

Also need to mention the gpio_cansleep() removal.

P.S. Fun fact that I was yesterday thinking about the pretty much
the same change, except intrusive conversion of the user.

...

>  Documentation/driver-api/gpio/legacy.rst |  2 --

Documentation/translations/zh_CN/driver-api/gpio/legacy.rst:222:                gpio_set_debounce()
Documentation/translations/zh_TW/gpio.txt:229:  gpio_set_debounce()


>  drivers/input/touchscreen/ads7846.c      | 24 +++++++++++++-----------
>  include/linux/gpio.h                     | 22 ----------------------

...

>  #include <linux/of_gpio.h>

Do we need this?

>  #include <linux/of_device.h>
> +#include <linux/gpio/consumer.h>

>  #include <linux/gpio.h>

And this?

-- 
With Best Regards,
Andy Shevchenko



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

* Re: [PATCH 5/8] gpiolib: remove legacy gpio_export
  2023-01-26 13:27 ` [PATCH 5/8] gpiolib: remove legacy gpio_export Arnd Bergmann
@ 2023-01-26 14:00   ` Andy Shevchenko
  2023-01-26 16:02     ` Arnd Bergmann
  2023-01-27 13:09   ` Linus Walleij
  1 sibling, 1 reply; 35+ messages in thread
From: Andy Shevchenko @ 2023-01-26 14:00 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linux-gpio, Arnd Bergmann, Bartosz Golaszewski, Christophe Leroy,
	Dmitry Torokhov, Linus Walleij, linux-kernel

On Thu, Jan 26, 2023 at 02:27:58PM +0100, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd@arndb.de>
> 
> There are only a handful of users of gpio_export() and
> related functions.
> 
> As these are just wrappers around the modern gpiod_export()
> helper, remove the wrappers and open-code the gpio_to_desc
> in all callers to shrink the legacy API.


A couple of comments below, after addressing:
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
>  Documentation/admin-guide/gpio/sysfs.rst      |  2 +-
>  Documentation/driver-api/gpio/legacy.rst      | 21 ---------------
>  .../zh_CN/driver-api/gpio/legacy.rst          | 20 --------------
>  Documentation/translations/zh_TW/gpio.txt     | 18 -------------
>  arch/arm/mach-omap2/pdata-quirks.c            |  9 ++++---
>  arch/sh/boards/mach-ap325rxa/setup.c          |  7 ++---
>  drivers/gpio/gpiolib-sysfs.c                  |  4 +--
>  drivers/media/pci/sta2x11/sta2x11_vip.c       | 10 ++++---
>  drivers/net/ieee802154/ca8210.c               |  3 ++-
>  include/linux/gpio.h                          | 27 -------------------
>  10 files changed, 21 insertions(+), 100 deletions(-)
> 
> diff --git a/Documentation/admin-guide/gpio/sysfs.rst b/Documentation/admin-guide/gpio/sysfs.rst
> index ec09ffd983e7..35171d15f78d 100644
> --- a/Documentation/admin-guide/gpio/sysfs.rst
> +++ b/Documentation/admin-guide/gpio/sysfs.rst
> @@ -145,7 +145,7 @@ requested using gpio_request()::
>  	/* export the GPIO to userspace */
>  	int gpiod_export(struct gpio_desc *desc, bool direction_may_change);
>  
> -	/* reverse gpio_export() */
> +	/* reverse gpiod_export() */
>  	void gpiod_unexport(struct gpio_desc *desc);
>  
>  	/* create a sysfs link to an exported GPIO node */
> diff --git a/Documentation/driver-api/gpio/legacy.rst b/Documentation/driver-api/gpio/legacy.rst
> index e0306e78e34b..78372853c6d4 100644
> --- a/Documentation/driver-api/gpio/legacy.rst
> +++ b/Documentation/driver-api/gpio/legacy.rst
> @@ -714,27 +714,6 @@ gpiochip nodes (possibly in conjunction with schematics) to determine
>  the correct GPIO number to use for a given signal.
>  
>  
> -Exporting from Kernel code
> ---------------------------
> -Kernel code can explicitly manage exports of GPIOs which have already been
> -requested using gpio_request()::
> -
> -	/* export the GPIO to userspace */
> -	int gpio_export(unsigned gpio, bool direction_may_change);
> -
> -	/* reverse gpio_export() */
> -	void gpio_unexport();
> -
> -After a kernel driver requests a GPIO, it may only be made available in
> -the sysfs interface by gpio_export().  The driver can control whether the
> -signal direction may change.  This helps drivers prevent userspace code
> -from accidentally clobbering important system state.
> -
> -This explicit exporting can help with debugging (by making some kinds
> -of experiments easier), or can provide an always-there interface that's
> -suitable for documenting as part of a board support package.
> -
> -
>  API Reference
>  =============
>  
> diff --git a/Documentation/translations/zh_CN/driver-api/gpio/legacy.rst b/Documentation/translations/zh_CN/driver-api/gpio/legacy.rst
> index 74fa473bb504..2164999077a6 100644
> --- a/Documentation/translations/zh_CN/driver-api/gpio/legacy.rst
> +++ b/Documentation/translations/zh_CN/driver-api/gpio/legacy.rst
> @@ -654,26 +654,6 @@ GPIO 控制器的路径类似 /sys/class/gpio/gpiochip42/ (对于从#42 GPIO
>  确定给定信号所用的 GPIO 编号。
>  
>  
> -从内核代码中导出
> -----------------
> -
> -内核代码可以明确地管理那些已通过 gpio_request()申请的 GPIO 的导出::
> -
> -	/* 导出 GPIO 到用户空间 */
> -	int gpio_export(unsigned gpio, bool direction_may_change);
> -
> -	/* gpio_export()的逆操作 */
> -	void gpio_unexport();
> -
> -在一个内核驱动申请一个 GPIO 之后,它可以通过 gpio_export()使其在 sysfs
> -接口中可见。该驱动可以控制信号方向是否可修改。这有助于防止用户空间代码无意间
> -破坏重要的系统状态。
> -
> -这个明确的导出有助于(通过使某些实验更容易来)调试,也可以提供一个始终存在的接口,
> -与文档配合作为板级支持包的一部分。
> -
> -

> -API参考

Mistakenly removed?

>  =======
>  
>  本节中列出的函数已被废弃。在新的代码中应该使用基于GPIO描述符的API。
> diff --git a/Documentation/translations/zh_TW/gpio.txt b/Documentation/translations/zh_TW/gpio.txt
> index 1b986bbb0909..79076f535faa 100644
> --- a/Documentation/translations/zh_TW/gpio.txt
> +++ b/Documentation/translations/zh_TW/gpio.txt
> @@ -615,21 +615,3 @@ GPIO 控制器的路徑類似 /sys/class/gpio/gpiochip42/ (對於從#42 GPIO
>  固定的,例如在擴展卡上的 GPIO會根據所使用的主板或所在堆疊架構中其他的板子而
>  有所不同。在這種情況下,你可能需要使用 gpiochip 節點(儘可能地結合電路圖)來
>  確定給定信號所用的 GPIO 編號。
> -
> -
> -從內核代碼中導出
> --------------
> -內核代碼可以明確地管理那些已通過 gpio_request()申請的 GPIO 的導出:
> -
> -	/* 導出 GPIO 到用戶空間 */
> -	int gpio_export(unsigned gpio, bool direction_may_change);
> -
> -	/* gpio_export()的逆操作 */
> -	void gpio_unexport();
> -
> -在一個內核驅動申請一個 GPIO 之後,它可以通過 gpio_export()使其在 sysfs
> -接口中可見。該驅動可以控制信號方向是否可修改。這有助於防止用戶空間代碼無意間
> -破壞重要的系統狀態。
> -
> -這個明確的導出有助於(通過使某些實驗更容易來)調試,也可以提供一個始終存在的接口,
> -與文檔配合作爲板級支持包的一部分。
> diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c
> index 248478af5bfa..ee90fb42c955 100644
> --- a/arch/arm/mach-omap2/pdata-quirks.c
> +++ b/arch/arm/mach-omap2/pdata-quirks.c
> @@ -6,6 +6,7 @@
>   */
>  #include <linux/clk.h>
>  #include <linux/davinci_emac.h>
> +#include <linux/gpio/consumer.h>
>  #include <linux/gpio.h>
>  #include <linux/init.h>
>  #include <linux/kernel.h>
> @@ -108,7 +109,7 @@ static int omap3_sbc_t3730_twl_callback(struct device *dev,
>  	if (res)
>  		return res;
>  
> -	gpio_export(gpio, 0);
> +	gpiod_export(gpio_to_desc(gpio), 0);
>  
>  	return 0;
>  }
> @@ -123,7 +124,7 @@ static void __init omap3_sbc_t3x_usb_hub_init(int gpio, char *hub_name)
>  		return;
>  	}
>  
> -	gpio_export(gpio, 0);
> +	gpiod_export(gpio_to_desc(gpio), 0);
>  
>  	udelay(10);
>  	gpio_set_value(gpio, 1);
> @@ -200,8 +201,8 @@ static void __init omap3_sbc_t3517_wifi_init(void)
>  		return;
>  	}
>  
> -	gpio_export(cm_t3517_wlan_gpios[0].gpio, 0);
> -	gpio_export(cm_t3517_wlan_gpios[1].gpio, 0);
> +	gpiod_export(gpio_to_desc(cm_t3517_wlan_gpios[0].gpio), 0);
> +	gpiod_export(gpio_to_desc(cm_t3517_wlan_gpios[1].gpio), 0);
>  
>  	msleep(100);
>  	gpio_set_value(cm_t3517_wlan_gpios[1].gpio, 0);
> diff --git a/arch/sh/boards/mach-ap325rxa/setup.c b/arch/sh/boards/mach-ap325rxa/setup.c
> index 6e66ac194f7d..48055991152c 100644
> --- a/arch/sh/boards/mach-ap325rxa/setup.c
> +++ b/arch/sh/boards/mach-ap325rxa/setup.c
> @@ -18,6 +18,7 @@
>  #include <linux/delay.h>
>  #include <linux/device.h>
>  #include <linux/gpio.h>
> +#include <linux/gpio/consumer.h>
>  #include <linux/gpio/machine.h>
>  #include <linux/i2c.h>
>  #include <linux/init.h>
> @@ -411,16 +412,16 @@ static int __init ap325rxa_devices_setup(void)
>  	/* LD3 and LD4 LEDs */
>  	gpio_request(GPIO_PTX5, NULL); /* RUN */
>  	gpio_direction_output(GPIO_PTX5, 1);
> -	gpio_export(GPIO_PTX5, 0);
> +	gpiod_export(gpio_to_desc(GPIO_PTX5), 0);
>  
>  	gpio_request(GPIO_PTX4, NULL); /* INDICATOR */
>  	gpio_direction_output(GPIO_PTX4, 0);
> -	gpio_export(GPIO_PTX4, 0);
> +	gpiod_export(gpio_to_desc(GPIO_PTX4), 0);
>  
>  	/* SW1 input */
>  	gpio_request(GPIO_PTF7, NULL); /* MODE */
>  	gpio_direction_input(GPIO_PTF7);
> -	gpio_export(GPIO_PTF7, 0);
> +	gpiod_export(gpio_to_desc(GPIO_PTF7), 0);
>  
>  	/* LCDC */
>  	gpio_request(GPIO_FN_LCDD15, NULL);
> diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c
> index cd27bf173dec..cee135eb768e 100644
> --- a/drivers/gpio/gpiolib-sysfs.c
> +++ b/drivers/gpio/gpiolib-sysfs.c
> @@ -491,7 +491,7 @@ static ssize_t unexport_store(struct class *class,
>  		goto done;
>  
>  	desc = gpio_to_desc(gpio);
> -	/* reject bogus commands (gpio_unexport ignores them) */
> +	/* reject bogus commands (gpiod_unexport ignores them) */

While at it,

	/* reject bogus commands (gpiod_unexport() ignores them) */

>  	if (!desc) {
>  		pr_warn("%s: invalid GPIO %ld\n", __func__, gpio);
>  		return -EINVAL;
> @@ -790,7 +790,7 @@ static int __init gpiolib_sysfs_init(void)
>  	 * early (e.g. before the class_register above was called).
>  	 *
>  	 * We run before arch_initcall() so chip->dev nodes can have
> -	 * registered, and so arch_initcall() can always gpio_export().
> +	 * registered, and so arch_initcall() can always gpiod_export().
>  	 */
>  	spin_lock_irqsave(&gpio_lock, flags);
>  	list_for_each_entry(gdev, &gpio_devices, list) {
> diff --git a/drivers/media/pci/sta2x11/sta2x11_vip.c b/drivers/media/pci/sta2x11/sta2x11_vip.c
> index 8535e49a4c4f..e4cf9d63e926 100644
> --- a/drivers/media/pci/sta2x11/sta2x11_vip.c
> +++ b/drivers/media/pci/sta2x11/sta2x11_vip.c
> @@ -18,6 +18,7 @@
>  #include <linux/pci.h>
>  #include <linux/interrupt.h>
>  #include <linux/io.h>
> +#include <linux/gpio/consumer.h>
>  #include <linux/gpio.h>
>  #include <linux/i2c.h>
>  #include <linux/delay.h>
> @@ -889,6 +890,7 @@ static int sta2x11_vip_init_controls(struct sta2x11_vip *vip)
>  static int vip_gpio_reserve(struct device *dev, int pin, int dir,
>  			    const char *name)
>  {
> +	struct gpio_desc *desc = gpio_to_desc(pin);
>  	int ret = -ENODEV;
>  
>  	if (!gpio_is_valid(pin))
> @@ -900,7 +902,7 @@ static int vip_gpio_reserve(struct device *dev, int pin, int dir,
>  		return ret;
>  	}
>  
> -	ret = gpio_direction_output(pin, dir);
> +	ret = gpiod_direction_output(desc, dir);
>  	if (ret) {
>  		dev_err(dev, "Failed to set direction for pin %d (%s)\n",
>  			pin, name);
> @@ -908,7 +910,7 @@ static int vip_gpio_reserve(struct device *dev, int pin, int dir,
>  		return ret;
>  	}
>  
> -	ret = gpio_export(pin, false);
> +	ret = gpiod_export(desc, false);
>  	if (ret) {
>  		dev_err(dev, "Failed to export pin %d (%s)\n", pin, name);
>  		gpio_free(pin);
> @@ -928,8 +930,10 @@ static int vip_gpio_reserve(struct device *dev, int pin, int dir,
>  static void vip_gpio_release(struct device *dev, int pin, const char *name)
>  {
>  	if (gpio_is_valid(pin)) {
> +		struct gpio_desc *desc = gpio_to_desc(pin);
> +
>  		dev_dbg(dev, "releasing pin %d (%s)\n",	pin, name);
> -		gpio_unexport(pin);
> +		gpiod_unexport(desc);
>  		gpio_free(pin);
>  	}
>  }
> diff --git a/drivers/net/ieee802154/ca8210.c b/drivers/net/ieee802154/ca8210.c
> index e1a569b99e4a..5c0be6a3ec5e 100644
> --- a/drivers/net/ieee802154/ca8210.c
> +++ b/drivers/net/ieee802154/ca8210.c
> @@ -51,6 +51,7 @@
>  #include <linux/clk-provider.h>
>  #include <linux/debugfs.h>
>  #include <linux/delay.h>
> +#include <linux/gpio/consumer.h>
>  #include <linux/gpio.h>
>  #include <linux/ieee802154.h>
>  #include <linux/io.h>
> @@ -2853,7 +2854,7 @@ static int ca8210_interrupt_init(struct spi_device *spi)
>  	);
>  	if (ret) {
>  		dev_crit(&spi->dev, "request_irq %d failed\n", pdata->irq_id);
> -		gpio_unexport(pdata->gpio_irq);
> +		gpiod_unexport(gpio_to_desc(pdata->gpio_irq));
>  		gpio_free(pdata->gpio_irq);
>  	}
>  
> diff --git a/include/linux/gpio.h b/include/linux/gpio.h
> index da7a5ae68e47..57ec3975b656 100644
> --- a/include/linux/gpio.h
> +++ b/include/linux/gpio.h
> @@ -127,20 +127,6 @@ extern int gpio_request_one(unsigned gpio, unsigned long flags, const char *labe
>  extern int gpio_request_array(const struct gpio *array, size_t num);
>  extern void gpio_free_array(const struct gpio *array, size_t num);
>  
> -/*
> - * A sysfs interface can be exported by individual drivers if they want,
> - * but more typically is configured entirely from userspace.
> - */
> -static inline int gpio_export(unsigned gpio, bool direction_may_change)
> -{
> -	return gpiod_export(gpio_to_desc(gpio), direction_may_change);
> -}
> -
> -static inline void gpio_unexport(unsigned gpio)
> -{
> -	gpiod_unexport(gpio_to_desc(gpio));
> -}
> -
>  /* CONFIG_GPIOLIB: bindings for managed devices that want to request gpios */
>  
>  struct device;
> @@ -231,19 +217,6 @@ static inline void gpio_set_value_cansleep(unsigned gpio, int value)
>  	WARN_ON(1);
>  }
>  
> -static inline int gpio_export(unsigned gpio, bool direction_may_change)
> -{
> -	/* GPIO can never have been requested or set as {in,out}put */
> -	WARN_ON(1);
> -	return -EINVAL;
> -}
> -
> -static inline void gpio_unexport(unsigned gpio)
> -{
> -	/* GPIO can never have been exported */
> -	WARN_ON(1);
> -}
> -
>  static inline int gpio_to_irq(unsigned gpio)
>  {
>  	/* GPIO can never have been requested or set as input */
> -- 
> 2.39.0
> 

-- 
With Best Regards,
Andy Shevchenko



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

* Re: [PATCH 6/8] gpiolib: split linux/gpio/driver.h out of linux/gpio.h
  2023-01-26 13:27 ` [PATCH 6/8] gpiolib: split linux/gpio/driver.h out of linux/gpio.h Arnd Bergmann
@ 2023-01-26 14:04   ` Andy Shevchenko
  2023-01-26 14:51     ` Arnd Bergmann
  2023-01-27 13:15   ` Linus Walleij
  1 sibling, 1 reply; 35+ messages in thread
From: Andy Shevchenko @ 2023-01-26 14:04 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linux-gpio, Arnd Bergmann, Bartosz Golaszewski, Christophe Leroy,
	Dmitry Torokhov, Linus Walleij, linux-kernel

On Thu, Jan 26, 2023 at 02:27:59PM +0100, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd@arndb.de>
> 
> Almost all gpio drivers include linux/gpio/driver.h, and other
> files should not rely on includes from this header.
> 
> Remove the indirect include from here and include the correct
> headers directly from where they are used.

Some minor nit-picks below, otherwise
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
>  arch/arm/mach-omap1/irq.c                              | 1 +
>  arch/arm/mach-orion5x/board-rd88f5182.c                | 1 +
>  arch/arm/mach-s3c/s3c64xx.c                            | 1 +
>  arch/arm/mach-sa1100/assabet.c                         | 1 +
>  arch/arm/plat-orion/gpio.c                             | 1 +
>  drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.c | 1 +
>  include/linux/gpio.h                                   | 2 --
>  include/linux/mfd/ucb1x00.h                            | 1 +
>  8 files changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm/mach-omap1/irq.c b/arch/arm/mach-omap1/irq.c
> index 9ccc784fd614..bfc7ab010ae2 100644
> --- a/arch/arm/mach-omap1/irq.c
> +++ b/arch/arm/mach-omap1/irq.c
> @@ -41,6 +41,7 @@
>  #include <linux/sched.h>
>  #include <linux/interrupt.h>
>  #include <linux/io.h>
> +#include <linux/irqdomain.h>
>  
>  #include <asm/irq.h>
>  #include <asm/exception.h>
> diff --git a/arch/arm/mach-orion5x/board-rd88f5182.c b/arch/arm/mach-orion5x/board-rd88f5182.c
> index 596601367989..1c14e49a90a6 100644
> --- a/arch/arm/mach-orion5x/board-rd88f5182.c
> +++ b/arch/arm/mach-orion5x/board-rd88f5182.c
> @@ -9,6 +9,7 @@
>  #include <linux/gpio.h>
>  #include <linux/kernel.h>
>  #include <linux/init.h>
> +#include <linux/of.h>
>  #include <linux/platform_device.h>
>  #include <linux/pci.h>
>  #include <linux/irq.h>
> diff --git a/arch/arm/mach-s3c/s3c64xx.c b/arch/arm/mach-s3c/s3c64xx.c
> index c20163e6a8b4..c5aa4d8ed8bd 100644
> --- a/arch/arm/mach-s3c/s3c64xx.c
> +++ b/arch/arm/mach-s3c/s3c64xx.c
> @@ -24,6 +24,7 @@
>  #include <linux/platform_device.h>
>  #include <linux/reboot.h>
>  #include <linux/io.h>

> +#include <linux/of.h>

Taking the limited context into account, I think this makes more sense to be
placed before platform_device.h as to keep longer _sorted_ chain.

>  #include <linux/clk/samsung.h>
>  #include <linux/dma-mapping.h>
>  #include <linux/irq.h>
> diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c
> index 04f8a1680bc1..06e7b1358226 100644
> --- a/arch/arm/mach-sa1100/assabet.c
> +++ b/arch/arm/mach-sa1100/assabet.c
> @@ -12,6 +12,7 @@
>  #include <linux/errno.h>
>  #include <linux/gpio/gpio-reg.h>
>  #include <linux/gpio/machine.h>
> +#include <linux/gpio/driver.h>

Similar. Keep it more sorted.

>  #include <linux/gpio_keys.h>
>  #include <linux/ioport.h>
>  #include <linux/platform_data/sa11x0-serial.h>
> diff --git a/arch/arm/plat-orion/gpio.c b/arch/arm/plat-orion/gpio.c
> index 3ef9ecdd6343..4946d8066f6a 100644
> --- a/arch/arm/plat-orion/gpio.c
> +++ b/arch/arm/plat-orion/gpio.c
> @@ -19,6 +19,7 @@
>  #include <linux/bitops.h>
>  #include <linux/io.h>
>  #include <linux/gpio.h>
> +#include <linux/gpio/driver.h>
>  #include <linux/leds.h>
>  #include <linux/of.h>
>  #include <linux/of_irq.h>
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.c
> index 9540a05247c2..89c8829528c2 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.c
> @@ -1,6 +1,7 @@
>  // SPDX-License-Identifier: GPL-2.0
>  #include <net/mac80211.h>
>  #include <linux/bcma/bcma_driver_chipcommon.h>
> +#include <linux/gpio.h>
>  #include <linux/gpio/driver.h>
>  #include <linux/gpio/machine.h>
>  #include <linux/gpio/consumer.h>
> diff --git a/include/linux/gpio.h b/include/linux/gpio.h
> index 57ec3975b656..06a33339994e 100644
> --- a/include/linux/gpio.h
> +++ b/include/linux/gpio.h
> @@ -54,8 +54,6 @@ struct gpio {
>  };
>  
>  #ifdef CONFIG_GPIOLIB
> -#include <linux/compiler.h>
> -#include <linux/gpio/driver.h>
>  #include <linux/gpio/consumer.h>
>  
>  /*
> diff --git a/include/linux/mfd/ucb1x00.h b/include/linux/mfd/ucb1x00.h
> index 9aed2797d3d5..2e65354fc7b8 100644
> --- a/include/linux/mfd/ucb1x00.h
> +++ b/include/linux/mfd/ucb1x00.h
> @@ -9,6 +9,7 @@
>  
>  #include <linux/device.h>
>  #include <linux/mfd/mcp.h>

> +#include <linux/gpio/driver.h>
>  #include <linux/gpio.h>

Here is the opposite ordering to the above similar cases. Swap?

>  #include <linux/mutex.h>
>  
> -- 
> 2.39.0
> 

-- 
With Best Regards,
Andy Shevchenko



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

* Re: [PATCH 7/8] gpiolib: split of_mm_gpio_chip out of linux/of_gpio.h
  2023-01-26 13:28 ` [PATCH 7/8] gpiolib: split of_mm_gpio_chip out of linux/of_gpio.h Arnd Bergmann
@ 2023-01-26 14:08   ` Andy Shevchenko
  2023-01-26 14:54     ` Arnd Bergmann
  2023-01-27 13:17   ` Linus Walleij
  1 sibling, 1 reply; 35+ messages in thread
From: Andy Shevchenko @ 2023-01-26 14:08 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linux-gpio, Arnd Bergmann, Bartosz Golaszewski, Christophe Leroy,
	Dmitry Torokhov, Linus Walleij, linux-kernel

On Thu, Jan 26, 2023 at 02:28:00PM +0100, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd@arndb.de>
> 
> This is a rarely used feature that has nothing to do with the
> client-side of_gpio.h.
> 
> Split it out with a separate header file and Kconfig option
> so it can be removed on its own timeline aside from removing
> the of_gpio consumer interfaces.

One nit-pick below, otherwise
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
>  arch/powerpc/platforms/44x/Kconfig         |  1 +
>  arch/powerpc/platforms/4xx/gpio.c          |  2 +-
>  arch/powerpc/platforms/8xx/Kconfig         |  1 +
>  arch/powerpc/platforms/8xx/cpm1.c          |  2 +-
>  arch/powerpc/platforms/Kconfig             |  2 ++
>  arch/powerpc/sysdev/cpm_common.c           |  2 +-
>  drivers/gpio/Kconfig                       | 11 +++++++
>  drivers/gpio/TODO                          | 15 ++++++---
>  drivers/gpio/gpio-altera.c                 |  2 +-
>  drivers/gpio/gpio-mm-lantiq.c              |  2 +-
>  drivers/gpio/gpio-mpc5200.c                |  2 +-
>  drivers/gpio/gpiolib-of.c                  |  3 ++
>  drivers/soc/fsl/qe/gpio.c                  |  2 +-
>  include/linux/gpio/legacy-of-mm-gpiochip.h | 36 ++++++++++++++++++++++
>  include/linux/of_gpio.h                    | 21 -------------
>  15 files changed, 71 insertions(+), 33 deletions(-)
>  create mode 100644 include/linux/gpio/legacy-of-mm-gpiochip.h
> 
> diff --git a/arch/powerpc/platforms/44x/Kconfig b/arch/powerpc/platforms/44x/Kconfig
> index 25b80cd558f8..1624ebf95497 100644
> --- a/arch/powerpc/platforms/44x/Kconfig
> +++ b/arch/powerpc/platforms/44x/Kconfig
> @@ -230,6 +230,7 @@ config PPC4xx_GPIO
>  	bool "PPC4xx GPIO support"
>  	depends on 44x
>  	select GPIOLIB
> +	select OF_GPIO_MM_GPIOCHIP
>  	help
>  	  Enable gpiolib support for ppc440 based boards
>  
> diff --git a/arch/powerpc/platforms/4xx/gpio.c b/arch/powerpc/platforms/4xx/gpio.c
> index 49ee8d365852..e5f2319e5cbe 100644
> --- a/arch/powerpc/platforms/4xx/gpio.c
> +++ b/arch/powerpc/platforms/4xx/gpio.c
> @@ -14,7 +14,7 @@
>  #include <linux/spinlock.h>
>  #include <linux/io.h>
>  #include <linux/of.h>
> -#include <linux/of_gpio.h>
> +#include <linux/gpio/legacy-of-mm-gpiochip.h>
>  #include <linux/gpio/driver.h>
>  #include <linux/types.h>
>  #include <linux/slab.h>
> diff --git a/arch/powerpc/platforms/8xx/Kconfig b/arch/powerpc/platforms/8xx/Kconfig
> index 60cc5b537a98..a14d9d8997a4 100644
> --- a/arch/powerpc/platforms/8xx/Kconfig
> +++ b/arch/powerpc/platforms/8xx/Kconfig
> @@ -101,6 +101,7 @@ comment "Generic MPC8xx Options"
>  config 8xx_GPIO
>  	bool "GPIO API Support"
>  	select GPIOLIB
> +	select OF_GPIO_MM_GPIOCHIP
>  	help
>  	  Saying Y here will cause the ports on an MPC8xx processor to be used
>  	  with the GPIO API.  If you say N here, the kernel needs less memory.
> diff --git a/arch/powerpc/platforms/8xx/cpm1.c b/arch/powerpc/platforms/8xx/cpm1.c
> index bb38c8d8f8de..56ca14f77543 100644
> --- a/arch/powerpc/platforms/8xx/cpm1.c
> +++ b/arch/powerpc/platforms/8xx/cpm1.c
> @@ -44,7 +44,7 @@
>  #include <asm/fs_pd.h>
>  
>  #ifdef CONFIG_8xx_GPIO
> -#include <linux/of_gpio.h>
> +#include <linux/gpio/legacy-of-mm-gpiochip.h>
>  #endif
>  
>  #define CPM_MAP_SIZE    (0x4000)
> diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig
> index d41dad227de8..8e4bbd19dec5 100644
> --- a/arch/powerpc/platforms/Kconfig
> +++ b/arch/powerpc/platforms/Kconfig
> @@ -244,6 +244,7 @@ config QE_GPIO
>  	bool "QE GPIO support"
>  	depends on QUICC_ENGINE
>  	select GPIOLIB
> +	select OF_GPIO_MM_GPIOCHIP
>  	help
>  	  Say Y here if you're going to use hardware that connects to the
>  	  QE GPIOs.
> @@ -254,6 +255,7 @@ config CPM2
>  	select CPM
>  	select HAVE_PCI
>  	select GPIOLIB
> +	select OF_GPIO_MM_GPIOCHIP
>  	help
>  	  The CPM2 (Communications Processor Module) is a coprocessor on
>  	  embedded CPUs made by Freescale.  Selecting this option means that
> diff --git a/arch/powerpc/sysdev/cpm_common.c b/arch/powerpc/sysdev/cpm_common.c
> index 7dc1960f8bdb..8234013a8772 100644
> --- a/arch/powerpc/sysdev/cpm_common.c
> +++ b/arch/powerpc/sysdev/cpm_common.c
> @@ -31,7 +31,7 @@
>  #include <mm/mmu_decl.h>
>  
>  #if defined(CONFIG_CPM2) || defined(CONFIG_8xx_GPIO)
> -#include <linux/of_gpio.h>
> +#include <linux/gpio/legacy-of-mm-gpiochip.h>
>  #endif
>  
>  static int __init cpm_init(void)
> diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
> index 06a268d56800..7534a2115d18 100644
> --- a/drivers/gpio/Kconfig
> +++ b/drivers/gpio/Kconfig
> @@ -39,6 +39,14 @@ config GPIOLIB_IRQCHIP
>  	select IRQ_DOMAIN
>  	bool
>  
> +config OF_GPIO_MM_GPIOCHIP
> +	bool
> +	help
> +	  This adds support for the legacy 'struct of_mm_gpio_chip' interface
> +	  from PowerPC. Existing drivers using this interface need to select
> +	  this symbol, but new drivers should use the generic gpio-mmio

gpio-regmap

I would even not mention gpio-mmio.

> +	  infrastructure instead.
> +
>  config DEBUG_GPIO
>  	bool "Debug GPIO calls"
>  	depends on DEBUG_KERNEL
> @@ -131,6 +139,7 @@ config GPIO_ALTERA
>  	tristate "Altera GPIO"
>  	depends on OF_GPIO
>  	select GPIOLIB_IRQCHIP
> +	select OF_GPIO_MM_GPIOCHIP
>  	help
>  	  Say Y or M here to build support for the Altera PIO device.
>  
> @@ -403,6 +412,7 @@ config GPIO_MENZ127
>  config GPIO_MM_LANTIQ
>  	bool "Lantiq Memory mapped GPIOs"
>  	depends on LANTIQ && SOC_XWAY
> +	select OF_GPIO_MM_GPIOCHIP
>  	help
>  	  This enables support for memory mapped GPIOs on the External Bus Unit
>  	  (EBU) found on Lantiq SoCs. The GPIOs are output only as they are
> @@ -411,6 +421,7 @@ config GPIO_MM_LANTIQ
>  config GPIO_MPC5200
>  	def_bool y
>  	depends on PPC_MPC52xx
> +	select OF_GPIO_MM_GPIOCHIP
>  
>  config GPIO_MPC8XXX
>  	bool "MPC512x/MPC8xxx/QorIQ GPIO support"
> diff --git a/drivers/gpio/TODO b/drivers/gpio/TODO
> index 68ada1066941..189c3abe7e79 100644
> --- a/drivers/gpio/TODO
> +++ b/drivers/gpio/TODO
> @@ -59,11 +59,6 @@ the device tree back-end. It is legacy and should not be used in new code.
>  
>  Work items:
>  
> -- Get rid of struct of_mm_gpio_chip altogether: use the generic  MMIO
> -  GPIO for all current users (see below). Delete struct of_mm_gpio_chip,
> -  to_of_mm_gpio_chip(), of_mm_gpiochip_add_data(), of_mm_gpiochip_remove()
> -  from the kernel.
> -
>  - Change all consumer drivers that #include <linux/of_gpio.h> to
>    #include <linux/gpio/consumer.h> and stop doing custom parsing of the
>    GPIO lines from the device tree. This can be tricky and often ivolves
> @@ -81,6 +76,16 @@ Work items:
>    uses <linux/gpio/consumer.h> or <linux/gpio/driver.h> instead.
>  
>  
> +Get rid of <linux/gpio/legacy-of-mm-gpiochip.h>
> +
> +Work items:
> +
> +- Get rid of struct of_mm_gpio_chip altogether: use the generic  MMIO
> +  GPIO for all current users (see below). Delete struct of_mm_gpio_chip,
> +  to_of_mm_gpio_chip(), of_mm_gpiochip_add_data(), of_mm_gpiochip_remove(),
> +  CONFIG_OF_GPIO_MM_GPIOCHIP from the kernel.
> +
> +
>  Get rid of <linux/gpio.h>
>  
>  This legacy header is a one stop shop for anything GPIO is closely tied
> diff --git a/drivers/gpio/gpio-altera.c b/drivers/gpio/gpio-altera.c
> index b59fae993626..99e137f8097e 100644
> --- a/drivers/gpio/gpio-altera.c
> +++ b/drivers/gpio/gpio-altera.c
> @@ -7,7 +7,7 @@
>  #include <linux/io.h>
>  #include <linux/module.h>
>  #include <linux/gpio/driver.h>
> -#include <linux/of_gpio.h> /* For of_mm_gpio_chip */
> +#include <linux/gpio/legacy-of-mm-gpiochip.h>
>  #include <linux/platform_device.h>
>  
>  #define ALTERA_GPIO_MAX_NGPIO		32
> diff --git a/drivers/gpio/gpio-mm-lantiq.c b/drivers/gpio/gpio-mm-lantiq.c
> index 538e31fe8903..27ff84c5d162 100644
> --- a/drivers/gpio/gpio-mm-lantiq.c
> +++ b/drivers/gpio/gpio-mm-lantiq.c
> @@ -10,8 +10,8 @@
>  #include <linux/platform_device.h>
>  #include <linux/mutex.h>
>  #include <linux/gpio/driver.h>
> +#include <linux/gpio/legacy-of-mm-gpiochip.h.h>
>  #include <linux/of.h>
> -#include <linux/of_gpio.h>
>  #include <linux/io.h>
>  #include <linux/slab.h>
>  
> diff --git a/drivers/gpio/gpio-mpc5200.c b/drivers/gpio/gpio-mpc5200.c
> index 000494e0c533..3b0bfff8c778 100644
> --- a/drivers/gpio/gpio-mpc5200.c
> +++ b/drivers/gpio/gpio-mpc5200.c
> @@ -8,7 +8,7 @@
>  #include <linux/of.h>
>  #include <linux/kernel.h>
>  #include <linux/slab.h>
> -#include <linux/of_gpio.h>
> +#include <linux/gpio/legacy-of-mm-gpiochip.h>
>  #include <linux/io.h>
>  #include <linux/of_platform.h>
>  #include <linux/module.h>
> diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
> index edc769d2d338..6a08569a20c1 100644
> --- a/drivers/gpio/gpiolib-of.c
> +++ b/drivers/gpio/gpiolib-of.c
> @@ -877,6 +877,8 @@ static int of_gpio_simple_xlate(struct gpio_chip *gc,
>  	return gpiospec->args[0];
>  }
>  
> +#if IS_ENABLED(CONFIG_OF_GPIO_MM_GPIOCHIP)
> +#include <linux/gpio/legacy-of-mm-gpiochip.h>
>  /**
>   * of_mm_gpiochip_add_data - Add memory mapped GPIO chip (bank)
>   * @np:		device node of the GPIO chip
> @@ -949,6 +951,7 @@ void of_mm_gpiochip_remove(struct of_mm_gpio_chip *mm_gc)
>  	kfree(gc->label);
>  }
>  EXPORT_SYMBOL_GPL(of_mm_gpiochip_remove);
> +#endif
>  
>  #ifdef CONFIG_PINCTRL
>  static int of_gpiochip_add_pin_range(struct gpio_chip *chip)
> diff --git a/drivers/soc/fsl/qe/gpio.c b/drivers/soc/fsl/qe/gpio.c
> index 1c41eb49d5a7..3ef24ba0245b 100644
> --- a/drivers/soc/fsl/qe/gpio.c
> +++ b/drivers/soc/fsl/qe/gpio.c
> @@ -13,7 +13,7 @@
>  #include <linux/err.h>
>  #include <linux/io.h>
>  #include <linux/of.h>
> -#include <linux/of_gpio.h>	/* for of_mm_gpio_chip */
> +#include <linux/gpio/legacy-of-mm-gpiochip.h>
>  #include <linux/gpio/consumer.h>
>  #include <linux/gpio/driver.h>
>  #include <linux/slab.h>
> diff --git a/include/linux/gpio/legacy-of-mm-gpiochip.h b/include/linux/gpio/legacy-of-mm-gpiochip.h
> new file mode 100644
> index 000000000000..2e2bd3b19cc3
> --- /dev/null
> +++ b/include/linux/gpio/legacy-of-mm-gpiochip.h
> @@ -0,0 +1,36 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * OF helpers for the old of_mm_gpio_chip, used on ppc32 and nios2,
> + * do not use in new code.
> + *
> + * Copyright (c) 2007-2008  MontaVista Software, Inc.
> + *
> + * Author: Anton Vorontsov <avorontsov@ru.mvista.com>
> + */
> +
> +#ifndef __LINUX_GPIO_LEGACY_OF_MM_GPIO_CHIP_H
> +#define __LINUX_GPIO_LEGACY_OF_MM_GPIO_CHIP_H
> +
> +#include <linux/gpio/driver.h>
> +#include <linux/of.h>
> +
> +/*
> + * OF GPIO chip for memory mapped banks
> + */
> +struct of_mm_gpio_chip {
> +	struct gpio_chip gc;
> +	void (*save_regs)(struct of_mm_gpio_chip *mm_gc);
> +	void __iomem *regs;
> +};
> +
> +static inline struct of_mm_gpio_chip *to_of_mm_gpio_chip(struct gpio_chip *gc)
> +{
> +	return container_of(gc, struct of_mm_gpio_chip, gc);
> +}
> +
> +extern int of_mm_gpiochip_add_data(struct device_node *np,
> +				   struct of_mm_gpio_chip *mm_gc,
> +				   void *data);
> +extern void of_mm_gpiochip_remove(struct of_mm_gpio_chip *mm_gc);
> +
> +#endif /* __LINUX_GPIO_LEGACY_OF_MM_GPIO_CHIP_H */
> diff --git a/include/linux/of_gpio.h b/include/linux/of_gpio.h
> index 935225caf70d..04e1f76acdd7 100644
> --- a/include/linux/of_gpio.h
> +++ b/include/linux/of_gpio.h
> @@ -34,30 +34,9 @@ enum of_gpio_flags {
>  
>  #ifdef CONFIG_OF_GPIO
>  
> -#include <linux/container_of.h>
> -
> -/*
> - * OF GPIO chip for memory mapped banks
> - */
> -struct of_mm_gpio_chip {
> -	struct gpio_chip gc;
> -	void (*save_regs)(struct of_mm_gpio_chip *mm_gc);
> -	void __iomem *regs;
> -};
> -
> -static inline struct of_mm_gpio_chip *to_of_mm_gpio_chip(struct gpio_chip *gc)
> -{
> -	return container_of(gc, struct of_mm_gpio_chip, gc);
> -}
> -
>  extern int of_get_named_gpio(const struct device_node *np,
>  			     const char *list_name, int index);
>  
> -extern int of_mm_gpiochip_add_data(struct device_node *np,
> -				   struct of_mm_gpio_chip *mm_gc,
> -				   void *data);
> -extern void of_mm_gpiochip_remove(struct of_mm_gpio_chip *mm_gc);
> -
>  #else /* CONFIG_OF_GPIO */
>  
>  #include <linux/errno.h>
> -- 
> 2.39.0
> 

-- 
With Best Regards,
Andy Shevchenko



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

* Re: [PATCH 8/8] gpiolib: move of_gpio_flags into gpiolib-of.c
  2023-01-26 13:28 ` [PATCH 8/8] gpiolib: move of_gpio_flags into gpiolib-of.c Arnd Bergmann
@ 2023-01-26 14:09   ` Andy Shevchenko
  2023-01-26 14:47     ` Arnd Bergmann
  0 siblings, 1 reply; 35+ messages in thread
From: Andy Shevchenko @ 2023-01-26 14:09 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linux-gpio, Arnd Bergmann, Bartosz Golaszewski, Christophe Leroy,
	Dmitry Torokhov, Linus Walleij, linux-kernel

On Thu, Jan 26, 2023 at 02:28:01PM +0100, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd@arndb.de>
> 
> There is no need for this in the header any more, it's just
> an implementation detail now.

I have published
https://lore.kernel.org/r/20230112145140.67573-1-andriy.shevchenko@linux.intel.com
Can it be used?

-- 
With Best Regards,
Andy Shevchenko



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

* Re: [PATCH 8/8] gpiolib: move of_gpio_flags into gpiolib-of.c
  2023-01-26 14:09   ` Andy Shevchenko
@ 2023-01-26 14:47     ` Arnd Bergmann
  2023-01-27  8:53       ` Andy Shevchenko
  0 siblings, 1 reply; 35+ messages in thread
From: Arnd Bergmann @ 2023-01-26 14:47 UTC (permalink / raw)
  To: Andy Shevchenko, Arnd Bergmann
  Cc: open list:GPIO SUBSYSTEM, Bartosz Golaszewski, Christophe Leroy,
	Dmitry Torokhov, Linus Walleij, linux-kernel

On Thu, Jan 26, 2023, at 15:09, Andy Shevchenko wrote:
> On Thu, Jan 26, 2023 at 02:28:01PM +0100, Arnd Bergmann wrote:
>> From: Arnd Bergmann <arnd@arndb.de>
>> 
>> There is no need for this in the header any more, it's just
>> an implementation detail now.
>
> I have published
> https://lore.kernel.org/r/20230112145140.67573-1-andriy.shevchenko@linux.intel.com
> Can it be used?

Sure, I added a Reviewed-by: on that now. Your patch will conflict
with my patch 7/8, but we can work that out.

      Arnd

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

* Re: [PATCH 6/8] gpiolib: split linux/gpio/driver.h out of linux/gpio.h
  2023-01-26 14:04   ` Andy Shevchenko
@ 2023-01-26 14:51     ` Arnd Bergmann
  0 siblings, 0 replies; 35+ messages in thread
From: Arnd Bergmann @ 2023-01-26 14:51 UTC (permalink / raw)
  To: Andy Shevchenko, Arnd Bergmann
  Cc: open list:GPIO SUBSYSTEM, Bartosz Golaszewski, Christophe Leroy,
	Dmitry Torokhov, Linus Walleij, linux-kernel

On Thu, Jan 26, 2023, at 15:04, Andy Shevchenko wrote:
> On Thu, Jan 26, 2023 at 02:27:59PM +0100, Arnd Bergmann wrote:
>> From: Arnd Bergmann <arnd@arndb.de>
>> 
>> Almost all gpio drivers include linux/gpio/driver.h, and other
>> files should not rely on includes from this header.
>> 
>> Remove the indirect include from here and include the correct
>> headers directly from where they are used.
>
> Some minor nit-picks below, otherwise
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
>
>> +#include <linux/of.h>
>
> Taking the limited context into account, I think this makes more sense to be
> placed before platform_device.h as to keep longer _sorted_ chain.
>
>>  #include <linux/gpio/gpio-reg.h>
>>  #include <linux/gpio/machine.h>
>> +#include <linux/gpio/driver.h>
>
> Similar. Keep it more sorted.
>

>> +#include <linux/gpio/driver.h>
>>  #include <linux/gpio.h>
>
> Here is the opposite ordering to the above similar cases. Swap?

Changed all as suggested, thanks!

     Arnd

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

* Re: [PATCH 7/8] gpiolib: split of_mm_gpio_chip out of linux/of_gpio.h
  2023-01-26 14:08   ` Andy Shevchenko
@ 2023-01-26 14:54     ` Arnd Bergmann
  0 siblings, 0 replies; 35+ messages in thread
From: Arnd Bergmann @ 2023-01-26 14:54 UTC (permalink / raw)
  To: Andy Shevchenko, Arnd Bergmann
  Cc: open list:GPIO SUBSYSTEM, Bartosz Golaszewski, Christophe Leroy,
	Dmitry Torokhov, Linus Walleij, linux-kernel

On Thu, Jan 26, 2023, at 15:08, Andy Shevchenko wrote:
> On Thu, Jan 26, 2023 at 02:28:00PM +0100, Arnd Bergmann wrote:
>> From: Arnd Bergmann <arnd@arndb.de>
>> 
>> This is a rarely used feature that has nothing to do with the
>> client-side of_gpio.h.
>> 
>> Split it out with a separate header file and Kconfig option
>> so it can be removed on its own timeline aside from removing
>> the of_gpio consumer interfaces.
>
> One nit-pick below, otherwise
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
>

>>  
>> +config OF_GPIO_MM_GPIOCHIP
>> +	bool
>> +	help
>> +	  This adds support for the legacy 'struct of_mm_gpio_chip' interface
>> +	  from PowerPC. Existing drivers using this interface need to select
>> +	  this symbol, but new drivers should use the generic gpio-mmio
>
> gpio-regmap
>
> I would even not mention gpio-mmio.

Makes sense, thanks!

    Arnd

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

* Re: [PATCH 4/8] gpiolib: remove gpio_set_debounce
  2023-01-26 13:50   ` Andy Shevchenko
@ 2023-01-26 15:30     ` Arnd Bergmann
  0 siblings, 0 replies; 35+ messages in thread
From: Arnd Bergmann @ 2023-01-26 15:30 UTC (permalink / raw)
  To: Andy Shevchenko, Arnd Bergmann
  Cc: open list:GPIO SUBSYSTEM, Bartosz Golaszewski, Christophe Leroy,
	Dmitry Torokhov, Linus Walleij, linux-kernel

On Thu, Jan 26, 2023, at 14:50, Andy Shevchenko wrote:
> On Thu, Jan 26, 2023 at 02:27:57PM +0100, Arnd Bergmann wrote:
>> From: Arnd Bergmann <arnd@arndb.de>
>> 
>> gpio_set_debounce() only has a single user, which is trivially
>> converted to gpiod_set_debounce().
>
> Also need to mention the gpio_cansleep() removal.

Indeed, I think that bit got lost in one of the rebases
after some of the other functions that I originally
removed here are already gone.

I've dropped the gpio_cansleep change for now, we can
revisit this later and possibly drop it at the same
time as gpio_{get,set}_value_cansleep that are still
used in a handful of places that could use gpiod
instead.

> P.S. Fun fact that I was yesterday thinking about the pretty much
> the same change, except intrusive conversion of the user.
>
> ...
>
>>  Documentation/driver-api/gpio/legacy.rst |  2 --
>
> Documentation/translations/zh_CN/driver-api/gpio/legacy.rst:222:        
>         gpio_set_debounce()
> Documentation/translations/zh_TW/gpio.txt:229:  gpio_set_debounce()

Fixed.

>>  drivers/input/touchscreen/ads7846.c      | 24 +++++++++++++-----------
>>  include/linux/gpio.h                     | 22 ----------------------
>
> ...
>
>>  #include <linux/of_gpio.h>
>
> Do we need this?

Dropped now.

>>  #include <linux/of_device.h>
>> +#include <linux/gpio/consumer.h>
>
>>  #include <linux/gpio.h>
>
> And this?

I think we still need both linux/gpio/consumer.h and linux/gpio.h
since there is still a call to devm_gpio_request_one() and
gpio_is_valid().

    Arnd

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

* Re: [PATCH 3/8] gpiolib: remove asm-generic/gpio.h
  2023-01-26 13:46   ` Andy Shevchenko
@ 2023-01-26 15:43     ` Arnd Bergmann
  0 siblings, 0 replies; 35+ messages in thread
From: Arnd Bergmann @ 2023-01-26 15:43 UTC (permalink / raw)
  To: Andy Shevchenko, Arnd Bergmann
  Cc: open list:GPIO SUBSYSTEM, Bartosz Golaszewski, Christophe Leroy,
	Dmitry Torokhov, Linus Walleij, linux-kernel

On Thu, Jan 26, 2023, at 14:46, Andy Shevchenko wrote:
> On Thu, Jan 26, 2023 at 02:27:56PM +0100, Arnd Bergmann wrote:

>> --- a/drivers/gpio/gpio-davinci.c
>> +++ b/drivers/gpio/gpio-davinci.c
>> @@ -7,6 +7,7 @@
>>   */
>
>>  #include <linux/gpio/driver.h>
>
>
>> +#include <linux/gpio.h>
>
> I believe the driver does not need this.
>
> I have briefly checked all gpio_ places in it and found nothing that requires
> this inclusion to be done.

ok
  
>>  #ifdef CONFIG_GPIOLIB
>>  #include "../gpio/gpiolib.h"
>> -#include <asm-generic/gpio.h>
>> +#include <linux/gpio.h>
>
> Can we actually swap them?
>
> #include <linux/gpio.h>
> #include "../gpio/gpiolib.h"
>
> But hold on, why do we even need gpio.h here?!
>
>>  #endif
>>  
>>  #include "core.h"
>
> ...

I probably did all the above in response to build regressions,
but I'll try to change them based on your suggestion and see
what happens.

>> --- a/include/linux/gpio.h
>> +++ b/include/linux/gpio.h
>> @@ -54,26 +54,101 @@ struct gpio {
>>  };
>>  
>>  #ifdef CONFIG_GPIOLIB
>> -#include <asm-generic/gpio.h>
>> +#include <linux/compiler.h>
>
>> +#include <linux/gpio/driver.h>
>> +#include <linux/gpio/consumer.h>
>
> #include <linux/gpio/consumer.h>
> #include <linux/gpio/driver.h>
>

Done

>> +/*
>> + * "valid" GPIO numbers are nonnegative and may be passed to
>> + * setup routines like gpio_request().  only some valid numbers
>
> While at it, '.  only' --> '. Only'.

Done

>> + * can successfully be requested and used.
>> + *
>> + * Invalid GPIO numbers are useful for indicating no-such-GPIO in
>> + * platform data and other tables.
>> + */
>
> ...
>
>> +extern int gpio_request(unsigned gpio, const char *label);
>> +extern void gpio_free(unsigned gpio);
>
> While at it, s/extern//.

>> +extern int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
>> +extern int gpio_request_array(const struct gpio *array, size_t num);
>> +extern void gpio_free_array(const struct gpio *array, size_t num);

Done

Thanks for the review,

       Arnd

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

* Re: [PATCH 5/8] gpiolib: remove legacy gpio_export
  2023-01-26 14:00   ` Andy Shevchenko
@ 2023-01-26 16:02     ` Arnd Bergmann
  0 siblings, 0 replies; 35+ messages in thread
From: Arnd Bergmann @ 2023-01-26 16:02 UTC (permalink / raw)
  To: Andy Shevchenko, Arnd Bergmann
  Cc: open list:GPIO SUBSYSTEM, Bartosz Golaszewski, Christophe Leroy,
	Dmitry Torokhov, Linus Walleij, linux-kernel

On Thu, Jan 26, 2023, at 15:00, Andy Shevchenko wrote:
> On Thu, Jan 26, 2023 at 02:27:58PM +0100, Arnd Bergmann wrote:
>> From: Arnd Bergmann <arnd@arndb.de>
>> 
>> There are only a handful of users of gpio_export() and
>> related functions.
>> 
>> As these are just wrappers around the modern gpiod_export()
>> helper, remove the wrappers and open-code the gpio_to_desc
>> in all callers to shrink the legacy API.
>
>
> A couple of comments below, after addressing:
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
>

Thanks!

>
>> -API参考
>
> Mistakenly removed?

Fixed now.

>>  
>>  	desc = gpio_to_desc(gpio);
>> -	/* reject bogus commands (gpio_unexport ignores them) */
>> +	/* reject bogus commands (gpiod_unexport ignores them) */
>
> While at it,
>
> 	/* reject bogus commands (gpiod_unexport() ignores them) */

Done,

    Arnd

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

* Re: [PATCH 8/8] gpiolib: move of_gpio_flags into gpiolib-of.c
  2023-01-26 14:47     ` Arnd Bergmann
@ 2023-01-27  8:53       ` Andy Shevchenko
  2023-01-27  9:43         ` Bartosz Golaszewski
  0 siblings, 1 reply; 35+ messages in thread
From: Andy Shevchenko @ 2023-01-27  8:53 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Arnd Bergmann, open list:GPIO SUBSYSTEM, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, Linus Walleij, linux-kernel

On Thu, Jan 26, 2023 at 03:47:42PM +0100, Arnd Bergmann wrote:
> On Thu, Jan 26, 2023, at 15:09, Andy Shevchenko wrote:
> > On Thu, Jan 26, 2023 at 02:28:01PM +0100, Arnd Bergmann wrote:
> >> From: Arnd Bergmann <arnd@arndb.de>
> >> 
> >> There is no need for this in the header any more, it's just
> >> an implementation detail now.
> >
> > I have published
> > https://lore.kernel.org/r/20230112145140.67573-1-andriy.shevchenko@linux.intel.com
> > Can it be used?
> 
> Sure, I added a Reviewed-by: on that now. Your patch will conflict
> with my patch 7/8, but we can work that out.

Either Bart takes it independently or you may attach it into your series.
Bart?

-- 
With Best Regards,
Andy Shevchenko



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

* Re: [PATCH 1/8] gpiolib: remove empty asm/gpio.h files
  2023-01-26 13:27 ` [PATCH 1/8] gpiolib: remove empty asm/gpio.h files Arnd Bergmann
@ 2023-01-27  9:41   ` Bartosz Golaszewski
  2023-01-27 13:04   ` Linus Walleij
  1 sibling, 0 replies; 35+ messages in thread
From: Bartosz Golaszewski @ 2023-01-27  9:41 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linux-gpio, Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, Linus Walleij, linux-kernel,
	Geert Uytterhoeven

On Thu, Jan 26, 2023 at 2:28 PM Arnd Bergmann <arnd@kernel.org> wrote:
>
> From: Arnd Bergmann <arnd@arndb.de>
>
> The arm and sh versions of this file are identical to the generic
> versions and can just be removed.
>
> The drivers that actually use the sh3 specific version also include
> cpu/gpio.h directly, with the exception of magicpanelr2, which is
> easily fixed. This leaves coldfire as the only gpio driver
> that needs something custom for gpiolib.
>
> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---

Acked-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>

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

* Re: [PATCH 2/8] gpiolib: coldfire: remove custom asm/gpio.h
  2023-01-26 13:27 ` [PATCH 2/8] gpiolib: coldfire: remove custom asm/gpio.h Arnd Bergmann
@ 2023-01-27  9:41   ` Bartosz Golaszewski
  2023-01-27 13:05   ` Linus Walleij
  1 sibling, 0 replies; 35+ messages in thread
From: Bartosz Golaszewski @ 2023-01-27  9:41 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linux-gpio, Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, Linus Walleij, linux-kernel,
	Geert Uytterhoeven

On Thu, Jan 26, 2023 at 2:28 PM Arnd Bergmann <arnd@kernel.org> wrote:
>
> From: Arnd Bergmann <arnd@arndb.de>
>
> Now that coldfire is the only user of a custom asm/gpio.h, it seems
> better to remove this as well, and have the same interface everywhere.
>
> For the gpio_get_value()/gpio_set_value()/gpio_to_irq(), gpio_cansleep()
> functions, the custom version is only a micro-optimization to inline the
> function for constant GPIO numbers. However, in the coldfire defconfigs,
> I was unable to find a single instance where this micro-optimization
> was even used, and according to Geert the only user appears to be the
> QSPI chip that is disabled everywhere.
>
> The custom gpio_request_one() function is even less useful, as it is
> guarded by an #ifdef that is never true.
>
> Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---

Acked-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>

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

* Re: [PATCH 8/8] gpiolib: move of_gpio_flags into gpiolib-of.c
  2023-01-27  8:53       ` Andy Shevchenko
@ 2023-01-27  9:43         ` Bartosz Golaszewski
  2023-01-27  9:46           ` Arnd Bergmann
  2023-01-27  9:48           ` Andy Shevchenko
  0 siblings, 2 replies; 35+ messages in thread
From: Bartosz Golaszewski @ 2023-01-27  9:43 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Arnd Bergmann, Arnd Bergmann, open list:GPIO SUBSYSTEM,
	Bartosz Golaszewski, Christophe Leroy, Dmitry Torokhov,
	Linus Walleij, linux-kernel

On Fri, Jan 27, 2023 at 9:53 AM Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
>
> On Thu, Jan 26, 2023 at 03:47:42PM +0100, Arnd Bergmann wrote:
> > On Thu, Jan 26, 2023, at 15:09, Andy Shevchenko wrote:
> > > On Thu, Jan 26, 2023 at 02:28:01PM +0100, Arnd Bergmann wrote:
> > >> From: Arnd Bergmann <arnd@arndb.de>
> > >>
> > >> There is no need for this in the header any more, it's just
> > >> an implementation detail now.
> > >
> > > I have published
> > > https://lore.kernel.org/r/20230112145140.67573-1-andriy.shevchenko@linux.intel.com
> > > Can it be used?
> >
> > Sure, I added a Reviewed-by: on that now. Your patch will conflict
> > with my patch 7/8, but we can work that out.
>
> Either Bart takes it independently or you may attach it into your series.
> Bart?
>

I applied it to my for-next branch, is that fine?

Bart

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

* Re: [PATCH 8/8] gpiolib: move of_gpio_flags into gpiolib-of.c
  2023-01-27  9:43         ` Bartosz Golaszewski
@ 2023-01-27  9:46           ` Arnd Bergmann
  2023-01-27  9:48           ` Andy Shevchenko
  1 sibling, 0 replies; 35+ messages in thread
From: Arnd Bergmann @ 2023-01-27  9:46 UTC (permalink / raw)
  To: Bartosz Golaszewski, Andy Shevchenko
  Cc: Arnd Bergmann, open list:GPIO SUBSYSTEM, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, Linus Walleij, linux-kernel

On Fri, Jan 27, 2023, at 10:43, Bartosz Golaszewski wrote:
> On Fri, Jan 27, 2023 at 9:53 AM Andy Shevchenko
> <andriy.shevchenko@linux.intel.com> wrote:
>>
>> On Thu, Jan 26, 2023 at 03:47:42PM +0100, Arnd Bergmann wrote:
>> > On Thu, Jan 26, 2023, at 15:09, Andy Shevchenko wrote:
>> > > On Thu, Jan 26, 2023 at 02:28:01PM +0100, Arnd Bergmann wrote:
>> > >> From: Arnd Bergmann <arnd@arndb.de>
>> > >>
>> > >> There is no need for this in the header any more, it's just
>> > >> an implementation detail now.
>> > >
>> > > I have published
>> > > https://lore.kernel.org/r/20230112145140.67573-1-andriy.shevchenko@linux.intel.com
>> > > Can it be used?
>> >
>> > Sure, I added a Reviewed-by: on that now. Your patch will conflict
>> > with my patch 7/8, but we can work that out.
>>
>> Either Bart takes it independently or you may attach it into your series.
>> Bart?
>>
>
> I applied it to my for-next branch, is that fine?

That's fine, I'll make sure to rebase patch 7 on top of that before
I resend it. The two are functionally independent but touch adjacent
lines.

     Arnd

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

* Re: [PATCH 8/8] gpiolib: move of_gpio_flags into gpiolib-of.c
  2023-01-27  9:43         ` Bartosz Golaszewski
  2023-01-27  9:46           ` Arnd Bergmann
@ 2023-01-27  9:48           ` Andy Shevchenko
  1 sibling, 0 replies; 35+ messages in thread
From: Andy Shevchenko @ 2023-01-27  9:48 UTC (permalink / raw)
  To: Bartosz Golaszewski
  Cc: Arnd Bergmann, Arnd Bergmann, open list:GPIO SUBSYSTEM,
	Bartosz Golaszewski, Christophe Leroy, Dmitry Torokhov,
	Linus Walleij, linux-kernel

On Fri, Jan 27, 2023 at 10:43:37AM +0100, Bartosz Golaszewski wrote:
> On Fri, Jan 27, 2023 at 9:53 AM Andy Shevchenko
> <andriy.shevchenko@linux.intel.com> wrote:
> > On Thu, Jan 26, 2023 at 03:47:42PM +0100, Arnd Bergmann wrote:
> > > On Thu, Jan 26, 2023, at 15:09, Andy Shevchenko wrote:
> > > > On Thu, Jan 26, 2023 at 02:28:01PM +0100, Arnd Bergmann wrote:

...

> > > >> There is no need for this in the header any more, it's just
> > > >> an implementation detail now.
> > > >
> > > > I have published
> > > > https://lore.kernel.org/r/20230112145140.67573-1-andriy.shevchenko@linux.intel.com
> > > > Can it be used?
> > >
> > > Sure, I added a Reviewed-by: on that now. Your patch will conflict
> > > with my patch 7/8, but we can work that out.
> >
> > Either Bart takes it independently or you may attach it into your series.
> > Bart?
> 
> I applied it to my for-next branch, is that fine?

Good for me, thanks!
Arnd?

-- 
With Best Regards,
Andy Shevchenko



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

* Re: [PATCH 1/8] gpiolib: remove empty asm/gpio.h files
  2023-01-26 13:27 ` [PATCH 1/8] gpiolib: remove empty asm/gpio.h files Arnd Bergmann
  2023-01-27  9:41   ` Bartosz Golaszewski
@ 2023-01-27 13:04   ` Linus Walleij
  1 sibling, 0 replies; 35+ messages in thread
From: Linus Walleij @ 2023-01-27 13:04 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linux-gpio, Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, linux-kernel,
	Geert Uytterhoeven

On Thu, Jan 26, 2023 at 2:28 PM Arnd Bergmann <arnd@kernel.org> wrote:

> From: Arnd Bergmann <arnd@arndb.de>
>
> The arm and sh versions of this file are identical to the generic
> versions and can just be removed.
>
> The drivers that actually use the sh3 specific version also include
> cpu/gpio.h directly, with the exception of magicpanelr2, which is
> easily fixed. This leaves coldfire as the only gpio driver
> that needs something custom for gpiolib.
>
> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

Reviewed-by: Linus Walleij <linus.walleij@linaro.org>

Yours,
Linus Walleij

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

* Re: [PATCH 2/8] gpiolib: coldfire: remove custom asm/gpio.h
  2023-01-26 13:27 ` [PATCH 2/8] gpiolib: coldfire: remove custom asm/gpio.h Arnd Bergmann
  2023-01-27  9:41   ` Bartosz Golaszewski
@ 2023-01-27 13:05   ` Linus Walleij
  1 sibling, 0 replies; 35+ messages in thread
From: Linus Walleij @ 2023-01-27 13:05 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linux-gpio, Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, linux-kernel,
	Geert Uytterhoeven

On Thu, Jan 26, 2023 at 2:28 PM Arnd Bergmann <arnd@kernel.org> wrote:

> From: Arnd Bergmann <arnd@arndb.de>
>
> Now that coldfire is the only user of a custom asm/gpio.h, it seems
> better to remove this as well, and have the same interface everywhere.
>
> For the gpio_get_value()/gpio_set_value()/gpio_to_irq(), gpio_cansleep()
> functions, the custom version is only a micro-optimization to inline the
> function for constant GPIO numbers. However, in the coldfire defconfigs,
> I was unable to find a single instance where this micro-optimization
> was even used, and according to Geert the only user appears to be the
> QSPI chip that is disabled everywhere.
>
> The custom gpio_request_one() function is even less useful, as it is
> guarded by an #ifdef that is never true.
>
> Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

Reviewed-by: Linus Walleij <linus.walleij@linaro.org>

Yours,
Linus Walleij

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

* Re: [PATCH 3/8] gpiolib: remove asm-generic/gpio.h
  2023-01-26 13:27 ` [PATCH 3/8] gpiolib: remove asm-generic/gpio.h Arnd Bergmann
  2023-01-26 13:46   ` Andy Shevchenko
@ 2023-01-27 13:07   ` Linus Walleij
  2023-01-27 13:14     ` Arnd Bergmann
  1 sibling, 1 reply; 35+ messages in thread
From: Linus Walleij @ 2023-01-27 13:07 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linux-gpio, Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, linux-kernel

On Thu, Jan 26, 2023 at 2:28 PM Arnd Bergmann <arnd@kernel.org> wrote:

> From: Arnd Bergmann <arnd@arndb.de>
>
> The asm-generic/gpio.h file is now always included when
> using gpiolib, so just move its contents into linux/gpio.h
> with a few minor simplifications.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

After fixing the nits pointed out by Andy:
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>

I'm very happy to see this go, maybe you can send a pull request
to Bartosz with these patches and also pull the same to the arch
tree if need be?

Yours,
Linus Walleij

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

* Re: [PATCH 4/8] gpiolib: remove gpio_set_debounce
  2023-01-26 13:27 ` [PATCH 4/8] gpiolib: remove gpio_set_debounce Arnd Bergmann
  2023-01-26 13:50   ` Andy Shevchenko
@ 2023-01-27 13:09   ` Linus Walleij
  1 sibling, 0 replies; 35+ messages in thread
From: Linus Walleij @ 2023-01-27 13:09 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linux-gpio, Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, linux-kernel

On Thu, Jan 26, 2023 at 2:28 PM Arnd Bergmann <arnd@kernel.org> wrote:

> From: Arnd Bergmann <arnd@arndb.de>
>
> gpio_set_debounce() only has a single user, which is trivially
> converted to gpiod_set_debounce().
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

Thanks for shrinking the legacy API surface.

With the fixes pointed out by Andy:
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>

Yours,
Linus Walleij

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

* Re: [PATCH 5/8] gpiolib: remove legacy gpio_export
  2023-01-26 13:27 ` [PATCH 5/8] gpiolib: remove legacy gpio_export Arnd Bergmann
  2023-01-26 14:00   ` Andy Shevchenko
@ 2023-01-27 13:09   ` Linus Walleij
  1 sibling, 0 replies; 35+ messages in thread
From: Linus Walleij @ 2023-01-27 13:09 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linux-gpio, Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, linux-kernel

On Thu, Jan 26, 2023 at 2:28 PM Arnd Bergmann <arnd@kernel.org> wrote:

> From: Arnd Bergmann <arnd@arndb.de>
>
> There are only a handful of users of gpio_export() and
> related functions.
>
> As these are just wrappers around the modern gpiod_export()
> helper, remove the wrappers and open-code the gpio_to_desc
> in all callers to shrink the legacy API.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

Reviewed-by: Linus Walleij <linus.walleij@linaro.org>

Yours,
Linus Walleij

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

* Re: [PATCH 3/8] gpiolib: remove asm-generic/gpio.h
  2023-01-27 13:07   ` Linus Walleij
@ 2023-01-27 13:14     ` Arnd Bergmann
  0 siblings, 0 replies; 35+ messages in thread
From: Arnd Bergmann @ 2023-01-27 13:14 UTC (permalink / raw)
  To: Linus Walleij, Arnd Bergmann
  Cc: open list:GPIO SUBSYSTEM, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, linux-kernel

On Fri, Jan 27, 2023, at 14:07, Linus Walleij wrote:
> On Thu, Jan 26, 2023 at 2:28 PM Arnd Bergmann <arnd@kernel.org> wrote:
>
>> From: Arnd Bergmann <arnd@arndb.de>
>>
>> The asm-generic/gpio.h file is now always included when
>> using gpiolib, so just move its contents into linux/gpio.h
>> with a few minor simplifications.
>>
>> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
>
> After fixing the nits pointed out by Andy:
> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
>
> I'm very happy to see this go, maybe you can send a pull request
> to Bartosz with these patches and also pull the same to the arch
> tree if need be?

I already sent a v2 series that should address all the comments.
I don't expect any conflicts against either the soc tree or the
asm-generic tree, so Bartosz can just pick it up from there.

If it helps, I'm also happy to send a pull request of course.

   Arnd

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

* Re: [PATCH 6/8] gpiolib: split linux/gpio/driver.h out of linux/gpio.h
  2023-01-26 13:27 ` [PATCH 6/8] gpiolib: split linux/gpio/driver.h out of linux/gpio.h Arnd Bergmann
  2023-01-26 14:04   ` Andy Shevchenko
@ 2023-01-27 13:15   ` Linus Walleij
  1 sibling, 0 replies; 35+ messages in thread
From: Linus Walleij @ 2023-01-27 13:15 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linux-gpio, Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, linux-kernel

On Thu, Jan 26, 2023 at 2:28 PM Arnd Bergmann <arnd@kernel.org> wrote:

> From: Arnd Bergmann <arnd@arndb.de>
>
> Almost all gpio drivers include linux/gpio/driver.h, and other
> files should not rely on includes from this header.
>
> Remove the indirect include from here and include the correct
> headers directly from where they are used.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

Makes the kernel look better after than before so:
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>

I was going to send this to Bartosz but don't want us falling over
each other, however consider the approach I use to get rid of
<linux/gpio/driver.h> here:
https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git/log/?h=gpiochip-no-driver-h
(My patch set was at least approved by the build bots.)

Comparing the approaches it seems you need these two, feel free to
cherry-pick to avoid build errors from the bots:
https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git/commit/?h=gpiochip-no-driver-h&id=89f4f9cc70c686303679e57bdc3ac86507979fe3
https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git/commit/?h=gpiochip-no-driver-h&id=73ca8058a7b2075c993040bdc92b6a82f57d4316

Yours,
Linus Walleij

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

* Re: [PATCH 7/8] gpiolib: split of_mm_gpio_chip out of linux/of_gpio.h
  2023-01-26 13:28 ` [PATCH 7/8] gpiolib: split of_mm_gpio_chip out of linux/of_gpio.h Arnd Bergmann
  2023-01-26 14:08   ` Andy Shevchenko
@ 2023-01-27 13:17   ` Linus Walleij
  1 sibling, 0 replies; 35+ messages in thread
From: Linus Walleij @ 2023-01-27 13:17 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linux-gpio, Arnd Bergmann, Andy Shevchenko, Bartosz Golaszewski,
	Christophe Leroy, Dmitry Torokhov, linux-kernel

On Thu, Jan 26, 2023 at 2:28 PM Arnd Bergmann <arnd@kernel.org> wrote:

> From: Arnd Bergmann <arnd@arndb.de>
>
> This is a rarely used feature that has nothing to do with the
> client-side of_gpio.h.
>
> Split it out with a separate header file and Kconfig option
> so it can be removed on its own timeline aside from removing
> the of_gpio consumer interfaces.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

Thanks for isolating this problem, and kudos for even updating
the TODO :D
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>

Yours,
Linus Walleij

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

end of thread, other threads:[~2023-01-27 13:18 UTC | newest]

Thread overview: 35+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-01-26 13:27 [PATCH 0/8] gpiolib cleanups Arnd Bergmann
2023-01-26 13:27 ` [PATCH 1/8] gpiolib: remove empty asm/gpio.h files Arnd Bergmann
2023-01-27  9:41   ` Bartosz Golaszewski
2023-01-27 13:04   ` Linus Walleij
2023-01-26 13:27 ` [PATCH 2/8] gpiolib: coldfire: remove custom asm/gpio.h Arnd Bergmann
2023-01-27  9:41   ` Bartosz Golaszewski
2023-01-27 13:05   ` Linus Walleij
2023-01-26 13:27 ` [PATCH 3/8] gpiolib: remove asm-generic/gpio.h Arnd Bergmann
2023-01-26 13:46   ` Andy Shevchenko
2023-01-26 15:43     ` Arnd Bergmann
2023-01-27 13:07   ` Linus Walleij
2023-01-27 13:14     ` Arnd Bergmann
2023-01-26 13:27 ` [PATCH 4/8] gpiolib: remove gpio_set_debounce Arnd Bergmann
2023-01-26 13:50   ` Andy Shevchenko
2023-01-26 15:30     ` Arnd Bergmann
2023-01-27 13:09   ` Linus Walleij
2023-01-26 13:27 ` [PATCH 5/8] gpiolib: remove legacy gpio_export Arnd Bergmann
2023-01-26 14:00   ` Andy Shevchenko
2023-01-26 16:02     ` Arnd Bergmann
2023-01-27 13:09   ` Linus Walleij
2023-01-26 13:27 ` [PATCH 6/8] gpiolib: split linux/gpio/driver.h out of linux/gpio.h Arnd Bergmann
2023-01-26 14:04   ` Andy Shevchenko
2023-01-26 14:51     ` Arnd Bergmann
2023-01-27 13:15   ` Linus Walleij
2023-01-26 13:28 ` [PATCH 7/8] gpiolib: split of_mm_gpio_chip out of linux/of_gpio.h Arnd Bergmann
2023-01-26 14:08   ` Andy Shevchenko
2023-01-26 14:54     ` Arnd Bergmann
2023-01-27 13:17   ` Linus Walleij
2023-01-26 13:28 ` [PATCH 8/8] gpiolib: move of_gpio_flags into gpiolib-of.c Arnd Bergmann
2023-01-26 14:09   ` Andy Shevchenko
2023-01-26 14:47     ` Arnd Bergmann
2023-01-27  8:53       ` Andy Shevchenko
2023-01-27  9:43         ` Bartosz Golaszewski
2023-01-27  9:46           ` Arnd Bergmann
2023-01-27  9:48           ` Andy Shevchenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).