Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+4
+4
arch/arm/lib/delay.S
··· 25 25 ldr r2, .LC1 26 26 mul r0, r2, r0 27 27 ENTRY(__const_udelay) @ 0 <= r0 <= 0x7fffff06 28 + mov r1, #-1 28 29 ldr r2, .LC0 29 30 ldr r2, [r2] @ max = 0x01ffffff 31 + add r0, r0, r1, lsr #32-14 30 32 mov r0, r0, lsr #14 @ max = 0x0001ffff 33 + add r2, r2, r1, lsr #32-10 31 34 mov r2, r2, lsr #10 @ max = 0x00007fff 32 35 mul r0, r2, r0 @ max = 2^32-1 36 + add r0, r0, r1, lsr #32-6 33 37 movs r0, r0, lsr #6 34 38 moveq pc, lr 35 39