summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authortsutsui <tsutsui@NetBSD.org>2003-11-24 06:20:40 +0000
committertsutsui <tsutsui@NetBSD.org>2003-11-24 06:20:40 +0000
commit9db2573fc85bde712a867a7c95cb47ee9c1a55dd (patch)
tree035c83b2b512d3e86a5efaf3fdfb1c73e3415a3a /sys/dev
parent130aed8e4065d8d1ee7c3b29cf84257fd58544d7 (diff)
Handle BCD mode properly.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ic/mc146818.c40
-rw-r--r--sys/dev/ic/mc146818var.h4
2 files changed, 27 insertions, 17 deletions
diff --git a/sys/dev/ic/mc146818.c b/sys/dev/ic/mc146818.c
index 1efcbce78f3..64779b5db21 100644
--- a/sys/dev/ic/mc146818.c
+++ b/sys/dev/ic/mc146818.c
@@ -1,4 +1,4 @@
-/* $NetBSD: mc146818.c,v 1.3 2003/11/01 21:58:43 tsutsui Exp $ */
+/* $NetBSD: mc146818.c,v 1.4 2003/11/24 06:20:40 tsutsui Exp $ */
/*
* Copyright (c) 2003 Izumi Tsutsui. All rights reserved.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mc146818.c,v 1.3 2003/11/01 21:58:43 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mc146818.c,v 1.4 2003/11/24 06:20:40 tsutsui Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -103,18 +103,22 @@ mc146818_gettime(handle, tv)
}
}
- dt.dt_sec = (*sc->sc_mcread)(sc, MC_SEC);
- dt.dt_min = (*sc->sc_mcread)(sc, MC_MIN);
- dt.dt_hour = (*sc->sc_mcread)(sc, MC_HOUR);
- dt.dt_wday = (*sc->sc_mcread)(sc, MC_DOW);
- dt.dt_day = (*sc->sc_mcread)(sc, MC_DOM);
- dt.dt_mon = (*sc->sc_mcread)(sc, MC_MONTH);
- year = (*sc->sc_mcread)(sc, MC_YEAR);
+#define FROMREG(x) ((sc->sc_flag & MC146818_BCD) ? FROMBCD(x) : (x))
+
+ dt.dt_sec = FROMREG((*sc->sc_mcread)(sc, MC_SEC));
+ dt.dt_min = FROMREG((*sc->sc_mcread)(sc, MC_MIN));
+ dt.dt_hour = FROMREG((*sc->sc_mcread)(sc, MC_HOUR));
+ dt.dt_wday = FROMREG((*sc->sc_mcread)(sc, MC_DOW));
+ dt.dt_day = FROMREG((*sc->sc_mcread)(sc, MC_DOM));
+ dt.dt_mon = FROMREG((*sc->sc_mcread)(sc, MC_MONTH));
+ year = FROMREG((*sc->sc_mcread)(sc, MC_YEAR));
if (sc->sc_getcent) {
cent = (*sc->sc_getcent)(sc);
year += cent * 100;
}
+#undef FROMREG
+
year += sc->sc_year0;
if (year < POSIX_BASE_YEAR &&
(sc->sc_flag & MC146818_NO_CENT_ADJUST) == 0)
@@ -168,12 +172,14 @@ mc146818_settime(handle, tv)
}
}
- (*sc->sc_mcwrite)(sc, MC_SEC, dt.dt_sec);
- (*sc->sc_mcwrite)(sc, MC_MIN, dt.dt_min);
- (*sc->sc_mcwrite)(sc, MC_HOUR, dt.dt_hour);
- (*sc->sc_mcwrite)(sc, MC_DOW, dt.dt_wday);
- (*sc->sc_mcwrite)(sc, MC_DOM, dt.dt_day);
- (*sc->sc_mcwrite)(sc, MC_MONTH, dt.dt_mon);
+#define TOREG(x) ((sc->sc_flag & MC146818_BCD) ? TOBCD(x) : (x))
+
+ (*sc->sc_mcwrite)(sc, MC_SEC, TOREG(dt.dt_sec));
+ (*sc->sc_mcwrite)(sc, MC_MIN, TOREG(dt.dt_min));
+ (*sc->sc_mcwrite)(sc, MC_HOUR, TOREG(dt.dt_hour));
+ (*sc->sc_mcwrite)(sc, MC_DOW, TOREG(dt.dt_wday));
+ (*sc->sc_mcwrite)(sc, MC_DOM, TOREG(dt.dt_day));
+ (*sc->sc_mcwrite)(sc, MC_MONTH, TOREG(dt.dt_mon));
year = dt.dt_year - sc->sc_year0;
if (sc->sc_setcent) {
@@ -184,7 +190,9 @@ mc146818_settime(handle, tv)
if (year > 99 &&
(sc->sc_flag & MC146818_NO_CENT_ADJUST) == 0)
year -= 100;
- (*sc->sc_mcwrite)(sc, MC_YEAR, year);
+ (*sc->sc_mcwrite)(sc, MC_YEAR, TOREG(year));
+
+#undef TOREG
todr_wenable(handle, 0);
diff --git a/sys/dev/ic/mc146818var.h b/sys/dev/ic/mc146818var.h
index 0a3fc5ddbcb..279d33f2de4 100644
--- a/sys/dev/ic/mc146818var.h
+++ b/sys/dev/ic/mc146818var.h
@@ -1,4 +1,4 @@
-/* $NetBSD: mc146818var.h,v 1.2 2003/11/01 21:58:43 tsutsui Exp $ */
+/* $NetBSD: mc146818var.h,v 1.3 2003/11/24 06:20:40 tsutsui Exp $ */
/*
* Copyright (c) 2003 Izumi Tsutsui. All rights reserved.
@@ -36,6 +36,8 @@ struct mc146818_softc {
u_int sc_year0; /* year counter offset */
u_int sc_flag; /* MD flags */
#define MC146818_NO_CENT_ADJUST 0x0001 /* don't adjust century */
+#define MC146818_BCD 0x0002 /* use BCD mode */
+#define MC146818_12HR 0x0004 /* use AM/PM mode */
/* MD chip register read/write functions */
u_int (*sc_mcread)(struct mc146818_softc *, u_int);