1 /* $NetBSD: timer_isa.c,v 1.2 2002/01/07 21:46:58 thorpej Exp $ */ 2 /* $OpenBSD: clock_mc.c,v 1.9 1998/03/16 09:38:26 pefo Exp $ */ 3 /* NetBSD: clock_mc.c,v 1.2 1995/06/28 04:30:30 cgd Exp */ 4 5 /* 6 * Copyright (c) 1988 University of Utah. 7 * Copyright (c) 1992, 1993 8 * The Regents of the University of California. All rights reserved. 9 * 10 * This code is derived from software contributed to Berkeley by 11 * the Systems Programming Group of the University of Utah Computer 12 * Science Department and Ralph Campbell. 13 * 14 * Redistribution and use in source and binary forms, with or without 15 * modification, are permitted provided that the following conditions 16 * are met: 17 * 1. Redistributions of source code must retain the above copyright 18 * notice, this list of conditions and the following disclaimer. 19 * 2. Redistributions in binary form must reproduce the above copyright 20 * notice, this list of conditions and the following disclaimer in the 21 * documentation and/or other materials provided with the distribution. 22 * 3. All advertising materials mentioning features or use of this software 23 * must display the following acknowledgement: 24 * This product includes software developed by the University of 25 * California, Berkeley and its contributors. 26 * 4. Neither the name of the University nor the names of its contributors 27 * may be used to endorse or promote products derived from this software 28 * without specific prior written permission. 29 * 30 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 31 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 32 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 33 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 34 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 35 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 36 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 37 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 38 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 39 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 40 * SUCH DAMAGE. 41 * 42 * from: Utah Hdr: clock.c 1.18 91/01/21 43 * 44 * @(#)clock.c 8.1 (Berkeley) 6/10/93 45 */ 46 47 #include <sys/param.h> 48 #include <sys/kernel.h> 49 #include <sys/systm.h> 50 #include <sys/device.h> 51 52 #include <machine/bus.h> 53 54 #include <dev/isa/isareg.h> 55 #include <dev/isa/isavar.h> 56 57 #include <dev/isa/isareg.h> 58 #include <dev/ic/i8253reg.h> 59 60 #include <arc/arc/timervar.h> 61 #include <arc/isa/timer_isavar.h> 62 63 #define TIMER_IOSIZE 4 64 #define TIMER_IRQ 0 65 66 struct timer_isa_softc { 67 struct device sc_dev; 68 69 bus_space_tag_t sc_iot; 70 bus_space_handle_t sc_ioh; 71 }; 72 73 /* Definition of the driver for autoconfig. */ 74 int timer_isa_match __P((struct device *, struct cfdata *, void *)); 75 void timer_isa_attach __P((struct device *, struct device *, void *)); 76 77 struct cfattach timer_isa_ca = { 78 sizeof(struct timer_isa_softc), 79 timer_isa_match, timer_isa_attach 80 }; 81 82 /* ISA timer access code */ 83 void timer_isa_init __P((struct device *)); 84 85 struct timerfns timerfns_isa = { 86 timer_isa_init 87 }; 88 89 int timer_isa_conf = 0; 90 91 int 92 timer_isa_match(parent, match, aux) 93 struct device *parent; 94 struct cfdata *match; 95 void *aux; 96 { 97 struct isa_attach_args *ia = aux; 98 bus_space_handle_t ioh; 99 100 if (ia->ia_nio < 1 || 101 (ia->ia_io[0].ir_addr != ISACF_PORT_DEFAULT && 102 ia->ia_io[0].ir_addr != IO_TIMER1)) 103 return (0); 104 105 if (ia->ia_niomem > 0 && 106 (ia->ia_iomem[0].ir_addr != ISACF_IOMEM_DEFAULT)) 107 return (0); 108 109 if (ia->ia_nirq > 0 && 110 (ia->ia_irq[0].ir_irq != ISACF_IRQ_DEFAULT && 111 ia->ia_irq[0].ir_irq != TIMER_IRQ)) 112 return (0); 113 114 if (ia->ia_ndrq > 0 && 115 (ia->ia_drq[0].ir_drq != ISACF_DRQ_DEFAULT)) 116 return (0); 117 118 if (!timer_isa_conf) 119 return (0); 120 121 if (bus_space_map(ia->ia_iot, IO_TIMER1, TIMER_IOSIZE, 0, &ioh)) 122 return (0); 123 124 bus_space_unmap(ia->ia_iot, ioh, TIMER_IOSIZE); 125 126 ia->ia_nio = 1; 127 ia->ia_io[0].ir_addr = IO_TIMER1; 128 ia->ia_io[0].ir_size = TIMER_IOSIZE; 129 130 ia->ia_niomem = 0; 131 ia->ia_nirq = 0; 132 ia->ia_ndrq = 0; 133 134 return (1); 135 } 136 137 void 138 timer_isa_attach(parent, self, aux) 139 struct device *parent; 140 struct device *self; 141 void *aux; 142 { 143 struct timer_isa_softc *sc = (struct timer_isa_softc *)self; 144 struct isa_attach_args *ia = aux; 145 void *ih; 146 147 sc->sc_iot = ia->ia_iot; 148 if (bus_space_map(sc->sc_iot, ia->ia_io[0].ir_addr, 149 ia->ia_io[0].ir_size, 0, &sc->sc_ioh)) 150 panic("timer_isa_attach: couldn't map clock I/O space"); 151 152 ih = isa_intr_establish(ia->ia_ic, ia->ia_irq[0].ir_irq, IST_PULSE, 153 IPL_CLOCK, (int (*)(void *))hardclock, 154 NULL /* clockframe is hardcoded */); 155 if (ih == NULL) 156 printf("%s: can't establish interrupt\n", sc->sc_dev.dv_xname); 157 158 timerattach(&sc->sc_dev, &timerfns_isa); 159 } 160 161 void 162 timer_isa_init(self) 163 struct device *self; 164 { 165 struct timer_isa_softc *sc = (struct timer_isa_softc *)self; 166 167 bus_space_write_1(sc->sc_iot, sc->sc_ioh, TIMER_MODE, 168 TIMER_SEL0 | TIMER_16BIT | TIMER_RATEGEN); 169 bus_space_write_1(sc->sc_iot, sc->sc_ioh, TIMER_CNTR0, 170 TIMER_DIV(hz) % 256); 171 bus_space_write_1(sc->sc_iot, sc->sc_ioh, TIMER_CNTR0, 172 TIMER_DIV(hz) / 256); 173 } 174