diff options
author | Olof Johansson <olof@lixom.net> | 2013-06-08 03:19:30 +0200 |
---|---|---|
committer | Olof Johansson <olof@lixom.net> | 2013-06-08 03:19:40 +0200 |
commit | 090878aa951628143f40a1acc19ec074a5ae9200 (patch) | |
tree | 9bfd6aa1a24e6bd3e9a7db614c772cc86c905e3d | |
parent | Merge tag 'imx-fixes-3.10-2' of git://git.linaro.org/people/shawnguo/linux-2.... (diff) | |
parent | ARM: mxs: icoll: Fix interrupts gpio bank 0 (diff) | |
download | linux-090878aa951628143f40a1acc19ec074a5ae9200.tar.xz linux-090878aa951628143f40a1acc19ec074a5ae9200.zip |
Merge tag 'mxs-fixes-3.10' of git://git.linaro.org/people/shawnguo/linux-2.6 into fixes
From Shawn Guo, mxs fixes for 3.10:
- Since the time we move to MULTI_IRQ_HANDLER, the 0x7f polling for no
interrupt in icoll_handle_irq() becomes insane, because 0x7f is an
valid interrupt number, the irq of gpio bank 0. That unnecessary
polling results in the driver not detecting when irq 0x7f is active
which makes the machine effectively dead lock. The fix removes the
interrupt poll loop and allows usage of gpio0 interrupt without an
infinite loop.
* tag 'mxs-fixes-3.10' of git://git.linaro.org/people/shawnguo/linux-2.6:
ARM: mxs: icoll: Fix interrupts gpio bank 0
Signed-off-by: Olof Johansson <olof@lixom.net>
-rw-r--r-- | drivers/irqchip/irq-mxs.c | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/drivers/irqchip/irq-mxs.c b/drivers/irqchip/irq-mxs.c index 29889bbdcc6d..63b3d4eb0ef7 100644 --- a/drivers/irqchip/irq-mxs.c +++ b/drivers/irqchip/irq-mxs.c @@ -76,16 +76,10 @@ asmlinkage void __exception_irq_entry icoll_handle_irq(struct pt_regs *regs) { u32 irqnr; - do { - irqnr = __raw_readl(icoll_base + HW_ICOLL_STAT_OFFSET); - if (irqnr != 0x7f) { - __raw_writel(irqnr, icoll_base + HW_ICOLL_VECTOR); - irqnr = irq_find_mapping(icoll_domain, irqnr); - handle_IRQ(irqnr, regs); - continue; - } - break; - } while (1); + irqnr = __raw_readl(icoll_base + HW_ICOLL_STAT_OFFSET); + __raw_writel(irqnr, icoll_base + HW_ICOLL_VECTOR); + irqnr = irq_find_mapping(icoll_domain, irqnr); + handle_IRQ(irqnr, regs); } static int icoll_irq_domain_map(struct irq_domain *d, unsigned int virq, |