Title: [6049] trunk/arch/blackfin/include/asm/delay.h: Fix udelay implementation:
Revision
6049
Author
hennerich
Date
2009-02-03 09:42:19 -0600 (Tue, 03 Feb 2009)

Log Message

Fix udelay implementation:
Avoid possible overflow during 32*32->32 multiplies.

See more here:
http://blackfin.uclinux.org/gf/project/uclinux-dist/forum/?action="">

Modified Paths

Diff

Modified: trunk/arch/blackfin/include/asm/delay.h (6048 => 6049)


--- trunk/arch/blackfin/include/asm/delay.h	2009-02-03 10:56:49 UTC (rev 6048)
+++ trunk/arch/blackfin/include/asm/delay.h	2009-02-03 15:42:19 UTC (rev 6049)
@@ -47,16 +47,15 @@
 #include <linux/param.h>	/* needed for HZ */
 
 /*
- * Use only for very small delays ( < 1 msec).  Should probably use a
- * lookup table, really, as the multiplications take much too long with
- * short delays.  This is a "reasonable" implementation, though (and the
- * first constant multiplications gets optimized away if the delay is
- * a constant)
+ * close approximation borrowed from m68knommu to avoid 64-bit math
  */
+
+#define	HZSCALE		(268435456 / (1000000/HZ))
+
 static inline void udelay(unsigned long usecs)
 {
 	extern unsigned long loops_per_jiffy;
-	__delay(usecs * loops_per_jiffy / (1000000 / HZ));
+	__delay((((usecs * HZSCALE) >> 11) * (loops_per_jiffy >> 11)) >> 6);
 }
 
 #endif
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
http://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to