Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/dlm
[pandora-kernel.git] / arch / arm / plat-orion / irq.c
index d8d638e..2d5b9c1 100644 (file)
 #include <linux/io.h>
 #include <plat/irq.h>
 
-static void orion_irq_mask(struct irq_data *d)
-{
-       void __iomem *maskaddr = irq_data_get_irq_chip_data(d);
-       u32 mask;
-
-       mask = readl(maskaddr);
-       mask &= ~(1 << (d->irq & 31));
-       writel(mask, maskaddr);
-}
-
-static void orion_irq_unmask(struct irq_data *d)
-{
-       void __iomem *maskaddr = irq_data_get_irq_chip_data(d);
-       u32 mask;
-
-       mask = readl(maskaddr);
-       mask |= 1 << (d->irq & 31);
-       writel(mask, maskaddr);
-}
-
-static struct irq_chip orion_irq_chip = {
-       .name           = "orion_irq",
-       .irq_mask       = orion_irq_mask,
-       .irq_mask_ack   = orion_irq_mask,
-       .irq_unmask     = orion_irq_unmask,
-};
-
 void __init orion_irq_init(unsigned int irq_start, void __iomem *maskaddr)
 {
-       unsigned int i;
+       struct irq_chip_generic *gc;
+       struct irq_chip_type *ct;
 
        /*
         * Mask all interrupts initially.
         */
        writel(0, maskaddr);
 
-       /*
-        * Register IRQ sources.
-        */
-       for (i = 0; i < 32; i++) {
-               unsigned int irq = irq_start + i;
-
-               irq_set_chip_and_handler(irq, &orion_irq_chip,
-                                        handle_level_irq);
-               irq_set_chip_data(irq, maskaddr);
-               irq_set_status_flags(irq, IRQ_LEVEL);
-               set_irq_flags(irq, IRQF_VALID);
-       }
+       gc = irq_alloc_generic_chip("orion_irq", 1, irq_start, maskaddr,
+                                   handle_level_irq);
+       ct = gc->chip_types;
+       ct->chip.irq_mask = irq_gc_mask_clr_bit;
+       ct->chip.irq_unmask = irq_gc_mask_set_bit;
+       irq_setup_generic_chip(gc, IRQ_MSK(32), IRQ_GC_INIT_MASK_CACHE,
+                              IRQ_NOREQUEST, IRQ_LEVEL | IRQ_NOPROBE);
 }