1 1.7 jdolecek /* $NetBSD: lm_isa_common.c,v 1.7 2020/06/24 19:11:49 jdolecek Exp $ */ 2 1.1 jakllsch 3 1.1 jakllsch /*- 4 1.1 jakllsch * Copyright (c) 2000 The NetBSD Foundation, Inc. 5 1.1 jakllsch * All rights reserved. 6 1.1 jakllsch * 7 1.1 jakllsch * This code is derived from software contributed to The NetBSD Foundation 8 1.1 jakllsch * by Bill Squier. 9 1.1 jakllsch * 10 1.1 jakllsch * Redistribution and use in source and binary forms, with or without 11 1.1 jakllsch * modification, are permitted provided that the following conditions 12 1.1 jakllsch * are met: 13 1.1 jakllsch * 1. Redistributions of source code must retain the above copyright 14 1.1 jakllsch * notice, this list of conditions and the following disclaimer. 15 1.1 jakllsch * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 jakllsch * notice, this list of conditions and the following disclaimer in the 17 1.1 jakllsch * documentation and/or other materials provided with the distribution. 18 1.1 jakllsch * 19 1.1 jakllsch * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 jakllsch * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 jakllsch * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 jakllsch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 jakllsch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 jakllsch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 jakllsch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 jakllsch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 jakllsch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 jakllsch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 jakllsch * POSSIBILITY OF SUCH DAMAGE. 30 1.1 jakllsch */ 31 1.1 jakllsch 32 1.1 jakllsch #include <sys/cdefs.h> 33 1.7 jdolecek __KERNEL_RCSID(0, "$NetBSD: lm_isa_common.c,v 1.7 2020/06/24 19:11:49 jdolecek Exp $"); 34 1.1 jakllsch 35 1.1 jakllsch #include <sys/param.h> 36 1.1 jakllsch #include <sys/systm.h> 37 1.1 jakllsch #include <sys/kernel.h> 38 1.1 jakllsch #include <sys/device.h> 39 1.1 jakllsch #include <sys/module.h> 40 1.1 jakllsch #include <sys/conf.h> 41 1.7 jdolecek #include <sys/kmem.h> 42 1.1 jakllsch 43 1.1 jakllsch #include <sys/bus.h> 44 1.1 jakllsch 45 1.1 jakllsch #include <dev/isa/isareg.h> 46 1.1 jakllsch #include <dev/isa/isavar.h> 47 1.1 jakllsch 48 1.1 jakllsch #include <dev/ic/nslm7xvar.h> 49 1.1 jakllsch 50 1.1 jakllsch int lm_isa_match(device_t, cfdata_t, void *); 51 1.1 jakllsch void lm_isa_attach(device_t, device_t, void *); 52 1.1 jakllsch int lm_isa_detach(device_t, int); 53 1.1 jakllsch 54 1.1 jakllsch static uint8_t lm_isa_readreg(struct lm_softc *, int); 55 1.5 msaitoh static void lm_isa_writereg(struct lm_softc *, int, uint8_t); 56 1.1 jakllsch 57 1.1 jakllsch struct lm_isa_softc { 58 1.1 jakllsch struct lm_softc lmsc; 59 1.1 jakllsch bus_space_tag_t lm_iot; 60 1.1 jakllsch bus_space_handle_t lm_ioh; 61 1.1 jakllsch }; 62 1.1 jakllsch 63 1.1 jakllsch int 64 1.1 jakllsch lm_isa_match(device_t parent, cfdata_t match, void *aux) 65 1.1 jakllsch { 66 1.1 jakllsch bus_space_handle_t ioh; 67 1.1 jakllsch struct isa_attach_args *ia = aux; 68 1.7 jdolecek struct lm_isa_softc *sc; 69 1.1 jakllsch int rv; 70 1.1 jakllsch 71 1.1 jakllsch /* Must supply an address */ 72 1.1 jakllsch if (ia->ia_nio < 1) 73 1.1 jakllsch return 0; 74 1.1 jakllsch 75 1.1 jakllsch if (ISA_DIRECT_CONFIG(ia)) 76 1.1 jakllsch return 0; 77 1.1 jakllsch 78 1.1 jakllsch if (ia->ia_io[0].ir_addr == ISA_UNKNOWN_PORT) 79 1.1 jakllsch return 0; 80 1.1 jakllsch 81 1.1 jakllsch if (bus_space_map(ia->ia_iot, ia->ia_io[0].ir_addr, 8, 0, &ioh)) 82 1.1 jakllsch return 0; 83 1.1 jakllsch 84 1.1 jakllsch /* Bus independent probe */ 85 1.7 jdolecek sc = kmem_zalloc(sizeof(*sc), KM_SLEEP); 86 1.7 jdolecek sc->lm_iot = ia->ia_iot; 87 1.7 jdolecek sc->lm_ioh = ioh; 88 1.7 jdolecek sc->lmsc.lm_writereg = lm_isa_writereg; 89 1.7 jdolecek sc->lmsc.lm_readreg = lm_isa_readreg; 90 1.7 jdolecek rv = lm_match(&sc->lmsc); 91 1.7 jdolecek kmem_free(sc, sizeof(*sc)); 92 1.1 jakllsch 93 1.1 jakllsch bus_space_unmap(ia->ia_iot, ioh, 8); 94 1.1 jakllsch 95 1.1 jakllsch if (rv) { 96 1.1 jakllsch ia->ia_nio = 1; 97 1.1 jakllsch ia->ia_io[0].ir_size = 8; 98 1.1 jakllsch 99 1.1 jakllsch ia->ia_niomem = 0; 100 1.1 jakllsch ia->ia_nirq = 0; 101 1.1 jakllsch ia->ia_ndrq = 0; 102 1.1 jakllsch } 103 1.1 jakllsch 104 1.1 jakllsch return rv; 105 1.1 jakllsch } 106 1.1 jakllsch 107 1.1 jakllsch 108 1.1 jakllsch void 109 1.1 jakllsch lm_isa_attach(device_t parent, device_t self, void *aux) 110 1.1 jakllsch { 111 1.1 jakllsch struct lm_isa_softc *sc = device_private(self); 112 1.1 jakllsch struct isa_attach_args *ia = aux; 113 1.1 jakllsch 114 1.1 jakllsch sc->lm_iot = ia->ia_iot; 115 1.1 jakllsch 116 1.1 jakllsch if (bus_space_map(ia->ia_iot, ia->ia_io[0].ir_addr, 8, 0, 117 1.1 jakllsch &sc->lm_ioh)) { 118 1.1 jakllsch aprint_error(": can't map i/o space\n"); 119 1.1 jakllsch return; 120 1.1 jakllsch } 121 1.1 jakllsch 122 1.1 jakllsch /* Bus-independent attachment */ 123 1.1 jakllsch sc->lmsc.sc_dev = self; 124 1.1 jakllsch sc->lmsc.lm_writereg = lm_isa_writereg; 125 1.1 jakllsch sc->lmsc.lm_readreg = lm_isa_readreg; 126 1.4 pgoyette /* pass wbsio Device ID */ 127 1.6 msaitoh sc->lmsc.sioid = (uint16_t)(uintptr_t)ia->ia_aux; 128 1.1 jakllsch 129 1.1 jakllsch lm_attach(&sc->lmsc); 130 1.1 jakllsch } 131 1.1 jakllsch 132 1.1 jakllsch int 133 1.1 jakllsch lm_isa_detach(device_t self, int flags) 134 1.1 jakllsch { 135 1.1 jakllsch struct lm_isa_softc *sc = device_private(self); 136 1.1 jakllsch 137 1.1 jakllsch lm_detach(&sc->lmsc); 138 1.1 jakllsch bus_space_unmap(sc->lm_iot, sc->lm_ioh, 8); 139 1.1 jakllsch return 0; 140 1.1 jakllsch } 141 1.1 jakllsch 142 1.1 jakllsch static uint8_t 143 1.1 jakllsch lm_isa_readreg(struct lm_softc *lmsc, int reg) 144 1.1 jakllsch { 145 1.1 jakllsch struct lm_isa_softc *sc = (struct lm_isa_softc *)lmsc; 146 1.1 jakllsch 147 1.1 jakllsch bus_space_write_1(sc->lm_iot, sc->lm_ioh, LMC_ADDR, reg); 148 1.1 jakllsch return bus_space_read_1(sc->lm_iot, sc->lm_ioh, LMC_DATA); 149 1.1 jakllsch } 150 1.1 jakllsch 151 1.1 jakllsch static void 152 1.5 msaitoh lm_isa_writereg(struct lm_softc *lmsc, int reg, uint8_t val) 153 1.1 jakllsch { 154 1.1 jakllsch struct lm_isa_softc *sc = (struct lm_isa_softc *)lmsc; 155 1.1 jakllsch 156 1.1 jakllsch bus_space_write_1(sc->lm_iot, sc->lm_ioh, LMC_ADDR, reg); 157 1.1 jakllsch bus_space_write_1(sc->lm_iot, sc->lm_ioh, LMC_DATA, val); 158 1.1 jakllsch } 159 1.1 jakllsch 160 1.3 jakllsch MODULE(MODULE_CLASS_DRIVER, lm_isa_common, "lm"); 161 1.1 jakllsch 162 1.1 jakllsch static int 163 1.1 jakllsch lm_isa_common_modcmd(modcmd_t cmd, void *priv) 164 1.1 jakllsch { 165 1.1 jakllsch if ((cmd == MODULE_CMD_INIT) || (cmd == MODULE_CMD_FINI)) 166 1.1 jakllsch return 0; 167 1.1 jakllsch return ENOTTY; 168 1.1 jakllsch } 169