1 #include "guspnp.h" 2 #if NGUSPNP > 0 3 4 /* $NetBSD: gus_isapnp.c,v 1.3 1997/10/19 07:42:52 augustss Exp $ */ 5 6 /* 7 * Copyright (c) 1997 The NetBSD Foundation, Inc. 8 * All rights reserved. 9 * 10 * Author: Kari Mettinen 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 1. Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer. 17 * 2. Redistributions in binary form must reproduce the above copyright 18 * notice, this list of conditions and the following disclaimer in the 19 * documentation and/or other materials provided with the distribution. 20 * 3. All advertising materials mentioning features or use of this software 21 * must display the following acknowledgement: 22 * This product includes software developed by the NetBSD 23 * Foundation, Inc. and its contributors. 24 * 4. Neither the name of The NetBSD Foundation nor the names of its 25 * contributors may be used to endorse or promote products derived 26 * from this software without specific prior written permission. 27 * 28 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 29 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 31 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 32 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 33 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 34 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 35 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 36 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 37 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 38 * POSSIBILITY OF SUCH DAMAGE. 39 */ 40 41 #include <sys/param.h> 42 #include <sys/fcntl.h> 43 #include <sys/vnode.h> 44 #include <sys/poll.h> 45 #include <sys/malloc.h> 46 #include <sys/select.h> 47 #include <sys/systm.h> 48 #include <sys/errno.h> 49 #include <sys/ioctl.h> 50 #include <sys/syslog.h> 51 #include <sys/device.h> 52 #include <sys/proc.h> 53 54 #include <machine/bus.h> 55 56 #include <sys/audioio.h> 57 #include <dev/audio_if.h> 58 #include <dev/audiovar.h> 59 #include <dev/mulaw.h> 60 61 #include <dev/isa/isavar.h> 62 #include <dev/isa/isadmavar.h> 63 #include <i386/isa/icu.h> 64 65 #include <dev/isapnp/isapnpreg.h> 66 #include <dev/isapnp/isapnpvar.h> 67 68 69 #include <dev/ic/interwavevar.h> 70 #include <dev/ic/interwavereg.h> 71 72 73 int gus_isapnp_match __P((struct device *, void *, void *)); 74 void gus_isapnp_attach __P((struct device *, struct device *, void *)); 75 static int gus_isapnp_open __P((void *, int)); 76 77 static struct audio_hw_if guspnp_hw_if = { 78 gus_isapnp_open, 79 iwclose, 80 NULL, 81 82 iw_query_encoding, 83 iw_set_params, 84 85 iw_round_blocksize, 86 87 iw_commit_settings, 88 89 iw_init_output, 90 iw_init_input, 91 iw_start_output, 92 iw_start_input, 93 iw_halt_output, 94 iw_halt_input, 95 96 iw_speaker_ctl, 97 98 iw_getdev, 99 iw_setfd, 100 iw_set_port, 101 iw_get_port, 102 iw_query_devinfo, 103 iw_malloc, 104 iw_free, 105 iw_round, 106 iw_mappage, 107 iw_get_props, 108 }; 109 110 111 112 struct cfattach guspnp_ca = { 113 sizeof(struct iw_softc), gus_isapnp_match, gus_isapnp_attach 114 }; 115 116 struct cfdriver guspnp_cd = { 117 NULL, "guspnp", DV_DULL 118 }; 119 120 121 /* 122 * Probe / attach routines. 123 */ 124 125 /* 126 * Probe for the guspnp hardware. 127 * 128 * The thing has 5 separate devices on the card 129 */ 130 131 static int gus_0 = 0; /* XXX what's this */ 132 133 int 134 gus_isapnp_match(parent, match, aux) 135 struct device *parent; 136 void *match, *aux; 137 { 138 struct isapnp_attach_args *ipa = aux; 139 140 if (!strcmp(ipa->ipa_devlogic, "GRV0000")) { 141 gus_0 = 1; 142 return 1; 143 /* we'll add support for other logical devices later */ 144 } 145 return 0; 146 } 147 148 149 150 /* 151 * Attach hardware to driver, attach hardware driver to audio 152 * pseudo-device driver. 153 */ 154 155 static struct iw_softc *gussc; 156 157 void 158 gus_isapnp_attach(parent, self, aux) 159 struct device *parent, *self; 160 void *aux; 161 { 162 struct iw_softc *sc = (struct iw_softc *)self; 163 struct isapnp_attach_args *ipa = aux; 164 165 printf("\n"); 166 167 if (!gus_0) 168 return; 169 170 gussc = sc; 171 172 sc->sc_iot = ipa->ipa_iot; 173 174 /* handle is the region base */ 175 176 sc->dir_h = 0; /* XXXXX */ 177 sc->p2xr = 0; 178 sc->p2xr_h = ipa->ipa_io[0].h; 179 sc->sc_p2xr_ic = ipa->ipa_ic; 180 sc->p3xr = 0; 181 sc->p3xr_h = ipa->ipa_io[1].h; 182 sc->sc_p3xr_ic = ipa->ipa_ic; 183 sc->codec_index = 0; 184 sc->codec_index_h = ipa->ipa_io[2].h; 185 sc->sc_irq = ipa->ipa_irq[0].num; 186 sc->sc_recdrq = ipa->ipa_drq[0].num; 187 sc->sc_playdrq = ipa->ipa_drq[1].num; 188 189 sc->sc_isa = parent->dv_parent; 190 191 /* 192 * Create our DMA maps. 193 */ 194 if (sc->sc_playdrq != -1) { 195 if (isa_dmamap_create(sc->sc_isa, sc->sc_playdrq, 196 MAX_ISADMA, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW)) { 197 printf("%s: can't create map for drq %d\n", 198 sc->sc_dev.dv_xname, sc->sc_playdrq); 199 return; 200 } 201 } 202 if (sc->sc_recdrq != -1) { 203 if (isa_dmamap_create(sc->sc_isa, sc->sc_recdrq, 204 MAX_ISADMA, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW)) { 205 printf("%s: can't create map for drq %d\n", 206 sc->sc_dev.dv_xname, sc->sc_recdrq); 207 return; 208 } 209 } 210 211 /* 212 * isapnp is a child if isa, and we need isa for the dma 213 * routines. 214 */ 215 sc->iw_cd = &guspnp_cd; 216 sc->iw_hw_if = &guspnp_hw_if; 217 218 if (isapnp_config(ipa->ipa_iot, ipa->ipa_memt, ipa)) { 219 printf("%s: error in region allocation\n", 220 sc->sc_dev.dv_xname); 221 return; 222 } 223 224 printf("%s: %s %s", sc->sc_dev.dv_xname, ipa->ipa_devident, 225 ipa->ipa_devclass); 226 227 iwattach(sc); 228 } 229 230 static 231 int 232 gus_isapnp_open(addr, flags) 233 void *addr; 234 int flags; 235 { 236 /* open hardware */ 237 struct iw_softc *sc = (struct iw_softc *)addr; 238 239 if (!sc) 240 return ENXIO; 241 242 return iwopen(sc,flags); 243 } 244 245 #endif /* NGUSPNP */ 246