This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / arch / sh64 / lib / udelay.c
diff --git a/arch/sh64/lib/udelay.c b/arch/sh64/lib/udelay.c
new file mode 100644 (file)
index 0000000..dad2f25
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * arch/sh64/lib/udelay.c
+ *
+ * Delay routines, using a pre-computed "loops_per_jiffy" value.
+ *
+ * Copyright (C) 2000, 2001  Paolo Alberelli
+ * Copyright (C) 2003, 2004  Paul Mundt
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#include <linux/config.h>
+#include <linux/sched.h>
+#include <asm/param.h>
+
+extern unsigned long loops_per_jiffy;
+
+/*
+ * Use only for very small delays (< 1 msec).
+ *
+ * The active part of our cycle counter is only 32-bits wide, and
+ * we're treating the difference between two marks as signed.  On
+ * a 1GHz box, that's about 2 seconds.
+ */
+
+void __delay(int loops)
+{
+       long long dummy;
+       __asm__ __volatile__("gettr     tr0, %1\n\t"
+                            "pta       $+4, tr0\n\t"
+                            "addi      %0, -1, %0\n\t"
+                            "bne       %0, r63, tr0\n\t"
+                            "ptabs     %1, tr0\n\t":"=r"(loops),
+                            "=r"(dummy)
+                            :"0"(loops));
+}
+
+void __udelay(unsigned long long usecs, unsigned long lpj)
+{
+       usecs *= (((unsigned long long) HZ << 32) / 1000000) * lpj;
+       __delay((long long) usecs >> 32);
+}
+
+void __ndelay(unsigned long long nsecs, unsigned long lpj)
+{
+       nsecs *= (((unsigned long long) HZ << 32) / 1000000000) * lpj;
+       __delay((long long) nsecs >> 32);
+}
+
+void udelay(unsigned long usecs)
+{
+       __udelay(usecs, loops_per_jiffy);
+}
+
+void ndelay(unsigned long nsecs)
+{
+       __ndelay(nsecs, loops_per_jiffy);
+}
+