| /* delay.c: Delay loops for sparc64 | |
| * | |
| * Copyright (C) 2004, 2006 David S. Miller <davem@davemloft.net> | |
| * | |
| * Based heavily upon x86 variant which is: | |
| * Copyright (C) 1993 Linus Torvalds | |
| * Copyright (C) 1997 Martin Mares <mj@atrey.karlin.mff.cuni.cz> | |
| */ | |
| #include <linux/delay.h> | |
| #include <asm/timer.h> | |
| void __delay(unsigned long loops) | |
| { | |
| unsigned long bclock, now; | |
| bclock = tick_ops->get_tick(); | |
| do { | |
| now = tick_ops->get_tick(); | |
| } while ((now-bclock) < loops); | |
| } | |
| /* 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(raw_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); | |
| } |