aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorWill Deacon <will.deacon@arm.com>2012-08-07 17:59:54 +0100
committerJonas Bonn <jonas@southpole.se>2012-09-01 16:36:14 +0200
commit807607f79b9d0ed81561746e4e1121905e75cf0f (patch)
treea598d8169609168392d010c5d315318448df2498 /arch
parent439164663e5d1753360ff84ea4d5c598459e5d50 (diff)
downloadkernel_goldelico_gta04-807607f79b9d0ed81561746e4e1121905e75cf0f.zip
kernel_goldelico_gta04-807607f79b9d0ed81561746e4e1121905e75cf0f.tar.gz
kernel_goldelico_gta04-807607f79b9d0ed81561746e4e1121905e75cf0f.tar.bz2
openrisc: delay: fix handling of counter overflow
If the counter overflows during a __delay operation, we will exit the loop prematurely. For example, calling __delay(0x100) with the counter at 0xffffff00 gives us a target of 0x0. The unsigned comparison in the while loop will likely be false on the first iteration (if the counter is now anything other than 0) and we will return early. This patch fixes the problem by comparing deltas in the loop rather than absolute values. Cc: Jon Masters <jcm@redhat.com> Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Jonas Bonn <jonas@southpole.se>
Diffstat (limited to 'arch')
-rw-r--r--arch/openrisc/lib/delay.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/openrisc/lib/delay.c b/arch/openrisc/lib/delay.c
index 0c12407..c330767 100644
--- a/arch/openrisc/lib/delay.c
+++ b/arch/openrisc/lib/delay.c
@@ -30,9 +30,9 @@ int __devinit read_current_timer(unsigned long *timer_value)
void __delay(unsigned long cycles)
{
- cycles_t target = get_cycles() + cycles;
+ cycles_t start = get_cycles();
- while (get_cycles() < target)
+ while ((get_cycles() - start) < cycles)
cpu_relax();
}
EXPORT_SYMBOL(__delay);