From: Steve L. <slo...@us...> - 2002-05-29 00:23:19
|
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); |