+++ /dev/null
-/*
- * arch/arm/include/asm/hardware/entry-macro-iomd.S
- *
- * Low-level IRQ helper macros for IOC/IOMD based platforms
- *
- * This file is licensed under  the terms of the GNU General Public
- * License version 2. This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-/* IOC / IOMD based hardware */
-#include <asm/hardware/iomd.h>
-
-               .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
-               ldrb    \irqstat, [\base, #IOMD_IRQREQB]        @ get high priority first
-               ldr     \tmp, =irq_prio_h
-               teq     \irqstat, #0
-#ifdef IOMD_BASE
-               ldrbeq  \irqstat, [\base, #IOMD_DMAREQ] @ get dma
-               addeq   \tmp, \tmp, #256                @ irq_prio_h table size
-               teqeq   \irqstat, #0
-               bne     2406f
-#endif
-               ldrbeq  \irqstat, [\base, #IOMD_IRQREQA]        @ get low priority
-               addeq   \tmp, \tmp, #256                @ irq_prio_d table size
-               teqeq   \irqstat, #0
-2406:          ldrbne  \irqnr, [\tmp, \irqstat]        @ get IRQ number
-               .endm
-
-/*
- * Interrupt table (incorporates priority).  Please note that we
- * rely on the order of these tables (see above code).
- */
-               .align  5
-irq_prio_h:    .byte    0, 8, 9, 8,10,10,10,10,11,11,11,11,10,10,10,10
-               .byte   12, 8, 9, 8,10,10,10,10,11,11,11,11,10,10,10,10
-               .byte   13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
-               .byte   13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
-               .byte   14,14,14,14,10,10,10,10,11,11,11,11,10,10,10,10
-               .byte   14,14,14,14,10,10,10,10,11,11,11,11,10,10,10,10
-               .byte   13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
-               .byte   13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
-               .byte   15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10
-               .byte   15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10
-               .byte   13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
-               .byte   13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
-               .byte   15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10
-               .byte   15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10
-               .byte   13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
-               .byte   13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
-#ifdef IOMD_BASE
-irq_prio_d:    .byte    0,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
-               .byte   20,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
-               .byte   21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
-               .byte   21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
-               .byte   22,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
-               .byte   22,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
-               .byte   21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
-               .byte   21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
-               .byte   23,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
-               .byte   23,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
-               .byte   21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
-               .byte   21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
-               .byte   22,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
-               .byte   22,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
-               .byte   21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
-               .byte   21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
-#endif
-irq_prio_l:    .byte    0, 0, 1, 0, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3
-               .byte    4, 0, 1, 0, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3
-               .byte    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
-               .byte    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
-               .byte    6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3
-               .byte    6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3
-               .byte    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
-               .byte    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
-               .byte    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
-               .byte    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
-               .byte    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
-               .byte    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
-               .byte    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
-               .byte    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
-               .byte    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
-               .byte    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
 
 #define CLR    0x04
 #define MASK   0x08
 
+static const u8 irq_prio_h[256] = {
+        0, 8, 9, 8,10,10,10,10,11,11,11,11,10,10,10,10,
+       12, 8, 9, 8,10,10,10,10,11,11,11,11,10,10,10,10,
+       13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10,
+       13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10,
+       14,14,14,14,10,10,10,10,11,11,11,11,10,10,10,10,
+       14,14,14,14,10,10,10,10,11,11,11,11,10,10,10,10,
+       13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10,
+       13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10,
+       15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10,
+       15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10,
+       13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10,
+       13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10,
+       15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10,
+       15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10,
+       13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10,
+       13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10,
+};
+
+static const u8 irq_prio_d[256] = {
+        0,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16,
+       20,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16,
+       21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16,
+       21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16,
+       22,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16,
+       22,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16,
+       21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16,
+       21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16,
+       23,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16,
+       23,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16,
+       21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16,
+       21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16,
+       22,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16,
+       22,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16,
+       21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16,
+       21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16,
+};
+
+static const u8 irq_prio_l[256] = {
+        0, 0, 1, 0, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+        4, 0, 1, 0, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+        5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+        5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+        6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3,
+        6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3,
+        5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+        5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+        7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+};
+
+static int iomd_get_irq_nr(void)
+{
+       int irq;
+       u8 reg;
+
+       /* get highest priority first */
+       reg = readb(IOC_BASE + IOMD_IRQREQB);
+       irq = irq_prio_h[reg];
+       if (irq)
+               return irq;
+
+       /* get DMA  */
+       reg = readb(IOC_BASE + IOMD_DMAREQ);
+       irq = irq_prio_d[reg];
+       if (irq)
+               return irq;
+
+       /* get low priority */
+       reg = readb(IOC_BASE + IOMD_IRQREQA);
+       irq = irq_prio_l[reg];
+       if (irq)
+               return irq;
+       return 0;
+}
+
+static void iomd_handle_irq(struct pt_regs *regs)
+{
+       int irq;
+
+       do {
+               irq = iomd_get_irq_nr();
+               if (irq)
+                       generic_handle_irq(irq);
+       } while (irq);
+}
+
 static void __iomem *iomd_get_base(struct irq_data *d)
 {
        void *cd = irq_data_get_irq_chip_data(d);
        set_fiq_handler(&rpc_default_fiq_start,
                &rpc_default_fiq_end - &rpc_default_fiq_start);
 
+       set_handle_irq(iomd_handle_irq);
+
        for (irq = 0; irq < NR_IRQS; irq++) {
                clr = IRQ_NOREQUEST;
                set = 0;