? arch/hpcsh/compile/GENERIC ? arch/hpcsh/compile/HPW650PA ? arch/hpcsh/compile/RAMDISK Index: arch/hpcsh/hpcsh/autoconf.c =================================================================== RCS file: /cvsroot/src/sys/arch/hpcsh/hpcsh/autoconf.c,v retrieving revision 1.22 diff -u -r1.22 autoconf.c --- arch/hpcsh/hpcsh/autoconf.c 18 Mar 2009 10:22:30 -0000 1.22 +++ arch/hpcsh/hpcsh/autoconf.c 3 May 2010 13:47:20 -0000 @@ -93,6 +93,8 @@ #include #include +#include +#include #include #include @@ -148,6 +150,32 @@ strncpy(booted_device_name, cp, 16); } +void +device_register(device_t dev, void *aux) +{ + device_t parent; + + parent = device_parent(dev); + + if (device_is_a(dev, "rtc") && + parent != NULL && device_is_a(parent, "shb") && + platid_match(&platid, &platid_mask_MACH_HITACHI_PERSONA_HPW50PAD)) { + prop_number_t rtc_baseyear; + +#define HPW50PAD_RTC_BASE 1996 + + rtc_baseyear = prop_number_create_integer(HPW50PAD_RTC_BASE); + KASSERT(rtc_baseyear != NULL); + + if (prop_dictionary_set(device_properties(dev), + "sh3_rtc_baseyear", rtc_baseyear) == false) + printf("WARNING: unable to set sh3_rtc_baseyear " + "property for %s\n", device_xname(dev)); + prop_object_release(rtc_baseyear); + return; + } +} + #ifndef MEMORY_DISK_IS_ROOT static void get_device(char *name) Index: arch/hpcsh/include/types.h =================================================================== RCS file: /cvsroot/src/sys/arch/hpcsh/include/types.h,v retrieving revision 1.3 diff -u -r1.3 types.h --- arch/hpcsh/include/types.h 28 Feb 2002 03:17:28 -0000 1.3 +++ arch/hpcsh/include/types.h 3 May 2010 13:47:20 -0000 @@ -4,4 +4,6 @@ #include +#define __HAVE_DEVICE_REGISTER + #endif /* _HPCSH_TYPES_H_ */ Index: arch/sh3/dev/rtc.c =================================================================== RCS file: /cvsroot/src/sys/arch/sh3/dev/rtc.c,v retrieving revision 1.7 diff -u -r1.7 rtc.c --- arch/sh3/dev/rtc.c 5 Apr 2009 00:17:56 -0000 1.7 +++ arch/sh3/dev/rtc.c 3 May 2010 13:47:20 -0000 @@ -55,6 +55,7 @@ int sc_valid; struct todr_chip_handle sc_todr; + u_int sc_year0; }; static int rtc_match(device_t, cfdata_t, void *); @@ -68,7 +69,10 @@ static int rtc_gettime_ymdhms(todr_chip_handle_t, struct clock_ymdhms *); static int rtc_settime_ymdhms(todr_chip_handle_t, struct clock_ymdhms *); - +#ifndef SH3_RTC_BASEYEAR +#define SH3_RTC_BASEYEAR 1900 +#endif +u_int sh3_rtc_baseyear = SH3_RTC_BASEYEAR; static int rtc_match(device_t parent, cfdata_t cfp, void *aux) @@ -83,6 +87,7 @@ { struct rtc_softc *sc; uint8_t r; + prop_number_t prop_rtc_baseyear; #ifdef RTC_DEBUG char bits[128]; #endif @@ -119,6 +124,19 @@ sc->sc_todr.todr_gettime_ymdhms = rtc_gettime_ymdhms; sc->sc_todr.todr_settime_ymdhms = rtc_settime_ymdhms; + prop_rtc_baseyear = prop_dictionary_get(device_properties(self), + "sh3_rtc_baseyear"); + if (prop_rtc_baseyear != NULL) { + sh3_rtc_baseyear = + (u_int)prop_number_integer_value(prop_rtc_baseyear); +#ifdef RTC_DEBUG + aprint_debug_dev(self, + "using baseyear %u passed via device property\n", + sh3_rtc_baseyear); +#endif + } + sc->sc_year0 = sh3_rtc_baseyear; + todr_attach(&sc->sc_todr); #ifdef RTC_DEBUG @@ -184,7 +202,7 @@ return EIO; } - dt->dt_year += 1900; + dt->dt_year += sc->sc_year0; if (dt->dt_year < POSIX_BASE_YEAR) dt->dt_year += 100; @@ -209,7 +227,11 @@ unsigned int year; uint8_t r; - year = TOBCD(dt->dt_year % 100); + year = dt->dt_year - sc->sc_year0; + if (year > 99) + year -= 100; + + year = TOBCD(year); r = _reg_read_1(SH_(RCR2));