]> git.karo-electronics.de Git - linux-beck.git/commitdiff
MIPS: ath79: simplify MISC IRQ handling
authorGabor Juhos <juhosg@openwrt.org>
Tue, 29 Jan 2013 16:13:17 +0000 (16:13 +0000)
committerJohn Crispin <blogic@openwrt.org>
Sun, 17 Feb 2013 00:25:27 +0000 (01:25 +0100)
The current code uses multiple if statements for
demultiplexing the different interrupt sources.
Additionally, the MISC interrupt controller has
32 interrupt sources and the current code does not
handles all of them.

Get rid of the if statements and process all interrupt
sources in a loop to fix these issues.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
Patchwork: http://patchwork.linux-mips.org/patch/4874/
Signed-off-by: John Crispin <blogic@openwrt.org>
arch/mips/ath79/irq.c
arch/mips/include/asm/mach-ath79/irq.h

index 90d09fc15398c18cd6ba89f1e3f33653da31a0f4..219cfa1f5961ada603dadba8fda3598159f1c184 100644 (file)
@@ -35,44 +35,17 @@ static void ath79_misc_irq_handler(unsigned int irq, struct irq_desc *desc)
        pending = __raw_readl(base + AR71XX_RESET_REG_MISC_INT_STATUS) &
                  __raw_readl(base + AR71XX_RESET_REG_MISC_INT_ENABLE);
 
-       if (pending & MISC_INT_UART)
-               generic_handle_irq(ATH79_MISC_IRQ_UART);
-
-       else if (pending & MISC_INT_DMA)
-               generic_handle_irq(ATH79_MISC_IRQ_DMA);
-
-       else if (pending & MISC_INT_PERFC)
-               generic_handle_irq(ATH79_MISC_IRQ_PERFC);
-
-       else if (pending & MISC_INT_TIMER)
-               generic_handle_irq(ATH79_MISC_IRQ_TIMER);
-
-       else if (pending & MISC_INT_TIMER2)
-               generic_handle_irq(ATH79_MISC_IRQ_TIMER2);
-
-       else if (pending & MISC_INT_TIMER3)
-               generic_handle_irq(ATH79_MISC_IRQ_TIMER3);
-
-       else if (pending & MISC_INT_TIMER4)
-               generic_handle_irq(ATH79_MISC_IRQ_TIMER4);
-
-       else if (pending & MISC_INT_OHCI)
-               generic_handle_irq(ATH79_MISC_IRQ_OHCI);
-
-       else if (pending & MISC_INT_ERROR)
-               generic_handle_irq(ATH79_MISC_IRQ_ERROR);
-
-       else if (pending & MISC_INT_GPIO)
-               generic_handle_irq(ATH79_MISC_IRQ_GPIO);
-
-       else if (pending & MISC_INT_WDOG)
-               generic_handle_irq(ATH79_MISC_IRQ_WDOG);
+       if (!pending) {
+               spurious_interrupt();
+               return;
+       }
 
-       else if (pending & MISC_INT_ETHSW)
-               generic_handle_irq(ATH79_MISC_IRQ_ETHSW);
+       while (pending) {
+               int bit = __ffs(pending);
 
-       else
-               spurious_interrupt();
+               generic_handle_irq(ATH79_MISC_IRQ(bit));
+               pending &= ~BIT(bit);
+       }
 }
 
 static void ar71xx_misc_irq_unmask(struct irq_data *d)
index 0968f69e2018527e6f35b40b7aa7f7be333323d8..158ad7f413133568231a2485fe5e2c87343f5562 100644 (file)
@@ -14,6 +14,7 @@
 
 #define ATH79_MISC_IRQ_BASE    8
 #define ATH79_MISC_IRQ_COUNT   32
+#define ATH79_MISC_IRQ(_x)     (ATH79_MISC_IRQ_BASE + (_x))
 
 #define ATH79_PCI_IRQ_BASE     (ATH79_MISC_IRQ_BASE + ATH79_MISC_IRQ_COUNT)
 #define ATH79_PCI_IRQ_COUNT    6