• Home
  • Raw
  • Download

Lines Matching full:ice

84 	{ PCI_VDEVICE(ICE, PCI_DEVICE_ID_VT1724), 0 },
106 static inline int stdclock_is_spdif_master(struct snd_ice1712 *ice) in stdclock_is_spdif_master() argument
108 return (inb(ICEMT1724(ice, RATE)) & VT1724_SPDIF_MASTER) ? 1 : 0; in stdclock_is_spdif_master()
114 static inline int is_pro_rate_locked(struct snd_ice1712 *ice) in is_pro_rate_locked() argument
116 return (!ice->is_spdif_master(ice)) && PRO_RATE_LOCKED; in is_pro_rate_locked()
123 static unsigned char snd_vt1724_ac97_ready(struct snd_ice1712 *ice) in snd_vt1724_ac97_ready() argument
128 old_cmd = inb(ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_ready()
135 dev_dbg(ice->card->dev, "snd_vt1724_ac97_ready: timeout\n"); in snd_vt1724_ac97_ready()
139 static int snd_vt1724_ac97_wait_bit(struct snd_ice1712 *ice, unsigned char bit) in snd_vt1724_ac97_wait_bit() argument
143 if ((inb(ICEMT1724(ice, AC97_CMD)) & bit) == 0) in snd_vt1724_ac97_wait_bit()
145 dev_dbg(ice->card->dev, "snd_vt1724_ac97_wait_bit: timeout\n"); in snd_vt1724_ac97_wait_bit()
153 struct snd_ice1712 *ice = ac97->private_data; in snd_vt1724_ac97_write() local
156 old_cmd = snd_vt1724_ac97_ready(ice); in snd_vt1724_ac97_write()
159 outb(reg, ICEMT1724(ice, AC97_INDEX)); in snd_vt1724_ac97_write()
160 outw(val, ICEMT1724(ice, AC97_DATA)); in snd_vt1724_ac97_write()
161 outb(old_cmd | VT1724_AC97_WRITE, ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_write()
162 snd_vt1724_ac97_wait_bit(ice, VT1724_AC97_WRITE); in snd_vt1724_ac97_write()
167 struct snd_ice1712 *ice = ac97->private_data; in snd_vt1724_ac97_read() local
170 old_cmd = snd_vt1724_ac97_ready(ice); in snd_vt1724_ac97_read()
173 outb(reg, ICEMT1724(ice, AC97_INDEX)); in snd_vt1724_ac97_read()
174 outb(old_cmd | VT1724_AC97_READ, ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_read()
175 if (snd_vt1724_ac97_wait_bit(ice, VT1724_AC97_READ) < 0) in snd_vt1724_ac97_read()
177 return inw(ICEMT1724(ice, AC97_DATA)); in snd_vt1724_ac97_read()
186 static void snd_vt1724_set_gpio_dir(struct snd_ice1712 *ice, unsigned int data) in snd_vt1724_set_gpio_dir() argument
188 outl(data, ICEREG1724(ice, GPIO_DIRECTION)); in snd_vt1724_set_gpio_dir()
189 inw(ICEREG1724(ice, GPIO_DIRECTION)); /* dummy read for pci-posting */ in snd_vt1724_set_gpio_dir()
193 static unsigned int snd_vt1724_get_gpio_dir(struct snd_ice1712 *ice) in snd_vt1724_get_gpio_dir() argument
195 return inl(ICEREG1724(ice, GPIO_DIRECTION)); in snd_vt1724_get_gpio_dir()
199 static void snd_vt1724_set_gpio_mask(struct snd_ice1712 *ice, unsigned int data) in snd_vt1724_set_gpio_mask() argument
201 outw(data, ICEREG1724(ice, GPIO_WRITE_MASK)); in snd_vt1724_set_gpio_mask()
202 if (!ice->vt1720) /* VT1720 supports only 16 GPIO bits */ in snd_vt1724_set_gpio_mask()
203 outb((data >> 16) & 0xff, ICEREG1724(ice, GPIO_WRITE_MASK_22)); in snd_vt1724_set_gpio_mask()
204 inw(ICEREG1724(ice, GPIO_WRITE_MASK)); /* dummy read for pci-posting */ in snd_vt1724_set_gpio_mask()
207 static unsigned int snd_vt1724_get_gpio_mask(struct snd_ice1712 *ice) in snd_vt1724_get_gpio_mask() argument
210 if (!ice->vt1720) in snd_vt1724_get_gpio_mask()
211 mask = (unsigned int)inb(ICEREG1724(ice, GPIO_WRITE_MASK_22)); in snd_vt1724_get_gpio_mask()
214 mask = (mask << 16) | inw(ICEREG1724(ice, GPIO_WRITE_MASK)); in snd_vt1724_get_gpio_mask()
218 static void snd_vt1724_set_gpio_data(struct snd_ice1712 *ice, unsigned int data) in snd_vt1724_set_gpio_data() argument
220 outw(data, ICEREG1724(ice, GPIO_DATA)); in snd_vt1724_set_gpio_data()
221 if (!ice->vt1720) in snd_vt1724_set_gpio_data()
222 outb(data >> 16, ICEREG1724(ice, GPIO_DATA_22)); in snd_vt1724_set_gpio_data()
223 inw(ICEREG1724(ice, GPIO_DATA)); /* dummy read for pci-posting */ in snd_vt1724_set_gpio_data()
226 static unsigned int snd_vt1724_get_gpio_data(struct snd_ice1712 *ice) in snd_vt1724_get_gpio_data() argument
229 if (!ice->vt1720) in snd_vt1724_get_gpio_data()
230 data = (unsigned int)inb(ICEREG1724(ice, GPIO_DATA_22)); in snd_vt1724_get_gpio_data()
233 data = (data << 16) | inw(ICEREG1724(ice, GPIO_DATA)); in snd_vt1724_get_gpio_data()
241 static void vt1724_midi_clear_rx(struct snd_ice1712 *ice) in vt1724_midi_clear_rx() argument
245 for (count = inb(ICEREG1724(ice, MPU_RXFIFO)); count > 0; --count) in vt1724_midi_clear_rx()
246 inb(ICEREG1724(ice, MPU_DATA)); in vt1724_midi_clear_rx()
250 get_rawmidi_substream(struct snd_ice1712 *ice, unsigned int stream) in get_rawmidi_substream() argument
252 return list_first_entry(&ice->rmidi[0]->streams[stream].substreams, in get_rawmidi_substream()
256 static void enable_midi_irq(struct snd_ice1712 *ice, u8 flag, int enable);
258 static void vt1724_midi_write(struct snd_ice1712 *ice) in vt1724_midi_write() argument
264 s = get_rawmidi_substream(ice, SNDRV_RAWMIDI_STREAM_OUTPUT); in vt1724_midi_write()
265 count = 31 - inb(ICEREG1724(ice, MPU_TXFIFO)); in vt1724_midi_write()
269 outb(buffer[i], ICEREG1724(ice, MPU_DATA)); in vt1724_midi_write()
274 enable_midi_irq(ice, VT1724_IRQ_MPU_TX, in vt1724_midi_write()
278 static void vt1724_midi_read(struct snd_ice1712 *ice) in vt1724_midi_read() argument
284 s = get_rawmidi_substream(ice, SNDRV_RAWMIDI_STREAM_INPUT); in vt1724_midi_read()
285 count = inb(ICEREG1724(ice, MPU_RXFIFO)); in vt1724_midi_read()
289 buffer[i] = inb(ICEREG1724(ice, MPU_DATA)); in vt1724_midi_read()
294 /* call with ice->reg_lock */
295 static void enable_midi_irq(struct snd_ice1712 *ice, u8 flag, int enable) in enable_midi_irq() argument
297 u8 mask = inb(ICEREG1724(ice, IRQMASK)); in enable_midi_irq()
302 outb(mask, ICEREG1724(ice, IRQMASK)); in enable_midi_irq()
308 struct snd_ice1712 *ice = substream->rmidi->private_data; in vt1724_enable_midi_irq() local
310 spin_lock_irq(&ice->reg_lock); in vt1724_enable_midi_irq()
311 enable_midi_irq(ice, flag, enable); in vt1724_enable_midi_irq()
312 spin_unlock_irq(&ice->reg_lock); in vt1724_enable_midi_irq()
327 struct snd_ice1712 *ice = s->rmidi->private_data; in vt1724_midi_output_trigger() local
330 spin_lock_irqsave(&ice->reg_lock, flags); in vt1724_midi_output_trigger()
332 ice->midi_output = 1; in vt1724_midi_output_trigger()
333 vt1724_midi_write(ice); in vt1724_midi_output_trigger()
335 ice->midi_output = 0; in vt1724_midi_output_trigger()
336 enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0); in vt1724_midi_output_trigger()
338 spin_unlock_irqrestore(&ice->reg_lock, flags); in vt1724_midi_output_trigger()
343 struct snd_ice1712 *ice = s->rmidi->private_data; in vt1724_midi_output_drain() local
350 if (inb(ICEREG1724(ice, MPU_CTRL)) & VT1724_MPU_TX_EMPTY) in vt1724_midi_output_drain()
378 struct snd_ice1712 *ice = s->rmidi->private_data; in vt1724_midi_input_trigger() local
381 spin_lock_irqsave(&ice->reg_lock, flags); in vt1724_midi_input_trigger()
383 ice->midi_input = 1; in vt1724_midi_input_trigger()
384 vt1724_midi_read(ice); in vt1724_midi_input_trigger()
386 ice->midi_input = 0; in vt1724_midi_input_trigger()
388 spin_unlock_irqrestore(&ice->reg_lock, flags); in vt1724_midi_input_trigger()
404 struct snd_ice1712 *ice = dev_id; in snd_vt1724_interrupt() local
412 status = inb(ICEREG1724(ice, IRQSTAT)); in snd_vt1724_interrupt()
416 spin_lock(&ice->reg_lock); in snd_vt1724_interrupt()
418 status = inb(ICEREG1724(ice, IRQSTAT)); in snd_vt1724_interrupt()
419 dev_err(ice->card->dev, in snd_vt1724_interrupt()
422 dev_err(ice->card->dev, "Disabling MPU_TX\n"); in snd_vt1724_interrupt()
423 enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0); in snd_vt1724_interrupt()
425 spin_unlock(&ice->reg_lock); in snd_vt1724_interrupt()
430 if (ice->midi_output) in snd_vt1724_interrupt()
431 vt1724_midi_write(ice); in snd_vt1724_interrupt()
433 enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0); in snd_vt1724_interrupt()
442 if (ice->midi_input) in snd_vt1724_interrupt()
443 vt1724_midi_read(ice); in snd_vt1724_interrupt()
445 vt1724_midi_clear_rx(ice); in snd_vt1724_interrupt()
448 outb(status, ICEREG1724(ice, IRQSTAT)); in snd_vt1724_interrupt()
449 spin_unlock(&ice->reg_lock); in snd_vt1724_interrupt()
462 unsigned char mtstat = inb(ICEMT1724(ice, IRQ)); in snd_vt1724_interrupt()
464 if (ice->playback_pro_substream) in snd_vt1724_interrupt()
465 snd_pcm_period_elapsed(ice->playback_pro_substream); in snd_vt1724_interrupt()
468 if (ice->capture_pro_substream) in snd_vt1724_interrupt()
469 snd_pcm_period_elapsed(ice->capture_pro_substream); in snd_vt1724_interrupt()
472 if (ice->playback_con_substream_ds[0]) in snd_vt1724_interrupt()
473 snd_pcm_period_elapsed(ice->playback_con_substream_ds[0]); in snd_vt1724_interrupt()
476 if (ice->playback_con_substream_ds[1]) in snd_vt1724_interrupt()
477 snd_pcm_period_elapsed(ice->playback_con_substream_ds[1]); in snd_vt1724_interrupt()
480 if (ice->playback_con_substream_ds[2]) in snd_vt1724_interrupt()
481 snd_pcm_period_elapsed(ice->playback_con_substream_ds[2]); in snd_vt1724_interrupt()
484 if (ice->playback_con_substream) in snd_vt1724_interrupt()
485 snd_pcm_period_elapsed(ice->playback_con_substream); in snd_vt1724_interrupt()
488 if (ice->capture_con_substream) in snd_vt1724_interrupt()
489 snd_pcm_period_elapsed(ice->capture_con_substream); in snd_vt1724_interrupt()
492 outb(mtstat, ICEMT1724(ice, IRQ)); in snd_vt1724_interrupt()
495 unsigned char fstat = inb(ICEMT1724(ice, DMA_FIFO_ERR)); in snd_vt1724_interrupt()
496 outb(fstat, ICEMT1724(ice, DMA_FIFO_ERR)); in snd_vt1724_interrupt()
497 outb(VT1724_MULTI_FIFO_ERR | inb(ICEMT1724(ice, DMA_INT_MASK)), ICEMT1724(ice, DMA_INT_MASK)); in snd_vt1724_interrupt()
543 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_trigger() local
550 if (snd_pcm_substream_chip(s) == ice) { in snd_vt1724_pcm_trigger()
561 spin_lock(&ice->reg_lock); in snd_vt1724_pcm_trigger()
562 old = inb(ICEMT1724(ice, DMA_PAUSE)); in snd_vt1724_pcm_trigger()
567 outb(old, ICEMT1724(ice, DMA_PAUSE)); in snd_vt1724_pcm_trigger()
568 spin_unlock(&ice->reg_lock); in snd_vt1724_pcm_trigger()
574 spin_lock(&ice->reg_lock); in snd_vt1724_pcm_trigger()
575 old = inb(ICEMT1724(ice, DMA_CONTROL)); in snd_vt1724_pcm_trigger()
580 outb(old, ICEMT1724(ice, DMA_CONTROL)); in snd_vt1724_pcm_trigger()
581 spin_unlock(&ice->reg_lock); in snd_vt1724_pcm_trigger()
607 static unsigned int stdclock_get_rate(struct snd_ice1712 *ice) in stdclock_get_rate() argument
609 return stdclock_rate_list[inb(ICEMT1724(ice, RATE)) & 15]; in stdclock_get_rate()
612 static void stdclock_set_rate(struct snd_ice1712 *ice, unsigned int rate) in stdclock_set_rate() argument
617 outb(i, ICEMT1724(ice, RATE)); in stdclock_set_rate()
623 static unsigned char stdclock_set_mclk(struct snd_ice1712 *ice, in stdclock_set_mclk() argument
628 if (ice->eeprom.data[ICE_EEP2_ACLINK] & VT1724_CFG_PRO_I2S) { in stdclock_set_mclk()
629 val = old = inb(ICEMT1724(ice, I2S_FORMAT)); in stdclock_set_mclk()
635 outb(val, ICEMT1724(ice, I2S_FORMAT)); in stdclock_set_mclk()
644 static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate, in snd_vt1724_set_pro_rate() argument
652 if (rate > ice->hw_rates->list[ice->hw_rates->count - 1]) in snd_vt1724_set_pro_rate()
655 spin_lock_irqsave(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
656 if ((inb(ICEMT1724(ice, DMA_CONTROL)) & DMA_STARTS) || in snd_vt1724_set_pro_rate()
657 (inb(ICEMT1724(ice, DMA_PAUSE)) & DMA_PAUSES)) { in snd_vt1724_set_pro_rate()
659 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
660 return ((rate == ice->cur_rate) && !force) ? 0 : -EBUSY; in snd_vt1724_set_pro_rate()
662 if (!force && is_pro_rate_locked(ice)) { in snd_vt1724_set_pro_rate()
665 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
666 return (rate == ice->cur_rate) ? 0 : -EBUSY; in snd_vt1724_set_pro_rate()
669 if (force || !ice->is_spdif_master(ice)) { in snd_vt1724_set_pro_rate()
672 old_rate = ice->get_rate(ice); in snd_vt1724_set_pro_rate()
675 else if (rate == ice->cur_rate) { in snd_vt1724_set_pro_rate()
676 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
681 ice->cur_rate = rate; in snd_vt1724_set_pro_rate()
682 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
685 ice->set_rate(ice, rate); in snd_vt1724_set_pro_rate()
688 mclk_change = ice->set_mclk(ice, rate); in snd_vt1724_set_pro_rate()
690 if (mclk_change && ice->gpio.i2s_mclk_changed) in snd_vt1724_set_pro_rate()
691 ice->gpio.i2s_mclk_changed(ice); in snd_vt1724_set_pro_rate()
692 if (ice->gpio.set_pro_rate) in snd_vt1724_set_pro_rate()
693 ice->gpio.set_pro_rate(ice, rate); in snd_vt1724_set_pro_rate()
696 for (i = 0; i < ice->akm_codecs; i++) { in snd_vt1724_set_pro_rate()
697 if (ice->akm[i].ops.set_rate_val) in snd_vt1724_set_pro_rate()
698 ice->akm[i].ops.set_rate_val(&ice->akm[i], rate); in snd_vt1724_set_pro_rate()
700 if (ice->spdif.ops.setup_rate) in snd_vt1724_set_pro_rate()
701 ice->spdif.ops.setup_rate(ice, rate); in snd_vt1724_set_pro_rate()
709 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_hw_params() local
713 mutex_lock(&ice->open_mutex); in snd_vt1724_pcm_hw_params()
715 if (substream == ice->playback_pro_substream) { in snd_vt1724_pcm_hw_params()
719 if (ice->pcm_reserved[i] && in snd_vt1724_pcm_hw_params()
720 ice->pcm_reserved[i] != substream) { in snd_vt1724_pcm_hw_params()
721 mutex_unlock(&ice->open_mutex); in snd_vt1724_pcm_hw_params()
724 ice->pcm_reserved[i] = substream; in snd_vt1724_pcm_hw_params()
727 if (ice->pcm_reserved[i] == substream) in snd_vt1724_pcm_hw_params()
728 ice->pcm_reserved[i] = NULL; in snd_vt1724_pcm_hw_params()
733 if (ice->playback_con_substream_ds[i] == substream) { in snd_vt1724_pcm_hw_params()
734 if (ice->pcm_reserved[i] && in snd_vt1724_pcm_hw_params()
735 ice->pcm_reserved[i] != substream) { in snd_vt1724_pcm_hw_params()
736 mutex_unlock(&ice->open_mutex); in snd_vt1724_pcm_hw_params()
739 ice->pcm_reserved[i] = substream; in snd_vt1724_pcm_hw_params()
744 mutex_unlock(&ice->open_mutex); in snd_vt1724_pcm_hw_params()
746 return snd_vt1724_set_pro_rate(ice, params_rate(hw_params), 0); in snd_vt1724_pcm_hw_params()
751 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_hw_free() local
754 mutex_lock(&ice->open_mutex); in snd_vt1724_pcm_hw_free()
757 if (ice->pcm_reserved[i] == substream) in snd_vt1724_pcm_hw_free()
758 ice->pcm_reserved[i] = NULL; in snd_vt1724_pcm_hw_free()
759 mutex_unlock(&ice->open_mutex); in snd_vt1724_pcm_hw_free()
765 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_pro_prepare() local
769 spin_lock_irq(&ice->reg_lock); in snd_vt1724_playback_pro_prepare()
771 outb(val, ICEMT1724(ice, BURST)); in snd_vt1724_playback_pro_prepare()
773 outl(substream->runtime->dma_addr, ICEMT1724(ice, PLAYBACK_ADDR)); in snd_vt1724_playback_pro_prepare()
776 /* outl(size, ICEMT1724(ice, PLAYBACK_SIZE)); */ in snd_vt1724_playback_pro_prepare()
777 outw(size, ICEMT1724(ice, PLAYBACK_SIZE)); in snd_vt1724_playback_pro_prepare()
778 outb(size >> 16, ICEMT1724(ice, PLAYBACK_SIZE) + 2); in snd_vt1724_playback_pro_prepare()
780 /* outl(size, ICEMT1724(ice, PLAYBACK_COUNT)); */ in snd_vt1724_playback_pro_prepare()
781 outw(size, ICEMT1724(ice, PLAYBACK_COUNT)); in snd_vt1724_playback_pro_prepare()
782 outb(size >> 16, ICEMT1724(ice, PLAYBACK_COUNT) + 2); in snd_vt1724_playback_pro_prepare()
784 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_playback_pro_prepare()
787 dev_dbg(ice->card->dev, "pro prepare: ch = %d, addr = 0x%x, " in snd_vt1724_playback_pro_prepare()
799 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_pro_pointer() local
802 if (!(inl(ICEMT1724(ice, DMA_CONTROL)) & VT1724_PDMA0_START)) in snd_vt1724_playback_pro_pointer()
805 ptr = inl(ICEMT1724(ice, PLAYBACK_ADDR)); in snd_vt1724_playback_pro_pointer()
807 dev_dbg(ice->card->dev, "invalid negative ptr\n"); in snd_vt1724_playback_pro_pointer()
813 dev_dbg(ice->card->dev, "invalid ptr %d (size=%d)\n", in snd_vt1724_playback_pro_pointer()
818 ptr = inl(ICEMT1724(ice, PLAYBACK_SIZE)) & 0xffffff; in snd_vt1724_playback_pro_pointer()
826 dev_dbg(ice->card->dev, "invalid ptr %d (size=%d)\n", in snd_vt1724_playback_pro_pointer()
836 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_prepare() local
839 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pcm_prepare()
840 outl(substream->runtime->dma_addr, ice->profi_port + reg->addr); in snd_vt1724_pcm_prepare()
842 ice->profi_port + reg->size); in snd_vt1724_pcm_prepare()
844 ice->profi_port + reg->count); in snd_vt1724_pcm_prepare()
845 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pcm_prepare()
851 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_pointer() local
855 if (!(inl(ICEMT1724(ice, DMA_CONTROL)) & reg->start)) in snd_vt1724_pcm_pointer()
858 ptr = inl(ice->profi_port + reg->addr); in snd_vt1724_pcm_pointer()
862 ptr = inw(ice->profi_port + reg->size); in snd_vt1724_pcm_pointer()
870 dev_dbg(ice->card->dev, "invalid ptr %d (size=%d)\n", in snd_vt1724_pcm_pointer()
971 static void set_std_hw_rates(struct snd_ice1712 *ice) in set_std_hw_rates() argument
973 if (ice->eeprom.data[ICE_EEP2_ACLINK] & VT1724_CFG_PRO_I2S) { in set_std_hw_rates()
976 if ((ice->eeprom.data[ICE_EEP2_I2S] & 0x08) && !ice->vt1720) in set_std_hw_rates()
977 ice->hw_rates = &hw_constraints_rates_192; in set_std_hw_rates()
979 ice->hw_rates = &hw_constraints_rates_96; in set_std_hw_rates()
982 ice->hw_rates = &hw_constraints_rates_48; in set_std_hw_rates()
986 static int set_rate_constraints(struct snd_ice1712 *ice, in set_rate_constraints() argument
991 runtime->hw.rate_min = ice->hw_rates->list[0]; in set_rate_constraints()
992 runtime->hw.rate_max = ice->hw_rates->list[ice->hw_rates->count - 1]; in set_rate_constraints()
996 ice->hw_rates); in set_rate_constraints()
1004 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in constrain_rate_if_locked() local
1007 if (is_pro_rate_locked(ice)) { in constrain_rate_if_locked()
1008 rate = ice->get_rate(ice); in constrain_rate_if_locked()
1026 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_pro_open() local
1030 ice->playback_pro_substream = substream; in snd_vt1724_playback_pro_open()
1034 set_rate_constraints(ice, substream); in snd_vt1724_playback_pro_open()
1035 mutex_lock(&ice->open_mutex); in snd_vt1724_playback_pro_open()
1037 num_indeps = ice->num_total_dacs / 2 - 1; in snd_vt1724_playback_pro_open()
1039 if (ice->pcm_reserved[chs]) in snd_vt1724_playback_pro_open()
1046 mutex_unlock(&ice->open_mutex); in snd_vt1724_playback_pro_open()
1052 if (ice->pro_open) in snd_vt1724_playback_pro_open()
1053 ice->pro_open(ice, substream); in snd_vt1724_playback_pro_open()
1059 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_capture_pro_open() local
1063 ice->capture_pro_substream = substream; in snd_vt1724_capture_pro_open()
1067 set_rate_constraints(ice, substream); in snd_vt1724_capture_pro_open()
1073 if (ice->pro_open) in snd_vt1724_capture_pro_open()
1074 ice->pro_open(ice, substream); in snd_vt1724_capture_pro_open()
1080 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_pro_close() local
1083 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_playback_pro_close()
1084 ice->playback_pro_substream = NULL; in snd_vt1724_playback_pro_close()
1091 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_capture_pro_close() local
1094 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_capture_pro_close()
1095 ice->capture_pro_substream = NULL; in snd_vt1724_capture_pro_close()
1119 static int snd_vt1724_pcm_profi(struct snd_ice1712 *ice, int device) in snd_vt1724_pcm_profi() argument
1124 if ((ice->eeprom.data[ICE_EEP2_SYSCONF] & VT1724_CFG_ADC_MASK) == in snd_vt1724_pcm_profi()
1129 err = snd_pcm_new(ice->card, "ICE1724", device, 1, capt, &pcm); in snd_vt1724_pcm_profi()
1138 pcm->private_data = ice; in snd_vt1724_pcm_profi()
1143 &ice->pci->dev, 256*1024, 256*1024); in snd_vt1724_pcm_profi()
1145 ice->pcm_pro = pcm; in snd_vt1724_pcm_profi()
1156 static void update_spdif_bits(struct snd_ice1712 *ice, unsigned int val) in update_spdif_bits() argument
1160 cbit = inb(ICEREG1724(ice, SPDIF_CFG)); in update_spdif_bits()
1163 outb(disabled, ICEREG1724(ice, SPDIF_CFG)); in update_spdif_bits()
1164 outw(val, ICEMT1724(ice, SPDIF_CTRL)); in update_spdif_bits()
1166 outb(cbit, ICEREG1724(ice, SPDIF_CFG)); in update_spdif_bits()
1167 outw(val, ICEMT1724(ice, SPDIF_CTRL)); in update_spdif_bits()
1171 static void update_spdif_rate(struct snd_ice1712 *ice, unsigned int rate) in update_spdif_rate() argument
1176 spin_lock_irqsave(&ice->reg_lock, flags); in update_spdif_rate()
1177 nval = val = inw(ICEMT1724(ice, SPDIF_CTRL)); in update_spdif_rate()
1189 update_spdif_bits(ice, nval); in update_spdif_rate()
1190 spin_unlock_irqrestore(&ice->reg_lock, flags); in update_spdif_rate()
1195 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_spdif_prepare() local
1196 if (!ice->force_pdma4) in snd_vt1724_playback_spdif_prepare()
1197 update_spdif_rate(ice, substream->runtime->rate); in snd_vt1724_playback_spdif_prepare()
1203 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_spdif_open() local
1207 ice->playback_con_substream = substream; in snd_vt1724_playback_spdif_open()
1208 if (ice->force_pdma4) { in snd_vt1724_playback_spdif_open()
1210 set_rate_constraints(ice, substream); in snd_vt1724_playback_spdif_open()
1220 if (ice->spdif.ops.open) in snd_vt1724_playback_spdif_open()
1221 ice->spdif.ops.open(ice, substream); in snd_vt1724_playback_spdif_open()
1227 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_spdif_close() local
1230 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_playback_spdif_close()
1231 ice->playback_con_substream = NULL; in snd_vt1724_playback_spdif_close()
1232 if (ice->spdif.ops.close) in snd_vt1724_playback_spdif_close()
1233 ice->spdif.ops.close(ice, substream); in snd_vt1724_playback_spdif_close()
1240 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_capture_spdif_open() local
1244 ice->capture_con_substream = substream; in snd_vt1724_capture_spdif_open()
1245 if (ice->force_rdma1) { in snd_vt1724_capture_spdif_open()
1247 set_rate_constraints(ice, substream); in snd_vt1724_capture_spdif_open()
1257 if (ice->spdif.ops.open) in snd_vt1724_capture_spdif_open()
1258 ice->spdif.ops.open(ice, substream); in snd_vt1724_capture_spdif_open()
1264 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_capture_spdif_close() local
1267 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_capture_spdif_close()
1268 ice->capture_con_substream = NULL; in snd_vt1724_capture_spdif_close()
1269 if (ice->spdif.ops.close) in snd_vt1724_capture_spdif_close()
1270 ice->spdif.ops.close(ice, substream); in snd_vt1724_capture_spdif_close()
1296 static int snd_vt1724_pcm_spdif(struct snd_ice1712 *ice, int device) in snd_vt1724_pcm_spdif() argument
1303 if (ice->force_pdma4 || in snd_vt1724_pcm_spdif()
1304 (ice->eeprom.data[ICE_EEP2_SPDIF] & VT1724_CFG_SPDIF_OUT_INT)) { in snd_vt1724_pcm_spdif()
1306 ice->has_spdif = 1; in snd_vt1724_pcm_spdif()
1309 if (ice->force_rdma1 || in snd_vt1724_pcm_spdif()
1310 (ice->eeprom.data[ICE_EEP2_SPDIF] & VT1724_CFG_SPDIF_IN)) { in snd_vt1724_pcm_spdif()
1312 ice->has_spdif = 1; in snd_vt1724_pcm_spdif()
1318 if (ice->force_pdma4 || ice->force_rdma1) in snd_vt1724_pcm_spdif()
1322 err = snd_pcm_new(ice->card, name, device, play, capt, &pcm); in snd_vt1724_pcm_spdif()
1333 pcm->private_data = ice; in snd_vt1724_pcm_spdif()
1338 &ice->pci->dev, 256*1024, 256*1024); in snd_vt1724_pcm_spdif()
1340 ice->pcm = pcm; in snd_vt1724_pcm_spdif()
1373 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_indep_prepare() local
1376 spin_lock_irq(&ice->reg_lock); in snd_vt1724_playback_indep_prepare()
1378 if (inb(ICEMT1724(ice, BURST)) < val) in snd_vt1724_playback_indep_prepare()
1379 outb(val, ICEMT1724(ice, BURST)); in snd_vt1724_playback_indep_prepare()
1380 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_playback_indep_prepare()
1386 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_indep_open() local
1389 mutex_lock(&ice->open_mutex); in snd_vt1724_playback_indep_open()
1391 if (ice->pcm_reserved[substream->number]) { in snd_vt1724_playback_indep_open()
1392 mutex_unlock(&ice->open_mutex); in snd_vt1724_playback_indep_open()
1395 mutex_unlock(&ice->open_mutex); in snd_vt1724_playback_indep_open()
1397 ice->playback_con_substream_ds[substream->number] = substream; in snd_vt1724_playback_indep_open()
1401 set_rate_constraints(ice, substream); in snd_vt1724_playback_indep_open()
1407 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_indep_close() local
1410 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_playback_indep_close()
1411 ice->playback_con_substream_ds[substream->number] = NULL; in snd_vt1724_playback_indep_close()
1412 ice->pcm_reserved[substream->number] = NULL; in snd_vt1724_playback_indep_close()
1428 static int snd_vt1724_pcm_indep(struct snd_ice1712 *ice, int device) in snd_vt1724_pcm_indep() argument
1434 play = ice->num_total_dacs / 2 - 1; in snd_vt1724_pcm_indep()
1438 err = snd_pcm_new(ice->card, "ICE1724 Surrounds", device, play, 0, &pcm); in snd_vt1724_pcm_indep()
1445 pcm->private_data = ice; in snd_vt1724_pcm_indep()
1450 &ice->pci->dev, 256*1024, 256*1024); in snd_vt1724_pcm_indep()
1452 ice->pcm_ds = pcm; in snd_vt1724_pcm_indep()
1462 static int snd_vt1724_ac97_mixer(struct snd_ice1712 *ice) in snd_vt1724_ac97_mixer() argument
1466 if (!(ice->eeprom.data[ICE_EEP2_ACLINK] & VT1724_CFG_PRO_I2S)) { in snd_vt1724_ac97_mixer()
1475 outb(inb(ICEMT1724(ice, AC97_CMD)) | 0x80, ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_mixer()
1477 outb(inb(ICEMT1724(ice, AC97_CMD)) & ~0x80, ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_mixer()
1479 err = snd_ac97_bus(ice->card, 0, &ops, NULL, &pbus); in snd_vt1724_ac97_mixer()
1483 ac97.private_data = ice; in snd_vt1724_ac97_mixer()
1484 err = snd_ac97_mixer(pbus, &ac97, &ice->ac97); in snd_vt1724_ac97_mixer()
1486 dev_warn(ice->card->dev, in snd_vt1724_ac97_mixer()
1492 strcat(ice->card->mixername, "ICE1724 - multitrack"); in snd_vt1724_ac97_mixer()
1500 static inline unsigned int eeprom_triple(struct snd_ice1712 *ice, int idx) in eeprom_triple() argument
1502 return (unsigned int)ice->eeprom.data[idx] | \ in eeprom_triple()
1503 ((unsigned int)ice->eeprom.data[idx + 1] << 8) | \ in eeprom_triple()
1504 ((unsigned int)ice->eeprom.data[idx + 2] << 16); in eeprom_triple()
1510 struct snd_ice1712 *ice = entry->private_data; in snd_vt1724_proc_read() local
1513 snd_iprintf(buffer, "%s\n\n", ice->card->longname); in snd_vt1724_proc_read()
1516 snd_iprintf(buffer, " Subvendor : 0x%x\n", ice->eeprom.subvendor); in snd_vt1724_proc_read()
1517 snd_iprintf(buffer, " Size : %i bytes\n", ice->eeprom.size); in snd_vt1724_proc_read()
1518 snd_iprintf(buffer, " Version : %i\n", ice->eeprom.version); in snd_vt1724_proc_read()
1520 ice->eeprom.data[ICE_EEP2_SYSCONF]); in snd_vt1724_proc_read()
1522 ice->eeprom.data[ICE_EEP2_ACLINK]); in snd_vt1724_proc_read()
1524 ice->eeprom.data[ICE_EEP2_I2S]); in snd_vt1724_proc_read()
1526 ice->eeprom.data[ICE_EEP2_SPDIF]); in snd_vt1724_proc_read()
1528 ice->eeprom.gpiodir); in snd_vt1724_proc_read()
1530 ice->eeprom.gpiomask); in snd_vt1724_proc_read()
1532 ice->eeprom.gpiostate); in snd_vt1724_proc_read()
1533 for (idx = 0x12; idx < ice->eeprom.size; idx++) in snd_vt1724_proc_read()
1535 idx, ice->eeprom.data[idx]); in snd_vt1724_proc_read()
1540 (unsigned)inl(ICEMT1724(ice, ROUTE_PLAYBACK))); in snd_vt1724_proc_read()
1543 idx, inb(ice->port+idx)); in snd_vt1724_proc_read()
1546 idx, inb(ice->profi_port+idx)); in snd_vt1724_proc_read()
1549 static void snd_vt1724_proc_init(struct snd_ice1712 *ice) in snd_vt1724_proc_init() argument
1551 snd_card_ro_proc_new(ice->card, "ice1724", ice, snd_vt1724_proc_read); in snd_vt1724_proc_init()
1569 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_eeprom_get() local
1571 memcpy(ucontrol->value.bytes.data, &ice->eeprom, sizeof(ice->eeprom)); in snd_vt1724_eeprom_get()
1666 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_spdif_default_get() local
1668 val = inw(ICEMT1724(ice, SPDIF_CTRL)); in snd_vt1724_spdif_default_get()
1676 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_spdif_default_put() local
1680 spin_lock_irq(&ice->reg_lock); in snd_vt1724_spdif_default_put()
1681 old = inw(ICEMT1724(ice, SPDIF_CTRL)); in snd_vt1724_spdif_default_put()
1683 update_spdif_bits(ice, val); in snd_vt1724_spdif_default_put()
1684 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_spdif_default_put()
1743 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_spdif_sw_get() local
1744 ucontrol->value.integer.value[0] = inb(ICEREG1724(ice, SPDIF_CFG)) & in snd_vt1724_spdif_sw_get()
1752 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_spdif_sw_put() local
1755 spin_lock_irq(&ice->reg_lock); in snd_vt1724_spdif_sw_put()
1756 old = val = inb(ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_spdif_sw_put()
1761 outb(val, ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_spdif_sw_put()
1762 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_spdif_sw_put()
1788 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
1792 snd_ice1712_save_gpio_status(ice);
1794 (snd_ice1712_gpio_read(ice) & (1 << shift) ? 1 : 0) ^ invert;
1795 snd_ice1712_restore_gpio_status(ice);
1802 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
1810 snd_ice1712_save_gpio_status(ice);
1811 val = snd_ice1712_gpio_read(ice);
1814 snd_ice1712_gpio_write(ice, nval);
1815 snd_ice1712_restore_gpio_status(ice);
1826 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_internal_clock_info() local
1827 int hw_rates_count = ice->hw_rates->count; in snd_vt1724_pro_internal_clock_info()
1834 if (ice->force_rdma1 || in snd_vt1724_pro_internal_clock_info()
1835 (ice->eeprom.data[ICE_EEP2_SPDIF] & VT1724_CFG_SPDIF_IN)) in snd_vt1724_pro_internal_clock_info()
1836 uinfo->value.enumerated.items += ice->ext_clock_count; in snd_vt1724_pro_internal_clock_info()
1843 ice->ext_clock_names[ in snd_vt1724_pro_internal_clock_info()
1848 ice->hw_rates->list[uinfo->value.enumerated.item]); in snd_vt1724_pro_internal_clock_info()
1855 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_internal_clock_get() local
1858 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_get()
1859 if (ice->is_spdif_master(ice)) { in snd_vt1724_pro_internal_clock_get()
1860 ucontrol->value.enumerated.item[0] = ice->hw_rates->count + in snd_vt1724_pro_internal_clock_get()
1861 ice->get_spdif_master_type(ice); in snd_vt1724_pro_internal_clock_get()
1863 rate = ice->get_rate(ice); in snd_vt1724_pro_internal_clock_get()
1865 for (i = 0; i < ice->hw_rates->count; i++) { in snd_vt1724_pro_internal_clock_get()
1866 if (ice->hw_rates->list[i] == rate) { in snd_vt1724_pro_internal_clock_get()
1872 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_get()
1876 static int stdclock_get_spdif_master_type(struct snd_ice1712 *ice) in stdclock_get_spdif_master_type() argument
1883 static int stdclock_set_spdif_clock(struct snd_ice1712 *ice, int type) in stdclock_set_spdif_clock() argument
1887 oval = inb(ICEMT1724(ice, RATE)); in stdclock_set_spdif_clock()
1888 outb(oval | VT1724_SPDIF_MASTER, ICEMT1724(ice, RATE)); in stdclock_set_spdif_clock()
1890 i2s_oval = inb(ICEMT1724(ice, I2S_FORMAT)); in stdclock_set_spdif_clock()
1891 outb(i2s_oval & ~VT1724_MT_I2S_MCLK_128X, ICEMT1724(ice, I2S_FORMAT)); in stdclock_set_spdif_clock()
1899 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_internal_clock_put() local
1902 unsigned int first_ext_clock = ice->hw_rates->count; in snd_vt1724_pro_internal_clock_put()
1904 if (item > first_ext_clock + ice->ext_clock_count - 1) in snd_vt1724_pro_internal_clock_put()
1908 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_put()
1909 if (ice->is_spdif_master(ice)) in snd_vt1724_pro_internal_clock_put()
1912 old_rate = ice->get_rate(ice); in snd_vt1724_pro_internal_clock_put()
1915 ice->set_spdif_clock(ice, item - first_ext_clock); in snd_vt1724_pro_internal_clock_put()
1919 new_rate = ice->hw_rates->list[item]; in snd_vt1724_pro_internal_clock_put()
1920 ice->pro_rate_default = new_rate; in snd_vt1724_pro_internal_clock_put()
1921 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_put()
1922 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 1); in snd_vt1724_pro_internal_clock_put()
1923 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_put()
1925 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_put()
1931 if (ice->gpio.set_pro_rate) in snd_vt1724_pro_internal_clock_put()
1932 ice->gpio.set_pro_rate(ice, 0); in snd_vt1724_pro_internal_clock_put()
1933 for (i = 0; i < ice->akm_codecs; i++) { in snd_vt1724_pro_internal_clock_put()
1934 if (ice->akm[i].ops.set_rate_val) in snd_vt1724_pro_internal_clock_put()
1935 ice->akm[i].ops.set_rate_val(&ice->akm[i], 0); in snd_vt1724_pro_internal_clock_put()
1961 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_rate_locking_put() local
1965 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_rate_locking_put()
1968 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_rate_locking_put()
1992 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_rate_reset_put() local
1996 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_rate_reset_put()
1999 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_rate_reset_put()
2037 int snd_ice1724_get_route_val(struct snd_ice1712 *ice, int shift) in snd_ice1724_get_route_val() argument
2045 val = inl(ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_ice1724_get_route_val()
2056 int snd_ice1724_put_route_val(struct snd_ice1712 *ice, unsigned int val, in snd_ice1724_put_route_val() argument
2070 val = old_val = inl(ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_ice1724_put_route_val()
2075 outl(val, ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_ice1724_put_route_val()
2082 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_route_analog_get() local
2085 snd_ice1724_get_route_val(ice, analog_route_shift(idx)); in snd_vt1724_pro_route_analog_get()
2092 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_route_analog_put() local
2094 return snd_ice1724_put_route_val(ice, in snd_vt1724_pro_route_analog_put()
2102 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_route_spdif_get() local
2105 snd_ice1724_get_route_val(ice, digital_route_shift(idx)); in snd_vt1724_pro_route_spdif_get()
2112 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_route_spdif_put() local
2114 return snd_ice1724_put_route_val(ice, in snd_vt1724_pro_route_spdif_put()
2151 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_peak_get() local
2154 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_peak_get()
2156 outb(idx, ICEMT1724(ice, MONITOR_PEAKINDEX)); in snd_vt1724_pro_peak_get()
2158 inb(ICEMT1724(ice, MONITOR_PEAKDATA)); in snd_vt1724_pro_peak_get()
2160 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_peak_get()
2235 static void wait_i2c_busy(struct snd_ice1712 *ice) in wait_i2c_busy() argument
2238 while ((inb(ICEREG1724(ice, I2C_CTRL)) & VT1724_I2C_BUSY) && t--) in wait_i2c_busy()
2241 dev_err(ice->card->dev, "i2c busy timeout\n"); in wait_i2c_busy()
2244 unsigned char snd_vt1724_read_i2c(struct snd_ice1712 *ice, in snd_vt1724_read_i2c() argument
2249 mutex_lock(&ice->i2c_mutex); in snd_vt1724_read_i2c()
2250 wait_i2c_busy(ice); in snd_vt1724_read_i2c()
2251 outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR)); in snd_vt1724_read_i2c()
2252 outb(dev & ~VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR)); in snd_vt1724_read_i2c()
2253 wait_i2c_busy(ice); in snd_vt1724_read_i2c()
2254 val = inb(ICEREG1724(ice, I2C_DATA)); in snd_vt1724_read_i2c()
2255 mutex_unlock(&ice->i2c_mutex); in snd_vt1724_read_i2c()
2257 dev_dbg(ice->card->dev, "i2c_read: [0x%x,0x%x] = 0x%x\n", dev, addr, val); in snd_vt1724_read_i2c()
2262 void snd_vt1724_write_i2c(struct snd_ice1712 *ice, in snd_vt1724_write_i2c() argument
2265 mutex_lock(&ice->i2c_mutex); in snd_vt1724_write_i2c()
2266 wait_i2c_busy(ice); in snd_vt1724_write_i2c()
2268 dev_dbg(ice->card->dev, "i2c_write: [0x%x,0x%x] = 0x%x\n", dev, addr, data); in snd_vt1724_write_i2c()
2270 outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR)); in snd_vt1724_write_i2c()
2271 outb(data, ICEREG1724(ice, I2C_DATA)); in snd_vt1724_write_i2c()
2272 outb(dev | VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR)); in snd_vt1724_write_i2c()
2273 wait_i2c_busy(ice); in snd_vt1724_write_i2c()
2274 mutex_unlock(&ice->i2c_mutex); in snd_vt1724_write_i2c()
2277 static int snd_vt1724_read_eeprom(struct snd_ice1712 *ice, in snd_vt1724_read_eeprom() argument
2285 ice->eeprom.subvendor = 0; in snd_vt1724_read_eeprom()
2286 if ((inb(ICEREG1724(ice, I2C_CTRL)) & VT1724_I2C_EEPROM) != 0) in snd_vt1724_read_eeprom()
2287 ice->eeprom.subvendor = in snd_vt1724_read_eeprom()
2288 (snd_vt1724_read_i2c(ice, dev, 0x00) << 0) | in snd_vt1724_read_eeprom()
2289 (snd_vt1724_read_i2c(ice, dev, 0x01) << 8) | in snd_vt1724_read_eeprom()
2290 (snd_vt1724_read_i2c(ice, dev, 0x02) << 16) | in snd_vt1724_read_eeprom()
2291 (snd_vt1724_read_i2c(ice, dev, 0x03) << 24); in snd_vt1724_read_eeprom()
2292 if (ice->eeprom.subvendor == 0 || in snd_vt1724_read_eeprom()
2293 ice->eeprom.subvendor == (unsigned int)-1) { in snd_vt1724_read_eeprom()
2298 pci_read_config_word(ice->pci, PCI_SUBSYSTEM_VENDOR_ID, in snd_vt1724_read_eeprom()
2300 pci_read_config_word(ice->pci, PCI_SUBSYSTEM_ID, &device); in snd_vt1724_read_eeprom()
2301 ice->eeprom.subvendor = in snd_vt1724_read_eeprom()
2303 if (ice->eeprom.subvendor == 0 || in snd_vt1724_read_eeprom()
2304 ice->eeprom.subvendor == (unsigned int)-1) { in snd_vt1724_read_eeprom()
2305 dev_err(ice->card->dev, in snd_vt1724_read_eeprom()
2315 dev_info(ice->card->dev, in snd_vt1724_read_eeprom()
2318 ice->eeprom.subvendor = c->subvendor; in snd_vt1724_read_eeprom()
2319 } else if (c->subvendor != ice->eeprom.subvendor) in snd_vt1724_read_eeprom()
2321 ice->card_info = c; in snd_vt1724_read_eeprom()
2325 dev_dbg(ice->card->dev, "using the defined eeprom..\n"); in snd_vt1724_read_eeprom()
2326 ice->eeprom.version = 2; in snd_vt1724_read_eeprom()
2327 ice->eeprom.size = c->eeprom_size + 6; in snd_vt1724_read_eeprom()
2328 memcpy(ice->eeprom.data, c->eeprom_data, c->eeprom_size); in snd_vt1724_read_eeprom()
2332 dev_warn(ice->card->dev, "No matching model found for ID 0x%x\n", in snd_vt1724_read_eeprom()
2333 ice->eeprom.subvendor); in snd_vt1724_read_eeprom()
2336 ice->pm_suspend_enabled = 1; in snd_vt1724_read_eeprom()
2340 ice->eeprom.size = snd_vt1724_read_i2c(ice, dev, 0x04); in snd_vt1724_read_eeprom()
2341 if (ice->eeprom.size < 6) in snd_vt1724_read_eeprom()
2342 ice->eeprom.size = 32; in snd_vt1724_read_eeprom()
2343 else if (ice->eeprom.size > 32) { in snd_vt1724_read_eeprom()
2344 dev_err(ice->card->dev, "Invalid EEPROM (size = %i)\n", in snd_vt1724_read_eeprom()
2345 ice->eeprom.size); in snd_vt1724_read_eeprom()
2348 ice->eeprom.version = snd_vt1724_read_i2c(ice, dev, 0x05); in snd_vt1724_read_eeprom()
2349 if (ice->eeprom.version != 1 && ice->eeprom.version != 2) in snd_vt1724_read_eeprom()
2350 dev_warn(ice->card->dev, "Invalid EEPROM version %i\n", in snd_vt1724_read_eeprom()
2351 ice->eeprom.version); in snd_vt1724_read_eeprom()
2352 size = ice->eeprom.size - 6; in snd_vt1724_read_eeprom()
2354 ice->eeprom.data[i] = snd_vt1724_read_i2c(ice, dev, i + 6); in snd_vt1724_read_eeprom()
2357 ice->eeprom.gpiomask = eeprom_triple(ice, ICE_EEP2_GPIO_MASK); in snd_vt1724_read_eeprom()
2358 ice->eeprom.gpiostate = eeprom_triple(ice, ICE_EEP2_GPIO_STATE); in snd_vt1724_read_eeprom()
2359 ice->eeprom.gpiodir = eeprom_triple(ice, ICE_EEP2_GPIO_DIR); in snd_vt1724_read_eeprom()
2366 static void snd_vt1724_chip_reset(struct snd_ice1712 *ice) in snd_vt1724_chip_reset() argument
2368 outb(VT1724_RESET , ICEREG1724(ice, CONTROL)); in snd_vt1724_chip_reset()
2369 inb(ICEREG1724(ice, CONTROL)); /* pci posting flush */ in snd_vt1724_chip_reset()
2371 outb(0, ICEREG1724(ice, CONTROL)); in snd_vt1724_chip_reset()
2372 inb(ICEREG1724(ice, CONTROL)); /* pci posting flush */ in snd_vt1724_chip_reset()
2376 static int snd_vt1724_chip_init(struct snd_ice1712 *ice) in snd_vt1724_chip_init() argument
2378 outb(ice->eeprom.data[ICE_EEP2_SYSCONF], ICEREG1724(ice, SYS_CFG)); in snd_vt1724_chip_init()
2379 outb(ice->eeprom.data[ICE_EEP2_ACLINK], ICEREG1724(ice, AC97_CFG)); in snd_vt1724_chip_init()
2380 outb(ice->eeprom.data[ICE_EEP2_I2S], ICEREG1724(ice, I2S_FEATURES)); in snd_vt1724_chip_init()
2381 outb(ice->eeprom.data[ICE_EEP2_SPDIF], ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_chip_init()
2383 ice->gpio.write_mask = ice->eeprom.gpiomask; in snd_vt1724_chip_init()
2384 ice->gpio.direction = ice->eeprom.gpiodir; in snd_vt1724_chip_init()
2385 snd_vt1724_set_gpio_mask(ice, ice->eeprom.gpiomask); in snd_vt1724_chip_init()
2386 snd_vt1724_set_gpio_dir(ice, ice->eeprom.gpiodir); in snd_vt1724_chip_init()
2387 snd_vt1724_set_gpio_data(ice, ice->eeprom.gpiostate); in snd_vt1724_chip_init()
2389 outb(0, ICEREG1724(ice, POWERDOWN)); in snd_vt1724_chip_init()
2392 outb(VT1724_IRQ_MPU_RX | VT1724_IRQ_MPU_TX , ICEREG1724(ice, IRQMASK)); in snd_vt1724_chip_init()
2397 outb(VT1724_MULTI_FIFO_ERR, ICEMT1724(ice, DMA_INT_MASK)); in snd_vt1724_chip_init()
2402 static int snd_vt1724_spdif_build_controls(struct snd_ice1712 *ice) in snd_vt1724_spdif_build_controls() argument
2407 if (snd_BUG_ON(!ice->pcm)) in snd_vt1724_spdif_build_controls()
2410 if (!ice->own_routing) { in snd_vt1724_spdif_build_controls()
2411 err = snd_ctl_add(ice->card, in snd_vt1724_spdif_build_controls()
2412 snd_ctl_new1(&snd_vt1724_mixer_pro_spdif_route, ice)); in snd_vt1724_spdif_build_controls()
2417 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_spdif_switch, ice)); in snd_vt1724_spdif_build_controls()
2421 err = snd_ctl_add(ice->card, kctl = snd_ctl_new1(&snd_vt1724_spdif_default, ice)); in snd_vt1724_spdif_build_controls()
2424 kctl->id.device = ice->pcm->device; in snd_vt1724_spdif_build_controls()
2425 err = snd_ctl_add(ice->card, kctl = snd_ctl_new1(&snd_vt1724_spdif_maskc, ice)); in snd_vt1724_spdif_build_controls()
2428 kctl->id.device = ice->pcm->device; in snd_vt1724_spdif_build_controls()
2429 err = snd_ctl_add(ice->card, kctl = snd_ctl_new1(&snd_vt1724_spdif_maskp, ice)); in snd_vt1724_spdif_build_controls()
2432 kctl->id.device = ice->pcm->device; in snd_vt1724_spdif_build_controls()
2434 err = snd_ctl_add(ice->card, kctl = snd_ctl_new1(&snd_vt1724_spdif_stream, ice)); in snd_vt1724_spdif_build_controls()
2437 kctl->id.device = ice->pcm->device; in snd_vt1724_spdif_build_controls()
2438 ice->spdif.stream_ctl = kctl; in snd_vt1724_spdif_build_controls()
2444 static int snd_vt1724_build_controls(struct snd_ice1712 *ice) in snd_vt1724_build_controls() argument
2448 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_eeprom, ice)); in snd_vt1724_build_controls()
2451 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_pro_internal_clock, ice)); in snd_vt1724_build_controls()
2455 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_pro_rate_locking, ice)); in snd_vt1724_build_controls()
2458 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_pro_rate_reset, ice)); in snd_vt1724_build_controls()
2462 if (!ice->own_routing && ice->num_total_dacs > 0) { in snd_vt1724_build_controls()
2464 tmp.count = ice->num_total_dacs; in snd_vt1724_build_controls()
2465 if (ice->vt1720 && tmp.count > 2) in snd_vt1724_build_controls()
2467 err = snd_ctl_add(ice->card, snd_ctl_new1(&tmp, ice)); in snd_vt1724_build_controls()
2472 return snd_ctl_add(ice->card, in snd_vt1724_build_controls()
2473 snd_ctl_new1(&snd_vt1724_mixer_pro_peak, ice)); in snd_vt1724_build_controls()
2476 static int snd_vt1724_free(struct snd_ice1712 *ice) in snd_vt1724_free() argument
2478 if (!ice->port) in snd_vt1724_free()
2481 outb(0xff, ICEMT1724(ice, DMA_INT_MASK)); in snd_vt1724_free()
2482 outb(0xff, ICEREG1724(ice, IRQMASK)); in snd_vt1724_free()
2485 if (ice->irq >= 0) in snd_vt1724_free()
2486 free_irq(ice->irq, ice); in snd_vt1724_free()
2487 pci_release_regions(ice->pci); in snd_vt1724_free()
2488 snd_ice1712_akm4xxx_free(ice); in snd_vt1724_free()
2489 pci_disable_device(ice->pci); in snd_vt1724_free()
2490 kfree(ice->spec); in snd_vt1724_free()
2491 kfree(ice); in snd_vt1724_free()
2497 struct snd_ice1712 *ice = device->device_data; in snd_vt1724_dev_free() local
2498 return snd_vt1724_free(ice); in snd_vt1724_dev_free()
2506 struct snd_ice1712 *ice; in snd_vt1724_create() local
2519 ice = kzalloc(sizeof(*ice), GFP_KERNEL); in snd_vt1724_create()
2520 if (ice == NULL) { in snd_vt1724_create()
2524 ice->vt1724 = 1; in snd_vt1724_create()
2525 spin_lock_init(&ice->reg_lock); in snd_vt1724_create()
2526 mutex_init(&ice->gpio_mutex); in snd_vt1724_create()
2527 mutex_init(&ice->open_mutex); in snd_vt1724_create()
2528 mutex_init(&ice->i2c_mutex); in snd_vt1724_create()
2529 ice->gpio.set_mask = snd_vt1724_set_gpio_mask; in snd_vt1724_create()
2530 ice->gpio.get_mask = snd_vt1724_get_gpio_mask; in snd_vt1724_create()
2531 ice->gpio.set_dir = snd_vt1724_set_gpio_dir; in snd_vt1724_create()
2532 ice->gpio.get_dir = snd_vt1724_get_gpio_dir; in snd_vt1724_create()
2533 ice->gpio.set_data = snd_vt1724_set_gpio_data; in snd_vt1724_create()
2534 ice->gpio.get_data = snd_vt1724_get_gpio_data; in snd_vt1724_create()
2535 ice->card = card; in snd_vt1724_create()
2536 ice->pci = pci; in snd_vt1724_create()
2537 ice->irq = -1; in snd_vt1724_create()
2539 snd_vt1724_proc_init(ice); in snd_vt1724_create()
2541 card->private_data = ice; in snd_vt1724_create()
2545 kfree(ice); in snd_vt1724_create()
2549 ice->port = pci_resource_start(pci, 0); in snd_vt1724_create()
2550 ice->profi_port = pci_resource_start(pci, 1); in snd_vt1724_create()
2553 IRQF_SHARED, KBUILD_MODNAME, ice)) { in snd_vt1724_create()
2555 snd_vt1724_free(ice); in snd_vt1724_create()
2559 ice->irq = pci->irq; in snd_vt1724_create()
2560 card->sync_irq = ice->irq; in snd_vt1724_create()
2562 snd_vt1724_chip_reset(ice); in snd_vt1724_create()
2563 if (snd_vt1724_read_eeprom(ice, modelname) < 0) { in snd_vt1724_create()
2564 snd_vt1724_free(ice); in snd_vt1724_create()
2567 if (snd_vt1724_chip_init(ice) < 0) { in snd_vt1724_create()
2568 snd_vt1724_free(ice); in snd_vt1724_create()
2572 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, ice, &ops); in snd_vt1724_create()
2574 snd_vt1724_free(ice); in snd_vt1724_create()
2578 *r_ice1712 = ice; in snd_vt1724_create()
2594 struct snd_ice1712 *ice; in snd_vt1724_probe() local
2613 err = snd_vt1724_create(card, pci, model[dev], &ice); in snd_vt1724_probe()
2620 ice->ext_clock_count = 0; in snd_vt1724_probe()
2626 (c->subvendor == ice->eeprom.subvendor)) { in snd_vt1724_probe()
2631 err = c->chip_init(ice); in snd_vt1724_probe()
2651 ice->pro_rate_default = PRO_RATE_DEFAULT; in snd_vt1724_probe()
2652 if (!ice->is_spdif_master) in snd_vt1724_probe()
2653 ice->is_spdif_master = stdclock_is_spdif_master; in snd_vt1724_probe()
2654 if (!ice->get_rate) in snd_vt1724_probe()
2655 ice->get_rate = stdclock_get_rate; in snd_vt1724_probe()
2656 if (!ice->set_rate) in snd_vt1724_probe()
2657 ice->set_rate = stdclock_set_rate; in snd_vt1724_probe()
2658 if (!ice->set_mclk) in snd_vt1724_probe()
2659 ice->set_mclk = stdclock_set_mclk; in snd_vt1724_probe()
2660 if (!ice->set_spdif_clock) in snd_vt1724_probe()
2661 ice->set_spdif_clock = stdclock_set_spdif_clock; in snd_vt1724_probe()
2662 if (!ice->get_spdif_master_type) in snd_vt1724_probe()
2663 ice->get_spdif_master_type = stdclock_get_spdif_master_type; in snd_vt1724_probe()
2664 if (!ice->ext_clock_names) in snd_vt1724_probe()
2665 ice->ext_clock_names = ext_clock_names; in snd_vt1724_probe()
2666 if (!ice->ext_clock_count) in snd_vt1724_probe()
2667 ice->ext_clock_count = ARRAY_SIZE(ext_clock_names); in snd_vt1724_probe()
2669 if (!ice->hw_rates) in snd_vt1724_probe()
2670 set_std_hw_rates(ice); in snd_vt1724_probe()
2672 err = snd_vt1724_pcm_profi(ice, pcm_dev++); in snd_vt1724_probe()
2678 err = snd_vt1724_pcm_spdif(ice, pcm_dev++); in snd_vt1724_probe()
2684 err = snd_vt1724_pcm_indep(ice, pcm_dev++); in snd_vt1724_probe()
2690 err = snd_vt1724_ac97_mixer(ice); in snd_vt1724_probe()
2696 err = snd_vt1724_build_controls(ice); in snd_vt1724_probe()
2702 if (ice->pcm && ice->has_spdif) { /* has SPDIF I/O */ in snd_vt1724_probe()
2703 err = snd_vt1724_spdif_build_controls(ice); in snd_vt1724_probe()
2711 err = c->build_controls(ice); in snd_vt1724_probe()
2719 if (ice->eeprom.data[ICE_EEP2_SYSCONF] & VT1724_CFG_MPU401) { in snd_vt1724_probe()
2727 ice->rmidi[0] = rmidi; in snd_vt1724_probe()
2728 rmidi->private_data = ice; in snd_vt1724_probe()
2740 ICEREG1724(ice, MPU_FIFO_WM)); in snd_vt1724_probe()
2741 outb(0x1, ICEREG1724(ice, MPU_FIFO_WM)); in snd_vt1724_probe()
2743 outb(VT1724_MPU_UART, ICEREG1724(ice, MPU_CTRL)); in snd_vt1724_probe()
2748 card->shortname, ice->port, ice->irq); in snd_vt1724_probe()
2763 struct snd_ice1712 *ice = card->private_data; in snd_vt1724_remove() local
2765 if (ice->card_info && ice->card_info->chip_exit) in snd_vt1724_remove()
2766 ice->card_info->chip_exit(ice); in snd_vt1724_remove()
2774 struct snd_ice1712 *ice = card->private_data; in snd_vt1724_suspend() local
2776 if (!ice->pm_suspend_enabled) in snd_vt1724_suspend()
2781 snd_ac97_suspend(ice->ac97); in snd_vt1724_suspend()
2783 spin_lock_irq(&ice->reg_lock); in snd_vt1724_suspend()
2784 ice->pm_saved_is_spdif_master = ice->is_spdif_master(ice); in snd_vt1724_suspend()
2785 ice->pm_saved_spdif_ctrl = inw(ICEMT1724(ice, SPDIF_CTRL)); in snd_vt1724_suspend()
2786 ice->pm_saved_spdif_cfg = inb(ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_suspend()
2787 ice->pm_saved_route = inl(ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_vt1724_suspend()
2788 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_suspend()
2790 if (ice->pm_suspend) in snd_vt1724_suspend()
2791 ice->pm_suspend(ice); in snd_vt1724_suspend()
2798 struct snd_ice1712 *ice = card->private_data; in snd_vt1724_resume() local
2800 if (!ice->pm_suspend_enabled) in snd_vt1724_resume()
2803 snd_vt1724_chip_reset(ice); in snd_vt1724_resume()
2805 if (snd_vt1724_chip_init(ice) < 0) { in snd_vt1724_resume()
2810 if (ice->pm_resume) in snd_vt1724_resume()
2811 ice->pm_resume(ice); in snd_vt1724_resume()
2813 if (ice->pm_saved_is_spdif_master) { in snd_vt1724_resume()
2815 ice->set_spdif_clock(ice, 0); in snd_vt1724_resume()
2819 if (ice->cur_rate) in snd_vt1724_resume()
2820 rate = ice->cur_rate; in snd_vt1724_resume()
2822 rate = ice->pro_rate_default; in snd_vt1724_resume()
2823 snd_vt1724_set_pro_rate(ice, rate, 1); in snd_vt1724_resume()
2826 update_spdif_bits(ice, ice->pm_saved_spdif_ctrl); in snd_vt1724_resume()
2828 outb(ice->pm_saved_spdif_cfg, ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_resume()
2829 outl(ice->pm_saved_route, ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_vt1724_resume()
2831 snd_ac97_resume(ice->ac97); in snd_vt1724_resume()