0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/processor.h>
0010 #include <linux/delay.h>
0011 #include <asm/div64.h>
0012 #include <asm/timex.h>
0013
0014 void __delay(unsigned long loops)
0015 {
0016
0017
0018
0019
0020
0021
0022
0023 asm volatile("0: brct %0,0b" : : "d" ((loops/2) + 1));
0024 }
0025 EXPORT_SYMBOL(__delay);
0026
0027 static void delay_loop(unsigned long delta)
0028 {
0029 unsigned long end;
0030
0031 end = get_tod_clock_monotonic() + delta;
0032 while (!tod_after(get_tod_clock_monotonic(), end))
0033 cpu_relax();
0034 }
0035
0036 void __udelay(unsigned long usecs)
0037 {
0038 delay_loop(usecs << 12);
0039 }
0040 EXPORT_SYMBOL(__udelay);
0041
0042 void __ndelay(unsigned long nsecs)
0043 {
0044 nsecs <<= 9;
0045 do_div(nsecs, 125);
0046 delay_loop(nsecs);
0047 }
0048 EXPORT_SYMBOL(__ndelay);