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>
 /*
  * Handy function to set GPIO alternate functions
  */
+int pxa_last_gpio;
 
 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);
 
 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), \
 
 {
        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;
 
 #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