openrisc: delay: fix loops calculation for __const_udelay
Will Deacon [Tue, 7 Aug 2012 16:59:53 +0000 (17:59 +0100)]
The openrisc implementation of __const_udelay casts the result of a
32-bit multiplication to 64 bits and passes the top 32 bits to __delay.
Since there are no casts on the arguments, this results in a __delay of
zero, regardless of the xloops parameter.

This patch fixes the problem by casting xloops to (unsigned long long),
ensuring that the multiplication is not truncated.

Cc: Jon Masters <jcm@redhat.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Jonas Bonn <jonas@southpole.se>

arch/openrisc/lib/delay.c

index 01d9740..0c12407 100644 (file)
@@ -41,7 +41,7 @@ inline void __const_udelay(unsigned long xloops)
 {
        unsigned long long loops;
 
-       loops = xloops * loops_per_jiffy * HZ;
+       loops = (unsigned long long)xloops * loops_per_jiffy * HZ;
 
        __delay(loops >> 32);
 }