On August 9, 2022 3:40:38 AM PDT, Christophe Leroy <christophe.leroy@xxxxxxxxxx> wrote: >At the time being, the default maximum number of GPIOs is set to 512 >and can only get customised via an architecture specific >CONFIG_ARCH_NR_GPIO. > >The maximum number of GPIOs might be dependent on the number of >interface boards and is somewhat independent of architecture. > >Allow the user to select that maximum number outside of any >architecture configuration. To enable that, re-define a >core CONFIG_ARCH_NR_GPIO for architectures which don't already >define one. Guard it with a new hidden CONFIG_ARCH_HAS_NR_GPIO. > >Only two architectures will need CONFIG_ARCH_HAS_NR_GPIO: x86 and arm. > >On arm, do like x86 and set 512 as the default instead of 0, that >allows simplifying the logic in asm-generic/gpio.h > >Signed-off-by: Christophe Leroy <christophe.leroy@xxxxxxxxxx> >--- > Documentation/driver-api/gpio/legacy.rst | 2 +- > arch/arm/Kconfig | 3 ++- > arch/arm/include/asm/gpio.h | 1 - > arch/x86/Kconfig | 1 + > drivers/gpio/Kconfig | 14 ++++++++++++++ > include/asm-generic/gpio.h | 6 ------ > 6 files changed, 18 insertions(+), 9 deletions(-) > >diff --git a/Documentation/driver-api/gpio/legacy.rst b/Documentation/driver-api/gpio/legacy.rst >index 9b12eeb89170..566b06a584cf 100644 >--- a/Documentation/driver-api/gpio/legacy.rst >+++ b/Documentation/driver-api/gpio/legacy.rst >@@ -558,7 +558,7 @@ Platform Support > To force-enable this framework, a platform's Kconfig will "select" GPIOLIB, > else it is up to the user to configure support for GPIO. > >-It may also provide a custom value for ARCH_NR_GPIOS, so that it better >+It may also provide a custom value for CONFIG_ARCH_NR_GPIO, so that it better > reflects the number of GPIOs in actual use on that platform, without > wasting static table space. (It should count both built-in/SoC GPIOs and > also ones on GPIO expanders. >diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig >index 53e6a1da9af5..e55b6560fe4f 100644 >--- a/arch/arm/Kconfig >+++ b/arch/arm/Kconfig >@@ -14,6 +14,7 @@ config ARM > select ARCH_HAS_KCOV > select ARCH_HAS_MEMBARRIER_SYNC_CORE > select ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE >+ select ARCH_HAS_NR_GPIO > select ARCH_HAS_PTE_SPECIAL if ARM_LPAE > select ARCH_HAS_PHYS_TO_DMA > select ARCH_HAS_SETUP_DMA_OPS >@@ -1243,7 +1244,7 @@ config ARCH_NR_GPIO > default 352 if ARCH_VT8500 > default 288 if ARCH_ROCKCHIP > default 264 if MACH_H4700 >- default 0 >+ default 512 > help > Maximum number of GPIOs in the system. > >diff --git a/arch/arm/include/asm/gpio.h b/arch/arm/include/asm/gpio.h >index f3bb8a2bf788..4ebbb58f06ea 100644 >--- a/arch/arm/include/asm/gpio.h >+++ b/arch/arm/include/asm/gpio.h >@@ -2,7 +2,6 @@ > #ifndef _ARCH_ARM_GPIO_H > #define _ARCH_ARM_GPIO_H > >-/* Note: this may rely upon the value of ARCH_NR_GPIOS set in mach/gpio.h */ > #include <asm-generic/gpio.h> > > /* The trivial gpiolib dispatchers */ >diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig >index f9920f1341c8..a8c956abc21e 100644 >--- a/arch/x86/Kconfig >+++ b/arch/x86/Kconfig >@@ -82,6 +82,7 @@ config X86 > select ARCH_HAS_MEM_ENCRYPT > select ARCH_HAS_MEMBARRIER_SYNC_CORE > select ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE >+ select ARCH_HAS_NR_GPIO > select ARCH_HAS_PMEM_API if X86_64 > select ARCH_HAS_PTE_DEVMAP if X86_64 > select ARCH_HAS_PTE_SPECIAL >diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig >index 0642f579196f..250b50ed44e1 100644 >--- a/drivers/gpio/Kconfig >+++ b/drivers/gpio/Kconfig >@@ -11,6 +11,9 @@ config ARCH_HAVE_CUSTOM_GPIO_H > overriding the default implementations. New uses of this are > strongly discouraged. > >+config ARCH_HAS_NR_GPIO >+ bool >+ > menuconfig GPIOLIB > bool "GPIO Support" > help >@@ -22,6 +25,17 @@ menuconfig GPIOLIB > > if GPIOLIB > >+config ARCH_NR_GPIO >+ int "Maximum number of GPIOs" if EXPERT >+ depends on !ARCH_HAS_NR_GPIO >+ default 512 >+ help >+ This allows the user to select the maximum number of GPIOs the >+ kernel must support. When the architecture defines a number >+ through CONFIG_ARCH_NR_GPIO, that value is taken and the user >+ cannot change it. Otherwise it defaults to 512 and the user >+ can change it when CONFIG_EXPERT is set. >+ > config GPIOLIB_FASTPATH_LIMIT > int "Maximum number of GPIOs for fast path" > range 32 512 >diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h >index aea9aee1f3e9..ee090f534ab8 100644 >--- a/include/asm-generic/gpio.h >+++ b/include/asm-generic/gpio.h >@@ -24,13 +24,7 @@ > * actually an estimate of a board-specific value. > */ > >-#ifndef ARCH_NR_GPIOS >-#if defined(CONFIG_ARCH_NR_GPIO) && CONFIG_ARCH_NR_GPIO > 0 > #define ARCH_NR_GPIOS CONFIG_ARCH_NR_GPIO >-#else >-#define ARCH_NR_GPIOS 512 >-#endif >-#endif > > /* > * "valid" GPIO numbers are nonnegative and may be passed to This seems very odd to me. GPIOs can be, and often are, attached to peripheral buses which means that the *same system* can have anything from none to thousands of gpios ..