Commit | Line | Data |
---|---|---|
1da177e4 LT |
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 | ||
d0a533b1 | 9 | #include <asm/memory.h> |
6d4518d7 PT |
10 | #include <asm/param.h> /* HZ */ |
11 | ||
d0a533b1 | 12 | #define MAX_UDELAY_MS 2 |
215e362d NP |
13 | #define UDELAY_MULT UL(2047 * HZ + 483648 * HZ / 1000000) |
14 | #define UDELAY_SHIFT 31 | |
d0a533b1 WD |
15 | |
16 | #ifndef __ASSEMBLY__ | |
17 | ||
56942fec JA |
18 | struct delay_timer { |
19 | unsigned long (*read_current_timer)(void); | |
20 | unsigned long freq; | |
21 | }; | |
22 | ||
d0a533b1 WD |
23 | extern struct arm_delay_ops { |
24 | void (*delay)(unsigned long); | |
25 | void (*const_udelay)(unsigned long); | |
26 | void (*udelay)(unsigned long); | |
6f3d90e5 | 27 | unsigned long ticks_per_jiffy; |
d0a533b1 WD |
28 | } arm_delay_ops; |
29 | ||
30 | #define __delay(n) arm_delay_ops.delay(n) | |
1da177e4 LT |
31 | |
32 | /* | |
33 | * This function intentionally does not exist; if you see references to | |
34 | * it, it means that you're calling udelay() with an out of range value. | |
35 | * | |
36 | * With currently imposed limits, this means that we support a max delay | |
215e362d | 37 | * of 2000us. Further limits: HZ<=1000 |
1da177e4 LT |
38 | */ |
39 | extern void __bad_udelay(void); | |
40 | ||
41 | /* | |
42 | * division by multiplication: you don't have to worry about | |
43 | * loss of precision. | |
44 | * | |
d0a533b1 | 45 | * Use only for very small delays ( < 2 msec). Should probably use a |
1da177e4 LT |
46 | * lookup table, really, as the multiplications take much too long with |
47 | * short delays. This is a "reasonable" implementation, though (and the | |
48 | * first constant multiplications gets optimized away if the delay is | |
49 | * a constant) | |
50 | */ | |
d0a533b1 WD |
51 | #define __udelay(n) arm_delay_ops.udelay(n) |
52 | #define __const_udelay(n) arm_delay_ops.const_udelay(n) | |
1da177e4 | 53 | |
6d4518d7 PT |
54 | #define udelay(n) \ |
55 | (__builtin_constant_p(n) ? \ | |
56 | ((n) > (MAX_UDELAY_MS * 1000) ? __bad_udelay() : \ | |
d0a533b1 | 57 | __const_udelay((n) * UDELAY_MULT)) : \ |
1da177e4 LT |
58 | __udelay(n)) |
59 | ||
d0a533b1 WD |
60 | /* Loop-based definitions for assembly code. */ |
61 | extern void __loop_delay(unsigned long loops); | |
62 | extern void __loop_udelay(unsigned long usecs); | |
63 | extern void __loop_const_udelay(unsigned long); | |
64 | ||
56942fec JA |
65 | /* Delay-loop timer registration. */ |
66 | #define ARCH_HAS_READ_CURRENT_TIMER | |
67 | extern void register_current_timer_delay(const struct delay_timer *timer); | |
68 | ||
d0a533b1 WD |
69 | #endif /* __ASSEMBLY__ */ |
70 | ||
1da177e4 LT |
71 | #endif /* defined(_ARM_DELAY_H) */ |
72 |