1
2
3
4
5
6
7
8#ifndef _ASM_MICROBLAZE_DELAY_H
9#define _ASM_MICROBLAZE_DELAY_H
10
11#include <linux/param.h>
12
13static inline void __delay(unsigned long loops)
14{
15 asm volatile ("# __delay \n\t" \
16 "1: addi %0, %0, -1\t\n" \
17 "bneid %0, 1b \t\n" \
18 "nop \t\n"
19 : "=r" (loops)
20 : "0" (loops));
21}
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36#define __MAX_UDELAY (226050910UL/HZ)
37#define __MAX_NDELAY (4294967295UL/HZ)
38
39extern unsigned long loops_per_jiffy;
40
41static inline void __udelay(unsigned int x)
42{
43
44 unsigned long long tmp =
45 (unsigned long long)x * (unsigned long long)loops_per_jiffy \
46 * 226LL;
47 unsigned loops = tmp >> 32;
48
49
50
51
52
53 __delay(loops);
54}
55
56extern void __bad_udelay(void);
57extern void __bad_ndelay(void);
58
59#define udelay(n) \
60 ({ \
61 if (__builtin_constant_p(n)) { \
62 if ((n) / __MAX_UDELAY >= 1) \
63 __bad_udelay(); \
64 else \
65 __udelay((n) * (19 * HZ)); \
66 } else { \
67 __udelay((n) * (19 * HZ)); \
68 } \
69 })
70
71#define ndelay(n) \
72 ({ \
73 if (__builtin_constant_p(n)) { \
74 if ((n) / __MAX_NDELAY >= 1) \
75 __bad_ndelay(); \
76 else \
77 __udelay((n) * HZ); \
78 } else { \
79 __udelay((n) * HZ); \
80 } \
81 })
82
83#define muldiv(a, b, c) (((a)*(b))/(c))
84
85#endif
86