diff options
| author | tsutsui <tsutsui@NetBSD.org> | 2003-11-24 06:20:40 +0000 |
|---|---|---|
| committer | tsutsui <tsutsui@NetBSD.org> | 2003-11-24 06:20:40 +0000 |
| commit | 9db2573fc85bde712a867a7c95cb47ee9c1a55dd (patch) | |
| tree | 035c83b2b512d3e86a5efaf3fdfb1c73e3415a3a /sys/dev | |
| parent | 130aed8e4065d8d1ee7c3b29cf84257fd58544d7 (diff) | |
Handle BCD mode properly.
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/ic/mc146818.c | 40 | ||||
| -rw-r--r-- | sys/dev/ic/mc146818var.h | 4 |
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); |
