[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>
This commit is contained in:
Родитель
87e8824b45
Коммит
8c81b52422
|
@ -26,6 +26,15 @@
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
#include <asm/hardware/vic.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)
|
static void vic_mask_irq(unsigned int irq)
|
||||||
{
|
{
|
||||||
void __iomem *base = get_irq_chip_data(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 = {
|
static struct irq_chip vic_chip = {
|
||||||
.name = "VIC",
|
.name = "VIC",
|
||||||
.ack = vic_mask_irq,
|
.ack = vic_ack_irq,
|
||||||
.mask = vic_mask_irq,
|
.mask = vic_mask_irq,
|
||||||
.unmask = vic_unmask_irq,
|
.unmask = vic_unmask_irq,
|
||||||
.set_wake = vic_set_wake,
|
.set_wake = vic_set_wake,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче