Title: [6050] branches/2008R1/include/asm-blackfin/delay.h: Fix udelay implementation:
- Revision
- 6050
- Author
- hennerich
- Date
- 2009-02-03 09:44:05 -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: branches/2008R1/include/asm-blackfin/delay.h (6049 => 6050)
--- branches/2008R1/include/asm-blackfin/delay.h 2009-02-03 15:42:19 UTC (rev 6049)
+++ branches/2008R1/include/asm-blackfin/delay.h 2009-02-03 15:44:05 UTC (rev 6050)
@@ -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