From 39806805de0314d5847bfd6d046ad7d4407ccd46 Mon Sep 17 00:00:00 2001 From: Andrew Victor Date: Wed, 22 Mar 2006 20:14:13 +0000 Subject: [PATCH] [ARM] 3384/1: AT91RM9200: Timer Patch from Andrew Victor If the timer interrupt is ever significantly delayed (or after the system was suspended), the system could spin incrementing the time for too long. The fix is to replace the "do {} while" with a "while {}". Orignal patch by Savin Zlobec and Peter Menzebach. Signed-off-by: Andrew Victor Signed-off-by: Russell King --- arch/arm/mach-at91rm9200/time.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-at91rm9200/time.c b/arch/arm/mach-at91rm9200/time.c index 1b6dd2deeb2..7ffcf443b99 100644 --- a/arch/arm/mach-at91rm9200/time.c +++ b/arch/arm/mach-at91rm9200/time.c @@ -71,11 +71,11 @@ static irqreturn_t at91rm9200_timer_interrupt(int irq, void *dev_id, struct pt_r if (at91_sys_read(AT91_ST_SR) & AT91_ST_PITS) { /* This is a shared interrupt */ write_seqlock(&xtime_lock); - do { + while (((read_CRTR() - at91_sys_read(AT91_ST_RTAR)) & AT91_ST_ALMV) >= LATCH) { timer_tick(regs); rtar = (at91_sys_read(AT91_ST_RTAR) + LATCH) & AT91_ST_ALMV; at91_sys_write(AT91_ST_RTAR, rtar); - } while (((read_CRTR() - at91_sys_read(AT91_ST_RTAR)) & AT91_ST_ALMV) >= LATCH); + } write_sequnlock(&xtime_lock);