Lines Matching refs:gus
45 struct snd_gus_card * gus; member
64 static void snd_gf1_pcm_block_change_ack(struct snd_gus_card * gus, void *private_data) in snd_gf1_pcm_block_change_ack() argument
101 if (!snd_gf1_dma_transfer_block(pcmp->gus, &block, 0, 0)) in snd_gf1_pcm_block_change()
110 struct snd_gus_card * gus = pcmp->gus; in snd_gf1_pcm_trigger_up() local
127 rate = snd_gf1_translate_freq(gus, runtime->rate << 4); in snd_gf1_pcm_trigger_up()
147 vol = !voice ? gus->gf1.pcm_volume_level_left : gus->gf1.pcm_volume_level_right; in snd_gf1_pcm_trigger_up()
148 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gf1_pcm_trigger_up()
149 snd_gf1_select_voice(gus, pcmp->pvoices[voice]->number); in snd_gf1_pcm_trigger_up()
150 snd_gf1_write8(gus, SNDRV_GF1_VB_PAN, pan); in snd_gf1_pcm_trigger_up()
151 snd_gf1_write16(gus, SNDRV_GF1_VW_FREQUENCY, rate); in snd_gf1_pcm_trigger_up()
152 snd_gf1_write_addr(gus, SNDRV_GF1_VA_START, begin << 4, voice_ctrl & 4); in snd_gf1_pcm_trigger_up()
153 snd_gf1_write_addr(gus, SNDRV_GF1_VA_END, end << 4, voice_ctrl & 4); in snd_gf1_pcm_trigger_up()
154 snd_gf1_write_addr(gus, SNDRV_GF1_VA_CURRENT, curr << 4, voice_ctrl & 4); in snd_gf1_pcm_trigger_up()
155 snd_gf1_write16(gus, SNDRV_GF1_VW_VOLUME, SNDRV_GF1_MIN_VOLUME << 4); in snd_gf1_pcm_trigger_up()
156 snd_gf1_write8(gus, SNDRV_GF1_VB_VOLUME_RATE, 0x2f); in snd_gf1_pcm_trigger_up()
157 snd_gf1_write8(gus, SNDRV_GF1_VB_VOLUME_START, SNDRV_GF1_MIN_OFFSET); in snd_gf1_pcm_trigger_up()
158 snd_gf1_write8(gus, SNDRV_GF1_VB_VOLUME_END, vol >> 8); in snd_gf1_pcm_trigger_up()
159 snd_gf1_write8(gus, SNDRV_GF1_VB_VOLUME_CONTROL, ramp_ctrl); in snd_gf1_pcm_trigger_up()
160 if (!gus->gf1.enh_mode) { in snd_gf1_pcm_trigger_up()
161 snd_gf1_delay(gus); in snd_gf1_pcm_trigger_up()
162 snd_gf1_write8(gus, SNDRV_GF1_VB_VOLUME_CONTROL, ramp_ctrl); in snd_gf1_pcm_trigger_up()
164 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gf1_pcm_trigger_up()
166 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gf1_pcm_trigger_up()
168 snd_gf1_select_voice(gus, pcmp->pvoices[voice]->number); in snd_gf1_pcm_trigger_up()
169 if (gus->gf1.enh_mode) in snd_gf1_pcm_trigger_up()
170 snd_gf1_write8(gus, SNDRV_GF1_VB_MODE, 0x00); /* deactivate voice */ in snd_gf1_pcm_trigger_up()
171 snd_gf1_write8(gus, SNDRV_GF1_VB_ADDRESS_CONTROL, voice_ctrl); in snd_gf1_pcm_trigger_up()
175 if (!gus->gf1.enh_mode) { in snd_gf1_pcm_trigger_up()
176 snd_gf1_delay(gus); in snd_gf1_pcm_trigger_up()
178 snd_gf1_select_voice(gus, pcmp->pvoices[voice]->number); in snd_gf1_pcm_trigger_up()
179 snd_gf1_write8(gus, SNDRV_GF1_VB_ADDRESS_CONTROL, voice_ctrl); in snd_gf1_pcm_trigger_up()
183 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gf1_pcm_trigger_up()
186 static void snd_gf1_pcm_interrupt_wave(struct snd_gus_card * gus, in snd_gf1_pcm_interrupt_wave() argument
197 snd_gf1_smart_stop_voice(gus, pvoice->number); in snd_gf1_pcm_interrupt_wave()
203 snd_gf1_smart_stop_voice(gus, pvoice->number); in snd_gf1_pcm_interrupt_wave()
206 gus = pcmp->gus; in snd_gf1_pcm_interrupt_wave()
209 spin_lock(&gus->reg_lock); in snd_gf1_pcm_interrupt_wave()
210 snd_gf1_select_voice(gus, pvoice->number); in snd_gf1_pcm_interrupt_wave()
211 voice_ctrl = snd_gf1_read8(gus, SNDRV_GF1_VB_ADDRESS_CONTROL) & ~0x8b; in snd_gf1_pcm_interrupt_wave()
212 ramp_ctrl = (snd_gf1_read8(gus, SNDRV_GF1_VB_VOLUME_CONTROL) & ~0xa4) | 0x03; in snd_gf1_pcm_interrupt_wave()
214 snd_gf1_select_voice(gus, pvoice->number); in snd_gf1_pcm_interrupt_wave()
216 (snd_gf1_read_addr(gus, SNDRV_GF1_VA_CURRENT, voice_ctrl & 4) >> 4)); in snd_gf1_pcm_interrupt_wave()
217 snd_gf1_select_voice(gus, pcmp->pvoices[1]->number); in snd_gf1_pcm_interrupt_wave()
219 (snd_gf1_read_addr(gus, SNDRV_GF1_VA_CURRENT, voice_ctrl & 4) >> 4)); in snd_gf1_pcm_interrupt_wave()
220 snd_gf1_select_voice(gus, pvoice->number); in snd_gf1_pcm_interrupt_wave()
238 snd_gf1_select_voice(gus, pcmp->pvoices[idx]->number); in snd_gf1_pcm_interrupt_wave()
239 snd_gf1_write_addr(gus, SNDRV_GF1_VA_END, end << 4, voice_ctrl & 4); in snd_gf1_pcm_interrupt_wave()
240 snd_gf1_write8(gus, SNDRV_GF1_VB_ADDRESS_CONTROL, voice_ctrl); in snd_gf1_pcm_interrupt_wave()
241 snd_gf1_write8(gus, SNDRV_GF1_VB_VOLUME_CONTROL, ramp_ctrl); in snd_gf1_pcm_interrupt_wave()
244 if (!gus->gf1.enh_mode) { in snd_gf1_pcm_interrupt_wave()
245 snd_gf1_delay(gus); in snd_gf1_pcm_interrupt_wave()
248 snd_gf1_select_voice(gus, pcmp->pvoices[idx]->number); in snd_gf1_pcm_interrupt_wave()
249 snd_gf1_write8(gus, SNDRV_GF1_VB_ADDRESS_CONTROL, voice_ctrl); in snd_gf1_pcm_interrupt_wave()
250 snd_gf1_write8(gus, SNDRV_GF1_VB_VOLUME_CONTROL, ramp_ctrl); in snd_gf1_pcm_interrupt_wave()
254 spin_unlock(&gus->reg_lock); in snd_gf1_pcm_interrupt_wave()
271 static void snd_gf1_pcm_interrupt_volume(struct snd_gus_card * gus, in snd_gf1_pcm_interrupt_volume() argument
279 spin_lock(&gus->reg_lock); in snd_gf1_pcm_interrupt_volume()
280 snd_gf1_select_voice(gus, pvoice->number); in snd_gf1_pcm_interrupt_volume()
281 snd_gf1_ctrl_stop(gus, SNDRV_GF1_VB_VOLUME_CONTROL); in snd_gf1_pcm_interrupt_volume()
282 spin_unlock(&gus->reg_lock); in snd_gf1_pcm_interrupt_volume()
292 vol = !cvoice ? gus->gf1.pcm_volume_level_left : gus->gf1.pcm_volume_level_right; in snd_gf1_pcm_interrupt_volume()
293 spin_lock(&gus->reg_lock); in snd_gf1_pcm_interrupt_volume()
294 snd_gf1_select_voice(gus, pvoice->number); in snd_gf1_pcm_interrupt_volume()
295 snd_gf1_write16(gus, SNDRV_GF1_VW_VOLUME, vol); in snd_gf1_pcm_interrupt_volume()
297 spin_unlock(&gus->reg_lock); in snd_gf1_pcm_interrupt_volume()
300 static void snd_gf1_pcm_volume_change(struct snd_gus_card * gus) in snd_gf1_pcm_volume_change() argument
304 static int snd_gf1_pcm_poke_block(struct snd_gus_card *gus, unsigned char *buf, in snd_gf1_pcm_poke_block() argument
321 if (gus->interwave) { in snd_gf1_pcm_poke_block()
322 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gf1_pcm_poke_block()
323 snd_gf1_write8(gus, SNDRV_GF1_GB_MEMORY_CONTROL, 0x01 | (invert ? 0x08 : 0x00)); in snd_gf1_pcm_poke_block()
324 snd_gf1_dram_addr(gus, pos); in snd_gf1_pcm_poke_block()
326 outb(SNDRV_GF1_GW_DRAM_IO16, GUSP(gus, GF1REGSEL)); in snd_gf1_pcm_poke_block()
327 outsw(GUSP(gus, GF1DATALOW), buf, len >> 1); in snd_gf1_pcm_poke_block()
329 outsb(GUSP(gus, DRAM), buf, len); in snd_gf1_pcm_poke_block()
331 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gf1_pcm_poke_block()
339 snd_gf1_poke(gus, pos++, *buf++); in snd_gf1_pcm_poke_block()
340 snd_gf1_poke(gus, pos++, *buf++ ^ invert); in snd_gf1_pcm_poke_block()
344 snd_gf1_poke(gus, pos++, *buf++ ^ invert); in snd_gf1_pcm_poke_block()
377 struct snd_gus_card *gus = pcmp->gus; in snd_gf1_pcm_playback_copy() local
382 …if ((err = snd_gf1_pcm_poke_block(gus, runtime->dma_area + bpos, pcmp->memory + bpos, len, w16, in… in snd_gf1_pcm_playback_copy()
407 struct snd_gus_card *gus = pcmp->gus; in snd_gf1_pcm_playback_silence() local
412 …if ((err = snd_gf1_pcm_poke_block(gus, runtime->dma_area + bpos, pcmp->memory + bpos, len, w16, in… in snd_gf1_pcm_playback_silence()
421 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_playback_hw_params() local
431 snd_gf1_mem_free(&gus->gf1.mem_alloc, pcmp->memory); in snd_gf1_pcm_playback_hw_params()
434 if ((block = snd_gf1_mem_alloc(&gus->gf1.mem_alloc, in snd_gf1_pcm_playback_hw_params()
444 if ((pcmp->pvoices[0] = snd_gf1_alloc_voice(pcmp->gus, SNDRV_GF1_VOICE_TYPE_PCM, 0, 0)) == NULL) in snd_gf1_pcm_playback_hw_params()
452 if ((pcmp->pvoices[1] = snd_gf1_alloc_voice(pcmp->gus, SNDRV_GF1_VOICE_TYPE_PCM, 0, 0)) == NULL) in snd_gf1_pcm_playback_hw_params()
460 snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[1]); in snd_gf1_pcm_playback_hw_params()
474 snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[0]); in snd_gf1_pcm_playback_hw_free()
478 snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[1]); in snd_gf1_pcm_playback_hw_free()
482 snd_gf1_mem_free(&pcmp->gus->gf1.mem_alloc, pcmp->memory); in snd_gf1_pcm_playback_hw_free()
503 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_playback_trigger() local
515 snd_gf1_stop_voices(gus, voice, voice); in snd_gf1_pcm_playback_trigger()
518 snd_gf1_stop_voices(gus, voice, voice); in snd_gf1_pcm_playback_trigger()
528 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_playback_pointer() local
535 spin_lock(&gus->reg_lock); in snd_gf1_pcm_playback_pointer()
537 snd_gf1_select_voice(gus, pcmp->pvoices[0]->number); in snd_gf1_pcm_playback_pointer()
538 voice_ctrl = snd_gf1_read8(gus, SNDRV_GF1_VB_ADDRESS_CONTROL); in snd_gf1_pcm_playback_pointer()
539 pos = (snd_gf1_read_addr(gus, SNDRV_GF1_VA_CURRENT, voice_ctrl & 4) >> 4) - pcmp->memory; in snd_gf1_pcm_playback_pointer()
544 spin_unlock(&gus->reg_lock); in snd_gf1_pcm_playback_pointer()
563 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_hw_params() local
565 gus->c_dma_size = params_buffer_bytes(hw_params); in snd_gf1_pcm_capture_hw_params()
566 gus->c_period_size = params_period_bytes(hw_params); in snd_gf1_pcm_capture_hw_params()
567 gus->c_pos = 0; in snd_gf1_pcm_capture_hw_params()
568 gus->gf1.pcm_rcntrl_reg = 0x21; /* IRQ at end, enable & start */ in snd_gf1_pcm_capture_hw_params()
570 gus->gf1.pcm_rcntrl_reg |= 2; in snd_gf1_pcm_capture_hw_params()
571 if (gus->gf1.dma2 > 3) in snd_gf1_pcm_capture_hw_params()
572 gus->gf1.pcm_rcntrl_reg |= 4; in snd_gf1_pcm_capture_hw_params()
574 gus->gf1.pcm_rcntrl_reg |= 0x80; in snd_gf1_pcm_capture_hw_params()
585 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_prepare() local
588 snd_gf1_i_write8(gus, SNDRV_GF1_GB_RECORD_RATE, runtime->rate_den - 2); in snd_gf1_pcm_capture_prepare()
589 snd_gf1_i_write8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL, 0); /* disable sampling */ in snd_gf1_pcm_capture_prepare()
590 snd_gf1_i_look8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL); /* Sampling Control Register */ in snd_gf1_pcm_capture_prepare()
591 snd_dma_program(gus->gf1.dma2, runtime->dma_addr, gus->c_period_size, DMA_MODE_READ); in snd_gf1_pcm_capture_prepare()
598 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_trigger() local
602 val = gus->gf1.pcm_rcntrl_reg; in snd_gf1_pcm_capture_trigger()
609 spin_lock(&gus->reg_lock); in snd_gf1_pcm_capture_trigger()
610 snd_gf1_write8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL, val); in snd_gf1_pcm_capture_trigger()
611 snd_gf1_look8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL); in snd_gf1_pcm_capture_trigger()
612 spin_unlock(&gus->reg_lock); in snd_gf1_pcm_capture_trigger()
618 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_pointer() local
619 int pos = snd_dma_pointer(gus->gf1.dma2, gus->c_period_size); in snd_gf1_pcm_capture_pointer()
620 pos = bytes_to_frames(substream->runtime, (gus->c_pos + pos) % gus->c_dma_size); in snd_gf1_pcm_capture_pointer()
624 static void snd_gf1_pcm_interrupt_dma_read(struct snd_gus_card * gus) in snd_gf1_pcm_interrupt_dma_read() argument
626 snd_gf1_i_write8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL, 0); /* disable sampling */ in snd_gf1_pcm_interrupt_dma_read()
627 snd_gf1_i_look8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL); /* Sampling Control Register */ in snd_gf1_pcm_interrupt_dma_read()
628 if (gus->pcm_cap_substream != NULL) { in snd_gf1_pcm_interrupt_dma_read()
629 snd_gf1_pcm_capture_prepare(gus->pcm_cap_substream); in snd_gf1_pcm_interrupt_dma_read()
630 snd_gf1_pcm_capture_trigger(gus->pcm_cap_substream, SNDRV_PCM_TRIGGER_START); in snd_gf1_pcm_interrupt_dma_read()
631 gus->c_pos += gus->c_period_size; in snd_gf1_pcm_interrupt_dma_read()
632 snd_pcm_period_elapsed(gus->pcm_cap_substream); in snd_gf1_pcm_interrupt_dma_read()
680 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_playback_open() local
687 pcmp->gus = gus; in snd_gf1_pcm_playback_open()
697 (long) pcm->playback.buffer, (long) gus->gf1.pcm_buffer); in snd_gf1_pcm_playback_open()
699 if ((err = snd_gf1_dma_init(gus)) < 0) in snd_gf1_pcm_playback_open()
704 snd_pcm_limit_isa_dma_size(gus->gf1.dma1, &runtime->hw.buffer_bytes_max); in snd_gf1_pcm_playback_open()
705 snd_pcm_limit_isa_dma_size(gus->gf1.dma1, &runtime->hw.period_bytes_max); in snd_gf1_pcm_playback_open()
712 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_playback_close() local
719 snd_gf1_dma_done(gus); in snd_gf1_pcm_playback_close()
726 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_open() local
728 gus->gf1.interrupt_handler_dma_read = snd_gf1_pcm_interrupt_dma_read; in snd_gf1_pcm_capture_open()
729 gus->pcm_cap_substream = substream; in snd_gf1_pcm_capture_open()
731 snd_pcm_limit_isa_dma_size(gus->gf1.dma2, &runtime->hw.buffer_bytes_max); in snd_gf1_pcm_capture_open()
732 snd_pcm_limit_isa_dma_size(gus->gf1.dma2, &runtime->hw.period_bytes_max); in snd_gf1_pcm_capture_open()
740 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_close() local
742 gus->pcm_cap_substream = NULL; in snd_gf1_pcm_capture_close()
743 snd_gf1_set_default_handlers(gus, SNDRV_GF1_HANDLER_DMA_READ); in snd_gf1_pcm_capture_close()
758 struct snd_gus_card *gus = snd_kcontrol_chip(kcontrol); in snd_gf1_pcm_volume_get() local
761 spin_lock_irqsave(&gus->pcm_volume_level_lock, flags); in snd_gf1_pcm_volume_get()
762 ucontrol->value.integer.value[0] = gus->gf1.pcm_volume_level_left1; in snd_gf1_pcm_volume_get()
763 ucontrol->value.integer.value[1] = gus->gf1.pcm_volume_level_right1; in snd_gf1_pcm_volume_get()
764 spin_unlock_irqrestore(&gus->pcm_volume_level_lock, flags); in snd_gf1_pcm_volume_get()
770 struct snd_gus_card *gus = snd_kcontrol_chip(kcontrol); in snd_gf1_pcm_volume_put() local
780 spin_lock_irqsave(&gus->pcm_volume_level_lock, flags); in snd_gf1_pcm_volume_put()
781 change = val1 != gus->gf1.pcm_volume_level_left1 || in snd_gf1_pcm_volume_put()
782 val2 != gus->gf1.pcm_volume_level_right1; in snd_gf1_pcm_volume_put()
783 gus->gf1.pcm_volume_level_left1 = val1; in snd_gf1_pcm_volume_put()
784 gus->gf1.pcm_volume_level_right1 = val2; in snd_gf1_pcm_volume_put()
785 gus->gf1.pcm_volume_level_left = snd_gf1_lvol_to_gvol_raw(val1 << 9) << 4; in snd_gf1_pcm_volume_put()
786 gus->gf1.pcm_volume_level_right = snd_gf1_lvol_to_gvol_raw(val2 << 9) << 4; in snd_gf1_pcm_volume_put()
787 spin_unlock_irqrestore(&gus->pcm_volume_level_lock, flags); in snd_gf1_pcm_volume_put()
789 spin_lock_irqsave(&gus->voice_alloc, flags); in snd_gf1_pcm_volume_put()
791 pvoice = &gus->gf1.voices[idx]; in snd_gf1_pcm_volume_put()
798 spin_lock(&gus->reg_lock); in snd_gf1_pcm_volume_put()
799 snd_gf1_select_voice(gus, pvoice->number); in snd_gf1_pcm_volume_put()
800 snd_gf1_ctrl_stop(gus, SNDRV_GF1_VB_VOLUME_CONTROL); in snd_gf1_pcm_volume_put()
801 …vol = pvoice == pcmp->pvoices[0] ? gus->gf1.pcm_volume_level_left : gus->gf1.pcm_volume_level_righ… in snd_gf1_pcm_volume_put()
802 snd_gf1_write16(gus, SNDRV_GF1_VW_VOLUME, vol); in snd_gf1_pcm_volume_put()
804 spin_unlock(&gus->reg_lock); in snd_gf1_pcm_volume_put()
806 spin_unlock_irqrestore(&gus->voice_alloc, flags); in snd_gf1_pcm_volume_put()
852 int snd_gf1_pcm_new(struct snd_gus_card *gus, int pcm_dev, int control_index) in snd_gf1_pcm_new() argument
860 card = gus->card; in snd_gf1_pcm_new()
861 capture = !gus->interwave && !gus->ess_flag && !gus->ace_flag ? 1 : 0; in snd_gf1_pcm_new()
863 gus->interwave ? "AMD InterWave" : "GF1", in snd_gf1_pcm_new()
865 gus->gf1.pcm_channels / 2, in snd_gf1_pcm_new()
870 pcm->private_data = gus; in snd_gf1_pcm_new()
877 64*1024, gus->gf1.dma1 > 3 ? 128*1024 : 64*1024); in snd_gf1_pcm_new()
883 if (gus->gf1.dma2 == gus->gf1.dma1) in snd_gf1_pcm_new()
887 64*1024, gus->gf1.dma2 > 3 ? 128*1024 : 64*1024); in snd_gf1_pcm_new()
890 if (gus->interwave) { in snd_gf1_pcm_new()
891 sprintf(pcm->name + strlen(pcm->name), " rev %c", gus->revision + 'A'); in snd_gf1_pcm_new()
894 gus->pcm = pcm; in snd_gf1_pcm_new()
896 if (gus->codec_flag) in snd_gf1_pcm_new()
897 kctl = snd_ctl_new1(&snd_gf1_pcm_volume_control1, gus); in snd_gf1_pcm_new()
899 kctl = snd_ctl_new1(&snd_gf1_pcm_volume_control, gus); in snd_gf1_pcm_new()