• Home
  • Raw
  • Download

Lines Matching refs:ice

120 static inline int stdclock_is_spdif_master(struct snd_ice1712 *ice)  in stdclock_is_spdif_master()  argument
122 return (inb(ICEMT1724(ice, RATE)) & VT1724_SPDIF_MASTER) ? 1 : 0; in stdclock_is_spdif_master()
128 static inline int is_pro_rate_locked(struct snd_ice1712 *ice) in is_pro_rate_locked() argument
130 return (!ice->is_spdif_master(ice)) && PRO_RATE_LOCKED; in is_pro_rate_locked()
137 static unsigned char snd_vt1724_ac97_ready(struct snd_ice1712 *ice) in snd_vt1724_ac97_ready() argument
142 old_cmd = inb(ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_ready()
153 static int snd_vt1724_ac97_wait_bit(struct snd_ice1712 *ice, unsigned char bit) in snd_vt1724_ac97_wait_bit() argument
157 if ((inb(ICEMT1724(ice, AC97_CMD)) & bit) == 0) in snd_vt1724_ac97_wait_bit()
167 struct snd_ice1712 *ice = ac97->private_data; in snd_vt1724_ac97_write() local
170 old_cmd = snd_vt1724_ac97_ready(ice); in snd_vt1724_ac97_write()
173 outb(reg, ICEMT1724(ice, AC97_INDEX)); in snd_vt1724_ac97_write()
174 outw(val, ICEMT1724(ice, AC97_DATA)); in snd_vt1724_ac97_write()
175 outb(old_cmd | VT1724_AC97_WRITE, ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_write()
176 snd_vt1724_ac97_wait_bit(ice, VT1724_AC97_WRITE); in snd_vt1724_ac97_write()
181 struct snd_ice1712 *ice = ac97->private_data; in snd_vt1724_ac97_read() local
184 old_cmd = snd_vt1724_ac97_ready(ice); in snd_vt1724_ac97_read()
187 outb(reg, ICEMT1724(ice, AC97_INDEX)); in snd_vt1724_ac97_read()
188 outb(old_cmd | VT1724_AC97_READ, ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_read()
189 if (snd_vt1724_ac97_wait_bit(ice, VT1724_AC97_READ) < 0) in snd_vt1724_ac97_read()
191 return inw(ICEMT1724(ice, AC97_DATA)); in snd_vt1724_ac97_read()
200 static void snd_vt1724_set_gpio_dir(struct snd_ice1712 *ice, unsigned int data) in snd_vt1724_set_gpio_dir() argument
202 outl(data, ICEREG1724(ice, GPIO_DIRECTION)); in snd_vt1724_set_gpio_dir()
203 inw(ICEREG1724(ice, GPIO_DIRECTION)); /* dummy read for pci-posting */ in snd_vt1724_set_gpio_dir()
207 static unsigned int snd_vt1724_get_gpio_dir(struct snd_ice1712 *ice) in snd_vt1724_get_gpio_dir() argument
209 return inl(ICEREG1724(ice, GPIO_DIRECTION)); in snd_vt1724_get_gpio_dir()
213 static void snd_vt1724_set_gpio_mask(struct snd_ice1712 *ice, unsigned int data) in snd_vt1724_set_gpio_mask() argument
215 outw(data, ICEREG1724(ice, GPIO_WRITE_MASK)); in snd_vt1724_set_gpio_mask()
216 if (!ice->vt1720) /* VT1720 supports only 16 GPIO bits */ in snd_vt1724_set_gpio_mask()
217 outb((data >> 16) & 0xff, ICEREG1724(ice, GPIO_WRITE_MASK_22)); in snd_vt1724_set_gpio_mask()
218 inw(ICEREG1724(ice, GPIO_WRITE_MASK)); /* dummy read for pci-posting */ in snd_vt1724_set_gpio_mask()
221 static unsigned int snd_vt1724_get_gpio_mask(struct snd_ice1712 *ice) in snd_vt1724_get_gpio_mask() argument
224 if (!ice->vt1720) in snd_vt1724_get_gpio_mask()
225 mask = (unsigned int)inb(ICEREG1724(ice, GPIO_WRITE_MASK_22)); in snd_vt1724_get_gpio_mask()
228 mask = (mask << 16) | inw(ICEREG1724(ice, GPIO_WRITE_MASK)); in snd_vt1724_get_gpio_mask()
232 static void snd_vt1724_set_gpio_data(struct snd_ice1712 *ice, unsigned int data) in snd_vt1724_set_gpio_data() argument
234 outw(data, ICEREG1724(ice, GPIO_DATA)); in snd_vt1724_set_gpio_data()
235 if (!ice->vt1720) in snd_vt1724_set_gpio_data()
236 outb(data >> 16, ICEREG1724(ice, GPIO_DATA_22)); in snd_vt1724_set_gpio_data()
237 inw(ICEREG1724(ice, GPIO_DATA)); /* dummy read for pci-posting */ in snd_vt1724_set_gpio_data()
240 static unsigned int snd_vt1724_get_gpio_data(struct snd_ice1712 *ice) in snd_vt1724_get_gpio_data() argument
243 if (!ice->vt1720) in snd_vt1724_get_gpio_data()
244 data = (unsigned int)inb(ICEREG1724(ice, GPIO_DATA_22)); in snd_vt1724_get_gpio_data()
247 data = (data << 16) | inw(ICEREG1724(ice, GPIO_DATA)); in snd_vt1724_get_gpio_data()
255 static void vt1724_midi_clear_rx(struct snd_ice1712 *ice) in vt1724_midi_clear_rx() argument
259 for (count = inb(ICEREG1724(ice, MPU_RXFIFO)); count > 0; --count) in vt1724_midi_clear_rx()
260 inb(ICEREG1724(ice, MPU_DATA)); in vt1724_midi_clear_rx()
264 get_rawmidi_substream(struct snd_ice1712 *ice, unsigned int stream) in get_rawmidi_substream() argument
266 return list_first_entry(&ice->rmidi[0]->streams[stream].substreams, in get_rawmidi_substream()
270 static void enable_midi_irq(struct snd_ice1712 *ice, u8 flag, int enable);
272 static void vt1724_midi_write(struct snd_ice1712 *ice) in vt1724_midi_write() argument
278 s = get_rawmidi_substream(ice, SNDRV_RAWMIDI_STREAM_OUTPUT); in vt1724_midi_write()
279 count = 31 - inb(ICEREG1724(ice, MPU_TXFIFO)); in vt1724_midi_write()
283 outb(buffer[i], ICEREG1724(ice, MPU_DATA)); in vt1724_midi_write()
288 enable_midi_irq(ice, VT1724_IRQ_MPU_TX, in vt1724_midi_write()
292 static void vt1724_midi_read(struct snd_ice1712 *ice) in vt1724_midi_read() argument
298 s = get_rawmidi_substream(ice, SNDRV_RAWMIDI_STREAM_INPUT); in vt1724_midi_read()
299 count = inb(ICEREG1724(ice, MPU_RXFIFO)); in vt1724_midi_read()
303 buffer[i] = inb(ICEREG1724(ice, MPU_DATA)); in vt1724_midi_read()
309 static void enable_midi_irq(struct snd_ice1712 *ice, u8 flag, int enable) in enable_midi_irq() argument
311 u8 mask = inb(ICEREG1724(ice, IRQMASK)); in enable_midi_irq()
316 outb(mask, ICEREG1724(ice, IRQMASK)); in enable_midi_irq()
322 struct snd_ice1712 *ice = substream->rmidi->private_data; in vt1724_enable_midi_irq() local
324 spin_lock_irq(&ice->reg_lock); in vt1724_enable_midi_irq()
325 enable_midi_irq(ice, flag, enable); in vt1724_enable_midi_irq()
326 spin_unlock_irq(&ice->reg_lock); in vt1724_enable_midi_irq()
341 struct snd_ice1712 *ice = s->rmidi->private_data; in vt1724_midi_output_trigger() local
344 spin_lock_irqsave(&ice->reg_lock, flags); in vt1724_midi_output_trigger()
346 ice->midi_output = 1; in vt1724_midi_output_trigger()
347 vt1724_midi_write(ice); in vt1724_midi_output_trigger()
349 ice->midi_output = 0; in vt1724_midi_output_trigger()
350 enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0); in vt1724_midi_output_trigger()
352 spin_unlock_irqrestore(&ice->reg_lock, flags); in vt1724_midi_output_trigger()
357 struct snd_ice1712 *ice = s->rmidi->private_data; in vt1724_midi_output_drain() local
364 if (inb(ICEREG1724(ice, MPU_CTRL)) & VT1724_MPU_TX_EMPTY) in vt1724_midi_output_drain()
392 struct snd_ice1712 *ice = s->rmidi->private_data; in vt1724_midi_input_trigger() local
395 spin_lock_irqsave(&ice->reg_lock, flags); in vt1724_midi_input_trigger()
397 ice->midi_input = 1; in vt1724_midi_input_trigger()
398 vt1724_midi_read(ice); in vt1724_midi_input_trigger()
400 ice->midi_input = 0; in vt1724_midi_input_trigger()
402 spin_unlock_irqrestore(&ice->reg_lock, flags); in vt1724_midi_input_trigger()
418 struct snd_ice1712 *ice = dev_id; in snd_vt1724_interrupt() local
426 status = inb(ICEREG1724(ice, IRQSTAT)); in snd_vt1724_interrupt()
430 spin_lock(&ice->reg_lock); in snd_vt1724_interrupt()
432 status = inb(ICEREG1724(ice, IRQSTAT)); in snd_vt1724_interrupt()
437 enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0); in snd_vt1724_interrupt()
439 spin_unlock(&ice->reg_lock); in snd_vt1724_interrupt()
444 if (ice->midi_output) in snd_vt1724_interrupt()
445 vt1724_midi_write(ice); in snd_vt1724_interrupt()
447 enable_midi_irq(ice, VT1724_IRQ_MPU_TX, 0); in snd_vt1724_interrupt()
456 if (ice->midi_input) in snd_vt1724_interrupt()
457 vt1724_midi_read(ice); in snd_vt1724_interrupt()
459 vt1724_midi_clear_rx(ice); in snd_vt1724_interrupt()
462 outb(status, ICEREG1724(ice, IRQSTAT)); in snd_vt1724_interrupt()
463 spin_unlock(&ice->reg_lock); in snd_vt1724_interrupt()
476 unsigned char mtstat = inb(ICEMT1724(ice, IRQ)); in snd_vt1724_interrupt()
478 if (ice->playback_pro_substream) in snd_vt1724_interrupt()
479 snd_pcm_period_elapsed(ice->playback_pro_substream); in snd_vt1724_interrupt()
482 if (ice->capture_pro_substream) in snd_vt1724_interrupt()
483 snd_pcm_period_elapsed(ice->capture_pro_substream); in snd_vt1724_interrupt()
486 if (ice->playback_con_substream_ds[0]) in snd_vt1724_interrupt()
487 snd_pcm_period_elapsed(ice->playback_con_substream_ds[0]); in snd_vt1724_interrupt()
490 if (ice->playback_con_substream_ds[1]) in snd_vt1724_interrupt()
491 snd_pcm_period_elapsed(ice->playback_con_substream_ds[1]); in snd_vt1724_interrupt()
494 if (ice->playback_con_substream_ds[2]) in snd_vt1724_interrupt()
495 snd_pcm_period_elapsed(ice->playback_con_substream_ds[2]); in snd_vt1724_interrupt()
498 if (ice->playback_con_substream) in snd_vt1724_interrupt()
499 snd_pcm_period_elapsed(ice->playback_con_substream); in snd_vt1724_interrupt()
502 if (ice->capture_con_substream) in snd_vt1724_interrupt()
503 snd_pcm_period_elapsed(ice->capture_con_substream); in snd_vt1724_interrupt()
506 outb(mtstat, ICEMT1724(ice, IRQ)); in snd_vt1724_interrupt()
509 unsigned char fstat = inb(ICEMT1724(ice, DMA_FIFO_ERR)); in snd_vt1724_interrupt()
510 outb(fstat, ICEMT1724(ice, DMA_FIFO_ERR)); in snd_vt1724_interrupt()
511 outb(VT1724_MULTI_FIFO_ERR | inb(ICEMT1724(ice, DMA_INT_MASK)), ICEMT1724(ice, DMA_INT_MASK)); in snd_vt1724_interrupt()
557 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_trigger() local
564 if (snd_pcm_substream_chip(s) == ice) { in snd_vt1724_pcm_trigger()
575 spin_lock(&ice->reg_lock); in snd_vt1724_pcm_trigger()
576 old = inb(ICEMT1724(ice, DMA_PAUSE)); in snd_vt1724_pcm_trigger()
581 outb(old, ICEMT1724(ice, DMA_PAUSE)); in snd_vt1724_pcm_trigger()
582 spin_unlock(&ice->reg_lock); in snd_vt1724_pcm_trigger()
588 spin_lock(&ice->reg_lock); in snd_vt1724_pcm_trigger()
589 old = inb(ICEMT1724(ice, DMA_CONTROL)); in snd_vt1724_pcm_trigger()
594 outb(old, ICEMT1724(ice, DMA_CONTROL)); in snd_vt1724_pcm_trigger()
595 spin_unlock(&ice->reg_lock); in snd_vt1724_pcm_trigger()
621 static unsigned int stdclock_get_rate(struct snd_ice1712 *ice) in stdclock_get_rate() argument
624 rate = stdclock_rate_list[inb(ICEMT1724(ice, RATE)) & 15]; in stdclock_get_rate()
628 static void stdclock_set_rate(struct snd_ice1712 *ice, unsigned int rate) in stdclock_set_rate() argument
633 outb(i, ICEMT1724(ice, RATE)); in stdclock_set_rate()
639 static unsigned char stdclock_set_mclk(struct snd_ice1712 *ice, in stdclock_set_mclk() argument
644 if (ice->eeprom.data[ICE_EEP2_ACLINK] & VT1724_CFG_PRO_I2S) { in stdclock_set_mclk()
645 val = old = inb(ICEMT1724(ice, I2S_FORMAT)); in stdclock_set_mclk()
651 outb(val, ICEMT1724(ice, I2S_FORMAT)); in stdclock_set_mclk()
660 static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate, in snd_vt1724_set_pro_rate() argument
667 if (rate > ice->hw_rates->list[ice->hw_rates->count - 1]) in snd_vt1724_set_pro_rate()
670 spin_lock_irqsave(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
671 if ((inb(ICEMT1724(ice, DMA_CONTROL)) & DMA_STARTS) || in snd_vt1724_set_pro_rate()
672 (inb(ICEMT1724(ice, DMA_PAUSE)) & DMA_PAUSES)) { in snd_vt1724_set_pro_rate()
674 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
675 return ((rate == ice->cur_rate) && !force) ? 0 : -EBUSY; in snd_vt1724_set_pro_rate()
677 if (!force && is_pro_rate_locked(ice)) { in snd_vt1724_set_pro_rate()
680 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
681 return (rate == ice->cur_rate) ? 0 : -EBUSY; in snd_vt1724_set_pro_rate()
684 if (force || !ice->is_spdif_master(ice)) { in snd_vt1724_set_pro_rate()
687 old_rate = ice->get_rate(ice); in snd_vt1724_set_pro_rate()
689 ice->set_rate(ice, rate); in snd_vt1724_set_pro_rate()
690 else if (rate == ice->cur_rate) { in snd_vt1724_set_pro_rate()
691 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
696 ice->cur_rate = rate; in snd_vt1724_set_pro_rate()
699 mclk_change = ice->set_mclk(ice, rate); in snd_vt1724_set_pro_rate()
701 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_vt1724_set_pro_rate()
703 if (mclk_change && ice->gpio.i2s_mclk_changed) in snd_vt1724_set_pro_rate()
704 ice->gpio.i2s_mclk_changed(ice); in snd_vt1724_set_pro_rate()
705 if (ice->gpio.set_pro_rate) in snd_vt1724_set_pro_rate()
706 ice->gpio.set_pro_rate(ice, rate); in snd_vt1724_set_pro_rate()
709 for (i = 0; i < ice->akm_codecs; i++) { in snd_vt1724_set_pro_rate()
710 if (ice->akm[i].ops.set_rate_val) in snd_vt1724_set_pro_rate()
711 ice->akm[i].ops.set_rate_val(&ice->akm[i], rate); in snd_vt1724_set_pro_rate()
713 if (ice->spdif.ops.setup_rate) in snd_vt1724_set_pro_rate()
714 ice->spdif.ops.setup_rate(ice, rate); in snd_vt1724_set_pro_rate()
722 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_hw_params() local
726 mutex_lock(&ice->open_mutex); in snd_vt1724_pcm_hw_params()
728 if (substream == ice->playback_pro_substream) { in snd_vt1724_pcm_hw_params()
732 if (ice->pcm_reserved[i] && in snd_vt1724_pcm_hw_params()
733 ice->pcm_reserved[i] != substream) { in snd_vt1724_pcm_hw_params()
734 mutex_unlock(&ice->open_mutex); in snd_vt1724_pcm_hw_params()
737 ice->pcm_reserved[i] = substream; in snd_vt1724_pcm_hw_params()
740 if (ice->pcm_reserved[i] == substream) in snd_vt1724_pcm_hw_params()
741 ice->pcm_reserved[i] = NULL; in snd_vt1724_pcm_hw_params()
746 if (ice->playback_con_substream_ds[i] == substream) { in snd_vt1724_pcm_hw_params()
747 if (ice->pcm_reserved[i] && in snd_vt1724_pcm_hw_params()
748 ice->pcm_reserved[i] != substream) { in snd_vt1724_pcm_hw_params()
749 mutex_unlock(&ice->open_mutex); in snd_vt1724_pcm_hw_params()
752 ice->pcm_reserved[i] = substream; in snd_vt1724_pcm_hw_params()
757 mutex_unlock(&ice->open_mutex); in snd_vt1724_pcm_hw_params()
759 err = snd_vt1724_set_pro_rate(ice, params_rate(hw_params), 0); in snd_vt1724_pcm_hw_params()
768 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_hw_free() local
771 mutex_lock(&ice->open_mutex); in snd_vt1724_pcm_hw_free()
774 if (ice->pcm_reserved[i] == substream) in snd_vt1724_pcm_hw_free()
775 ice->pcm_reserved[i] = NULL; in snd_vt1724_pcm_hw_free()
776 mutex_unlock(&ice->open_mutex); in snd_vt1724_pcm_hw_free()
782 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_pro_prepare() local
786 spin_lock_irq(&ice->reg_lock); in snd_vt1724_playback_pro_prepare()
788 outb(val, ICEMT1724(ice, BURST)); in snd_vt1724_playback_pro_prepare()
790 outl(substream->runtime->dma_addr, ICEMT1724(ice, PLAYBACK_ADDR)); in snd_vt1724_playback_pro_prepare()
794 outw(size, ICEMT1724(ice, PLAYBACK_SIZE)); in snd_vt1724_playback_pro_prepare()
795 outb(size >> 16, ICEMT1724(ice, PLAYBACK_SIZE) + 2); in snd_vt1724_playback_pro_prepare()
798 outw(size, ICEMT1724(ice, PLAYBACK_COUNT)); in snd_vt1724_playback_pro_prepare()
799 outb(size >> 16, ICEMT1724(ice, PLAYBACK_COUNT) + 2); in snd_vt1724_playback_pro_prepare()
801 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_playback_pro_prepare()
816 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_pro_pointer() local
819 if (!(inl(ICEMT1724(ice, DMA_CONTROL)) & VT1724_PDMA0_START)) in snd_vt1724_playback_pro_pointer()
822 ptr = inl(ICEMT1724(ice, PLAYBACK_ADDR)); in snd_vt1724_playback_pro_pointer()
835 ptr = inl(ICEMT1724(ice, PLAYBACK_SIZE)) & 0xffffff; in snd_vt1724_playback_pro_pointer()
853 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_prepare() local
856 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pcm_prepare()
857 outl(substream->runtime->dma_addr, ice->profi_port + reg->addr); in snd_vt1724_pcm_prepare()
859 ice->profi_port + reg->size); in snd_vt1724_pcm_prepare()
861 ice->profi_port + reg->count); in snd_vt1724_pcm_prepare()
862 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pcm_prepare()
868 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_pcm_pointer() local
872 if (!(inl(ICEMT1724(ice, DMA_CONTROL)) & reg->start)) in snd_vt1724_pcm_pointer()
875 ptr = inl(ice->profi_port + reg->addr); in snd_vt1724_pcm_pointer()
879 ptr = inw(ice->profi_port + reg->size); in snd_vt1724_pcm_pointer()
988 static void set_std_hw_rates(struct snd_ice1712 *ice) in set_std_hw_rates() argument
990 if (ice->eeprom.data[ICE_EEP2_ACLINK] & VT1724_CFG_PRO_I2S) { in set_std_hw_rates()
993 if ((ice->eeprom.data[ICE_EEP2_I2S] & 0x08) && !ice->vt1720) in set_std_hw_rates()
994 ice->hw_rates = &hw_constraints_rates_192; in set_std_hw_rates()
996 ice->hw_rates = &hw_constraints_rates_96; in set_std_hw_rates()
999 ice->hw_rates = &hw_constraints_rates_48; in set_std_hw_rates()
1003 static int set_rate_constraints(struct snd_ice1712 *ice, in set_rate_constraints() argument
1008 runtime->hw.rate_min = ice->hw_rates->list[0]; in set_rate_constraints()
1009 runtime->hw.rate_max = ice->hw_rates->list[ice->hw_rates->count - 1]; in set_rate_constraints()
1013 ice->hw_rates); in set_rate_constraints()
1021 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in constrain_rate_if_locked() local
1024 if (is_pro_rate_locked(ice)) { in constrain_rate_if_locked()
1025 rate = ice->get_rate(ice); in constrain_rate_if_locked()
1043 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_pro_open() local
1047 ice->playback_pro_substream = substream; in snd_vt1724_playback_pro_open()
1051 set_rate_constraints(ice, substream); in snd_vt1724_playback_pro_open()
1052 mutex_lock(&ice->open_mutex); in snd_vt1724_playback_pro_open()
1054 num_indeps = ice->num_total_dacs / 2 - 1; in snd_vt1724_playback_pro_open()
1056 if (ice->pcm_reserved[chs]) in snd_vt1724_playback_pro_open()
1063 mutex_unlock(&ice->open_mutex); in snd_vt1724_playback_pro_open()
1069 if (ice->pro_open) in snd_vt1724_playback_pro_open()
1070 ice->pro_open(ice, substream); in snd_vt1724_playback_pro_open()
1076 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_capture_pro_open() local
1080 ice->capture_pro_substream = substream; in snd_vt1724_capture_pro_open()
1084 set_rate_constraints(ice, substream); in snd_vt1724_capture_pro_open()
1090 if (ice->pro_open) in snd_vt1724_capture_pro_open()
1091 ice->pro_open(ice, substream); in snd_vt1724_capture_pro_open()
1097 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_pro_close() local
1100 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_playback_pro_close()
1101 ice->playback_pro_substream = NULL; in snd_vt1724_playback_pro_close()
1108 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_capture_pro_close() local
1111 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_capture_pro_close()
1112 ice->capture_pro_substream = NULL; in snd_vt1724_capture_pro_close()
1138 static int snd_vt1724_pcm_profi(struct snd_ice1712 *ice, int device) in snd_vt1724_pcm_profi() argument
1143 if ((ice->eeprom.data[ICE_EEP2_SYSCONF] & VT1724_CFG_ADC_MASK) == in snd_vt1724_pcm_profi()
1148 err = snd_pcm_new(ice->card, "ICE1724", device, 1, capt, &pcm); in snd_vt1724_pcm_profi()
1157 pcm->private_data = ice; in snd_vt1724_pcm_profi()
1162 snd_dma_pci_data(ice->pci), in snd_vt1724_pcm_profi()
1165 ice->pcm_pro = pcm; in snd_vt1724_pcm_profi()
1176 static void update_spdif_bits(struct snd_ice1712 *ice, unsigned int val) in update_spdif_bits() argument
1180 cbit = inb(ICEREG1724(ice, SPDIF_CFG)); in update_spdif_bits()
1183 outb(disabled, ICEREG1724(ice, SPDIF_CFG)); in update_spdif_bits()
1184 outw(val, ICEMT1724(ice, SPDIF_CTRL)); in update_spdif_bits()
1186 outb(cbit, ICEREG1724(ice, SPDIF_CFG)); in update_spdif_bits()
1187 outw(val, ICEMT1724(ice, SPDIF_CTRL)); in update_spdif_bits()
1191 static void update_spdif_rate(struct snd_ice1712 *ice, unsigned int rate) in update_spdif_rate() argument
1196 spin_lock_irqsave(&ice->reg_lock, flags); in update_spdif_rate()
1197 nval = val = inw(ICEMT1724(ice, SPDIF_CTRL)); in update_spdif_rate()
1209 update_spdif_bits(ice, nval); in update_spdif_rate()
1210 spin_unlock_irqrestore(&ice->reg_lock, flags); in update_spdif_rate()
1215 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_spdif_prepare() local
1216 if (!ice->force_pdma4) in snd_vt1724_playback_spdif_prepare()
1217 update_spdif_rate(ice, substream->runtime->rate); in snd_vt1724_playback_spdif_prepare()
1223 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_spdif_open() local
1227 ice->playback_con_substream = substream; in snd_vt1724_playback_spdif_open()
1228 if (ice->force_pdma4) { in snd_vt1724_playback_spdif_open()
1230 set_rate_constraints(ice, substream); in snd_vt1724_playback_spdif_open()
1240 if (ice->spdif.ops.open) in snd_vt1724_playback_spdif_open()
1241 ice->spdif.ops.open(ice, substream); in snd_vt1724_playback_spdif_open()
1247 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_spdif_close() local
1250 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_playback_spdif_close()
1251 ice->playback_con_substream = NULL; in snd_vt1724_playback_spdif_close()
1252 if (ice->spdif.ops.close) in snd_vt1724_playback_spdif_close()
1253 ice->spdif.ops.close(ice, substream); in snd_vt1724_playback_spdif_close()
1260 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_capture_spdif_open() local
1264 ice->capture_con_substream = substream; in snd_vt1724_capture_spdif_open()
1265 if (ice->force_rdma1) { in snd_vt1724_capture_spdif_open()
1267 set_rate_constraints(ice, substream); in snd_vt1724_capture_spdif_open()
1277 if (ice->spdif.ops.open) in snd_vt1724_capture_spdif_open()
1278 ice->spdif.ops.open(ice, substream); in snd_vt1724_capture_spdif_open()
1284 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_capture_spdif_close() local
1287 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_capture_spdif_close()
1288 ice->capture_con_substream = NULL; in snd_vt1724_capture_spdif_close()
1289 if (ice->spdif.ops.close) in snd_vt1724_capture_spdif_close()
1290 ice->spdif.ops.close(ice, substream); in snd_vt1724_capture_spdif_close()
1318 static int snd_vt1724_pcm_spdif(struct snd_ice1712 *ice, int device) in snd_vt1724_pcm_spdif() argument
1325 if (ice->force_pdma4 || in snd_vt1724_pcm_spdif()
1326 (ice->eeprom.data[ICE_EEP2_SPDIF] & VT1724_CFG_SPDIF_OUT_INT)) { in snd_vt1724_pcm_spdif()
1328 ice->has_spdif = 1; in snd_vt1724_pcm_spdif()
1331 if (ice->force_rdma1 || in snd_vt1724_pcm_spdif()
1332 (ice->eeprom.data[ICE_EEP2_SPDIF] & VT1724_CFG_SPDIF_IN)) { in snd_vt1724_pcm_spdif()
1334 ice->has_spdif = 1; in snd_vt1724_pcm_spdif()
1340 if (ice->force_pdma4 || ice->force_rdma1) in snd_vt1724_pcm_spdif()
1344 err = snd_pcm_new(ice->card, name, device, play, capt, &pcm); in snd_vt1724_pcm_spdif()
1355 pcm->private_data = ice; in snd_vt1724_pcm_spdif()
1360 snd_dma_pci_data(ice->pci), in snd_vt1724_pcm_spdif()
1363 ice->pcm = pcm; in snd_vt1724_pcm_spdif()
1396 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_indep_prepare() local
1399 spin_lock_irq(&ice->reg_lock); in snd_vt1724_playback_indep_prepare()
1401 if (inb(ICEMT1724(ice, BURST)) < val) in snd_vt1724_playback_indep_prepare()
1402 outb(val, ICEMT1724(ice, BURST)); in snd_vt1724_playback_indep_prepare()
1403 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_playback_indep_prepare()
1409 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_indep_open() local
1412 mutex_lock(&ice->open_mutex); in snd_vt1724_playback_indep_open()
1414 if (ice->pcm_reserved[substream->number]) { in snd_vt1724_playback_indep_open()
1415 mutex_unlock(&ice->open_mutex); in snd_vt1724_playback_indep_open()
1418 mutex_unlock(&ice->open_mutex); in snd_vt1724_playback_indep_open()
1420 ice->playback_con_substream_ds[substream->number] = substream; in snd_vt1724_playback_indep_open()
1424 set_rate_constraints(ice, substream); in snd_vt1724_playback_indep_open()
1430 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_vt1724_playback_indep_close() local
1433 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 0); in snd_vt1724_playback_indep_close()
1434 ice->playback_con_substream_ds[substream->number] = NULL; in snd_vt1724_playback_indep_close()
1435 ice->pcm_reserved[substream->number] = NULL; in snd_vt1724_playback_indep_close()
1452 static int snd_vt1724_pcm_indep(struct snd_ice1712 *ice, int device) in snd_vt1724_pcm_indep() argument
1458 play = ice->num_total_dacs / 2 - 1; in snd_vt1724_pcm_indep()
1462 err = snd_pcm_new(ice->card, "ICE1724 Surrounds", device, play, 0, &pcm); in snd_vt1724_pcm_indep()
1469 pcm->private_data = ice; in snd_vt1724_pcm_indep()
1474 snd_dma_pci_data(ice->pci), in snd_vt1724_pcm_indep()
1477 ice->pcm_ds = pcm; in snd_vt1724_pcm_indep()
1487 static int snd_vt1724_ac97_mixer(struct snd_ice1712 *ice) in snd_vt1724_ac97_mixer() argument
1491 if (!(ice->eeprom.data[ICE_EEP2_ACLINK] & VT1724_CFG_PRO_I2S)) { in snd_vt1724_ac97_mixer()
1500 outb(inb(ICEMT1724(ice, AC97_CMD)) | 0x80, ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_mixer()
1502 outb(inb(ICEMT1724(ice, AC97_CMD)) & ~0x80, ICEMT1724(ice, AC97_CMD)); in snd_vt1724_ac97_mixer()
1504 err = snd_ac97_bus(ice->card, 0, &ops, NULL, &pbus); in snd_vt1724_ac97_mixer()
1508 ac97.private_data = ice; in snd_vt1724_ac97_mixer()
1509 err = snd_ac97_mixer(pbus, &ac97, &ice->ac97); in snd_vt1724_ac97_mixer()
1516 strcat(ice->card->mixername, "ICE1724 - multitrack"); in snd_vt1724_ac97_mixer()
1524 static inline unsigned int eeprom_triple(struct snd_ice1712 *ice, int idx) in eeprom_triple() argument
1526 return (unsigned int)ice->eeprom.data[idx] | \ in eeprom_triple()
1527 ((unsigned int)ice->eeprom.data[idx + 1] << 8) | \ in eeprom_triple()
1528 ((unsigned int)ice->eeprom.data[idx + 2] << 16); in eeprom_triple()
1534 struct snd_ice1712 *ice = entry->private_data; in snd_vt1724_proc_read() local
1537 snd_iprintf(buffer, "%s\n\n", ice->card->longname); in snd_vt1724_proc_read()
1540 snd_iprintf(buffer, " Subvendor : 0x%x\n", ice->eeprom.subvendor); in snd_vt1724_proc_read()
1541 snd_iprintf(buffer, " Size : %i bytes\n", ice->eeprom.size); in snd_vt1724_proc_read()
1542 snd_iprintf(buffer, " Version : %i\n", ice->eeprom.version); in snd_vt1724_proc_read()
1544 ice->eeprom.data[ICE_EEP2_SYSCONF]); in snd_vt1724_proc_read()
1546 ice->eeprom.data[ICE_EEP2_ACLINK]); in snd_vt1724_proc_read()
1548 ice->eeprom.data[ICE_EEP2_I2S]); in snd_vt1724_proc_read()
1550 ice->eeprom.data[ICE_EEP2_SPDIF]); in snd_vt1724_proc_read()
1552 ice->eeprom.gpiodir); in snd_vt1724_proc_read()
1554 ice->eeprom.gpiomask); in snd_vt1724_proc_read()
1556 ice->eeprom.gpiostate); in snd_vt1724_proc_read()
1557 for (idx = 0x12; idx < ice->eeprom.size; idx++) in snd_vt1724_proc_read()
1559 idx, ice->eeprom.data[idx]); in snd_vt1724_proc_read()
1564 (unsigned)inl(ICEMT1724(ice, ROUTE_PLAYBACK))); in snd_vt1724_proc_read()
1567 idx, inb(ice->port+idx)); in snd_vt1724_proc_read()
1570 idx, inb(ice->profi_port+idx)); in snd_vt1724_proc_read()
1573 static void snd_vt1724_proc_init(struct snd_ice1712 *ice) in snd_vt1724_proc_init() argument
1577 if (!snd_card_proc_new(ice->card, "ice1724", &entry)) in snd_vt1724_proc_init()
1578 snd_info_set_text_ops(entry, ice, snd_vt1724_proc_read); in snd_vt1724_proc_init()
1596 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_eeprom_get() local
1598 memcpy(ucontrol->value.bytes.data, &ice->eeprom, sizeof(ice->eeprom)); in snd_vt1724_eeprom_get()
1693 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_spdif_default_get() local
1695 val = inw(ICEMT1724(ice, SPDIF_CTRL)); in snd_vt1724_spdif_default_get()
1703 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_spdif_default_put() local
1707 spin_lock_irq(&ice->reg_lock); in snd_vt1724_spdif_default_put()
1708 old = inw(ICEMT1724(ice, SPDIF_CTRL)); in snd_vt1724_spdif_default_put()
1710 update_spdif_bits(ice, val); in snd_vt1724_spdif_default_put()
1711 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_spdif_default_put()
1770 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_spdif_sw_get() local
1771 ucontrol->value.integer.value[0] = inb(ICEREG1724(ice, SPDIF_CFG)) & in snd_vt1724_spdif_sw_get()
1779 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_spdif_sw_put() local
1782 spin_lock_irq(&ice->reg_lock); in snd_vt1724_spdif_sw_put()
1783 old = val = inb(ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_spdif_sw_put()
1788 outb(val, ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_spdif_sw_put()
1789 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_spdif_sw_put()
1815 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
1819 snd_ice1712_save_gpio_status(ice);
1821 (snd_ice1712_gpio_read(ice) & (1 << shift) ? 1 : 0) ^ invert;
1822 snd_ice1712_restore_gpio_status(ice);
1829 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
1837 snd_ice1712_save_gpio_status(ice);
1838 val = snd_ice1712_gpio_read(ice);
1841 snd_ice1712_gpio_write(ice, nval);
1842 snd_ice1712_restore_gpio_status(ice);
1853 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_internal_clock_info() local
1854 int hw_rates_count = ice->hw_rates->count; in snd_vt1724_pro_internal_clock_info()
1861 if (ice->force_rdma1 || in snd_vt1724_pro_internal_clock_info()
1862 (ice->eeprom.data[ICE_EEP2_SPDIF] & VT1724_CFG_SPDIF_IN)) in snd_vt1724_pro_internal_clock_info()
1863 uinfo->value.enumerated.items += ice->ext_clock_count; in snd_vt1724_pro_internal_clock_info()
1870 ice->ext_clock_names[ in snd_vt1724_pro_internal_clock_info()
1875 ice->hw_rates->list[uinfo->value.enumerated.item]); in snd_vt1724_pro_internal_clock_info()
1882 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_internal_clock_get() local
1885 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_get()
1886 if (ice->is_spdif_master(ice)) { in snd_vt1724_pro_internal_clock_get()
1887 ucontrol->value.enumerated.item[0] = ice->hw_rates->count + in snd_vt1724_pro_internal_clock_get()
1888 ice->get_spdif_master_type(ice); in snd_vt1724_pro_internal_clock_get()
1890 rate = ice->get_rate(ice); in snd_vt1724_pro_internal_clock_get()
1892 for (i = 0; i < ice->hw_rates->count; i++) { in snd_vt1724_pro_internal_clock_get()
1893 if (ice->hw_rates->list[i] == rate) { in snd_vt1724_pro_internal_clock_get()
1899 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_get()
1903 static int stdclock_get_spdif_master_type(struct snd_ice1712 *ice) in stdclock_get_spdif_master_type() argument
1910 static int stdclock_set_spdif_clock(struct snd_ice1712 *ice, int type) in stdclock_set_spdif_clock() argument
1914 oval = inb(ICEMT1724(ice, RATE)); in stdclock_set_spdif_clock()
1915 outb(oval | VT1724_SPDIF_MASTER, ICEMT1724(ice, RATE)); in stdclock_set_spdif_clock()
1917 i2s_oval = inb(ICEMT1724(ice, I2S_FORMAT)); in stdclock_set_spdif_clock()
1918 outb(i2s_oval & ~VT1724_MT_I2S_MCLK_128X, ICEMT1724(ice, I2S_FORMAT)); in stdclock_set_spdif_clock()
1926 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_internal_clock_put() local
1929 unsigned int first_ext_clock = ice->hw_rates->count; in snd_vt1724_pro_internal_clock_put()
1931 if (item > first_ext_clock + ice->ext_clock_count - 1) in snd_vt1724_pro_internal_clock_put()
1935 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_put()
1936 if (ice->is_spdif_master(ice)) in snd_vt1724_pro_internal_clock_put()
1939 old_rate = ice->get_rate(ice); in snd_vt1724_pro_internal_clock_put()
1942 ice->set_spdif_clock(ice, item - first_ext_clock); in snd_vt1724_pro_internal_clock_put()
1946 new_rate = ice->hw_rates->list[item]; in snd_vt1724_pro_internal_clock_put()
1947 ice->pro_rate_default = new_rate; in snd_vt1724_pro_internal_clock_put()
1948 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_put()
1949 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 1); in snd_vt1724_pro_internal_clock_put()
1950 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_put()
1952 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_internal_clock_put()
1958 if (ice->gpio.set_pro_rate) in snd_vt1724_pro_internal_clock_put()
1959 ice->gpio.set_pro_rate(ice, 0); in snd_vt1724_pro_internal_clock_put()
1960 for (i = 0; i < ice->akm_codecs; i++) { in snd_vt1724_pro_internal_clock_put()
1961 if (ice->akm[i].ops.set_rate_val) in snd_vt1724_pro_internal_clock_put()
1962 ice->akm[i].ops.set_rate_val(&ice->akm[i], 0); in snd_vt1724_pro_internal_clock_put()
1988 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_rate_locking_put() local
1992 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_rate_locking_put()
1995 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_rate_locking_put()
2019 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_rate_reset_put() local
2023 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_rate_reset_put()
2026 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_rate_reset_put()
2070 int snd_ice1724_get_route_val(struct snd_ice1712 *ice, int shift) in snd_ice1724_get_route_val() argument
2078 val = inl(ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_ice1724_get_route_val()
2089 int snd_ice1724_put_route_val(struct snd_ice1712 *ice, unsigned int val, in snd_ice1724_put_route_val() argument
2103 val = old_val = inl(ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_ice1724_put_route_val()
2108 outl(val, ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_ice1724_put_route_val()
2115 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_route_analog_get() local
2118 snd_ice1724_get_route_val(ice, analog_route_shift(idx)); in snd_vt1724_pro_route_analog_get()
2125 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_route_analog_put() local
2127 return snd_ice1724_put_route_val(ice, in snd_vt1724_pro_route_analog_put()
2135 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_route_spdif_get() local
2138 snd_ice1724_get_route_val(ice, digital_route_shift(idx)); in snd_vt1724_pro_route_spdif_get()
2145 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_route_spdif_put() local
2147 return snd_ice1724_put_route_val(ice, in snd_vt1724_pro_route_spdif_put()
2184 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_vt1724_pro_peak_get() local
2187 spin_lock_irq(&ice->reg_lock); in snd_vt1724_pro_peak_get()
2189 outb(idx, ICEMT1724(ice, MONITOR_PEAKINDEX)); in snd_vt1724_pro_peak_get()
2191 inb(ICEMT1724(ice, MONITOR_PEAKDATA)); in snd_vt1724_pro_peak_get()
2193 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_pro_peak_get()
2268 static void wait_i2c_busy(struct snd_ice1712 *ice) in wait_i2c_busy() argument
2271 while ((inb(ICEREG1724(ice, I2C_CTRL)) & VT1724_I2C_BUSY) && t--) in wait_i2c_busy()
2277 unsigned char snd_vt1724_read_i2c(struct snd_ice1712 *ice, in snd_vt1724_read_i2c() argument
2282 mutex_lock(&ice->i2c_mutex); in snd_vt1724_read_i2c()
2283 wait_i2c_busy(ice); in snd_vt1724_read_i2c()
2284 outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR)); in snd_vt1724_read_i2c()
2285 outb(dev & ~VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR)); in snd_vt1724_read_i2c()
2286 wait_i2c_busy(ice); in snd_vt1724_read_i2c()
2287 val = inb(ICEREG1724(ice, I2C_DATA)); in snd_vt1724_read_i2c()
2288 mutex_unlock(&ice->i2c_mutex); in snd_vt1724_read_i2c()
2295 void snd_vt1724_write_i2c(struct snd_ice1712 *ice, in snd_vt1724_write_i2c() argument
2298 mutex_lock(&ice->i2c_mutex); in snd_vt1724_write_i2c()
2299 wait_i2c_busy(ice); in snd_vt1724_write_i2c()
2303 outb(addr, ICEREG1724(ice, I2C_BYTE_ADDR)); in snd_vt1724_write_i2c()
2304 outb(data, ICEREG1724(ice, I2C_DATA)); in snd_vt1724_write_i2c()
2305 outb(dev | VT1724_I2C_WRITE, ICEREG1724(ice, I2C_DEV_ADDR)); in snd_vt1724_write_i2c()
2306 wait_i2c_busy(ice); in snd_vt1724_write_i2c()
2307 mutex_unlock(&ice->i2c_mutex); in snd_vt1724_write_i2c()
2310 static int snd_vt1724_read_eeprom(struct snd_ice1712 *ice, in snd_vt1724_read_eeprom() argument
2318 ice->eeprom.subvendor = 0; in snd_vt1724_read_eeprom()
2319 if ((inb(ICEREG1724(ice, I2C_CTRL)) & VT1724_I2C_EEPROM) != 0) in snd_vt1724_read_eeprom()
2320 ice->eeprom.subvendor = in snd_vt1724_read_eeprom()
2321 (snd_vt1724_read_i2c(ice, dev, 0x00) << 0) | in snd_vt1724_read_eeprom()
2322 (snd_vt1724_read_i2c(ice, dev, 0x01) << 8) | in snd_vt1724_read_eeprom()
2323 (snd_vt1724_read_i2c(ice, dev, 0x02) << 16) | in snd_vt1724_read_eeprom()
2324 (snd_vt1724_read_i2c(ice, dev, 0x03) << 24); in snd_vt1724_read_eeprom()
2325 if (ice->eeprom.subvendor == 0 || in snd_vt1724_read_eeprom()
2326 ice->eeprom.subvendor == (unsigned int)-1) { in snd_vt1724_read_eeprom()
2331 pci_read_config_word(ice->pci, PCI_SUBSYSTEM_VENDOR_ID, in snd_vt1724_read_eeprom()
2333 pci_read_config_word(ice->pci, PCI_SUBSYSTEM_ID, &device); in snd_vt1724_read_eeprom()
2334 ice->eeprom.subvendor = in snd_vt1724_read_eeprom()
2336 if (ice->eeprom.subvendor == 0 || in snd_vt1724_read_eeprom()
2337 ice->eeprom.subvendor == (unsigned int)-1) { in snd_vt1724_read_eeprom()
2349 ice->eeprom.subvendor = c->subvendor; in snd_vt1724_read_eeprom()
2350 } else if (c->subvendor != ice->eeprom.subvendor) in snd_vt1724_read_eeprom()
2352 ice->card_info = c; in snd_vt1724_read_eeprom()
2357 ice->eeprom.version = 2; in snd_vt1724_read_eeprom()
2358 ice->eeprom.size = c->eeprom_size + 6; in snd_vt1724_read_eeprom()
2359 memcpy(ice->eeprom.data, c->eeprom_data, c->eeprom_size); in snd_vt1724_read_eeprom()
2364 ice->eeprom.subvendor); in snd_vt1724_read_eeprom()
2367 ice->pm_suspend_enabled = 1; in snd_vt1724_read_eeprom()
2371 ice->eeprom.size = snd_vt1724_read_i2c(ice, dev, 0x04); in snd_vt1724_read_eeprom()
2372 if (ice->eeprom.size < 6) in snd_vt1724_read_eeprom()
2373 ice->eeprom.size = 32; in snd_vt1724_read_eeprom()
2374 else if (ice->eeprom.size > 32) { in snd_vt1724_read_eeprom()
2376 ice->eeprom.size); in snd_vt1724_read_eeprom()
2379 ice->eeprom.version = snd_vt1724_read_i2c(ice, dev, 0x05); in snd_vt1724_read_eeprom()
2380 if (ice->eeprom.version != 1 && ice->eeprom.version != 2) in snd_vt1724_read_eeprom()
2382 ice->eeprom.version); in snd_vt1724_read_eeprom()
2383 size = ice->eeprom.size - 6; in snd_vt1724_read_eeprom()
2385 ice->eeprom.data[i] = snd_vt1724_read_i2c(ice, dev, i + 6); in snd_vt1724_read_eeprom()
2388 ice->eeprom.gpiomask = eeprom_triple(ice, ICE_EEP2_GPIO_MASK); in snd_vt1724_read_eeprom()
2389 ice->eeprom.gpiostate = eeprom_triple(ice, ICE_EEP2_GPIO_STATE); in snd_vt1724_read_eeprom()
2390 ice->eeprom.gpiodir = eeprom_triple(ice, ICE_EEP2_GPIO_DIR); in snd_vt1724_read_eeprom()
2397 static void snd_vt1724_chip_reset(struct snd_ice1712 *ice) in snd_vt1724_chip_reset() argument
2399 outb(VT1724_RESET , ICEREG1724(ice, CONTROL)); in snd_vt1724_chip_reset()
2400 inb(ICEREG1724(ice, CONTROL)); /* pci posting flush */ in snd_vt1724_chip_reset()
2402 outb(0, ICEREG1724(ice, CONTROL)); in snd_vt1724_chip_reset()
2403 inb(ICEREG1724(ice, CONTROL)); /* pci posting flush */ in snd_vt1724_chip_reset()
2407 static int snd_vt1724_chip_init(struct snd_ice1712 *ice) in snd_vt1724_chip_init() argument
2409 outb(ice->eeprom.data[ICE_EEP2_SYSCONF], ICEREG1724(ice, SYS_CFG)); in snd_vt1724_chip_init()
2410 outb(ice->eeprom.data[ICE_EEP2_ACLINK], ICEREG1724(ice, AC97_CFG)); in snd_vt1724_chip_init()
2411 outb(ice->eeprom.data[ICE_EEP2_I2S], ICEREG1724(ice, I2S_FEATURES)); in snd_vt1724_chip_init()
2412 outb(ice->eeprom.data[ICE_EEP2_SPDIF], ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_chip_init()
2414 ice->gpio.write_mask = ice->eeprom.gpiomask; in snd_vt1724_chip_init()
2415 ice->gpio.direction = ice->eeprom.gpiodir; in snd_vt1724_chip_init()
2416 snd_vt1724_set_gpio_mask(ice, ice->eeprom.gpiomask); in snd_vt1724_chip_init()
2417 snd_vt1724_set_gpio_dir(ice, ice->eeprom.gpiodir); in snd_vt1724_chip_init()
2418 snd_vt1724_set_gpio_data(ice, ice->eeprom.gpiostate); in snd_vt1724_chip_init()
2420 outb(0, ICEREG1724(ice, POWERDOWN)); in snd_vt1724_chip_init()
2423 outb(VT1724_IRQ_MPU_RX | VT1724_IRQ_MPU_TX , ICEREG1724(ice, IRQMASK)); in snd_vt1724_chip_init()
2428 outb(VT1724_MULTI_FIFO_ERR, ICEMT1724(ice, DMA_INT_MASK)); in snd_vt1724_chip_init()
2433 static int snd_vt1724_spdif_build_controls(struct snd_ice1712 *ice) in snd_vt1724_spdif_build_controls() argument
2438 if (snd_BUG_ON(!ice->pcm)) in snd_vt1724_spdif_build_controls()
2441 if (!ice->own_routing) { in snd_vt1724_spdif_build_controls()
2442 err = snd_ctl_add(ice->card, in snd_vt1724_spdif_build_controls()
2443 snd_ctl_new1(&snd_vt1724_mixer_pro_spdif_route, ice)); in snd_vt1724_spdif_build_controls()
2448 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_spdif_switch, ice)); in snd_vt1724_spdif_build_controls()
2452 err = snd_ctl_add(ice->card, kctl = snd_ctl_new1(&snd_vt1724_spdif_default, ice)); in snd_vt1724_spdif_build_controls()
2455 kctl->id.device = ice->pcm->device; in snd_vt1724_spdif_build_controls()
2456 err = snd_ctl_add(ice->card, kctl = snd_ctl_new1(&snd_vt1724_spdif_maskc, ice)); in snd_vt1724_spdif_build_controls()
2459 kctl->id.device = ice->pcm->device; in snd_vt1724_spdif_build_controls()
2460 err = snd_ctl_add(ice->card, kctl = snd_ctl_new1(&snd_vt1724_spdif_maskp, ice)); in snd_vt1724_spdif_build_controls()
2463 kctl->id.device = ice->pcm->device; in snd_vt1724_spdif_build_controls()
2465 err = snd_ctl_add(ice->card, kctl = snd_ctl_new1(&snd_vt1724_spdif_stream, ice)); in snd_vt1724_spdif_build_controls()
2468 kctl->id.device = ice->pcm->device; in snd_vt1724_spdif_build_controls()
2469 ice->spdif.stream_ctl = kctl; in snd_vt1724_spdif_build_controls()
2475 static int snd_vt1724_build_controls(struct snd_ice1712 *ice) in snd_vt1724_build_controls() argument
2479 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_eeprom, ice)); in snd_vt1724_build_controls()
2482 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_pro_internal_clock, ice)); in snd_vt1724_build_controls()
2486 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_pro_rate_locking, ice)); in snd_vt1724_build_controls()
2489 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_pro_rate_reset, ice)); in snd_vt1724_build_controls()
2493 if (!ice->own_routing && ice->num_total_dacs > 0) { in snd_vt1724_build_controls()
2495 tmp.count = ice->num_total_dacs; in snd_vt1724_build_controls()
2496 if (ice->vt1720 && tmp.count > 2) in snd_vt1724_build_controls()
2498 err = snd_ctl_add(ice->card, snd_ctl_new1(&tmp, ice)); in snd_vt1724_build_controls()
2503 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_vt1724_mixer_pro_peak, ice)); in snd_vt1724_build_controls()
2510 static int snd_vt1724_free(struct snd_ice1712 *ice) in snd_vt1724_free() argument
2512 if (!ice->port) in snd_vt1724_free()
2515 outb(0xff, ICEMT1724(ice, DMA_INT_MASK)); in snd_vt1724_free()
2516 outb(0xff, ICEREG1724(ice, IRQMASK)); in snd_vt1724_free()
2519 if (ice->irq >= 0) in snd_vt1724_free()
2520 free_irq(ice->irq, ice); in snd_vt1724_free()
2521 pci_release_regions(ice->pci); in snd_vt1724_free()
2522 snd_ice1712_akm4xxx_free(ice); in snd_vt1724_free()
2523 pci_disable_device(ice->pci); in snd_vt1724_free()
2524 kfree(ice->spec); in snd_vt1724_free()
2525 kfree(ice); in snd_vt1724_free()
2531 struct snd_ice1712 *ice = device->device_data; in snd_vt1724_dev_free() local
2532 return snd_vt1724_free(ice); in snd_vt1724_dev_free()
2540 struct snd_ice1712 *ice; in snd_vt1724_create() local
2553 ice = kzalloc(sizeof(*ice), GFP_KERNEL); in snd_vt1724_create()
2554 if (ice == NULL) { in snd_vt1724_create()
2558 ice->vt1724 = 1; in snd_vt1724_create()
2559 spin_lock_init(&ice->reg_lock); in snd_vt1724_create()
2560 mutex_init(&ice->gpio_mutex); in snd_vt1724_create()
2561 mutex_init(&ice->open_mutex); in snd_vt1724_create()
2562 mutex_init(&ice->i2c_mutex); in snd_vt1724_create()
2563 ice->gpio.set_mask = snd_vt1724_set_gpio_mask; in snd_vt1724_create()
2564 ice->gpio.get_mask = snd_vt1724_get_gpio_mask; in snd_vt1724_create()
2565 ice->gpio.set_dir = snd_vt1724_set_gpio_dir; in snd_vt1724_create()
2566 ice->gpio.get_dir = snd_vt1724_get_gpio_dir; in snd_vt1724_create()
2567 ice->gpio.set_data = snd_vt1724_set_gpio_data; in snd_vt1724_create()
2568 ice->gpio.get_data = snd_vt1724_get_gpio_data; in snd_vt1724_create()
2569 ice->card = card; in snd_vt1724_create()
2570 ice->pci = pci; in snd_vt1724_create()
2571 ice->irq = -1; in snd_vt1724_create()
2573 snd_vt1724_proc_init(ice); in snd_vt1724_create()
2576 card->private_data = ice; in snd_vt1724_create()
2580 kfree(ice); in snd_vt1724_create()
2584 ice->port = pci_resource_start(pci, 0); in snd_vt1724_create()
2585 ice->profi_port = pci_resource_start(pci, 1); in snd_vt1724_create()
2588 IRQF_SHARED, KBUILD_MODNAME, ice)) { in snd_vt1724_create()
2590 snd_vt1724_free(ice); in snd_vt1724_create()
2594 ice->irq = pci->irq; in snd_vt1724_create()
2596 snd_vt1724_chip_reset(ice); in snd_vt1724_create()
2597 if (snd_vt1724_read_eeprom(ice, modelname) < 0) { in snd_vt1724_create()
2598 snd_vt1724_free(ice); in snd_vt1724_create()
2601 if (snd_vt1724_chip_init(ice) < 0) { in snd_vt1724_create()
2602 snd_vt1724_free(ice); in snd_vt1724_create()
2606 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, ice, &ops); in snd_vt1724_create()
2608 snd_vt1724_free(ice); in snd_vt1724_create()
2614 *r_ice1712 = ice; in snd_vt1724_create()
2630 struct snd_ice1712 *ice; in snd_vt1724_probe() local
2648 err = snd_vt1724_create(card, pci, model[dev], &ice); in snd_vt1724_probe()
2655 ice->ext_clock_count = 0; in snd_vt1724_probe()
2661 (c->subvendor == ice->eeprom.subvendor)) { in snd_vt1724_probe()
2666 err = c->chip_init(ice); in snd_vt1724_probe()
2686 ice->pro_rate_default = PRO_RATE_DEFAULT; in snd_vt1724_probe()
2687 if (!ice->is_spdif_master) in snd_vt1724_probe()
2688 ice->is_spdif_master = stdclock_is_spdif_master; in snd_vt1724_probe()
2689 if (!ice->get_rate) in snd_vt1724_probe()
2690 ice->get_rate = stdclock_get_rate; in snd_vt1724_probe()
2691 if (!ice->set_rate) in snd_vt1724_probe()
2692 ice->set_rate = stdclock_set_rate; in snd_vt1724_probe()
2693 if (!ice->set_mclk) in snd_vt1724_probe()
2694 ice->set_mclk = stdclock_set_mclk; in snd_vt1724_probe()
2695 if (!ice->set_spdif_clock) in snd_vt1724_probe()
2696 ice->set_spdif_clock = stdclock_set_spdif_clock; in snd_vt1724_probe()
2697 if (!ice->get_spdif_master_type) in snd_vt1724_probe()
2698 ice->get_spdif_master_type = stdclock_get_spdif_master_type; in snd_vt1724_probe()
2699 if (!ice->ext_clock_names) in snd_vt1724_probe()
2700 ice->ext_clock_names = ext_clock_names; in snd_vt1724_probe()
2701 if (!ice->ext_clock_count) in snd_vt1724_probe()
2702 ice->ext_clock_count = ARRAY_SIZE(ext_clock_names); in snd_vt1724_probe()
2704 if (!ice->hw_rates) in snd_vt1724_probe()
2705 set_std_hw_rates(ice); in snd_vt1724_probe()
2707 err = snd_vt1724_pcm_profi(ice, pcm_dev++); in snd_vt1724_probe()
2713 err = snd_vt1724_pcm_spdif(ice, pcm_dev++); in snd_vt1724_probe()
2719 err = snd_vt1724_pcm_indep(ice, pcm_dev++); in snd_vt1724_probe()
2725 err = snd_vt1724_ac97_mixer(ice); in snd_vt1724_probe()
2731 err = snd_vt1724_build_controls(ice); in snd_vt1724_probe()
2737 if (ice->pcm && ice->has_spdif) { /* has SPDIF I/O */ in snd_vt1724_probe()
2738 err = snd_vt1724_spdif_build_controls(ice); in snd_vt1724_probe()
2746 err = c->build_controls(ice); in snd_vt1724_probe()
2754 if (ice->eeprom.data[ICE_EEP2_SYSCONF] & VT1724_CFG_MPU401) { in snd_vt1724_probe()
2762 ice->rmidi[0] = rmidi; in snd_vt1724_probe()
2763 rmidi->private_data = ice; in snd_vt1724_probe()
2775 ICEREG1724(ice, MPU_FIFO_WM)); in snd_vt1724_probe()
2776 outb(0x1, ICEREG1724(ice, MPU_FIFO_WM)); in snd_vt1724_probe()
2778 outb(VT1724_MPU_UART, ICEREG1724(ice, MPU_CTRL)); in snd_vt1724_probe()
2783 card->shortname, ice->port, ice->irq); in snd_vt1724_probe()
2798 struct snd_ice1712 *ice = card->private_data; in snd_vt1724_remove() local
2800 if (ice->card_info && ice->card_info->chip_exit) in snd_vt1724_remove()
2801 ice->card_info->chip_exit(ice); in snd_vt1724_remove()
2811 struct snd_ice1712 *ice = card->private_data; in snd_vt1724_suspend() local
2813 if (!ice->pm_suspend_enabled) in snd_vt1724_suspend()
2818 snd_pcm_suspend_all(ice->pcm); in snd_vt1724_suspend()
2819 snd_pcm_suspend_all(ice->pcm_pro); in snd_vt1724_suspend()
2820 snd_pcm_suspend_all(ice->pcm_ds); in snd_vt1724_suspend()
2821 snd_ac97_suspend(ice->ac97); in snd_vt1724_suspend()
2823 spin_lock_irq(&ice->reg_lock); in snd_vt1724_suspend()
2824 ice->pm_saved_is_spdif_master = ice->is_spdif_master(ice); in snd_vt1724_suspend()
2825 ice->pm_saved_spdif_ctrl = inw(ICEMT1724(ice, SPDIF_CTRL)); in snd_vt1724_suspend()
2826 ice->pm_saved_spdif_cfg = inb(ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_suspend()
2827 ice->pm_saved_route = inl(ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_vt1724_suspend()
2828 spin_unlock_irq(&ice->reg_lock); in snd_vt1724_suspend()
2830 if (ice->pm_suspend) in snd_vt1724_suspend()
2831 ice->pm_suspend(ice); in snd_vt1724_suspend()
2843 struct snd_ice1712 *ice = card->private_data; in snd_vt1724_resume() local
2845 if (!ice->pm_suspend_enabled) in snd_vt1724_resume()
2858 snd_vt1724_chip_reset(ice); in snd_vt1724_resume()
2860 if (snd_vt1724_chip_init(ice) < 0) { in snd_vt1724_resume()
2865 if (ice->pm_resume) in snd_vt1724_resume()
2866 ice->pm_resume(ice); in snd_vt1724_resume()
2868 if (ice->pm_saved_is_spdif_master) { in snd_vt1724_resume()
2870 ice->set_spdif_clock(ice, 0); in snd_vt1724_resume()
2874 if (ice->cur_rate) in snd_vt1724_resume()
2875 rate = ice->cur_rate; in snd_vt1724_resume()
2877 rate = ice->pro_rate_default; in snd_vt1724_resume()
2878 snd_vt1724_set_pro_rate(ice, rate, 1); in snd_vt1724_resume()
2881 update_spdif_bits(ice, ice->pm_saved_spdif_ctrl); in snd_vt1724_resume()
2883 outb(ice->pm_saved_spdif_cfg, ICEREG1724(ice, SPDIF_CFG)); in snd_vt1724_resume()
2884 outl(ice->pm_saved_route, ICEMT1724(ice, ROUTE_PLAYBACK)); in snd_vt1724_resume()
2886 if (ice->ac97) in snd_vt1724_resume()
2887 snd_ac97_resume(ice->ac97); in snd_vt1724_resume()