diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-05-10 21:14:05 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-05-10 21:14:05 -0700 |
commit | 5bb7ff795fffc9418e3039cac77b42adcaae1a57 (patch) | |
tree | c6dca94cc723a0079d04d254e0407e85c1980c66 /arch/arm/mach-ns9xxx/irq.c | |
parent | 3e1b83ab3912a6f583897635bee0a2e0cd1545f7 (diff) | |
parent | 1f2ee6496b1f71e9d5aa2448745e65fbafdc3bd5 (diff) |
Merge master.kernel.org:/home/rmk/linux-2.6-arm
* master.kernel.org:/home/rmk/linux-2.6-arm:
[ARM] 5033/1: Unbreak corgi_ssp by registering ssp drivers earlier.
[ARM] Orion: clean up addr-map.c after window setting code purge
[ARM] Orion: pass proper t_clk into mv643xx_eth
[ARM] Orion: use mv643xx_eth driver mbus window handling
[ARM] pxa: Fix RCSR handling
[ARM] lubbock: fix compilation
[ARM] 5032/1: Added cpufreq support for pxa27x CPU
[ARM] 5031/1: Indentation correction in cpu-pxa.c.
[ARM] 5028/1: pxafb: fix broken "backward compatibility way" in framebuffer
[ARM] 4882/2: Correction for S3C2410 clkout generation
[ARM] 5027/1: Fixed random memory corruption on pxa suspend cycle.
[ARM] 5024/1: Fix some minor clk issues in the MMCI PL18x driver
[ARM] 5023/1: Fix broken gpio interrupts on ep93xx
ns9xxx: fix sparse warning
ns9xxx: check for irq lockups
ns9xxx: fix handle_prio_irq to unmask irqs with lower priority
Diffstat (limited to 'arch/arm/mach-ns9xxx/irq.c')
-rw-r--r-- | arch/arm/mach-ns9xxx/irq.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/arch/arm/mach-ns9xxx/irq.c b/arch/arm/mach-ns9xxx/irq.c index 36e5835e609..ca85d24cf39 100644 --- a/arch/arm/mach-ns9xxx/irq.c +++ b/arch/arm/mach-ns9xxx/irq.c @@ -62,7 +62,7 @@ static struct irq_chip ns9xxx_chip = { #if 0 #define handle_irq handle_level_irq #else -void handle_prio_irq(unsigned int irq, struct irq_desc *desc) +static void handle_prio_irq(unsigned int irq, struct irq_desc *desc) { unsigned int cpu = smp_processor_id(); struct irqaction *action; @@ -70,27 +70,35 @@ void handle_prio_irq(unsigned int irq, struct irq_desc *desc) spin_lock(&desc->lock); - if (unlikely(desc->status & IRQ_INPROGRESS)) - goto out_unlock; + BUG_ON(desc->status & IRQ_INPROGRESS); desc->status &= ~(IRQ_REPLAY | IRQ_WAITING); kstat_cpu(cpu).irqs[irq]++; action = desc->action; if (unlikely(!action || (desc->status & IRQ_DISABLED))) - goto out_unlock; + goto out_mask; desc->status |= IRQ_INPROGRESS; spin_unlock(&desc->lock); action_ret = handle_IRQ_event(irq, action); + /* XXX: There is no direct way to access noirqdebug, so check + * unconditionally for spurious irqs... + * Maybe this function should go to kernel/irq/chip.c? */ + note_interrupt(irq, desc, action_ret); + spin_lock(&desc->lock); desc->status &= ~IRQ_INPROGRESS; - if (!(desc->status & IRQ_DISABLED) && desc->chip->ack) - desc->chip->ack(irq); -out_unlock: + if (desc->status & IRQ_DISABLED) +out_mask: + desc->chip->mask(irq); + + /* ack unconditionally to unmask lower prio irqs */ + desc->chip->ack(irq); + spin_unlock(&desc->lock); } #define handle_irq handle_prio_irq |