1 #ifndef _PPC64_DELAY_H
2 #define _PPC64_DELAY_H
3 
4 /*
5  * Copyright 1996, Paul Mackerras.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version
10  * 2 of the License, or (at your option) any later version.
11  *
12  * PPC64 Support added by Dave Engebretsen, Todd Inglett, Mike Corrigan,
13  * Anton Blanchard.
14  */
15 
16 #ifndef __ASSEMBLY__
17 extern unsigned long tb_ticks_per_usec;
18 
19 /* define these here to prevent circular dependencies */
20 #define __HMT_low()	asm volatile("or 1,1,1")
21 #define __HMT_medium()	asm volatile("or 2,2,2")
22 #define __barrier()	asm volatile("":::"memory")
23 
__get_tb(void)24 static inline unsigned long __get_tb(void)
25 {
26 	unsigned long rval;
27 
28 	asm volatile("mftb %0" : "=r" (rval));
29 	return rval;
30 }
31 
__delay(unsigned long loops)32 static inline void __delay(unsigned long loops)
33 {
34 	unsigned long start = __get_tb();
35 
36 	while((__get_tb()-start) < loops)
37 		__HMT_low();
38 	__HMT_medium();
39 	__barrier();
40 }
41 
udelay(unsigned long usecs)42 static inline void udelay(unsigned long usecs)
43 {
44 	unsigned long loops = tb_ticks_per_usec * usecs;
45 
46 	__delay(loops);
47 }
48 
ndelay(unsigned long nsecs)49 static inline void ndelay(unsigned long nsecs)
50 {
51 	unsigned long loops = (tb_ticks_per_usec * nsecs) / 1000;
52 
53 	__delay(loops);
54 }
55 #endif /* !__ASSEMBLY__ */
56 
57 #endif /* _PPC64_DELAY_H */
58