diff options
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/isa/files.isa | 8 | ||||
| -rw-r--r-- | sys/dev/isa/mpu.c (renamed from sys/dev/isa/mpu401.c) | 111 | ||||
| -rw-r--r-- | sys/dev/isa/mpuvar.h (renamed from sys/dev/isa/mpu401var.h) | 20 | ||||
| -rw-r--r-- | sys/dev/isa/sb.c | 87 | ||||
| -rw-r--r-- | sys/dev/isa/sb_isa.c | 6 | ||||
| -rw-r--r-- | sys/dev/isa/sbdsp.c | 85 | ||||
| -rw-r--r-- | sys/dev/isa/sbdspvar.h | 6 | ||||
| -rw-r--r-- | sys/dev/isa/sbreg.h | 4 |
8 files changed, 153 insertions, 174 deletions
diff --git a/sys/dev/isa/files.isa b/sys/dev/isa/files.isa index 5ba6da9391d..e06b4b7855c 100644 --- a/sys/dev/isa/files.isa +++ b/sys/dev/isa/files.isa @@ -1,4 +1,4 @@ -# $NetBSD: files.isa,v 1.81 1998/12/16 11:33:50 christos Exp $ +# $NetBSD: files.isa,v 1.82 1999/03/22 07:37:35 mycroft Exp $ # # Config file and device description for machine-independent ISA code. # Included by ports that need it. Requires that the SCSI files be @@ -248,15 +248,15 @@ file dev/isa/if_ix.c ix # # MPU401 MIDI UART compatibles -define mpu401 -file dev/isa/mpu401.c mpu401 & midi +device mpu: midibus +file dev/isa/mpu.c (mpu | sb) needs-flag # the SoundBlaster DSP, or close likenesses; used by other drivers define sbdsp { } file dev/isa/sbdsp.c sbdsp # SoundBlaster family -device sb: audio, isadma, sbdsp, mulaw, auconv, mpu401, midibus +device sb: audio, isadma, sbdsp, mulaw, auconv, midibus file dev/isa/sb.c sb needs-flag attach sb at isa with sb_isa diff --git a/sys/dev/isa/mpu401.c b/sys/dev/isa/mpu.c index 982c93cd2dd..befa507ae2f 100644 --- a/sys/dev/isa/mpu401.c +++ b/sys/dev/isa/mpu.c @@ -1,4 +1,6 @@ -/* $NetBSD: mpu401.c,v 1.3 1998/11/25 22:17:06 augustss Exp $ */ +/* $NetBSD: mpu.c,v 1.1 1999/03/22 07:37:35 mycroft Exp $ */ + +#define AUDIO_DEBUG /* * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -55,12 +57,12 @@ #include <dev/isa/isavar.h> #include <dev/isa/isadmavar.h> -#include <dev/isa/mpu401var.h> +#include <dev/isa/mpuvar.h> #ifdef AUDIO_DEBUG -#define DPRINTF(x) if (mpu401debug) printf x -#define DPRINTFN(n,x) if (mpu401debug >= (n)) printf x -int mpu401debug = 0; +#define DPRINTF(x) if (mpudebug) printf x +#define DPRINTFN(n,x) if (mpudebug >= (n)) printf x +int mpudebug = 100; #else #define DPRINTF(x) #define DPRINTFN(n,x) @@ -80,29 +82,37 @@ int mpu401debug = 0; #define MPU_GETSTATUS(iot, ioh) (bus_space_read_1(iot, ioh, MPU_STATUS)) -int mpu401_reset(struct mpu401_softc *); -static __inline int mpu401_waitready(struct mpu401_softc *); -void mpu401_readinput(struct mpu401_softc *); +int mpu_reset(struct mpu_softc *); +static __inline int mpu_waitready(struct mpu_softc *); +void mpu_readinput(struct mpu_softc *); + +struct midi_hw_if mpu_midi_hw_if = { + mpu_open, + mpu_close, + mpu_output, + mpu_getinfo, + 0, /* ioctl */ +}; int -mpu401_find(sc) - struct mpu401_softc *sc; +mpu_find(sc) + struct mpu_softc *sc; { if (MPU_GETSTATUS(sc->iot, sc->ioh) == 0xff) { - DPRINTF(("mpu401_find: No status\n")); + DPRINTF(("mpu_find: No status\n")); goto bad; } sc->open = 0; sc->intr = 0; - if (mpu401_reset(sc) == 0) + if (mpu_reset(sc) == 0) return 1; bad: return 0; } static __inline int -mpu401_waitready(sc) - struct mpu401_softc *sc; +mpu_waitready(sc) + struct mpu_softc *sc; { int i; @@ -115,16 +125,16 @@ mpu401_waitready(sc) } int -mpu401_reset(sc) - struct mpu401_softc *sc; +mpu_reset(sc) + struct mpu_softc *sc; { bus_space_tag_t iot = sc->iot; bus_space_handle_t ioh = sc->ioh; int i; int s; - if (mpu401_waitready(sc)) { - DPRINTF(("mpu401_reset: not ready\n")); + if (mpu_waitready(sc)) { + DPRINTF(("mpu_reset: not ready\n")); return EIO; } s = splaudio(); /* Don't let the interrupt get our ACK. */ @@ -137,23 +147,25 @@ mpu401_reset(sc) } } splx(s); - DPRINTF(("mpu401_reset: No ACK\n")); + DPRINTF(("mpu_reset: No ACK\n")); return EIO; } int -mpu401_open(sc, flags, iintr, ointr, arg) - struct mpu401_softc *sc; +mpu_open(addr, flags, iintr, ointr, arg) + void *addr; int flags; void (*iintr)__P((void *, int)); void (*ointr)__P((void *)); void *arg; { - DPRINTF(("mpu401_open: sc=%p\n", sc)); + struct mpu_softc *sc = addr; + + DPRINTF(("mpu_open: sc=%p\n", sc)); if (sc->open) return EBUSY; - if (mpu401_reset(sc) != 0) + if (mpu_reset(sc) != 0) return EIO; bus_space_write_1(sc->iot, sc->ioh, MPU_COMMAND, MPU_UART_MODE); @@ -164,19 +176,21 @@ mpu401_open(sc, flags, iintr, ointr, arg) } void -mpu401_close(sc) - struct mpu401_softc *sc; +mpu_close(addr) + void *addr; { - DPRINTF(("mpu401_close: sc=%p\n", sc)); + struct mpu_softc *sc = addr; + + DPRINTF(("mpu_close: sc=%p\n", sc)); sc->open = 0; sc->intr = 0; - mpu401_reset(sc); /* exit UART mode */ + mpu_reset(sc); /* exit UART mode */ } void -mpu401_readinput(sc) - struct mpu401_softc *sc; +mpu_readinput(sc) + struct mpu_softc *sc; { bus_space_tag_t iot = sc->iot; bus_space_handle_t ioh = sc->ioh; @@ -184,27 +198,28 @@ mpu401_readinput(sc) while(!(MPU_GETSTATUS(iot, ioh) & MPU_INPUT_EMPTY)) { data = bus_space_read_1(iot, ioh, MPU_DATA); - DPRINTFN(3, ("mpu401_rea: sc=%p 0x%02x\n", sc, data)); + DPRINTFN(3, ("mpu_rea: sc=%p 0x%02x\n", sc, data)); if (sc->intr) sc->intr(sc->arg, data); } } int -mpu401_output(sc, d) - struct mpu401_softc *sc; +mpu_output(addr, d) + void *addr; int d; { + struct mpu_softc *sc = addr; int s; - DPRINTFN(3, ("mpu401_output: sc=%p 0x%02x\n", sc, d)); + DPRINTFN(3, ("mpu_output: sc=%p 0x%02x\n", sc, d)); if (!(MPU_GETSTATUS(sc->iot, sc->ioh) & MPU_INPUT_EMPTY)) { s = splaudio(); - mpu401_readinput(sc); + mpu_readinput(sc); splx(s); } - if (mpu401_waitready(sc)) { - DPRINTF(("mpu401_output: not ready\n")); + if (mpu_waitready(sc)) { + DPRINTF(("mpu_output: not ready\n")); return EIO; } bus_space_write_1(sc->iot, sc->ioh, MPU_DATA, d); @@ -212,12 +227,26 @@ mpu401_output(sc, d) } void -mpu401_intr(sc) - struct mpu401_softc *sc; +mpu_getinfo(addr, mi) + void *addr; + struct midi_info *mi; +{ + + mi->name = "MPU-401 MIDI UART"; + mi->props = 0; +} + +int +mpu_intr(addr) + void *addr; { + struct mpu_softc *sc = addr; + if (MPU_GETSTATUS(sc->iot, sc->ioh) & MPU_INPUT_EMPTY) { - DPRINTF(("mpu401_intr: no data\n")); - return; + DPRINTF(("mpu_intr: no data\n")); + return (0); + } else { + mpu_readinput(sc); + return (1); } - mpu401_readinput(sc); } diff --git a/sys/dev/isa/mpu401var.h b/sys/dev/isa/mpuvar.h index c8b05cd3c8d..fd59eb968d6 100644 --- a/sys/dev/isa/mpu401var.h +++ b/sys/dev/isa/mpuvar.h @@ -1,4 +1,4 @@ -/* $NetBSD: mpu401var.h,v 1.3 1998/11/25 22:17:06 augustss Exp $ */ +/* $NetBSD: mpuvar.h,v 1.1 1999/03/22 07:37:35 mycroft Exp $ */ /* * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -36,21 +36,21 @@ * POSSIBILITY OF SUCH DAMAGE. */ -struct mpu401_softc { +struct mpu_softc { bus_space_tag_t iot; /* tag */ bus_space_handle_t ioh; /* handle */ - int iobase; int open; - void (*intr)__P((void*, int)); /* midi input intr handler */ + void (*intr)__P((void *, int)); /* midi input intr handler */ void *arg; /* arg for intr() */ }; -struct midi_hw_if mpu401_midi_hw_if; +struct midi_hw_if mpu_midi_hw_if; -void mpu401_intr __P((struct mpu401_softc *)); -int mpu401_find __P((struct mpu401_softc *)); -int mpu401_open __P((struct mpu401_softc *, int, +int mpu_find __P((struct mpu_softc *)); +int mpu_open __P((void *, int, void (*iintr)__P((void *, int)), void (*ointr)__P((void *)), void *arg)); -void mpu401_close __P((struct mpu401_softc *)); -int mpu401_output __P((struct mpu401_softc *, int)); +void mpu_close __P((void *)); +int mpu_output __P((void *, int)); +void mpu_getinfo __P((void *, struct midi_info *)); +int mpu_intr __P((void *)); diff --git a/sys/dev/isa/sb.c b/sys/dev/isa/sb.c index 6735941f636..f30825ee67b 100644 --- a/sys/dev/isa/sb.c +++ b/sys/dev/isa/sb.c @@ -1,4 +1,4 @@ -/* $NetBSD: sb.c,v 1.66 1999/02/19 16:10:44 mycroft Exp $ */ +/* $NetBSD: sb.c,v 1.67 1999/03/22 07:37:35 mycroft Exp $ */ /* * Copyright (c) 1991-1993 Regents of the University of California. @@ -62,13 +62,6 @@ #include <dev/isa/sbdspvar.h> #if NMIDI > 0 -int sb_mpu401_open __P((void *, int, - void (*iintr)__P((void *, int)), - void (*ointr)__P((void *)), void *arg)); -void sb_mpu401_close __P((void *)); -int sb_mpu401_output __P((void *, int)); -void sb_mpu401_getinfo __P((void *, struct midi_info *)); - struct midi_hw_if sb_midi_hw_if = { sbdsp_midi_open, sbdsp_midi_close, @@ -76,14 +69,6 @@ struct midi_hw_if sb_midi_hw_if = { sbdsp_midi_getinfo, 0, /* ioctl */ }; - -struct midi_hw_if sb_mpu401_hw_if = { - sb_mpu401_open, - sb_mpu401_close, - sb_mpu401_output, - sb_mpu401_getinfo, - 0, /* ioctl */ -}; #endif struct audio_device sb_device = { @@ -247,30 +232,29 @@ sbattach(sc) struct sbdsp_softc *sc; { struct audio_attach_args arg; -#if NMIDI > 0 - struct midi_hw_if *mhw = &sb_midi_hw_if; -#endif sbdsp_attach(sc); #if NMIDI > 0 - sc->sc_hasmpu = 0; - if (ISSB16CLASS(sc) && sc->sc_mpu_sc.iobase != 0) { - sc->sc_mpu_sc.iot = sc->sc_iot; - if (mpu401_find(&sc->sc_mpu_sc)) { - sc->sc_hasmpu = 1; - mhw = &sb_mpu401_hw_if; - } + if (ISSB16CLASS(sc)) { + if (sc->sc_hasmpu && mpu_find(&sc->sc_mpu)) + midi_attach_mi(&mpu_midi_hw_if, &sc->sc_mpu, &sc->sc_dev); + else + sc->sc_hasmpu = 0; + } else { + sc->sc_hasmpu = 0; + midi_attach_mi(&sb_midi_hw_if, sc, &sc->sc_dev); } - midi_attach_mi(mhw, sc, &sc->sc_dev); #endif audio_attach_mi(&sb_hw_if, sc, &sc->sc_dev); - arg.type = AUDIODEV_TYPE_OPL; - arg.hwif = 0; - arg.hdl = 0; - (void)config_found(&sc->sc_dev, &arg, audioprint); + if (sc->sc_model >= SB_20) { + arg.type = AUDIODEV_TYPE_OPL; + arg.hwif = 0; + arg.hdl = 0; + (void)config_found(&sc->sc_dev, &arg, audioprint); + } } /* @@ -301,44 +285,3 @@ sb_getdev(addr, retp) return 0; } - -#if NMIDI > 0 - -#define SBMPU(a) (&((struct sbdsp_softc *)addr)->sc_mpu_sc) - -int -sb_mpu401_open(addr, flags, iintr, ointr, arg) - void *addr; - int flags; - void (*iintr)__P((void *, int)); - void (*ointr)__P((void *)); - void *arg; -{ - return mpu401_open(SBMPU(addr), flags, iintr, ointr, arg); -} - -int -sb_mpu401_output(addr, d) - void *addr; - int d; -{ - return mpu401_output(SBMPU(addr), d); -} - -void -sb_mpu401_close(addr) - void *addr; -{ - mpu401_close(SBMPU(addr)); -} - -void -sb_mpu401_getinfo(addr, mi) - void *addr; - struct midi_info *mi; -{ - mi->name = "SB MPU-401 UART"; - mi->props = 0; -} -#endif - diff --git a/sys/dev/isa/sb_isa.c b/sys/dev/isa/sb_isa.c index 2c35a777636..52a2c610e88 100644 --- a/sys/dev/isa/sb_isa.c +++ b/sys/dev/isa/sb_isa.c @@ -1,4 +1,4 @@ -/* $NetBSD: sb_isa.c,v 1.20 1999/02/19 16:10:44 mycroft Exp $ */ +/* $NetBSD: sb_isa.c,v 1.21 1999/03/22 07:37:35 mycroft Exp $ */ /* * Copyright (c) 1991-1993 Regents of the University of California. @@ -121,10 +121,6 @@ sbfind(parent, sc, ia) if (!sbmatch(sc)) goto bad; - if ((sc->sc_drq8 != -1 && !isa_drq_isfree(sc->sc_ic, sc->sc_drq8)) || - (sc->sc_drq16 != -1 && !isa_drq_isfree(sc->sc_ic, sc->sc_drq16))) - goto bad; - if (ISSBPROCLASS(sc)) ia->ia_iosize = SBP_NPORT; else diff --git a/sys/dev/isa/sbdsp.c b/sys/dev/isa/sbdsp.c index d2332810761..65639a31779 100644 --- a/sys/dev/isa/sbdsp.c +++ b/sys/dev/isa/sbdsp.c @@ -1,4 +1,4 @@ -/* $NetBSD: sbdsp.c,v 1.96 1999/02/22 02:16:40 mycroft Exp $ */ +/* $NetBSD: sbdsp.c,v 1.97 1999/03/22 07:37:35 mycroft Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -171,17 +171,17 @@ struct sbmode { static struct sbmode sbpmodes[] = { { SB_1, 1, 8, 4000,22727,SB_DSP_WDMA ,SB_DSP_HALT ,SB_DSP_CONT }, { SB_20, 1, 8, 4000,22727,SB_DSP_WDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT }, - { SB_2x, 1, 8, 4000,22727,SB_DSP_WDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT }, { SB_2x, 1, 8,22727,45454,SB_DSP_HS_OUTPUT,SB_DSP_HALT ,SB_DSP_CONT }, - { SB_PRO, 1, 8, 4000,22727,SB_DSP_WDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT }, + { SB_2x, 1, 8, 4000,22727,SB_DSP_WDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT }, { SB_PRO, 1, 8,22727,45454,SB_DSP_HS_OUTPUT,SB_DSP_HALT ,SB_DSP_CONT }, + { SB_PRO, 1, 8, 4000,22727,SB_DSP_WDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT }, { SB_PRO, 2, 8,11025,22727,SB_DSP_HS_OUTPUT,SB_DSP_HALT ,SB_DSP_CONT }, /* Yes, we write the record mode to set 16-bit playback mode. weird, huh? */ - { SB_JAZZ,1, 8, 4000,22727,SB_DSP_WDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT ,SB_DSP_RECORD_MONO }, { SB_JAZZ,1, 8,22727,45454,SB_DSP_HS_OUTPUT,SB_DSP_HALT ,SB_DSP_CONT ,SB_DSP_RECORD_MONO }, + { SB_JAZZ,1, 8, 4000,22727,SB_DSP_WDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT ,SB_DSP_RECORD_MONO }, { SB_JAZZ,2, 8,11025,22727,SB_DSP_HS_OUTPUT,SB_DSP_HALT ,SB_DSP_CONT ,SB_DSP_RECORD_STEREO }, - { SB_JAZZ,1,16, 4000,22727,SB_DSP_WDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT ,JAZZ16_RECORD_MONO }, { SB_JAZZ,1,16,22727,45454,SB_DSP_HS_OUTPUT,SB_DSP_HALT ,SB_DSP_CONT ,JAZZ16_RECORD_MONO }, + { SB_JAZZ,1,16, 4000,22727,SB_DSP_WDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT ,JAZZ16_RECORD_MONO }, { SB_JAZZ,2,16,11025,22727,SB_DSP_HS_OUTPUT,SB_DSP_HALT ,SB_DSP_CONT ,JAZZ16_RECORD_STEREO }, { SB_16, 1, 8, 5000,45000,SB_DSP16_WDMA_8 ,SB_DSP_HALT ,SB_DSP_CONT }, { SB_16, 2, 8, 5000,45000,SB_DSP16_WDMA_8 ,SB_DSP_HALT ,SB_DSP_CONT }, @@ -193,16 +193,16 @@ static struct sbmode sbpmodes[] = { static struct sbmode sbrmodes[] = { { SB_1, 1, 8, 4000,12987,SB_DSP_RDMA ,SB_DSP_HALT ,SB_DSP_CONT }, { SB_20, 1, 8, 4000,12987,SB_DSP_RDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT }, - { SB_2x, 1, 8, 4000,12987,SB_DSP_RDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT }, { SB_2x, 1, 8,12987,14925,SB_DSP_HS_INPUT ,SB_DSP_HALT ,SB_DSP_CONT }, - { SB_PRO, 1, 8, 4000,22727,SB_DSP_RDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT ,SB_DSP_RECORD_MONO }, + { SB_2x, 1, 8, 4000,12987,SB_DSP_RDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT }, { SB_PRO, 1, 8,22727,45454,SB_DSP_HS_INPUT ,SB_DSP_HALT ,SB_DSP_CONT ,SB_DSP_RECORD_MONO }, + { SB_PRO, 1, 8, 4000,22727,SB_DSP_RDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT ,SB_DSP_RECORD_MONO }, { SB_PRO, 2, 8,11025,22727,SB_DSP_HS_INPUT ,SB_DSP_HALT ,SB_DSP_CONT ,SB_DSP_RECORD_STEREO }, - { SB_JAZZ,1, 8, 4000,22727,SB_DSP_RDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT ,SB_DSP_RECORD_MONO }, { SB_JAZZ,1, 8,22727,45454,SB_DSP_HS_INPUT ,SB_DSP_HALT ,SB_DSP_CONT ,SB_DSP_RECORD_MONO }, + { SB_JAZZ,1, 8, 4000,22727,SB_DSP_RDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT ,SB_DSP_RECORD_MONO }, { SB_JAZZ,2, 8,11025,22727,SB_DSP_HS_INPUT ,SB_DSP_HALT ,SB_DSP_CONT ,SB_DSP_RECORD_STEREO }, - { SB_JAZZ,1,16, 4000,22727,SB_DSP_RDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT ,JAZZ16_RECORD_MONO }, { SB_JAZZ,1,16,22727,45454,SB_DSP_HS_INPUT ,SB_DSP_HALT ,SB_DSP_CONT ,JAZZ16_RECORD_MONO }, + { SB_JAZZ,1,16, 4000,22727,SB_DSP_RDMA_LOOP,SB_DSP_HALT ,SB_DSP_CONT ,JAZZ16_RECORD_MONO }, { SB_JAZZ,2,16,11025,22727,SB_DSP_HS_INPUT ,SB_DSP_HALT ,SB_DSP_CONT ,JAZZ16_RECORD_STEREO }, { SB_16, 1, 8, 5000,45000,SB_DSP16_RDMA_8 ,SB_DSP_HALT ,SB_DSP_CONT }, { SB_16, 2, 8, 5000,45000,SB_DSP16_RDMA_8 ,SB_DSP_HALT ,SB_DSP_CONT }, @@ -367,26 +367,6 @@ sbdsp_attach(sc) int i; u_int v; - /* - * Create our DMA maps. - */ - if (sc->sc_drq8 != -1) { - if (isa_dmamap_create(sc->sc_ic, sc->sc_drq8, - MAX_ISADMA, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW)) { - printf("%s: can't create map for drq %d\n", - sc->sc_dev.dv_xname, sc->sc_drq8); - return; - } - } - if (sc->sc_drq16 != -1 && sc->sc_drq16 != sc->sc_drq8) { - if (isa_dmamap_create(sc->sc_ic, sc->sc_drq16, - MAX_ISADMA, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW)) { - printf("%s: can't create map for drq %d\n", - sc->sc_dev.dv_xname, sc->sc_drq16); - return; - } - } - pparams = audio_default; rparams = audio_default; sbdsp_set_params(sc, AUMODE_RECORD|AUMODE_PLAY, 0, &pparams, &rparams); @@ -603,7 +583,7 @@ sbdsp_set_params(addr, setmode, usemode, play, rec) p->channels == m->channels && p->precision == m->precision && p->sample_rate >= m->lowrate && - p->sample_rate < m->highrate) + p->sample_rate <= m->highrate) break; } if (m->model == -1) @@ -887,17 +867,39 @@ sbdsp_open(addr, flags) int flags; { struct sbdsp_softc *sc = addr; + int error; DPRINTF(("sbdsp_open: sc=%p\n", sc)); if (sc->sc_open != SB_CLOSED) - return EBUSY; - if (sbdsp_reset(sc) != 0) - return EIO; - + return (EBUSY); sc->sc_open = SB_OPEN_AUDIO; sc->sc_openflags = flags; + if (sc->sc_drq8 != -1) { + error = isa_dmamap_create(sc->sc_ic, sc->sc_drq8, + MAX_ISADMA, BUS_DMA_NOWAIT); + if (error) { + printf("%s: can't create map for drq %d\n", + sc->sc_dev.dv_xname, sc->sc_drq8); + goto bad; + } + } + if (sc->sc_drq16 != -1 && sc->sc_drq16 != sc->sc_drq8) { + error = isa_dmamap_create(sc->sc_ic, sc->sc_drq16, + MAX_ISADMA, BUS_DMA_NOWAIT); + if (error) { + printf("%s: can't create map for drq %d\n", + sc->sc_dev.dv_xname, sc->sc_drq16); + goto bad; + } + } + + if (sbdsp_reset(sc) != 0) { + error = EIO; + goto bad; + } + if (ISSBPRO(sc) && sbdsp_wdsp(sc, SB_DSP_RECORD_MONO) < 0) { DPRINTF(("sbdsp_open: can't set mono mode\n")); @@ -912,7 +914,11 @@ sbdsp_open(addr, flags) */ DPRINTF(("sbdsp_open: opened\n")); - return 0; + return (0); + +bad: + sc->sc_open = SB_CLOSED; + return (error); } void @@ -931,8 +937,13 @@ sbdsp_close(addr) sc->sc_intr8 = 0; sc->sc_intr16 = 0; - sc->sc_open = SB_CLOSED; + if (sc->sc_drq8 != -1) + isa_dmamap_destroy(sc->sc_ic, sc->sc_drq8); + if (sc->sc_drq16 != -1 && sc->sc_drq16 != sc->sc_drq8) + isa_dmamap_destroy(sc->sc_ic, sc->sc_drq16); + + sc->sc_open = SB_CLOSED; DPRINTF(("sbdsp_close: closed\n")); } @@ -1518,7 +1529,7 @@ sbdsp_intr(arg) } #if NMIDI > 0 if ((irq & SBP_IRQ_MPU401) && sc->sc_hasmpu) { - mpu401_intr(&sc->sc_mpu_sc); + mpu_intr(&sc->sc_mpu); } #endif return 1; diff --git a/sys/dev/isa/sbdspvar.h b/sys/dev/isa/sbdspvar.h index 8599ce44360..4132f6c0c56 100644 --- a/sys/dev/isa/sbdspvar.h +++ b/sys/dev/isa/sbdspvar.h @@ -1,4 +1,4 @@ -/* $NetBSD: sbdspvar.h,v 1.41 1999/02/19 16:10:44 mycroft Exp $ */ +/* $NetBSD: sbdspvar.h,v 1.42 1999/03/22 07:37:36 mycroft Exp $ */ /* * Copyright (c) 1991-1993 Regents of the University of California. @@ -36,7 +36,7 @@ #include "midi.h" #if NMIDI > 0 -#include <dev/isa/mpu401var.h> +#include <dev/isa/mpuvar.h> #endif #define SB_MASTER_VOL 0 @@ -174,7 +174,7 @@ struct sbdsp_softc { #if NMIDI > 0 int sc_hasmpu; - struct mpu401_softc sc_mpu_sc; /* MPU401 Uart state */ + struct mpu_softc sc_mpu; /* MPU401 Uart state */ #endif }; diff --git a/sys/dev/isa/sbreg.h b/sys/dev/isa/sbreg.h index a250e70fba6..4f3fc274f2b 100644 --- a/sys/dev/isa/sbreg.h +++ b/sys/dev/isa/sbreg.h @@ -1,4 +1,4 @@ -/* $NetBSD: sbreg.h,v 1.27 1999/02/18 07:08:36 mycroft Exp $ */ +/* $NetBSD: sbreg.h,v 1.28 1999/03/22 07:37:36 mycroft Exp $ */ /* * Copyright (c) 1991-1993 Regents of the University of California. @@ -288,7 +288,7 @@ #define SBP_DRQ_VALID(chan) ((chan) == 0 || (chan) == 1 || (chan) == 3) #define SB_DRQ_VALID(chan) ((chan) == 1) -#define SB_BASE_VALID(base) ((base) == 0x220 || (base) == 0x240) +#define SB_BASE_VALID(base) ((base) == 0x220 || (base) == 0x240 || (base) == 0x260) #define SB_INPUT_RATE 0 #define SB_OUTPUT_RATE 1 |
