diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-01-10 23:55:59 +0000 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-01-10 23:55:59 +0000 |
commit | 56949d414acd30353fdba4b64876a0a7953a7b77 (patch) | |
tree | 7fb58dd19c6ab12480cb82f8b8a2b9141da1d905 | |
parent | 9e9bc9736756f25d6c47b4eba0ebf25b20a6f153 (diff) | |
download | talos-op-linux-56949d414acd30353fdba4b64876a0a7953a7b77.tar.gz talos-op-linux-56949d414acd30353fdba4b64876a0a7953a7b77.zip |
ARM: udelay: prevent math rounding resulting in short udelays
We perform the microseconds to loops calculation using a number of
multiplies and shift rights. Each shift right rounds down the
resulting value, which can result in delays shorter than requested.
Ensure that we always round up.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r-- | arch/arm/lib/delay.S | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/arch/arm/lib/delay.S b/arch/arm/lib/delay.S index 8d6a8762ab88..3c9a05c8d20b 100644 --- a/arch/arm/lib/delay.S +++ b/arch/arm/lib/delay.S @@ -25,11 +25,15 @@ ENTRY(__udelay) ldr r2, .LC1 mul r0, r2, r0 ENTRY(__const_udelay) @ 0 <= r0 <= 0x7fffff06 + mov r1, #-1 ldr r2, .LC0 ldr r2, [r2] @ max = 0x01ffffff + add r0, r0, r1, lsr #32-14 mov r0, r0, lsr #14 @ max = 0x0001ffff + add r2, r2, r1, lsr #32-10 mov r2, r2, lsr #10 @ max = 0x00007fff mul r0, r2, r0 @ max = 2^32-1 + add r0, r0, r1, lsr #32-6 movs r0, r0, lsr #6 moveq pc, lr |