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

Annotation of sys/dev/isa/mpu_isa.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: mpu_isa.c,v 1.3 2003/01/29 20:35:13 mickey Exp $      */
                      2:
                      3: /*
                      4:  * Copyright (c) 2002 Sergey Smitienko. All rights reserved.
                      5:  *
                      6:  * Redistribution and use in source and binary forms, with or without
                      7:  * modification, are permitted provided that the following conditions
                      8:  * are met:
                      9:  * 1. Redistributions of source code must retain the above copyright
                     10:  *    notice, this list of conditions and the following disclaimer.
                     11:  * 2. Redistributions in binary form must reproduce the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer in the
                     13:  *    documentation and/or other materials provided with the distribution.
                     14:  * 3. The name of the author may not be used to endorse or promote products
                     15:  *    derived from this software without specific prior written permission.
                     16:  *
                     17:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     18:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     19:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     20:  * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
                     21:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
                     22:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
                     23:  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     24:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
                     25:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     26:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
                     27:  * OF THE POSSIBILITY OF SUCH DAMAGE.
                     28:  */
                     29:
                     30: #include <sys/param.h>
                     31: #include <sys/systm.h>
                     32: #include <sys/errno.h>
                     33: #include <sys/ioctl.h>
                     34: #include <sys/syslog.h>
                     35: #include <sys/device.h>
                     36: #include <sys/proc.h>
                     37:
                     38: #include <machine/bus.h>
                     39:
                     40: #include <sys/audioio.h>
                     41: #include <dev/audio_if.h>
                     42: #include <dev/midi_if.h>
                     43:
                     44: #include <dev/isa/isavar.h>
                     45: #include <dev/isa/isadmavar.h>
                     46:
                     47: #include <dev/ic/mpuvar.h>
                     48:
                     49: int    mpu_isa_match(struct device *, void *, void *);
                     50: void   mpu_isa_attach(struct device *, struct device *, void *);
                     51: int    mpu_test(bus_space_tag_t, int);
                     52:
                     53: #ifdef AUDIO_DEBUG
                     54: #define        DPRINTF(x)      if (mpu_debug) printf x
                     55: int    mpu_debug = 0;
                     56: #else
                     57: #define        DPRINTF(x)
                     58: #endif
                     59:
                     60: #define MPU_GETSTATUS(iot, ioh) (bus_space_read_1(iot, ioh, MPU_STATUS))
                     61:
                     62: struct mpu_isa_softc {
                     63:        struct device sc_dev;
                     64:
                     65:        struct mpu_softc sc_mpu;
                     66: };
                     67:
                     68: struct cfattach mpu_isa_ca = {
                     69:        sizeof(struct mpu_isa_softc), mpu_isa_match, mpu_isa_attach
                     70: };
                     71:
                     72: int
                     73: mpu_test (iot, iobase)
                     74:        bus_space_tag_t iot;
                     75:        int iobase;     /* base port number to try */
                     76: {
                     77:        bus_space_handle_t ioh;
                     78:        int     i, rc;
                     79:
                     80:        rc = 0;
                     81:        if (bus_space_map(iot, iobase, MPU401_NPORT, 0, &ioh)) {
                     82:                DPRINTF(("mpu_test: can`t map: %x/2\n", iobase));
                     83:                return (0);
                     84:        }
                     85:
                     86:        DPRINTF(("mpu_test: trying: %x\n", iobase));
                     87:
                     88:        /*
                     89:         * The following code is a shameless copy of mpu401.c
                     90:         * it is here until a redesign of mpu_find() interface
                     91:         */
                     92:
                     93:        if (MPU_GETSTATUS(iot, ioh) == 0xff)
                     94:                goto done;
                     95:
                     96:        for (i = 0; i < MPU_MAXWAIT; i++) {
                     97:                if (!(MPU_GETSTATUS(iot, ioh) & MPU_OUTPUT_BUSY)) {
                     98:                        rc = 1;
                     99:                        break;
                    100:                }
                    101:                delay (10);
                    102:        }
                    103:
                    104:        if (rc == 1) {
                    105:                bus_space_write_1(iot, ioh, MPU_COMMAND, MPU_RESET);
                    106:                rc = 0;
                    107:                for (i = 0; i < 2 * MPU_MAXWAIT; i++)
                    108:                        if (!(MPU_GETSTATUS(iot, ioh) & MPU_INPUT_EMPTY) &&
                    109:                            bus_space_read_1(iot, ioh, MPU_DATA) == MPU_ACK) {
                    110:                                rc = 1;
                    111:                                break;
                    112:                        }
                    113:        }
                    114: done:
                    115:        bus_space_unmap(iot, ioh, MPU401_NPORT);
                    116:
                    117:        return (rc);
                    118: }
                    119:
                    120: int
                    121: mpu_isa_match(parent, match, aux)
                    122:        struct device *parent;
                    123:        void *match, *aux;
                    124: {
                    125:        struct isa_attach_args *ia = aux;
                    126:
                    127:         if (mpu_test(ia->ia_iot, ia->ia_iobase)) {
                    128:                ia->ia_iosize = MPU401_NPORT;
                    129:                return (1);
                    130:        }
                    131:
                    132:        return (0);
                    133: }
                    134:
                    135: void
                    136: mpu_isa_attach(parent, self, aux)
                    137:        struct device *parent, *self;
                    138:        void *aux;
                    139: {
                    140:        struct mpu_isa_softc *sc = (struct mpu_isa_softc *)self;
                    141:        struct isa_attach_args *ia = aux;
                    142:
                    143:        sc->sc_mpu.iot = ia->ia_iot;
                    144:
                    145:        if (bus_space_map (ia->ia_iot, ia->ia_iobase, MPU401_NPORT,
                    146:            0, &sc->sc_mpu.ioh)) {
                    147:                printf(": can`t map i/o space\n");
                    148:                return;
                    149:        }
                    150:
                    151:        if (!mpu_find(&sc->sc_mpu)) {
                    152:                printf(": find failed\n");
                    153:                return;
                    154:        }
                    155:
                    156:        printf(": generic MPU-401 compatible\n");
                    157:
                    158:        midi_attach_mi(&mpu_midi_hw_if, &sc->sc_mpu, &sc->sc_dev);
                    159: }

CVSweb