1*fea15f47Sdyoung /* $NetBSD: mcclock.c,v 1.5 2011/07/01 20:36:42 dyoung Exp $ */
24e1d380fStsutsui
34e1d380fStsutsui /*
44e1d380fStsutsui * Copyright (c) 1995, 1996 Carnegie-Mellon University.
54e1d380fStsutsui * All rights reserved.
64e1d380fStsutsui *
74e1d380fStsutsui * Author: Chris G. Demetriou
84e1d380fStsutsui *
94e1d380fStsutsui * Permission to use, copy, modify and distribute this software and
104e1d380fStsutsui * its documentation is hereby granted, provided that both the copyright
114e1d380fStsutsui * notice and this permission notice appear in all copies of the
124e1d380fStsutsui * software, derivative works or modified versions, and any portions
134e1d380fStsutsui * thereof, and that both notices appear in supporting documentation.
144e1d380fStsutsui *
154e1d380fStsutsui * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
164e1d380fStsutsui * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
174e1d380fStsutsui * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
184e1d380fStsutsui *
194e1d380fStsutsui * Carnegie Mellon requests users of this software to return to
204e1d380fStsutsui *
214e1d380fStsutsui * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
224e1d380fStsutsui * School of Computer Science
234e1d380fStsutsui * Carnegie Mellon University
244e1d380fStsutsui * Pittsburgh PA 15213-3890
254e1d380fStsutsui *
264e1d380fStsutsui * any improvements or extensions that they make and grant Carnegie the
274e1d380fStsutsui * rights to redistribute these changes.
284e1d380fStsutsui */
294e1d380fStsutsui
304e1d380fStsutsui #include <sys/cdefs.h>
31*fea15f47Sdyoung __KERNEL_RCSID(0, "$NetBSD: mcclock.c,v 1.5 2011/07/01 20:36:42 dyoung Exp $");
324e1d380fStsutsui
334e1d380fStsutsui #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
344e1d380fStsutsui
354e1d380fStsutsui #include <sys/param.h>
364e1d380fStsutsui #include <sys/kernel.h>
374e1d380fStsutsui #include <sys/systm.h>
384e1d380fStsutsui #include <sys/device.h>
394e1d380fStsutsui
404e1d380fStsutsui #include <machine/autoconf.h>
41*fea15f47Sdyoung #include <sys/bus.h>
424e1d380fStsutsui
434e1d380fStsutsui #include <dev/clock_subr.h>
444e1d380fStsutsui #include <dev/ic/mc146818reg.h>
454e1d380fStsutsui #include <dev/ic/mc146818var.h>
464e1d380fStsutsui
474e1d380fStsutsui #define MCCLOCK_NPORTS 2
484e1d380fStsutsui
49048fb884Stsutsui static int mcclock_match(device_t, cfdata_t, void *);
50048fb884Stsutsui static void mcclock_attach(device_t, device_t, void *);
514e1d380fStsutsui
52048fb884Stsutsui CFATTACH_DECL_NEW(mcclock, sizeof (struct mc146818_softc),
534e1d380fStsutsui mcclock_match, mcclock_attach, NULL, NULL);
544e1d380fStsutsui
554e1d380fStsutsui static void mcclock_write(struct mc146818_softc *, u_int, u_int);
564e1d380fStsutsui static u_int mcclock_read(struct mc146818_softc *, u_int);
574e1d380fStsutsui
584e1d380fStsutsui
594e1d380fStsutsui static int
mcclock_match(device_t parent,cfdata_t cf,void * aux)60048fb884Stsutsui mcclock_match(device_t parent, cfdata_t cf, void *aux)
614e1d380fStsutsui {
624e1d380fStsutsui static int mcclock_found;
634e1d380fStsutsui
644e1d380fStsutsui if (mcclock_found)
654e1d380fStsutsui return 0;
664e1d380fStsutsui
674e1d380fStsutsui mcclock_found = 1;
684e1d380fStsutsui
694e1d380fStsutsui return 1;
704e1d380fStsutsui }
714e1d380fStsutsui
724e1d380fStsutsui static void
mcclock_attach(device_t parent,device_t self,void * aux)73048fb884Stsutsui mcclock_attach(device_t parent, device_t self, void *aux)
744e1d380fStsutsui {
75048fb884Stsutsui struct mc146818_softc *sc = device_private(self);
764e1d380fStsutsui struct mainbus_attach_args *ma = aux;
774e1d380fStsutsui
784090172bStsutsui sc->sc_dev = self;
794e1d380fStsutsui sc->sc_bst = ma->ma_iot;
804e1d380fStsutsui if (bus_space_map(sc->sc_bst, ma->ma_addr, MCCLOCK_NPORTS,
814e1d380fStsutsui 0, &sc->sc_bsh)) {
824e1d380fStsutsui aprint_error("mcclock_attach: unable to map registers\n");
834e1d380fStsutsui return;
844e1d380fStsutsui }
854e1d380fStsutsui
864e1d380fStsutsui sc->sc_year0 = 2000;
874e1d380fStsutsui sc->sc_mcread = mcclock_read;
884e1d380fStsutsui sc->sc_mcwrite = mcclock_write;
894e1d380fStsutsui sc->sc_flag = MC146818_BCD;
904e1d380fStsutsui mc146818_attach(sc);
914e1d380fStsutsui
92048fb884Stsutsui aprint_normal("\n");
934e1d380fStsutsui
944e1d380fStsutsui (*sc->sc_mcwrite)(sc, MC_REGB, MC_REGB_24HR);
954e1d380fStsutsui }
964e1d380fStsutsui
974e1d380fStsutsui static void
mcclock_write(struct mc146818_softc * sc,u_int reg,u_int datum)984e1d380fStsutsui mcclock_write(struct mc146818_softc *sc, u_int reg, u_int datum)
994e1d380fStsutsui {
1004e1d380fStsutsui bus_space_tag_t iot;
1014e1d380fStsutsui bus_space_handle_t ioh;
1024e1d380fStsutsui
1034e1d380fStsutsui iot = sc->sc_bst;
1044e1d380fStsutsui ioh = sc->sc_bsh;
1054e1d380fStsutsui
1064e1d380fStsutsui bus_space_write_1(iot, ioh, 0, reg);
1074e1d380fStsutsui bus_space_write_1(iot, ioh, 1, datum);
1084e1d380fStsutsui }
1094e1d380fStsutsui
1104e1d380fStsutsui static u_int
mcclock_read(struct mc146818_softc * sc,u_int reg)1114e1d380fStsutsui mcclock_read(struct mc146818_softc *sc, u_int reg)
1124e1d380fStsutsui {
1134e1d380fStsutsui bus_space_tag_t iot;
1144e1d380fStsutsui bus_space_handle_t ioh;
1154e1d380fStsutsui u_int datum;
1164e1d380fStsutsui
1174e1d380fStsutsui iot = sc->sc_bst;
1184e1d380fStsutsui ioh = sc->sc_bsh;
1194e1d380fStsutsui
1204e1d380fStsutsui bus_space_write_1(iot, ioh, 0, reg);
1214e1d380fStsutsui datum = bus_space_read_1(iot, ioh, 1);
1224e1d380fStsutsui
1234e1d380fStsutsui return datum;
1244e1d380fStsutsui }
125