diff options
Diffstat (limited to 'arch/sparc64/lib/delay.c')
-rw-r--r-- | arch/sparc64/lib/delay.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/arch/sparc64/lib/delay.c b/arch/sparc64/lib/delay.c new file mode 100644 index 000000000000..f6b4c784d53e --- /dev/null +++ b/arch/sparc64/lib/delay.c | |||
@@ -0,0 +1,49 @@ | |||
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(_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 | } | ||