diff options
| author | Doug Rabson <dfr@FreeBSD.org> | 1998-06-10 10:57:29 +0000 |
|---|---|---|
| committer | Doug Rabson <dfr@FreeBSD.org> | 1998-06-10 10:57:29 +0000 |
| commit | 897cd717a56fada7bcdb663c761885013df84a20 (patch) | |
| tree | a452ee9b49edc4a7a01b5f26baa2798217a67923 /sys/alpha/tlsb/mcclock_tlsb.c | |
| parent | 8c12612cf6d4265be5c54e20f768e6fd697fd1b3 (diff) | |
Notes
Diffstat (limited to 'sys/alpha/tlsb/mcclock_tlsb.c')
| -rw-r--r-- | sys/alpha/tlsb/mcclock_tlsb.c | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/sys/alpha/tlsb/mcclock_tlsb.c b/sys/alpha/tlsb/mcclock_tlsb.c new file mode 100644 index 0000000000000..15974fc878b71 --- /dev/null +++ b/sys/alpha/tlsb/mcclock_tlsb.c @@ -0,0 +1,126 @@ +/* $Id$ */ +/* $NetBSD: mcclock_tlsb.c,v 1.8 1998/05/13 02:50:29 thorpej Exp $ */ + +/* + * Copyright (c) 1997 by Matthew Jacob + * NASA AMES Research Center. + * All rights reserved. + * + * 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 immediately at the beginning of the file, without modification, + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +#include <sys/param.h> +#include <sys/kernel.h> +#include <sys/systm.h> +#include <sys/module.h> +#include <sys/bus.h> + +#include <dev/dec/clockvar.h> +#include <dev/dec/mcclockvar.h> + +#include <alpha/tlsb/gbusvar.h> + +#include <alpha/tlsb/tlsbreg.h> /* XXX */ + +#include <dev/dec/mc146818reg.h> + +#define KV(_addr) ((caddr_t)ALPHA_PHYS_TO_K0SEG((_addr))) +/* + * Registers are 64 bytes apart (and 1 byte wide) + */ +#define REGSHIFT 6 + +struct mcclock_tlsb_softc { + struct mcclock_softc sc_mcclock; + unsigned long regbase; +}; + +static int mcclock_tlsb_probe(bus_t, device_t); +static int mcclock_tlsb_attach(bus_t, device_t); + +static devclass_t mcclock_devclass; + +driver_t mcclock_tlsb_driver = { + "mcclock", + mcclock_tlsb_probe, + mcclock_tlsb_attach, + NULL, + NULL, + DRIVER_TYPE_MISC, + sizeof(struct mcclock_tlsb_softc), + NULL, +}; + +static void mcclock_tlsb_write __P((struct mcclock_softc *, u_int, u_int)); +static u_int mcclock_tlsb_read __P((struct mcclock_softc *, u_int)); + +const struct mcclock_busfns mcclock_tlsb_busfns = { + mcclock_tlsb_write, mcclock_tlsb_read, +}; + +int +mcclock_tlsb_probe(bus_t bus, device_t dev) +{ + device_set_desc(dev, "MC146818A real time clock"); + return 0; +} + +int +mcclock_tlsb_attach(bus_t bus, device_t dev) +{ + struct mcclock_tlsb_softc *sc = device_get_softc(dev); + + /* XXX Should be bus.h'd, so we can accomodate the kn7aa. */ + + sc->sc_mcclock.sc_dev = dev; + sc->regbase = TLSB_GBUS_BASE + gbus_get_offset(dev); + + mcclock_attach(&sc->sc_mcclock, &mcclock_tlsb_busfns); + return 0; +} + +static void +mcclock_tlsb_write(mcsc, reg, val) + struct mcclock_softc *mcsc; + u_int reg, val; +{ + struct mcclock_tlsb_softc *sc = (struct mcclock_tlsb_softc *)mcsc; + unsigned char *ptr = (unsigned char *) + KV(sc->regbase + (reg << REGSHIFT)); + *ptr = val; +} + +static u_int +mcclock_tlsb_read(mcsc, reg) + struct mcclock_softc *mcsc; + u_int reg; +{ + struct mcclock_tlsb_softc *sc = (struct mcclock_tlsb_softc *)mcsc; + unsigned char *ptr = (unsigned char *) + KV(sc->regbase + (reg << REGSHIFT)); + return *ptr; +} + +DRIVER_MODULE(mcclock_tlsb, gbus, mcclock_tlsb_driver, mcclock_devclass, 0, 0); |
