aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/common
diff options
context:
space:
mode:
authorAlessandro Rubini <rubini@gnudd.com>2009-07-02 10:28:52 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2009-07-02 16:20:44 -0400
commit8c81b52422147b4b09f5adb8d0c6963342a336c6 (patch)
treef4cf43c1353c5dfd29e68c64e8efe85368251052 /arch/arm/common
parent87e8824b4588076409692b82ef4b1d98f25cd400 (diff)
[ARM] 5583/1: VIC: acknowledge software interrupts
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>
Diffstat (limited to 'arch/arm/common')
-rw-r--r--arch/arm/common/vic.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/arch/arm/common/vic.c b/arch/arm/common/vic.c
index 27714ab30f25..bc1f9ad61ff6 100644
--- a/arch/arm/common/vic.c
+++ b/arch/arm/common/vic.c
@@ -26,6 +26,15 @@
26#include <asm/mach/irq.h> 26#include <asm/mach/irq.h>
27#include <asm/hardware/vic.h> 27#include <asm/hardware/vic.h>
28 28
29static void vic_ack_irq(unsigned int irq)
30{
31 void __iomem *base = get_irq_chip_data(irq);
32 irq &= 31;
33 writel(1 << irq, base + VIC_INT_ENABLE_CLEAR);
34 /* moreover, clear the soft-triggered, in case it was the reason */
35 writel(1 << irq, base + VIC_INT_SOFT_CLEAR);
36}
37
29static void vic_mask_irq(unsigned int irq) 38static void vic_mask_irq(unsigned int irq)
30{ 39{
31 void __iomem *base = get_irq_chip_data(irq); 40 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
253 262
254static struct irq_chip vic_chip = { 263static struct irq_chip vic_chip = {
255 .name = "VIC", 264 .name = "VIC",
256 .ack = vic_mask_irq, 265 .ack = vic_ack_irq,
257 .mask = vic_mask_irq, 266 .mask = vic_mask_irq,
258 .unmask = vic_unmask_irq, 267 .unmask = vic_unmask_irq,
259 .set_wake = vic_set_wake, 268 .set_wake = vic_set_wake,