Subject: Re: RTC todr for mips/alchemy
To: Garrett D'Amore <garrett_damore@tadpole.com>
From: Shigeyuki Fukushima <shige@netbsd.org>
List: port-evbmips
Date: 03/08/2006 23:06:40
This is a multi-part message in MIME format.
--------------060500040000060709040903
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

Garrett D'Amore wrote:

> But, the first step is to make evbmips/evmips/clock.c support todr_attach.
> That should be the direction you proceed, I think.

Please add the following code to evbmips/evbmips/clock.c:

===========================
todr_chip_handle_t todr_handle;

void
todr_attach(todr_chip_handle_t todr)
{

        if (todr_handle)
                panic("todr_attach: realtime-clock already configured");
        todr_handle = todr;
}
===========================

But it isn't enough to support todr functions.
We must change inittodr()/resettodr() to use todr_{get,set}time
functions properly.
Such changes cause a break of aurtc.

First, we should change aurtc device driver. ok?


FYI: attached clock.c sample fix for clock.c.

-- 
Kind Regards,
--- shige
Shigeyuki Fukushima <shige@{FreeBSD,jp.FreeBSD,NetBSD}.org>

--------------060500040000060709040903
Content-Type: text/plain;
 name="clock.c.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="clock.c.diff"

Index: sys/arch/evbmips/evbmips/clock.c
===================================================================
RCS file: /cvsroot/src/sys/arch/evbmips/evbmips/clock.c,v
retrieving revision 1.6
diff -u -r1.6 clock.c
--- sys/arch/evbmips/evbmips/clock.c	11 Dec 2005 12:17:11 -0000	1.6
+++ sys/arch/evbmips/evbmips/clock.c	8 Mar 2006 14:05:20 -0000
@@ -100,6 +100,7 @@
 struct device *clockdev;
 const struct clockfns *clockfns;
 int clockinitted;
+todr_chip_handle_t todr_handle;
 
 void
 clockattach(struct device *dev, const struct clockfns *fns)
@@ -116,6 +117,15 @@
 	clockfns = fns;
 }
 
+void
+todr_attach(todr_chip_handle_t todr)
+{
+
+	if (todr_handle)
+		panic("todr_attach: realtime-clock already configured");
+	todr_handle = todr;
+}
+
 /*
  * Machine-dependent clock routines.
  *
@@ -182,9 +192,13 @@
 void
 inittodr(time_t base)
 {
+#ifdef USE_CLOCKSUBR
+	struct timeval todrtime;
+#else
 	struct clocktime ct;
 	int year;
 	struct clock_ymdhms dt;
+#endif
 	time_t deltat;
 	int badbase;
 
@@ -196,6 +210,24 @@
 	} else
 		badbase = 0;
 
+#ifdef USE_CLOCKSUBR
+	if (todr_handle == NULL) {
+		printf("inittodr: rtc not present");
+		time.tv_sec = base;
+		time.tv_usec = 0;
+		goto bad;
+	}
+
+	if (todr_gettime(todr_handle, &todrtime) != 0) {
+		printf("inittodr: Error reading clock");
+		time.tv_sec = base;
+		time.tv_usec = 0;
+		goto bad;
+	}
+	time = todrtime;
+	badbase = 0;
+	clockinitted = 1;
+#else
 	(*clockfns->cf_get)(clockdev, base, &ct);
 #ifdef DEBUG
 	printf("readclock: %d/%d/%d/%d/%d/%d\n", ct.year, ct.mon, ct.day,
@@ -229,6 +261,8 @@
 	dt.dt_min = ct.min;
 	dt.dt_sec = ct.sec;
 	time.tv_sec = clock_ymdhms_to_secs(&dt);
+#endif
+
 #ifdef DEBUG
 	printf("=>%ld (%ld)\n", time.tv_sec, base);
 #endif
@@ -261,12 +295,20 @@
 void
 resettodr(void)
 {
+#ifdef USE_CLOCKSUBR
+#else
 	struct clock_ymdhms dt;
 	struct clocktime ct;
+#endif
 
 	if (!clockinitted)
 		return;
 
+#ifdef USE_CLOCKSUBR
+	if (todr_handle != NULL &&
+		todr_settime(todr_handle, &time) != 0)
+		printf("resettodr: failed to set time\n");
+#else
 	clock_secs_to_ymdhms(time.tv_sec, &dt);
 
 	/* rt clock wants 2 digits */
@@ -283,6 +325,7 @@
 #endif
 
 	(*clockfns->cf_set)(clockdev, &ct);
+#endif
 }
 
 

--------------060500040000060709040903--