X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=include%2Fasm-sparc64%2Fdelay.h;h=2901ea0c342d9a231147ee1d1ebdb7e4c6ba772b;hb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;hp=13de4b10f70954c717c17498c37bae3f5804b6ce;hpb=a2c21200f1c81b08cb55e417b68150bba439b646;p=linux-2.6.git diff --git a/include/asm-sparc64/delay.h b/include/asm-sparc64/delay.h index 13de4b10f..2901ea0c3 100644 --- a/include/asm-sparc64/delay.h +++ b/include/asm-sparc64/delay.h @@ -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 @@ -13,50 +17,21 @@ #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__ */