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 /arch/arm/lib | |
| parent | 9e9bc9736756f25d6c47b4eba0ebf25b20a6f153 (diff) | |
| download | olio-linux-3.10-56949d414acd30353fdba4b64876a0a7953a7b77.tar.xz olio-linux-3.10-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>
Diffstat (limited to 'arch/arm/lib')
| -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 8d6a8762ab8..3c9a05c8d20 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  |