Lines Matching refs:ice

120 static inline int stdclock_is_spdif_master(struct snd_ice1712 *ice)  in stdclock_is_spdif_master()  argument
122 return (inb(ICEMT1724(ice, RATE)) & VT1724_SPDIF_MASTER) ? 1 : 0; in stdclock_is_spdif_master()
128 static inline int is_pro_rate_locked(struct snd_ice1712 *ice) in is_pro_rate_locked() argument
130 return (!ice->is_spdif_master(ice)) && PRO_RATE_LOCKED; in is_pro_rate_locked()
137 static unsigned char snd_vt1724_ac97_ready(struct snd_ice1712 *ice) in snd_vt1724_ac97_ready() argument
142 old_cmd = inb(ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_ready()
149 dev_dbg(ice->card->dev, "snd_vt1724_ac97_ready: timeout\n"); in snd_vt1724_ac97_ready()
153 static int snd_vt1724_ac97_wait_bit(struct snd_ice1712 *ice, unsigned char bit) in snd_vt1724_ac97_wait_bit() argument
157 if ((inb(ICEMT1724(ice, AC97_CMD)) & bit) == 0) in snd_vt1724_ac97_wait_bit()
159 dev_dbg(ice->card->dev, "snd_vt1724_ac97_wait_bit: timeout\n"); in snd_vt1724_ac97_wait_bit()
167 struct snd_ice1712 *ice = ac97->private_data; in snd_vt1724_ac97_write() local
170 old_cmd = snd_vt1724_ac97_ready(ice); in snd_vt1724_ac97_write()
173 outb(reg, ICEMT1724(ice, AC97_INDEX)); in snd_vt1724_ac97_write()
174 outw(val, ICEMT1724(ice, AC97_DATA)); in snd_vt1724_ac97_write()
175 outb(old_cmd | VT1724_AC97_WRITE, ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_write()
176 snd_vt1724_ac97_wait_bit(ice, VT1724_AC97_WRITE); in snd_vt1724_ac97_write()
181 struct snd_ice1712 *ice = ac97->private_data; in snd_vt1724_ac97_read() local
184 old_cmd = snd_vt1724_ac97_ready(ice); in snd_vt1724_ac97_read()
187 outb(reg, ICEMT1724(ice, AC97_INDEX)); in snd_vt1724_ac97_read()
188 outb(old_cmd | VT1724_AC97_READ, ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_read()
189 if (snd_vt1724_ac97_wait_bit(ice, VT1724_AC97_READ) < 0) in snd_vt1724_ac97_read()
191 return inw(ICEMT1724(ice, AC97_DATA)); in snd_vt1724_ac97_read()
200 static void snd_vt1724_set_gpio_dir(struct snd_ice1712 *ice, unsigned int data) in snd_vt1724_set_gpio_dir() argument
202 outl(data, ICEREG1724(ice, GPIO_DIRECTION)); in snd_vt1724_set_gpio_dir()
203 inw(ICEREG1724(ice, GPIO_DIRECTION)); /* dummy read for pci-posting */ in snd_vt1724_set_gpio_dir()
207 static unsigned int snd_vt1724_get_gpio_dir(struct snd_ice1712 *ice) in snd_vt1724_get_gpio_dir() argument
209 return inl(ICEREG1724(ice, GPIO_DIRECTION)); in snd_vt1724_get_gpio_dir()
213 static void snd_vt1724_set_gpio_mask(struct snd_ice1712 *ice, unsigned int data) in snd_vt1724_set_gpio_mask() argument
215 outw(data, ICEREG1724(ice, GPIO_WRITE_MASK)); in snd_vt1724_set_gpio_mask()
216 if (!ice->vt1720) /* VT1720 supports only 16 GPIO bits */ in snd_vt1724_set_gpio_mask()
217 outb((data >> 16) & 0xff, ICEREG1724(ice, GPIO_WRITE_MASK_22)); in snd_vt1724_set_gpio_mask()
218 inw(ICEREG1724(ice, GPIO_WRITE_MASK)); /* dummy read for pci-posting */ in snd_vt1724_set_gpio_mask()
221 static unsigned int snd_vt1724_get_gpio_mask(struct snd_ice1712 *ice) in snd_vt1724_get_gpio_mask() argument
224 if (!ice->vt1720) in snd_vt1724_get_gpio_mask()
225 mask = (unsigned int)inb(ICEREG1724(ice, GPIO_WRITE_MASK_22)); in snd_vt1724_get_gpio_mask()
228 mask = (mask << 16) | inw(ICEREG1724(ice, GPIO_WRITE_MASK)); in snd_vt1724_get_gpio_mask()
232 static void snd_vt1724_set_gpio_data(struct snd_ice1712 *ice, unsigned int data) in snd_vt1724_set_gpio_data() argument
234 outw(data, ICEREG1724(ice, GPIO_DATA)); in snd_vt1724_set_gpio_data()
235 if (!ice->vt1720) in snd_vt1724_set_gpio_data()
236 outb(data >> 16, ICEREG1724(ice, GPIO_DATA_22)); in snd_vt1724_set_gpio_data()
237 inw(ICEREG1724(ice, GPIO_DATA)); /* dummy read for pci-posting */ in snd_vt1724_set_gpio_data()
240 static unsigned int snd_vt1724_get_gpio_data(struct snd_ice1712 *ice) in snd_vt1724_get_gpio_data() argument
243 if (!ice->vt1720) in snd_vt1724_get_gpio_data()
244 data = (unsigned int)inb(ICEREG1724(ice, GPIO_DATA_22)); in snd_vt1724_get_gpio_data()
247 data = (data << 16) | inw(ICEREG1724(ice, GPIO_DATA)); in snd_vt1724_get_gpio_data()
255 static void vt1724_midi_clear_rx(struct snd_ice1712 *ice) in vt1724_midi_clear_rx() argument
259 for (count = inb(ICEREG1724(ice, MPU_RXFIFO)); count > 0; --count) in vt1724_midi_clear_rx()
260 inb(ICEREG1724(ice, MPU_DATA)); in vt1724_midi_clear_rx()
264 get_rawmidi_substream(struct snd_ice1712 *ice, unsigned int stream) in get_rawmidi_substream() argument
266 return list_first_entry(&ice->rmidi[0]->streams[stream].substreams, in get_rawmidi_substream()
270 static void enable_midi_irq(struct snd_ice1712 *ice, u8 flag, int enable);
272 static void vt1724_midi_write(struct snd_ice1712 *ice) in vt1724_midi_write() argument
278 s = get_rawmidi_substream(ice, SNDRV_RAWMIDI_STREAM_OUTPUT); in vt1724_midi_write()
279 count = 31 - inb(ICEREG1724(ice, MPU_TXFIFO)); in vt1724_midi_write()
283 outb(buffer[i], ICEREG1724(ice, MPU_DATA)); in vt1724_midi_write()
288 enable_midi_irq(ice, VT1724_IRQ_MPU_TX, in vt1724_midi_write()
292 static void vt1724_midi_read(struct snd_ice1712 *ice) in vt1724_midi_read() argument
298 s = get_rawmidi_substream(ice, SNDRV_RAWMIDI_STREAM_INPUT); in vt1724_midi_read()
299 count = inb(ICEREG1724(ice, MPU_RXFIFO)); in vt1724_midi_read()
303 buffer[i] = inb(ICEREG1724(ice, MPU_DATA)); in vt1724_midi_read()
309 static void enable_midi_irq(struct snd_ice1712 *ice, u8 flag, int enable) in enable_midi_irq() argument
311 u8 mask = inb(ICEREG1724(ice, IRQMASK)); in enable_midi_irq()
316 outb(mask, ICEREG1724(ice, IRQMASK)); in enable_midi_irq()
322 struct snd_ice1712 *ice = substream->rmidi->private_data; in vt1724_enable_midi_irq() local
324 spin_lock_irq(&ice->reg_lock); in vt1724_enable_midi_irq()
325 enable_midi_irq(ice, flag, enable); in vt1724_enable_midi_irq()
326 spin_unlock_irq(&ice->reg_lock); in vt1724_enable_midi_irq()
341 struct snd_ice1712 *ice = s->rmidi->private_data; in vt1724_midi_output_trigger() local
344 spin_lock_irqsave(&ice->reg_lock, flags); in vt1724_midi_output_trigger()
346 ice->midi_output = 1; in vt1724_midi_output_trigger()
347 vt1724_midi_write(ice); in vt1724_midi_output_trigger()
349 ice->midi_output = 0; in vt1724_midi_output_trigger()
350 enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0); in vt1724_midi_output_trigger()
352 spin_unlock_irqrestore(&ice->reg_lock, flags); in vt1724_midi_output_trigger()
357 struct snd_ice1712 *ice = s->rmidi->private_data; in vt1724_midi_output_drain() local
364 if (inb(ICEREG1724(ice, MPU_CTRL)) & VT1724_MPU_TX_EMPTY) in vt1724_midi_output_drain()
392 struct snd_ice1712 *ice = s->rmidi->private_data; in vt1724_midi_input_trigger() local
395 spin_lock_irqsave(&ice->reg_lock, flags); in vt1724_midi_input_trigger()
397 ice->midi_input = 1; in vt1724_midi_input_trigger()
398 vt1724_midi_read(ice); in vt1724_midi_input_trigger()
400 ice->midi_input = 0; in vt1724_midi_input_trigger()
402 spin_unlock_irqrestore(&ice->reg_lock, flags); in vt1724_midi_input_trigger()
418 struct snd_ice1712 *ice = dev_id; in snd_vt1724_interrupt() local
426 status = inb(ICEREG1724(ice, IRQSTAT)); in snd_vt1724_interrupt()
430 spin_lock(&ice->reg_lock); in snd_vt1724_interrupt()
432 status = inb(ICEREG1724(ice, IRQSTAT)); in snd_vt1724_interrupt()
433 dev_err(ice->card->dev, in snd_vt1724_interrupt()
436 dev_err(ice->card->dev, "Disabling MPU_TX\n"); in snd_vt1724_interrupt()
437 enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0); in snd_vt1724_interrupt()
439 spin_unlock(&ice->reg_lock); in snd_vt1724_interrupt()
444 if (ice->midi_output) in snd_vt1724_interrupt()
445 vt1724_midi_write(ice); in snd_vt1724_interrupt()
447 enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0); in snd_vt1724_interrupt()
456 if (ice->midi_input) in snd_vt1724_interrupt()
457 vt1724_midi_read(ice); in snd_vt1724_interrupt()
459 vt1724_midi_clear_rx(ice); in snd_vt1724_interrupt()
462 outb(status, ICEREG1724(ice, IRQSTAT)); in snd_vt1724_interrupt()
463 spin_unlock(&ice->reg_lock); in snd_vt1724_interrupt()
476 unsigned char mtstat = inb(ICEMT1724(ice, IRQ)); in snd_vt1724_interrupt()
478 if (ice->playback_pro_substream) in snd_vt1724_interrupt()
479 snd_pcm_period_elapsed(ice->playback_pro_substream); in snd_vt1724_interrupt()
482 if (ice->capture_pro_substream) in snd_vt1724_interrupt()
483 snd_pcm_period_elapsed(ice->capture_pro_substream); in snd_vt1724_interrupt()
486 if (ice->playback_con_substream_ds[0]) in snd_vt1724_interrupt()
487 snd_pcm_period_elapsed(ice->playback_con_substream_ds[0]); in snd_vt1724_interrupt()
490 if (ice->playback_con_substream_ds[1]) in snd_vt1724_interrupt()
491 snd_pcm_period_elapsed(ice->playback_con_substream_ds[1]); in snd_vt1724_interrupt()
494 if (ice->playback_con_substream_ds[2]) in snd_vt1724_interrupt()
495 snd_pcm_period_elapsed(ice->playback_con_substream_ds[2]); in snd_vt1724_interrupt()
498 if (ice->playback_con_substream) in snd_vt1724_interrupt()
499 snd_pcm_period_elapsed(ice->playback_con_substream); in snd_vt1724_interrupt()
502 if (ice->capture_con_substream) in snd_vt1724_interrupt()
503 snd_pcm_period_elapsed(ice->capture_con_substream); in snd_vt1724_interrupt()
506 outb(mtstat, ICEMT1724(ice, IRQ)); in snd_vt1724_interrupt()
509 unsigned char fstat = inb(ICEMT1724(ice, DMA_FIFO_ERR)); in snd_vt1724_interrupt()
510 outb(fstat, ICEMT1724(ice, DMA_FIFO_ERR)); in snd_vt1724_interrupt()
511 outb(VT1724_MULTI_FIFO_ERR | inb(ICEMT1724(ice, DMA_INT_MASK)), ICEMT1724(ice, DMA_INT_MASK)); in snd_vt1724_interrupt()
557 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_trigger() local
564 if (snd_pcm_substream_chip(s) == ice) { in snd_vt1724_pcm_trigger()
575 spin_lock(&ice->reg_lock); in snd_vt1724_pcm_trigger()
576 old = inb(ICEMT1724(ice, DMA_PAUSE)); in snd_vt1724_pcm_trigger()
581 outb(old, ICEMT1724(ice, DMA_PAUSE)); in snd_vt1724_pcm_trigger()
582 spin_unlock(&ice->reg_lock); in snd_vt1724_pcm_trigger()
588 spin_lock(&ice->reg_lock); in snd_vt1724_pcm_trigger()
589 old = inb(ICEMT1724(ice, DMA_CONTROL)); in snd_vt1724_pcm_trigger()
594 outb(old, ICEMT1724(ice, DMA_CONTROL)); in snd_vt1724_pcm_trigger()
595 spin_unlock(&ice->reg_lock); in snd_vt1724_pcm_trigger()
621 static unsigned int stdclock_get_rate(struct snd_ice1712 *ice) in stdclock_get_rate() argument
624 rate = stdclock_rate_list[inb(ICEMT1724(ice, RATE)) & 15]; in stdclock_get_rate()
628 static void stdclock_set_rate(struct snd_ice1712 *ice, unsigned int rate) in stdclock_set_rate() argument
633 outb(i, ICEMT1724(ice, RATE)); in stdclock_set_rate()
639 static unsigned char stdclock_set_mclk(struct snd_ice1712 *ice, in stdclock_set_mclk() argument
644 if (ice->eeprom.data[ICE_EEP2_ACLINK] & VT1724_CFG_PRO_I2S) { in stdclock_set_mclk()
645 val = old = inb(ICEMT1724(ice, I2S_FORMAT)); in stdclock_set_mclk()
651 outb(val, ICEMT1724(ice, I2S_FORMAT)); in stdclock_set_mclk()
660 static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate, in snd_vt1724_set_pro_rate() argument
667 if (rate > ice->hw_rates->list[ice->hw_rates->count - 1]) in snd_vt1724_set_pro_rate()
670 spin_lock_irqsave(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
671 if ((inb(ICEMT1724(ice, DMA_CONTROL)) & DMA_STARTS) || in snd_vt1724_set_pro_rate()
672 (inb(ICEMT1724(ice, DMA_PAUSE)) & DMA_PAUSES)) { in snd_vt1724_set_pro_rate()
674 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
675 return ((rate == ice->cur_rate) && !force) ? 0 : -EBUSY; in snd_vt1724_set_pro_rate()
677 if (!force && is_pro_rate_locked(ice)) { in snd_vt1724_set_pro_rate()
680 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
681 return (rate == ice->cur_rate) ? 0 : -EBUSY; in snd_vt1724_set_pro_rate()
684 if (force || !ice->is_spdif_master(ice)) { in snd_vt1724_set_pro_rate()
687 old_rate = ice->get_rate(ice); in snd_vt1724_set_pro_rate()
689 ice->set_rate(ice, rate); in snd_vt1724_set_pro_rate()
690 else if (rate == ice->cur_rate) { in snd_vt1724_set_pro_rate()
691 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
696 ice->cur_rate = rate; in snd_vt1724_set_pro_rate()
699 mclk_change = ice->set_mclk(ice, rate); in snd_vt1724_set_pro_rate()
701 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
703 if (mclk_change && ice->gpio.i2s_mclk_changed) in snd_vt1724_set_pro_rate()
704 ice->gpio.i2s_mclk_changed(ice); in snd_vt1724_set_pro_rate()
705 if (ice->gpio.set_pro_rate) in snd_vt1724_set_pro_rate()
706 ice->gpio.set_pro_rate(ice, rate); in snd_vt1724_set_pro_rate()
709 for (i = 0; i < ice->akm_codecs; i++) { in snd_vt1724_set_pro_rate()
710 if (ice->akm[i].ops.set_rate_val) in snd_vt1724_set_pro_rate()
711 ice->akm[i].ops.set_rate_val(&ice->akm[i], rate); in snd_vt1724_set_pro_rate()
713 if (ice->spdif.ops.setup_rate) in snd_vt1724_set_pro_rate()
714 ice->spdif.ops.setup_rate(ice, rate); in snd_vt1724_set_pro_rate()
722 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_hw_params() local
726 mutex_lock(&ice->open_mutex); in snd_vt1724_pcm_hw_params()
728 if (substream == ice->playback_pro_substream) { in snd_vt1724_pcm_hw_params()
732 if (ice->pcm_reserved[i] && in snd_vt1724_pcm_hw_params()
733 ice->pcm_reserved[i] != substream) { in snd_vt1724_pcm_hw_params()
734 mutex_unlock(&ice->open_mutex); in snd_vt1724_pcm_hw_params()
737 ice->pcm_reserved[i] = substream; in snd_vt1724_pcm_hw_params()
740 if (ice->pcm_reserved[i] == substream) in snd_vt1724_pcm_hw_params()
741 ice->pcm_reserved[i] = NULL; in snd_vt1724_pcm_hw_params()
746 if (ice->playback_con_substream_ds[i] == substream) { in snd_vt1724_pcm_hw_params()
747 if (ice->pcm_reserved[i] && in snd_vt1724_pcm_hw_params()
748 ice->pcm_reserved[i] != substream) { in snd_vt1724_pcm_hw_params()
749 mutex_unlock(&ice->open_mutex); in snd_vt1724_pcm_hw_params()
752 ice->pcm_reserved[i] = substream; in snd_vt1724_pcm_hw_params()
757 mutex_unlock(&ice->open_mutex); in snd_vt1724_pcm_hw_params()
759 err = snd_vt1724_set_pro_rate(ice, params_rate(hw_params), 0); in snd_vt1724_pcm_hw_params()
768 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_hw_free() local
771 mutex_lock(&ice->open_mutex); in snd_vt1724_pcm_hw_free()
774 if (ice->pcm_reserved[i] == substream) in snd_vt1724_pcm_hw_free()
775 ice->pcm_reserved[i] = NULL; in snd_vt1724_pcm_hw_free()
776 mutex_unlock(&ice->open_mutex); in snd_vt1724_pcm_hw_free()
782 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_pro_prepare() local
786 spin_lock_irq(&ice->reg_lock); in snd_vt1724_playback_pro_prepare()
788 outb(val, ICEMT1724(ice, BURST)); in snd_vt1724_playback_pro_prepare()
790 outl(substream->runtime->dma_addr, ICEMT1724(ice, PLAYBACK_ADDR)); in snd_vt1724_playback_pro_prepare()
794 outw(size, ICEMT1724(ice, PLAYBACK_SIZE)); in snd_vt1724_playback_pro_prepare()
795 outb(size >> 16, ICEMT1724(ice, PLAYBACK_SIZE) + 2); in snd_vt1724_playback_pro_prepare()
798 outw(size, ICEMT1724(ice, PLAYBACK_COUNT)); in snd_vt1724_playback_pro_prepare()
799 outb(size >> 16, ICEMT1724(ice, PLAYBACK_COUNT) + 2); in snd_vt1724_playback_pro_prepare()
801 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_playback_pro_prepare()
816 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_pro_pointer() local
819 if (!(inl(ICEMT1724(ice, DMA_CONTROL)) & VT1724_PDMA0_START)) in snd_vt1724_playback_pro_pointer()
822 ptr = inl(ICEMT1724(ice, PLAYBACK_ADDR)); in snd_vt1724_playback_pro_pointer()
824 dev_dbg(ice->card->dev, "invalid negative ptr\n"); in snd_vt1724_playback_pro_pointer()
830 dev_dbg(ice->card->dev, "invalid ptr %d (size=%d)\n", in snd_vt1724_playback_pro_pointer()
835 ptr = inl(ICEMT1724(ice, PLAYBACK_SIZE)) & 0xffffff; in snd_vt1724_playback_pro_pointer()
843 dev_dbg(ice->card->dev, "invalid ptr %d (size=%d)\n", in snd_vt1724_playback_pro_pointer()
853 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_prepare() local
856 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pcm_prepare()
857 outl(substream->runtime->dma_addr, ice->profi_port + reg->addr); in snd_vt1724_pcm_prepare()
859 ice->profi_port + reg->size); in snd_vt1724_pcm_prepare()
861 ice->profi_port + reg->count); in snd_vt1724_pcm_prepare()
862 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pcm_prepare()
868 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_pointer() local
872 if (!(inl(ICEMT1724(ice, DMA_CONTROL)) & reg->start)) in snd_vt1724_pcm_pointer()
875 ptr = inl(ice->profi_port + reg->addr); in snd_vt1724_pcm_pointer()
879 ptr = inw(ice->profi_port + reg->size); in snd_vt1724_pcm_pointer()
887 dev_dbg(ice->card->dev, "invalid ptr %d (size=%d)\n", in snd_vt1724_pcm_pointer()
988 static void set_std_hw_rates(struct snd_ice1712 *ice) in set_std_hw_rates() argument
990 if (ice->eeprom.data[ICE_EEP2_ACLINK] & VT1724_CFG_PRO_I2S) { in set_std_hw_rates()
993 if ((ice->eeprom.data[ICE_EEP2_I2S] & 0x08) && !ice->vt1720) in set_std_hw_rates()
994 ice->hw_rates = &hw_constraints_rates_192; in set_std_hw_rates()
996 ice->hw_rates = &hw_constraints_rates_96; in set_std_hw_rates()
999 ice->hw_rates = &hw_constraints_rates_48; in set_std_hw_rates()
1003 static int set_rate_constraints(struct snd_ice1712 *ice, in set_rate_constraints() argument
1008 runtime->hw.rate_min = ice->hw_rates->list[0]; in set_rate_constraints()
1009 runtime->hw.rate_max = ice->hw_rates->list[ice->hw_rates->count - 1]; in set_rate_constraints()
1013 ice->hw_rates); in set_rate_constraints()
1021 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in constrain_rate_if_locked() local
1024 if (is_pro_rate_locked(ice)) { in constrain_rate_if_locked()
1025 rate = ice->get_rate(ice); in constrain_rate_if_locked()
1043 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_pro_open() local
1047 ice->playback_pro_substream = substream; in snd_vt1724_playback_pro_open()
1051 set_rate_constraints(ice, substream); in snd_vt1724_playback_pro_open()
1052 mutex_lock(&ice->open_mutex); in snd_vt1724_playback_pro_open()
1054 num_indeps = ice->num_total_dacs / 2 - 1; in snd_vt1724_playback_pro_open()
1056 if (ice->pcm_reserved[chs]) in snd_vt1724_playback_pro_open()
1063 mutex_unlock(&ice->open_mutex); in snd_vt1724_playback_pro_open()
1069 if (ice->pro_open) in snd_vt1724_playback_pro_open()
1070 ice->pro_open(ice, substream); in snd_vt1724_playback_pro_open()
1076 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_capture_pro_open() local
1080 ice->capture_pro_substream = substream; in snd_vt1724_capture_pro_open()
1084 set_rate_constraints(ice, substream); in snd_vt1724_capture_pro_open()
1090 if (ice->pro_open) in snd_vt1724_capture_pro_open()
1091 ice->pro_open(ice, substream); in snd_vt1724_capture_pro_open()
1097 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_pro_close() local
1100 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_playback_pro_close()
1101 ice->playback_pro_substream = NULL; in snd_vt1724_playback_pro_close()
1108 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_capture_pro_close() local
1111 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_capture_pro_close()
1112 ice->capture_pro_substream = NULL; in snd_vt1724_capture_pro_close()
1138 static int snd_vt1724_pcm_profi(struct snd_ice1712 *ice, int device) in snd_vt1724_pcm_profi() argument
1143 if ((ice->eeprom.data[ICE_EEP2_SYSCONF] & VT1724_CFG_ADC_MASK) == in snd_vt1724_pcm_profi()
1148 err = snd_pcm_new(ice->card, "ICE1724", device, 1, capt, &pcm); in snd_vt1724_pcm_profi()
1157 pcm->private_data = ice; in snd_vt1724_pcm_profi()
1162 snd_dma_pci_data(ice->pci), in snd_vt1724_pcm_profi()
1165 ice->pcm_pro = pcm; in snd_vt1724_pcm_profi()
1176 static void update_spdif_bits(struct snd_ice1712 *ice, unsigned int val) in update_spdif_bits() argument
1180 cbit = inb(ICEREG1724(ice, SPDIF_CFG)); in update_spdif_bits()
1183 outb(disabled, ICEREG1724(ice, SPDIF_CFG)); in update_spdif_bits()
1184 outw(val, ICEMT1724(ice, SPDIF_CTRL)); in update_spdif_bits()
1186 outb(cbit, ICEREG1724(ice, SPDIF_CFG)); in update_spdif_bits()
1187 outw(val, ICEMT1724(ice, SPDIF_CTRL)); in update_spdif_bits()
1191 static void update_spdif_rate(struct snd_ice1712 *ice, unsigned int rate) in update_spdif_rate() argument
1196 spin_lock_irqsave(&ice->reg_lock, flags); in update_spdif_rate()
1197 nval = val = inw(ICEMT1724(ice, SPDIF_CTRL)); in update_spdif_rate()
1209 update_spdif_bits(ice, nval); in update_spdif_rate()
1210 spin_unlock_irqrestore(&ice->reg_lock, flags); in update_spdif_rate()
1215 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_spdif_prepare() local
1216 if (!ice->force_pdma4) in snd_vt1724_playback_spdif_prepare()
1217 update_spdif_rate(ice, substream->runtime->rate); in snd_vt1724_playback_spdif_prepare()
1223 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_spdif_open() local
1227 ice->playback_con_substream = substream; in snd_vt1724_playback_spdif_open()
1228 if (ice->force_pdma4) { in snd_vt1724_playback_spdif_open()
1230 set_rate_constraints(ice, substream); in snd_vt1724_playback_spdif_open()
1240 if (ice->spdif.ops.open) in snd_vt1724_playback_spdif_open()
1241 ice->spdif.ops.open(ice, substream); in snd_vt1724_playback_spdif_open()
1247 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_spdif_close() local
1250 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_playback_spdif_close()
1251 ice->playback_con_substream = NULL; in snd_vt1724_playback_spdif_close()
1252 if (ice->spdif.ops.close) in snd_vt1724_playback_spdif_close()
1253 ice->spdif.ops.close(ice, substream); in snd_vt1724_playback_spdif_close()
1260 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_capture_spdif_open() local
1264 ice->capture_con_substream = substream; in snd_vt1724_capture_spdif_open()
1265 if (ice->force_rdma1) { in snd_vt1724_capture_spdif_open()
1267 set_rate_constraints(ice, substream); in snd_vt1724_capture_spdif_open()
1277 if (ice->spdif.ops.open) in snd_vt1724_capture_spdif_open()
1278 ice->spdif.ops.open(ice, substream); in snd_vt1724_capture_spdif_open()
1284 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_capture_spdif_close() local
1287 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_capture_spdif_close()
1288 ice->capture_con_substream = NULL; in snd_vt1724_capture_spdif_close()
1289 if (ice->spdif.ops.close) in snd_vt1724_capture_spdif_close()
1290 ice->spdif.ops.close(ice, substream); in snd_vt1724_capture_spdif_close()
1318 static int snd_vt1724_pcm_spdif(struct snd_ice1712 *ice, int device) in snd_vt1724_pcm_spdif() argument
1325 if (ice->force_pdma4 || in snd_vt1724_pcm_spdif()
1326 (ice->eeprom.data[ICE_EEP2_SPDIF] & VT1724_CFG_SPDIF_OUT_INT)) { in snd_vt1724_pcm_spdif()
1328 ice->has_spdif = 1; in snd_vt1724_pcm_spdif()
1331 if (ice->force_rdma1 || in snd_vt1724_pcm_spdif()
1332 (ice->eeprom.data[ICE_EEP2_SPDIF] & VT1724_CFG_SPDIF_IN)) { in snd_vt1724_pcm_spdif()
1334 ice->has_spdif = 1; in snd_vt1724_pcm_spdif()
1340 if (ice->force_pdma4 || ice->force_rdma1) in snd_vt1724_pcm_spdif()
1344 err = snd_pcm_new(ice->card, name, device, play, capt, &pcm); in snd_vt1724_pcm_spdif()
1355 pcm->private_data = ice; in snd_vt1724_pcm_spdif()
1360 snd_dma_pci_data(ice->pci), in snd_vt1724_pcm_spdif()
1363 ice->pcm = pcm; in snd_vt1724_pcm_spdif()
1396 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_indep_prepare() local
1399 spin_lock_irq(&ice->reg_lock); in snd_vt1724_playback_indep_prepare()
1401 if (inb(ICEMT1724(ice, BURST)) < val) in snd_vt1724_playback_indep_prepare()
1402 outb(val, ICEMT1724(ice, BURST)); in snd_vt1724_playback_indep_prepare()
1403 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_playback_indep_prepare()
1409 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_indep_open() local
1412 mutex_lock(&ice->open_mutex); in snd_vt1724_playback_indep_open()
1414 if (ice->pcm_reserved[substream->number]) { in snd_vt1724_playback_indep_open()
1415 mutex_unlock(&ice->open_mutex); in snd_vt1724_playback_indep_open()
1418 mutex_unlock(&ice->open_mutex); in snd_vt1724_playback_indep_open()
1420 ice->playback_con_substream_ds[substream->number] = substream; in snd_vt1724_playback_indep_open()
1424 set_rate_constraints(ice, substream); in snd_vt1724_playback_indep_open()
1430 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_indep_close() local
1433 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_playback_indep_close()
1434 ice->playback_con_substream_ds[substream->number] = NULL; in snd_vt1724_playback_indep_close()
1435 ice->pcm_reserved[substream->number] = NULL; in snd_vt1724_playback_indep_close()
1452 static int snd_vt1724_pcm_indep(struct snd_ice1712 *ice, int device) in snd_vt1724_pcm_indep() argument
1458 play = ice->num_total_dacs / 2 - 1; in snd_vt1724_pcm_indep()
1462 err = snd_pcm_new(ice->card, "ICE1724 Surrounds", device, play, 0, &pcm); in snd_vt1724_pcm_indep()
1469 pcm->private_data = ice; in snd_vt1724_pcm_indep()
1474 snd_dma_pci_data(ice->pci), in snd_vt1724_pcm_indep()
1477 ice->pcm_ds = pcm; in snd_vt1724_pcm_indep()
1487 static int snd_vt1724_ac97_mixer(struct snd_ice1712 *ice) in snd_vt1724_ac97_mixer() argument
1491 if (!(ice->eeprom.data[ICE_EEP2_ACLINK] & VT1724_CFG_PRO_I2S)) { in snd_vt1724_ac97_mixer()
1500 outb(inb(ICEMT1724(ice, AC97_CMD)) | 0x80, ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_mixer()
1502 outb(inb(ICEMT1724(ice, AC97_CMD)) & ~0x80, ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_mixer()
1504 err = snd_ac97_bus(ice->card, 0, &ops, NULL, &pbus); in snd_vt1724_ac97_mixer()
1508 ac97.private_data = ice; in snd_vt1724_ac97_mixer()
1509 err = snd_ac97_mixer(pbus, &ac97, &ice->ac97); in snd_vt1724_ac97_mixer()
1511 dev_warn(ice->card->dev, in snd_vt1724_ac97_mixer()
1517 strcat(ice->card->mixername, "ICE1724 - multitrack"); in snd_vt1724_ac97_mixer()
1525 static inline unsigned int eeprom_triple(struct snd_ice1712 *ice, int idx) in eeprom_triple() argument
1527 return (unsigned int)ice->eeprom.data[idx] | \ in eeprom_triple()
1528 ((unsigned int)ice->eeprom.data[idx + 1] << 8) | \ in eeprom_triple()
1529 ((unsigned int)ice->eeprom.data[idx + 2] << 16); in eeprom_triple()
1535 struct snd_ice1712 *ice = entry->private_data; in snd_vt1724_proc_read() local
1538 snd_iprintf(buffer, "%s\n\n", ice->card->longname); in snd_vt1724_proc_read()
1541 snd_iprintf(buffer, " Subvendor : 0x%x\n", ice->eeprom.subvendor); in snd_vt1724_proc_read()
1542 snd_iprintf(buffer, " Size : %i bytes\n", ice->eeprom.size); in snd_vt1724_proc_read()
1543 snd_iprintf(buffer, " Version : %i\n", ice->eeprom.version); in snd_vt1724_proc_read()
1545 ice->eeprom.data[ICE_EEP2_SYSCONF]); in snd_vt1724_proc_read()
1547 ice->eeprom.data[ICE_EEP2_ACLINK]); in snd_vt1724_proc_read()
1549 ice->eeprom.data[ICE_EEP2_I2S]); in snd_vt1724_proc_read()
1551 ice->eeprom.data[ICE_EEP2_SPDIF]); in snd_vt1724_proc_read()
1553 ice->eeprom.gpiodir); in snd_vt1724_proc_read()
1555 ice->eeprom.gpiomask); in snd_vt1724_proc_read()
1557 ice->eeprom.gpiostate); in snd_vt1724_proc_read()
1558 for (idx = 0x12; idx < ice->eeprom.size; idx++) in snd_vt1724_proc_read()
1560 idx, ice->eeprom.data[idx]); in snd_vt1724_proc_read()
1565 (unsigned)inl(ICEMT1724(ice, ROUTE_PLAYBACK))); in snd_vt1724_proc_read()
1568 idx, inb(ice->port+idx)); in snd_vt1724_proc_read()
1571 idx, inb(ice->profi_port+idx)); in snd_vt1724_proc_read()
1574 static void snd_vt1724_proc_init(struct snd_ice1712 *ice) in snd_vt1724_proc_init() argument
1578 if (!snd_card_proc_new(ice->card, "ice1724", &entry)) in snd_vt1724_proc_init()
1579 snd_info_set_text_ops(entry, ice, snd_vt1724_proc_read); in snd_vt1724_proc_init()
1597 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_eeprom_get() local
1599 memcpy(ucontrol->value.bytes.data, &ice->eeprom, sizeof(ice->eeprom)); in snd_vt1724_eeprom_get()
1694 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_spdif_default_get() local
1696 val = inw(ICEMT1724(ice, SPDIF_CTRL)); in snd_vt1724_spdif_default_get()
1704 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_spdif_default_put() local
1708 spin_lock_irq(&ice->reg_lock); in snd_vt1724_spdif_default_put()
1709 old = inw(ICEMT1724(ice, SPDIF_CTRL)); in snd_vt1724_spdif_default_put()
1711 update_spdif_bits(ice, val); in snd_vt1724_spdif_default_put()
1712 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_spdif_default_put()
1771 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_spdif_sw_get() local
1772 ucontrol->value.integer.value[0] = inb(ICEREG1724(ice, SPDIF_CFG)) & in snd_vt1724_spdif_sw_get()
1780 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_spdif_sw_put() local
1783 spin_lock_irq(&ice->reg_lock); in snd_vt1724_spdif_sw_put()
1784 old = val = inb(ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_spdif_sw_put()
1789 outb(val, ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_spdif_sw_put()
1790 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_spdif_sw_put()
1816 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
1820 snd_ice1712_save_gpio_status(ice);
1822 (snd_ice1712_gpio_read(ice) & (1 << shift) ? 1 : 0) ^ invert;
1823 snd_ice1712_restore_gpio_status(ice);
1830 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
1838 snd_ice1712_save_gpio_status(ice);
1839 val = snd_ice1712_gpio_read(ice);
1842 snd_ice1712_gpio_write(ice, nval);
1843 snd_ice1712_restore_gpio_status(ice);
1854 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_internal_clock_info() local
1855 int hw_rates_count = ice->hw_rates->count; in snd_vt1724_pro_internal_clock_info()
1862 if (ice->force_rdma1 || in snd_vt1724_pro_internal_clock_info()
1863 (ice->eeprom.data[ICE_EEP2_SPDIF] & VT1724_CFG_SPDIF_IN)) in snd_vt1724_pro_internal_clock_info()
1864 uinfo->value.enumerated.items += ice->ext_clock_count; in snd_vt1724_pro_internal_clock_info()
1871 ice->ext_clock_names[ in snd_vt1724_pro_internal_clock_info()
1876 ice->hw_rates->list[uinfo->value.enumerated.item]); in snd_vt1724_pro_internal_clock_info()
1883 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_internal_clock_get() local
1886 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_get()
1887 if (ice->is_spdif_master(ice)) { in snd_vt1724_pro_internal_clock_get()
1888 ucontrol->value.enumerated.item[0] = ice->hw_rates->count + in snd_vt1724_pro_internal_clock_get()
1889 ice->get_spdif_master_type(ice); in snd_vt1724_pro_internal_clock_get()
1891 rate = ice->get_rate(ice); in snd_vt1724_pro_internal_clock_get()
1893 for (i = 0; i < ice->hw_rates->count; i++) { in snd_vt1724_pro_internal_clock_get()
1894 if (ice->hw_rates->list[i] == rate) { in snd_vt1724_pro_internal_clock_get()
1900 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_get()
1904 static int stdclock_get_spdif_master_type(struct snd_ice1712 *ice) in stdclock_get_spdif_master_type() argument
1911 static int stdclock_set_spdif_clock(struct snd_ice1712 *ice, int type) in stdclock_set_spdif_clock() argument
1915 oval = inb(ICEMT1724(ice, RATE)); in stdclock_set_spdif_clock()
1916 outb(oval | VT1724_SPDIF_MASTER, ICEMT1724(ice, RATE)); in stdclock_set_spdif_clock()
1918 i2s_oval = inb(ICEMT1724(ice, I2S_FORMAT)); in stdclock_set_spdif_clock()
1919 outb(i2s_oval & ~VT1724_MT_I2S_MCLK_128X, ICEMT1724(ice, I2S_FORMAT)); in stdclock_set_spdif_clock()
1927 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_internal_clock_put() local
1930 unsigned int first_ext_clock = ice->hw_rates->count; in snd_vt1724_pro_internal_clock_put()
1932 if (item > first_ext_clock + ice->ext_clock_count - 1) in snd_vt1724_pro_internal_clock_put()
1936 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_put()
1937 if (ice->is_spdif_master(ice)) in snd_vt1724_pro_internal_clock_put()
1940 old_rate = ice->get_rate(ice); in snd_vt1724_pro_internal_clock_put()
1943 ice->set_spdif_clock(ice, item - first_ext_clock); in snd_vt1724_pro_internal_clock_put()
1947 new_rate = ice->hw_rates->list[item]; in snd_vt1724_pro_internal_clock_put()
1948 ice->pro_rate_default = new_rate; in snd_vt1724_pro_internal_clock_put()
1949 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_put()
1950 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 1); in snd_vt1724_pro_internal_clock_put()
1951 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_put()
1953 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_put()
1959 if (ice->gpio.set_pro_rate) in snd_vt1724_pro_internal_clock_put()
1960 ice->gpio.set_pro_rate(ice, 0); in snd_vt1724_pro_internal_clock_put()
1961 for (i = 0; i < ice->akm_codecs; i++) { in snd_vt1724_pro_internal_clock_put()
1962 if (ice->akm[i].ops.set_rate_val) in snd_vt1724_pro_internal_clock_put()
1963 ice->akm[i].ops.set_rate_val(&ice->akm[i], 0); in snd_vt1724_pro_internal_clock_put()
1989 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_rate_locking_put() local
1993 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_rate_locking_put()
1996 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_rate_locking_put()
2020 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_rate_reset_put() local
2024 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_rate_reset_put()
2027 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_rate_reset_put()
2065 int snd_ice1724_get_route_val(struct snd_ice1712 *ice, int shift) in snd_ice1724_get_route_val() argument
2073 val = inl(ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_ice1724_get_route_val()
2084 int snd_ice1724_put_route_val(struct snd_ice1712 *ice, unsigned int val, in snd_ice1724_put_route_val() argument
2098 val = old_val = inl(ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_ice1724_put_route_val()
2103 outl(val, ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_ice1724_put_route_val()
2110 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_route_analog_get() local
2113 snd_ice1724_get_route_val(ice, analog_route_shift(idx)); in snd_vt1724_pro_route_analog_get()
2120 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_route_analog_put() local
2122 return snd_ice1724_put_route_val(ice, in snd_vt1724_pro_route_analog_put()
2130 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_route_spdif_get() local
2133 snd_ice1724_get_route_val(ice, digital_route_shift(idx)); in snd_vt1724_pro_route_spdif_get()
2140 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_route_spdif_put() local
2142 return snd_ice1724_put_route_val(ice, in snd_vt1724_pro_route_spdif_put()
2179 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_peak_get() local
2182 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_peak_get()
2184 outb(idx, ICEMT1724(ice, MONITOR_PEAKINDEX)); in snd_vt1724_pro_peak_get()
2186 inb(ICEMT1724(ice, MONITOR_PEAKDATA)); in snd_vt1724_pro_peak_get()
2188 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_peak_get()
2263 static void wait_i2c_busy(struct snd_ice1712 *ice) in wait_i2c_busy() argument
2266 while ((inb(ICEREG1724(ice, I2C_CTRL)) & VT1724_I2C_BUSY) && t--) in wait_i2c_busy()
2269 dev_err(ice->card->dev, "i2c busy timeout\n"); in wait_i2c_busy()
2272 unsigned char snd_vt1724_read_i2c(struct snd_ice1712 *ice, in snd_vt1724_read_i2c() argument
2277 mutex_lock(&ice->i2c_mutex); in snd_vt1724_read_i2c()
2278 wait_i2c_busy(ice); in snd_vt1724_read_i2c()
2279 outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR)); in snd_vt1724_read_i2c()
2280 outb(dev & ~VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR)); in snd_vt1724_read_i2c()
2281 wait_i2c_busy(ice); in snd_vt1724_read_i2c()
2282 val = inb(ICEREG1724(ice, I2C_DATA)); in snd_vt1724_read_i2c()
2283 mutex_unlock(&ice->i2c_mutex); in snd_vt1724_read_i2c()
2290 void snd_vt1724_write_i2c(struct snd_ice1712 *ice, in snd_vt1724_write_i2c() argument
2293 mutex_lock(&ice->i2c_mutex); in snd_vt1724_write_i2c()
2294 wait_i2c_busy(ice); in snd_vt1724_write_i2c()
2298 outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR)); in snd_vt1724_write_i2c()
2299 outb(data, ICEREG1724(ice, I2C_DATA)); in snd_vt1724_write_i2c()
2300 outb(dev | VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR)); in snd_vt1724_write_i2c()
2301 wait_i2c_busy(ice); in snd_vt1724_write_i2c()
2302 mutex_unlock(&ice->i2c_mutex); in snd_vt1724_write_i2c()
2305 static int snd_vt1724_read_eeprom(struct snd_ice1712 *ice, in snd_vt1724_read_eeprom() argument
2313 ice->eeprom.subvendor = 0; in snd_vt1724_read_eeprom()
2314 if ((inb(ICEREG1724(ice, I2C_CTRL)) & VT1724_I2C_EEPROM) != 0) in snd_vt1724_read_eeprom()
2315 ice->eeprom.subvendor = in snd_vt1724_read_eeprom()
2316 (snd_vt1724_read_i2c(ice, dev, 0x00) << 0) | in snd_vt1724_read_eeprom()
2317 (snd_vt1724_read_i2c(ice, dev, 0x01) << 8) | in snd_vt1724_read_eeprom()
2318 (snd_vt1724_read_i2c(ice, dev, 0x02) << 16) | in snd_vt1724_read_eeprom()
2319 (snd_vt1724_read_i2c(ice, dev, 0x03) << 24); in snd_vt1724_read_eeprom()
2320 if (ice->eeprom.subvendor == 0 || in snd_vt1724_read_eeprom()
2321 ice->eeprom.subvendor == (unsigned int)-1) { in snd_vt1724_read_eeprom()
2326 pci_read_config_word(ice->pci, PCI_SUBSYSTEM_VENDOR_ID, in snd_vt1724_read_eeprom()
2328 pci_read_config_word(ice->pci, PCI_SUBSYSTEM_ID, &device); in snd_vt1724_read_eeprom()
2329 ice->eeprom.subvendor = in snd_vt1724_read_eeprom()
2331 if (ice->eeprom.subvendor == 0 || in snd_vt1724_read_eeprom()
2332 ice->eeprom.subvendor == (unsigned int)-1) { in snd_vt1724_read_eeprom()
2333 dev_err(ice->card->dev, in snd_vt1724_read_eeprom()
2343 dev_info(ice->card->dev, in snd_vt1724_read_eeprom()
2346 ice->eeprom.subvendor = c->subvendor; in snd_vt1724_read_eeprom()
2347 } else if (c->subvendor != ice->eeprom.subvendor) in snd_vt1724_read_eeprom()
2349 ice->card_info = c; in snd_vt1724_read_eeprom()
2353 dev_dbg(ice->card->dev, "using the defined eeprom..\n"); in snd_vt1724_read_eeprom()
2354 ice->eeprom.version = 2; in snd_vt1724_read_eeprom()
2355 ice->eeprom.size = c->eeprom_size + 6; in snd_vt1724_read_eeprom()
2356 memcpy(ice->eeprom.data, c->eeprom_data, c->eeprom_size); in snd_vt1724_read_eeprom()
2360 dev_warn(ice->card->dev, "No matching model found for ID 0x%x\n", in snd_vt1724_read_eeprom()
2361 ice->eeprom.subvendor); in snd_vt1724_read_eeprom()
2364 ice->pm_suspend_enabled = 1; in snd_vt1724_read_eeprom()
2368 ice->eeprom.size = snd_vt1724_read_i2c(ice, dev, 0x04); in snd_vt1724_read_eeprom()
2369 if (ice->eeprom.size < 6) in snd_vt1724_read_eeprom()
2370 ice->eeprom.size = 32; in snd_vt1724_read_eeprom()
2371 else if (ice->eeprom.size > 32) { in snd_vt1724_read_eeprom()
2372 dev_err(ice->card->dev, "Invalid EEPROM (size = %i)\n", in snd_vt1724_read_eeprom()
2373 ice->eeprom.size); in snd_vt1724_read_eeprom()
2376 ice->eeprom.version = snd_vt1724_read_i2c(ice, dev, 0x05); in snd_vt1724_read_eeprom()
2377 if (ice->eeprom.version != 1 && ice->eeprom.version != 2) in snd_vt1724_read_eeprom()
2378 dev_warn(ice->card->dev, "Invalid EEPROM version %i\n", in snd_vt1724_read_eeprom()
2379 ice->eeprom.version); in snd_vt1724_read_eeprom()
2380 size = ice->eeprom.size - 6; in snd_vt1724_read_eeprom()
2382 ice->eeprom.data[i] = snd_vt1724_read_i2c(ice, dev, i + 6); in snd_vt1724_read_eeprom()
2385 ice->eeprom.gpiomask = eeprom_triple(ice, ICE_EEP2_GPIO_MASK); in snd_vt1724_read_eeprom()
2386 ice->eeprom.gpiostate = eeprom_triple(ice, ICE_EEP2_GPIO_STATE); in snd_vt1724_read_eeprom()
2387 ice->eeprom.gpiodir = eeprom_triple(ice, ICE_EEP2_GPIO_DIR); in snd_vt1724_read_eeprom()
2394 static void snd_vt1724_chip_reset(struct snd_ice1712 *ice) in snd_vt1724_chip_reset() argument
2396 outb(VT1724_RESET , ICEREG1724(ice, CONTROL)); in snd_vt1724_chip_reset()
2397 inb(ICEREG1724(ice, CONTROL)); /* pci posting flush */ in snd_vt1724_chip_reset()
2399 outb(0, ICEREG1724(ice, CONTROL)); in snd_vt1724_chip_reset()
2400 inb(ICEREG1724(ice, CONTROL)); /* pci posting flush */ in snd_vt1724_chip_reset()
2404 static int snd_vt1724_chip_init(struct snd_ice1712 *ice) in snd_vt1724_chip_init() argument
2406 outb(ice->eeprom.data[ICE_EEP2_SYSCONF], ICEREG1724(ice, SYS_CFG)); in snd_vt1724_chip_init()
2407 outb(ice->eeprom.data[ICE_EEP2_ACLINK], ICEREG1724(ice, AC97_CFG)); in snd_vt1724_chip_init()
2408 outb(ice->eeprom.data[ICE_EEP2_I2S], ICEREG1724(ice, I2S_FEATURES)); in snd_vt1724_chip_init()
2409 outb(ice->eeprom.data[ICE_EEP2_SPDIF], ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_chip_init()
2411 ice->gpio.write_mask = ice->eeprom.gpiomask; in snd_vt1724_chip_init()
2412 ice->gpio.direction = ice->eeprom.gpiodir; in snd_vt1724_chip_init()
2413 snd_vt1724_set_gpio_mask(ice, ice->eeprom.gpiomask); in snd_vt1724_chip_init()
2414 snd_vt1724_set_gpio_dir(ice, ice->eeprom.gpiodir); in snd_vt1724_chip_init()
2415 snd_vt1724_set_gpio_data(ice, ice->eeprom.gpiostate); in snd_vt1724_chip_init()
2417 outb(0, ICEREG1724(ice, POWERDOWN)); in snd_vt1724_chip_init()
2420 outb(VT1724_IRQ_MPU_RX | VT1724_IRQ_MPU_TX , ICEREG1724(ice, IRQMASK)); in snd_vt1724_chip_init()
2425 outb(VT1724_MULTI_FIFO_ERR, ICEMT1724(ice, DMA_INT_MASK)); in snd_vt1724_chip_init()
2430 static int snd_vt1724_spdif_build_controls(struct snd_ice1712 *ice) in snd_vt1724_spdif_build_controls() argument
2435 if (snd_BUG_ON(!ice->pcm)) in snd_vt1724_spdif_build_controls()
2438 if (!ice->own_routing) { in snd_vt1724_spdif_build_controls()
2439 err = snd_ctl_add(ice->card, in snd_vt1724_spdif_build_controls()
2440 snd_ctl_new1(&snd_vt1724_mixer_pro_spdif_route, ice)); in snd_vt1724_spdif_build_controls()
2445 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_spdif_switch, ice)); in snd_vt1724_spdif_build_controls()
2449 err = snd_ctl_add(ice->card, kctl = snd_ctl_new1(&snd_vt1724_spdif_default, ice)); in snd_vt1724_spdif_build_controls()
2452 kctl->id.device = ice->pcm->device; in snd_vt1724_spdif_build_controls()
2453 err = snd_ctl_add(ice->card, kctl = snd_ctl_new1(&snd_vt1724_spdif_maskc, ice)); in snd_vt1724_spdif_build_controls()
2456 kctl->id.device = ice->pcm->device; in snd_vt1724_spdif_build_controls()
2457 err = snd_ctl_add(ice->card, kctl = snd_ctl_new1(&snd_vt1724_spdif_maskp, ice)); in snd_vt1724_spdif_build_controls()
2460 kctl->id.device = ice->pcm->device; in snd_vt1724_spdif_build_controls()
2462 err = snd_ctl_add(ice->card, kctl = snd_ctl_new1(&snd_vt1724_spdif_stream, ice)); in snd_vt1724_spdif_build_controls()
2465 kctl->id.device = ice->pcm->device; in snd_vt1724_spdif_build_controls()
2466 ice->spdif.stream_ctl = kctl; in snd_vt1724_spdif_build_controls()
2472 static int snd_vt1724_build_controls(struct snd_ice1712 *ice) in snd_vt1724_build_controls() argument
2476 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_eeprom, ice)); in snd_vt1724_build_controls()
2479 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_pro_internal_clock, ice)); in snd_vt1724_build_controls()
2483 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_pro_rate_locking, ice)); in snd_vt1724_build_controls()
2486 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_pro_rate_reset, ice)); in snd_vt1724_build_controls()
2490 if (!ice->own_routing && ice->num_total_dacs > 0) { in snd_vt1724_build_controls()
2492 tmp.count = ice->num_total_dacs; in snd_vt1724_build_controls()
2493 if (ice->vt1720 && tmp.count > 2) in snd_vt1724_build_controls()
2495 err = snd_ctl_add(ice->card, snd_ctl_new1(&tmp, ice)); in snd_vt1724_build_controls()
2500 return snd_ctl_add(ice->card, in snd_vt1724_build_controls()
2501 snd_ctl_new1(&snd_vt1724_mixer_pro_peak, ice)); in snd_vt1724_build_controls()
2504 static int snd_vt1724_free(struct snd_ice1712 *ice) in snd_vt1724_free() argument
2506 if (!ice->port) in snd_vt1724_free()
2509 outb(0xff, ICEMT1724(ice, DMA_INT_MASK)); in snd_vt1724_free()
2510 outb(0xff, ICEREG1724(ice, IRQMASK)); in snd_vt1724_free()
2513 if (ice->irq >= 0) in snd_vt1724_free()
2514 free_irq(ice->irq, ice); in snd_vt1724_free()
2515 pci_release_regions(ice->pci); in snd_vt1724_free()
2516 snd_ice1712_akm4xxx_free(ice); in snd_vt1724_free()
2517 pci_disable_device(ice->pci); in snd_vt1724_free()
2518 kfree(ice->spec); in snd_vt1724_free()
2519 kfree(ice); in snd_vt1724_free()
2525 struct snd_ice1712 *ice = device->device_data; in snd_vt1724_dev_free() local
2526 return snd_vt1724_free(ice); in snd_vt1724_dev_free()
2534 struct snd_ice1712 *ice; in snd_vt1724_create() local
2547 ice = kzalloc(sizeof(*ice), GFP_KERNEL); in snd_vt1724_create()
2548 if (ice == NULL) { in snd_vt1724_create()
2552 ice->vt1724 = 1; in snd_vt1724_create()
2553 spin_lock_init(&ice->reg_lock); in snd_vt1724_create()
2554 mutex_init(&ice->gpio_mutex); in snd_vt1724_create()
2555 mutex_init(&ice->open_mutex); in snd_vt1724_create()
2556 mutex_init(&ice->i2c_mutex); in snd_vt1724_create()
2557 ice->gpio.set_mask = snd_vt1724_set_gpio_mask; in snd_vt1724_create()
2558 ice->gpio.get_mask = snd_vt1724_get_gpio_mask; in snd_vt1724_create()
2559 ice->gpio.set_dir = snd_vt1724_set_gpio_dir; in snd_vt1724_create()
2560 ice->gpio.get_dir = snd_vt1724_get_gpio_dir; in snd_vt1724_create()
2561 ice->gpio.set_data = snd_vt1724_set_gpio_data; in snd_vt1724_create()
2562 ice->gpio.get_data = snd_vt1724_get_gpio_data; in snd_vt1724_create()
2563 ice->card = card; in snd_vt1724_create()
2564 ice->pci = pci; in snd_vt1724_create()
2565 ice->irq = -1; in snd_vt1724_create()
2567 snd_vt1724_proc_init(ice); in snd_vt1724_create()
2570 card->private_data = ice; in snd_vt1724_create()
2574 kfree(ice); in snd_vt1724_create()
2578 ice->port = pci_resource_start(pci, 0); in snd_vt1724_create()
2579 ice->profi_port = pci_resource_start(pci, 1); in snd_vt1724_create()
2582 IRQF_SHARED, KBUILD_MODNAME, ice)) { in snd_vt1724_create()
2584 snd_vt1724_free(ice); in snd_vt1724_create()
2588 ice->irq = pci->irq; in snd_vt1724_create()
2590 snd_vt1724_chip_reset(ice); in snd_vt1724_create()
2591 if (snd_vt1724_read_eeprom(ice, modelname) < 0) { in snd_vt1724_create()
2592 snd_vt1724_free(ice); in snd_vt1724_create()
2595 if (snd_vt1724_chip_init(ice) < 0) { in snd_vt1724_create()
2596 snd_vt1724_free(ice); in snd_vt1724_create()
2600 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, ice, &ops); in snd_vt1724_create()
2602 snd_vt1724_free(ice); in snd_vt1724_create()
2606 *r_ice1712 = ice; in snd_vt1724_create()
2622 struct snd_ice1712 *ice; in snd_vt1724_probe() local
2641 err = snd_vt1724_create(card, pci, model[dev], &ice); in snd_vt1724_probe()
2648 ice->ext_clock_count = 0; in snd_vt1724_probe()
2654 (c->subvendor == ice->eeprom.subvendor)) { in snd_vt1724_probe()
2659 err = c->chip_init(ice); in snd_vt1724_probe()
2679 ice->pro_rate_default = PRO_RATE_DEFAULT; in snd_vt1724_probe()
2680 if (!ice->is_spdif_master) in snd_vt1724_probe()
2681 ice->is_spdif_master = stdclock_is_spdif_master; in snd_vt1724_probe()
2682 if (!ice->get_rate) in snd_vt1724_probe()
2683 ice->get_rate = stdclock_get_rate; in snd_vt1724_probe()
2684 if (!ice->set_rate) in snd_vt1724_probe()
2685 ice->set_rate = stdclock_set_rate; in snd_vt1724_probe()
2686 if (!ice->set_mclk) in snd_vt1724_probe()
2687 ice->set_mclk = stdclock_set_mclk; in snd_vt1724_probe()
2688 if (!ice->set_spdif_clock) in snd_vt1724_probe()
2689 ice->set_spdif_clock = stdclock_set_spdif_clock; in snd_vt1724_probe()
2690 if (!ice->get_spdif_master_type) in snd_vt1724_probe()
2691 ice->get_spdif_master_type = stdclock_get_spdif_master_type; in snd_vt1724_probe()
2692 if (!ice->ext_clock_names) in snd_vt1724_probe()
2693 ice->ext_clock_names = ext_clock_names; in snd_vt1724_probe()
2694 if (!ice->ext_clock_count) in snd_vt1724_probe()
2695 ice->ext_clock_count = ARRAY_SIZE(ext_clock_names); in snd_vt1724_probe()
2697 if (!ice->hw_rates) in snd_vt1724_probe()
2698 set_std_hw_rates(ice); in snd_vt1724_probe()
2700 err = snd_vt1724_pcm_profi(ice, pcm_dev++); in snd_vt1724_probe()
2706 err = snd_vt1724_pcm_spdif(ice, pcm_dev++); in snd_vt1724_probe()
2712 err = snd_vt1724_pcm_indep(ice, pcm_dev++); in snd_vt1724_probe()
2718 err = snd_vt1724_ac97_mixer(ice); in snd_vt1724_probe()
2724 err = snd_vt1724_build_controls(ice); in snd_vt1724_probe()
2730 if (ice->pcm && ice->has_spdif) { /* has SPDIF I/O */ in snd_vt1724_probe()
2731 err = snd_vt1724_spdif_build_controls(ice); in snd_vt1724_probe()
2739 err = c->build_controls(ice); in snd_vt1724_probe()
2747 if (ice->eeprom.data[ICE_EEP2_SYSCONF] & VT1724_CFG_MPU401) { in snd_vt1724_probe()
2755 ice->rmidi[0] = rmidi; in snd_vt1724_probe()
2756 rmidi->private_data = ice; in snd_vt1724_probe()
2768 ICEREG1724(ice, MPU_FIFO_WM)); in snd_vt1724_probe()
2769 outb(0x1, ICEREG1724(ice, MPU_FIFO_WM)); in snd_vt1724_probe()
2771 outb(VT1724_MPU_UART, ICEREG1724(ice, MPU_CTRL)); in snd_vt1724_probe()
2776 card->shortname, ice->port, ice->irq); in snd_vt1724_probe()
2791 struct snd_ice1712 *ice = card->private_data; in snd_vt1724_remove() local
2793 if (ice->card_info && ice->card_info->chip_exit) in snd_vt1724_remove()
2794 ice->card_info->chip_exit(ice); in snd_vt1724_remove()
2802 struct snd_ice1712 *ice = card->private_data; in snd_vt1724_suspend() local
2804 if (!ice->pm_suspend_enabled) in snd_vt1724_suspend()
2809 snd_pcm_suspend_all(ice->pcm); in snd_vt1724_suspend()
2810 snd_pcm_suspend_all(ice->pcm_pro); in snd_vt1724_suspend()
2811 snd_pcm_suspend_all(ice->pcm_ds); in snd_vt1724_suspend()
2812 snd_ac97_suspend(ice->ac97); in snd_vt1724_suspend()
2814 spin_lock_irq(&ice->reg_lock); in snd_vt1724_suspend()
2815 ice->pm_saved_is_spdif_master = ice->is_spdif_master(ice); in snd_vt1724_suspend()
2816 ice->pm_saved_spdif_ctrl = inw(ICEMT1724(ice, SPDIF_CTRL)); in snd_vt1724_suspend()
2817 ice->pm_saved_spdif_cfg = inb(ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_suspend()
2818 ice->pm_saved_route = inl(ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_vt1724_suspend()
2819 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_suspend()
2821 if (ice->pm_suspend) in snd_vt1724_suspend()
2822 ice->pm_suspend(ice); in snd_vt1724_suspend()
2829 struct snd_ice1712 *ice = card->private_data; in snd_vt1724_resume() local
2831 if (!ice->pm_suspend_enabled) in snd_vt1724_resume()
2834 snd_vt1724_chip_reset(ice); in snd_vt1724_resume()
2836 if (snd_vt1724_chip_init(ice) < 0) { in snd_vt1724_resume()
2841 if (ice->pm_resume) in snd_vt1724_resume()
2842 ice->pm_resume(ice); in snd_vt1724_resume()
2844 if (ice->pm_saved_is_spdif_master) { in snd_vt1724_resume()
2846 ice->set_spdif_clock(ice, 0); in snd_vt1724_resume()
2850 if (ice->cur_rate) in snd_vt1724_resume()
2851 rate = ice->cur_rate; in snd_vt1724_resume()
2853 rate = ice->pro_rate_default; in snd_vt1724_resume()
2854 snd_vt1724_set_pro_rate(ice, rate, 1); in snd_vt1724_resume()
2857 update_spdif_bits(ice, ice->pm_saved_spdif_ctrl); in snd_vt1724_resume()
2859 outb(ice->pm_saved_spdif_cfg, ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_resume()
2860 outl(ice->pm_saved_route, ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_vt1724_resume()
2862 snd_ac97_resume(ice->ac97); in snd_vt1724_resume()