| /* 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); |
| } |