Annotation of sys/dev/isa/sb_isa.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: sb_isa.c,v 1.8 2006/01/02 05:21:40 brad Exp $ */
! 2: /* $NetBSD: sb_isa.c,v 1.15 1997/11/30 15:32:25 drochner Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1991-1993 Regents of the University of California.
! 6: * All rights reserved.
! 7: *
! 8: * Redistribution and use in source and binary forms, with or without
! 9: * modification, are permitted provided that the following conditions
! 10: * are met:
! 11: * 1. Redistributions of source code must retain the above copyright
! 12: * notice, this list of conditions and the following disclaimer.
! 13: * 2. Redistributions in binary form must reproduce the above copyright
! 14: * notice, this list of conditions and the following disclaimer in the
! 15: * documentation and/or other materials provided with the distribution.
! 16: * 3. All advertising materials mentioning features or use of this software
! 17: * must display the following acknowledgement:
! 18: * This product includes software developed by the Computer Systems
! 19: * Engineering Group at Lawrence Berkeley Laboratory.
! 20: * 4. Neither the name of the University nor of the Laboratory may be used
! 21: * to endorse or promote products derived from this software without
! 22: * specific prior written permission.
! 23: *
! 24: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 25: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 26: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 27: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 28: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 29: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 30: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 31: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 32: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 33: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 34: * SUCH DAMAGE.
! 35: *
! 36: */
! 37:
! 38: #include <sys/param.h>
! 39: #include <sys/systm.h>
! 40: #include <sys/errno.h>
! 41: #include <sys/ioctl.h>
! 42: #include <sys/syslog.h>
! 43: #include <sys/device.h>
! 44: #include <sys/proc.h>
! 45:
! 46: #include <machine/bus.h>
! 47:
! 48: #include <sys/audioio.h>
! 49: #include <dev/audio_if.h>
! 50: #include <dev/midi_if.h>
! 51: #include <dev/mulaw.h>
! 52:
! 53: #include <dev/isa/isavar.h>
! 54: #include <dev/isa/isadmavar.h>
! 55:
! 56: #include <dev/isa/sbreg.h>
! 57: #include <dev/isa/sbvar.h>
! 58:
! 59: #include <dev/isa/sbdspvar.h>
! 60:
! 61: static int sbfind(struct device *, struct sbdsp_softc *, struct isa_attach_args *);
! 62:
! 63: int sb_isa_match(struct device *, void *, void *);
! 64: void sb_isa_attach(struct device *, struct device *, void *);
! 65:
! 66: struct cfattach sb_isa_ca = {
! 67: sizeof(struct sbdsp_softc), sb_isa_match, sb_isa_attach
! 68: };
! 69:
! 70: /*
! 71: * Probe / attach routines.
! 72: */
! 73:
! 74: /*
! 75: * Probe for the soundblaster hardware.
! 76: */
! 77: int
! 78: sb_isa_match(parent, match, aux)
! 79: struct device *parent;
! 80: void *match;
! 81: void *aux;
! 82: {
! 83: struct sbdsp_softc probesc, *sc = &probesc;
! 84:
! 85: bzero(sc, sizeof *sc);
! 86: sc->sc_dev.dv_cfdata = ((struct device *)match)->dv_cfdata;
! 87: strlcpy(sc->sc_dev.dv_xname, "sb", sizeof sc->sc_dev.dv_xname);
! 88: return sbfind(parent, sc, aux);
! 89: }
! 90:
! 91: static int
! 92: sbfind(parent, sc, ia)
! 93: struct device *parent;
! 94: struct sbdsp_softc *sc;
! 95: struct isa_attach_args *ia;
! 96: {
! 97: int rc = 0;
! 98:
! 99: if (!SB_BASE_VALID(ia->ia_iobase))
! 100: return 0;
! 101:
! 102: sc->sc_iot = ia->ia_iot;
! 103:
! 104: /* Map i/o space [we map 24 ports which is the max of the sb and pro] */
! 105: if (bus_space_map(sc->sc_iot, ia->ia_iobase, SBP_NPORT, 0,
! 106: &sc->sc_ioh))
! 107: return 0;
! 108:
! 109: sc->sc_iobase = ia->ia_iobase;
! 110: sc->sc_irq = ia->ia_irq;
! 111: sc->sc_drq8 = ia->ia_drq;
! 112: sc->sc_drq16 = ia->ia_drq2;
! 113: sc->sc_ic = ia->ia_ic;
! 114:
! 115: if (!sbmatch(sc))
! 116: goto bad;
! 117:
! 118: if ((sc->sc_drq8 != -1 && !isa_drq_isfree(parent, sc->sc_drq8)) ||
! 119: (sc->sc_drq16 != -1 && !isa_drq_isfree(parent, sc->sc_drq16)))
! 120: goto bad;
! 121:
! 122: if (ISSBPROCLASS(sc))
! 123: ia->ia_iosize = SBP_NPORT;
! 124: else
! 125: ia->ia_iosize = SB_NPORT;
! 126:
! 127: if (!ISSB16CLASS(sc) && sc->sc_model != SB_JAZZ)
! 128: ia->ia_drq2 = -1;
! 129:
! 130: ia->ia_irq = sc->sc_irq;
! 131:
! 132: rc = 1;
! 133:
! 134: bad:
! 135: bus_space_unmap(sc->sc_iot, sc->sc_ioh, SBP_NPORT);
! 136: return rc;
! 137: }
! 138:
! 139:
! 140: /*
! 141: * Attach hardware to driver, attach hardware driver to audio
! 142: * pseudo-device driver .
! 143: */
! 144: void
! 145: sb_isa_attach(parent, self, aux)
! 146: struct device *parent, *self;
! 147: void *aux;
! 148: {
! 149: struct sbdsp_softc *sc = (struct sbdsp_softc *)self;
! 150: struct isa_attach_args *ia = aux;
! 151:
! 152: if (!sbfind(parent, sc, ia) ||
! 153: bus_space_map(sc->sc_iot, ia->ia_iobase, ia->ia_iosize, 0,
! 154: &sc->sc_ioh)) {
! 155: printf("%s: sbfind failed\n", sc->sc_dev.dv_xname);
! 156: return;
! 157: }
! 158: sc->sc_ic = ia->ia_ic;
! 159: sc->sc_isa = parent;
! 160: sbattach(sc);
! 161: }
CVSweb