Lines Matching full:ice
89 { PCI_VDEVICE(ICE, PCI_DEVICE_ID_ICE_1712), 0 }, /* ICE1712 */
95 static int snd_ice1712_build_pro_mixer(struct snd_ice1712 *ice);
96 static int snd_ice1712_build_controls(struct snd_ice1712 *ice);
107 static inline int is_spdif_master(struct snd_ice1712 *ice) in is_spdif_master() argument
109 return (inb(ICEMT(ice, RATE)) & ICE1712_SPDIF_MASTER) ? 1 : 0; in is_spdif_master()
112 static inline int is_pro_rate_locked(struct snd_ice1712 *ice) in is_pro_rate_locked() argument
114 return is_spdif_master(ice) || PRO_RATE_LOCKED; in is_pro_rate_locked()
117 static inline void snd_ice1712_ds_write(struct snd_ice1712 *ice, u8 channel, u8 addr, u32 data) in snd_ice1712_ds_write() argument
119 outb((channel << 4) | addr, ICEDS(ice, INDEX)); in snd_ice1712_ds_write()
120 outl(data, ICEDS(ice, DATA)); in snd_ice1712_ds_write()
123 static inline u32 snd_ice1712_ds_read(struct snd_ice1712 *ice, u8 channel, u8 addr) in snd_ice1712_ds_read() argument
125 outb((channel << 4) | addr, ICEDS(ice, INDEX)); in snd_ice1712_ds_read()
126 return inl(ICEDS(ice, DATA)); in snd_ice1712_ds_read()
133 struct snd_ice1712 *ice = ac97->private_data; in snd_ice1712_ac97_write() local
138 old_cmd = inb(ICEREG(ice, AC97_CMD)); in snd_ice1712_ac97_write()
145 outb(reg, ICEREG(ice, AC97_INDEX)); in snd_ice1712_ac97_write()
146 outw(val, ICEREG(ice, AC97_DATA)); in snd_ice1712_ac97_write()
148 outb(old_cmd | ICE1712_AC97_WRITE, ICEREG(ice, AC97_CMD)); in snd_ice1712_ac97_write()
150 if ((inb(ICEREG(ice, AC97_CMD)) & ICE1712_AC97_WRITE) == 0) in snd_ice1712_ac97_write()
157 struct snd_ice1712 *ice = ac97->private_data; in snd_ice1712_ac97_read() local
162 old_cmd = inb(ICEREG(ice, AC97_CMD)); in snd_ice1712_ac97_read()
169 outb(reg, ICEREG(ice, AC97_INDEX)); in snd_ice1712_ac97_read()
170 outb(old_cmd | ICE1712_AC97_READ, ICEREG(ice, AC97_CMD)); in snd_ice1712_ac97_read()
172 if ((inb(ICEREG(ice, AC97_CMD)) & ICE1712_AC97_READ) == 0) in snd_ice1712_ac97_read()
176 return inw(ICEREG(ice, AC97_DATA)); in snd_ice1712_ac97_read()
187 struct snd_ice1712 *ice = ac97->private_data; in snd_ice1712_pro_ac97_write() local
192 old_cmd = inb(ICEMT(ice, AC97_CMD)); in snd_ice1712_pro_ac97_write()
199 outb(reg, ICEMT(ice, AC97_INDEX)); in snd_ice1712_pro_ac97_write()
200 outw(val, ICEMT(ice, AC97_DATA)); in snd_ice1712_pro_ac97_write()
202 outb(old_cmd | ICE1712_AC97_WRITE, ICEMT(ice, AC97_CMD)); in snd_ice1712_pro_ac97_write()
204 if ((inb(ICEMT(ice, AC97_CMD)) & ICE1712_AC97_WRITE) == 0) in snd_ice1712_pro_ac97_write()
212 struct snd_ice1712 *ice = ac97->private_data; in snd_ice1712_pro_ac97_read() local
217 old_cmd = inb(ICEMT(ice, AC97_CMD)); in snd_ice1712_pro_ac97_read()
224 outb(reg, ICEMT(ice, AC97_INDEX)); in snd_ice1712_pro_ac97_read()
225 outb(old_cmd | ICE1712_AC97_READ, ICEMT(ice, AC97_CMD)); in snd_ice1712_pro_ac97_read()
227 if ((inb(ICEMT(ice, AC97_CMD)) & ICE1712_AC97_READ) == 0) in snd_ice1712_pro_ac97_read()
231 return inw(ICEMT(ice, AC97_DATA)); in snd_ice1712_pro_ac97_read()
241 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_digmix_route_ac97_get() local
243 ucontrol->value.integer.value[0] = inb(ICEMT(ice, MONITOR_ROUTECTRL)) & ICE1712_ROUTE_AC97 ? 1 : 0; in snd_ice1712_digmix_route_ac97_get()
249 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_digmix_route_ac97_put() local
252 spin_lock_irq(&ice->reg_lock); in snd_ice1712_digmix_route_ac97_put()
253 val = inb(ICEMT(ice, MONITOR_ROUTECTRL)); in snd_ice1712_digmix_route_ac97_put()
257 outb(nval, ICEMT(ice, MONITOR_ROUTECTRL)); in snd_ice1712_digmix_route_ac97_put()
258 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_digmix_route_ac97_put()
274 static void snd_ice1712_set_gpio_dir(struct snd_ice1712 *ice, unsigned int data) in snd_ice1712_set_gpio_dir() argument
276 snd_ice1712_write(ice, ICE1712_IREG_GPIO_DIRECTION, data); in snd_ice1712_set_gpio_dir()
277 inb(ICEREG(ice, DATA)); /* dummy read for pci-posting */ in snd_ice1712_set_gpio_dir()
280 static unsigned int snd_ice1712_get_gpio_dir(struct snd_ice1712 *ice) in snd_ice1712_get_gpio_dir() argument
282 return snd_ice1712_read(ice, ICE1712_IREG_GPIO_DIRECTION); in snd_ice1712_get_gpio_dir()
285 static unsigned int snd_ice1712_get_gpio_mask(struct snd_ice1712 *ice) in snd_ice1712_get_gpio_mask() argument
287 return snd_ice1712_read(ice, ICE1712_IREG_GPIO_WRITE_MASK); in snd_ice1712_get_gpio_mask()
290 static void snd_ice1712_set_gpio_mask(struct snd_ice1712 *ice, unsigned int data) in snd_ice1712_set_gpio_mask() argument
292 snd_ice1712_write(ice, ICE1712_IREG_GPIO_WRITE_MASK, data); in snd_ice1712_set_gpio_mask()
293 inb(ICEREG(ice, DATA)); /* dummy read for pci-posting */ in snd_ice1712_set_gpio_mask()
296 static unsigned int snd_ice1712_get_gpio_data(struct snd_ice1712 *ice) in snd_ice1712_get_gpio_data() argument
298 return snd_ice1712_read(ice, ICE1712_IREG_GPIO_DATA); in snd_ice1712_get_gpio_data()
301 static void snd_ice1712_set_gpio_data(struct snd_ice1712 *ice, unsigned int val) in snd_ice1712_set_gpio_data() argument
303 snd_ice1712_write(ice, ICE1712_IREG_GPIO_DATA, val); in snd_ice1712_set_gpio_data()
304 inb(ICEREG(ice, DATA)); /* dummy read for pci-posting */ in snd_ice1712_set_gpio_data()
317 static int snd_ice1712_cs8427_set_input_clock(struct snd_ice1712 *ice, int spdif_clock) in snd_ice1712_cs8427_set_input_clock() argument
323 snd_i2c_lock(ice->i2c); in snd_ice1712_cs8427_set_input_clock()
324 if (snd_i2c_sendbytes(ice->cs8427, reg, 1) != 1) { in snd_ice1712_cs8427_set_input_clock()
325 snd_i2c_unlock(ice->i2c); in snd_ice1712_cs8427_set_input_clock()
328 if (snd_i2c_readbytes(ice->cs8427, &val, 1) != 1) { in snd_ice1712_cs8427_set_input_clock()
329 snd_i2c_unlock(ice->i2c); in snd_ice1712_cs8427_set_input_clock()
339 if (snd_i2c_sendbytes(ice->cs8427, reg, 2) != 2) { in snd_ice1712_cs8427_set_input_clock()
345 snd_i2c_unlock(ice->i2c); in snd_ice1712_cs8427_set_input_clock()
352 static void open_cs8427(struct snd_ice1712 *ice, struct snd_pcm_substream *substream) in open_cs8427() argument
354 snd_cs8427_iec958_active(ice->cs8427, 1); in open_cs8427()
357 static void close_cs8427(struct snd_ice1712 *ice, struct snd_pcm_substream *substream) in close_cs8427() argument
359 snd_cs8427_iec958_active(ice->cs8427, 0); in close_cs8427()
362 static void setup_cs8427(struct snd_ice1712 *ice, int rate) in setup_cs8427() argument
364 snd_cs8427_iec958_pcm(ice->cs8427, rate); in setup_cs8427()
370 int snd_ice1712_init_cs8427(struct snd_ice1712 *ice, int addr) in snd_ice1712_init_cs8427() argument
374 err = snd_cs8427_create(ice->i2c, addr, in snd_ice1712_init_cs8427()
375 (ice->cs8427_timeout * HZ) / 1000, &ice->cs8427); in snd_ice1712_init_cs8427()
377 dev_err(ice->card->dev, "CS8427 initialization failed\n"); in snd_ice1712_init_cs8427()
380 ice->spdif.ops.open = open_cs8427; in snd_ice1712_init_cs8427()
381 ice->spdif.ops.close = close_cs8427; in snd_ice1712_init_cs8427()
382 ice->spdif.ops.setup_rate = setup_cs8427; in snd_ice1712_init_cs8427()
386 static void snd_ice1712_set_input_clock_source(struct snd_ice1712 *ice, int spdif_is_master) in snd_ice1712_set_input_clock_source() argument
389 if (ice->cs8427) in snd_ice1712_set_input_clock_source()
390 snd_ice1712_cs8427_set_input_clock(ice, spdif_is_master); in snd_ice1712_set_input_clock_source()
394 for (i = 0; i < ice->akm_codecs; i++) { in snd_ice1712_set_input_clock_source()
395 if (ice->akm[i].ops.set_rate_val) in snd_ice1712_set_input_clock_source()
396 ice->akm[i].ops.set_rate_val(&ice->akm[i], 0); in snd_ice1712_set_input_clock_source()
407 struct snd_ice1712 *ice = dev_id; in snd_ice1712_interrupt() local
412 status = inb(ICEREG(ice, IRQSTAT)); in snd_ice1712_interrupt()
417 if (ice->rmidi[0]) in snd_ice1712_interrupt()
418 snd_mpu401_uart_interrupt(irq, ice->rmidi[0]->private_data); in snd_ice1712_interrupt()
419 outb(ICE1712_IRQ_MPU1, ICEREG(ice, IRQSTAT)); in snd_ice1712_interrupt()
423 outb(ICE1712_IRQ_TIMER, ICEREG(ice, IRQSTAT)); in snd_ice1712_interrupt()
425 if (ice->rmidi[1]) in snd_ice1712_interrupt()
426 snd_mpu401_uart_interrupt(irq, ice->rmidi[1]->private_data); in snd_ice1712_interrupt()
427 outb(ICE1712_IRQ_MPU2, ICEREG(ice, IRQSTAT)); in snd_ice1712_interrupt()
431 unsigned char mtstat = inb(ICEMT(ice, IRQ)); in snd_ice1712_interrupt()
433 if (ice->playback_pro_substream) in snd_ice1712_interrupt()
434 snd_pcm_period_elapsed(ice->playback_pro_substream); in snd_ice1712_interrupt()
435 outb(ICE1712_MULTI_PBKSTATUS, ICEMT(ice, IRQ)); in snd_ice1712_interrupt()
438 if (ice->capture_pro_substream) in snd_ice1712_interrupt()
439 snd_pcm_period_elapsed(ice->capture_pro_substream); in snd_ice1712_interrupt()
440 outb(ICE1712_MULTI_CAPSTATUS, ICEMT(ice, IRQ)); in snd_ice1712_interrupt()
444 outb(ICE1712_IRQ_FM, ICEREG(ice, IRQSTAT)); in snd_ice1712_interrupt()
449 pbkstatus = inw(ICEDS(ice, INTSTAT)); in snd_ice1712_interrupt()
450 /* dev_dbg(ice->card->dev, "pbkstatus = 0x%x\n", pbkstatus); */ in snd_ice1712_interrupt()
454 substream = ice->playback_con_substream_ds[idx]; in snd_ice1712_interrupt()
457 outw(3 << (idx * 2), ICEDS(ice, INTSTAT)); in snd_ice1712_interrupt()
459 outb(ICE1712_IRQ_PBKDS, ICEREG(ice, IRQSTAT)); in snd_ice1712_interrupt()
462 if (ice->capture_con_substream) in snd_ice1712_interrupt()
463 snd_pcm_period_elapsed(ice->capture_con_substream); in snd_ice1712_interrupt()
464 outb(ICE1712_IRQ_CONCAP, ICEREG(ice, IRQSTAT)); in snd_ice1712_interrupt()
467 if (ice->playback_con_substream) in snd_ice1712_interrupt()
468 snd_pcm_period_elapsed(ice->playback_con_substream); in snd_ice1712_interrupt()
469 outb(ICE1712_IRQ_CONPBK, ICEREG(ice, IRQSTAT)); in snd_ice1712_interrupt()
483 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_playback_trigger() local
487 spin_lock(&ice->reg_lock); in snd_ice1712_playback_trigger()
488 tmp = snd_ice1712_read(ice, ICE1712_IREG_PBK_CTRL); in snd_ice1712_playback_trigger()
500 snd_ice1712_write(ice, ICE1712_IREG_PBK_CTRL, tmp); in snd_ice1712_playback_trigger()
501 spin_unlock(&ice->reg_lock); in snd_ice1712_playback_trigger()
508 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_playback_ds_trigger() local
512 spin_lock(&ice->reg_lock); in snd_ice1712_playback_ds_trigger()
513 tmp = snd_ice1712_ds_read(ice, substream->number * 2, ICE1712_DSC_CONTROL); in snd_ice1712_playback_ds_trigger()
525 snd_ice1712_ds_write(ice, substream->number * 2, ICE1712_DSC_CONTROL, tmp); in snd_ice1712_playback_ds_trigger()
526 spin_unlock(&ice->reg_lock); in snd_ice1712_playback_ds_trigger()
533 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_capture_trigger() local
537 spin_lock(&ice->reg_lock); in snd_ice1712_capture_trigger()
538 tmp = snd_ice1712_read(ice, ICE1712_IREG_CAP_CTRL); in snd_ice1712_capture_trigger()
546 snd_ice1712_write(ice, ICE1712_IREG_CAP_CTRL, tmp); in snd_ice1712_capture_trigger()
547 spin_unlock(&ice->reg_lock); in snd_ice1712_capture_trigger()
553 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_playback_prepare() local
567 spin_lock_irq(&ice->reg_lock); in snd_ice1712_playback_prepare()
568 outb(0, ice->ddma_port + 15); in snd_ice1712_playback_prepare()
569 outb(ICE1712_DMA_MODE_WRITE | ICE1712_DMA_AUTOINIT, ice->ddma_port + 0x0b); in snd_ice1712_playback_prepare()
570 outl(runtime->dma_addr, ice->ddma_port + 0); in snd_ice1712_playback_prepare()
571 outw(buf_size, ice->ddma_port + 4); in snd_ice1712_playback_prepare()
572 snd_ice1712_write(ice, ICE1712_IREG_PBK_RATE_LO, rate & 0xff); in snd_ice1712_playback_prepare()
573 snd_ice1712_write(ice, ICE1712_IREG_PBK_RATE_MID, (rate >> 8) & 0xff); in snd_ice1712_playback_prepare()
574 snd_ice1712_write(ice, ICE1712_IREG_PBK_RATE_HI, (rate >> 16) & 0xff); in snd_ice1712_playback_prepare()
575 snd_ice1712_write(ice, ICE1712_IREG_PBK_CTRL, tmp); in snd_ice1712_playback_prepare()
576 snd_ice1712_write(ice, ICE1712_IREG_PBK_COUNT_LO, period_size & 0xff); in snd_ice1712_playback_prepare()
577 snd_ice1712_write(ice, ICE1712_IREG_PBK_COUNT_HI, period_size >> 8); in snd_ice1712_playback_prepare()
578 snd_ice1712_write(ice, ICE1712_IREG_PBK_LEFT, 0); in snd_ice1712_playback_prepare()
579 snd_ice1712_write(ice, ICE1712_IREG_PBK_RIGHT, 0); in snd_ice1712_playback_prepare()
580 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_playback_prepare()
586 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_playback_ds_prepare() local
599 ice->playback_con_active_buf[substream->number] = 0; in snd_ice1712_playback_ds_prepare()
600 ice->playback_con_virt_addr[substream->number] = runtime->dma_addr; in snd_ice1712_playback_ds_prepare()
602 spin_lock_irq(&ice->reg_lock); in snd_ice1712_playback_ds_prepare()
603 snd_ice1712_ds_write(ice, chn, ICE1712_DSC_ADDR0, runtime->dma_addr); in snd_ice1712_playback_ds_prepare()
604 snd_ice1712_ds_write(ice, chn, ICE1712_DSC_COUNT0, period_size); in snd_ice1712_playback_ds_prepare()
605 …snd_ice1712_ds_write(ice, chn, ICE1712_DSC_ADDR1, runtime->dma_addr + (runtime->periods > 1 ? peri… in snd_ice1712_playback_ds_prepare()
606 snd_ice1712_ds_write(ice, chn, ICE1712_DSC_COUNT1, period_size); in snd_ice1712_playback_ds_prepare()
607 snd_ice1712_ds_write(ice, chn, ICE1712_DSC_RATE, rate); in snd_ice1712_playback_ds_prepare()
608 snd_ice1712_ds_write(ice, chn, ICE1712_DSC_VOLUME, 0); in snd_ice1712_playback_ds_prepare()
609 snd_ice1712_ds_write(ice, chn, ICE1712_DSC_CONTROL, tmp); in snd_ice1712_playback_ds_prepare()
611 snd_ice1712_ds_write(ice, chn + 1, ICE1712_DSC_RATE, rate); in snd_ice1712_playback_ds_prepare()
612 snd_ice1712_ds_write(ice, chn + 1, ICE1712_DSC_VOLUME, 0); in snd_ice1712_playback_ds_prepare()
614 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_playback_ds_prepare()
620 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_capture_prepare() local
632 spin_lock_irq(&ice->reg_lock); in snd_ice1712_capture_prepare()
633 outl(ice->capture_con_virt_addr = runtime->dma_addr, ICEREG(ice, CONCAP_ADDR)); in snd_ice1712_capture_prepare()
634 outw(buf_size, ICEREG(ice, CONCAP_COUNT)); in snd_ice1712_capture_prepare()
635 snd_ice1712_write(ice, ICE1712_IREG_CAP_COUNT_HI, period_size >> 8); in snd_ice1712_capture_prepare()
636 snd_ice1712_write(ice, ICE1712_IREG_CAP_COUNT_LO, period_size & 0xff); in snd_ice1712_capture_prepare()
637 snd_ice1712_write(ice, ICE1712_IREG_CAP_CTRL, tmp); in snd_ice1712_capture_prepare()
638 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_capture_prepare()
639 snd_ac97_set_rate(ice->ac97, AC97_PCM_LR_ADC_RATE, runtime->rate); in snd_ice1712_capture_prepare()
645 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_playback_pointer() local
649 if (!(snd_ice1712_read(ice, ICE1712_IREG_PBK_CTRL) & 1)) in snd_ice1712_playback_pointer()
651 ptr = runtime->buffer_size - inw(ice->ddma_port + 4); in snd_ice1712_playback_pointer()
660 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_playback_ds_pointer() local
664 if (!(snd_ice1712_ds_read(ice, substream->number * 2, ICE1712_DSC_CONTROL) & 1)) in snd_ice1712_playback_ds_pointer()
666 if (ice->playback_con_active_buf[substream->number]) in snd_ice1712_playback_ds_pointer()
670 ptr = snd_ice1712_ds_read(ice, substream->number * 2, addr) - in snd_ice1712_playback_ds_pointer()
671 ice->playback_con_virt_addr[substream->number]; in snd_ice1712_playback_ds_pointer()
680 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_capture_pointer() local
683 if (!(snd_ice1712_read(ice, ICE1712_IREG_CAP_CTRL) & 1)) in snd_ice1712_capture_pointer()
685 ptr = inl(ICEREG(ice, CONCAP_ADDR)) - ice->capture_con_virt_addr; in snd_ice1712_capture_pointer()
751 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_playback_open() local
753 ice->playback_con_substream = substream; in snd_ice1712_playback_open()
761 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_playback_ds_open() local
764 ice->playback_con_substream_ds[substream->number] = substream; in snd_ice1712_playback_ds_open()
766 spin_lock_irq(&ice->reg_lock); in snd_ice1712_playback_ds_open()
767 tmp = inw(ICEDS(ice, INTMASK)) & ~(1 << (substream->number * 2)); in snd_ice1712_playback_ds_open()
768 outw(tmp, ICEDS(ice, INTMASK)); in snd_ice1712_playback_ds_open()
769 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_playback_ds_open()
776 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_capture_open() local
778 ice->capture_con_substream = substream; in snd_ice1712_capture_open()
780 runtime->hw.rates = ice->ac97->rates[AC97_RATES_ADC]; in snd_ice1712_capture_open()
788 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_playback_close() local
790 ice->playback_con_substream = NULL; in snd_ice1712_playback_close()
796 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_playback_ds_close() local
799 spin_lock_irq(&ice->reg_lock); in snd_ice1712_playback_ds_close()
800 tmp = inw(ICEDS(ice, INTMASK)) | (3 << (substream->number * 2)); in snd_ice1712_playback_ds_close()
801 outw(tmp, ICEDS(ice, INTMASK)); in snd_ice1712_playback_ds_close()
802 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_playback_ds_close()
803 ice->playback_con_substream_ds[substream->number] = NULL; in snd_ice1712_playback_ds_close()
809 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_capture_close() local
811 ice->capture_con_substream = NULL; in snd_ice1712_capture_close()
839 static int snd_ice1712_pcm(struct snd_ice1712 *ice, int device) in snd_ice1712_pcm() argument
844 err = snd_pcm_new(ice->card, "ICE1712 consumer", device, 1, 1, &pcm); in snd_ice1712_pcm()
851 pcm->private_data = ice; in snd_ice1712_pcm()
854 ice->pcm = pcm; in snd_ice1712_pcm()
857 &ice->pci->dev, 64*1024, 64*1024); in snd_ice1712_pcm()
859 dev_warn(ice->card->dev, in snd_ice1712_pcm()
865 static int snd_ice1712_pcm_ds(struct snd_ice1712 *ice, int device) in snd_ice1712_pcm_ds() argument
870 err = snd_pcm_new(ice->card, "ICE1712 consumer (DS)", device, 6, 0, &pcm); in snd_ice1712_pcm_ds()
876 pcm->private_data = ice; in snd_ice1712_pcm_ds()
879 ice->pcm_ds = pcm; in snd_ice1712_pcm_ds()
882 &ice->pci->dev, 64*1024, 128*1024); in snd_ice1712_pcm_ds()
903 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_pro_trigger() local
914 spin_lock(&ice->reg_lock); in snd_ice1712_pro_trigger()
915 old = inl(ICEMT(ice, PLAYBACK_CONTROL)); in snd_ice1712_pro_trigger()
920 outl(old, ICEMT(ice, PLAYBACK_CONTROL)); in snd_ice1712_pro_trigger()
921 spin_unlock(&ice->reg_lock); in snd_ice1712_pro_trigger()
932 if (s == ice->playback_pro_substream) { in snd_ice1712_pro_trigger()
935 } else if (s == ice->capture_pro_substream) { in snd_ice1712_pro_trigger()
940 spin_lock(&ice->reg_lock); in snd_ice1712_pro_trigger()
941 old = inl(ICEMT(ice, PLAYBACK_CONTROL)); in snd_ice1712_pro_trigger()
946 outl(old, ICEMT(ice, PLAYBACK_CONTROL)); in snd_ice1712_pro_trigger()
947 spin_unlock(&ice->reg_lock); in snd_ice1712_pro_trigger()
958 static void snd_ice1712_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate, int force) in snd_ice1712_set_pro_rate() argument
985 spin_lock_irqsave(&ice->reg_lock, flags); in snd_ice1712_set_pro_rate()
986 if (inb(ICEMT(ice, PLAYBACK_CONTROL)) & (ICE1712_CAPTURE_START_SHADOW| in snd_ice1712_set_pro_rate()
990 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_ice1712_set_pro_rate()
993 if (!force && is_pro_rate_locked(ice)) in snd_ice1712_set_pro_rate()
996 old = inb(ICEMT(ice, RATE)); in snd_ice1712_set_pro_rate()
1000 ice->cur_rate = rate; in snd_ice1712_set_pro_rate()
1001 outb(val, ICEMT(ice, RATE)); in snd_ice1712_set_pro_rate()
1002 spin_unlock_irqrestore(&ice->reg_lock, flags); in snd_ice1712_set_pro_rate()
1004 if (ice->gpio.set_pro_rate) in snd_ice1712_set_pro_rate()
1005 ice->gpio.set_pro_rate(ice, rate); in snd_ice1712_set_pro_rate()
1006 for (i = 0; i < ice->akm_codecs; i++) { in snd_ice1712_set_pro_rate()
1007 if (ice->akm[i].ops.set_rate_val) in snd_ice1712_set_pro_rate()
1008 ice->akm[i].ops.set_rate_val(&ice->akm[i], rate); in snd_ice1712_set_pro_rate()
1010 if (ice->spdif.ops.setup_rate) in snd_ice1712_set_pro_rate()
1011 ice->spdif.ops.setup_rate(ice, rate); in snd_ice1712_set_pro_rate()
1016 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_playback_pro_prepare() local
1018 ice->playback_pro_size = snd_pcm_lib_buffer_bytes(substream); in snd_ice1712_playback_pro_prepare()
1019 spin_lock_irq(&ice->reg_lock); in snd_ice1712_playback_pro_prepare()
1020 outl(substream->runtime->dma_addr, ICEMT(ice, PLAYBACK_ADDR)); in snd_ice1712_playback_pro_prepare()
1021 outw((ice->playback_pro_size >> 2) - 1, ICEMT(ice, PLAYBACK_SIZE)); in snd_ice1712_playback_pro_prepare()
1022 outw((snd_pcm_lib_period_bytes(substream) >> 2) - 1, ICEMT(ice, PLAYBACK_COUNT)); in snd_ice1712_playback_pro_prepare()
1023 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_playback_pro_prepare()
1031 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_playback_pro_hw_params() local
1033 snd_ice1712_set_pro_rate(ice, params_rate(hw_params), 0); in snd_ice1712_playback_pro_hw_params()
1039 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_capture_pro_prepare() local
1041 ice->capture_pro_size = snd_pcm_lib_buffer_bytes(substream); in snd_ice1712_capture_pro_prepare()
1042 spin_lock_irq(&ice->reg_lock); in snd_ice1712_capture_pro_prepare()
1043 outl(substream->runtime->dma_addr, ICEMT(ice, CAPTURE_ADDR)); in snd_ice1712_capture_pro_prepare()
1044 outw((ice->capture_pro_size >> 2) - 1, ICEMT(ice, CAPTURE_SIZE)); in snd_ice1712_capture_pro_prepare()
1045 outw((snd_pcm_lib_period_bytes(substream) >> 2) - 1, ICEMT(ice, CAPTURE_COUNT)); in snd_ice1712_capture_pro_prepare()
1046 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_capture_pro_prepare()
1053 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_capture_pro_hw_params() local
1055 snd_ice1712_set_pro_rate(ice, params_rate(hw_params), 0); in snd_ice1712_capture_pro_hw_params()
1061 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_playback_pro_pointer() local
1064 if (!(inl(ICEMT(ice, PLAYBACK_CONTROL)) & ICE1712_PLAYBACK_START)) in snd_ice1712_playback_pro_pointer()
1066 ptr = ice->playback_pro_size - (inw(ICEMT(ice, PLAYBACK_SIZE)) << 2); in snd_ice1712_playback_pro_pointer()
1075 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_capture_pro_pointer() local
1078 if (!(inl(ICEMT(ice, PLAYBACK_CONTROL)) & ICE1712_CAPTURE_START_SHADOW)) in snd_ice1712_capture_pro_pointer()
1080 ptr = ice->capture_pro_size - (inw(ICEMT(ice, CAPTURE_SIZE)) << 2); in snd_ice1712_capture_pro_pointer()
1128 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_playback_pro_open() local
1130 ice->playback_pro_substream = substream; in snd_ice1712_playback_pro_open()
1135 if (is_pro_rate_locked(ice)) { in snd_ice1712_playback_pro_open()
1140 if (ice->spdif.ops.open) in snd_ice1712_playback_pro_open()
1141 ice->spdif.ops.open(ice, substream); in snd_ice1712_playback_pro_open()
1148 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_capture_pro_open() local
1151 ice->capture_pro_substream = substream; in snd_ice1712_capture_pro_open()
1156 if (is_pro_rate_locked(ice)) { in snd_ice1712_capture_pro_open()
1166 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_playback_pro_close() local
1169 snd_ice1712_set_pro_rate(ice, PRO_RATE_DEFAULT, 0); in snd_ice1712_playback_pro_close()
1170 ice->playback_pro_substream = NULL; in snd_ice1712_playback_pro_close()
1171 if (ice->spdif.ops.close) in snd_ice1712_playback_pro_close()
1172 ice->spdif.ops.close(ice, substream); in snd_ice1712_playback_pro_close()
1179 struct snd_ice1712 *ice = snd_pcm_substream_chip(substream); in snd_ice1712_capture_pro_close() local
1182 snd_ice1712_set_pro_rate(ice, PRO_RATE_DEFAULT, 0); in snd_ice1712_capture_pro_close()
1183 ice->capture_pro_substream = NULL; in snd_ice1712_capture_pro_close()
1205 static int snd_ice1712_pcm_profi(struct snd_ice1712 *ice, int device) in snd_ice1712_pcm_profi() argument
1210 err = snd_pcm_new(ice->card, "ICE1712 multi", device, 1, 1, &pcm); in snd_ice1712_pcm_profi()
1217 pcm->private_data = ice; in snd_ice1712_pcm_profi()
1222 &ice->pci->dev, 256*1024, 256*1024); in snd_ice1712_pcm_profi()
1224 ice->pcm_pro = pcm; in snd_ice1712_pcm_profi()
1226 if (ice->cs8427) { in snd_ice1712_pcm_profi()
1228 err = snd_cs8427_iec958_build(ice->cs8427, in snd_ice1712_pcm_profi()
1235 return snd_ice1712_build_pro_mixer(ice); in snd_ice1712_pcm_profi()
1242 static void snd_ice1712_update_volume(struct snd_ice1712 *ice, int index) in snd_ice1712_update_volume() argument
1244 unsigned int vol = ice->pro_volumes[index]; in snd_ice1712_update_volume()
1249 outb(index, ICEMT(ice, MONITOR_INDEX)); in snd_ice1712_update_volume()
1250 outw(val, ICEMT(ice, MONITOR_VOLUME)); in snd_ice1712_update_volume()
1257 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_pro_mixer_switch_get() local
1261 spin_lock_irq(&ice->reg_lock); in snd_ice1712_pro_mixer_switch_get()
1263 !((ice->pro_volumes[priv_idx] >> 15) & 1); in snd_ice1712_pro_mixer_switch_get()
1265 !((ice->pro_volumes[priv_idx] >> 31) & 1); in snd_ice1712_pro_mixer_switch_get()
1266 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_pro_mixer_switch_get()
1272 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_pro_mixer_switch_put() local
1279 spin_lock_irq(&ice->reg_lock); in snd_ice1712_pro_mixer_switch_put()
1280 nval |= ice->pro_volumes[priv_idx] & ~0x80008000; in snd_ice1712_pro_mixer_switch_put()
1281 change = nval != ice->pro_volumes[priv_idx]; in snd_ice1712_pro_mixer_switch_put()
1282 ice->pro_volumes[priv_idx] = nval; in snd_ice1712_pro_mixer_switch_put()
1283 snd_ice1712_update_volume(ice, priv_idx); in snd_ice1712_pro_mixer_switch_put()
1284 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_pro_mixer_switch_put()
1299 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_pro_mixer_volume_get() local
1303 spin_lock_irq(&ice->reg_lock); in snd_ice1712_pro_mixer_volume_get()
1305 (ice->pro_volumes[priv_idx] >> 0) & 127; in snd_ice1712_pro_mixer_volume_get()
1307 (ice->pro_volumes[priv_idx] >> 16) & 127; in snd_ice1712_pro_mixer_volume_get()
1308 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_pro_mixer_volume_get()
1314 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_pro_mixer_volume_put() local
1321 spin_lock_irq(&ice->reg_lock); in snd_ice1712_pro_mixer_volume_put()
1322 nval |= ice->pro_volumes[priv_idx] & ~0x007f007f; in snd_ice1712_pro_mixer_volume_put()
1323 change = nval != ice->pro_volumes[priv_idx]; in snd_ice1712_pro_mixer_volume_put()
1324 ice->pro_volumes[priv_idx] = nval; in snd_ice1712_pro_mixer_volume_put()
1325 snd_ice1712_update_volume(ice, priv_idx); in snd_ice1712_pro_mixer_volume_put()
1326 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_pro_mixer_volume_put()
1397 static int snd_ice1712_build_pro_mixer(struct snd_ice1712 *ice) in snd_ice1712_build_pro_mixer() argument
1399 struct snd_card *card = ice->card; in snd_ice1712_build_pro_mixer()
1405 err = snd_ctl_add(card, snd_ctl_new1(&snd_ice1712_multi_playback_ctrls[idx], ice)); in snd_ice1712_build_pro_mixer()
1410 if (ice->num_total_adcs > 0) { in snd_ice1712_build_pro_mixer()
1412 tmp.count = ice->num_total_adcs; in snd_ice1712_build_pro_mixer()
1413 err = snd_ctl_add(card, snd_ctl_new1(&tmp, ice)); in snd_ice1712_build_pro_mixer()
1418 err = snd_ctl_add(card, snd_ctl_new1(&snd_ice1712_multi_capture_spdif_switch, ice)); in snd_ice1712_build_pro_mixer()
1422 if (ice->num_total_adcs > 0) { in snd_ice1712_build_pro_mixer()
1424 tmp.count = ice->num_total_adcs; in snd_ice1712_build_pro_mixer()
1425 err = snd_ctl_add(card, snd_ctl_new1(&tmp, ice)); in snd_ice1712_build_pro_mixer()
1430 err = snd_ctl_add(card, snd_ctl_new1(&snd_ice1712_multi_capture_spdif_volume, ice)); in snd_ice1712_build_pro_mixer()
1436 ice->pro_volumes[idx] = 0x80008000; /* mute */ in snd_ice1712_build_pro_mixer()
1437 snd_ice1712_update_volume(ice, idx); in snd_ice1712_build_pro_mixer()
1439 for (idx = 10; idx < 10 + ice->num_total_adcs; idx++) { in snd_ice1712_build_pro_mixer()
1440 ice->pro_volumes[idx] = 0x80008000; /* mute */ in snd_ice1712_build_pro_mixer()
1441 snd_ice1712_update_volume(ice, idx); in snd_ice1712_build_pro_mixer()
1444 ice->pro_volumes[idx] = 0x80008000; /* mute */ in snd_ice1712_build_pro_mixer()
1445 snd_ice1712_update_volume(ice, idx); in snd_ice1712_build_pro_mixer()
1452 struct snd_ice1712 *ice = ac97->private_data; in snd_ice1712_mixer_free_ac97() local
1453 ice->ac97 = NULL; in snd_ice1712_mixer_free_ac97()
1456 static int snd_ice1712_ac97_mixer(struct snd_ice1712 *ice) in snd_ice1712_ac97_mixer() argument
1470 if (ice_has_con_ac97(ice)) { in snd_ice1712_ac97_mixer()
1471 err = snd_ac97_bus(ice->card, bus_num++, &con_ops, NULL, &pbus); in snd_ice1712_ac97_mixer()
1475 ac97.private_data = ice; in snd_ice1712_ac97_mixer()
1477 err = snd_ac97_mixer(pbus, &ac97, &ice->ac97); in snd_ice1712_ac97_mixer()
1479 dev_warn(ice->card->dev, in snd_ice1712_ac97_mixer()
1482 return snd_ctl_add(ice->card, in snd_ice1712_ac97_mixer()
1484 ice)); in snd_ice1712_ac97_mixer()
1488 if (!(ice->eeprom.data[ICE_EEP1_ACLINK] & ICE1712_CFG_PRO_I2S)) { in snd_ice1712_ac97_mixer()
1489 err = snd_ac97_bus(ice->card, bus_num, &pro_ops, NULL, &pbus); in snd_ice1712_ac97_mixer()
1493 ac97.private_data = ice; in snd_ice1712_ac97_mixer()
1495 err = snd_ac97_mixer(pbus, &ac97, &ice->ac97); in snd_ice1712_ac97_mixer()
1497 dev_warn(ice->card->dev, in snd_ice1712_ac97_mixer()
1503 strcat(ice->card->mixername, "ICE1712 - multitrack"); in snd_ice1712_ac97_mixer()
1511 static inline unsigned int eeprom_double(struct snd_ice1712 *ice, int idx) in eeprom_double() argument
1513 return (unsigned int)ice->eeprom.data[idx] | ((unsigned int)ice->eeprom.data[idx + 1] << 8); in eeprom_double()
1519 struct snd_ice1712 *ice = entry->private_data; in snd_ice1712_proc_read() local
1522 snd_iprintf(buffer, "%s\n\n", ice->card->longname); in snd_ice1712_proc_read()
1525 snd_iprintf(buffer, " Subvendor : 0x%x\n", ice->eeprom.subvendor); in snd_ice1712_proc_read()
1526 snd_iprintf(buffer, " Size : %i bytes\n", ice->eeprom.size); in snd_ice1712_proc_read()
1527 snd_iprintf(buffer, " Version : %i\n", ice->eeprom.version); in snd_ice1712_proc_read()
1528 snd_iprintf(buffer, " Codec : 0x%x\n", ice->eeprom.data[ICE_EEP1_CODEC]); in snd_ice1712_proc_read()
1529 snd_iprintf(buffer, " ACLink : 0x%x\n", ice->eeprom.data[ICE_EEP1_ACLINK]); in snd_ice1712_proc_read()
1530 snd_iprintf(buffer, " I2S ID : 0x%x\n", ice->eeprom.data[ICE_EEP1_I2SID]); in snd_ice1712_proc_read()
1531 snd_iprintf(buffer, " S/PDIF : 0x%x\n", ice->eeprom.data[ICE_EEP1_SPDIF]); in snd_ice1712_proc_read()
1532 snd_iprintf(buffer, " GPIO mask : 0x%x\n", ice->eeprom.gpiomask); in snd_ice1712_proc_read()
1533 snd_iprintf(buffer, " GPIO state : 0x%x\n", ice->eeprom.gpiostate); in snd_ice1712_proc_read()
1534 snd_iprintf(buffer, " GPIO direction : 0x%x\n", ice->eeprom.gpiodir); in snd_ice1712_proc_read()
1535 snd_iprintf(buffer, " AC'97 main : 0x%x\n", eeprom_double(ice, ICE_EEP1_AC97_MAIN_LO)); in snd_ice1712_proc_read()
1536 snd_iprintf(buffer, " AC'97 pcm : 0x%x\n", eeprom_double(ice, ICE_EEP1_AC97_PCM_LO)); in snd_ice1712_proc_read()
1537 snd_iprintf(buffer, " AC'97 record : 0x%x\n", eeprom_double(ice, ICE_EEP1_AC97_REC_LO)); in snd_ice1712_proc_read()
1538 snd_iprintf(buffer, " AC'97 record src : 0x%x\n", ice->eeprom.data[ICE_EEP1_AC97_RECSRC]); in snd_ice1712_proc_read()
1540 snd_iprintf(buffer, " DAC ID #%i : 0x%x\n", idx, ice->eeprom.data[ICE_EEP1_DAC_ID + idx]); in snd_ice1712_proc_read()
1542 snd_iprintf(buffer, " ADC ID #%i : 0x%x\n", idx, ice->eeprom.data[ICE_EEP1_ADC_ID + idx]); in snd_ice1712_proc_read()
1543 for (idx = 0x1c; idx < ice->eeprom.size; idx++) in snd_ice1712_proc_read()
1544 snd_iprintf(buffer, " Extra #%02i : 0x%x\n", idx, ice->eeprom.data[idx]); in snd_ice1712_proc_read()
1547 snd_iprintf(buffer, " PSDOUT03 : 0x%04x\n", (unsigned)inw(ICEMT(ice, ROUTE_PSDOUT03))); in snd_ice1712_proc_read()
1548 snd_iprintf(buffer, " CAPTURE : 0x%08x\n", inl(ICEMT(ice, ROUTE_CAPTURE))); in snd_ice1712_proc_read()
1549 snd_iprintf(buffer, " SPDOUT : 0x%04x\n", (unsigned)inw(ICEMT(ice, ROUTE_SPDOUT))); in snd_ice1712_proc_read()
1550 snd_iprintf(buffer, " RATE : 0x%02x\n", (unsigned)inb(ICEMT(ice, RATE))); in snd_ice1712_proc_read()
1551 snd_iprintf(buffer, " GPIO_DATA : 0x%02x\n", (unsigned)snd_ice1712_get_gpio_data(ice)); in snd_ice1712_proc_read()
1552 …snd_iprintf(buffer, " GPIO_WRITE_MASK : 0x%02x\n", (unsigned)snd_ice1712_read(ice, ICE1712_IREG_… in snd_ice1712_proc_read()
1553 …snd_iprintf(buffer, " GPIO_DIRECTION : 0x%02x\n", (unsigned)snd_ice1712_read(ice, ICE1712_IREG_… in snd_ice1712_proc_read()
1556 static void snd_ice1712_proc_init(struct snd_ice1712 *ice) in snd_ice1712_proc_init() argument
1558 snd_card_ro_proc_new(ice->card, "ice1712", ice, snd_ice1712_proc_read); in snd_ice1712_proc_init()
1576 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_eeprom_get() local
1578 memcpy(ucontrol->value.bytes.data, &ice->eeprom, sizeof(ice->eeprom)); in snd_ice1712_eeprom_get()
1603 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_spdif_default_get() local
1604 if (ice->spdif.ops.default_get) in snd_ice1712_spdif_default_get()
1605 ice->spdif.ops.default_get(ice, ucontrol); in snd_ice1712_spdif_default_get()
1612 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_spdif_default_put() local
1613 if (ice->spdif.ops.default_put) in snd_ice1712_spdif_default_put()
1614 return ice->spdif.ops.default_put(ice, ucontrol); in snd_ice1712_spdif_default_put()
1630 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_spdif_maskc_get() local
1631 if (ice->spdif.ops.default_get) { in snd_ice1712_spdif_maskc_get()
1652 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_spdif_maskp_get() local
1653 if (ice->spdif.ops.default_get) { in snd_ice1712_spdif_maskp_get()
1690 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_spdif_stream_get() local
1691 if (ice->spdif.ops.stream_get) in snd_ice1712_spdif_stream_get()
1692 ice->spdif.ops.stream_get(ice, ucontrol); in snd_ice1712_spdif_stream_get()
1699 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_spdif_stream_put() local
1700 if (ice->spdif.ops.stream_put) in snd_ice1712_spdif_stream_put()
1701 return ice->spdif.ops.stream_put(ice, ucontrol); in snd_ice1712_spdif_stream_put()
1719 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_gpio_get() local
1723 snd_ice1712_save_gpio_status(ice); in snd_ice1712_gpio_get()
1725 (snd_ice1712_gpio_read(ice) & mask ? 1 : 0) ^ invert; in snd_ice1712_gpio_get()
1726 snd_ice1712_restore_gpio_status(ice); in snd_ice1712_gpio_get()
1733 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_gpio_put() local
1741 snd_ice1712_save_gpio_status(ice); in snd_ice1712_gpio_put()
1742 val = snd_ice1712_gpio_read(ice); in snd_ice1712_gpio_put()
1745 snd_ice1712_gpio_write(ice, nval); in snd_ice1712_gpio_put()
1746 snd_ice1712_restore_gpio_status(ice); in snd_ice1712_gpio_put()
1778 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_pro_internal_clock_get() local
1784 spin_lock_irq(&ice->reg_lock); in snd_ice1712_pro_internal_clock_get()
1785 if (is_spdif_master(ice)) { in snd_ice1712_pro_internal_clock_get()
1788 val = xlate[inb(ICEMT(ice, RATE)) & 15]; in snd_ice1712_pro_internal_clock_get()
1795 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_pro_internal_clock_get()
1802 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_pro_internal_clock_put() local
1810 spin_lock_irq(&ice->reg_lock); in snd_ice1712_pro_internal_clock_put()
1811 oval = inb(ICEMT(ice, RATE)); in snd_ice1712_pro_internal_clock_put()
1813 outb(oval | ICE1712_SPDIF_MASTER, ICEMT(ice, RATE)); in snd_ice1712_pro_internal_clock_put()
1816 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_pro_internal_clock_put()
1817 snd_ice1712_set_pro_rate(ice, PRO_RATE_DEFAULT, 1); in snd_ice1712_pro_internal_clock_put()
1818 spin_lock_irq(&ice->reg_lock); in snd_ice1712_pro_internal_clock_put()
1820 change = inb(ICEMT(ice, RATE)) != oval; in snd_ice1712_pro_internal_clock_put()
1821 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_pro_internal_clock_put()
1824 (inb(ICEMT(ice, RATE)) & ICE1712_SPDIF_MASTER)) in snd_ice1712_pro_internal_clock_put()
1825 snd_ice1712_set_input_clock_source(ice, is_spdif_master(ice)); in snd_ice1712_pro_internal_clock_put()
1915 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_pro_rate_locking_put() local
1919 spin_lock_irq(&ice->reg_lock); in snd_ice1712_pro_rate_locking_put()
1922 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_pro_rate_locking_put()
1946 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_pro_rate_reset_put() local
1950 spin_lock_irq(&ice->reg_lock); in snd_ice1712_pro_rate_reset_put()
1953 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_pro_rate_reset_put()
1985 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_pro_route_analog_get() local
1989 spin_lock_irq(&ice->reg_lock); in snd_ice1712_pro_route_analog_get()
1990 val = inw(ICEMT(ice, ROUTE_PSDOUT03)); in snd_ice1712_pro_route_analog_get()
1991 cval = inl(ICEMT(ice, ROUTE_CAPTURE)); in snd_ice1712_pro_route_analog_get()
1992 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_pro_route_analog_get()
2011 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_pro_route_analog_put() local
2026 spin_lock_irq(&ice->reg_lock); in snd_ice1712_pro_route_analog_put()
2027 val = old_val = inw(ICEMT(ice, ROUTE_PSDOUT03)); in snd_ice1712_pro_route_analog_put()
2032 outw(val, ICEMT(ice, ROUTE_PSDOUT03)); in snd_ice1712_pro_route_analog_put()
2033 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_pro_route_analog_put()
2038 spin_lock_irq(&ice->reg_lock); in snd_ice1712_pro_route_analog_put()
2039 val = old_val = inl(ICEMT(ice, ROUTE_CAPTURE)); in snd_ice1712_pro_route_analog_put()
2052 outl(val, ICEMT(ice, ROUTE_CAPTURE)); in snd_ice1712_pro_route_analog_put()
2054 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_pro_route_analog_put()
2061 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_pro_route_spdif_get() local
2064 val = inw(ICEMT(ice, ROUTE_SPDOUT)); in snd_ice1712_pro_route_spdif_get()
2081 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_pro_route_spdif_put() local
2087 spin_lock_irq(&ice->reg_lock); in snd_ice1712_pro_route_spdif_put()
2088 val = old_val = inw(ICEMT(ice, ROUTE_SPDOUT)); in snd_ice1712_pro_route_spdif_put()
2112 outw(val, ICEMT(ice, ROUTE_SPDOUT)); in snd_ice1712_pro_route_spdif_put()
2113 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_pro_route_spdif_put()
2148 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_pro_volume_rate_get() local
2150 ucontrol->value.integer.value[0] = inb(ICEMT(ice, MONITOR_RATE)); in snd_ice1712_pro_volume_rate_get()
2157 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_pro_volume_rate_put() local
2160 spin_lock_irq(&ice->reg_lock); in snd_ice1712_pro_volume_rate_put()
2161 change = inb(ICEMT(ice, MONITOR_RATE)) != ucontrol->value.integer.value[0]; in snd_ice1712_pro_volume_rate_put()
2162 outb(ucontrol->value.integer.value[0], ICEMT(ice, MONITOR_RATE)); in snd_ice1712_pro_volume_rate_put()
2163 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_pro_volume_rate_put()
2188 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); in snd_ice1712_pro_peak_get() local
2191 spin_lock_irq(&ice->reg_lock); in snd_ice1712_pro_peak_get()
2193 outb(idx, ICEMT(ice, MONITOR_PEAKINDEX)); in snd_ice1712_pro_peak_get()
2194 ucontrol->value.integer.value[idx] = inb(ICEMT(ice, MONITOR_PEAKDATA)); in snd_ice1712_pro_peak_get()
2196 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_pro_peak_get()
2222 static unsigned char snd_ice1712_read_i2c(struct snd_ice1712 *ice, in snd_ice1712_read_i2c() argument
2228 outb(addr, ICEREG(ice, I2C_BYTE_ADDR)); in snd_ice1712_read_i2c()
2229 outb(dev & ~ICE1712_I2C_WRITE, ICEREG(ice, I2C_DEV_ADDR)); in snd_ice1712_read_i2c()
2230 while (t-- > 0 && (inb(ICEREG(ice, I2C_CTRL)) & ICE1712_I2C_BUSY)) ; in snd_ice1712_read_i2c()
2231 return inb(ICEREG(ice, I2C_DATA)); in snd_ice1712_read_i2c()
2234 static int snd_ice1712_read_eeprom(struct snd_ice1712 *ice, in snd_ice1712_read_eeprom() argument
2242 ice->eeprom.subvendor = 0; in snd_ice1712_read_eeprom()
2243 if ((inb(ICEREG(ice, I2C_CTRL)) & ICE1712_I2C_EEPROM) != 0) in snd_ice1712_read_eeprom()
2244 ice->eeprom.subvendor = (snd_ice1712_read_i2c(ice, dev, 0x00) << 0) | in snd_ice1712_read_eeprom()
2245 (snd_ice1712_read_i2c(ice, dev, 0x01) << 8) | in snd_ice1712_read_eeprom()
2246 (snd_ice1712_read_i2c(ice, dev, 0x02) << 16) | in snd_ice1712_read_eeprom()
2247 (snd_ice1712_read_i2c(ice, dev, 0x03) << 24); in snd_ice1712_read_eeprom()
2248 if (ice->eeprom.subvendor == 0 || in snd_ice1712_read_eeprom()
2249 ice->eeprom.subvendor == (unsigned int)-1) { in snd_ice1712_read_eeprom()
2252 pci_read_config_word(ice->pci, PCI_SUBSYSTEM_VENDOR_ID, &vendor); in snd_ice1712_read_eeprom()
2253 pci_read_config_word(ice->pci, PCI_SUBSYSTEM_ID, &device); in snd_ice1712_read_eeprom()
2254 ice->eeprom.subvendor = ((unsigned int)swab16(vendor) << 16) | swab16(device); in snd_ice1712_read_eeprom()
2255 if (ice->eeprom.subvendor == 0 || ice->eeprom.subvendor == (unsigned int)-1) { in snd_ice1712_read_eeprom()
2256 dev_err(ice->card->dev, in snd_ice1712_read_eeprom()
2265 dev_info(ice->card->dev, in snd_ice1712_read_eeprom()
2267 ice->eeprom.subvendor = c->subvendor; in snd_ice1712_read_eeprom()
2268 } else if (c->subvendor != ice->eeprom.subvendor) in snd_ice1712_read_eeprom()
2273 dev_dbg(ice->card->dev, "using the defined eeprom..\n"); in snd_ice1712_read_eeprom()
2274 ice->eeprom.version = 1; in snd_ice1712_read_eeprom()
2275 ice->eeprom.size = c->eeprom_size + 6; in snd_ice1712_read_eeprom()
2276 memcpy(ice->eeprom.data, c->eeprom_data, c->eeprom_size); in snd_ice1712_read_eeprom()
2280 dev_warn(ice->card->dev, "No matching model found for ID 0x%x\n", in snd_ice1712_read_eeprom()
2281 ice->eeprom.subvendor); in snd_ice1712_read_eeprom()
2284 ice->eeprom.size = snd_ice1712_read_i2c(ice, dev, 0x04); in snd_ice1712_read_eeprom()
2285 if (ice->eeprom.size < 6) in snd_ice1712_read_eeprom()
2286 ice->eeprom.size = 32; /* FIXME: any cards without the correct size? */ in snd_ice1712_read_eeprom()
2287 else if (ice->eeprom.size > 32) { in snd_ice1712_read_eeprom()
2288 dev_err(ice->card->dev, in snd_ice1712_read_eeprom()
2289 "invalid EEPROM (size = %i)\n", ice->eeprom.size); in snd_ice1712_read_eeprom()
2292 ice->eeprom.version = snd_ice1712_read_i2c(ice, dev, 0x05); in snd_ice1712_read_eeprom()
2293 if (ice->eeprom.version != 1) { in snd_ice1712_read_eeprom()
2294 dev_err(ice->card->dev, "invalid EEPROM version %i\n", in snd_ice1712_read_eeprom()
2295 ice->eeprom.version); in snd_ice1712_read_eeprom()
2298 size = ice->eeprom.size - 6; in snd_ice1712_read_eeprom()
2300 ice->eeprom.data[i] = snd_ice1712_read_i2c(ice, dev, i + 6); in snd_ice1712_read_eeprom()
2303 ice->eeprom.gpiomask = ice->eeprom.data[ICE_EEP1_GPIO_MASK]; in snd_ice1712_read_eeprom()
2304 ice->eeprom.gpiostate = ice->eeprom.data[ICE_EEP1_GPIO_STATE]; in snd_ice1712_read_eeprom()
2305 ice->eeprom.gpiodir = ice->eeprom.data[ICE_EEP1_GPIO_DIR]; in snd_ice1712_read_eeprom()
2312 static int snd_ice1712_chip_init(struct snd_ice1712 *ice) in snd_ice1712_chip_init() argument
2314 outb(ICE1712_RESET | ICE1712_NATIVE, ICEREG(ice, CONTROL)); in snd_ice1712_chip_init()
2316 outb(ICE1712_NATIVE, ICEREG(ice, CONTROL)); in snd_ice1712_chip_init()
2318 if (ice->eeprom.subvendor == ICE1712_SUBDEVICE_DMX6FIRE && in snd_ice1712_chip_init()
2319 !ice->dxr_enable) in snd_ice1712_chip_init()
2324 ice->eeprom.data[ICE_EEP1_CODEC] = 0x3a; in snd_ice1712_chip_init()
2325 pci_write_config_byte(ice->pci, 0x60, ice->eeprom.data[ICE_EEP1_CODEC]); in snd_ice1712_chip_init()
2326 pci_write_config_byte(ice->pci, 0x61, ice->eeprom.data[ICE_EEP1_ACLINK]); in snd_ice1712_chip_init()
2327 pci_write_config_byte(ice->pci, 0x62, ice->eeprom.data[ICE_EEP1_I2SID]); in snd_ice1712_chip_init()
2328 pci_write_config_byte(ice->pci, 0x63, ice->eeprom.data[ICE_EEP1_SPDIF]); in snd_ice1712_chip_init()
2329 if (ice->eeprom.subvendor != ICE1712_SUBDEVICE_STDSP24 && in snd_ice1712_chip_init()
2330 ice->eeprom.subvendor != ICE1712_SUBDEVICE_STAUDIO_ADCIII) { in snd_ice1712_chip_init()
2331 ice->gpio.write_mask = ice->eeprom.gpiomask; in snd_ice1712_chip_init()
2332 ice->gpio.direction = ice->eeprom.gpiodir; in snd_ice1712_chip_init()
2333 snd_ice1712_write(ice, ICE1712_IREG_GPIO_WRITE_MASK, in snd_ice1712_chip_init()
2334 ice->eeprom.gpiomask); in snd_ice1712_chip_init()
2335 snd_ice1712_write(ice, ICE1712_IREG_GPIO_DIRECTION, in snd_ice1712_chip_init()
2336 ice->eeprom.gpiodir); in snd_ice1712_chip_init()
2337 snd_ice1712_write(ice, ICE1712_IREG_GPIO_DATA, in snd_ice1712_chip_init()
2338 ice->eeprom.gpiostate); in snd_ice1712_chip_init()
2340 ice->gpio.write_mask = 0xc0; in snd_ice1712_chip_init()
2341 ice->gpio.direction = 0xff; in snd_ice1712_chip_init()
2342 snd_ice1712_write(ice, ICE1712_IREG_GPIO_WRITE_MASK, 0xc0); in snd_ice1712_chip_init()
2343 snd_ice1712_write(ice, ICE1712_IREG_GPIO_DIRECTION, 0xff); in snd_ice1712_chip_init()
2344 snd_ice1712_write(ice, ICE1712_IREG_GPIO_DATA, in snd_ice1712_chip_init()
2347 snd_ice1712_write(ice, ICE1712_IREG_PRO_POWERDOWN, 0); in snd_ice1712_chip_init()
2348 if (!(ice->eeprom.data[ICE_EEP1_CODEC] & ICE1712_CFG_NO_CON_AC97)) { in snd_ice1712_chip_init()
2349 outb(ICE1712_AC97_WARM, ICEREG(ice, AC97_CMD)); in snd_ice1712_chip_init()
2351 outb(0, ICEREG(ice, AC97_CMD)); in snd_ice1712_chip_init()
2353 snd_ice1712_write(ice, ICE1712_IREG_CONSUMER_POWERDOWN, 0); in snd_ice1712_chip_init()
2355 snd_ice1712_set_pro_rate(ice, 48000, 1); in snd_ice1712_chip_init()
2357 outb(((ice->eeprom.data[ICE_EEP1_CODEC] & ICE1712_CFG_2xMPU401) == 0 ? in snd_ice1712_chip_init()
2359 ((ice->eeprom.data[ICE_EEP1_CODEC] & ICE1712_CFG_NO_CON_AC97) ? in snd_ice1712_chip_init()
2361 ICEREG(ice, IRQMASK)); in snd_ice1712_chip_init()
2362 outb(0x00, ICEMT(ice, IRQ)); in snd_ice1712_chip_init()
2367 int snd_ice1712_spdif_build_controls(struct snd_ice1712 *ice) in snd_ice1712_spdif_build_controls() argument
2372 if (snd_BUG_ON(!ice->pcm_pro)) in snd_ice1712_spdif_build_controls()
2374 kctl = snd_ctl_new1(&snd_ice1712_spdif_default, ice); in snd_ice1712_spdif_build_controls()
2375 kctl->id.device = ice->pcm_pro->device; in snd_ice1712_spdif_build_controls()
2376 err = snd_ctl_add(ice->card, kctl); in snd_ice1712_spdif_build_controls()
2379 kctl = snd_ctl_new1(&snd_ice1712_spdif_maskc, ice); in snd_ice1712_spdif_build_controls()
2380 kctl->id.device = ice->pcm_pro->device; in snd_ice1712_spdif_build_controls()
2381 err = snd_ctl_add(ice->card, kctl); in snd_ice1712_spdif_build_controls()
2384 kctl = snd_ctl_new1(&snd_ice1712_spdif_maskp, ice); in snd_ice1712_spdif_build_controls()
2385 kctl->id.device = ice->pcm_pro->device; in snd_ice1712_spdif_build_controls()
2386 err = snd_ctl_add(ice->card, kctl); in snd_ice1712_spdif_build_controls()
2389 kctl = snd_ctl_new1(&snd_ice1712_spdif_stream, ice); in snd_ice1712_spdif_build_controls()
2390 kctl->id.device = ice->pcm_pro->device; in snd_ice1712_spdif_build_controls()
2391 err = snd_ctl_add(ice->card, kctl); in snd_ice1712_spdif_build_controls()
2394 ice->spdif.stream_ctl = kctl; in snd_ice1712_spdif_build_controls()
2399 static int snd_ice1712_build_controls(struct snd_ice1712 *ice) in snd_ice1712_build_controls() argument
2403 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_ice1712_eeprom, ice)); in snd_ice1712_build_controls()
2406 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_ice1712_pro_internal_clock, ice)); in snd_ice1712_build_controls()
2409 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_ice1712_pro_internal_clock_default, ice)); in snd_ice1712_build_controls()
2413 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_ice1712_pro_rate_locking, ice)); in snd_ice1712_build_controls()
2416 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_ice1712_pro_rate_reset, ice)); in snd_ice1712_build_controls()
2420 if (ice->num_total_dacs > 0) { in snd_ice1712_build_controls()
2422 tmp.count = ice->num_total_dacs; in snd_ice1712_build_controls()
2423 err = snd_ctl_add(ice->card, snd_ctl_new1(&tmp, ice)); in snd_ice1712_build_controls()
2428 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_ice1712_mixer_pro_spdif_route, ice)); in snd_ice1712_build_controls()
2432 err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_ice1712_mixer_pro_volume_rate, ice)); in snd_ice1712_build_controls()
2435 return snd_ctl_add(ice->card, in snd_ice1712_build_controls()
2436 snd_ctl_new1(&snd_ice1712_mixer_pro_peak, ice)); in snd_ice1712_build_controls()
2441 struct snd_ice1712 *ice = card->private_data; in snd_ice1712_free() local
2443 if (ice->card_info && ice->card_info->chip_exit) in snd_ice1712_free()
2444 ice->card_info->chip_exit(ice); in snd_ice1712_free()
2447 outb(ICE1712_MULTI_CAPTURE | ICE1712_MULTI_PLAYBACK, ICEMT(ice, IRQ)); in snd_ice1712_free()
2448 outb(0xff, ICEREG(ice, IRQMASK)); in snd_ice1712_free()
2450 snd_ice1712_akm4xxx_free(ice); in snd_ice1712_free()
2460 struct snd_ice1712 *ice = card->private_data; in snd_ice1712_create() local
2474 ice->omni = omni ? 1 : 0; in snd_ice1712_create()
2479 ice->cs8427_timeout = cs8427_timeout; in snd_ice1712_create()
2480 ice->dxr_enable = dxr_enable; in snd_ice1712_create()
2481 spin_lock_init(&ice->reg_lock); in snd_ice1712_create()
2482 mutex_init(&ice->gpio_mutex); in snd_ice1712_create()
2483 mutex_init(&ice->i2c_mutex); in snd_ice1712_create()
2484 mutex_init(&ice->open_mutex); in snd_ice1712_create()
2485 ice->gpio.set_mask = snd_ice1712_set_gpio_mask; in snd_ice1712_create()
2486 ice->gpio.get_mask = snd_ice1712_get_gpio_mask; in snd_ice1712_create()
2487 ice->gpio.set_dir = snd_ice1712_set_gpio_dir; in snd_ice1712_create()
2488 ice->gpio.get_dir = snd_ice1712_get_gpio_dir; in snd_ice1712_create()
2489 ice->gpio.set_data = snd_ice1712_set_gpio_data; in snd_ice1712_create()
2490 ice->gpio.get_data = snd_ice1712_get_gpio_data; in snd_ice1712_create()
2492 ice->spdif.cs8403_bits = in snd_ice1712_create()
2493 ice->spdif.cs8403_stream_bits = (0x01 | /* consumer format */ in snd_ice1712_create()
2496 ice->card = card; in snd_ice1712_create()
2497 ice->pci = pci; in snd_ice1712_create()
2498 ice->irq = -1; in snd_ice1712_create()
2501 pci_write_config_word(ice->pci, 0x40, 0x807f); in snd_ice1712_create()
2502 pci_write_config_word(ice->pci, 0x42, 0x0006); in snd_ice1712_create()
2503 snd_ice1712_proc_init(ice); in snd_ice1712_create()
2508 ice->port = pci_resource_start(pci, 0); in snd_ice1712_create()
2509 ice->ddma_port = pci_resource_start(pci, 1); in snd_ice1712_create()
2510 ice->dmapath_port = pci_resource_start(pci, 2); in snd_ice1712_create()
2511 ice->profi_port = pci_resource_start(pci, 3); in snd_ice1712_create()
2514 IRQF_SHARED, KBUILD_MODNAME, ice)) { in snd_ice1712_create()
2519 ice->irq = pci->irq; in snd_ice1712_create()
2520 card->sync_irq = ice->irq; in snd_ice1712_create()
2523 if (snd_ice1712_read_eeprom(ice, modelname) < 0) in snd_ice1712_create()
2525 if (snd_ice1712_chip_init(ice) < 0) in snd_ice1712_create()
2545 struct snd_ice1712 *ice; in snd_ice1712_probe() local
2557 sizeof(*ice), &card); in snd_ice1712_probe()
2560 ice = card->private_data; in snd_ice1712_probe()
2572 if (c->subvendor == ice->eeprom.subvendor) { in snd_ice1712_probe()
2577 err = c->chip_init(ice); in snd_ice1712_probe()
2581 ice->card_info = c; in snd_ice1712_probe()
2589 err = snd_ice1712_pcm_profi(ice, pcm_dev++); in snd_ice1712_probe()
2593 if (ice_has_con_ac97(ice)) { in snd_ice1712_probe()
2594 err = snd_ice1712_pcm(ice, pcm_dev++); in snd_ice1712_probe()
2599 err = snd_ice1712_ac97_mixer(ice); in snd_ice1712_probe()
2603 err = snd_ice1712_build_controls(ice); in snd_ice1712_probe()
2608 err = c->build_controls(ice); in snd_ice1712_probe()
2613 if (ice_has_con_ac97(ice)) { in snd_ice1712_probe()
2614 err = snd_ice1712_pcm_ds(ice, pcm_dev++); in snd_ice1712_probe()
2621 ICEREG(ice, MPU1_CTRL), in snd_ice1712_probe()
2624 -1, &ice->rmidi[0]); in snd_ice1712_probe()
2629 snprintf(ice->rmidi[0]->name, in snd_ice1712_probe()
2630 sizeof(ice->rmidi[0]->name), in snd_ice1712_probe()
2633 if (ice->eeprom.data[ICE_EEP1_CODEC] & ICE1712_CFG_2xMPU401) { in snd_ice1712_probe()
2636 ICEREG(ice, MPU2_CTRL), in snd_ice1712_probe()
2639 -1, &ice->rmidi[1]); in snd_ice1712_probe()
2645 snprintf(ice->rmidi[1]->name, in snd_ice1712_probe()
2646 sizeof(ice->rmidi[1]->name), in snd_ice1712_probe()
2652 snd_ice1712_set_input_clock_source(ice, 0); in snd_ice1712_probe()
2655 card->shortname, ice->port, ice->irq); in snd_ice1712_probe()
2669 struct snd_ice1712 *ice = card->private_data; in snd_ice1712_suspend() local
2671 if (!ice->pm_suspend_enabled) in snd_ice1712_suspend()
2676 snd_ac97_suspend(ice->ac97); in snd_ice1712_suspend()
2678 spin_lock_irq(&ice->reg_lock); in snd_ice1712_suspend()
2679 ice->pm_saved_is_spdif_master = is_spdif_master(ice); in snd_ice1712_suspend()
2680 ice->pm_saved_spdif_ctrl = inw(ICEMT(ice, ROUTE_SPDOUT)); in snd_ice1712_suspend()
2681 ice->pm_saved_route = inw(ICEMT(ice, ROUTE_PSDOUT03)); in snd_ice1712_suspend()
2682 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_suspend()
2684 if (ice->pm_suspend) in snd_ice1712_suspend()
2685 ice->pm_suspend(ice); in snd_ice1712_suspend()
2692 struct snd_ice1712 *ice = card->private_data; in snd_ice1712_resume() local
2695 if (!ice->pm_suspend_enabled) in snd_ice1712_resume()
2698 if (ice->cur_rate) in snd_ice1712_resume()
2699 rate = ice->cur_rate; in snd_ice1712_resume()
2703 if (snd_ice1712_chip_init(ice) < 0) { in snd_ice1712_resume()
2708 ice->cur_rate = rate; in snd_ice1712_resume()
2710 if (ice->pm_resume) in snd_ice1712_resume()
2711 ice->pm_resume(ice); in snd_ice1712_resume()
2713 if (ice->pm_saved_is_spdif_master) { in snd_ice1712_resume()
2715 spin_lock_irq(&ice->reg_lock); in snd_ice1712_resume()
2716 outb(inb(ICEMT(ice, RATE)) | ICE1712_SPDIF_MASTER, in snd_ice1712_resume()
2717 ICEMT(ice, RATE)); in snd_ice1712_resume()
2718 spin_unlock_irq(&ice->reg_lock); in snd_ice1712_resume()
2719 snd_ice1712_set_input_clock_source(ice, 1); in snd_ice1712_resume()
2722 snd_ice1712_set_pro_rate(ice, rate, 1); in snd_ice1712_resume()
2723 snd_ice1712_set_input_clock_source(ice, 0); in snd_ice1712_resume()
2726 outw(ice->pm_saved_spdif_ctrl, ICEMT(ice, ROUTE_SPDOUT)); in snd_ice1712_resume()
2727 outw(ice->pm_saved_route, ICEMT(ice, ROUTE_PSDOUT03)); in snd_ice1712_resume()
2729 snd_ac97_resume(ice->ac97); in snd_ice1712_resume()