Update of /cvsroot/linux-mips/linux/drivers/sound
In directory usw-pr-cvs1:/tmp/cvs-serv21710/drivers/sound
Modified Files:
au1000.c
Log Message:
Updates to Au1x00 USB slave support. Split into device layer and two
function-layer drivers, a TTY driver and a raw bidirectional block
driver. Only one IN/OUT block endpoint pair is working correctly
now, so both function-layer drivers have only one bidirectional port.
Index: au1000.c
===================================================================
RCS file: /cvsroot/linux-mips/linux/drivers/sound/au1000.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- au1000.c 2 May 2002 18:49:19 -0000 1.12
+++ au1000.c 29 May 2002 00:23:16 -0000 1.13
@@ -130,7 +130,6 @@
struct dmabuf {
unsigned int dmanr; // DMA Channel number
- int irq; // DMA Channel Done IRQ number
unsigned sample_rate; // Hz
unsigned src_factor; // SRC interp/decimation (no vra)
unsigned sample_size; // 8 or 16
@@ -443,7 +442,7 @@
spin_lock_irqsave(&s->lock, flags);
- disable_dma(db->dmanr);
+ halt_dma(db->dmanr);
db->stopped = 1;
@@ -460,7 +459,7 @@
spin_lock_irqsave(&s->lock, flags);
- disable_dma(db->dmanr);
+ halt_dma(db->dmanr);
db->stopped = 1;
@@ -522,17 +521,19 @@
set_xmit_slots(db->num_channels);
- set_dma_count(db->dmanr, db->dma_fragsize>>1);
if (get_dma_active_buffer(db->dmanr) == 0) {
+ clear_dma_done0(db->dmanr); // clear DMA done bit
set_dma_addr0(db->dmanr, buf1);
set_dma_addr1(db->dmanr, buf2);
} else {
+ clear_dma_done1(db->dmanr); // clear DMA done bit
set_dma_addr1(db->dmanr, buf1);
set_dma_addr0(db->dmanr, buf2);
}
+ set_dma_count(db->dmanr, db->dma_fragsize>>1);
enable_dma_buffers(db->dmanr);
-
- enable_dma(db->dmanr);
+
+ start_dma(db->dmanr);
#ifdef AU1000_VERBOSE_DEBUG
dump_au1000_dma_channel(db->dmanr);
@@ -564,17 +565,19 @@
set_recv_slots(db->num_channels);
- set_dma_count(db->dmanr, db->dma_fragsize>>1);
if (get_dma_active_buffer(db->dmanr) == 0) {
+ clear_dma_done0(db->dmanr); // clear DMA done bit
set_dma_addr0(db->dmanr, buf1);
set_dma_addr1(db->dmanr, buf2);
} else {
+ clear_dma_done1(db->dmanr); // clear DMA done bit
set_dma_addr1(db->dmanr, buf1);
set_dma_addr0(db->dmanr, buf2);
}
+ set_dma_count(db->dmanr, db->dma_fragsize>>1);
enable_dma_buffers(db->dmanr);
- enable_dma(db->dmanr);
+ start_dma(db->dmanr);
#ifdef AU1000_VERBOSE_DEBUG
dump_au1000_dma_channel(db->dmanr);
@@ -2026,18 +2029,24 @@
}
// Allocate the DMA Channels
if ((s->dma_dac.dmanr = request_au1000_dma(DMA_ID_AC97C_TX,
- "audio DAC")) < 0) {
+ "audio DAC",
+ dac_dma_interrupt,
+ SA_INTERRUPT, s)) < 0) {
err("Can't get DAC DMA");
goto err_dma1;
}
if ((s->dma_adc.dmanr = request_au1000_dma(DMA_ID_AC97C_RX,
- "audio ADC")) < 0) {
+ "audio ADC",
+ adc_dma_interrupt,
+ SA_INTERRUPT, s)) < 0) {
err("Can't get ADC DMA");
goto err_dma2;
}
- s->dma_dac.irq = get_dma_done_irq(s->dma_dac.dmanr);
- s->dma_adc.irq = get_dma_done_irq(s->dma_adc.dmanr);
+ info("DAC: DMA%d/IRQ%d, ADC: DMA%d/IRQ%d",
+ s->dma_dac.dmanr, get_dma_done_irq(s->dma_dac.dmanr),
+ s->dma_adc.dmanr, get_dma_done_irq(s->dma_adc.dmanr));
+
#ifdef USE_COHERENT_DMA
// enable DMA coherency in read/write DMA channels
set_dma_mode(s->dma_dac.dmanr,
@@ -2052,21 +2061,6 @@
get_dma_mode(s->dma_adc.dmanr) | DMA_NC);
#endif
- if (request_irq(s->dma_dac.irq, dac_dma_interrupt,
- SA_INTERRUPT, "audio DAC", s)) {
- err("Can't get DAC irq #%d", s->dma_dac.irq);
- goto err_irq1;
- }
- if (request_irq(s->dma_adc.irq, adc_dma_interrupt,
- SA_INTERRUPT, "audio ADC", s)) {
- err("Can't get ADC irq #%d", s->dma_adc.irq);
- goto err_irq2;
- }
-
- info("DAC: DMA%d/IRQ%d, ADC: DMA%d/IRQ%d",
- s->dma_dac.dmanr, s->dma_dac.irq,
- s->dma_adc.dmanr, s->dma_adc.irq);
-
/* register devices */
if ((s->dev_audio = register_sound_dsp(&au1000_audio_fops, -1)) < 0)
@@ -2164,10 +2158,6 @@
err_dma2:
free_au1000_dma(s->dma_dac.dmanr);
err_dma1:
- free_irq(s->dma_adc.irq, s);
- err_irq2:
- free_irq(s->dma_dac.irq, s);
- err_irq1:
release_region(virt_to_phys((void *) AC97C_CONFIG), 0x14);
return -1;
}
@@ -2183,8 +2173,6 @@
remove_proc_entry(AU1000_MODULE_NAME, NULL);
#endif /* AU1000_DEBUG */
synchronize_irq();
- free_irq(s->dma_adc.irq, s);
- free_irq(s->dma_dac.irq, s);
free_au1000_dma(s->dma_adc.dmanr);
free_au1000_dma(s->dma_dac.dmanr);
release_region(virt_to_phys((void *) AC97C_CONFIG), 0x14);
|