Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 4 Mar 2018 21:04:30 +0000 (UTC)
From:      Ian Lepore <ian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r330411 - head/sys/dev/iicbus
Message-ID:  <201803042104.w24L4UmG073087@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ian
Date: Sun Mar  4 21:04:30 2018
New Revision: 330411
URL: https://svnweb.freebsd.org/changeset/base/330411

Log:
  Convert to the new(ish) bcd_clocktime conversion functions, add calls to
  the new debug output functions, and when setting the clock, propagate the
  timespec nsecs to the 1/100ths register.

Modified:
  head/sys/dev/iicbus/rtc8583.c

Modified: head/sys/dev/iicbus/rtc8583.c
==============================================================================
--- head/sys/dev/iicbus/rtc8583.c	Sun Mar  4 20:53:20 2018	(r330410)
+++ head/sys/dev/iicbus/rtc8583.c	Sun Mar  4 21:04:30 2018	(r330411)
@@ -190,7 +190,7 @@ static int
 rtc8583_gettime(device_t dev, struct timespec *ts)
 {
 	struct rtc8583_softc	*sc;
-	struct clocktime	 ct;
+	struct bcd_clocktime	 bct;
 	struct time_regs	 tregs;
 	uint8_t			 y, ytmp, sreg;
 	int 			 err;
@@ -227,42 +227,49 @@ rtc8583_gettime(device_t dev, struct timespec *ts)
 		iicbus_release_bus(sc->busdev, sc->dev);
 	}
 
-	ct.nsec = FROMBCD(tregs.msec) * 10 * 1000 * 1000;
-	ct.sec  = FROMBCD(tregs.sec);
-	ct.min  = FROMBCD(tregs.min);
-	ct.hour = FROMBCD(tregs.hour & 0x3f);
-	ct.day  = FROMBCD(tregs.day & 0x3f);
-	ct.mon  = FROMBCD(tregs.month & 0x1f);
-	ct.year = 2000 + sreg;
+	if (!validbcd(tregs.msec))
+		return (EINVAL);
 
-	return (clock_ct_to_ts(&ct, ts));
+        /* The 'msec' reg is actually 1/100ths, in bcd.  */
+	bct.nsec = bcd2bin(tregs.msec) * 10 * 1000 * 1000;
+	bct.sec  = tregs.sec;
+	bct.min  = tregs.min;
+	bct.hour = tregs.hour & 0x3f;
+	bct.day  = tregs.day & 0x3f;
+	bct.mon  = tregs.month & 0x1f;
+	bct.year = (bin2bcd(sreg / 100) << 8) | bin2bcd(sreg % 100);
+
+	clock_dbgprint_bcd(sc->dev, CLOCK_DBG_READ, &bct); 
+	return (clock_bcd_to_ts(&bct, ts, false));
 }
 
 static int
 rtc8583_settime(device_t dev, struct timespec *ts)
 {
 	struct rtc8583_softc	*sc;
-	struct clocktime 	 ct;
+	struct bcd_clocktime 	 bct;
 	struct time_regs	 tregs;
 	uint8_t			 sreg;
 	int 			 err;
 
 	sc = device_get_softc(dev);
 	ts->tv_sec -= utc_offset();
-	ts->tv_nsec = 0;
-	clock_ts_to_ct(ts, &ct);
+	clock_ts_to_bcd(ts, &bct, false);
+	clock_dbgprint_bcd(sc->dev, CLOCK_DBG_WRITE, &bct);
 
-	tregs.sec   = TOBCD(ct.sec);
-	tregs.min   = TOBCD(ct.min);
-	tregs.hour  = TOBCD(ct.hour);
-	tregs.day   = TOBCD(ct.day) | ((ct.year & 0x03) << 6);
-	tregs.month = TOBCD(ct.mon);
+	/* The 'msec' reg is actually 1/100ths, in bcd.  */
+	tregs.msec  = bin2bcd(ts->tv_nsec / (10 * 1000 * 1000));
+	tregs.sec   = bct.sec;
+	tregs.min   = bct.min;
+	tregs.hour  = bct.hour;
+	tregs.day   = bct.day | (bct.year & 0x03 << 6);
+	tregs.month = bct.mon;
 
 	if ((err = iicbus_request_bus(sc->busdev, sc->dev, IIC_WAIT)) != 0)
 		return (err);
 	err = rtc8583_writeto(sc->dev, RTC8583_SC_REG, &tregs,
 	    sizeof(tregs), IIC_WAIT);
-	sreg = ct.year - 2000;
+	sreg = bcd2bin(bct.year & 0xff) + 100 * bcd2bin(bct.year >> 8);
 	/* save to year to sram */
 	rtc8583_write1(sc, RTC8583_USERSRAM_REG, sreg);
 	iicbus_release_bus(sc->busdev, sc->dev);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201803042104.w24L4UmG073087>