void __init at91_gpio_irq_setup(void)
  {
        unsigned                pioc, pin;
 -      struct at91_gpio_bank   *this, *prev;
 +      struct at91_gpio_chip   *this, *prev;
  
 -      for (pioc = 0, pin = PIN_BASE, this = gpio, prev = NULL;
 +      for (pioc = 0, pin = PIN_BASE, this = gpio_chip, prev = NULL;
                        pioc++ < gpio_banks;
                        prev = this, this++) {
 -              unsigned        id = this->id;
 +              unsigned        id = this->bank->id;
                unsigned        i;
  
-               /* enable PIO controller's clock */
-               clk_enable(this->bank->clock);
- 
                __raw_writel(~0, this->regbase + PIO_IDR);
  
 -              for (i = 0, pin = this->chipbase; i < 32; i++, pin++) {
 +              for (i = 0, pin = this->chip.base; i < 32; i++, pin++) {
                        lockdep_set_class(&irq_desc[pin].lock, &gpio_lock_class);
  
                        /*
  
        BUG_ON(nr_banks > MAX_GPIO_BANKS);
  
 -      gpio = data;
        gpio_banks = nr_banks;
  
 -      for (i = 0, last = NULL; i < nr_banks; i++, last = data, data++) {
 -              data->chipbase = PIN_BASE + i * 32;
 -              data->regbase = data->offset + (void __iomem *)AT91_VA_BASE_SYS;
 +      for (i = 0; i < nr_banks; i++) {
 +              at91_gpio = &gpio_chip[i];
 +
 +              at91_gpio->bank = &data[i];
 +              at91_gpio->chip.base = PIN_BASE + i * 32;
 +              at91_gpio->regbase = at91_gpio->bank->offset +
 +                      (void __iomem *)AT91_VA_BASE_SYS;
  
 -              clk_enable(data->clock);
+               /* enable PIO controller's clock */
 -              /*
 -               * Some processors share peripheral ID between multiple GPIO banks.
 -               *  SAM9263 (PIOC, PIOD, PIOE)
 -               *  CAP9 (PIOA, PIOB, PIOC, PIOD)
 -               */
 -              if (last && last->id == data->id)
 -                      last->next = data;
++              clk_enable(at91_gpio->bank->clock);
+ 
 +              /* AT91SAM9263_ID_PIOCDE groups PIOC, PIOD, PIOE */
 +              if (last && last->bank->id == at91_gpio->bank->id)
 +                      last->next = at91_gpio;
 +              last = at91_gpio;
 +
 +              gpiochip_add(&at91_gpio->chip);
        }
  }