summaryrefslogtreecommitdiffstats
path: root/arch/i386/lib
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1997-12-06 23:51:34 +0000
committerRalf Baechle <ralf@linux-mips.org>1997-12-06 23:51:34 +0000
commit230e5ab6a084ed50470f101934782dbf54b0d06b (patch)
tree5dd821c8d33f450470588e7a543f74bf74306e9e /arch/i386/lib
parentc9b1c8a64c6444d189856f1e26bdcb8b4cd0113a (diff)
Merge with Linux 2.1.67.
Diffstat (limited to 'arch/i386/lib')
-rw-r--r--arch/i386/lib/Makefile2
-rw-r--r--arch/i386/lib/delay.c45
2 files changed, 46 insertions, 1 deletions
diff --git a/arch/i386/lib/Makefile b/arch/i386/lib/Makefile
index 7ea3f1e29..6b76e32d6 100644
--- a/arch/i386/lib/Makefile
+++ b/arch/i386/lib/Makefile
@@ -11,6 +11,6 @@ else
endif
L_TARGET = lib.a
-L_OBJS = checksum.o semaphore.o locks.o
+L_OBJS = checksum.o semaphore.o locks.o delay.o
include $(TOPDIR)/Rules.make
diff --git a/arch/i386/lib/delay.c b/arch/i386/lib/delay.c
new file mode 100644
index 000000000..c3c29a7d9
--- /dev/null
+++ b/arch/i386/lib/delay.c
@@ -0,0 +1,45 @@
+/*
+ * Precise Delay Loops for i386
+ *
+ * Copyright (C) 1993 Linus Torvalds
+ * Copyright (C) 1997 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
+ *
+ * The __delay function must _NOT_ be inlined as its execution time
+ * depends wildly on alignment on many x86 processors.
+ */
+
+#include <linux/sched.h>
+#include <asm/delay.h>
+
+#ifdef __SMP__
+#include <asm/smp.h>
+#endif
+
+#ifdef __SMP__
+#define __udelay_val cpu_data[smp_processor_id()].udelay_val
+#else
+#define __udelay_val loops_per_sec
+#endif
+
+void __delay(unsigned long loops)
+{
+ __asm__ __volatile__(
+ "1:\tdecl %0\n\tjns 1b"
+ :/* no outputs */
+ :"a" (loops)
+ :"ax");
+}
+
+inline void __const_udelay(unsigned long xloops)
+{
+ __asm__("mull %0"
+ :"=d" (xloops)
+ :"a" (xloops),"0" (__udelay_val)
+ :"ax");
+ __delay(xloops);
+}
+
+void __udelay(unsigned long usecs)
+{
+ __const_udelay(usecs * 0x000010c6); /* 2**32 / 1000000 */
+}