Lines Matching refs:gus

27 static void snd_gf1_dma_ack(struct snd_gus_card * gus)  in snd_gf1_dma_ack()  argument
31 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gf1_dma_ack()
32 snd_gf1_write8(gus, SNDRV_GF1_GB_DRAM_DMA_CONTROL, 0x00); in snd_gf1_dma_ack()
33 snd_gf1_look8(gus, SNDRV_GF1_GB_DRAM_DMA_CONTROL); in snd_gf1_dma_ack()
34 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gf1_dma_ack()
37 static void snd_gf1_dma_program(struct snd_gus_card * gus, in snd_gf1_dma_program() argument
51 if (gus->gf1.dma1 > 3) { in snd_gf1_dma_program()
52 if (gus->gf1.enh_mode) { in snd_gf1_dma_program()
73 if (gus->gf1.dma1 > 3) { in snd_gf1_dma_program()
78 snd_gf1_dma_ack(gus); in snd_gf1_dma_program()
79 …snd_dma_program(gus->gf1.dma1, buf_addr, count, dma_cmd & SNDRV_GF1_DMA_READ ? DMA_MODE_READ : DMA… in snd_gf1_dma_program()
84 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gf1_dma_program()
85 if (gus->gf1.enh_mode) { in snd_gf1_dma_program()
87 snd_gf1_write16(gus, SNDRV_GF1_GW_DRAM_DMA_LOW, (unsigned short) (address >> 4)); in snd_gf1_dma_program()
88 snd_gf1_write8(gus, SNDRV_GF1_GB_DRAM_DMA_HIGH, (unsigned char) address_high); in snd_gf1_dma_program()
90 snd_gf1_write16(gus, SNDRV_GF1_GW_DRAM_DMA_LOW, (unsigned short) (address >> 4)); in snd_gf1_dma_program()
91 snd_gf1_write8(gus, SNDRV_GF1_GB_DRAM_DMA_CONTROL, dma_cmd); in snd_gf1_dma_program()
92 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gf1_dma_program()
95 static struct snd_gf1_dma_block *snd_gf1_dma_next_block(struct snd_gus_card * gus) in snd_gf1_dma_next_block() argument
100 if (gus->gf1.dma_data_pcm) { in snd_gf1_dma_next_block()
101 block = gus->gf1.dma_data_pcm; in snd_gf1_dma_next_block()
102 if (gus->gf1.dma_data_pcm_last == block) { in snd_gf1_dma_next_block()
103 gus->gf1.dma_data_pcm = in snd_gf1_dma_next_block()
104 gus->gf1.dma_data_pcm_last = NULL; in snd_gf1_dma_next_block()
106 gus->gf1.dma_data_pcm = block->next; in snd_gf1_dma_next_block()
108 } else if (gus->gf1.dma_data_synth) { in snd_gf1_dma_next_block()
109 block = gus->gf1.dma_data_synth; in snd_gf1_dma_next_block()
110 if (gus->gf1.dma_data_synth_last == block) { in snd_gf1_dma_next_block()
111 gus->gf1.dma_data_synth = in snd_gf1_dma_next_block()
112 gus->gf1.dma_data_synth_last = NULL; in snd_gf1_dma_next_block()
114 gus->gf1.dma_data_synth = block->next; in snd_gf1_dma_next_block()
120 gus->gf1.dma_ack = block->ack; in snd_gf1_dma_next_block()
121 gus->gf1.dma_private_data = block->private_data; in snd_gf1_dma_next_block()
127 static void snd_gf1_dma_interrupt(struct snd_gus_card * gus) in snd_gf1_dma_interrupt() argument
131 snd_gf1_dma_ack(gus); in snd_gf1_dma_interrupt()
132 if (gus->gf1.dma_ack) in snd_gf1_dma_interrupt()
133 gus->gf1.dma_ack(gus, gus->gf1.dma_private_data); in snd_gf1_dma_interrupt()
134 spin_lock(&gus->dma_lock); in snd_gf1_dma_interrupt()
135 if (gus->gf1.dma_data_pcm == NULL && in snd_gf1_dma_interrupt()
136 gus->gf1.dma_data_synth == NULL) { in snd_gf1_dma_interrupt()
137 gus->gf1.dma_ack = NULL; in snd_gf1_dma_interrupt()
138 gus->gf1.dma_flags &= ~SNDRV_GF1_DMA_TRIGGER; in snd_gf1_dma_interrupt()
139 spin_unlock(&gus->dma_lock); in snd_gf1_dma_interrupt()
142 block = snd_gf1_dma_next_block(gus); in snd_gf1_dma_interrupt()
143 spin_unlock(&gus->dma_lock); in snd_gf1_dma_interrupt()
144 snd_gf1_dma_program(gus, block->addr, block->buf_addr, block->count, (unsigned short) block->cmd); in snd_gf1_dma_interrupt()
153 int snd_gf1_dma_init(struct snd_gus_card * gus) in snd_gf1_dma_init() argument
155 mutex_lock(&gus->dma_mutex); in snd_gf1_dma_init()
156 gus->gf1.dma_shared++; in snd_gf1_dma_init()
157 if (gus->gf1.dma_shared > 1) { in snd_gf1_dma_init()
158 mutex_unlock(&gus->dma_mutex); in snd_gf1_dma_init()
161 gus->gf1.interrupt_handler_dma_write = snd_gf1_dma_interrupt; in snd_gf1_dma_init()
162 gus->gf1.dma_data_pcm = in snd_gf1_dma_init()
163 gus->gf1.dma_data_pcm_last = in snd_gf1_dma_init()
164 gus->gf1.dma_data_synth = in snd_gf1_dma_init()
165 gus->gf1.dma_data_synth_last = NULL; in snd_gf1_dma_init()
166 mutex_unlock(&gus->dma_mutex); in snd_gf1_dma_init()
170 int snd_gf1_dma_done(struct snd_gus_card * gus) in snd_gf1_dma_done() argument
174 mutex_lock(&gus->dma_mutex); in snd_gf1_dma_done()
175 gus->gf1.dma_shared--; in snd_gf1_dma_done()
176 if (!gus->gf1.dma_shared) { in snd_gf1_dma_done()
177 snd_dma_disable(gus->gf1.dma1); in snd_gf1_dma_done()
178 snd_gf1_set_default_handlers(gus, SNDRV_GF1_HANDLER_DMA_WRITE); in snd_gf1_dma_done()
179 snd_gf1_dma_ack(gus); in snd_gf1_dma_done()
180 while ((block = gus->gf1.dma_data_pcm)) { in snd_gf1_dma_done()
181 gus->gf1.dma_data_pcm = block->next; in snd_gf1_dma_done()
184 while ((block = gus->gf1.dma_data_synth)) { in snd_gf1_dma_done()
185 gus->gf1.dma_data_synth = block->next; in snd_gf1_dma_done()
188 gus->gf1.dma_data_pcm_last = in snd_gf1_dma_done()
189 gus->gf1.dma_data_synth_last = NULL; in snd_gf1_dma_done()
191 mutex_unlock(&gus->dma_mutex); in snd_gf1_dma_done()
195 int snd_gf1_dma_transfer_block(struct snd_gus_card * gus, in snd_gf1_dma_transfer_block() argument
216 (long)gus->gf1.dma_data_pcm_last); in snd_gf1_dma_transfer_block()
218 (long)gus->gf1.dma_data_pcm); in snd_gf1_dma_transfer_block()
220 spin_lock_irqsave(&gus->dma_lock, flags); in snd_gf1_dma_transfer_block()
222 if (gus->gf1.dma_data_synth_last) { in snd_gf1_dma_transfer_block()
223 gus->gf1.dma_data_synth_last->next = block; in snd_gf1_dma_transfer_block()
224 gus->gf1.dma_data_synth_last = block; in snd_gf1_dma_transfer_block()
226 gus->gf1.dma_data_synth = in snd_gf1_dma_transfer_block()
227 gus->gf1.dma_data_synth_last = block; in snd_gf1_dma_transfer_block()
230 if (gus->gf1.dma_data_pcm_last) { in snd_gf1_dma_transfer_block()
231 gus->gf1.dma_data_pcm_last->next = block; in snd_gf1_dma_transfer_block()
232 gus->gf1.dma_data_pcm_last = block; in snd_gf1_dma_transfer_block()
234 gus->gf1.dma_data_pcm = in snd_gf1_dma_transfer_block()
235 gus->gf1.dma_data_pcm_last = block; in snd_gf1_dma_transfer_block()
238 if (!(gus->gf1.dma_flags & SNDRV_GF1_DMA_TRIGGER)) { in snd_gf1_dma_transfer_block()
239 gus->gf1.dma_flags |= SNDRV_GF1_DMA_TRIGGER; in snd_gf1_dma_transfer_block()
240 block = snd_gf1_dma_next_block(gus); in snd_gf1_dma_transfer_block()
241 spin_unlock_irqrestore(&gus->dma_lock, flags); in snd_gf1_dma_transfer_block()
244 snd_gf1_dma_program(gus, block->addr, block->buf_addr, block->count, (unsigned short) block->cmd); in snd_gf1_dma_transfer_block()
248 spin_unlock_irqrestore(&gus->dma_lock, flags); in snd_gf1_dma_transfer_block()