diff options
author | nyan <nyan@FreeBSD.org> | 2003-02-07 14:05:34 +0000 |
---|---|---|
committer | nyan <nyan@FreeBSD.org> | 2003-02-07 14:05:34 +0000 |
commit | 3391eada81b7f6040f4ba8596e92787f4398bccd (patch) | |
tree | bb7186a3521199202c6d88ec66567221b0ead322 /sys/dev/sound/isa/sndbuf_dma.c | |
parent | e495da0cd39b3a144132e16be2f4cf8eed2d13b0 (diff) | |
download | FreeBSD-src-3391eada81b7f6040f4ba8596e92787f4398bccd.zip FreeBSD-src-3391eada81b7f6040f4ba8596e92787f4398bccd.tar.gz |
- Clean up ISA DMA supports.
- Rename all sndbuf_isadma* functions to sndbuf_dma* and move them into
sys/dev/sound/isa/sndbuf_dma.c.
No response from: sound
Diffstat (limited to 'sys/dev/sound/isa/sndbuf_dma.c')
-rw-r--r-- | sys/dev/sound/isa/sndbuf_dma.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/sys/dev/sound/isa/sndbuf_dma.c b/sys/dev/sound/isa/sndbuf_dma.c new file mode 100644 index 0000000..d07c301 --- /dev/null +++ b/sys/dev/sound/isa/sndbuf_dma.c @@ -0,0 +1,103 @@ +/* + * Copyright (c) 1999 Cameron Grant <gandalf@vilnya.demon.co.uk> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <dev/sound/pcm/sound.h> + +#include <isa/isavar.h> + +SND_DECLARE_FILE("$FreeBSD$"); + +int +sndbuf_dmasetup(struct snd_dbuf *b, struct resource *drq) +{ + /* should do isa_dma_acquire/isa_dma_release here */ + if (drq == NULL) { + b->dmachan = -1; + } else { + sndbuf_setflags(b, SNDBUF_F_DMA, 1); + b->dmachan = rman_get_start(drq); + } + return 0; +} + +int +sndbuf_dmasetdir(struct snd_dbuf *b, int dir) +{ + KASSERT(b, ("sndbuf_dmasetdir called with b == NULL")); + KASSERT(sndbuf_getflags(b) & SNDBUF_F_DMA, ("sndbuf_dmasetdir called on non-ISA buffer")); + + b->dir = (dir == PCMDIR_PLAY)? ISADMA_WRITE : ISADMA_READ; + return 0; +} + +void +sndbuf_dma(struct snd_dbuf *b, int go) +{ + KASSERT(b, ("sndbuf_dma called with b == NULL")); + KASSERT(sndbuf_getflags(b) & SNDBUF_F_DMA, ("sndbuf_dma called on non-ISA buffer")); + + switch (go) { + case PCMTRIG_START: + /* isa_dmainit(b->chan, size); */ + isa_dmastart(b->dir | ISADMA_RAW, b->buf, b->bufsize, b->dmachan); + break; + + case PCMTRIG_STOP: + case PCMTRIG_ABORT: + isa_dmastop(b->dmachan); + isa_dmadone(b->dir | ISADMA_RAW, b->buf, b->bufsize, b->dmachan); + break; + } + + DEB(printf("buf 0x%p ISA DMA %s, channel %d\n", + b, + (go == PCMTRIG_START)? "started" : "stopped", + b->dmachan)); +} + +int +sndbuf_dmaptr(struct snd_dbuf *b) +{ + int i; + + KASSERT(b, ("sndbuf_dmaptr called with b == NULL")); + KASSERT(sndbuf_getflags(b) & SNDBUF_F_DMA, ("sndbuf_dmaptr called on non-ISA buffer")); + + if (!sndbuf_runsz(b)) + return 0; + i = isa_dmastatus(b->dmachan); + KASSERT(i >= 0, ("isa_dmastatus returned %d", i)); + return b->bufsize - i; +} + +void +sndbuf_dmabounce(struct snd_dbuf *b) +{ + KASSERT(b, ("sndbuf_dmabounce called with b == NULL")); + KASSERT(sndbuf_getflags(b) & SNDBUF_F_DMA, ("sndbuf_dmabounce called on non-ISA buffer")); + + /* tell isa_dma to bounce data in/out */ +} |