Blackfin arch: Fix udelay implementation
Avoid possible overflow during 32*32->32 multiplies. Reported-by: Marco Reppenhagen <marco.reppenhagen@auerswald.de> Signed-off-by: Michael Hennerich <michael.hennerich@analog.com> Signed-off-by: Bryan Wu <cooloney@kernel.org>
This commit is contained in:
committed by
Bryan Wu
parent
972de7d929
commit
4e653e04cc
@@ -47,16 +47,15 @@ static inline void __delay(unsigned long loops)
|
|||||||
#include <linux/param.h> /* needed for HZ */
|
#include <linux/param.h> /* needed for HZ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Use only for very small delays ( < 1 msec). Should probably use a
|
* close approximation borrowed from m68knommu to avoid 64-bit math
|
||||||
* 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)
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define HZSCALE (268435456 / (1000000/HZ))
|
||||||
|
|
||||||
static inline void udelay(unsigned long usecs)
|
static inline void udelay(unsigned long usecs)
|
||||||
{
|
{
|
||||||
extern unsigned long loops_per_jiffy;
|
extern unsigned long loops_per_jiffy;
|
||||||
__delay(usecs * loops_per_jiffy / (1000000 / HZ));
|
__delay((((usecs * HZSCALE) >> 11) * (loops_per_jiffy >> 11)) >> 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user