microblaze: Fix interrupt handler code
authorMichal Simek <monstr@monstr.eu>
Fri, 16 Apr 2010 09:51:59 +0000 (11:51 +0200)
committerMichal Simek <monstr@monstr.eu>
Fri, 16 Apr 2010 10:15:34 +0000 (12:15 +0200)
It is better to read ivr and react on it than do long parsing from
two regs. Interrupt controller returs actual irq number.

Signed-off-by: Michal Simek <monstr@monstr.eu>
arch/microblaze/cpu/interrupts.c

index 0fe9f5c610e96f836e70770cfe94080c64cf790f..7a9d022eeeffff2b45bd4af664bf3b9f61f69d68 100644 (file)
@@ -141,8 +141,8 @@ int interrupts_init (void)
 
 void interrupt_handler (void)
 {
-       int irqs = (intc->isr & intc->ier);     /* find active interrupt */
-       int i = 1;
+       int irqs = intc->ivr;   /* find active interrupt */
+       int mask = 1;
 #ifdef DEBUG_INT
        int value;
        printf ("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier,
@@ -150,23 +150,17 @@ void interrupt_handler (void)
        R14(value);
        printf ("Interrupt handler on %x line, r14 %x\n", irqs, value);
 #endif
-       struct irq_action *act = vecs;
-       while (irqs) {
-               if (irqs & 1) {
+       struct irq_action *act = vecs + irqs;
+
+       intc->iar = mask << irqs;
+
 #ifdef DEBUG_INT
-                       printf
-                           ("Jumping to interrupt handler rutine addr %x,count %x,arg %x\n",
-                            act->handler, act->count, act->arg);
+       printf
+           ("Jumping to interrupt handler rutine addr %x,count %x,arg %x\n",
+            act->handler, act->count, act->arg);
 #endif
-                       act->handler (act->arg);
-                       act->count++;
-                       intc->iar = i;
-                       return;
-               }
-               irqs >>= 1;
-               act++;
-               i <<= 1;
-       }
+       act->handler (act->arg);
+       act->count++;
 
 #ifdef DEBUG_INT
        printf ("Dump INTC reg, isr %x, ier %x, iar %x, mer %x\n", intc->isr,