1/*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright (c) 1999 Cameron Grant <cg@freebsd.org> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29#ifdef HAVE_KERNEL_OPTION_HEADERS 30#include "opt_snd.h" 31#endif 32 33#include <dev/sound/pcm/sound.h> 34 35#include <isa/isavar.h> 36 37SND_DECLARE_FILE("$FreeBSD$"); 38 39int 40sndbuf_dmasetup(struct snd_dbuf *b, struct resource *drq) 41{ 42 /* should do isa_dma_acquire/isa_dma_release here */ 43 if (drq == NULL) { 44 b->dmachan = -1; 45 } else { 46 sndbuf_setflags(b, SNDBUF_F_DMA, 1); 47 b->dmachan = rman_get_start(drq); 48 } 49 return 0; 50} 51 52int 53sndbuf_dmasetdir(struct snd_dbuf *b, int dir) 54{ 55 KASSERT(b, ("sndbuf_dmasetdir called with b == NULL")); 56 KASSERT(sndbuf_getflags(b) & SNDBUF_F_DMA, ("sndbuf_dmasetdir called on non-ISA buffer")); 57 58 b->dir = (dir == PCMDIR_PLAY)? ISADMA_WRITE : ISADMA_READ; 59 return 0; 60} 61 62void 63sndbuf_dma(struct snd_dbuf *b, int go) 64{ 65 KASSERT(b, ("sndbuf_dma called with b == NULL")); 66 KASSERT(sndbuf_getflags(b) & SNDBUF_F_DMA, ("sndbuf_dma called on non-ISA buffer")); 67 68 switch (go) { 69 case PCMTRIG_START: 70 /* isa_dmainit(b->chan, size); */ 71 isa_dmastart(b->dir | ISADMA_RAW, b->buf, b->bufsize, b->dmachan); 72 break; 73 74 case PCMTRIG_STOP: 75 case PCMTRIG_ABORT: 76 isa_dmastop(b->dmachan); 77 isa_dmadone(b->dir | ISADMA_RAW, b->buf, b->bufsize, b->dmachan); 78 break; 79 } 80 81 DEB(printf("buf 0x%p ISA DMA %s, channel %d\n", 82 b, 83 (go == PCMTRIG_START)? "started" : "stopped", 84 b->dmachan)); 85} 86 87int 88sndbuf_dmaptr(struct snd_dbuf *b) 89{ 90 int i; 91 92 KASSERT(b, ("sndbuf_dmaptr called with b == NULL")); 93 KASSERT(sndbuf_getflags(b) & SNDBUF_F_DMA, ("sndbuf_dmaptr called on non-ISA buffer")); 94 95 if (!sndbuf_runsz(b)) 96 return 0; 97 i = isa_dmastatus(b->dmachan); 98 KASSERT(i >= 0, ("isa_dmastatus returned %d", i)); 99 return b->bufsize - i; 100} 101 102void 103sndbuf_dmabounce(struct snd_dbuf *b) 104{ 105 KASSERT(b, ("sndbuf_dmabounce called with b == NULL")); 106 KASSERT(sndbuf_getflags(b) & SNDBUF_F_DMA, ("sndbuf_dmabounce called on non-ISA buffer")); 107 108 /* tell isa_dma to bounce data in/out */ 109} 110