[ARM] 5583/1: VIC: acknowledge software interrupts
authorAlessandro Rubini <rubini@gnudd.com>
Thu, 2 Jul 2009 14:28:52 +0000 (15:28 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 2 Jul 2009 20:20:44 +0000 (21:20 +0100)
The PrimeCell Vectored Interrupt Controller offers a way to trigger
any interrupt through software. This is a useful tool for developing,
but such software interrupt can only be acked by writing a bit in the
"software clear" register, or the handler will loop forever.  This
splits ack from mask, and acks the soft irq in case it was the source.

Signed-off-by: Alessandro Rubini <rubini@unipv.it>
Acked-by: Andrea Gallo <andrea.gallo@stericsson.com>
Acked-by: Linus Walleij <linus.walleij@stericsson.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/common/vic.c

index 27714ab..bc1f9ad 100644 (file)
 #include <asm/mach/irq.h>
 #include <asm/hardware/vic.h>
 
+static void vic_ack_irq(unsigned int irq)
+{
+       void __iomem *base = get_irq_chip_data(irq);
+       irq &= 31;
+       writel(1 << irq, base + VIC_INT_ENABLE_CLEAR);
+       /* moreover, clear the soft-triggered, in case it was the reason */
+       writel(1 << irq, base + VIC_INT_SOFT_CLEAR);
+}
+
 static void vic_mask_irq(unsigned int irq)
 {
        void __iomem *base = get_irq_chip_data(irq);
@@ -253,7 +262,7 @@ static inline void vic_pm_register(void __iomem *base, unsigned int irq, u32 arg
 
 static struct irq_chip vic_chip = {
        .name   = "VIC",
-       .ack    = vic_mask_irq,
+       .ack    = vic_ack_irq,
        .mask   = vic_mask_irq,
        .unmask = vic_unmask_irq,
        .set_wake = vic_set_wake,