1 /* $NetBSD: timer_isa.c,v 1.5 2003/06/14 02:57:03 tsutsui 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 CFATTACH_DECL(timer_isa, sizeof(struct timer_isa_softc), 78 timer_isa_match, timer_isa_attach, NULL, NULL); 79 80 /* ISA timer access code */ 81 void timer_isa_init __P((struct device *)); 82 83 struct timerfns timerfns_isa = { 84 timer_isa_init 85 }; 86 87 int timer_isa_conf = 0; 88 89 int 90 timer_isa_match(parent, match, aux) 91 struct device *parent; 92 struct cfdata *match; 93 void *aux; 94 { 95 struct isa_attach_args *ia = aux; 96 bus_space_handle_t ioh; 97 98 if (ia->ia_nio < 1 || 99 (ia->ia_io[0].ir_addr != ISACF_PORT_DEFAULT && 100 ia->ia_io[0].ir_addr != IO_TIMER1)) 101 return (0); 102 103 if (ia->ia_niomem > 0 && 104 (ia->ia_iomem[0].ir_addr != ISACF_IOMEM_DEFAULT)) 105 return (0); 106 107 if (ia->ia_nirq > 0 && 108 (ia->ia_irq[0].ir_irq != ISACF_IRQ_DEFAULT && 109 ia->ia_irq[0].ir_irq != TIMER_IRQ)) 110 return (0); 111 112 if (ia->ia_ndrq > 0 && 113 (ia->ia_drq[0].ir_drq != ISACF_DRQ_DEFAULT)) 114 return (0); 115 116 if (!timer_isa_conf) 117 return (0); 118 119 if (bus_space_map(ia->ia_iot, IO_TIMER1, TIMER_IOSIZE, 0, &ioh)) 120 return (0); 121 122 bus_space_unmap(ia->ia_iot, ioh, TIMER_IOSIZE); 123 124 ia->ia_nio = 1; 125 ia->ia_io[0].ir_addr = IO_TIMER1; 126 ia->ia_io[0].ir_size = TIMER_IOSIZE; 127 128 ia->ia_niomem = 0; 129 ia->ia_nirq = 0; 130 ia->ia_ndrq = 0; 131 132 return (1); 133 } 134 135 void 136 timer_isa_attach(parent, self, aux) 137 struct device *parent; 138 struct device *self; 139 void *aux; 140 { 141 struct timer_isa_softc *sc = (struct timer_isa_softc *)self; 142 struct isa_attach_args *ia = aux; 143 void *ih; 144 145 printf("\n"); 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