[PATCH] ARM: S5P: Dynamicly numbered GPIO interrupt support
Jassi Brar
jassisinghbrar at gmail.com
Fri May 14 05:16:06 EDT 2010
On Fri, May 14, 2010 at 5:40 PM, Ben Dooks <ben-linux at fluff.org> wrote:
> Add support for GPIO interrupts where the interrupt number
> is dynamically allocated at first request from gpiolib.
>
> This method is employed as the newer SoCs have a large number
> of possible interrupt numbers which are very rarely heavily
> used. However, the classic code has always registered all
> possible interrupts, using a large amount of memory for the
> irq_desc[] table.
>
> For example, S5PV210 has 178 possible GPIO interrupt sources
> of which few boards actually use any of these. The current
> size of a single irq_desc entry is 80 bytes, meaing to fully
> support GPIO interrupts on the V210 we use 14240 bytes when
> a board may only need a few of these.
>
> NOTE: This code is not tested, and not even booted. it is
> offered here as an example and if people think it is a good
> idea, I will do the necessary run testing and checking.
>
> not-quite-signed-off-by: Ben Dooks <ben-linux at fluff.org>
> ---
> arch/arm/mach-s5pv210/gpiolib.c | 10 +++++++++-
> arch/arm/mach-s5pv210/include/mach/irqs.h | 5 ++++-
> arch/arm/plat-s5p/Kconfig | 5 +++++
> arch/arm/plat-s5p/Makefile | 1 +
> arch/arm/plat-samsung/include/plat/gpio-core.h | 5 +++++
> 5 files changed, 24 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/mach-s5pv210/gpiolib.c b/arch/arm/mach-s5pv210/gpiolib.c
> index 99dad92..68972ea 100644
> --- a/arch/arm/mach-s5pv210/gpiolib.c
> +++ b/arch/arm/mach-s5pv210/gpiolib.c
> @@ -237,6 +237,12 @@ static struct s3c_gpio_chip s5pv210_gpio_4bit[] = {
> },
> };
>
> +static int to_gpio_irq_bank(int nr)
> +{
> + if (nr >= 17)
> + return nr - 4;
> +}
> +
> static __init int s5pv210_gpiolib_init(void)
> {
> struct s3c_gpio_chip *chip = s5pv210_gpio_4bit;
> @@ -244,8 +250,10 @@ static __init int s5pv210_gpiolib_init(void)
> int i = 0;
>
> for (i = 0; i < nr_chips; i++, chip++) {
> - if (chip->config == NULL)
> + if (chip->config == NULL) {
> chip->config = &gpio_cfg;
> + s5p_gpio_irq_register(chip, to_gpio_irq_bank(i));
> + }
> if (chip->base == NULL)
> chip->base = S5PV210_BANK_BASE(i);
> }
> diff --git a/arch/arm/mach-s5pv210/include/mach/irqs.h b/arch/arm/mach-s5pv210/include/mach/irqs.h
> index 1714be2..dca0067 100644
> --- a/arch/arm/mach-s5pv210/include/mach/irqs.h
> +++ b/arch/arm/mach-s5pv210/include/mach/irqs.h
> @@ -144,8 +144,11 @@
> #define S5P_EINT_SET2(x) S5PV210_GPH2(x)
> #define S5P_EINT_SET3(x) S5PV210_GPH3(x)
>
> +#define IRQ_GPIO_BASE IRQ_EINT(31) + 1
> +#define NR_GPIO_IRQS (24)
Don't we want to give option to configure this value during build?
Rest sounds good.
More information about the linux-arm-kernel
mailing list