Skip to content

Commit

Permalink
Blackfin arch: Fix udelay implementation
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Michael Hennerich authored and Bryan Wu committed Feb 4, 2009
1 parent 972de7d commit 4e653e0
Showing 1 changed file with 5 additions and 6 deletions.
11 changes: 5 additions & 6 deletions arch/blackfin/include/asm/delay.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,15 @@ static inline void __delay(unsigned long loops)
#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

0 comments on commit 4e653e0

Please sign in to comment.