Converted x68k to todr. Compile tested only, but it has a low probably
of breaking anything.
This commit is contained in:
parent
f2a34ea075
commit
29dad6a290
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: rtclock.c,v 1.18 2005/12/11 12:19:37 christos Exp $ */
|
/* $NetBSD: rtclock.c,v 1.19 2006/09/14 01:18:11 gdamore Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 1993, 1994 Masaru Oki
|
* Copyright 1993, 1994 Masaru Oki
|
||||||
|
@ -36,7 +36,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: rtclock.c,v 1.18 2005/12/11 12:19:37 christos Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: rtclock.c,v 1.19 2006/09/14 01:18:11 gdamore Exp $");
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
|
@ -55,8 +55,8 @@ __KERNEL_RCSID(0, "$NetBSD: rtclock.c,v 1.18 2005/12/11 12:19:37 christos Exp $"
|
||||||
#include <arch/x68k/dev/rtclock_var.h>
|
#include <arch/x68k/dev/rtclock_var.h>
|
||||||
#include <arch/x68k/dev/intiovar.h>
|
#include <arch/x68k/dev/intiovar.h>
|
||||||
|
|
||||||
static time_t rtgettod(void);
|
static int rtgettod(todr_chip_handle_t, struct clock_ymdhms *);
|
||||||
static int rtsettod(long);
|
static int rtsettod(todr_chip_handle_t, struct clock_ymdhms *);
|
||||||
|
|
||||||
static int rtc_match(struct device *, struct cfdata *, void *);
|
static int rtc_match(struct device *, struct cfdata *, void *);
|
||||||
static void rtc_attach(struct device *, struct device *, void *);
|
static void rtc_attach(struct device *, struct device *, void *);
|
||||||
|
@ -87,9 +87,6 @@ rtc_match(struct device *parent, struct cfdata *cf, void *aux)
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct rtc_softc *rtc; /* XXX: softc cache */
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rtc_attach(struct device *parent, struct device *self, void *aux)
|
rtc_attach(struct device *parent, struct device *self, void *aux)
|
||||||
{
|
{
|
||||||
|
@ -109,65 +106,42 @@ rtc_attach(struct device *parent, struct device *self, void *aux)
|
||||||
|
|
||||||
sc->sc_bst = ia->ia_bst;
|
sc->sc_bst = ia->ia_bst;
|
||||||
bus_space_map(sc->sc_bst, ia->ia_addr, 0x2000, 0, &sc->sc_bht);
|
bus_space_map(sc->sc_bst, ia->ia_addr, 0x2000, 0, &sc->sc_bht);
|
||||||
rtc = sc;
|
|
||||||
|
|
||||||
rtclockinit();
|
sc->sc_todr.cookie = sc;
|
||||||
|
sc->sc_todr.todr_gettime_ymdhms = rtgettod;
|
||||||
|
sc->sc_todr.todr_settime_ymdhms = rtsettod;
|
||||||
|
todr_attach(&sc->sc_todr);
|
||||||
|
|
||||||
printf (": RP5C15\n");
|
printf (": RP5C15\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
rtgettod(todr_chip_handle_t tch, struct clock_ymdhms *dt)
|
||||||
/*
|
|
||||||
* x68k/clock.c calls thru the get/set tod vector, if it is set, to read
|
|
||||||
* the realtime clock.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int
|
|
||||||
rtclockinit(void)
|
|
||||||
{
|
{
|
||||||
if (rtgettod()) {
|
struct rtc_softc *rtc = tch->cookie;
|
||||||
gettod = rtgettod;
|
|
||||||
settod = rtsettod;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static time_t
|
|
||||||
rtgettod(void)
|
|
||||||
{
|
|
||||||
struct clock_ymdhms dt;
|
|
||||||
|
|
||||||
/* hold clock */
|
/* hold clock */
|
||||||
RTC_WRITE(RTC_MODE, RTC_HOLD_CLOCK);
|
RTC_WRITE(RTC_MODE, RTC_HOLD_CLOCK);
|
||||||
|
|
||||||
/* read it */
|
/* read it */
|
||||||
dt.dt_sec = RTC_REG(RTC_SEC10) * 10 + RTC_REG(RTC_SEC);
|
dt->dt_sec = RTC_REG(RTC_SEC10) * 10 + RTC_REG(RTC_SEC);
|
||||||
dt.dt_min = RTC_REG(RTC_MIN10) * 10 + RTC_REG(RTC_MIN);
|
dt->dt_min = RTC_REG(RTC_MIN10) * 10 + RTC_REG(RTC_MIN);
|
||||||
dt.dt_hour = RTC_REG(RTC_HOUR10) * 10 + RTC_REG(RTC_HOUR);
|
dt->dt_hour = RTC_REG(RTC_HOUR10) * 10 + RTC_REG(RTC_HOUR);
|
||||||
dt.dt_day = RTC_REG(RTC_DAY10) * 10 + RTC_REG(RTC_DAY);
|
dt->dt_day = RTC_REG(RTC_DAY10) * 10 + RTC_REG(RTC_DAY);
|
||||||
dt.dt_mon = RTC_REG(RTC_MON10) * 10 + RTC_REG(RTC_MON);
|
dt->dt_mon = RTC_REG(RTC_MON10) * 10 + RTC_REG(RTC_MON);
|
||||||
dt.dt_year = RTC_REG(RTC_YEAR10) * 10 + RTC_REG(RTC_YEAR)
|
dt->dt_year = RTC_REG(RTC_YEAR10) * 10 + RTC_REG(RTC_YEAR)
|
||||||
+RTC_BASE_YEAR;
|
+RTC_BASE_YEAR;
|
||||||
|
|
||||||
/* let it run again.. */
|
/* let it run again.. */
|
||||||
RTC_WRITE(RTC_MODE, RTC_FREE_CLOCK);
|
RTC_WRITE(RTC_MODE, RTC_FREE_CLOCK);
|
||||||
|
|
||||||
#ifdef DIAGNOSTIC
|
return 0;
|
||||||
range_test0(dt.dt_hour, 23);
|
|
||||||
range_test(dt.dt_day, 1, 31);
|
|
||||||
range_test(dt.dt_mon, 1, 12);
|
|
||||||
range_test(dt.dt_year, RTC_BASE_YEAR, RTC_BASE_YEAR+100-1);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return clock_ymdhms_to_secs (&dt) + rtc_offset * 60;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
rtsettod(time_t tim)
|
rtsettod(todr_chip_handle_t tch, struct clock_ymdhms *dt)
|
||||||
{
|
{
|
||||||
struct clock_ymdhms dt;
|
struct rtc_softc *rtc = tch->cookie;
|
||||||
u_char sec1, sec2;
|
u_char sec1, sec2;
|
||||||
u_char min1, min2;
|
u_char min1, min2;
|
||||||
u_char hour1, hour2;
|
u_char hour1, hour2;
|
||||||
|
@ -175,22 +149,20 @@ rtsettod(time_t tim)
|
||||||
u_char mon1, mon2;
|
u_char mon1, mon2;
|
||||||
u_char year1, year2;
|
u_char year1, year2;
|
||||||
|
|
||||||
clock_secs_to_ymdhms (tim - rtc_offset * 60, &dt);
|
|
||||||
|
|
||||||
/* prepare values to be written to clock */
|
/* prepare values to be written to clock */
|
||||||
sec1 = dt.dt_sec / 10;
|
sec1 = dt->dt_sec / 10;
|
||||||
sec2 = dt.dt_sec % 10;
|
sec2 = dt->dt_sec % 10;
|
||||||
min1 = dt.dt_min / 10;
|
min1 = dt->dt_min / 10;
|
||||||
min2 = dt.dt_min % 10;
|
min2 = dt->dt_min % 10;
|
||||||
hour1 = dt.dt_hour / 10;
|
hour1 = dt->dt_hour / 10;
|
||||||
hour2 = dt.dt_hour % 10;
|
hour2 = dt->dt_hour % 10;
|
||||||
|
|
||||||
day1 = dt.dt_day / 10;
|
day1 = dt->dt_day / 10;
|
||||||
day2 = dt.dt_day % 10;
|
day2 = dt->dt_day % 10;
|
||||||
mon1 = dt.dt_mon / 10;
|
mon1 = dt->dt_mon / 10;
|
||||||
mon2 = dt.dt_mon % 10;
|
mon2 = dt->dt_mon % 10;
|
||||||
year1 = (dt.dt_year - RTC_BASE_YEAR) / 10;
|
year1 = (dt->dt_year - RTC_BASE_YEAR) / 10;
|
||||||
year2 = dt.dt_year % 10;
|
year2 = dt->dt_year % 10;
|
||||||
|
|
||||||
RTC_WRITE(RTC_MODE, RTC_HOLD_CLOCK);
|
RTC_WRITE(RTC_MODE, RTC_HOLD_CLOCK);
|
||||||
RTC_WRITE(RTC_SEC10, sec1);
|
RTC_WRITE(RTC_SEC10, sec1);
|
||||||
|
@ -207,5 +179,5 @@ rtsettod(time_t tim)
|
||||||
RTC_WRITE(RTC_YEAR, year2);
|
RTC_WRITE(RTC_YEAR, year2);
|
||||||
RTC_WRITE(RTC_MODE, RTC_FREE_CLOCK);
|
RTC_WRITE(RTC_MODE, RTC_FREE_CLOCK);
|
||||||
|
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: rtclock_var.h,v 1.7 2005/12/11 12:19:37 christos Exp $ */
|
/* $NetBSD: rtclock_var.h,v 1.8 2006/09/14 01:18:11 gdamore Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 1993, 1994 Masaru Oki
|
* Copyright 1993, 1994 Masaru Oki
|
||||||
|
@ -42,6 +42,7 @@ struct rtc_softc {
|
||||||
|
|
||||||
bus_space_tag_t sc_bst;
|
bus_space_tag_t sc_bst;
|
||||||
bus_space_handle_t sc_bht;
|
bus_space_handle_t sc_bht;
|
||||||
|
struct todr_chip_handle sc_todr;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: types.h,v 1.9 2005/12/11 12:19:44 christos Exp $ */
|
/* $NetBSD: types.h,v 1.10 2006/09/14 01:18:11 gdamore Exp $ */
|
||||||
|
|
||||||
#ifndef _MACHINE_TYPES_H_
|
#ifndef _MACHINE_TYPES_H_
|
||||||
#define _MACHINE_TYPES_H_
|
#define _MACHINE_TYPES_H_
|
||||||
|
@ -6,5 +6,6 @@
|
||||||
#include <m68k/types.h>
|
#include <m68k/types.h>
|
||||||
|
|
||||||
#define __HAVE_DEVICE_REGISTER
|
#define __HAVE_DEVICE_REGISTER
|
||||||
|
#define __HAVE_GENERIC_TODR
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: clock.c,v 1.22 2005/12/24 22:45:40 perry Exp $ */
|
/* $NetBSD: clock.c,v 1.23 2006/09/14 01:18:11 gdamore Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1982, 1990, 1993
|
* Copyright (c) 1982, 1990, 1993
|
||||||
|
@ -77,7 +77,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.22 2005/12/24 22:45:40 perry Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.23 2006/09/14 01:18:11 gdamore Exp $");
|
||||||
|
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
|
|
||||||
|
@ -535,46 +535,6 @@ microtime(struct timeval *tvp)
|
||||||
lasttime = *tvp;
|
lasttime = *tvp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* this is a hook set by a clock driver for the configured realtime clock,
|
|
||||||
returning plain current unix-time */
|
|
||||||
time_t (*gettod)(void) = 0;
|
|
||||||
int (*settod)(long) = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize the time of day register, based on the time base which is, e.g.
|
|
||||||
* from a filesystem.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
inittodr(time_t base)
|
|
||||||
{
|
|
||||||
u_long timbuf = base; /* assume no battery clock exists */
|
|
||||||
|
|
||||||
if (!gettod)
|
|
||||||
printf ("WARNING: no battery clock\n");
|
|
||||||
else
|
|
||||||
timbuf = gettod();
|
|
||||||
|
|
||||||
if (timbuf < base) {
|
|
||||||
printf ("WARNING: bad date in battery clock\n");
|
|
||||||
timbuf = base;
|
|
||||||
}
|
|
||||||
if (base < 5*SECYR) {
|
|
||||||
printf("WARNING: preposterous time in file system");
|
|
||||||
timbuf = 6*SECYR + 186*SECDAY + SECDAY/2;
|
|
||||||
printf(" -- CHECK AND RESET THE DATE!\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Battery clock does not store usec's, so forget about it. */
|
|
||||||
time.tv_sec = timbuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
resettodr(void)
|
|
||||||
{
|
|
||||||
if (settod)
|
|
||||||
if (settod (time.tv_sec) != 1)
|
|
||||||
printf("Cannot set battery backed clock\n");
|
|
||||||
}
|
|
||||||
#else /* NCLOCK */
|
#else /* NCLOCK */
|
||||||
#error loose.
|
#error loose.
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue