Commit bf62e862 authored by Uwe Kleine-König's avatar Uwe Kleine-König Committed by Russell King

[ARM] 4545/1: ns9xxx: simplify irq ack'ing

Now the drivers are responsible to clear the irq in the respective
device, which seems to be the normal thing to do.

So the ack'ing of the timer irq moved to time.c.
Signed-off-by: default avatarUwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 9f1ccefe
...@@ -17,33 +17,6 @@ ...@@ -17,33 +17,6 @@
#include "generic.h" #include "generic.h"
static void ns9xxx_ack_irq_timer(unsigned int irq)
{
u32 tc = SYS_TC(irq - IRQ_TIMER0);
/*
* If the timer is programmed to halt on terminal count, the
* timer must be disabled before clearing the interrupt.
*/
if (REGGET(tc, SYS_TCx, REN) == 0) {
REGSET(tc, SYS_TCx, TEN, DIS);
SYS_TC(irq - IRQ_TIMER0) = tc;
}
REGSET(tc, SYS_TCx, INTC, SET);
SYS_TC(irq - IRQ_TIMER0) = tc;
REGSET(tc, SYS_TCx, INTC, UNSET);
SYS_TC(irq - IRQ_TIMER0) = tc;
}
static void (*ns9xxx_ack_irq_functions[NR_IRQS])(unsigned int) = {
[IRQ_TIMER0] = ns9xxx_ack_irq_timer,
[IRQ_TIMER1] = ns9xxx_ack_irq_timer,
[IRQ_TIMER2] = ns9xxx_ack_irq_timer,
[IRQ_TIMER3] = ns9xxx_ack_irq_timer,
};
static void ns9xxx_mask_irq(unsigned int irq) static void ns9xxx_mask_irq(unsigned int irq)
{ {
/* XXX: better use cpp symbols */ /* XXX: better use cpp symbols */
...@@ -52,12 +25,6 @@ static void ns9xxx_mask_irq(unsigned int irq) ...@@ -52,12 +25,6 @@ static void ns9xxx_mask_irq(unsigned int irq)
static void ns9xxx_ack_irq(unsigned int irq) static void ns9xxx_ack_irq(unsigned int irq)
{ {
if (!ns9xxx_ack_irq_functions[irq]) {
printk(KERN_ERR "no ack function for irq %u\n", irq);
BUG();
}
ns9xxx_ack_irq_functions[irq](irq);
SYS_ISRADDR = 0; SYS_ISRADDR = 0;
} }
......
...@@ -24,10 +24,24 @@ static u32 usecs_per_tick; ...@@ -24,10 +24,24 @@ static u32 usecs_per_tick;
static irqreturn_t static irqreturn_t
ns9xxx_timer_interrupt(int irq, void *dev_id) ns9xxx_timer_interrupt(int irq, void *dev_id)
{ {
int timerno = irq - IRQ_TIMER0;
u32 tc;
write_seqlock(&xtime_lock); write_seqlock(&xtime_lock);
timer_tick(); timer_tick();
write_sequnlock(&xtime_lock); write_sequnlock(&xtime_lock);
/* clear irq */
tc = SYS_TC(timerno);
if (REGGET(tc, SYS_TCx, REN) == SYS_TCx_REN_DIS) {
REGSET(tc, SYS_TCx, TEN, DIS);
SYS_TC(timerno) = tc;
}
REGSET(tc, SYS_TCx, INTC, SET);
SYS_TC(timerno) = tc;
REGSET(tc, SYS_TCx, INTC, UNSET);
SYS_TC(timerno) = tc;
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment