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
@ -457,16 +457,15 @@ clockattach_rtc(parent, self, aux)
handle->todr_settime = rtc_settime;
handle->todr_getcal = rtc_getcal;
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;
rtc->rtc_bt = bt;
rtc->rtc_bh = ci.ci_bh;
/* Our TOD clock year 0 is 1968 */
rtc->rtc_year0 = 1968; /* XXX Really? */
/* Save info for the clock wenable call. */
ci.ci_bt = bt;
handle->bus_cookie = &ci;
handle->todr_setwen = clock_wenable;
/* Our TOD clock year 0 is 0 */
rtc->rtc_year0 = 0;
todr_handle = handle;
}
@ -970,6 +969,9 @@ eeprom_uio(uio)
* 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'
* 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_handle_t bh = rtc->rtc_bh;
struct clock_ymdhms dt;
int year;
int year, cent;
u_int8_t csr;
todr_wenable(handle, 1);
@ -1001,16 +1003,14 @@ rtc_gettime(handle, tv)
dt.dt_wday = rtc_read_reg(bt, bh, MC_DOW);
dt.dt_mon = rtc_read_reg(bt, bh, MC_MONTH);
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",
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_min, dt.dt_min, dt.dt_sec, dt.dt_sec);
year += rtc->rtc_year0;
if (year < POSIX_BASE_YEAR && rtc_auto_century_adjust != 0)
year += 100;
year += cent * 100;
dt.dt_year = year;
/* 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);
/* 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)
return (1);
@ -1043,14 +1043,13 @@ rtc_settime(handle, tv)
bus_space_handle_t bh = rtc->rtc_bh;
struct clock_ymdhms dt;
u_int8_t csr;
int year;
int year, cent;
/* Note: we ignore `tv_usec' */
clock_secs_to_ymdhms(tv->tv_sec, &dt);
year = dt.dt_year - rtc->rtc_year0;
if (year > 99 && rtc_auto_century_adjust != 0)
year -= 100;
year = dt.dt_year % 100;
cent = dt.dt_year / 100;
todr_wenable(handle, 1);
/* 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_MONTH, dt.dt_mon);
rtc_write_reg(bt, bh, MC_YEAR, year);
rtc_write_reg(bt, bh, MC_CENT, cent);
/* load them up */
csr = rtc_read_reg(bt, bh, MC_REGB);