mcs814x: implement MULTI_IRQ_HANDLER
[openwrt/svn-archive/archive.git] / target / linux / mcs814x / files-3.3 / arch / arm / mach-mcs814x / irq.c
index c1e48927dedc6f53a11fd5310cb445045cb0c925..b49e51190a650959e21b9825636b502f85515a61 100644 (file)
@@ -16,7 +16,7 @@
 #include <asm/mach/irq.h>
 #include <mach/mcs814x.h>
 
-void __iomem *mcs814x_intc_base;
+static void __iomem *mcs814x_intc_base;
 
 static void __init mcs814x_alloc_gc(void __iomem *base, unsigned int irq_start,
                                        unsigned int num)
@@ -43,6 +43,26 @@ static void __init mcs814x_alloc_gc(void __iomem *base, unsigned int irq_start,
        writel_relaxed(0xffffffff, base + MCS814X_IRQ_ICR);
 }
 
+asmlinkage void __exception_irq_entry mcs814x_handle_irq(struct pt_regs *regs)
+{
+       u32 status, irq;
+
+       do {
+               /* read the status register */
+               status = __raw_readl(mcs814x_intc_base + MCS814X_IRQ_STS0);
+               if (!status)
+                       break;
+
+               irq = ffs(status) - 1;
+               status |= (1 << irq);
+               /* clear the interrupt */
+               __raw_writel(status, mcs814x_intc_base + MCS814X_IRQ_STS0);
+               /* call the generic handler */
+               handle_IRQ(irq, regs);
+
+       } while (1);
+}
+
 static const struct of_device_id mcs814x_intc_ids[] = {
        { .compatible = "moschip,mcs814x-intc" },
        { /* sentinel */ },