#include <linux/amba/bus.h>
 #include <linux/amba/pl061.h>
 #include <linux/slab.h>
+#include <asm/mach/irq.h>
 
 #define GPIODIR 0x400
 #define GPIOIS  0x404
        struct list_head *chip_list = irq_get_handler_data(irq);
        struct list_head *ptr;
        struct pl061_gpio *chip;
+       struct irq_chip *irqchip = irq_desc_get_chip(desc);
 
-       desc->irq_data.chip->irq_ack(&desc->irq_data);
+       chained_irq_enter(irqchip, desc);
        list_for_each(ptr, chip_list) {
                unsigned long pending;
                int offset;
                for_each_set_bit(offset, &pending, PL061_GPIO_NR)
                        generic_handle_irq(pl061_to_irq(&chip->gc, offset));
        }
-       desc->irq_data.chip->irq_unmask(&desc->irq_data);
+       chained_irq_exit(irqchip, desc);
 }
 
 static int pl061_probe(struct amba_device *dev, const struct amba_id *id)