]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ARM: clps711x: Optimize interrupt handling
authorAlexander Shiyan <shc_work@mail.ru>
Mon, 13 May 2013 17:07:33 +0000 (21:07 +0400)
committerOlof Johansson <olof@lixom.net>
Tue, 11 Jun 2013 22:47:38 +0000 (15:47 -0700)
This patch modify interrupt handler for processing all penging interrupts
at once.

Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
Signed-off-by: Olof Johansson <olof@lixom.net>
arch/arm/mach-clps711x/common.c

index bd658398a8190fa0302beba21c22768f640bc74d..f6d1746366d4cf3b6d55be25c505dea4f0279b7d 100644 (file)
@@ -215,7 +215,7 @@ void __init clps711x_init_irq(void)
        }
 }
 
-inline u32 fls16(u32 x)
+static inline u32 fls16(u32 x)
 {
        u32 r = 15;
 
@@ -239,18 +239,24 @@ inline u32 fls16(u32 x)
 
 asmlinkage void __exception_irq_entry clps711x_handle_irq(struct pt_regs *regs)
 {
-       u32 irqstat;
-       void __iomem *base = CLPS711X_VIRT_BASE;
+       do {
+               u32 irqstat;
+               void __iomem *base = CLPS711X_VIRT_BASE;
+
+               irqstat = readw_relaxed(base + INTSR1) &
+                         readw_relaxed(base + INTMR1);
+               if (irqstat)
+                       handle_IRQ(fls16(irqstat), regs);
+
+               irqstat = readw_relaxed(base + INTSR2) &
+                         readw_relaxed(base + INTMR2);
+               if (irqstat) {
+                       handle_IRQ(fls16(irqstat) + 16, regs);
+                       continue;
+               }
 
-       irqstat = readl_relaxed(base + INTSR1) & readl_relaxed(base + INTMR1);
-       if (irqstat) {
-               handle_IRQ(fls16(irqstat), regs);
-               return;
-       }
-
-       irqstat = readl_relaxed(base + INTSR2) & readl_relaxed(base + INTMR2);
-       if (likely(irqstat))
-               handle_IRQ(fls16(irqstat) + 16, regs);
+               break;
+       } while (1);
 }
 
 static u32 notrace clps711x_sched_clock_read(void)