1- /* $NetBSD: ds1307.c,v 1.42 2025/09/07 21:45:15 thorpej Exp $ */
1+ /* $NetBSD: ds1307.c,v 1.43 2025/10/13 14:49:17 thorpej Exp $ */
22
33/*
44 * Copyright (c) 2003 Wasabi Systems, Inc.
3636 */
3737
3838#include <sys/cdefs.h>
39- __KERNEL_RCSID (0 , "$NetBSD: ds1307.c,v 1.42 2025/09/07 21:45:15 thorpej Exp $" );
39+ __KERNEL_RCSID (0 , "$NetBSD: ds1307.c,v 1.43 2025/10/13 14:49:17 thorpej Exp $" );
4040
4141#include <sys/param.h>
4242#include <sys/systm.h>
@@ -72,7 +72,6 @@ struct dsrtc_model {
7272#define DSRTC_FLAG_BCD 0x02
7373#define DSRTC_FLAG_TEMP 0x04
7474#define DSRTC_FLAG_VBATEN 0x08
75- #define DSRTC_FLAG_YEAR_START_2K 0x10
7675#define DSRTC_FLAG_CLOCK_HOLD_REVERSED 0x20
7776};
7877
@@ -190,6 +189,7 @@ struct dsrtc_softc {
190189 struct todr_chip_handle sc_todr ;
191190 struct sysmon_envsys * sc_sme ;
192191 envsys_data_t sc_sensor ;
192+ unsigned int sc_base_year ;
193193};
194194
195195static void dsrtc_attach (device_t , device_t , void * );
@@ -298,8 +298,6 @@ dsrtc_attach(device_t parent, device_t self, void *arg)
298298 struct dsrtc_softc * sc = device_private (self );
299299 struct i2c_attach_args * ia = arg ;
300300 const struct dsrtc_model * dm ;
301- prop_dictionary_t dict = device_properties (self );
302- bool base_2k = FALSE;
303301
304302 if ((dm = dsrtc_model_by_compat (ia )) == NULL )
305303 dm = dsrtc_model_by_number (device_cfdata (self )-> cf_flags );
@@ -329,13 +327,8 @@ dsrtc_attach(device_t parent, device_t self, void *arg)
329327 sc -> sc_todr .todr_settime = dsrtc_settime_timeval ;
330328 }
331329
332- #ifdef DSRTC_YEAR_START_2K
333- sc -> sc_model .dm_flags |= DSRTC_FLAG_YEAR_START_2K ;
334- #endif
335-
336- prop_dictionary_get_bool (dict , "base_year_is_2000" , & base_2k );
337- if (base_2k ) sc -> sc_model .dm_flags |= DSRTC_FLAG_YEAR_START_2K ;
338-
330+ sc -> sc_base_year = device_getprop_uint_default (self , "start-year" ,
331+ POSIX_BASE_YEAR );
339332
340333 todr_attach (& sc -> sc_todr );
341334 if ((sc -> sc_model .dm_flags & DSRTC_FLAG_TEMP ) != 0 ) {
@@ -565,13 +558,9 @@ dsrtc_clock_read_ymdhms(struct dsrtc_softc *sc, struct clock_ymdhms *dt)
565558 dt -> dt_day = bcdtobin (bcd [DSXXXX_DATE ] & DSXXXX_DATE_MASK );
566559 dt -> dt_mon = bcdtobin (bcd [DSXXXX_MONTH ] & DSXXXX_MONTH_MASK );
567560
568- /* XXX: Should be an MD way to specify EPOCH used by BIOS/Firmware */
569- if (sc -> sc_model .dm_flags & DSRTC_FLAG_YEAR_START_2K )
570- dt -> dt_year = bcdtobin (bcd [DSXXXX_YEAR ]) + 2000 ;
571- else {
572- dt -> dt_year = bcdtobin (bcd [DSXXXX_YEAR ]) + POSIX_BASE_YEAR ;
573- if (bcd [DSXXXX_MONTH ] & DSXXXX_MONTH_CENTURY )
574- dt -> dt_year += 100 ;
561+ dt -> dt_year = bcdtobin (bcd [DSXXXX_YEAR ]) + sc -> sc_base_year ;
562+ if (bcd [DSXXXX_MONTH ] & DSXXXX_MONTH_CENTURY ) {
563+ dt -> dt_year += 100 ;
575564 }
576565
577566 return 1 ;
@@ -582,7 +571,7 @@ dsrtc_clock_write_ymdhms(struct dsrtc_softc *sc, struct clock_ymdhms *dt)
582571{
583572 struct dsrtc_model * const dm = & sc -> sc_model ;
584573 uint8_t bcd [DSXXXX_RTC_SIZE ], cmdbuf [2 ];
585- int error , offset ;
574+ int error ;
586575
587576 KASSERT (DSXXXX_RTC_SIZE >= dm -> dm_rtc_size );
588577
@@ -597,14 +586,8 @@ dsrtc_clock_write_ymdhms(struct dsrtc_softc *sc, struct clock_ymdhms *dt)
597586 bcd [DSXXXX_DAY ] = bintobcd (dt -> dt_wday );
598587 bcd [DSXXXX_MONTH ] = bintobcd (dt -> dt_mon );
599588
600- if (sc -> sc_model .dm_flags & DSRTC_FLAG_YEAR_START_2K ) {
601- offset = 2000 ;
602- } else {
603- offset = POSIX_BASE_YEAR ;
604- }
605-
606- bcd [DSXXXX_YEAR ] = bintobcd ((dt -> dt_year - offset ) % 100 );
607- if (dt -> dt_year - offset >= 100 )
589+ bcd [DSXXXX_YEAR ] = bintobcd ((dt -> dt_year - sc -> sc_base_year ) % 100 );
590+ if (dt -> dt_year - sc -> sc_base_year >= 100 )
608591 bcd [DSXXXX_MONTH ] |= DSXXXX_MONTH_CENTURY ;
609592
610593 if ((error = iic_acquire_bus (sc -> sc_tag , 0 )) != 0 ) {
0 commit comments