[BACK]Return to sb_isa.c CVS log [TXT][DIR] Up to [local] / sys / dev / isa

Annotation of sys/dev/isa/sb_isa.c, Revision 1.1.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