/* delay.c: Delay loops for sparc64 * * Copyright (C) 2004 David S. Miller * * Based heavily upon x86 variant which is: * Copyright (C) 1993 Linus Torvalds * Copyright (C) 1997 Martin Mares */ #include 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"); } /* We used to multiply by HZ after shifting down by 32 bits * but that runs into problems for higher values of HZ and * slow cpus. */ void __const_udelay(unsigned long n) { n *= 4; n *= (cpu_data(_smp_processor_id()).udelay_val * (HZ/4)); n >>= 32; __delay(n + 1); } void __udelay(unsigned long n) { __const_udelay(n * 0x10c7UL); } void __ndelay(unsigned long n) { __const_udelay(n * 0x5UL); }