Subject: diffs for luna68k todr and timecounter
To: None <port-luna68k@netbsd.org>
From: Garrett D'Amore <garrett_damore@tadpole.com>
List: port-luna68k
Date: 09/13/2006 13:28:51
This is a multi-part message in MIME format.
--------------090401020006080204050904
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

Attached are the diffs.  Pretty straight-forward.  Luna didn't appear to
be using a good counter, so the only timecounter you get is clockinterrupt.

Please either test, or just give me approval to commit. :-)

    - Garrett

-- 
Garrett D'Amore, Principal Software Engineer
Tadpole Computer / Computing Technologies Division,
General Dynamics C4 Systems
http://www.tadpolecomputer.com/
Phone: 951 325-2134  Fax: 951 325-2191


--------------090401020006080204050904
Content-Type: text/x-patch;
 name="luna68k.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="luna68k.diff"

Index: sys/arch/luna68k/dev/timekeeper.c
===================================================================
RCS file: /cvsroot/src/sys/arch/luna68k/dev/timekeeper.c,v
retrieving revision 1.3
diff -d -p -u -r1.3 timekeeper.c
--- sys/arch/luna68k/dev/timekeeper.c	12 Mar 2006 22:55:19 -0000	1.3
+++ sys/arch/luna68k/dev/timekeeper.c	13 Sep 2006 20:27:21 -0000
@@ -48,7 +48,6 @@ __KERNEL_RCSID(0, "$NetBSD: timekeeper.c
 #include <machine/cpu.h>
 
 #include <dev/clock_subr.h>
-#include <luna68k/luna68k/clockvar.h>
 #include <luna68k/dev/timekeeper.h>
 #include <machine/autoconf.h>
 
@@ -59,6 +58,7 @@ struct timekeeper_softc {
 	void *sc_clock, *sc_nvram;
 	int sc_nvramsize;
 	u_int8_t sc_image[2040];
+	struct todr_chip_handle sc_todr;
 };
 
 static int  clock_match __P((struct device *, struct cfdata *, void *));
@@ -68,18 +68,10 @@ CFATTACH_DECL(clock, sizeof (struct time
     clock_match, clock_attach, NULL, NULL);
 extern struct cfdriver clock_cd;
 
-static void mkclock_get __P((struct device *, time_t, struct clock_ymdhms *));
-static void mkclock_set __P((struct device *, struct clock_ymdhms *));
-static void dsclock_get __P((struct device *, time_t, struct clock_ymdhms *));
-static void dsclock_set __P((struct device *, struct clock_ymdhms *));
-
-static struct clockfns mkclock_clockfns = {
-	NULL /* never used */, mkclock_get, mkclock_set,
-};
-
-static struct clockfns dsclock_clockfns = {
-	NULL /* never used */, dsclock_get, dsclock_set,
-};
+static int mkclock_get __P((todr_chip_handle_t, struct clock_ymdhms *));
+static int mkclock_set __P((todr_chip_handle_t, struct clock_ymdhms *));
+static int dsclock_get __P((todr_chip_handle_t, struct clock_ymdhms *));
+static int dsclock_set __P((todr_chip_handle_t, struct clock_ymdhms *));
 
 static int
 clock_match(parent, match, aux)
@@ -101,7 +93,6 @@ clock_attach(parent, self, aux)
 {
 	struct timekeeper_softc *sc = (void *)self;
 	struct mainbus_attach_args *ma = aux;
-	struct clockfns *clockwork;
 
 	switch (machtype) {
 	default:
@@ -109,31 +100,32 @@ clock_attach(parent, self, aux)
 		sc->sc_clock = (void *)(ma->ma_addr + 2040);
 		sc->sc_nvram = (void *)ma->ma_addr;
 		sc->sc_nvramsize = 2040;
-		clockwork = &mkclock_clockfns;
+		sc->sc_todr.todr_gettime_ymdhms = mkclock_get;
+		sc->sc_todr.todr_settime_ymdhms = mkclock_set;
+		sc->sc_todr.cookie = sc; 
 		printf(": mk48t02\n");
 		break;
 	case LUNA_II: /* Dallas DS1287A */
 		sc->sc_clock = (void *)ma->ma_addr;
 		sc->sc_nvram = (void *)(ma->ma_addr + 50);
 		sc->sc_nvramsize = 50;
-		clockwork = &dsclock_clockfns;
+		sc->sc_todr.todr_gettime_ymdhms = dsclock_get;
+		sc->sc_todr.todr_settime_ymdhms = dsclock_set;
+		sc->sc_todr.cookie = sc; 
 		printf(": ds1287a\n");
 		break;
 	}
-	clockattach(&sc->sc_dev, clockwork);
+	todr_attach(&sc->sc_todr);
 	memcpy(sc->sc_image, sc->sc_nvram, sc->sc_nvramsize);
 }
 
 /*
  * Get the time of day, based on the clock's value and/or the base value.
  */
-static void
-mkclock_get(dev, base, dt)
-	struct device *dev;
-	time_t base;
-	struct clock_ymdhms *dt;
+static int
+mkclock_get(todr_chip_handle_t tch, struct clock_ymdhms *dt)
 {
-	struct timekeeper_softc *sc = (void *)dev;
+	struct timekeeper_softc *sc = (void *)tch->cookie;
 	volatile u_int8_t *chiptime = (void *)sc->sc_clock;
 	int s;
 
@@ -148,22 +140,16 @@ mkclock_get(dev, base, dt)
 	dt->dt_year = FROMBCD(chiptime[MK_YEAR]) + YEAR0;
 	chiptime[MK_CSR] &= ~MK_CSR_READ;	/* time wears on */
 	splx(s);
-#ifdef TIMEKEEPER_DEBUG
-	printf("get %d/%d/%d %d:%d:%d\n",
-	dt->dt_year, dt->dt_mon, dt->dt_day,
-	dt->dt_hour, dt->dt_min, dt->dt_sec);
-#endif
+	return 0;
 }
 
 /*
  * Reset the TODR based on the time value.
  */
-static void
-mkclock_set(dev, dt)
-	struct device *dev;
-	struct clock_ymdhms *dt;
+static int
+mkclock_set(todr_chip_handle_t tch, struct clock_ymdhms *dt)
 {
-	struct timekeeper_softc *sc = (void *)dev;
+	struct timekeeper_softc *sc = (void *)tch->cookie;
 	volatile u_int8_t *chiptime = (void *)sc->sc_clock;
 	volatile u_int8_t *stamp = (u_int8_t *)sc->sc_nvram + 0x10;
 	int s;
@@ -179,25 +165,18 @@ mkclock_set(dev, dt)
 	chiptime[MK_YEAR] = TOBCD(dt->dt_year - YEAR0);
 	chiptime[MK_CSR] &= ~MK_CSR_WRITE;	/* load them up */
 	splx(s);
-#ifdef TIMEKEEPER_DEBUG
-	printf("set %d/%d/%d %d:%d:%d\n",
-	dt->dt_year, dt->dt_mon, dt->dt_day,
-	dt->dt_hour, dt->dt_min, dt->dt_sec);
-#endif
 
 	stamp[0] = 'R'; stamp[1] = 'T'; stamp[2] = 'C'; stamp[3] = '\0';
+	return 0;
 }
 
 /*
  * Get the time of day, based on the clock's value and/or the base value.
  */
-static void
-dsclock_get(dev, base, dt)
-	struct device *dev;
-	time_t base;
-	struct clock_ymdhms *dt;
+static int
+dsclock_get(todr_chip_handle_t tch, struct clock_ymdhms *dt)
 {
-	struct timekeeper_softc *sc = (void *)dev;
+	struct timekeeper_softc *sc = (void *)tch->cookie;
 	volatile u_int8_t *chiptime = (void *)sc->sc_clock;
 	int s;
 
@@ -213,17 +192,16 @@ dsclock_get(dev, base, dt)
 	dt->dt_mon = chiptime[MC_MONTH];
 	dt->dt_year = chiptime[MC_YEAR] + YEAR0;
 	splx(s);
+	return 0;
 }
 
 /*
  * Reset the TODR based on the time value.
  */
-static void
-dsclock_set(dev, dt)
-	struct device *dev;
-	struct clock_ymdhms *dt;
+static int
+dsclock_set(todr_chip_handle_t tch, struct clock_ymdhms *dt)
 {
-	struct timekeeper_softc *sc = (void *)dev;
+	struct timekeeper_softc *sc = (void *)tch->cookie;
 	volatile u_int8_t *chiptime = (void *)sc->sc_clock;
 	int s;
 
@@ -238,4 +216,5 @@ dsclock_set(dev, dt)
 	chiptime[MC_YEAR] = dt->dt_year - YEAR0;
 	chiptime[MC_REGB] &= ~MC_REGB_SET;	/* load them up */
 	splx(s);
+	return 0;
 }
Index: sys/arch/luna68k/include/types.h
===================================================================
RCS file: /cvsroot/src/sys/arch/luna68k/include/types.h,v
retrieving revision 1.2
diff -d -p -u -r1.2 types.h
--- sys/arch/luna68k/include/types.h	28 Feb 2002 03:17:33 -0000	1.2
+++ sys/arch/luna68k/include/types.h	13 Sep 2006 20:27:21 -0000
@@ -5,4 +5,7 @@
 
 #include <m68k/types.h>
 
+#define	__HAVE_TIMECOUNTER
+#define	__HAVE_GENERIC_TODR
+
 #endif
Index: sys/arch/luna68k/luna68k/clock.c
===================================================================
RCS file: /cvsroot/src/sys/arch/luna68k/luna68k/clock.c,v
retrieving revision 1.4
diff -d -p -u -r1.4 clock.c
--- sys/arch/luna68k/luna68k/clock.c	11 Dec 2005 12:17:52 -0000	1.4
+++ sys/arch/luna68k/luna68k/clock.c	13 Sep 2006 20:27:21 -0000
@@ -88,28 +88,6 @@ __KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.
 #include <machine/cpu.h>
 
 #include <dev/clock_subr.h>
-#include <luna68k/luna68k/clockvar.h>
-
-#define CLOCK_LEVEL 5
-#include <luna68k/luna68k/isr.h>
-
-static struct device *clockdev;
-static struct clockfns *clockfns;
-static int clockinitted;
-
-void
-clockattach(dev, fns)
-	struct device *dev;
-	struct clockfns *fns;
-{
-	/*
-	 * Just bookkeeping.
-	 */
-	if (clockfns != NULL)
-		panic("clockattach: multiple clocks");
-	clockdev = dev;
-	clockfns = fns;
-}
 
 /*
  * Machine-dependent clock routines.
@@ -117,11 +95,6 @@ clockattach(dev, fns)
  * Startrtclock restarts the real-time clock, which provides
  * hardclock interrupts to kern_clock.c.
  *
- * Inittodr initializes the time of day hardware which provides
- * date functions.  Its primary function is to use some file
- * system information in case the hardare clock lost state.
- *
- * Resettodr restores the time of day hardware after a time change.
  */
 
 int clock_enable;		/* XXX to be removed XXX */
@@ -135,21 +108,11 @@ cpu_initclocks()
 {
 	int s;
 
-	if (clockfns == NULL)
-		panic("cpu_initclocks: no clock attached");
-
 	if (machtype == LUNA_I)
 		hz = 60;	/* LUNA-I is clocked at 60Hz, not 100Hz */
 
 	tick = 1000000 / hz;	/* number of microseconds between interrupts */
-	tickfix = 1000000 - (hz * tick);
-	if (tickfix) {
-		int ftp;
 
-		ftp = min(ffs(tickfix), ffs(hz));
-		tickfix >>= (ftp - 1);
-		tickfixinterval = hz >> (ftp - 1);
-        }
 	/*
 	 * Get the clock started.
 	 */
@@ -175,80 +138,3 @@ setstatclockrate(newhz)
 {
 	/* nothing we can do */
 }
-
-/*
- * Initialze the time of day register, based on the time base which is, e.g.
- * from a filesystem.  Base provides the time to within six months,
- * and the time of year clock (if any) provides the rest.
- */
-void
-inittodr(base)
-	time_t base;
-{
-	struct clock_ymdhms dt;
-	time_t deltat;
-	int badbase;
-
-	if (base < 5*SECYR) {
-		printf("WARNING: preposterous time in file system");
-		/* read the system clock anyway */
-		base = 6*SECYR + 186*SECDAY + SECDAY/2;
-		badbase = 1;
-	} else
-		badbase = 0;
-
-	(*clockfns->cf_get)(clockdev, base, &dt);
-	clockinitted = 1;
-	/* simple sanity checks */
-	if (dt.dt_year < 1970 || dt.dt_mon < 1 || dt.dt_mon > 12
-		|| dt.dt_day < 1 || dt.dt_day > 31
-		|| dt.dt_hour > 23 || dt.dt_min > 59 || dt.dt_sec > 59) {
-		/*
-		 * Believe the time in the file system for lack of
-		 * anything better, resetting the TODR.
-		 */
-		time.tv_sec = base;
-		if (!badbase) {
-			printf("WARNING: preposterous clock chip time");
-			resettodr();
-		}
-		goto bad;
-	}
-	/* now have days since Jan 1, 1970; the rest is easy... */
-	time.tv_sec = clock_ymdhms_to_secs(&dt);
-
-	if (!badbase) {
-		/*
-		 * See if we gained/lost two or more days;
-		 * if so, assume something is amiss.
-		 */
-		deltat = time.tv_sec - base;
-		if (deltat < 0)
-			deltat = -deltat;
-		if (deltat < 2 * SECDAY)
-			return;
-		printf("WARNING: clock %s %d days",
-		    time.tv_sec < base ? "lost" : "gained",
-		       (int) (deltat / SECDAY));
-	}
-bad:
-	printf(" -- CHECK AND RESET THE DATE!\n");
-}
-
-/*
- * Reset the TODR based on the time value; used when the TODR
- * has a preposterous value and also when the time is reset
- * by the stime system call.  Also called when the TODR goes past
- * TODRZERO + 100*(SECYEAR+2*SECDAY) (e.g. on Jan 2 just after midnight)
- * to wrap the TODR around.
- */
-void
-resettodr()
-{
-	struct clock_ymdhms dt;
-
-	if (!clockinitted)
-		return;
-	clock_secs_to_ymdhms(time.tv_sec, &dt);
-	(*clockfns->cf_set)(clockdev, &dt);
-}
Index: sys/arch/luna68k/luna68k/clockvar.h
===================================================================
RCS file: sys/arch/luna68k/luna68k/clockvar.h
diff -N sys/arch/luna68k/luna68k/clockvar.h
--- sys/arch/luna68k/luna68k/clockvar.h	5 Jan 2000 08:49:02 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,53 +0,0 @@
-/* $NetBSD: clockvar.h,v 1.1 2000/01/05 08:49:02 nisimura Exp $ */
-
-/*-
- * Copyright (c) 2000 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Tohru Nishimura.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *        This product includes software developed by the NetBSD
- *        Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-struct clock_ymdhms;
-
-/* 
- * clockfns structure:
- * 
- * function switch used by chip-independent clock code, to access
- * chip-dependent routines.
- */
-struct clockfns {
-	void	(*cf_init) __P((struct device *));
-	void	(*cf_get) __P((struct device *, time_t, struct clock_ymdhms *));
-	void	(*cf_set) __P((struct device *, struct clock_ymdhms *));
-};	
-
-void clockattach __P((struct device *, struct clockfns *));
Index: sys/arch/luna68k/luna68k/machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/luna68k/luna68k/machdep.c,v
retrieving revision 1.45
diff -d -p -u -r1.45 machdep.c
--- sys/arch/luna68k/luna68k/machdep.c	4 Aug 2006 02:26:49 -0000	1.45
+++ sys/arch/luna68k/luna68k/machdep.c	13 Sep 2006 20:27:21 -0000
@@ -804,37 +804,6 @@ cpu_exec_aout_makecmds(l, epp)
 	return error;
 }
 
-/*
- * Return the best possible estimate of the time in the timeval
- * to which tvp points.	 Unfortunately, we can't read the hardware registers.
- * We guarantee that the time will be greater than the value obtained by a
- * previous call.
- */
-void
-microtime(tvp)
-	register struct timeval *tvp;
-{
-	int s = splclock();
-	static struct timeval lasttime;
-
-	*tvp = time;
-#ifdef notdef
-	tvp->tv_usec += clkread();
-	while (tvp->tv_usec >= 1000000) {
-		tvp->tv_sec++;
-		tvp->tv_usec -= 1000000;
-	}
-#endif
-	if (tvp->tv_sec == lasttime.tv_sec &&
-	    tvp->tv_usec <= lasttime.tv_usec &&
-	    (tvp->tv_usec = lasttime.tv_usec + 1) >= 1000000) {
-		tvp->tv_sec++;
-		tvp->tv_usec -= 1000000;
-	}
-	lasttime = *tvp;
-	splx(s);
-}
-
 #if 1
 
 struct consdev *cn_tab = &syscons;

--------------090401020006080204050904--