]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
powerpc/ipic: unmask all interrupt sources
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Wed, 5 Aug 2009 19:41:12 +0000 (21:41 +0200)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Thu, 20 Aug 2009 00:27:23 +0000 (10:27 +1000)
in case the interrupt controller was used in an earlier life then it is
possible it is that some of its sources were used and are still unmask.
If the (unmasked) device is active and is creating interrupts (or one
interrupts was pending since the interrupts were disabled) then the boot
process "ends" very soon. Once external interrupts are enabled, we land in
-> do_IRQ
  -> call ppc_md.get_irq()
     -> ipic_read() gets the source number
     -> irq_linear_revmap(source)
        -> revmap[source] == NO_IRQ
           -> irq_find_mapping(source) returns NO_IRQ because no source
              is registered
  -> source is NO_IRQ, ppc_spurious_interrupts gets incremented, no
     further action.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/sysdev/ipic.c

index 69e2630c90624cf40690d0ecfd7643a75e1d4bf5..ebb7e584401216e350b7391e942de013ecb35a06 100644 (file)
@@ -781,6 +781,9 @@ struct ipic * __init ipic_init(struct device_node *node, unsigned int flags)
        primary_ipic = ipic;
        irq_set_default_host(primary_ipic->irqhost);
 
+       ipic_write(ipic->regs, IPIC_SIMSR_H, 0);
+       ipic_write(ipic->regs, IPIC_SIMSR_L, 0);
+
        printk ("IPIC (%d IRQ sources) at %p\n", NR_IPIC_INTS,
                        primary_ipic->regs);