From: Steve L. <slo...@us...> - 2002-06-21 20:57:58
|
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; } |