Blame view
sound/core/isadma.c
3.02 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 |
/* * ISA DMA support functions |
c1017a4cd [ALSA] Changed Ja... |
3 |
* Copyright (c) by Jaroslav Kysela <perex@perex.cz> |
1da177e4c Linux-2.6.12-rc2 |
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
* * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ /* * Defining following add some delay. Maybe this helps for some broken * ISA DMA controllers. */ #undef HAVE_REALLY_SLOW_DMA_CONTROLLER |
d81a6d717 sound: Add export... |
28 |
#include <linux/export.h> |
1da177e4c Linux-2.6.12-rc2 |
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#include <sound/core.h> #include <asm/dma.h> /** * snd_dma_program - program an ISA DMA transfer * @dma: the dma number * @addr: the physical address of the buffer * @size: the DMA transfer size * @mode: the DMA transfer mode, DMA_MODE_XXX * * Programs an ISA DMA transfer for the given buffer. */ void snd_dma_program(unsigned long dma, unsigned long addr, unsigned int size, unsigned short mode) { unsigned long flags; flags = claim_dma_lock(); disable_dma(dma); clear_dma_ff(dma); set_dma_mode(dma, mode); set_dma_addr(dma, addr); set_dma_count(dma, size); if (!(mode & DMA_MODE_NO_ENABLE)) enable_dma(dma); release_dma_lock(flags); } |
c0d3fb39e [ALSA] Clean up E... |
57 |
EXPORT_SYMBOL(snd_dma_program); |
1da177e4c Linux-2.6.12-rc2 |
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
/** * snd_dma_disable - stop the ISA DMA transfer * @dma: the dma number * * Stops the ISA DMA transfer. */ void snd_dma_disable(unsigned long dma) { unsigned long flags; flags = claim_dma_lock(); clear_dma_ff(dma); disable_dma(dma); release_dma_lock(flags); } |
c0d3fb39e [ALSA] Clean up E... |
73 |
EXPORT_SYMBOL(snd_dma_disable); |
1da177e4c Linux-2.6.12-rc2 |
74 75 76 77 78 |
/** * snd_dma_pointer - return the current pointer to DMA transfer buffer in bytes * @dma: the dma number * @size: the dma transfer size * |
eb7c06e8e ALSA: add/change ... |
79 |
* Return: The current pointer in DMA transfer buffer in bytes. |
1da177e4c Linux-2.6.12-rc2 |
80 81 82 83 |
*/ unsigned int snd_dma_pointer(unsigned long dma, unsigned int size) { unsigned long flags; |
8066e51ae ALSA: snd_dma_poi... |
84 |
unsigned int result, result1; |
1da177e4c Linux-2.6.12-rc2 |
85 86 87 88 89 90 |
flags = claim_dma_lock(); clear_dma_ff(dma); if (!isa_dma_bridge_buggy) disable_dma(dma); result = get_dma_residue(dma); |
8066e51ae ALSA: snd_dma_poi... |
91 92 93 94 95 96 |
/* * HACK - read the counter again and choose higher value in order to * avoid reading during counter lower byte roll over if the * isa_dma_bridge_buggy is set. */ result1 = get_dma_residue(dma); |
1da177e4c Linux-2.6.12-rc2 |
97 98 99 |
if (!isa_dma_bridge_buggy) enable_dma(dma); release_dma_lock(flags); |
8066e51ae ALSA: snd_dma_poi... |
100 101 |
if (unlikely(result < result1)) result = result1; |
1da177e4c Linux-2.6.12-rc2 |
102 103 |
#ifdef CONFIG_SND_DEBUG if (result > size) |
f2f9307a4 ALSA: core: Use s... |
104 105 |
pr_err("ALSA: pointer (0x%x) for DMA #%ld is greater than transfer size (0x%x) ", result, dma, size); |
1da177e4c Linux-2.6.12-rc2 |
106 107 108 109 110 111 |
#endif if (result >= size || result == 0) return 0; else return size - result; } |
c0d3fb39e [ALSA] Clean up E... |
112 113 |
EXPORT_SYMBOL(snd_dma_pointer); |