vserver 1.9.3
[linux-2.6.git] / include / asm-sparc64 / delay.h
index 13de4b1..2901ea0 100644 (file)
@@ -1,7 +1,11 @@
-/* $Id: delay.h,v 1.13 2002/02/02 03:33:48 kanoj Exp $
- * delay.h: Linux delay routines on the V9.
+/* delay.h: Linux delay routines on sparc64.
  *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu).
+ * Copyright (C) 1996, 2004 David S. Miller (davem@davemloft.net).
+ *
+ * Based heavily upon x86 variant which is:
+ * Copyright (C) 1993 Linus Torvalds
+ *
+ * Delay routines calling functions in arch/sparc64/lib/delay.c
  */
 
 #ifndef __SPARC64_DELAY_H
 
 #ifndef __ASSEMBLY__
 
-static __inline__ void __delay(unsigned long loops)
-{
-       __asm__ __volatile__(
-"      b,pt    %%xcc, 1f\n"
-"       cmp    %0, 0\n"
-"      .align  32\n"
-"1:\n"
-"      bne,pt  %%xcc, 1b\n"
-"       subcc  %0, 1, %0\n"
-       : "=&r" (loops)
-       : "0" (loops)
-       : "cc");
-}
-
-static __inline__ void __udelay(unsigned long usecs, unsigned long lps)
-{
-       usecs *= 0x00000000000010c6UL;          /* 2**32 / 1000000 */
-
-       __asm__ __volatile__(
-"      mulx    %1, %2, %0\n"
-"      srlx    %0, 32, %0\n"
-       : "=r" (usecs)
-       : "r" (usecs), "r" (lps));
-
-       __delay(usecs * HZ);
-}
-
-extern __inline__ void __ndelay(unsigned long usecs, unsigned long lps)
-{
-       usecs *= 0x0000000000000005UL;          /* 2**32 / 10000 */
-
-       __asm__ __volatile__(
-"      mulx    %1, %2, %0\n"
-"      srlx    %0, 32, %0\n"
-       : "=r" (usecs)
-       : "r" (usecs), "r" (lps));
-
-       __delay(usecs * HZ);
-}
-
-#define __udelay_val cpu_data(smp_processor_id()).udelay_val
-
-#define udelay(usecs) __udelay((usecs),__udelay_val)
-#define ndelay(usecs) __ndelay((usecs),__udelay_val)
+extern void __bad_udelay(void);
+extern void __bad_ndelay(void);
+
+extern void __udelay(unsigned long usecs);
+extern void __ndelay(unsigned long nsecs);
+extern void __const_udelay(unsigned long usecs);
+extern void __delay(unsigned long loops);
+
+#define udelay(n) (__builtin_constant_p(n) ? \
+       ((n) > 20000 ? __bad_udelay() : __const_udelay((n) * 0x10c7ul)) : \
+       __udelay(n))
+       
+#define ndelay(n) (__builtin_constant_p(n) ? \
+       ((n) > 20000 ? __bad_ndelay() : __const_udelay((n) * 5ul)) : \
+       __ndelay(n))
 
 #endif /* !__ASSEMBLY__ */