Merge upstream (approx. 2.6.12-git8) into 'janitor' branch of netdev-2.6.
[linux-2.6] / arch / sparc64 / lib / delay.c
1 /* delay.c: Delay loops for sparc64
2  *
3  * Copyright (C) 2004 David S. Miller <davem@redhat.com>
4  *
5  * Based heavily upon x86 variant which is:
6  *      Copyright (C) 1993 Linus Torvalds
7  *      Copyright (C) 1997 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
8  */
9
10 #include <linux/delay.h>
11
12 void __delay(unsigned long loops)
13 {
14         __asm__ __volatile__(
15 "       b,pt    %%xcc, 1f\n"
16 "        cmp    %0, 0\n"
17 "       .align  32\n"
18 "1:\n"
19 "       bne,pt  %%xcc, 1b\n"
20 "        subcc  %0, 1, %0\n"
21         : "=&r" (loops)
22         : "0" (loops)
23         : "cc");
24 }
25
26 /* We used to multiply by HZ after shifting down by 32 bits
27  * but that runs into problems for higher values of HZ and
28  * slow cpus.
29  */
30 void __const_udelay(unsigned long n)
31 {
32         n *= 4;
33
34         n *= (cpu_data(raw_smp_processor_id()).udelay_val * (HZ/4));
35         n >>= 32;
36
37         __delay(n + 1);
38 }
39
40 void __udelay(unsigned long n)
41 {
42         __const_udelay(n * 0x10c7UL);
43 }
44
45
46 void __ndelay(unsigned long n)
47 {
48         __const_udelay(n * 0x5UL);
49 }