25 #define BE_CONSERVATIVE
26 #define SAMPLE_ROUNDUP 0
32 #define DMAP_FREE_ON_CLOSE 0
33 #define DMAP_KEEP_ON_CLOSE 1
36 static void dma_reset_output(
int dev);
37 static void dma_reset_input(
int dev);
69 if (dma_buffsize < 4096)
71 dma_pagesize = (dmap->
dma < 4) ? (64 * 1024) : (128 * 1024);
94 if (start_addr ==
NULL)
98 if (start_addr ==
NULL) {
103 end_addr = start_addr + dmap->
buffsize - 1;
106 printk(
KERN_DEBUG "sound: start 0x%lx, end 0x%lx\n", (
long) start_addr, (
long) end_addr);
110 if (((
long) start_addr & ~(dma_pagesize - 1)) != ((
long) end_addr & ~(dma_pagesize - 1))
112 printk(
KERN_ERR "sound: Got invalid address 0x%lx for %db DMA-buffer\n", (
long) start_addr, dmap->
buffsize);
120 SetPageReserved(page);
137 end_addr = start_addr + dmap->
buffsize;
140 ClearPageReserved(page);
160 set_dma_addr(chan, physaddr);
191 if ((err = sound_alloc_dmap(dmap)) < 0)
202 dma_init_buffers(dmap);
221 if (dmap->
dma >= 0) {
232 sound_free_dmap(dmap);
236 static unsigned int default_set_bits(
int dev,
unsigned int bits)
246 static int default_set_speed(
int dev,
int speed)
256 static short default_set_channels(
int dev,
short channels)
288 check_driver(adev->
d);
290 if ((retval = adev->
d->open(dev, mode)) < 0)
294 if (dmap_in == dmap_out)
298 if ((retval = open_dmap(adev, mode, dmap_out)) < 0) {
306 if ((retval = open_dmap(adev, mode, dmap_in)) < 0) {
308 if (mode & OPEN_WRITE)
309 close_dmap(adev, dmap_out);
316 adev->
d->set_bits(dev, 8);
317 adev->
d->set_channels(dev, 1);
328 dma_reset_output(dev);
331 dma_reset_input(dev);
334 static void dma_reset_output(
int dev)
351 adev->
dmap_out->underrun_count == 0){
352 spin_unlock_irqrestore(&dmap->
lock,flags);
354 dmabuf_timeout(dmap));
363 adev->
d->halt_io(dev);
365 adev->
d->halt_output(dev);
369 clear_dma_ff(dmap->
dma);
376 spin_unlock_irqrestore(&dmap->
lock,flags);
379 static void dma_reset_input(
int dev)
387 adev->
d->halt_io(dev);
389 adev->
d->halt_input(dev);
395 spin_unlock_irqrestore(&dmap->
lock,flags);
420 if (adev->
d->trigger)
445 long t = dmabuf_timeout(dmap);
446 spin_unlock_irqrestore(&dmap->
lock,flags);
452 spin_unlock_irqrestore(&dmap->
lock,flags);
464 if (adev->
d->local_qlen) {
465 while (!signal_pending(
current) &&
466 adev->
d->local_qlen(dev)){
467 spin_unlock_irqrestore(&dmap->
lock,flags);
469 dmabuf_timeout(dmap));
473 spin_unlock_irqrestore(&dmap->
lock,flags);
510 close_dmap(adev, adev->
dmap_in);
512 spin_unlock_irqrestore(&dmap->
lock,flags);
527 spin_unlock_irq(&dmap->
lock);
530 spin_lock_irq(&dmap->
lock);
535 if ((err = adev->
d->prepare_for_input(dev,
547 if (adev->
d->trigger)
568 spin_unlock_irqrestore(&dmap->
lock,flags);
570 }
else while (dmap->
qlen <= 0 &&
n++ < 10) {
573 spin_unlock_irqrestore(&dmap->
lock,flags);
577 spin_unlock_irqrestore(&dmap->
lock,flags);
583 spin_unlock_irqrestore(&dmap->
lock,flags);
587 timeout = dmabuf_timeout(dmap);
589 spin_unlock_irqrestore(&dmap->
lock,flags);
596 dma_reset_input(dev);
601 spin_unlock_irqrestore(&dmap->
lock,flags);
604 return err ? err : -
EINTR;
622 else if (dmap->
qlen <= 0)
661 if (dmap->
qhead == 0)
665 if (dmap->
qtail == 0)
696 if (!(devmask & (1 << dev)))
706 if (adev->
d->trigger)
716 int lim = dmap->
nbufs;
721 if (dmap->
qlen >= lim)
734 if (adev->
d->local_qlen) {
735 tmp = adev->
d->local_qlen(dev);
748 static int output_sleep(
int dev,
int dontblock)
768 timeout_value = dmabuf_timeout(dmap);
775 dma_reset_output(dev);
783 static int find_output_space(
int dev,
char **
buf,
int *size)
787 unsigned long active_offs;
796 #ifdef BE_CONSERVATIVE
808 printk(
KERN_ERR "Sound: Got unexpected offs %ld. Giving up.\n", offs);
821 if (len > ((maxfrags * dmap->
fragment_size) - occupied_bytes))
843 spin_unlock_irqrestore(&dmap->
lock,flags);
849 while (find_output_space(dev, buf, size) <= 0) {
850 spin_unlock_irqrestore(&dmap->
lock,flags);
851 if ((err = output_sleep(dev, dontblock)) < 0) {
857 spin_unlock_irqrestore(&dmap->
lock,flags);
866 unsigned long end_ptr,
p;
892 while (ptr < end_ptr) {
905 if (adev->
d->postprocess_write)
906 adev->
d->postprocess_write(dev);
909 if (dmap->
qlen > 1 || (dmap->
qlen > 0 && (post || dmap->
qlen >= dmap->
nbufs - 1)))
912 spin_unlock_irqrestore(&dmap->
lock,flags);
923 printk(
"Device %d, chn=%s\n", dev, (dmap == adev->
dmap_out) ?
"out" :
"in");
928 sound_start_dma(dmap, physaddr, count, dma_mode);
951 static void finish_output_interrupt(
int dev,
struct dma_buffparms *dmap)
961 static void do_outputintr(
int dev,
int dummy)
968 printk(
KERN_ERR "Sound: Error. Audio interrupt (%d) after freeing buffers.\n", dev);
988 finish_output_interrupt(dev, dmap);
993 this_fragment = dmap->
qhead;
1026 finish_output_interrupt(dev, dmap);
1032 unsigned long flags;
1051 if (pos < 0 || pos >= dmap->
nbufs)
1055 do_outputintr(dev, notify_only);
1058 do_outputintr(dev, notify_only);
1059 spin_unlock_irqrestore(&dmap->
lock,flags);
1064 static void do_inputintr(
int dev)
1070 printk(
KERN_ERR "Sound: Fatal error. Audio interrupt after freeing buffers.\n");
1092 if (adev->
d->trigger)
1096 }
else if (dmap->
qlen >= (dmap->
nbufs - 1)) {
1119 if (adev->
d->trigger)
1134 unsigned long flags;
1152 if (pos < 0 || pos >= dmap->
nbufs)
1160 spin_unlock_irqrestore(&dmap->
lock,flags);
1172 if (adev->
d ==
NULL)
1173 panic(
"OSS: audio_devs[%d]->d == NULL\n", dev);
1190 sound_alloc_dmap(adev->
dmap_in);
1213 !dmap->
qlen && adev->
go) {
1214 unsigned long flags;
1218 spin_unlock_irqrestore(&dmap->
lock,flags);
1227 static unsigned int poll_output(
struct file * file,
int dev,
poll_table *wait)
1252 return poll_input(file, dev, wait) | poll_output(file, dev, wait);
1266 sound_free_dmap(adev->
dmap_in);