Skip to content

Commit

Permalink
[ARM] 5583/1: VIC: acknowledge software interrupts
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Alessandro Rubini authored and Russell King committed Jul 2, 2009
1 parent 87e8824 commit 8c81b52
Showing 1 changed file with 10 additions and 1 deletion.
11 changes: 10 additions & 1 deletion arch/arm/common/vic.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,15 @@
#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);
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit 8c81b52

Please sign in to comment.