[ARM] 4545/1: ns9xxx: simplify irq ack'ing
authorUwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
Tue, 7 Aug 2007 20:08:21 +0000 (21:08 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 12 Oct 2007 22:43:11 +0000 (23:43 +0100)
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: Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mach-ns9xxx/irq.c
arch/arm/mach-ns9xxx/time.c

index b8c7b00522e677d0ee8d5f0ebc72faa1a7ed9a98..24d424e10e4c7dbf27b37cac9095f3d21ad60012 100644 (file)
 
 #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)
 {
        /* XXX: better use cpp symbols */
@@ -52,12 +25,6 @@ static void ns9xxx_mask_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;
 }
 
index b97d0c54a388163fc72090992d89c9233edbc7af..3327d302618d652099bfb2d90edd78d2963258aa 100644 (file)
@@ -24,10 +24,24 @@ static u32 usecs_per_tick;
 static irqreturn_t
 ns9xxx_timer_interrupt(int irq, void *dev_id)
 {
+       int timerno = irq - IRQ_TIMER0;
+       u32 tc;
+
        write_seqlock(&xtime_lock);
        timer_tick();
        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;
 }