Linux-2.6.12-rc2
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / arch / sparc64 / lib / delay.c
blobf6b4c784d53e05111fbda459f465c04d20c8cc43
1 /* delay.c: Delay loops for sparc64
3 * Copyright (C) 2004 David S. Miller <davem@redhat.com>
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 */
10 #include <linux/delay.h>
12 void __delay(unsigned long loops)
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");
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.
30 void __const_udelay(unsigned long n)
32 n *= 4;
34 n *= (cpu_data(_smp_processor_id()).udelay_val * (HZ/4));
35 n >>= 32;
37 __delay(n + 1);
40 void __udelay(unsigned long n)
42 __const_udelay(n * 0x10c7UL);
46 void __ndelay(unsigned long n)
48 __const_udelay(n * 0x5UL);