Fixes for the rtc clock on Netra X1 machines from PRs 15611 and 16816

by Takeshi Nakayama.
This commit is contained in:
eeh 2002-06-11 23:33:27 +00:00
parent 3593723af0
commit e98ab1d613
1 changed files with 20 additions and 20 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: clock.c,v 1.49 2002/03/20 18:54:49 eeh Exp $ */ /* $NetBSD: clock.c,v 1.50 2002/06/11 23:33:27 eeh Exp $ */
/* /*
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
@ -457,16 +457,15 @@ clockattach_rtc(parent, self, aux)
handle->todr_settime = rtc_settime; handle->todr_settime = rtc_settime;
handle->todr_getcal = rtc_getcal; handle->todr_getcal = rtc_getcal;
handle->todr_setcal = rtc_setcal; handle->todr_setcal = rtc_setcal;
/*
* Apparently on some machines the TOD registers are on the same
* physical page as the COM registers. So we won't protect them.
*/
handle->todr_setwen = NULL; handle->todr_setwen = NULL;
rtc->rtc_bt = bt; rtc->rtc_bt = bt;
rtc->rtc_bh = ci.ci_bh; rtc->rtc_bh = ci.ci_bh;
/* Our TOD clock year 0 is 1968 */ /* Our TOD clock year 0 is 0 */
rtc->rtc_year0 = 1968; /* XXX Really? */ rtc->rtc_year0 = 0;
/* Save info for the clock wenable call. */
ci.ci_bt = bt;
handle->bus_cookie = &ci;
handle->todr_setwen = clock_wenable;
todr_handle = handle; todr_handle = handle;
} }
@ -970,6 +969,9 @@ eeprom_uio(uio)
* RTC todr routines. * RTC todr routines.
*/ */
/* Loooks like Sun stores the century info somewhere in CMOS RAM */
#define MC_CENT 0x32
/* /*
* Get time-of-day and convert to a `struct timeval' * Get time-of-day and convert to a `struct timeval'
* Return 0 on success; an error number otherwise. * Return 0 on success; an error number otherwise.
@ -983,7 +985,7 @@ rtc_gettime(handle, tv)
bus_space_tag_t bt = rtc->rtc_bt; bus_space_tag_t bt = rtc->rtc_bt;
bus_space_handle_t bh = rtc->rtc_bh; bus_space_handle_t bh = rtc->rtc_bh;
struct clock_ymdhms dt; struct clock_ymdhms dt;
int year; int year, cent;
u_int8_t csr; u_int8_t csr;
todr_wenable(handle, 1); todr_wenable(handle, 1);
@ -1001,16 +1003,14 @@ rtc_gettime(handle, tv)
dt.dt_wday = rtc_read_reg(bt, bh, MC_DOW); dt.dt_wday = rtc_read_reg(bt, bh, MC_DOW);
dt.dt_mon = rtc_read_reg(bt, bh, MC_MONTH); dt.dt_mon = rtc_read_reg(bt, bh, MC_MONTH);
year = rtc_read_reg(bt, bh, MC_YEAR); year = rtc_read_reg(bt, bh, MC_YEAR);
printf("rtc_gettime: read y %x/%d m %x/%d wd %d d %x/%d " cent = rtc_read_reg(bt, bh, MC_CENT);
printf("rtc_gettime: read c %x/%d y %x/%d m %x/%d wd %d d %x/%d "
"h %x/%d m %x/%d s %x/%d\n", "h %x/%d m %x/%d s %x/%d\n",
year, year, dt.dt_mon, dt.dt_mon, dt.dt_wday, cent, cent, year, year, dt.dt_mon, dt.dt_mon, dt.dt_wday,
dt.dt_day, dt.dt_day, dt.dt_hour, dt.dt_hour, dt.dt_day, dt.dt_day, dt.dt_hour, dt.dt_hour,
dt.dt_min, dt.dt_min, dt.dt_sec, dt.dt_sec); dt.dt_min, dt.dt_min, dt.dt_sec, dt.dt_sec);
year += rtc->rtc_year0; year += cent * 100;
if (year < POSIX_BASE_YEAR && rtc_auto_century_adjust != 0)
year += 100;
dt.dt_year = year; dt.dt_year = year;
/* time wears on */ /* time wears on */
@ -1020,7 +1020,7 @@ printf("rtc_gettime: read y %x/%d m %x/%d wd %d d %x/%d "
todr_wenable(handle, 0); todr_wenable(handle, 0);
/* simple sanity checks */ /* simple sanity checks */
if (dt.dt_mon > 12 || dt.dt_day > 31 || if (dt.dt_year < 1970 || dt.dt_mon > 12 || dt.dt_day > 31 ||
dt.dt_hour >= 24 || dt.dt_min >= 60 || dt.dt_sec >= 60) dt.dt_hour >= 24 || dt.dt_min >= 60 || dt.dt_sec >= 60)
return (1); return (1);
@ -1043,14 +1043,13 @@ rtc_settime(handle, tv)
bus_space_handle_t bh = rtc->rtc_bh; bus_space_handle_t bh = rtc->rtc_bh;
struct clock_ymdhms dt; struct clock_ymdhms dt;
u_int8_t csr; u_int8_t csr;
int year; int year, cent;
/* Note: we ignore `tv_usec' */ /* Note: we ignore `tv_usec' */
clock_secs_to_ymdhms(tv->tv_sec, &dt); clock_secs_to_ymdhms(tv->tv_sec, &dt);
year = dt.dt_year - rtc->rtc_year0; year = dt.dt_year % 100;
if (year > 99 && rtc_auto_century_adjust != 0) cent = dt.dt_year / 100;
year -= 100;
todr_wenable(handle, 1); todr_wenable(handle, 1);
/* enable write */ /* enable write */
@ -1065,6 +1064,7 @@ rtc_settime(handle, tv)
rtc_write_reg(bt, bh, MC_DOM, dt.dt_day); rtc_write_reg(bt, bh, MC_DOM, dt.dt_day);
rtc_write_reg(bt, bh, MC_MONTH, dt.dt_mon); rtc_write_reg(bt, bh, MC_MONTH, dt.dt_mon);
rtc_write_reg(bt, bh, MC_YEAR, year); rtc_write_reg(bt, bh, MC_YEAR, year);
rtc_write_reg(bt, bh, MC_CENT, cent);
/* load them up */ /* load them up */
csr = rtc_read_reg(bt, bh, MC_REGB); csr = rtc_read_reg(bt, bh, MC_REGB);