[ARM] 4493/1: ns9xxx: disable a non-reloading timer before ack'ing its irq
authorUwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
Thu, 19 Jul 2007 21:13:05 +0000 (22:13 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 20 Jul 2007 09:01:37 +0000 (10:01 +0100)
The HRM states that is must be done this way ...

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

index cd8f8365b62eb0cc0c904f9aaaaa224f4681d143..b8c7b00522e677d0ee8d5f0ebc72faa1a7ed9a98 100644 (file)
@@ -21,6 +21,15 @@ 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;