more changes on original files
[linux-2.4.git] / include / asm-arm / delay.h
1 /*
2  *  linux/include/asm-arm/delay.h
3  *
4  *  Copyright (C) 1995-2003 Russell King
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  *  Delay routines, using a pre-computed "loops_per_second" value.
11  */
12 #ifndef __ASM_ARM_DELAY_H
13 #define __ASM_ARM_DELAY_H
14
15 /*
16  * Division by multiplication and shifts.
17  *
18  *  We want the number of loops to complete, where loops is:
19  *      (us * (HZ * loops_per_jiffy)) / 10^6
20  *  or
21  *      (ns * (HZ * loops_per_jiffy)) / 10^9
22  *
23  *  Since we don't want to do long division, we multiply both numerator
24  *  and denominator by (2^28 / 10^6):
25  *
26  *      (us * (2^28 / 10^6) * HZ * loops_per_jiffy) / 2^28
27  *
28  *  =>  (us * (2^28 * HZ / 10^6) * loops_per_jiffy) / 2^28
29  *
30  *  ~>  (((us * (2^28 * HZ / 10^6)) / 2^11) * (loops_per_jiffy / 2^12)) / 2^5
31  *         (for large loops_per_jiffy >> 2^12)
32  *
33  *  Note: maximum loops_per_jiffy = 67108863 (bogomips = 1342.18)
34  *        minimum loops_per_jiffy = 20000 (bogomips = 0.4)
35  *
36  * Note: we rely on HZ = 100.
37  */
38 #define UDELAY_FACTOR   26843
39 #define NDELAY_FACTOR   27
40
41 #ifndef __ASSEMBLY__
42
43 extern void __bad_udelay(void); /* intentional errors */
44 extern void __bad_ndelay(void); /* intentional errors */
45
46 extern void __delay(unsigned long loops);
47 extern void __udelay(unsigned long usecs);
48 extern void __ndelay(unsigned long nsecs);
49 extern void __const_delay(unsigned long units);
50
51 #define udelay(n)                                                       \
52         (__builtin_constant_p(n) ?                                      \
53                 ((n) > 20000 ? __bad_udelay()                           \
54                              : __const_delay((n) * UDELAY_FACTOR))      \
55                                  : __udelay(n))
56
57 #define ndelay(n)                                                       \
58         (__builtin_constant_p(n) ?                                      \
59                 ((n) > 20000 ? __bad_ndelay()                           \
60                              : __const_delay((n) * NDELAY_FACTOR))      \
61                                  : __ndelay(n))
62
63 #endif
64
65 #endif /* defined(_ARM_DELAY_H) */
66