[PATCH v1 4/8] gpiolib: Get rid of ARCH_NR_GPIOS
Arnd Bergmann
arnd at arndb.de
Wed Aug 31 13:55:16 PDT 2022
On Wed, Aug 31, 2022, at 7:49 AM, Christophe Leroy wrote:
> Le 30/08/2022 à 22:18, Andy Shevchenko a écrit :
>> On Mon, Aug 29, 2022 at 7:19 PM Christophe Leroy
>> <christophe.leroy at csgroup.eu> wrote:
>>>
>>> Since commit 14e85c0e69d5 ("gpio: remove gpio_descs global array")
>>> there is no limitation on the number of GPIOs that can be allocated
>>> in the system since the allocation is fully dynamic.
>>>
>>> ARCH_NR_GPIOS is today only used in order to provide downwards
>>> gpiobase allocation from that value, while static allocation is
>>> performed upwards from 0. However that has the disadvantage of
>>> limiting the number of GPIOs that can be registered in the system.
>>>
>>> To overcome this limitation without requiring each and every
>>> platform to provide its 'best-guess' maximum number, rework the
>>> allocation to allocate upwards, allowing approx 2 millions of
>>> GPIOs.
>>>
>>> In order to still allow static allocation for legacy drivers, define
>>> GPIO_DYNAMIC_BASE with the value 256 as the start for dynamic
>>> allocation.
>>
>> Not sure about 256, but I understand that this can only be the best guess.
>>
>
> Well, it's already just a precaution. Linus W's expectation is that
> static ones are allocated at first, they should already be allocated
> when we start doing dynamic allocations so he was even thinking that we
> could have started at 0 already.
>
> But I can start higher if you think it is safer, maybe at 512 which is
> the default ARCH_NR_GPIOS today.
FWIW, I went through the drivers that set the base to a value other than
zero or -1, to see what they use:
arch/arm/common/scoop.c: devptr->gpio.base = inf->gpio_base; // 204
arch/arm/mach-s3c/gpio-samsung.c: .base = S3C2410_GPM(0), // 384
arch/arm/mach-s3c/gpio-samsung.c: .base = S3C64XX_GPQ(0), // 197
arch/arm/mach-s3c/mach-h1940.c: .base = H1940_LATCH_GPIO(0), // 384 + 22
arch/arm/mach-sa1100/simpad.c: cs3_gpio.base = SIMPAD_CS3_GPIO_BASE; // 27 + 11
arch/arm/plat-orion/gpio.c: ochip->chip.base = gpio_base; // 64 + 32
arch/mips/alchemy/common/gpiolib.c: .base = ALCHEMY_GPIO2_BASE, // 32 + 16
arch/mips/alchemy/common/gpiolib.c: .base = AU1300_GPIO_BASE, // 0 + 75
arch/mips/kernel/gpio_txx9.c: txx9_gpio_chip.base = base; // 0 + 16
arch/mips/txx9/generic/setup.c: iocled->chip.base = basenum; -1
drivers/bcma/driver_gpio.c: chip->base = bus->num * BCMA_GPIO_MAX_PINS; // probably 0
drivers/gpio/gpio-adp5520.c: gc->base = pdata->gpio_start; // unused
drivers/gpio/gpio-adp5588.c: gc->base = pdata->gpio_start; // unused
drivers/gpio/gpio-arizona.c: arizona_gpio->gpio_chip.base = pdata->gpio_base; // 197
drivers/gpio/gpio-brcmstb.c: gc->base = gpio_base; // 2 * 32
drivers/gpio/gpio-bt8xx.c: c->base = modparam_gpiobase; // from modprobe
drivers/gpio/gpio-da9052.c: gpio->gp.base = pdata->gpio_base; // unused
drivers/gpio/gpio-da9055.c: gpio->gp.base = pdata->gpio_base; // unused
drivers/gpio/gpio-davinci.c: chips->chip.base = pdata->no_auto_base ? pdata->base : -1; // 0 + 144
drivers/gpio/gpio-dwapb.c: port->gc.base = pp->gpio_base; // from DT, deprecated
drivers/gpio/gpio-f7188x.c: .base = _base, \ // 10*10, unused
drivers/gpio/gpio-htc-egpio.c: chip->base = pdata->chip[i].gpio_base; // 192 + 5 * 8
drivers/gpio/gpio-ich.c: chip->base = modparam_gpiobase; // from modprobe
drivers/gpio/gpio-kempld.c: chip->base = pdata->gpio_base; // 0
drivers/gpio/gpio-lpc32xx.c: .base = LPC32XX_GPO_P3_GRP, // 104
drivers/gpio/gpio-madera.c: madera_gpio->gpio_chip.base = pdata->gpio_base; // -1
drivers/gpio/gpio-max730x.c: ts->chip.base = pdata->base; // 200 + 28 (timberdale)
drivers/gpio/gpio-max732x.c: gc->base = gpio_start; // 192
drivers/gpio/gpio-mc33880.c: mc->chip.base = pdata->base; // 100 (timberdale)
drivers/gpio/gpio-merrifield.c: priv->chip.base = gpio_base; // 0 + 213
drivers/gpio/gpio-mmio.c: gc->base = pdata->base; // 197 + 32
drivers/gpio/gpio-mockup.c: gc->base = base; // module parama
drivers/gpio/gpio-mvebu.c: mvchip->chip.base = id * MVEBU_MAX_GPIO_PER_BANK; // 4 * 32, from DT
drivers/gpio/gpio-omap.c: bank->chip.base = OMAP_MPUIO(0); // 192
drivers/gpio/gpio-omap.c: bank->chip.base = gpio; // 7 * 32
drivers/gpio/gpio-palmas.c: palmas_gpio->gpio_chip.base = palmas_pdata->gpio_base; // unused
drivers/gpio/gpio-pca953x.c: gc->base = chip->gpio_start; // ???? used a lot
drivers/gpio/gpio-pcf857x.c: gpio->chip.base = pdata ? pdata->gpio_base : -1; // 160
drivers/gpio/gpio-rc5t583.c: rc5t583_gpio->gpio_chip.base = pdata->gpio_base; // unused
drivers/gpio/gpio-rockchip.c: gc->base = bank->pin_base; // 8 * 32
drivers/gpio/gpio-sch311x.c: block->chip.base = sch311x_gpio_blocks[i].base; // 6 * 10
drivers/gpio/gpio-sta2x11.c: gpio->base = gpio_base; // unused
drivers/gpio/gpio-timberdale.c: gc->base = pdata->gpio_base; // 0 + 100
drivers/gpio/gpio-tps6586x.c: tps6586x_gpio->gpio_chip.base = pdata->gpio_base; // -1
drivers/gpio/gpio-tps65910.c: tps65910_gpio->gpio_chip.base = pdata->gpio_base; // -1
drivers/gpio/gpio-ucb1400.c: ucb->gc.base = ucb->gpio_offset; // 0
drivers/gpio/gpio-wm831x.c: wm831x_gpio->gpio_chip.base = pdata->gpio_base; // 197 + 64
drivers/gpio/gpio-wm8350.c: wm8350_gpio->gpio_chip.base = pdata->gpio_base; // 0
drivers/gpio/gpio-wm8994.c: wm8994_gpio->gpio_chip.base = pdata->gpio_base; 197 + 8
drivers/input/keyboard/adp5588-keys.c: kpad->gc.base = gpio_data->gpio_start; // unused
drivers/input/keyboard/adp5589-keys.c: kpad->gc.base = gpio_data->gpio_start; // unused
drivers/leds/leds-pca9532.c: data->gpio.base = pdata->gpio_base; // unused
drivers/leds/leds-tca6507.c: tca->gpio.base = pdata->gpio_base; // unused
drivers/mfd/asic3.c: asic->gpio.base = pdata->gpio_base; // 300 + 100
drivers/mfd/htc-i2cpld.c: gpio_chip->base = plat_chip_data->gpio_in_base; // 192 + 16 + 8*8
drivers/mfd/sm501.c: gchip->base = base; // 0
drivers/mfd/tps65010.c: tps->chip.base = board->base; // 204
drivers/mfd/ucb1x00-core.c: ucb->gpio.base = pdata->gpio_base; // 27 + 13
drivers/pinctrl/nomadik/pinctrl-nomadik.c: chip->base = id * NMK_GPIO_PER_CHIP; // 9 * 32
drivers/pinctrl/nuvoton/pinctrl-npcm7xx.c: pctrl->gpio_bank[id].gc.base = args.args[1]; // 8*32, from DT
drivers/pinctrl/pinctrl-at91.c: chip->base = alias_idx * MAX_NB_GPIO_PER_BANK; // 5*32
drivers/pinctrl/pinctrl-ingenic.c: jzgc->gc.base = bank * 32; // 6 * 32, from DT
drivers/pinctrl/pinctrl-mcp23s08.c: mcp->chip.base = base; // -1
drivers/pinctrl/pinctrl-oxnas.c: .base = GPIO_BANK_START(_bank), // 2*32
drivers/pinctrl/pinctrl-pic32.c: .base = GPIO_BANK_START(_bank), // 10 * 16
drivers/pinctrl/pinctrl-pistachio.c: .base = _pin_base, // 9 * 16
drivers/pinctrl/pinctrl-st.c: bank->gpio_chip.base = bank_num * ST_GPIO_PINS_PER_BANK; // 26 * 8
drivers/pinctrl/renesas/gpio.c: gc->base = pfc->nr_gpio_pins; // ??? don't understand
drivers/pinctrl/samsung/pinctrl-samsung.c: gc->base = bank->grange.base;
drivers/pinctrl/stm32/pinctrl-stm32.c: bank->gpio_chip.base = args.args[1];
drivers/pinctrl/stm32/pinctrl-stm32.c: bank->gpio_chip.base = bank_nr * STM32_GPIO_PINS_PER_BANK;
drivers/pinctrl/stm32/pinctrl-stm32.c: bank->gpio_chip.base = bank_nr * STM32_GPIO_PINS_PER_BANK;
drivers/pinctrl/sunxi/pinctrl-sunxi.c: pctl->chip->base = pctl->desc->pin_base;
sound/soc/codecs/wm5100.c: wm5100->gpio_chip.base = wm5100->pdata.gpio_base; // 197 + 8 + 6
sound/soc/codecs/wm8903.c: wm8903->gpio_chip.base = pdata->gpio_base; // 197 + 8
sound/soc/codecs/wm8962.c: wm8962->gpio_chip.base = pdata->gpio_base; // 197 + 8
sound/soc/codecs/wm8996.c: wm8996->gpio_chip.base = wm8996->pdata.gpio_base; // 197 + 8
Arnd
More information about the linux-arm-kernel
mailing list