]> git.hungrycats.org Git - linux/commitdiff
[PATCH] add headers for upd4990a rtc/clock driver
authorAlan Cox <alan@lxorguk.ukuu.org.uk>
Fri, 21 Mar 2003 10:26:37 +0000 (02:26 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Fri, 21 Mar 2003 10:26:37 +0000 (02:26 -0800)
include/asm-i386/upd4990a.h [new file with mode: 0644]

diff --git a/include/asm-i386/upd4990a.h b/include/asm-i386/upd4990a.h
new file mode 100644 (file)
index 0000000..de4f4ed
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ *  Architecture dependent definitions
+ *  for NEC uPD4990A serial I/O real-time clock.
+ *
+ *  Copyright 2001  TAKAI Kousuke <tak@kmc.kyoto-u.ac.jp>
+ *                 Kyoto University Microcomputer Club (KMC).
+ *
+ *  References:
+ *     uPD4990A serial I/O real-time clock users' manual (Japanese)
+ *     No. S12828JJ4V0UM00 (4th revision), NEC Corporation, 1999.
+ */
+
+#ifndef _ASM_I386_uPD4990A_H
+#define _ASM_I386_uPD4990A_H
+
+#include <asm/io.h>
+
+#define UPD4990A_IO            (0x0020)
+#define UPD4990A_IO_DATAOUT    (0x0033)
+
+#define UPD4990A_OUTPUT_DATA_CLK(data, clk)            \
+       outb((((data) & 1) << 5) | (((clk) & 1) << 4)   \
+             | UPD4990A_PAR_SERIAL_MODE, UPD4990A_IO)
+
+#define UPD4990A_OUTPUT_CLK(clk)       UPD4990A_OUTPUT_DATA_CLK(0, (clk))
+
+#define UPD4990A_OUTPUT_STROBE(stb) \
+       outb(((stb) << 3) | UPD4990A_PAR_SERIAL_MODE, UPD4990A_IO)
+
+/*
+ * Note: udelay() is *not* usable for UPD4990A_DELAY because
+ *      the Linux kernel reads uPD4990A to set up system clock
+ *      before calibrating delay...
+ */
+#define UPD4990A_DELAY(usec)                                           \
+       do {                                                            \
+               if (__builtin_constant_p((usec)) && (usec) < 5) \
+                       __asm__ (".rept %c1\n\toutb %%al,%0\n\t.endr"   \
+                                : : "N" (0x5F),                        \
+                                    "i" (((usec) * 10 + 5) / 6));      \
+               else {                                                  \
+                       int _count = ((usec) * 10 + 5) / 6;             \
+                       __asm__ volatile ("1: outb %%al,%1\n\tloop 1b"  \
+                                         : "=c" (_count)               \
+                                         : "N" (0x5F), "0" (_count));  \
+               }                                                       \
+       } while (0)
+
+/* Caller should ignore all bits except bit0 */
+#define UPD4990A_READ_DATA()   inb(UPD4990A_IO_DATAOUT)
+
+#endif