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 <[email protected]>
Signed-off-by: Will Deacon <[email protected]>
---
 arch/openrisc/lib/delay.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/openrisc/lib/delay.c b/arch/openrisc/lib/delay.c
index 01d9740..0c12407 100644
--- a/arch/openrisc/lib/delay.c
+++ b/arch/openrisc/lib/delay.c
@@ -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);
 }
-- 
1.7.4.1

_______________________________________________
Linux mailing list
[email protected]
http://lists.openrisc.net/listinfo/linux

Reply via email to