Lines Matching full:ice
65 { PCI_VDEVICE(ICE, PCI_DEVICE_ID_VT1724), 0 },
87 static inline int stdclock_is_spdif_master(struct snd_ice1712 *ice) in stdclock_is_spdif_master() argument
89 return (inb(ICEMT1724(ice, RATE)) & VT1724_SPDIF_MASTER) ? 1 : 0; in stdclock_is_spdif_master()
95 static inline int is_pro_rate_locked(struct snd_ice1712 *ice) in is_pro_rate_locked() argument
97 return (!ice->is_spdif_master(ice)) && PRO_RATE_LOCKED; in is_pro_rate_locked()
104 static unsigned char snd_vt1724_ac97_ready(struct snd_ice1712 *ice) in snd_vt1724_ac97_ready() argument
109 old_cmd = inb(ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_ready()
116 dev_dbg(ice->card->dev, "snd_vt1724_ac97_ready: timeout\n"); in snd_vt1724_ac97_ready()
120 static int snd_vt1724_ac97_wait_bit(struct snd_ice1712 *ice, unsigned char bit) in snd_vt1724_ac97_wait_bit() argument
124 if ((inb(ICEMT1724(ice, AC97_CMD)) & bit) == 0) in snd_vt1724_ac97_wait_bit()
126 dev_dbg(ice->card->dev, "snd_vt1724_ac97_wait_bit: timeout\n"); in snd_vt1724_ac97_wait_bit()
134 struct snd_ice1712 *ice = ac97->private_data; in snd_vt1724_ac97_write() local
137 old_cmd = snd_vt1724_ac97_ready(ice); in snd_vt1724_ac97_write()
140 outb(reg, ICEMT1724(ice, AC97_INDEX)); in snd_vt1724_ac97_write()
141 outw(val, ICEMT1724(ice, AC97_DATA)); in snd_vt1724_ac97_write()
142 outb(old_cmd | VT1724_AC97_WRITE, ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_write()
143 snd_vt1724_ac97_wait_bit(ice, VT1724_AC97_WRITE); in snd_vt1724_ac97_write()
148 struct snd_ice1712 *ice = ac97->private_data; in snd_vt1724_ac97_read() local
151 old_cmd = snd_vt1724_ac97_ready(ice); in snd_vt1724_ac97_read()
154 outb(reg, ICEMT1724(ice, AC97_INDEX)); in snd_vt1724_ac97_read()
155 outb(old_cmd | VT1724_AC97_READ, ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_read()
156 if (snd_vt1724_ac97_wait_bit(ice, VT1724_AC97_READ) < 0) in snd_vt1724_ac97_read()
158 return inw(ICEMT1724(ice, AC97_DATA)); in snd_vt1724_ac97_read()
167 static void snd_vt1724_set_gpio_dir(struct snd_ice1712 *ice, unsigned int data) in snd_vt1724_set_gpio_dir() argument
169 outl(data, ICEREG1724(ice, GPIO_DIRECTION)); in snd_vt1724_set_gpio_dir()
170 inw(ICEREG1724(ice, GPIO_DIRECTION)); /* dummy read for pci-posting */ in snd_vt1724_set_gpio_dir()
174 static unsigned int snd_vt1724_get_gpio_dir(struct snd_ice1712 *ice) in snd_vt1724_get_gpio_dir() argument
176 return inl(ICEREG1724(ice, GPIO_DIRECTION)); in snd_vt1724_get_gpio_dir()
180 static void snd_vt1724_set_gpio_mask(struct snd_ice1712 *ice, unsigned int data) in snd_vt1724_set_gpio_mask() argument
182 outw(data, ICEREG1724(ice, GPIO_WRITE_MASK)); in snd_vt1724_set_gpio_mask()
183 if (!ice->vt1720) /* VT1720 supports only 16 GPIO bits */ in snd_vt1724_set_gpio_mask()
184 outb((data >> 16) & 0xff, ICEREG1724(ice, GPIO_WRITE_MASK_22)); in snd_vt1724_set_gpio_mask()
185 inw(ICEREG1724(ice, GPIO_WRITE_MASK)); /* dummy read for pci-posting */ in snd_vt1724_set_gpio_mask()
188 static unsigned int snd_vt1724_get_gpio_mask(struct snd_ice1712 *ice) in snd_vt1724_get_gpio_mask() argument
191 if (!ice->vt1720) in snd_vt1724_get_gpio_mask()
192 mask = (unsigned int)inb(ICEREG1724(ice, GPIO_WRITE_MASK_22)); in snd_vt1724_get_gpio_mask()
195 mask = (mask << 16) | inw(ICEREG1724(ice, GPIO_WRITE_MASK)); in snd_vt1724_get_gpio_mask()
199 static void snd_vt1724_set_gpio_data(struct snd_ice1712 *ice, unsigned int data) in snd_vt1724_set_gpio_data() argument
201 outw(data, ICEREG1724(ice, GPIO_DATA)); in snd_vt1724_set_gpio_data()
202 if (!ice->vt1720) in snd_vt1724_set_gpio_data()
203 outb(data >> 16, ICEREG1724(ice, GPIO_DATA_22)); in snd_vt1724_set_gpio_data()
204 inw(ICEREG1724(ice, GPIO_DATA)); /* dummy read for pci-posting */ in snd_vt1724_set_gpio_data()
207 static unsigned int snd_vt1724_get_gpio_data(struct snd_ice1712 *ice) in snd_vt1724_get_gpio_data() argument
210 if (!ice->vt1720) in snd_vt1724_get_gpio_data()
211 data = (unsigned int)inb(ICEREG1724(ice, GPIO_DATA_22)); in snd_vt1724_get_gpio_data()
214 data = (data << 16) | inw(ICEREG1724(ice, GPIO_DATA)); in snd_vt1724_get_gpio_data()
222 static void vt1724_midi_clear_rx(struct snd_ice1712 *ice) in vt1724_midi_clear_rx() argument
226 for (count = inb(ICEREG1724(ice, MPU_RXFIFO)); count > 0; --count) in vt1724_midi_clear_rx()
227 inb(ICEREG1724(ice, MPU_DATA)); in vt1724_midi_clear_rx()
231 get_rawmidi_substream(struct snd_ice1712 *ice, unsigned int stream) in get_rawmidi_substream() argument
233 return list_first_entry(&ice->rmidi[0]->streams[stream].substreams, in get_rawmidi_substream()
237 static void enable_midi_irq(struct snd_ice1712 *ice, u8 flag, int enable);
239 static void vt1724_midi_write(struct snd_ice1712 *ice) in vt1724_midi_write() argument
245 s = get_rawmidi_substream(ice, SNDRV_RAWMIDI_STREAM_OUTPUT); in vt1724_midi_write()
246 count = 31 - inb(ICEREG1724(ice, MPU_TXFIFO)); in vt1724_midi_write()
250 outb(buffer[i], ICEREG1724(ice, MPU_DATA)); in vt1724_midi_write()
255 enable_midi_irq(ice, VT1724_IRQ_MPU_TX, in vt1724_midi_write()
259 static void vt1724_midi_read(struct snd_ice1712 *ice) in vt1724_midi_read() argument
265 s = get_rawmidi_substream(ice, SNDRV_RAWMIDI_STREAM_INPUT); in vt1724_midi_read()
266 count = inb(ICEREG1724(ice, MPU_RXFIFO)); in vt1724_midi_read()
270 buffer[i] = inb(ICEREG1724(ice, MPU_DATA)); in vt1724_midi_read()
275 /* call with ice->reg_lock */
276 static void enable_midi_irq(struct snd_ice1712 *ice, u8 flag, int enable) in enable_midi_irq() argument
278 u8 mask = inb(ICEREG1724(ice, IRQMASK)); in enable_midi_irq()
283 outb(mask, ICEREG1724(ice, IRQMASK)); in enable_midi_irq()
289 struct snd_ice1712 *ice = substream->rmidi->private_data; in vt1724_enable_midi_irq() local
291 spin_lock_irq(&ice->reg_lock); in vt1724_enable_midi_irq()
292 enable_midi_irq(ice, flag, enable); in vt1724_enable_midi_irq()
293 spin_unlock_irq(&ice->reg_lock); in vt1724_enable_midi_irq()
308 struct snd_ice1712 *ice = s->rmidi->private_data; in vt1724_midi_output_trigger() local
311 spin_lock_irqsave(&ice->reg_lock, flags); in vt1724_midi_output_trigger()
313 ice->midi_output = 1; in vt1724_midi_output_trigger()
314 vt1724_midi_write(ice); in vt1724_midi_output_trigger()
316 ice->midi_output = 0; in vt1724_midi_output_trigger()
317 enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0); in vt1724_midi_output_trigger()
319 spin_unlock_irqrestore(&ice->reg_lock, flags); in vt1724_midi_output_trigger()
324 struct snd_ice1712 *ice = s->rmidi->private_data; in vt1724_midi_output_drain() local
331 if (inb(ICEREG1724(ice, MPU_CTRL)) & VT1724_MPU_TX_EMPTY) in vt1724_midi_output_drain()
359 struct snd_ice1712 *ice = s->rmidi->private_data; in vt1724_midi_input_trigger() local
362 spin_lock_irqsave(&ice->reg_lock, flags); in vt1724_midi_input_trigger()
364 ice->midi_input = 1; in vt1724_midi_input_trigger()
365 vt1724_midi_read(ice); in vt1724_midi_input_trigger()
367 ice->midi_input = 0; in vt1724_midi_input_trigger()
369 spin_unlock_irqrestore(&ice->reg_lock, flags); in vt1724_midi_input_trigger()
385 struct snd_ice1712 *ice = dev_id; in snd_vt1724_interrupt() local
393 status = inb(ICEREG1724(ice, IRQSTAT)); in snd_vt1724_interrupt()
397 spin_lock(&ice->reg_lock); in snd_vt1724_interrupt()
399 status = inb(ICEREG1724(ice, IRQSTAT)); in snd_vt1724_interrupt()
400 dev_err(ice->card->dev, in snd_vt1724_interrupt()
403 dev_err(ice->card->dev, "Disabling MPU_TX\n"); in snd_vt1724_interrupt()
404 enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0); in snd_vt1724_interrupt()
406 spin_unlock(&ice->reg_lock); in snd_vt1724_interrupt()
411 if (ice->midi_output) in snd_vt1724_interrupt()
412 vt1724_midi_write(ice); in snd_vt1724_interrupt()
414 enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0); in snd_vt1724_interrupt()
423 if (ice->midi_input) in snd_vt1724_interrupt()
424 vt1724_midi_read(ice); in snd_vt1724_interrupt()
426 vt1724_midi_clear_rx(ice); in snd_vt1724_interrupt()
429 outb(status, ICEREG1724(ice, IRQSTAT)); in snd_vt1724_interrupt()
430 spin_unlock(&ice->reg_lock); in snd_vt1724_interrupt()
443 unsigned char mtstat = inb(ICEMT1724(ice, IRQ)); in snd_vt1724_interrupt()
445 if (ice->playback_pro_substream) in snd_vt1724_interrupt()
446 snd_pcm_period_elapsed(ice->playback_pro_substream); in snd_vt1724_interrupt()
449 if (ice->capture_pro_substream) in snd_vt1724_interrupt()
450 snd_pcm_period_elapsed(ice->capture_pro_substream); in snd_vt1724_interrupt()
453 if (ice->playback_con_substream_ds[0]) in snd_vt1724_interrupt()
454 snd_pcm_period_elapsed(ice->playback_con_substream_ds[0]); in snd_vt1724_interrupt()
457 if (ice->playback_con_substream_ds[1]) in snd_vt1724_interrupt()
458 snd_pcm_period_elapsed(ice->playback_con_substream_ds[1]); in snd_vt1724_interrupt()
461 if (ice->playback_con_substream_ds[2]) in snd_vt1724_interrupt()
462 snd_pcm_period_elapsed(ice->playback_con_substream_ds[2]); in snd_vt1724_interrupt()
465 if (ice->playback_con_substream) in snd_vt1724_interrupt()
466 snd_pcm_period_elapsed(ice->playback_con_substream); in snd_vt1724_interrupt()
469 if (ice->capture_con_substream) in snd_vt1724_interrupt()
470 snd_pcm_period_elapsed(ice->capture_con_substream); in snd_vt1724_interrupt()
473 outb(mtstat, ICEMT1724(ice, IRQ)); in snd_vt1724_interrupt()
476 unsigned char fstat = inb(ICEMT1724(ice, DMA_FIFO_ERR)); in snd_vt1724_interrupt()
477 outb(fstat, ICEMT1724(ice, DMA_FIFO_ERR)); in snd_vt1724_interrupt()
478 outb(VT1724_MULTI_FIFO_ERR | inb(ICEMT1724(ice, DMA_INT_MASK)), ICEMT1724(ice, DMA_INT_MASK)); in snd_vt1724_interrupt()
524 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_trigger() local
531 if (snd_pcm_substream_chip(s) == ice) { in snd_vt1724_pcm_trigger()
542 spin_lock(&ice->reg_lock); in snd_vt1724_pcm_trigger()
543 old = inb(ICEMT1724(ice, DMA_PAUSE)); in snd_vt1724_pcm_trigger()
548 outb(old, ICEMT1724(ice, DMA_PAUSE)); in snd_vt1724_pcm_trigger()
549 spin_unlock(&ice->reg_lock); in snd_vt1724_pcm_trigger()
555 spin_lock(&ice->reg_lock); in snd_vt1724_pcm_trigger()
556 old = inb(ICEMT1724(ice, DMA_CONTROL)); in snd_vt1724_pcm_trigger()
561 outb(old, ICEMT1724(ice, DMA_CONTROL)); in snd_vt1724_pcm_trigger()
562 spin_unlock(&ice->reg_lock); in snd_vt1724_pcm_trigger()
588 static unsigned int stdclock_get_rate(struct snd_ice1712 *ice) in stdclock_get_rate() argument
590 return stdclock_rate_list[inb(ICEMT1724(ice, RATE)) & 15]; in stdclock_get_rate()
593 static void stdclock_set_rate(struct snd_ice1712 *ice, unsigned int rate) in stdclock_set_rate() argument
598 outb(i, ICEMT1724(ice, RATE)); in stdclock_set_rate()
604 static unsigned char stdclock_set_mclk(struct snd_ice1712 *ice, in stdclock_set_mclk() argument
609 if (ice->eeprom.data[ICE_EEP2_ACLINK] & VT1724_CFG_PRO_I2S) { in stdclock_set_mclk()
610 val = old = inb(ICEMT1724(ice, I2S_FORMAT)); in stdclock_set_mclk()
616 outb(val, ICEMT1724(ice, I2S_FORMAT)); in stdclock_set_mclk()
625 static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate, in snd_vt1724_set_pro_rate() argument
633 if (rate > ice->hw_rates->list[ice->hw_rates->count - 1]) in snd_vt1724_set_pro_rate()
636 spin_lock_irqsave(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
637 if ((inb(ICEMT1724(ice, DMA_CONTROL)) & DMA_STARTS) || in snd_vt1724_set_pro_rate()
638 (inb(ICEMT1724(ice, DMA_PAUSE)) & DMA_PAUSES)) { in snd_vt1724_set_pro_rate()
640 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
641 return ((rate == ice->cur_rate) && !force) ? 0 : -EBUSY; in snd_vt1724_set_pro_rate()
643 if (!force && is_pro_rate_locked(ice)) { in snd_vt1724_set_pro_rate()
646 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
647 return (rate == ice->cur_rate) ? 0 : -EBUSY; in snd_vt1724_set_pro_rate()
650 if (force || !ice->is_spdif_master(ice)) { in snd_vt1724_set_pro_rate()
653 old_rate = ice->get_rate(ice); in snd_vt1724_set_pro_rate()
656 else if (rate == ice->cur_rate) { in snd_vt1724_set_pro_rate()
657 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
662 ice->cur_rate = rate; in snd_vt1724_set_pro_rate()
663 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
666 ice->set_rate(ice, rate); in snd_vt1724_set_pro_rate()
669 mclk_change = ice->set_mclk(ice, rate); in snd_vt1724_set_pro_rate()
671 if (mclk_change && ice->gpio.i2s_mclk_changed) in snd_vt1724_set_pro_rate()
672 ice->gpio.i2s_mclk_changed(ice); in snd_vt1724_set_pro_rate()
673 if (ice->gpio.set_pro_rate) in snd_vt1724_set_pro_rate()
674 ice->gpio.set_pro_rate(ice, rate); in snd_vt1724_set_pro_rate()
677 for (i = 0; i < ice->akm_codecs; i++) { in snd_vt1724_set_pro_rate()
678 if (ice->akm[i].ops.set_rate_val) in snd_vt1724_set_pro_rate()
679 ice->akm[i].ops.set_rate_val(&ice->akm[i], rate); in snd_vt1724_set_pro_rate()
681 if (ice->spdif.ops.setup_rate) in snd_vt1724_set_pro_rate()
682 ice->spdif.ops.setup_rate(ice, rate); in snd_vt1724_set_pro_rate()
690 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_hw_params() local
694 mutex_lock(&ice->open_mutex); in snd_vt1724_pcm_hw_params()
696 if (substream == ice->playback_pro_substream) { in snd_vt1724_pcm_hw_params()
700 if (ice->pcm_reserved[i] && in snd_vt1724_pcm_hw_params()
701 ice->pcm_reserved[i] != substream) { in snd_vt1724_pcm_hw_params()
702 mutex_unlock(&ice->open_mutex); in snd_vt1724_pcm_hw_params()
705 ice->pcm_reserved[i] = substream; in snd_vt1724_pcm_hw_params()
708 if (ice->pcm_reserved[i] == substream) in snd_vt1724_pcm_hw_params()
709 ice->pcm_reserved[i] = NULL; in snd_vt1724_pcm_hw_params()
714 if (ice->playback_con_substream_ds[i] == substream) { in snd_vt1724_pcm_hw_params()
715 if (ice->pcm_reserved[i] && in snd_vt1724_pcm_hw_params()
716 ice->pcm_reserved[i] != substream) { in snd_vt1724_pcm_hw_params()
717 mutex_unlock(&ice->open_mutex); in snd_vt1724_pcm_hw_params()
720 ice->pcm_reserved[i] = substream; in snd_vt1724_pcm_hw_params()
725 mutex_unlock(&ice->open_mutex); in snd_vt1724_pcm_hw_params()
727 return snd_vt1724_set_pro_rate(ice, params_rate(hw_params), 0); in snd_vt1724_pcm_hw_params()
732 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_hw_free() local
735 mutex_lock(&ice->open_mutex); in snd_vt1724_pcm_hw_free()
738 if (ice->pcm_reserved[i] == substream) in snd_vt1724_pcm_hw_free()
739 ice->pcm_reserved[i] = NULL; in snd_vt1724_pcm_hw_free()
740 mutex_unlock(&ice->open_mutex); in snd_vt1724_pcm_hw_free()
746 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_pro_prepare() local
750 spin_lock_irq(&ice->reg_lock); in snd_vt1724_playback_pro_prepare()
752 outb(val, ICEMT1724(ice, BURST)); in snd_vt1724_playback_pro_prepare()
754 outl(substream->runtime->dma_addr, ICEMT1724(ice, PLAYBACK_ADDR)); in snd_vt1724_playback_pro_prepare()
757 /* outl(size, ICEMT1724(ice, PLAYBACK_SIZE)); */ in snd_vt1724_playback_pro_prepare()
758 outw(size, ICEMT1724(ice, PLAYBACK_SIZE)); in snd_vt1724_playback_pro_prepare()
759 outb(size >> 16, ICEMT1724(ice, PLAYBACK_SIZE) + 2); in snd_vt1724_playback_pro_prepare()
761 /* outl(size, ICEMT1724(ice, PLAYBACK_COUNT)); */ in snd_vt1724_playback_pro_prepare()
762 outw(size, ICEMT1724(ice, PLAYBACK_COUNT)); in snd_vt1724_playback_pro_prepare()
763 outb(size >> 16, ICEMT1724(ice, PLAYBACK_COUNT) + 2); in snd_vt1724_playback_pro_prepare()
765 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_playback_pro_prepare()
768 dev_dbg(ice->card->dev, "pro prepare: ch = %d, addr = 0x%x, " in snd_vt1724_playback_pro_prepare()
780 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_pro_pointer() local
783 if (!(inl(ICEMT1724(ice, DMA_CONTROL)) & VT1724_PDMA0_START)) in snd_vt1724_playback_pro_pointer()
786 ptr = inl(ICEMT1724(ice, PLAYBACK_ADDR)); in snd_vt1724_playback_pro_pointer()
788 dev_dbg(ice->card->dev, "invalid negative ptr\n"); in snd_vt1724_playback_pro_pointer()
794 dev_dbg(ice->card->dev, "invalid ptr %d (size=%d)\n", in snd_vt1724_playback_pro_pointer()
799 ptr = inl(ICEMT1724(ice, PLAYBACK_SIZE)) & 0xffffff; in snd_vt1724_playback_pro_pointer()
807 dev_dbg(ice->card->dev, "invalid ptr %d (size=%d)\n", in snd_vt1724_playback_pro_pointer()
817 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_prepare() local
820 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pcm_prepare()
821 outl(substream->runtime->dma_addr, ice->profi_port + reg->addr); in snd_vt1724_pcm_prepare()
823 ice->profi_port + reg->size); in snd_vt1724_pcm_prepare()
825 ice->profi_port + reg->count); in snd_vt1724_pcm_prepare()
826 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pcm_prepare()
832 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_pointer() local
836 if (!(inl(ICEMT1724(ice, DMA_CONTROL)) & reg->start)) in snd_vt1724_pcm_pointer()
839 ptr = inl(ice->profi_port + reg->addr); in snd_vt1724_pcm_pointer()
843 ptr = inw(ice->profi_port + reg->size); in snd_vt1724_pcm_pointer()
851 dev_dbg(ice->card->dev, "invalid ptr %d (size=%d)\n", in snd_vt1724_pcm_pointer()
952 static void set_std_hw_rates(struct snd_ice1712 *ice) in set_std_hw_rates() argument
954 if (ice->eeprom.data[ICE_EEP2_ACLINK] & VT1724_CFG_PRO_I2S) { in set_std_hw_rates()
957 if ((ice->eeprom.data[ICE_EEP2_I2S] & 0x08) && !ice->vt1720) in set_std_hw_rates()
958 ice->hw_rates = &hw_constraints_rates_192; in set_std_hw_rates()
960 ice->hw_rates = &hw_constraints_rates_96; in set_std_hw_rates()
963 ice->hw_rates = &hw_constraints_rates_48; in set_std_hw_rates()
967 static int set_rate_constraints(struct snd_ice1712 *ice, in set_rate_constraints() argument
972 runtime->hw.rate_min = ice->hw_rates->list[0]; in set_rate_constraints()
973 runtime->hw.rate_max = ice->hw_rates->list[ice->hw_rates->count - 1]; in set_rate_constraints()
977 ice->hw_rates); in set_rate_constraints()
985 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in constrain_rate_if_locked() local
988 if (is_pro_rate_locked(ice)) { in constrain_rate_if_locked()
989 rate = ice->get_rate(ice); in constrain_rate_if_locked()
1007 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_pro_open() local
1011 ice->playback_pro_substream = substream; in snd_vt1724_playback_pro_open()
1015 set_rate_constraints(ice, substream); in snd_vt1724_playback_pro_open()
1016 mutex_lock(&ice->open_mutex); in snd_vt1724_playback_pro_open()
1018 num_indeps = ice->num_total_dacs / 2 - 1; in snd_vt1724_playback_pro_open()
1020 if (ice->pcm_reserved[chs]) in snd_vt1724_playback_pro_open()
1027 mutex_unlock(&ice->open_mutex); in snd_vt1724_playback_pro_open()
1033 if (ice->pro_open) in snd_vt1724_playback_pro_open()
1034 ice->pro_open(ice, substream); in snd_vt1724_playback_pro_open()
1040 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_capture_pro_open() local
1044 ice->capture_pro_substream = substream; in snd_vt1724_capture_pro_open()
1048 set_rate_constraints(ice, substream); in snd_vt1724_capture_pro_open()
1054 if (ice->pro_open) in snd_vt1724_capture_pro_open()
1055 ice->pro_open(ice, substream); in snd_vt1724_capture_pro_open()
1061 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_pro_close() local
1064 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_playback_pro_close()
1065 ice->playback_pro_substream = NULL; in snd_vt1724_playback_pro_close()
1072 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_capture_pro_close() local
1075 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_capture_pro_close()
1076 ice->capture_pro_substream = NULL; in snd_vt1724_capture_pro_close()
1100 static int snd_vt1724_pcm_profi(struct snd_ice1712 *ice, int device) in snd_vt1724_pcm_profi() argument
1105 if ((ice->eeprom.data[ICE_EEP2_SYSCONF] & VT1724_CFG_ADC_MASK) == in snd_vt1724_pcm_profi()
1110 err = snd_pcm_new(ice->card, "ICE1724", device, 1, capt, &pcm); in snd_vt1724_pcm_profi()
1119 pcm->private_data = ice; in snd_vt1724_pcm_profi()
1124 &ice->pci->dev, 256*1024, 256*1024); in snd_vt1724_pcm_profi()
1126 ice->pcm_pro = pcm; in snd_vt1724_pcm_profi()
1137 static void update_spdif_bits(struct snd_ice1712 *ice, unsigned int val) in update_spdif_bits() argument
1141 cbit = inb(ICEREG1724(ice, SPDIF_CFG)); in update_spdif_bits()
1144 outb(disabled, ICEREG1724(ice, SPDIF_CFG)); in update_spdif_bits()
1145 outw(val, ICEMT1724(ice, SPDIF_CTRL)); in update_spdif_bits()
1147 outb(cbit, ICEREG1724(ice, SPDIF_CFG)); in update_spdif_bits()
1148 outw(val, ICEMT1724(ice, SPDIF_CTRL)); in update_spdif_bits()
1152 static void update_spdif_rate(struct snd_ice1712 *ice, unsigned int rate) in update_spdif_rate() argument
1157 spin_lock_irqsave(&ice->reg_lock, flags); in update_spdif_rate()
1158 nval = val = inw(ICEMT1724(ice, SPDIF_CTRL)); in update_spdif_rate()
1170 update_spdif_bits(ice, nval); in update_spdif_rate()
1171 spin_unlock_irqrestore(&ice->reg_lock, flags); in update_spdif_rate()
1176 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_spdif_prepare() local
1177 if (!ice->force_pdma4) in snd_vt1724_playback_spdif_prepare()
1178 update_spdif_rate(ice, substream->runtime->rate); in snd_vt1724_playback_spdif_prepare()
1184 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_spdif_open() local
1188 ice->playback_con_substream = substream; in snd_vt1724_playback_spdif_open()
1189 if (ice->force_pdma4) { in snd_vt1724_playback_spdif_open()
1191 set_rate_constraints(ice, substream); in snd_vt1724_playback_spdif_open()
1201 if (ice->spdif.ops.open) in snd_vt1724_playback_spdif_open()
1202 ice->spdif.ops.open(ice, substream); in snd_vt1724_playback_spdif_open()
1208 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_spdif_close() local
1211 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_playback_spdif_close()
1212 ice->playback_con_substream = NULL; in snd_vt1724_playback_spdif_close()
1213 if (ice->spdif.ops.close) in snd_vt1724_playback_spdif_close()
1214 ice->spdif.ops.close(ice, substream); in snd_vt1724_playback_spdif_close()
1221 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_capture_spdif_open() local
1225 ice->capture_con_substream = substream; in snd_vt1724_capture_spdif_open()
1226 if (ice->force_rdma1) { in snd_vt1724_capture_spdif_open()
1228 set_rate_constraints(ice, substream); in snd_vt1724_capture_spdif_open()
1238 if (ice->spdif.ops.open) in snd_vt1724_capture_spdif_open()
1239 ice->spdif.ops.open(ice, substream); in snd_vt1724_capture_spdif_open()
1245 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_capture_spdif_close() local
1248 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_capture_spdif_close()
1249 ice->capture_con_substream = NULL; in snd_vt1724_capture_spdif_close()
1250 if (ice->spdif.ops.close) in snd_vt1724_capture_spdif_close()
1251 ice->spdif.ops.close(ice, substream); in snd_vt1724_capture_spdif_close()
1277 static int snd_vt1724_pcm_spdif(struct snd_ice1712 *ice, int device) in snd_vt1724_pcm_spdif() argument
1284 if (ice->force_pdma4 || in snd_vt1724_pcm_spdif()
1285 (ice->eeprom.data[ICE_EEP2_SPDIF] & VT1724_CFG_SPDIF_OUT_INT)) { in snd_vt1724_pcm_spdif()
1287 ice->has_spdif = 1; in snd_vt1724_pcm_spdif()
1290 if (ice->force_rdma1 || in snd_vt1724_pcm_spdif()
1291 (ice->eeprom.data[ICE_EEP2_SPDIF] & VT1724_CFG_SPDIF_IN)) { in snd_vt1724_pcm_spdif()
1293 ice->has_spdif = 1; in snd_vt1724_pcm_spdif()
1299 if (ice->force_pdma4 || ice->force_rdma1) in snd_vt1724_pcm_spdif()
1303 err = snd_pcm_new(ice->card, name, device, play, capt, &pcm); in snd_vt1724_pcm_spdif()
1314 pcm->private_data = ice; in snd_vt1724_pcm_spdif()
1319 &ice->pci->dev, 256*1024, 256*1024); in snd_vt1724_pcm_spdif()
1321 ice->pcm = pcm; in snd_vt1724_pcm_spdif()
1354 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_indep_prepare() local
1357 spin_lock_irq(&ice->reg_lock); in snd_vt1724_playback_indep_prepare()
1359 if (inb(ICEMT1724(ice, BURST)) < val) in snd_vt1724_playback_indep_prepare()
1360 outb(val, ICEMT1724(ice, BURST)); in snd_vt1724_playback_indep_prepare()
1361 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_playback_indep_prepare()
1367 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_indep_open() local
1370 mutex_lock(&ice->open_mutex); in snd_vt1724_playback_indep_open()
1372 if (ice->pcm_reserved[substream->number]) { in snd_vt1724_playback_indep_open()
1373 mutex_unlock(&ice->open_mutex); in snd_vt1724_playback_indep_open()
1376 mutex_unlock(&ice->open_mutex); in snd_vt1724_playback_indep_open()
1378 ice->playback_con_substream_ds[substream->number] = substream; in snd_vt1724_playback_indep_open()
1382 set_rate_constraints(ice, substream); in snd_vt1724_playback_indep_open()
1388 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_indep_close() local
1391 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_playback_indep_close()
1392 ice->playback_con_substream_ds[substream->number] = NULL; in snd_vt1724_playback_indep_close()
1393 ice->pcm_reserved[substream->number] = NULL; in snd_vt1724_playback_indep_close()
1409 static int snd_vt1724_pcm_indep(struct snd_ice1712 *ice, int device) in snd_vt1724_pcm_indep() argument
1415 play = ice->num_total_dacs / 2 - 1; in snd_vt1724_pcm_indep()
1419 err = snd_pcm_new(ice->card, "ICE1724 Surrounds", device, play, 0, &pcm); in snd_vt1724_pcm_indep()
1426 pcm->private_data = ice; in snd_vt1724_pcm_indep()
1431 &ice->pci->dev, 256*1024, 256*1024); in snd_vt1724_pcm_indep()
1433 ice->pcm_ds = pcm; in snd_vt1724_pcm_indep()
1443 static int snd_vt1724_ac97_mixer(struct snd_ice1712 *ice) in snd_vt1724_ac97_mixer() argument
1447 if (!(ice->eeprom.data[ICE_EEP2_ACLINK] & VT1724_CFG_PRO_I2S)) { in snd_vt1724_ac97_mixer()
1456 outb(inb(ICEMT1724(ice, AC97_CMD)) | 0x80, ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_mixer()
1458 outb(inb(ICEMT1724(ice, AC97_CMD)) & ~0x80, ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_mixer()
1460 err = snd_ac97_bus(ice->card, 0, &ops, NULL, &pbus); in snd_vt1724_ac97_mixer()
1464 ac97.private_data = ice; in snd_vt1724_ac97_mixer()
1465 err = snd_ac97_mixer(pbus, &ac97, &ice->ac97); in snd_vt1724_ac97_mixer()
1467 dev_warn(ice->card->dev, in snd_vt1724_ac97_mixer()
1473 strcat(ice->card->mixername, "ICE1724 - multitrack"); in snd_vt1724_ac97_mixer()
1481 static inline unsigned int eeprom_triple(struct snd_ice1712 *ice, int idx) in eeprom_triple() argument
1483 return (unsigned int)ice->eeprom.data[idx] | \ in eeprom_triple()
1484 ((unsigned int)ice->eeprom.data[idx + 1] << 8) | \ in eeprom_triple()
1485 ((unsigned int)ice->eeprom.data[idx + 2] << 16); in eeprom_triple()
1491 struct snd_ice1712 *ice = entry->private_data; in snd_vt1724_proc_read() local
1494 snd_iprintf(buffer, "%s\n\n", ice->card->longname); in snd_vt1724_proc_read()
1497 snd_iprintf(buffer, " Subvendor : 0x%x\n", ice->eeprom.subvendor); in snd_vt1724_proc_read()
1498 snd_iprintf(buffer, " Size : %i bytes\n", ice->eeprom.size); in snd_vt1724_proc_read()
1499 snd_iprintf(buffer, " Version : %i\n", ice->eeprom.version); in snd_vt1724_proc_read()
1501 ice->eeprom.data[ICE_EEP2_SYSCONF]); in snd_vt1724_proc_read()
1503 ice->eeprom.data[ICE_EEP2_ACLINK]); in snd_vt1724_proc_read()
1505 ice->eeprom.data[ICE_EEP2_I2S]); in snd_vt1724_proc_read()
1507 ice->eeprom.data[ICE_EEP2_SPDIF]); in snd_vt1724_proc_read()
1509 ice->eeprom.gpiodir); in snd_vt1724_proc_read()
1511 ice->eeprom.gpiomask); in snd_vt1724_proc_read()
1513 ice->eeprom.gpiostate); in snd_vt1724_proc_read()
1514 for (idx = 0x12; idx < ice->eeprom.size; idx++) in snd_vt1724_proc_read()
1516 idx, ice->eeprom.data[idx]); in snd_vt1724_proc_read()
1521 (unsigned)inl(ICEMT1724(ice, ROUTE_PLAYBACK))); in snd_vt1724_proc_read()
1524 idx, inb(ice->port+idx)); in snd_vt1724_proc_read()
1527 idx, inb(ice->profi_port+idx)); in snd_vt1724_proc_read()
1530 static void snd_vt1724_proc_init(struct snd_ice1712 *ice) in snd_vt1724_proc_init() argument
1532 snd_card_ro_proc_new(ice->card, "ice1724", ice, snd_vt1724_proc_read); in snd_vt1724_proc_init()
1550 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_eeprom_get() local
1552 memcpy(ucontrol->value.bytes.data, &ice->eeprom, sizeof(ice->eeprom)); in snd_vt1724_eeprom_get()
1647 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_spdif_default_get() local
1649 val = inw(ICEMT1724(ice, SPDIF_CTRL)); in snd_vt1724_spdif_default_get()
1657 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_spdif_default_put() local
1661 spin_lock_irq(&ice->reg_lock); in snd_vt1724_spdif_default_put()
1662 old = inw(ICEMT1724(ice, SPDIF_CTRL)); in snd_vt1724_spdif_default_put()
1664 update_spdif_bits(ice, val); in snd_vt1724_spdif_default_put()
1665 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_spdif_default_put()
1724 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_spdif_sw_get() local
1725 ucontrol->value.integer.value[0] = inb(ICEREG1724(ice, SPDIF_CFG)) & in snd_vt1724_spdif_sw_get()
1733 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_spdif_sw_put() local
1736 spin_lock_irq(&ice->reg_lock); in snd_vt1724_spdif_sw_put()
1737 old = val = inb(ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_spdif_sw_put()
1742 outb(val, ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_spdif_sw_put()
1743 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_spdif_sw_put()
1769 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
1773 snd_ice1712_save_gpio_status(ice);
1775 (snd_ice1712_gpio_read(ice) & (1 << shift) ? 1 : 0) ^ invert;
1776 snd_ice1712_restore_gpio_status(ice);
1783 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
1791 snd_ice1712_save_gpio_status(ice);
1792 val = snd_ice1712_gpio_read(ice);
1795 snd_ice1712_gpio_write(ice, nval);
1796 snd_ice1712_restore_gpio_status(ice);
1807 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_internal_clock_info() local
1808 int hw_rates_count = ice->hw_rates->count; in snd_vt1724_pro_internal_clock_info()
1815 if (ice->force_rdma1 || in snd_vt1724_pro_internal_clock_info()
1816 (ice->eeprom.data[ICE_EEP2_SPDIF] & VT1724_CFG_SPDIF_IN)) in snd_vt1724_pro_internal_clock_info()
1817 uinfo->value.enumerated.items += ice->ext_clock_count; in snd_vt1724_pro_internal_clock_info()
1824 ice->ext_clock_names[ in snd_vt1724_pro_internal_clock_info()
1829 ice->hw_rates->list[uinfo->value.enumerated.item]); in snd_vt1724_pro_internal_clock_info()
1836 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_internal_clock_get() local
1839 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_get()
1840 if (ice->is_spdif_master(ice)) { in snd_vt1724_pro_internal_clock_get()
1841 ucontrol->value.enumerated.item[0] = ice->hw_rates->count + in snd_vt1724_pro_internal_clock_get()
1842 ice->get_spdif_master_type(ice); in snd_vt1724_pro_internal_clock_get()
1844 rate = ice->get_rate(ice); in snd_vt1724_pro_internal_clock_get()
1846 for (i = 0; i < ice->hw_rates->count; i++) { in snd_vt1724_pro_internal_clock_get()
1847 if (ice->hw_rates->list[i] == rate) { in snd_vt1724_pro_internal_clock_get()
1853 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_get()
1857 static int stdclock_get_spdif_master_type(struct snd_ice1712 *ice) in stdclock_get_spdif_master_type() argument
1864 static int stdclock_set_spdif_clock(struct snd_ice1712 *ice, int type) in stdclock_set_spdif_clock() argument
1868 oval = inb(ICEMT1724(ice, RATE)); in stdclock_set_spdif_clock()
1869 outb(oval | VT1724_SPDIF_MASTER, ICEMT1724(ice, RATE)); in stdclock_set_spdif_clock()
1871 i2s_oval = inb(ICEMT1724(ice, I2S_FORMAT)); in stdclock_set_spdif_clock()
1872 outb(i2s_oval & ~VT1724_MT_I2S_MCLK_128X, ICEMT1724(ice, I2S_FORMAT)); in stdclock_set_spdif_clock()
1880 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_internal_clock_put() local
1883 unsigned int first_ext_clock = ice->hw_rates->count; in snd_vt1724_pro_internal_clock_put()
1885 if (item > first_ext_clock + ice->ext_clock_count - 1) in snd_vt1724_pro_internal_clock_put()
1889 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_put()
1890 if (ice->is_spdif_master(ice)) in snd_vt1724_pro_internal_clock_put()
1893 old_rate = ice->get_rate(ice); in snd_vt1724_pro_internal_clock_put()
1896 ice->set_spdif_clock(ice, item - first_ext_clock); in snd_vt1724_pro_internal_clock_put()
1900 new_rate = ice->hw_rates->list[item]; in snd_vt1724_pro_internal_clock_put()
1901 ice->pro_rate_default = new_rate; in snd_vt1724_pro_internal_clock_put()
1902 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_put()
1903 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 1); in snd_vt1724_pro_internal_clock_put()
1904 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_put()
1906 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_put()
1912 if (ice->gpio.set_pro_rate) in snd_vt1724_pro_internal_clock_put()
1913 ice->gpio.set_pro_rate(ice, 0); in snd_vt1724_pro_internal_clock_put()
1914 for (i = 0; i < ice->akm_codecs; i++) { in snd_vt1724_pro_internal_clock_put()
1915 if (ice->akm[i].ops.set_rate_val) in snd_vt1724_pro_internal_clock_put()
1916 ice->akm[i].ops.set_rate_val(&ice->akm[i], 0); in snd_vt1724_pro_internal_clock_put()
1942 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_rate_locking_put() local
1946 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_rate_locking_put()
1949 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_rate_locking_put()
1973 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_rate_reset_put() local
1977 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_rate_reset_put()
1980 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_rate_reset_put()
2018 int snd_ice1724_get_route_val(struct snd_ice1712 *ice, int shift) in snd_ice1724_get_route_val() argument
2026 val = inl(ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_ice1724_get_route_val()
2037 int snd_ice1724_put_route_val(struct snd_ice1712 *ice, unsigned int val, in snd_ice1724_put_route_val() argument
2051 val = old_val = inl(ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_ice1724_put_route_val()
2056 outl(val, ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_ice1724_put_route_val()
2063 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_route_analog_get() local
2066 snd_ice1724_get_route_val(ice, analog_route_shift(idx)); in snd_vt1724_pro_route_analog_get()
2073 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_route_analog_put() local
2075 return snd_ice1724_put_route_val(ice, in snd_vt1724_pro_route_analog_put()
2083 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_route_spdif_get() local
2086 snd_ice1724_get_route_val(ice, digital_route_shift(idx)); in snd_vt1724_pro_route_spdif_get()
2093 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_route_spdif_put() local
2095 return snd_ice1724_put_route_val(ice, in snd_vt1724_pro_route_spdif_put()
2132 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_peak_get() local
2135 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_peak_get()
2137 outb(idx, ICEMT1724(ice, MONITOR_PEAKINDEX)); in snd_vt1724_pro_peak_get()
2139 inb(ICEMT1724(ice, MONITOR_PEAKDATA)); in snd_vt1724_pro_peak_get()
2141 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_peak_get()
2209 static void wait_i2c_busy(struct snd_ice1712 *ice) in wait_i2c_busy() argument
2212 while ((inb(ICEREG1724(ice, I2C_CTRL)) & VT1724_I2C_BUSY) && t--) in wait_i2c_busy()
2215 dev_err(ice->card->dev, "i2c busy timeout\n"); in wait_i2c_busy()
2218 unsigned char snd_vt1724_read_i2c(struct snd_ice1712 *ice, in snd_vt1724_read_i2c() argument
2223 mutex_lock(&ice->i2c_mutex); in snd_vt1724_read_i2c()
2224 wait_i2c_busy(ice); in snd_vt1724_read_i2c()
2225 outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR)); in snd_vt1724_read_i2c()
2226 outb(dev & ~VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR)); in snd_vt1724_read_i2c()
2227 wait_i2c_busy(ice); in snd_vt1724_read_i2c()
2228 val = inb(ICEREG1724(ice, I2C_DATA)); in snd_vt1724_read_i2c()
2229 mutex_unlock(&ice->i2c_mutex); in snd_vt1724_read_i2c()
2231 dev_dbg(ice->card->dev, "i2c_read: [0x%x,0x%x] = 0x%x\n", dev, addr, val); in snd_vt1724_read_i2c()
2236 void snd_vt1724_write_i2c(struct snd_ice1712 *ice, in snd_vt1724_write_i2c() argument
2239 mutex_lock(&ice->i2c_mutex); in snd_vt1724_write_i2c()
2240 wait_i2c_busy(ice); in snd_vt1724_write_i2c()
2242 dev_dbg(ice->card->dev, "i2c_write: [0x%x,0x%x] = 0x%x\n", dev, addr, data); in snd_vt1724_write_i2c()
2244 outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR)); in snd_vt1724_write_i2c()
2245 outb(data, ICEREG1724(ice, I2C_DATA)); in snd_vt1724_write_i2c()
2246 outb(dev | VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR)); in snd_vt1724_write_i2c()
2247 wait_i2c_busy(ice); in snd_vt1724_write_i2c()
2248 mutex_unlock(&ice->i2c_mutex); in snd_vt1724_write_i2c()
2251 static int snd_vt1724_read_eeprom(struct snd_ice1712 *ice, in snd_vt1724_read_eeprom() argument
2259 ice->eeprom.subvendor = 0; in snd_vt1724_read_eeprom()
2260 if ((inb(ICEREG1724(ice, I2C_CTRL)) & VT1724_I2C_EEPROM) != 0) in snd_vt1724_read_eeprom()
2261 ice->eeprom.subvendor = in snd_vt1724_read_eeprom()
2262 (snd_vt1724_read_i2c(ice, dev, 0x00) << 0) | in snd_vt1724_read_eeprom()
2263 (snd_vt1724_read_i2c(ice, dev, 0x01) << 8) | in snd_vt1724_read_eeprom()
2264 (snd_vt1724_read_i2c(ice, dev, 0x02) << 16) | in snd_vt1724_read_eeprom()
2265 (snd_vt1724_read_i2c(ice, dev, 0x03) << 24); in snd_vt1724_read_eeprom()
2266 if (ice->eeprom.subvendor == 0 || in snd_vt1724_read_eeprom()
2267 ice->eeprom.subvendor == (unsigned int)-1) { in snd_vt1724_read_eeprom()
2272 pci_read_config_word(ice->pci, PCI_SUBSYSTEM_VENDOR_ID, in snd_vt1724_read_eeprom()
2274 pci_read_config_word(ice->pci, PCI_SUBSYSTEM_ID, &device); in snd_vt1724_read_eeprom()
2275 ice->eeprom.subvendor = in snd_vt1724_read_eeprom()
2277 if (ice->eeprom.subvendor == 0 || in snd_vt1724_read_eeprom()
2278 ice->eeprom.subvendor == (unsigned int)-1) { in snd_vt1724_read_eeprom()
2279 dev_err(ice->card->dev, in snd_vt1724_read_eeprom()
2289 dev_info(ice->card->dev, in snd_vt1724_read_eeprom()
2292 ice->eeprom.subvendor = c->subvendor; in snd_vt1724_read_eeprom()
2293 } else if (c->subvendor != ice->eeprom.subvendor) in snd_vt1724_read_eeprom()
2295 ice->card_info = c; in snd_vt1724_read_eeprom()
2299 dev_dbg(ice->card->dev, "using the defined eeprom..\n"); in snd_vt1724_read_eeprom()
2300 ice->eeprom.version = 2; in snd_vt1724_read_eeprom()
2301 ice->eeprom.size = c->eeprom_size + 6; in snd_vt1724_read_eeprom()
2302 memcpy(ice->eeprom.data, c->eeprom_data, c->eeprom_size); in snd_vt1724_read_eeprom()
2306 dev_warn(ice->card->dev, "No matching model found for ID 0x%x\n", in snd_vt1724_read_eeprom()
2307 ice->eeprom.subvendor); in snd_vt1724_read_eeprom()
2310 ice->pm_suspend_enabled = 1; in snd_vt1724_read_eeprom()
2314 ice->eeprom.size = snd_vt1724_read_i2c(ice, dev, 0x04); in snd_vt1724_read_eeprom()
2315 if (ice->eeprom.size < 6) in snd_vt1724_read_eeprom()
2316 ice->eeprom.size = 32; in snd_vt1724_read_eeprom()
2317 else if (ice->eeprom.size > 32) { in snd_vt1724_read_eeprom()
2318 dev_err(ice->card->dev, "Invalid EEPROM (size = %i)\n", in snd_vt1724_read_eeprom()
2319 ice->eeprom.size); in snd_vt1724_read_eeprom()
2322 ice->eeprom.version = snd_vt1724_read_i2c(ice, dev, 0x05); in snd_vt1724_read_eeprom()
2323 if (ice->eeprom.version != 1 && ice->eeprom.version != 2) in snd_vt1724_read_eeprom()
2324 dev_warn(ice->card->dev, "Invalid EEPROM version %i\n", in snd_vt1724_read_eeprom()
2325 ice->eeprom.version); in snd_vt1724_read_eeprom()
2326 size = ice->eeprom.size - 6; in snd_vt1724_read_eeprom()
2328 ice->eeprom.data[i] = snd_vt1724_read_i2c(ice, dev, i + 6); in snd_vt1724_read_eeprom()
2331 ice->eeprom.gpiomask = eeprom_triple(ice, ICE_EEP2_GPIO_MASK); in snd_vt1724_read_eeprom()
2332 ice->eeprom.gpiostate = eeprom_triple(ice, ICE_EEP2_GPIO_STATE); in snd_vt1724_read_eeprom()
2333 ice->eeprom.gpiodir = eeprom_triple(ice, ICE_EEP2_GPIO_DIR); in snd_vt1724_read_eeprom()
2340 static void snd_vt1724_chip_reset(struct snd_ice1712 *ice) in snd_vt1724_chip_reset() argument
2342 outb(VT1724_RESET , ICEREG1724(ice, CONTROL)); in snd_vt1724_chip_reset()
2343 inb(ICEREG1724(ice, CONTROL)); /* pci posting flush */ in snd_vt1724_chip_reset()
2345 outb(0, ICEREG1724(ice, CONTROL)); in snd_vt1724_chip_reset()
2346 inb(ICEREG1724(ice, CONTROL)); /* pci posting flush */ in snd_vt1724_chip_reset()
2350 static int snd_vt1724_chip_init(struct snd_ice1712 *ice) in snd_vt1724_chip_init() argument
2352 outb(ice->eeprom.data[ICE_EEP2_SYSCONF], ICEREG1724(ice, SYS_CFG)); in snd_vt1724_chip_init()
2353 outb(ice->eeprom.data[ICE_EEP2_ACLINK], ICEREG1724(ice, AC97_CFG)); in snd_vt1724_chip_init()
2354 outb(ice->eeprom.data[ICE_EEP2_I2S], ICEREG1724(ice, I2S_FEATURES)); in snd_vt1724_chip_init()
2355 outb(ice->eeprom.data[ICE_EEP2_SPDIF], ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_chip_init()
2357 ice->gpio.write_mask = ice->eeprom.gpiomask; in snd_vt1724_chip_init()
2358 ice->gpio.direction = ice->eeprom.gpiodir; in snd_vt1724_chip_init()
2359 snd_vt1724_set_gpio_mask(ice, ice->eeprom.gpiomask); in snd_vt1724_chip_init()
2360 snd_vt1724_set_gpio_dir(ice, ice->eeprom.gpiodir); in snd_vt1724_chip_init()
2361 snd_vt1724_set_gpio_data(ice, ice->eeprom.gpiostate); in snd_vt1724_chip_init()
2363 outb(0, ICEREG1724(ice, POWERDOWN)); in snd_vt1724_chip_init()
2366 outb(VT1724_IRQ_MPU_RX | VT1724_IRQ_MPU_TX , ICEREG1724(ice, IRQMASK)); in snd_vt1724_chip_init()
2371 outb(VT1724_MULTI_FIFO_ERR, ICEMT1724(ice, DMA_INT_MASK)); in snd_vt1724_chip_init()
2376 static int snd_vt1724_spdif_build_controls(struct snd_ice1712 *ice) in snd_vt1724_spdif_build_controls() argument
2381 if (snd_BUG_ON(!ice->pcm)) in snd_vt1724_spdif_build_controls()
2384 if (!ice->own_routing) { in snd_vt1724_spdif_build_controls()
2385 err = snd_ctl_add(ice->card, in snd_vt1724_spdif_build_controls()
2386 snd_ctl_new1(&snd_vt1724_mixer_pro_spdif_route, ice)); in snd_vt1724_spdif_build_controls()
2391 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_spdif_switch, ice)); in snd_vt1724_spdif_build_controls()
2395 kctl = snd_ctl_new1(&snd_vt1724_spdif_default, ice); in snd_vt1724_spdif_build_controls()
2396 kctl->id.device = ice->pcm->device; in snd_vt1724_spdif_build_controls()
2397 err = snd_ctl_add(ice->card, kctl); in snd_vt1724_spdif_build_controls()
2400 kctl = snd_ctl_new1(&snd_vt1724_spdif_maskc, ice); in snd_vt1724_spdif_build_controls()
2401 kctl->id.device = ice->pcm->device; in snd_vt1724_spdif_build_controls()
2402 err = snd_ctl_add(ice->card, kctl); in snd_vt1724_spdif_build_controls()
2405 kctl = snd_ctl_new1(&snd_vt1724_spdif_maskp, ice); in snd_vt1724_spdif_build_controls()
2406 kctl->id.device = ice->pcm->device; in snd_vt1724_spdif_build_controls()
2407 err = snd_ctl_add(ice->card, kctl); in snd_vt1724_spdif_build_controls()
2411 kctl = snd_ctl_new1(&snd_vt1724_spdif_stream, ice); in snd_vt1724_spdif_build_controls()
2412 kctl->id.device = ice->pcm->device; in snd_vt1724_spdif_build_controls()
2413 err = snd_ctl_add(ice->card, kctl); in snd_vt1724_spdif_build_controls()
2416 ice->spdif.stream_ctl = kctl; in snd_vt1724_spdif_build_controls()
2422 static int snd_vt1724_build_controls(struct snd_ice1712 *ice) in snd_vt1724_build_controls() argument
2426 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_eeprom, ice)); in snd_vt1724_build_controls()
2429 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_pro_internal_clock, ice)); in snd_vt1724_build_controls()
2433 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_pro_rate_locking, ice)); in snd_vt1724_build_controls()
2436 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_pro_rate_reset, ice)); in snd_vt1724_build_controls()
2440 if (!ice->own_routing && ice->num_total_dacs > 0) { in snd_vt1724_build_controls()
2442 tmp.count = ice->num_total_dacs; in snd_vt1724_build_controls()
2443 if (ice->vt1720 && tmp.count > 2) in snd_vt1724_build_controls()
2445 err = snd_ctl_add(ice->card, snd_ctl_new1(&tmp, ice)); in snd_vt1724_build_controls()
2450 return snd_ctl_add(ice->card, in snd_vt1724_build_controls()
2451 snd_ctl_new1(&snd_vt1724_mixer_pro_peak, ice)); in snd_vt1724_build_controls()
2456 struct snd_ice1712 *ice = card->private_data; in snd_vt1724_free() local
2459 outb(0xff, ICEMT1724(ice, DMA_INT_MASK)); in snd_vt1724_free()
2460 outb(0xff, ICEREG1724(ice, IRQMASK)); in snd_vt1724_free()
2462 snd_ice1712_akm4xxx_free(ice); in snd_vt1724_free()
2469 struct snd_ice1712 *ice = card->private_data; in snd_vt1724_create() local
2477 ice->vt1724 = 1; in snd_vt1724_create()
2478 spin_lock_init(&ice->reg_lock); in snd_vt1724_create()
2479 mutex_init(&ice->gpio_mutex); in snd_vt1724_create()
2480 mutex_init(&ice->open_mutex); in snd_vt1724_create()
2481 mutex_init(&ice->i2c_mutex); in snd_vt1724_create()
2482 ice->gpio.set_mask = snd_vt1724_set_gpio_mask; in snd_vt1724_create()
2483 ice->gpio.get_mask = snd_vt1724_get_gpio_mask; in snd_vt1724_create()
2484 ice->gpio.set_dir = snd_vt1724_set_gpio_dir; in snd_vt1724_create()
2485 ice->gpio.get_dir = snd_vt1724_get_gpio_dir; in snd_vt1724_create()
2486 ice->gpio.set_data = snd_vt1724_set_gpio_data; in snd_vt1724_create()
2487 ice->gpio.get_data = snd_vt1724_get_gpio_data; in snd_vt1724_create()
2488 ice->card = card; in snd_vt1724_create()
2489 ice->pci = pci; in snd_vt1724_create()
2490 ice->irq = -1; in snd_vt1724_create()
2492 snd_vt1724_proc_init(ice); in snd_vt1724_create()
2497 ice->port = pci_resource_start(pci, 0); in snd_vt1724_create()
2498 ice->profi_port = pci_resource_start(pci, 1); in snd_vt1724_create()
2501 IRQF_SHARED, KBUILD_MODNAME, ice)) { in snd_vt1724_create()
2506 ice->irq = pci->irq; in snd_vt1724_create()
2507 card->sync_irq = ice->irq; in snd_vt1724_create()
2510 snd_vt1724_chip_reset(ice); in snd_vt1724_create()
2511 if (snd_vt1724_read_eeprom(ice, modelname) < 0) in snd_vt1724_create()
2513 if (snd_vt1724_chip_init(ice) < 0) in snd_vt1724_create()
2531 struct snd_ice1712 *ice; in __snd_vt1724_probe() local
2543 sizeof(*ice), &card); in __snd_vt1724_probe()
2546 ice = card->private_data; in __snd_vt1724_probe()
2556 ice->ext_clock_count = 0; in __snd_vt1724_probe()
2558 c = ice->card_info; in __snd_vt1724_probe()
2564 err = c->chip_init(ice); in __snd_vt1724_probe()
2578 ice->pro_rate_default = PRO_RATE_DEFAULT; in __snd_vt1724_probe()
2579 if (!ice->is_spdif_master) in __snd_vt1724_probe()
2580 ice->is_spdif_master = stdclock_is_spdif_master; in __snd_vt1724_probe()
2581 if (!ice->get_rate) in __snd_vt1724_probe()
2582 ice->get_rate = stdclock_get_rate; in __snd_vt1724_probe()
2583 if (!ice->set_rate) in __snd_vt1724_probe()
2584 ice->set_rate = stdclock_set_rate; in __snd_vt1724_probe()
2585 if (!ice->set_mclk) in __snd_vt1724_probe()
2586 ice->set_mclk = stdclock_set_mclk; in __snd_vt1724_probe()
2587 if (!ice->set_spdif_clock) in __snd_vt1724_probe()
2588 ice->set_spdif_clock = stdclock_set_spdif_clock; in __snd_vt1724_probe()
2589 if (!ice->get_spdif_master_type) in __snd_vt1724_probe()
2590 ice->get_spdif_master_type = stdclock_get_spdif_master_type; in __snd_vt1724_probe()
2591 if (!ice->ext_clock_names) in __snd_vt1724_probe()
2592 ice->ext_clock_names = ext_clock_names; in __snd_vt1724_probe()
2593 if (!ice->ext_clock_count) in __snd_vt1724_probe()
2594 ice->ext_clock_count = ARRAY_SIZE(ext_clock_names); in __snd_vt1724_probe()
2596 if (!ice->hw_rates) in __snd_vt1724_probe()
2597 set_std_hw_rates(ice); in __snd_vt1724_probe()
2599 err = snd_vt1724_pcm_profi(ice, pcm_dev++); in __snd_vt1724_probe()
2603 err = snd_vt1724_pcm_spdif(ice, pcm_dev++); in __snd_vt1724_probe()
2607 err = snd_vt1724_pcm_indep(ice, pcm_dev++); in __snd_vt1724_probe()
2611 err = snd_vt1724_ac97_mixer(ice); in __snd_vt1724_probe()
2615 err = snd_vt1724_build_controls(ice); in __snd_vt1724_probe()
2619 if (ice->pcm && ice->has_spdif) { /* has SPDIF I/O */ in __snd_vt1724_probe()
2620 err = snd_vt1724_spdif_build_controls(ice); in __snd_vt1724_probe()
2626 err = c->build_controls(ice); in __snd_vt1724_probe()
2632 if (ice->eeprom.data[ICE_EEP2_SYSCONF] & VT1724_CFG_MPU401) { in __snd_vt1724_probe()
2638 ice->rmidi[0] = rmidi; in __snd_vt1724_probe()
2639 rmidi->private_data = ice; in __snd_vt1724_probe()
2651 ICEREG1724(ice, MPU_FIFO_WM)); in __snd_vt1724_probe()
2652 outb(0x1, ICEREG1724(ice, MPU_FIFO_WM)); in __snd_vt1724_probe()
2654 outb(VT1724_MPU_UART, ICEREG1724(ice, MPU_CTRL)); in __snd_vt1724_probe()
2659 card->shortname, ice->port, ice->irq); in __snd_vt1724_probe()
2679 struct snd_ice1712 *ice = card->private_data; in snd_vt1724_suspend() local
2681 if (!ice->pm_suspend_enabled) in snd_vt1724_suspend()
2686 snd_ac97_suspend(ice->ac97); in snd_vt1724_suspend()
2688 spin_lock_irq(&ice->reg_lock); in snd_vt1724_suspend()
2689 ice->pm_saved_is_spdif_master = ice->is_spdif_master(ice); in snd_vt1724_suspend()
2690 ice->pm_saved_spdif_ctrl = inw(ICEMT1724(ice, SPDIF_CTRL)); in snd_vt1724_suspend()
2691 ice->pm_saved_spdif_cfg = inb(ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_suspend()
2692 ice->pm_saved_route = inl(ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_vt1724_suspend()
2693 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_suspend()
2695 if (ice->pm_suspend) in snd_vt1724_suspend()
2696 ice->pm_suspend(ice); in snd_vt1724_suspend()
2703 struct snd_ice1712 *ice = card->private_data; in snd_vt1724_resume() local
2705 if (!ice->pm_suspend_enabled) in snd_vt1724_resume()
2708 snd_vt1724_chip_reset(ice); in snd_vt1724_resume()
2710 if (snd_vt1724_chip_init(ice) < 0) { in snd_vt1724_resume()
2715 if (ice->pm_resume) in snd_vt1724_resume()
2716 ice->pm_resume(ice); in snd_vt1724_resume()
2718 if (ice->pm_saved_is_spdif_master) { in snd_vt1724_resume()
2720 ice->set_spdif_clock(ice, 0); in snd_vt1724_resume()
2724 if (ice->cur_rate) in snd_vt1724_resume()
2725 rate = ice->cur_rate; in snd_vt1724_resume()
2727 rate = ice->pro_rate_default; in snd_vt1724_resume()
2728 snd_vt1724_set_pro_rate(ice, rate, 1); in snd_vt1724_resume()
2731 update_spdif_bits(ice, ice->pm_saved_spdif_ctrl); in snd_vt1724_resume()
2733 outb(ice->pm_saved_spdif_cfg, ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_resume()
2734 outl(ice->pm_saved_route, ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_vt1724_resume()
2736 snd_ac97_resume(ice->ac97); in snd_vt1724_resume()