1 1.5 dyoung /* $NetBSD: mcclock.c,v 1.5 2011/07/01 20:36:42 dyoung Exp $ */ 2 1.1 tsutsui 3 1.1 tsutsui /* 4 1.1 tsutsui * Copyright (c) 1995, 1996 Carnegie-Mellon University. 5 1.1 tsutsui * All rights reserved. 6 1.1 tsutsui * 7 1.1 tsutsui * Author: Chris G. Demetriou 8 1.1 tsutsui * 9 1.1 tsutsui * Permission to use, copy, modify and distribute this software and 10 1.1 tsutsui * its documentation is hereby granted, provided that both the copyright 11 1.1 tsutsui * notice and this permission notice appear in all copies of the 12 1.1 tsutsui * software, derivative works or modified versions, and any portions 13 1.1 tsutsui * thereof, and that both notices appear in supporting documentation. 14 1.1 tsutsui * 15 1.1 tsutsui * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 16 1.1 tsutsui * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 17 1.1 tsutsui * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 18 1.1 tsutsui * 19 1.1 tsutsui * Carnegie Mellon requests users of this software to return to 20 1.1 tsutsui * 21 1.1 tsutsui * Software Distribution Coordinator or Software.Distribution (at) CS.CMU.EDU 22 1.1 tsutsui * School of Computer Science 23 1.1 tsutsui * Carnegie Mellon University 24 1.1 tsutsui * Pittsburgh PA 15213-3890 25 1.1 tsutsui * 26 1.1 tsutsui * any improvements or extensions that they make and grant Carnegie the 27 1.1 tsutsui * rights to redistribute these changes. 28 1.1 tsutsui */ 29 1.1 tsutsui 30 1.1 tsutsui #include <sys/cdefs.h> 31 1.5 dyoung __KERNEL_RCSID(0, "$NetBSD: mcclock.c,v 1.5 2011/07/01 20:36:42 dyoung Exp $"); 32 1.1 tsutsui 33 1.1 tsutsui #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ 34 1.1 tsutsui 35 1.1 tsutsui #include <sys/param.h> 36 1.1 tsutsui #include <sys/kernel.h> 37 1.1 tsutsui #include <sys/systm.h> 38 1.1 tsutsui #include <sys/device.h> 39 1.1 tsutsui 40 1.1 tsutsui #include <machine/autoconf.h> 41 1.5 dyoung #include <sys/bus.h> 42 1.1 tsutsui 43 1.1 tsutsui #include <dev/clock_subr.h> 44 1.1 tsutsui #include <dev/ic/mc146818reg.h> 45 1.1 tsutsui #include <dev/ic/mc146818var.h> 46 1.1 tsutsui 47 1.1 tsutsui #define MCCLOCK_NPORTS 2 48 1.1 tsutsui 49 1.3 tsutsui static int mcclock_match(device_t, cfdata_t, void *); 50 1.3 tsutsui static void mcclock_attach(device_t, device_t, void *); 51 1.1 tsutsui 52 1.3 tsutsui CFATTACH_DECL_NEW(mcclock, sizeof (struct mc146818_softc), 53 1.1 tsutsui mcclock_match, mcclock_attach, NULL, NULL); 54 1.1 tsutsui 55 1.1 tsutsui static void mcclock_write(struct mc146818_softc *, u_int, u_int); 56 1.1 tsutsui static u_int mcclock_read(struct mc146818_softc *, u_int); 57 1.1 tsutsui 58 1.1 tsutsui 59 1.1 tsutsui static int 60 1.3 tsutsui mcclock_match(device_t parent, cfdata_t cf, void *aux) 61 1.1 tsutsui { 62 1.1 tsutsui static int mcclock_found; 63 1.1 tsutsui 64 1.1 tsutsui if (mcclock_found) 65 1.1 tsutsui return 0; 66 1.1 tsutsui 67 1.1 tsutsui mcclock_found = 1; 68 1.1 tsutsui 69 1.1 tsutsui return 1; 70 1.1 tsutsui } 71 1.1 tsutsui 72 1.1 tsutsui static void 73 1.3 tsutsui mcclock_attach(device_t parent, device_t self, void *aux) 74 1.1 tsutsui { 75 1.3 tsutsui struct mc146818_softc *sc = device_private(self); 76 1.1 tsutsui struct mainbus_attach_args *ma = aux; 77 1.1 tsutsui 78 1.4 tsutsui sc->sc_dev = self; 79 1.1 tsutsui sc->sc_bst = ma->ma_iot; 80 1.1 tsutsui if (bus_space_map(sc->sc_bst, ma->ma_addr, MCCLOCK_NPORTS, 81 1.1 tsutsui 0, &sc->sc_bsh)) { 82 1.1 tsutsui aprint_error("mcclock_attach: unable to map registers\n"); 83 1.1 tsutsui return; 84 1.1 tsutsui } 85 1.1 tsutsui 86 1.1 tsutsui sc->sc_year0 = 2000; 87 1.1 tsutsui sc->sc_mcread = mcclock_read; 88 1.1 tsutsui sc->sc_mcwrite = mcclock_write; 89 1.1 tsutsui sc->sc_flag = MC146818_BCD; 90 1.1 tsutsui mc146818_attach(sc); 91 1.1 tsutsui 92 1.3 tsutsui aprint_normal("\n"); 93 1.1 tsutsui 94 1.1 tsutsui (*sc->sc_mcwrite)(sc, MC_REGB, MC_REGB_24HR); 95 1.1 tsutsui } 96 1.1 tsutsui 97 1.1 tsutsui static void 98 1.1 tsutsui mcclock_write(struct mc146818_softc *sc, u_int reg, u_int datum) 99 1.1 tsutsui { 100 1.1 tsutsui bus_space_tag_t iot; 101 1.1 tsutsui bus_space_handle_t ioh; 102 1.1 tsutsui 103 1.1 tsutsui iot = sc->sc_bst; 104 1.1 tsutsui ioh = sc->sc_bsh; 105 1.1 tsutsui 106 1.1 tsutsui bus_space_write_1(iot, ioh, 0, reg); 107 1.1 tsutsui bus_space_write_1(iot, ioh, 1, datum); 108 1.1 tsutsui } 109 1.1 tsutsui 110 1.1 tsutsui static u_int 111 1.1 tsutsui mcclock_read(struct mc146818_softc *sc, u_int reg) 112 1.1 tsutsui { 113 1.1 tsutsui bus_space_tag_t iot; 114 1.1 tsutsui bus_space_handle_t ioh; 115 1.1 tsutsui u_int datum; 116 1.1 tsutsui 117 1.1 tsutsui iot = sc->sc_bst; 118 1.1 tsutsui ioh = sc->sc_bsh; 119 1.1 tsutsui 120 1.1 tsutsui bus_space_write_1(iot, ioh, 0, reg); 121 1.1 tsutsui datum = bus_space_read_1(iot, ioh, 1); 122 1.1 tsutsui 123 1.1 tsutsui return datum; 124 1.1 tsutsui } 125