Lines Matching refs:gus

47 	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()
372 struct snd_gus_card *gus = pcmp->gus; in playback_copy_ack() local
381 return snd_gf1_pcm_poke_block(gus, runtime->dma_area + bpos, in playback_copy_ack()
438 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_playback_hw_params() local
448 snd_gf1_mem_free(&gus->gf1.mem_alloc, pcmp->memory); in snd_gf1_pcm_playback_hw_params()
451 if ((block = snd_gf1_mem_alloc(&gus->gf1.mem_alloc, in snd_gf1_pcm_playback_hw_params()
461 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()
469 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()
477 snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[1]); in snd_gf1_pcm_playback_hw_params()
491 snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[0]); in snd_gf1_pcm_playback_hw_free()
495 snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[1]); in snd_gf1_pcm_playback_hw_free()
499 snd_gf1_mem_free(&pcmp->gus->gf1.mem_alloc, pcmp->memory); in snd_gf1_pcm_playback_hw_free()
520 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_playback_trigger() local
532 snd_gf1_stop_voices(gus, voice, voice); in snd_gf1_pcm_playback_trigger()
535 snd_gf1_stop_voices(gus, voice, voice); in snd_gf1_pcm_playback_trigger()
545 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_playback_pointer() local
552 spin_lock(&gus->reg_lock); in snd_gf1_pcm_playback_pointer()
554 snd_gf1_select_voice(gus, pcmp->pvoices[0]->number); in snd_gf1_pcm_playback_pointer()
555 voice_ctrl = snd_gf1_read8(gus, SNDRV_GF1_VB_ADDRESS_CONTROL); in snd_gf1_pcm_playback_pointer()
556 pos = (snd_gf1_read_addr(gus, SNDRV_GF1_VA_CURRENT, voice_ctrl & 4) >> 4) - pcmp->memory; in snd_gf1_pcm_playback_pointer()
561 spin_unlock(&gus->reg_lock); in snd_gf1_pcm_playback_pointer()
580 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_hw_params() local
582 gus->c_dma_size = params_buffer_bytes(hw_params); in snd_gf1_pcm_capture_hw_params()
583 gus->c_period_size = params_period_bytes(hw_params); in snd_gf1_pcm_capture_hw_params()
584 gus->c_pos = 0; in snd_gf1_pcm_capture_hw_params()
585 gus->gf1.pcm_rcntrl_reg = 0x21; /* IRQ at end, enable & start */ in snd_gf1_pcm_capture_hw_params()
587 gus->gf1.pcm_rcntrl_reg |= 2; in snd_gf1_pcm_capture_hw_params()
588 if (gus->gf1.dma2 > 3) in snd_gf1_pcm_capture_hw_params()
589 gus->gf1.pcm_rcntrl_reg |= 4; in snd_gf1_pcm_capture_hw_params()
591 gus->gf1.pcm_rcntrl_reg |= 0x80; in snd_gf1_pcm_capture_hw_params()
602 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_prepare() local
605 snd_gf1_i_write8(gus, SNDRV_GF1_GB_RECORD_RATE, runtime->rate_den - 2); in snd_gf1_pcm_capture_prepare()
606 snd_gf1_i_write8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL, 0); /* disable sampling */ in snd_gf1_pcm_capture_prepare()
607 snd_gf1_i_look8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL); /* Sampling Control Register */ in snd_gf1_pcm_capture_prepare()
608 snd_dma_program(gus->gf1.dma2, runtime->dma_addr, gus->c_period_size, DMA_MODE_READ); in snd_gf1_pcm_capture_prepare()
615 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_trigger() local
619 val = gus->gf1.pcm_rcntrl_reg; in snd_gf1_pcm_capture_trigger()
626 spin_lock(&gus->reg_lock); in snd_gf1_pcm_capture_trigger()
627 snd_gf1_write8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL, val); in snd_gf1_pcm_capture_trigger()
628 snd_gf1_look8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL); in snd_gf1_pcm_capture_trigger()
629 spin_unlock(&gus->reg_lock); in snd_gf1_pcm_capture_trigger()
635 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_pointer() local
636 int pos = snd_dma_pointer(gus->gf1.dma2, gus->c_period_size); in snd_gf1_pcm_capture_pointer()
637 pos = bytes_to_frames(substream->runtime, (gus->c_pos + pos) % gus->c_dma_size); in snd_gf1_pcm_capture_pointer()
641 static void snd_gf1_pcm_interrupt_dma_read(struct snd_gus_card * gus) in snd_gf1_pcm_interrupt_dma_read() argument
643 snd_gf1_i_write8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL, 0); /* disable sampling */ in snd_gf1_pcm_interrupt_dma_read()
644 snd_gf1_i_look8(gus, SNDRV_GF1_GB_REC_DMA_CONTROL); /* Sampling Control Register */ in snd_gf1_pcm_interrupt_dma_read()
645 if (gus->pcm_cap_substream != NULL) { in snd_gf1_pcm_interrupt_dma_read()
646 snd_gf1_pcm_capture_prepare(gus->pcm_cap_substream); in snd_gf1_pcm_interrupt_dma_read()
647 snd_gf1_pcm_capture_trigger(gus->pcm_cap_substream, SNDRV_PCM_TRIGGER_START); in snd_gf1_pcm_interrupt_dma_read()
648 gus->c_pos += gus->c_period_size; in snd_gf1_pcm_interrupt_dma_read()
649 snd_pcm_period_elapsed(gus->pcm_cap_substream); in snd_gf1_pcm_interrupt_dma_read()
697 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_playback_open() local
704 pcmp->gus = gus; in snd_gf1_pcm_playback_open()
714 (long) pcm->playback.buffer, (long) gus->gf1.pcm_buffer); in snd_gf1_pcm_playback_open()
716 if ((err = snd_gf1_dma_init(gus)) < 0) in snd_gf1_pcm_playback_open()
721 snd_pcm_limit_isa_dma_size(gus->gf1.dma1, &runtime->hw.buffer_bytes_max); in snd_gf1_pcm_playback_open()
722 snd_pcm_limit_isa_dma_size(gus->gf1.dma1, &runtime->hw.period_bytes_max); in snd_gf1_pcm_playback_open()
729 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_playback_close() local
736 snd_gf1_dma_done(gus); in snd_gf1_pcm_playback_close()
743 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_open() local
745 gus->gf1.interrupt_handler_dma_read = snd_gf1_pcm_interrupt_dma_read; in snd_gf1_pcm_capture_open()
746 gus->pcm_cap_substream = substream; in snd_gf1_pcm_capture_open()
748 snd_pcm_limit_isa_dma_size(gus->gf1.dma2, &runtime->hw.buffer_bytes_max); in snd_gf1_pcm_capture_open()
749 snd_pcm_limit_isa_dma_size(gus->gf1.dma2, &runtime->hw.period_bytes_max); in snd_gf1_pcm_capture_open()
757 struct snd_gus_card *gus = snd_pcm_substream_chip(substream); in snd_gf1_pcm_capture_close() local
759 gus->pcm_cap_substream = NULL; in snd_gf1_pcm_capture_close()
760 snd_gf1_set_default_handlers(gus, SNDRV_GF1_HANDLER_DMA_READ); in snd_gf1_pcm_capture_close()
775 struct snd_gus_card *gus = snd_kcontrol_chip(kcontrol); in snd_gf1_pcm_volume_get() local
778 spin_lock_irqsave(&gus->pcm_volume_level_lock, flags); in snd_gf1_pcm_volume_get()
779 ucontrol->value.integer.value[0] = gus->gf1.pcm_volume_level_left1; in snd_gf1_pcm_volume_get()
780 ucontrol->value.integer.value[1] = gus->gf1.pcm_volume_level_right1; in snd_gf1_pcm_volume_get()
781 spin_unlock_irqrestore(&gus->pcm_volume_level_lock, flags); in snd_gf1_pcm_volume_get()
787 struct snd_gus_card *gus = snd_kcontrol_chip(kcontrol); in snd_gf1_pcm_volume_put() local
797 spin_lock_irqsave(&gus->pcm_volume_level_lock, flags); in snd_gf1_pcm_volume_put()
798 change = val1 != gus->gf1.pcm_volume_level_left1 || in snd_gf1_pcm_volume_put()
799 val2 != gus->gf1.pcm_volume_level_right1; in snd_gf1_pcm_volume_put()
800 gus->gf1.pcm_volume_level_left1 = val1; in snd_gf1_pcm_volume_put()
801 gus->gf1.pcm_volume_level_right1 = val2; in snd_gf1_pcm_volume_put()
802 gus->gf1.pcm_volume_level_left = snd_gf1_lvol_to_gvol_raw(val1 << 9) << 4; in snd_gf1_pcm_volume_put()
803 gus->gf1.pcm_volume_level_right = snd_gf1_lvol_to_gvol_raw(val2 << 9) << 4; in snd_gf1_pcm_volume_put()
804 spin_unlock_irqrestore(&gus->pcm_volume_level_lock, flags); in snd_gf1_pcm_volume_put()
806 spin_lock_irqsave(&gus->voice_alloc, flags); in snd_gf1_pcm_volume_put()
808 pvoice = &gus->gf1.voices[idx]; in snd_gf1_pcm_volume_put()
815 spin_lock(&gus->reg_lock); in snd_gf1_pcm_volume_put()
816 snd_gf1_select_voice(gus, pvoice->number); in snd_gf1_pcm_volume_put()
817 snd_gf1_ctrl_stop(gus, SNDRV_GF1_VB_VOLUME_CONTROL); in snd_gf1_pcm_volume_put()
818 …vol = pvoice == pcmp->pvoices[0] ? gus->gf1.pcm_volume_level_left : gus->gf1.pcm_volume_level_righ… in snd_gf1_pcm_volume_put()
819 snd_gf1_write16(gus, SNDRV_GF1_VW_VOLUME, vol); in snd_gf1_pcm_volume_put()
821 spin_unlock(&gus->reg_lock); in snd_gf1_pcm_volume_put()
823 spin_unlock_irqrestore(&gus->voice_alloc, flags); in snd_gf1_pcm_volume_put()
870 int snd_gf1_pcm_new(struct snd_gus_card *gus, int pcm_dev, int control_index) in snd_gf1_pcm_new() argument
878 card = gus->card; in snd_gf1_pcm_new()
879 capture = !gus->interwave && !gus->ess_flag && !gus->ace_flag ? 1 : 0; in snd_gf1_pcm_new()
881 gus->interwave ? "AMD InterWave" : "GF1", in snd_gf1_pcm_new()
883 gus->gf1.pcm_channels / 2, in snd_gf1_pcm_new()
888 pcm->private_data = gus; in snd_gf1_pcm_new()
895 64*1024, gus->gf1.dma1 > 3 ? 128*1024 : 64*1024); in snd_gf1_pcm_new()
901 if (gus->gf1.dma2 == gus->gf1.dma1) in snd_gf1_pcm_new()
905 64*1024, gus->gf1.dma2 > 3 ? 128*1024 : 64*1024); in snd_gf1_pcm_new()
908 if (gus->interwave) { in snd_gf1_pcm_new()
909 sprintf(pcm->name + strlen(pcm->name), " rev %c", gus->revision + 'A'); in snd_gf1_pcm_new()
912 gus->pcm = pcm; in snd_gf1_pcm_new()
914 if (gus->codec_flag) in snd_gf1_pcm_new()
915 kctl = snd_ctl_new1(&snd_gf1_pcm_volume_control1, gus); in snd_gf1_pcm_new()
917 kctl = snd_ctl_new1(&snd_gf1_pcm_volume_control, gus); in snd_gf1_pcm_new()