Module Name:    src
Committed By:   matt
Date:           Tue Jan  4 01:28:15 UTC 2011

Modified Files:
        src/sys/dev/ic: mk48txx.c mk48txxreg.h mk48txxvar.h

Log Message:
Make this support the DS1553 as well.  Add support for the centry reg which
newer RTCs seem to have.


To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/sys/dev/ic/mk48txx.c
cvs rdiff -u -r1.10 -r1.11 src/sys/dev/ic/mk48txxreg.h
cvs rdiff -u -r1.6 -r1.7 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.26
--- src/sys/dev/ic/mk48txx.c:1.25	Mon Apr 28 20:23:50 2008
+++ src/sys/dev/ic/mk48txx.c	Tue Jan  4 01:28:15 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: mk48txx.c,v 1.25 2008/04/28 20:23:50 martin Exp $ */
+/*	$NetBSD: mk48txx.c,v 1.26 2011/01/04 01:28:15 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.26 2011/01/04 01:28:15 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.11
--- src/sys/dev/ic/mk48txxreg.h:1.10	Mon Apr 28 20:23:50 2008
+++ src/sys/dev/ic/mk48txxreg.h	Tue Jan  4 01:28:15 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: mk48txxreg.h,v 1.10 2008/04/28 20:23:50 martin Exp $ */
+/*	$NetBSD: mk48txxreg.h,v 1.11 2011/01/04 01:28:15 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.7
--- src/sys/dev/ic/mk48txxvar.h:1.6	Mon Apr 28 20:23:50 2008
+++ src/sys/dev/ic/mk48txxvar.h	Tue Jan  4 01:28:15 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: mk48txxvar.h,v 1.6 2008/04/28 20:23:50 martin Exp $ */
+/*	$NetBSD: mk48txxvar.h,v 1.7 2011/01/04 01:28:15 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 */

Reply via email to