• Russell King's avatar
    ARM: fix delays · fb833b1f
    Russell King authored
    Commit 215e362d ("ARM: 8306/1: loop_udelay: remove bogomips value
    limitation") tried to increase the bogomips limitation, but in doing
    so messed up udelay such that it always gives about a 5% error in the
    delay, even if we use a timer.
    
    The calculation is:
    
    	loops = UDELAY_MULT * us_delay * ticks_per_jiffy >> UDELAY_SHIFT
    
    Originally, UDELAY_MULT was ((UL(2199023) * HZ) >> 11) and UDELAY_SHIFT
    30.  Assuming HZ=100, us_delay of 1000 and ticks_per_jiffy of 1660000
    (eg, 166MHz timer, 1ms delay) this would calculate:
    
    	((UL(2199023) * HZ) >> 11) * 1000 * 1660000 >> 30
    		=> 165999
    
    With the new values of 2047 * HZ + 483648 * HZ / 1000000 and 31, we get:
    
    	(2047 * HZ + 483648 * HZ / 1000000) * 1000 * 1660000 >> 31
    		=> 158269
    
    which is incorrect.  This is due to a typo - correcting it gives:
    
    	(2147 * HZ + 483648 * HZ / 1000000) * 1000 * 1660000 >> 31
    		=> 165999
    
    i.o.w, the original value.
    
    Fixes: 215e362d ("ARM: 8306/1: loop_udelay: remove bogomips value limitation")
    Cc: <stable@vger.kernel.org>
    Reviewed-by: default avatarNicolas Pitre <nico@linaro.org>
    Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
    fb833b1f
delay.h 2 KB