xref: /netbsd-src/sys/arch/cobalt/dev/mcclock.c (revision fea15f47f1e4285fa837c2053145c1d2ec423dce)
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