[ARM] 4559/1: pxa: make PXA_LAST_GPIO a run-time variable
authoreric miao <eric.y.miao@gmail.com>
Wed, 29 Aug 2007 09:18:47 +0000 (10:18 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 12 Oct 2007 20:15:32 +0000 (21:15 +0100)
This definition produces processor specific code in generic function
pxa_gpio_mode(), thus creating inconsistencies for support of pxa25x
and pxa27x in a single zImage.

As David Brownell suggests, make it a run-time variable and initialize
at run-time according to the number of GPIOs on the processor. For now
the initialization happens in pxa_init_irq_gpio(),  since there is
already a parameter for that, besides, this is and MUST be earlier
than any subsequent calls to pxa_gpio_mode().

Signed-off-by: eric miao <eric.y.miao@gmail.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mach-pxa/generic.c
arch/arm/mach-pxa/generic.h
arch/arm/mach-pxa/irq.c
include/asm-arm/arch-pxa/irqs.h

index 1c5413fc6e74ad5e5a6127066759f491306859f1..eed95eaf58cd9fb375cdd50de83123c20ef9013c 100644 (file)
@@ -71,6 +71,7 @@ EXPORT_SYMBOL(get_memclk_frequency_10khz);
 /*
  * Handy function to set GPIO alternate functions
  */
+int pxa_last_gpio;
 
 int pxa_gpio_mode(int gpio_mode)
 {
@@ -79,7 +80,7 @@ int pxa_gpio_mode(int gpio_mode)
        int fn = (gpio_mode & GPIO_MD_MASK_FN) >> 8;
        int gafr;
 
-       if (gpio > PXA_LAST_GPIO)
+       if (gpio > pxa_last_gpio)
                return -EINVAL;
 
        local_irq_save(flags);
index 5b11741cccff0fe7fd5f2577596ddfa8213822c1..25bd9bf727b6481ed95968059b21069128ea5005 100644 (file)
@@ -20,6 +20,7 @@ extern void __init pxa27x_init_irq(void);
 extern void __init pxa_map_io(void);
 
 extern unsigned int get_clk_frequency_khz(int info);
+extern int pxa_last_gpio;
 
 #define SET_BANK(__nr,__start,__size) \
        mi->bank[__nr].start = (__start), \
index ae2ae08032d7183a86ab531147066292ffe11070..3d95442d4168b0de8d9e70adae496a010c48c433 100644 (file)
@@ -349,6 +349,8 @@ void __init pxa_init_irq_gpio(int gpio_nr)
 {
        int irq, i;
 
+       pxa_last_gpio = gpio_nr - 1;
+
        /* clear all GPIO edge detects */
        for (i = 0; i < gpio_nr; i += 32) {
                GFER(i) = 0;
index a07fe0f928cd1f4fdea379338ba18d5d4f0675ae..1bcc7632b46c5d07ef74c4ceb6035a9823ad3f77 100644 (file)
 #define IRQ_TO_GPIO_2_x(i)     ((i) - PXA_GPIO_IRQ_BASE)
 #define IRQ_TO_GPIO(i) (((i) < IRQ_GPIO(2)) ? ((i) - IRQ_GPIO0) : IRQ_TO_GPIO_2_x(i))
 
-#if defined(CONFIG_PXA25x)
-#define PXA_LAST_GPIO  84
-#elif defined(CONFIG_PXA27x)
-#define PXA_LAST_GPIO  127
-#endif
-
 /*
  * The next 16 interrupts are for board specific purposes.  Since
  * the kernel can only run on one machine at a time, we can re-use