Lines Matching refs:gus
32 struct snd_gus_card * gus; member
49 static void snd_gf1_pcm_block_change_ack(struct snd_gus_card * gus, void *private_data) in snd_gf1_pcm_block_change_ack() argument
86 if (!snd_gf1_dma_transfer_block(pcmp->gus, &block, 0, 0)) in snd_gf1_pcm_block_change()
95 struct snd_gus_card * gus = pcmp->gus; in snd_gf1_pcm_trigger_up() local
112 rate = snd_gf1_translate_freq(gus, runtime->rate << 4); in snd_gf1_pcm_trigger_up()
132 vol = !voice ? gus->gf1.pcm_volume_level_left : gus->gf1.pcm_volume_level_right; in snd_gf1_pcm_trigger_up()
133 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gf1_pcm_trigger_up()
134 snd_gf1_select_voice(gus, pcmp->pvoices[voice]->number); in snd_gf1_pcm_trigger_up()
135 snd_gf1_write8(gus, SNDRV_GF1_VB_PAN, pan); in snd_gf1_pcm_trigger_up()
136 snd_gf1_write16(gus, SNDRV_GF1_VW_FREQUENCY, rate); in snd_gf1_pcm_trigger_up()
137 snd_gf1_write_addr(gus, SNDRV_GF1_VA_START, begin << 4, voice_ctrl & 4); in snd_gf1_pcm_trigger_up()
138 snd_gf1_write_addr(gus, SNDRV_GF1_VA_END, end << 4, voice_ctrl & 4); in snd_gf1_pcm_trigger_up()
139 snd_gf1_write_addr(gus, SNDRV_GF1_VA_CURRENT, curr << 4, voice_ctrl & 4); in snd_gf1_pcm_trigger_up()
140 snd_gf1_write16(gus, SNDRV_GF1_VW_VOLUME, SNDRV_GF1_MIN_VOLUME << 4); in snd_gf1_pcm_trigger_up()
141 snd_gf1_write8(gus, SNDRV_GF1_VB_VOLUME_RATE, 0x2f); in snd_gf1_pcm_trigger_up()
142 snd_gf1_write8(gus, SNDRV_GF1_VB_VOLUME_START, SNDRV_GF1_MIN_OFFSET); in snd_gf1_pcm_trigger_up()
143 snd_gf1_write8(gus, SNDRV_GF1_VB_VOLUME_END, vol >> 8); in snd_gf1_pcm_trigger_up()
144 snd_gf1_write8(gus, SNDRV_GF1_VB_VOLUME_CONTROL, ramp_ctrl); in snd_gf1_pcm_trigger_up()
145 if (!gus->gf1.enh_mode) { in snd_gf1_pcm_trigger_up()
146 snd_gf1_delay(gus); in snd_gf1_pcm_trigger_up()
147 snd_gf1_write8(gus, SNDRV_GF1_VB_VOLUME_CONTROL, ramp_ctrl); in snd_gf1_pcm_trigger_up()
149 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gf1_pcm_trigger_up()
151 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gf1_pcm_trigger_up()
153 snd_gf1_select_voice(gus, pcmp->pvoices[voice]->number); in snd_gf1_pcm_trigger_up()
154 if (gus->gf1.enh_mode) in snd_gf1_pcm_trigger_up()
155 snd_gf1_write8(gus, SNDRV_GF1_VB_MODE, 0x00); /* deactivate voice */ in snd_gf1_pcm_trigger_up()
156 snd_gf1_write8(gus, SNDRV_GF1_VB_ADDRESS_CONTROL, voice_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()
163 snd_gf1_select_voice(gus, pcmp->pvoices[voice]->number); in snd_gf1_pcm_trigger_up()
164 snd_gf1_write8(gus, SNDRV_GF1_VB_ADDRESS_CONTROL, voice_ctrl); in snd_gf1_pcm_trigger_up()
168 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gf1_pcm_trigger_up()
171 static void snd_gf1_pcm_interrupt_wave(struct snd_gus_card * gus, in snd_gf1_pcm_interrupt_wave() argument
182 snd_gf1_smart_stop_voice(gus, pvoice->number); in snd_gf1_pcm_interrupt_wave()
188 snd_gf1_smart_stop_voice(gus, pvoice->number); in snd_gf1_pcm_interrupt_wave()
191 gus = pcmp->gus; in snd_gf1_pcm_interrupt_wave()
194 spin_lock(&gus->reg_lock); in snd_gf1_pcm_interrupt_wave()
195 snd_gf1_select_voice(gus, pvoice->number); in snd_gf1_pcm_interrupt_wave()
196 voice_ctrl = snd_gf1_read8(gus, SNDRV_GF1_VB_ADDRESS_CONTROL) & ~0x8b; in snd_gf1_pcm_interrupt_wave()
197 ramp_ctrl = (snd_gf1_read8(gus, SNDRV_GF1_VB_VOLUME_CONTROL) & ~0xa4) | 0x03; in snd_gf1_pcm_interrupt_wave()
199 snd_gf1_select_voice(gus, pvoice->number); in snd_gf1_pcm_interrupt_wave()
201 (snd_gf1_read_addr(gus, SNDRV_GF1_VA_CURRENT, voice_ctrl & 4) >> 4)); in snd_gf1_pcm_interrupt_wave()
202 snd_gf1_select_voice(gus, pcmp->pvoices[1]->number); in snd_gf1_pcm_interrupt_wave()
204 (snd_gf1_read_addr(gus, SNDRV_GF1_VA_CURRENT, voice_ctrl & 4) >> 4)); in snd_gf1_pcm_interrupt_wave()
205 snd_gf1_select_voice(gus, pvoice->number); in snd_gf1_pcm_interrupt_wave()
223 snd_gf1_select_voice(gus, pcmp->pvoices[idx]->number); in snd_gf1_pcm_interrupt_wave()
224 snd_gf1_write_addr(gus, SNDRV_GF1_VA_END, end << 4, voice_ctrl & 4); in snd_gf1_pcm_interrupt_wave()
225 snd_gf1_write8(gus, SNDRV_GF1_VB_ADDRESS_CONTROL, voice_ctrl); in snd_gf1_pcm_interrupt_wave()
226 snd_gf1_write8(gus, SNDRV_GF1_VB_VOLUME_CONTROL, ramp_ctrl); in snd_gf1_pcm_interrupt_wave()
229 if (!gus->gf1.enh_mode) { in snd_gf1_pcm_interrupt_wave()
230 snd_gf1_delay(gus); in snd_gf1_pcm_interrupt_wave()
233 snd_gf1_select_voice(gus, pcmp->pvoices[idx]->number); in snd_gf1_pcm_interrupt_wave()
234 snd_gf1_write8(gus, SNDRV_GF1_VB_ADDRESS_CONTROL, voice_ctrl); in snd_gf1_pcm_interrupt_wave()
235 snd_gf1_write8(gus, SNDRV_GF1_VB_VOLUME_CONTROL, ramp_ctrl); in snd_gf1_pcm_interrupt_wave()
239 spin_unlock(&gus->reg_lock); in snd_gf1_pcm_interrupt_wave()
256 static void snd_gf1_pcm_interrupt_volume(struct snd_gus_card * gus, in snd_gf1_pcm_interrupt_volume() argument
264 spin_lock(&gus->reg_lock); in snd_gf1_pcm_interrupt_volume()
265 snd_gf1_select_voice(gus, pvoice->number); in snd_gf1_pcm_interrupt_volume()
266 snd_gf1_ctrl_stop(gus, SNDRV_GF1_VB_VOLUME_CONTROL); in snd_gf1_pcm_interrupt_volume()
267 spin_unlock(&gus->reg_lock); in snd_gf1_pcm_interrupt_volume()
277 vol = !cvoice ? gus->gf1.pcm_volume_level_left : gus->gf1.pcm_volume_level_right; in snd_gf1_pcm_interrupt_volume()
278 spin_lock(&gus->reg_lock); in snd_gf1_pcm_interrupt_volume()
279 snd_gf1_select_voice(gus, pvoice->number); in snd_gf1_pcm_interrupt_volume()
280 snd_gf1_write16(gus, SNDRV_GF1_VW_VOLUME, vol); in snd_gf1_pcm_interrupt_volume()
282 spin_unlock(&gus->reg_lock); in snd_gf1_pcm_interrupt_volume()
285 static void snd_gf1_pcm_volume_change(struct snd_gus_card * gus) in snd_gf1_pcm_volume_change() argument
289 static int snd_gf1_pcm_poke_block(struct snd_gus_card *gus, unsigned char *buf, in snd_gf1_pcm_poke_block() argument
306 if (gus->interwave) { in snd_gf1_pcm_poke_block()
307 spin_lock_irqsave(&gus->reg_lock, flags); in snd_gf1_pcm_poke_block()
308 snd_gf1_write8(gus, SNDRV_GF1_GB_MEMORY_CONTROL, 0x01 | (invert ? 0x08 : 0x00)); in snd_gf1_pcm_poke_block()
309 snd_gf1_dram_addr(gus, pos); in snd_gf1_pcm_poke_block()
311 outb(SNDRV_GF1_GW_DRAM_IO16, GUSP(gus, GF1REGSEL)); in snd_gf1_pcm_poke_block()
312 outsw(GUSP(gus, GF1DATALOW), buf, len >> 1); in snd_gf1_pcm_poke_block()
314 outsb(GUSP(gus, DRAM), buf, len); in snd_gf1_pcm_poke_block()
316 spin_unlock_irqrestore(&gus->reg_lock, flags); in snd_gf1_pcm_poke_block()
324 snd_gf1_poke(gus, pos++, *buf++); in snd_gf1_pcm_poke_block()
325 snd_gf1_poke(gus, pos++, *buf++ ^ invert); in snd_gf1_pcm_poke_block()
329 snd_gf1_poke(gus, pos++, *buf++ ^ invert); in snd_gf1_pcm_poke_block()
357 struct snd_gus_card *gus = pcmp->gus; in playback_copy_ack() local
366 return snd_gf1_pcm_poke_block(gus, runtime->dma_area + bpos, in playback_copy_ack()
423 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_playback_hw_params() local
430 snd_gf1_mem_free(&gus->gf1.mem_alloc, pcmp->memory); in snd_gf1_pcm_playback_hw_params()
433 block = snd_gf1_mem_alloc(&gus->gf1.mem_alloc, in snd_gf1_pcm_playback_hw_params()
444 pcmp->pvoices[0] = snd_gf1_alloc_voice(pcmp->gus, SNDRV_GF1_VOICE_TYPE_PCM, 0, 0); in snd_gf1_pcm_playback_hw_params()
453 pcmp->pvoices[1] = snd_gf1_alloc_voice(pcmp->gus, SNDRV_GF1_VOICE_TYPE_PCM, 0, 0); in snd_gf1_pcm_playback_hw_params()
462 snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[1]); in snd_gf1_pcm_playback_hw_params()
475 snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[0]); in snd_gf1_pcm_playback_hw_free()
479 snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[1]); in snd_gf1_pcm_playback_hw_free()
483 snd_gf1_mem_free(&pcmp->gus->gf1.mem_alloc, pcmp->memory); in snd_gf1_pcm_playback_hw_free()
504 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_playback_trigger() local
516 snd_gf1_stop_voices(gus, voice, voice); in snd_gf1_pcm_playback_trigger()
519 snd_gf1_stop_voices(gus, voice, voice); in snd_gf1_pcm_playback_trigger()
529 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_playback_pointer() local
536 spin_lock(&gus->reg_lock); in snd_gf1_pcm_playback_pointer()
538 snd_gf1_select_voice(gus, pcmp->pvoices[0]->number); in snd_gf1_pcm_playback_pointer()
539 voice_ctrl = snd_gf1_read8(gus, SNDRV_GF1_VB_ADDRESS_CONTROL); in snd_gf1_pcm_playback_pointer()
540 pos = (snd_gf1_read_addr(gus, SNDRV_GF1_VA_CURRENT, voice_ctrl & 4) >> 4) - pcmp->memory; in snd_gf1_pcm_playback_pointer()
545 spin_unlock(&gus->reg_lock); in snd_gf1_pcm_playback_pointer()
564 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_hw_params() local
566 gus->c_dma_size = params_buffer_bytes(hw_params); in snd_gf1_pcm_capture_hw_params()
567 gus->c_period_size = params_period_bytes(hw_params); in snd_gf1_pcm_capture_hw_params()
568 gus->c_pos = 0; in snd_gf1_pcm_capture_hw_params()
569 gus->gf1.pcm_rcntrl_reg = 0x21; /* IRQ at end, enable & start */ in snd_gf1_pcm_capture_hw_params()
571 gus->gf1.pcm_rcntrl_reg |= 2; in snd_gf1_pcm_capture_hw_params()
572 if (gus->gf1.dma2 > 3) in snd_gf1_pcm_capture_hw_params()
573 gus->gf1.pcm_rcntrl_reg |= 4; in snd_gf1_pcm_capture_hw_params()
575 gus->gf1.pcm_rcntrl_reg |= 0x80; in snd_gf1_pcm_capture_hw_params()
581 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_prepare() local
584 snd_gf1_i_write8(gus, SNDRV_GF1_GB_RECORD_RATE, runtime->rate_den - 2); in snd_gf1_pcm_capture_prepare()
585 snd_gf1_i_write8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL, 0); /* disable sampling */ in snd_gf1_pcm_capture_prepare()
586 snd_gf1_i_look8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL); /* Sampling Control Register */ in snd_gf1_pcm_capture_prepare()
587 snd_dma_program(gus->gf1.dma2, runtime->dma_addr, gus->c_period_size, DMA_MODE_READ); in snd_gf1_pcm_capture_prepare()
594 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_trigger() local
598 val = gus->gf1.pcm_rcntrl_reg; in snd_gf1_pcm_capture_trigger()
605 spin_lock(&gus->reg_lock); in snd_gf1_pcm_capture_trigger()
606 snd_gf1_write8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL, val); in snd_gf1_pcm_capture_trigger()
607 snd_gf1_look8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL); in snd_gf1_pcm_capture_trigger()
608 spin_unlock(&gus->reg_lock); in snd_gf1_pcm_capture_trigger()
614 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_pointer() local
615 int pos = snd_dma_pointer(gus->gf1.dma2, gus->c_period_size); in snd_gf1_pcm_capture_pointer()
616 pos = bytes_to_frames(substream->runtime, (gus->c_pos + pos) % gus->c_dma_size); in snd_gf1_pcm_capture_pointer()
620 static void snd_gf1_pcm_interrupt_dma_read(struct snd_gus_card * gus) in snd_gf1_pcm_interrupt_dma_read() argument
622 snd_gf1_i_write8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL, 0); /* disable sampling */ in snd_gf1_pcm_interrupt_dma_read()
623 snd_gf1_i_look8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL); /* Sampling Control Register */ in snd_gf1_pcm_interrupt_dma_read()
624 if (gus->pcm_cap_substream != NULL) { in snd_gf1_pcm_interrupt_dma_read()
625 snd_gf1_pcm_capture_prepare(gus->pcm_cap_substream); in snd_gf1_pcm_interrupt_dma_read()
626 snd_gf1_pcm_capture_trigger(gus->pcm_cap_substream, SNDRV_PCM_TRIGGER_START); in snd_gf1_pcm_interrupt_dma_read()
627 gus->c_pos += gus->c_period_size; in snd_gf1_pcm_interrupt_dma_read()
628 snd_pcm_period_elapsed(gus->pcm_cap_substream); in snd_gf1_pcm_interrupt_dma_read()
676 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_playback_open() local
683 pcmp->gus = gus; in snd_gf1_pcm_playback_open()
693 (long) pcm->playback.buffer, (long) gus->gf1.pcm_buffer); in snd_gf1_pcm_playback_open()
695 err = snd_gf1_dma_init(gus); in snd_gf1_pcm_playback_open()
701 snd_pcm_limit_isa_dma_size(gus->gf1.dma1, &runtime->hw.buffer_bytes_max); in snd_gf1_pcm_playback_open()
702 snd_pcm_limit_isa_dma_size(gus->gf1.dma1, &runtime->hw.period_bytes_max); in snd_gf1_pcm_playback_open()
709 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_playback_close() local
716 snd_gf1_dma_done(gus); in snd_gf1_pcm_playback_close()
723 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_open() local
725 gus->gf1.interrupt_handler_dma_read = snd_gf1_pcm_interrupt_dma_read; in snd_gf1_pcm_capture_open()
726 gus->pcm_cap_substream = substream; in snd_gf1_pcm_capture_open()
728 snd_pcm_limit_isa_dma_size(gus->gf1.dma2, &runtime->hw.buffer_bytes_max); in snd_gf1_pcm_capture_open()
729 snd_pcm_limit_isa_dma_size(gus->gf1.dma2, &runtime->hw.period_bytes_max); in snd_gf1_pcm_capture_open()
737 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_close() local
739 gus->pcm_cap_substream = NULL; in snd_gf1_pcm_capture_close()
740 snd_gf1_set_default_handlers(gus, SNDRV_GF1_HANDLER_DMA_READ); in snd_gf1_pcm_capture_close()
755 struct snd_gus_card *gus = snd_kcontrol_chip(kcontrol); in snd_gf1_pcm_volume_get() local
758 spin_lock_irqsave(&gus->pcm_volume_level_lock, flags); in snd_gf1_pcm_volume_get()
759 ucontrol->value.integer.value[0] = gus->gf1.pcm_volume_level_left1; in snd_gf1_pcm_volume_get()
760 ucontrol->value.integer.value[1] = gus->gf1.pcm_volume_level_right1; in snd_gf1_pcm_volume_get()
761 spin_unlock_irqrestore(&gus->pcm_volume_level_lock, flags); in snd_gf1_pcm_volume_get()
767 struct snd_gus_card *gus = snd_kcontrol_chip(kcontrol); in snd_gf1_pcm_volume_put() local
777 spin_lock_irqsave(&gus->pcm_volume_level_lock, flags); in snd_gf1_pcm_volume_put()
778 change = val1 != gus->gf1.pcm_volume_level_left1 || in snd_gf1_pcm_volume_put()
779 val2 != gus->gf1.pcm_volume_level_right1; in snd_gf1_pcm_volume_put()
780 gus->gf1.pcm_volume_level_left1 = val1; in snd_gf1_pcm_volume_put()
781 gus->gf1.pcm_volume_level_right1 = val2; in snd_gf1_pcm_volume_put()
782 gus->gf1.pcm_volume_level_left = snd_gf1_lvol_to_gvol_raw(val1 << 9) << 4; in snd_gf1_pcm_volume_put()
783 gus->gf1.pcm_volume_level_right = snd_gf1_lvol_to_gvol_raw(val2 << 9) << 4; in snd_gf1_pcm_volume_put()
784 spin_unlock_irqrestore(&gus->pcm_volume_level_lock, flags); in snd_gf1_pcm_volume_put()
786 spin_lock_irqsave(&gus->voice_alloc, flags); in snd_gf1_pcm_volume_put()
788 pvoice = &gus->gf1.voices[idx]; in snd_gf1_pcm_volume_put()
795 spin_lock(&gus->reg_lock); in snd_gf1_pcm_volume_put()
796 snd_gf1_select_voice(gus, pvoice->number); in snd_gf1_pcm_volume_put()
797 snd_gf1_ctrl_stop(gus, SNDRV_GF1_VB_VOLUME_CONTROL); in snd_gf1_pcm_volume_put()
798 …vol = pvoice == pcmp->pvoices[0] ? gus->gf1.pcm_volume_level_left : gus->gf1.pcm_volume_level_righ… in snd_gf1_pcm_volume_put()
799 snd_gf1_write16(gus, SNDRV_GF1_VW_VOLUME, vol); in snd_gf1_pcm_volume_put()
801 spin_unlock(&gus->reg_lock); in snd_gf1_pcm_volume_put()
803 spin_unlock_irqrestore(&gus->voice_alloc, flags); in snd_gf1_pcm_volume_put()
847 int snd_gf1_pcm_new(struct snd_gus_card *gus, int pcm_dev, int control_index) in snd_gf1_pcm_new() argument
855 card = gus->card; in snd_gf1_pcm_new()
856 capture = !gus->interwave && !gus->ess_flag && !gus->ace_flag ? 1 : 0; in snd_gf1_pcm_new()
858 gus->interwave ? "AMD InterWave" : "GF1", in snd_gf1_pcm_new()
860 gus->gf1.pcm_channels / 2, in snd_gf1_pcm_new()
865 pcm->private_data = gus; in snd_gf1_pcm_new()
872 64*1024, gus->gf1.dma1 > 3 ? 128*1024 : 64*1024); in snd_gf1_pcm_new()
878 if (gus->gf1.dma2 == gus->gf1.dma1) in snd_gf1_pcm_new()
882 64*1024, gus->gf1.dma2 > 3 ? 128*1024 : 64*1024); in snd_gf1_pcm_new()
885 if (gus->interwave) { in snd_gf1_pcm_new()
886 sprintf(pcm->name + strlen(pcm->name), " rev %c", gus->revision + 'A'); in snd_gf1_pcm_new()
889 gus->pcm = pcm; in snd_gf1_pcm_new()
891 if (gus->codec_flag) in snd_gf1_pcm_new()
892 kctl = snd_ctl_new1(&snd_gf1_pcm_volume_control1, gus); in snd_gf1_pcm_new()
894 kctl = snd_ctl_new1(&snd_gf1_pcm_volume_control, gus); in snd_gf1_pcm_new()