Module Name: src
Committed By: matt
Date: Fri Jan 7 02:30:16 UTC 2011
Modified Files:
src/sys/dev/ic [matt-nb5-pq3]: mk48txx.c mk48txxreg.h mk48txxvar.h
Log Message:
Add DS1553 support
To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.25.26.1 src/sys/dev/ic/mk48txx.c
cvs rdiff -u -r1.10 -r1.10.26.1 src/sys/dev/ic/mk48txxreg.h
cvs rdiff -u -r1.6 -r1.6.26.1 src/sys/dev/ic/mk48txxvar.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/ic/mk48txx.c
diff -u src/sys/dev/ic/mk48txx.c:1.25 src/sys/dev/ic/mk48txx.c:1.25.26.1
--- src/sys/dev/ic/mk48txx.c:1.25 Mon Apr 28 20:23:50 2008
+++ src/sys/dev/ic/mk48txx.c Fri Jan 7 02:30:16 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: mk48txx.c,v 1.25 2008/04/28 20:23:50 martin Exp $ */
+/* $NetBSD: mk48txx.c,v 1.25.26.1 2011/01/07 02:30:16 matt Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mk48txx.c,v 1.25 2008/04/28 20:23:50 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mk48txx.c,v 1.25.26.1 2011/01/07 02:30:16 matt Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -50,7 +50,7 @@
uint8_t mk48txx_def_nvrd(struct mk48txx_softc *, int);
void mk48txx_def_nvwr(struct mk48txx_softc *, int, uint8_t);
-struct {
+const struct {
const char *name;
bus_size_t nvramsz;
bus_size_t clkoff;
@@ -61,6 +61,7 @@
{ "mk48t08", MK48T08_CLKSZ, MK48T08_CLKOFF, 0 },
{ "mk48t18", MK48T18_CLKSZ, MK48T18_CLKOFF, 0 },
{ "mk48t59", MK48T59_CLKSZ, MK48T59_CLKOFF, MK48TXX_EXT_REGISTERS },
+ { "ds1553", DS1553_CLKSZ, DS1553_CLKOFF, MK48TXX_EXT_REGISTERS },
};
void
@@ -127,10 +128,14 @@
dt->dt_mon = FROMBCD((*sc->sc_nvrd)(sc, clkoff + MK48TXX_IMON));
year = FROMBCD((*sc->sc_nvrd)(sc, clkoff + MK48TXX_IYEAR));
- year += sc->sc_year0;
- if (year < POSIX_BASE_YEAR &&
- (sc->sc_flag & MK48TXX_NO_CENT_ADJUST) == 0)
- year += 100;
+ if (sc->sc_flag & MK48TXX_HAVE_CENT_REG) {
+ year += 100*FROMBCD(csr & MK48TXX_CSR_CENT_MASK);
+ } else {
+ year += sc->sc_year0;
+ if (year < POSIX_BASE_YEAR &&
+ (sc->sc_flag & MK48TXX_NO_CENT_ADJUST) == 0)
+ year += 100;
+ }
dt->dt_year = year;
@@ -154,14 +159,21 @@
bus_size_t clkoff;
uint8_t csr;
int year;
+ int cent;
sc = handle->cookie;
clkoff = sc->sc_clkoffset;
- year = dt->dt_year - sc->sc_year0;
- if (year > 99 &&
- (sc->sc_flag & MK48TXX_NO_CENT_ADJUST) == 0)
- year -= 100;
+ if ((sc->sc_flag & MK48TXX_HAVE_CENT_REG) == 0) {
+ cent = 0;
+ year = dt->dt_year - sc->sc_year0;
+ if (year > 99 &&
+ (sc->sc_flag & MK48TXX_NO_CENT_ADJUST) == 0)
+ year -= 100;
+ } else {
+ cent = dt->dt_year / 100;
+ year = dt->dt_year % 100;
+ }
todr_wenable(handle, 1);
/* enable write */
@@ -177,6 +189,17 @@
(*sc->sc_nvwr)(sc, clkoff + MK48TXX_IMON, TOBCD(dt->dt_mon));
(*sc->sc_nvwr)(sc, clkoff + MK48TXX_IYEAR, TOBCD(year));
+ /*
+ * If we have a century register and the century has changed
+ * update it.
+ */
+ if ((sc->sc_flag & MK48TXX_HAVE_CENT_REG)
+ && (csr & MK48TXX_CSR_CENT_MASK) != TOBCD(cent)) {
+ csr &= ~MK48TXX_CSR_CENT_MASK;
+ csr |= MK48TXX_CSR_CENT_MASK & TOBCD(cent);
+ (*sc->sc_nvwr)(sc, clkoff + MK48TXX_ICSR, csr);
+ }
+
/* load them up */
csr = (*sc->sc_nvrd)(sc, clkoff + MK48TXX_ICSR);
csr &= ~MK48TXX_CSR_WRITE;
Index: src/sys/dev/ic/mk48txxreg.h
diff -u src/sys/dev/ic/mk48txxreg.h:1.10 src/sys/dev/ic/mk48txxreg.h:1.10.26.1
--- src/sys/dev/ic/mk48txxreg.h:1.10 Mon Apr 28 20:23:50 2008
+++ src/sys/dev/ic/mk48txxreg.h Fri Jan 7 02:30:16 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: mk48txxreg.h,v 1.10 2008/04/28 20:23:50 martin Exp $ */
+/* $NetBSD: mk48txxreg.h,v 1.10.26.1 2011/01/07 02:30:16 matt Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -57,7 +57,7 @@
#define MK48TXX_IADAY 5 /* alarm day (1..31; BCD) */
#define MK48TXX_IINTR 6 /* interrupts */
#define MK48TXX_IWDOG 7 /* watchdog */
-#define MK48TXX_ICSR 8 /* control register */
+#define MK48TXX_ICSR 8 /* control register / century (DS1553) */
#define MK48TXX_ISEC 9 /* seconds (0..59; BCD) */
#define MK48TXX_IMIN 10 /* minutes (0..59; BCD) */
#define MK48TXX_IHOUR 11 /* hour (0..23; BCD) */
@@ -88,6 +88,7 @@
/* Bits in the control register */
#define MK48TXX_CSR_WRITE 0x80 /* want to write */
#define MK48TXX_CSR_READ 0x40 /* want to read (freeze clock) */
+#define MK48TXX_CSR_CENT_MASK 0x3f /* century mask */
/* Bit in the weekday register */
#define MK48TXX_WDAY_FT 0x40 /* freq test: toggle sec[0] at 512Hz */
@@ -109,3 +110,6 @@
#define MK48T59_CLKSZ 8192
#define MK48T59_CLKOFF 0x1ff0
+
+#define DS1553_CLKSZ 8192
+#define DS1553_CLKOFF 0x1ff0
Index: src/sys/dev/ic/mk48txxvar.h
diff -u src/sys/dev/ic/mk48txxvar.h:1.6 src/sys/dev/ic/mk48txxvar.h:1.6.26.1
--- src/sys/dev/ic/mk48txxvar.h:1.6 Mon Apr 28 20:23:50 2008
+++ src/sys/dev/ic/mk48txxvar.h Fri Jan 7 02:30:16 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: mk48txxvar.h,v 1.6 2008/04/28 20:23:50 martin Exp $ */
+/* $NetBSD: mk48txxvar.h,v 1.6.26.1 2011/01/07 02:30:16 matt Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -48,6 +48,7 @@
counter at 0 */
u_int sc_flag;
#define MK48TXX_NO_CENT_ADJUST 0x0001
+#define MK48TXX_HAVE_CENT_REG 0x0002
mk48txx_nvrd_t sc_nvrd; /* NVRAM/RTC read function */
mk48txx_nvwr_t sc_nvwr; /* NVRAM/RTC write function */