| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 1995-2004 Russell King | 
|  | 3 | * | 
|  | 4 | * Delay routines, using a pre-computed "loops_per_second" value. | 
|  | 5 | */ | 
|  | 6 | #ifndef __ASM_ARM_DELAY_H | 
|  | 7 | #define __ASM_ARM_DELAY_H | 
|  | 8 |  | 
| Peter Teichmann | 6d4518d | 2006-03-20 17:10:09 +0000 | [diff] [blame] | 9 | #include <asm/param.h>	/* HZ */ | 
|  | 10 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 11 | extern void __delay(int loops); | 
|  | 12 |  | 
|  | 13 | /* | 
|  | 14 | * This function intentionally does not exist; if you see references to | 
|  | 15 | * it, it means that you're calling udelay() with an out of range value. | 
|  | 16 | * | 
|  | 17 | * With currently imposed limits, this means that we support a max delay | 
| Peter Teichmann | 6d4518d | 2006-03-20 17:10:09 +0000 | [diff] [blame] | 18 | * of 2000us. Further limits: HZ<=1000 and bogomips<=3355 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 19 | */ | 
|  | 20 | extern void __bad_udelay(void); | 
|  | 21 |  | 
|  | 22 | /* | 
|  | 23 | * division by multiplication: you don't have to worry about | 
|  | 24 | * loss of precision. | 
|  | 25 | * | 
|  | 26 | * Use only for very small delays ( < 1 msec).  Should probably use a | 
|  | 27 | * lookup table, really, as the multiplications take much too long with | 
|  | 28 | * short delays.  This is a "reasonable" implementation, though (and the | 
|  | 29 | * first constant multiplications gets optimized away if the delay is | 
|  | 30 | * a constant) | 
|  | 31 | */ | 
|  | 32 | extern void __udelay(unsigned long usecs); | 
|  | 33 | extern void __const_udelay(unsigned long); | 
|  | 34 |  | 
|  | 35 | #define MAX_UDELAY_MS 2 | 
|  | 36 |  | 
| Peter Teichmann | 6d4518d | 2006-03-20 17:10:09 +0000 | [diff] [blame] | 37 | #define udelay(n)							\ | 
|  | 38 | (__builtin_constant_p(n) ?					\ | 
|  | 39 | ((n) > (MAX_UDELAY_MS * 1000) ? __bad_udelay() :		\ | 
|  | 40 | __const_udelay((n) * ((2199023U*HZ)>>11))) :	\ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 41 | __udelay(n)) | 
|  | 42 |  | 
|  | 43 | #endif /* defined(_ARM_DELAY_H) */ | 
|  | 44 |  |