Update of /cvsroot/linux-mips/linux/drivers/sound
In directory usw-pr-cvs1:/tmp/cvs-serv25493
Modified Files:
au1000.c
Log Message:
Need to completely disable/reenable DMA on playback stop/start, instead
of just a halt/restart. Halt/restart was causing the Au1000 to freeze,
not sure why.
Index: au1000.c
===================================================================
RCS file: /cvsroot/linux-mips/linux/drivers/sound/au1000.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- au1000.c 29 May 2002 00:23:16 -0000 1.13
+++ au1000.c 21 Jun 2002 20:57:55 -0000 1.14
@@ -442,8 +442,8 @@
spin_lock_irqsave(&s->lock, flags);
- halt_dma(db->dmanr);
-
+ disable_dma(db->dmanr);
+
db->stopped = 1;
spin_unlock_irqrestore(&s->lock, flags);
@@ -459,8 +459,8 @@
spin_lock_irqsave(&s->lock, flags);
- halt_dma(db->dmanr);
-
+ disable_dma(db->dmanr);
+
db->stopped = 1;
spin_unlock_irqrestore(&s->lock, flags);
@@ -521,6 +521,7 @@
set_xmit_slots(db->num_channels);
+ init_dma(db->dmanr);
if (get_dma_active_buffer(db->dmanr) == 0) {
clear_dma_done0(db->dmanr); // clear DMA done bit
set_dma_addr0(db->dmanr, buf1);
@@ -534,7 +535,7 @@
enable_dma_buffers(db->dmanr);
start_dma(db->dmanr);
-
+
#ifdef AU1000_VERBOSE_DEBUG
dump_au1000_dma_channel(db->dmanr);
#endif
@@ -565,6 +566,7 @@
set_recv_slots(db->num_channels);
+ init_dma(db->dmanr);
if (get_dma_active_buffer(db->dmanr) == 0) {
clear_dma_done0(db->dmanr); // clear DMA done bit
set_dma_addr0(db->dmanr, buf1);
@@ -578,7 +580,7 @@
enable_dma_buffers(db->dmanr);
start_dma(db->dmanr);
-
+
#ifdef AU1000_VERBOSE_DEBUG
dump_au1000_dma_channel(db->dmanr);
#endif
@@ -941,6 +943,7 @@
tmo /= s->dma_dac.dma_bytes_per_sample;
au1000_delay(tmo);
}
+
if (signal_pending(current))
return -ERESTARTSYS;
return 0;
@@ -988,7 +991,7 @@
for (sample = 0; sample < num_samples; sample++) {
if (copy_from_user(usersample, userbuf,
db->user_bytes_per_sample)) {
- dbg(__FUNCTION__ "fault");
+ dbg(__FUNCTION__ ": fault");
return -EFAULT;
}
@@ -1052,7 +1055,7 @@
if (copy_to_user(userbuf, usersample,
db->user_bytes_per_sample)) {
- dbg(__FUNCTION__ "fault");
+ dbg(__FUNCTION__ ": fault");
return -EFAULT;
}
@@ -1914,8 +1917,13 @@
struct au1000_state *s = (struct au1000_state *)file->private_data;
lock_kernel();
- if (file->f_mode & FMODE_WRITE)
+
+ if (file->f_mode & FMODE_WRITE) {
+ unlock_kernel();
drain_dac(s, file->f_flags & O_NONBLOCK);
+ lock_kernel();
+ }
+
down(&s->open_sem);
if (file->f_mode & FMODE_WRITE) {
stop_dac(s);
@@ -1927,7 +1935,9 @@
}
s->open_mode &= ((~file->f_mode) & (FMODE_READ|FMODE_WRITE));
up(&s->open_sem);
+
wake_up(&s->open_wait);
+
unlock_kernel();
return 0;
}
|