ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / include / asm-sparc64 / delay.h
1 /* $Id: delay.h,v 1.13 2002/02/02 03:33:48 kanoj Exp $
2  * delay.h: Linux delay routines on the V9.
3  *
4  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu).
5  */
6
7 #ifndef __SPARC64_DELAY_H
8 #define __SPARC64_DELAY_H
9
10 #include <linux/config.h>
11 #include <linux/param.h>
12 #include <asm/cpudata.h>
13
14 #ifndef __ASSEMBLY__
15
16 static __inline__ void __delay(unsigned long loops)
17 {
18         __asm__ __volatile__(
19 "       b,pt    %%xcc, 1f\n"
20 "        cmp    %0, 0\n"
21 "       .align  32\n"
22 "1:\n"
23 "       bne,pt  %%xcc, 1b\n"
24 "        subcc  %0, 1, %0\n"
25         : "=&r" (loops)
26         : "0" (loops)
27         : "cc");
28 }
29
30 static __inline__ void __udelay(unsigned long usecs, unsigned long lps)
31 {
32         usecs *= 0x00000000000010c6UL;          /* 2**32 / 1000000 */
33
34         __asm__ __volatile__(
35 "       mulx    %1, %2, %0\n"
36 "       srlx    %0, 32, %0\n"
37         : "=r" (usecs)
38         : "r" (usecs), "r" (lps));
39
40         __delay(usecs * HZ);
41 }
42
43 extern __inline__ void __ndelay(unsigned long usecs, unsigned long lps)
44 {
45         usecs *= 0x0000000000000005UL;          /* 2**32 / 10000 */
46
47         __asm__ __volatile__(
48 "       mulx    %1, %2, %0\n"
49 "       srlx    %0, 32, %0\n"
50         : "=r" (usecs)
51         : "r" (usecs), "r" (lps));
52
53         __delay(usecs * HZ);
54 }
55
56 #define __udelay_val cpu_data(smp_processor_id()).udelay_val
57
58 #define udelay(usecs) __udelay((usecs),__udelay_val)
59 #define ndelay(usecs) __ndelay((usecs),__udelay_val)
60
61 #endif /* !__ASSEMBLY__ */
62
63 #endif /* defined(__SPARC64_DELAY_H) */