Lines Matching refs:chip
46 static void snd_ymfpci_irq_wait(struct snd_ymfpci *chip);
48 static inline u8 snd_ymfpci_readb(struct snd_ymfpci *chip, u32 offset) in snd_ymfpci_readb() argument
50 return readb(chip->reg_area_virt + offset); in snd_ymfpci_readb()
53 static inline void snd_ymfpci_writeb(struct snd_ymfpci *chip, u32 offset, u8 val) in snd_ymfpci_writeb() argument
55 writeb(val, chip->reg_area_virt + offset); in snd_ymfpci_writeb()
58 static inline u16 snd_ymfpci_readw(struct snd_ymfpci *chip, u32 offset) in snd_ymfpci_readw() argument
60 return readw(chip->reg_area_virt + offset); in snd_ymfpci_readw()
63 static inline void snd_ymfpci_writew(struct snd_ymfpci *chip, u32 offset, u16 val) in snd_ymfpci_writew() argument
65 writew(val, chip->reg_area_virt + offset); in snd_ymfpci_writew()
68 static inline u32 snd_ymfpci_readl(struct snd_ymfpci *chip, u32 offset) in snd_ymfpci_readl() argument
70 return readl(chip->reg_area_virt + offset); in snd_ymfpci_readl()
73 static inline void snd_ymfpci_writel(struct snd_ymfpci *chip, u32 offset, u32 val) in snd_ymfpci_writel() argument
75 writel(val, chip->reg_area_virt + offset); in snd_ymfpci_writel()
78 static int snd_ymfpci_codec_ready(struct snd_ymfpci *chip, int secondary) in snd_ymfpci_codec_ready() argument
85 if ((snd_ymfpci_readw(chip, reg) & 0x8000) == 0) in snd_ymfpci_codec_ready()
89 dev_err(chip->card->dev, in snd_ymfpci_codec_ready()
91 secondary, snd_ymfpci_readw(chip, reg)); in snd_ymfpci_codec_ready()
97 struct snd_ymfpci *chip = ac97->private_data; in snd_ymfpci_codec_write() local
100 snd_ymfpci_codec_ready(chip, 0); in snd_ymfpci_codec_write()
102 snd_ymfpci_writel(chip, YDSXGR_AC97CMDDATA, cmd); in snd_ymfpci_codec_write()
107 struct snd_ymfpci *chip = ac97->private_data; in snd_ymfpci_codec_read() local
109 if (snd_ymfpci_codec_ready(chip, 0)) in snd_ymfpci_codec_read()
111 snd_ymfpci_writew(chip, YDSXGR_AC97CMDADR, YDSXG_AC97READCMD | reg); in snd_ymfpci_codec_read()
112 if (snd_ymfpci_codec_ready(chip, 0)) in snd_ymfpci_codec_read()
114 if (chip->device_id == PCI_DEVICE_ID_YAMAHA_744 && chip->rev < 2) { in snd_ymfpci_codec_read()
117 snd_ymfpci_readw(chip, YDSXGR_PRISTATUSDATA); in snd_ymfpci_codec_read()
119 return snd_ymfpci_readw(chip, YDSXGR_PRISTATUSDATA); in snd_ymfpci_codec_read()
179 static void snd_ymfpci_hw_start(struct snd_ymfpci *chip) in snd_ymfpci_hw_start() argument
183 spin_lock_irqsave(&chip->reg_lock, flags); in snd_ymfpci_hw_start()
184 if (chip->start_count++ > 0) in snd_ymfpci_hw_start()
186 snd_ymfpci_writel(chip, YDSXGR_MODE, in snd_ymfpci_hw_start()
187 snd_ymfpci_readl(chip, YDSXGR_MODE) | 3); in snd_ymfpci_hw_start()
188 chip->active_bank = snd_ymfpci_readl(chip, YDSXGR_CTRLSELECT) & 1; in snd_ymfpci_hw_start()
190 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_ymfpci_hw_start()
193 static void snd_ymfpci_hw_stop(struct snd_ymfpci *chip) in snd_ymfpci_hw_stop() argument
198 spin_lock_irqsave(&chip->reg_lock, flags); in snd_ymfpci_hw_stop()
199 if (--chip->start_count > 0) in snd_ymfpci_hw_stop()
201 snd_ymfpci_writel(chip, YDSXGR_MODE, in snd_ymfpci_hw_stop()
202 snd_ymfpci_readl(chip, YDSXGR_MODE) & ~3); in snd_ymfpci_hw_stop()
204 if ((snd_ymfpci_readl(chip, YDSXGR_STATUS) & 2) == 0) in snd_ymfpci_hw_stop()
207 if (atomic_read(&chip->interrupt_sleep_count)) { in snd_ymfpci_hw_stop()
208 atomic_set(&chip->interrupt_sleep_count, 0); in snd_ymfpci_hw_stop()
209 wake_up(&chip->interrupt_sleep); in snd_ymfpci_hw_stop()
212 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_ymfpci_hw_stop()
219 static int voice_alloc(struct snd_ymfpci *chip, in voice_alloc() argument
228 voice = &chip->voices[idx]; in voice_alloc()
229 voice2 = pair ? &chip->voices[idx+1] : NULL; in voice_alloc()
248 snd_ymfpci_hw_start(chip); in voice_alloc()
250 snd_ymfpci_hw_start(chip); in voice_alloc()
257 static int snd_ymfpci_voice_alloc(struct snd_ymfpci *chip, in snd_ymfpci_voice_alloc() argument
269 spin_lock_irqsave(&chip->voice_lock, flags); in snd_ymfpci_voice_alloc()
271 result = voice_alloc(chip, type, pair, rvoice); in snd_ymfpci_voice_alloc()
277 spin_unlock_irqrestore(&chip->voice_lock, flags); in snd_ymfpci_voice_alloc()
281 static int snd_ymfpci_voice_free(struct snd_ymfpci *chip, struct snd_ymfpci_voice *pvoice) in snd_ymfpci_voice_free() argument
287 snd_ymfpci_hw_stop(chip); in snd_ymfpci_voice_free()
288 spin_lock_irqsave(&chip->voice_lock, flags); in snd_ymfpci_voice_free()
289 if (pvoice->number == chip->src441_used) { in snd_ymfpci_voice_free()
290 chip->src441_used = -1; in snd_ymfpci_voice_free()
296 spin_unlock_irqrestore(&chip->voice_lock, flags); in snd_ymfpci_voice_free()
304 static void snd_ymfpci_pcm_interrupt(struct snd_ymfpci *chip, struct snd_ymfpci_voice *voice) in snd_ymfpci_pcm_interrupt() argument
313 spin_lock(&chip->reg_lock); in snd_ymfpci_pcm_interrupt()
315 pos = le32_to_cpu(voice->bank[chip->active_bank].start); in snd_ymfpci_pcm_interrupt()
330 spin_unlock(&chip->reg_lock); in snd_ymfpci_pcm_interrupt()
332 spin_lock(&chip->reg_lock); in snd_ymfpci_pcm_interrupt()
337 unsigned int next_bank = 1 - chip->active_bank; in snd_ymfpci_pcm_interrupt()
342 volume = cpu_to_le32(chip->pcm_mixer[subs].left << 15); in snd_ymfpci_pcm_interrupt()
348 volume = cpu_to_le32(chip->pcm_mixer[subs].right << 15); in snd_ymfpci_pcm_interrupt()
355 spin_unlock(&chip->reg_lock); in snd_ymfpci_pcm_interrupt()
362 struct snd_ymfpci *chip = ypcm->chip; in snd_ymfpci_pcm_capture_interrupt() local
365 spin_lock(&chip->reg_lock); in snd_ymfpci_pcm_capture_interrupt()
367 …pos = le32_to_cpu(chip->bank_capture[ypcm->capture_bank_number][chip->active_bank]->start) >> ypcm… in snd_ymfpci_pcm_capture_interrupt()
382 spin_unlock(&chip->reg_lock); in snd_ymfpci_pcm_capture_interrupt()
384 spin_lock(&chip->reg_lock); in snd_ymfpci_pcm_capture_interrupt()
387 spin_unlock(&chip->reg_lock); in snd_ymfpci_pcm_capture_interrupt()
393 struct snd_ymfpci *chip = snd_pcm_substream_chip(substream); in snd_ymfpci_playback_trigger() local
398 spin_lock(&chip->reg_lock); in snd_ymfpci_playback_trigger()
407 chip->ctrl_playback[ypcm->voices[0]->number + 1] = cpu_to_le32(ypcm->voices[0]->bank_addr); in snd_ymfpci_playback_trigger()
409 chip->ctrl_playback[ypcm->voices[1]->number + 1] = cpu_to_le32(ypcm->voices[1]->bank_addr); in snd_ymfpci_playback_trigger()
413 if (substream->pcm == chip->pcm && !ypcm->use_441_slot) { in snd_ymfpci_playback_trigger()
414 kctl = chip->pcm_mixer[substream->number].ctl; in snd_ymfpci_playback_trigger()
420 chip->ctrl_playback[ypcm->voices[0]->number + 1] = 0; in snd_ymfpci_playback_trigger()
422 chip->ctrl_playback[ypcm->voices[1]->number + 1] = 0; in snd_ymfpci_playback_trigger()
430 spin_unlock(&chip->reg_lock); in snd_ymfpci_playback_trigger()
432 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_INFO, &kctl->id); in snd_ymfpci_playback_trigger()
438 struct snd_ymfpci *chip = snd_pcm_substream_chip(substream); in snd_ymfpci_capture_trigger() local
443 spin_lock(&chip->reg_lock); in snd_ymfpci_capture_trigger()
448 tmp = snd_ymfpci_readl(chip, YDSXGR_MAPOFREC) | (1 << ypcm->capture_bank_number); in snd_ymfpci_capture_trigger()
449 snd_ymfpci_writel(chip, YDSXGR_MAPOFREC, tmp); in snd_ymfpci_capture_trigger()
455 tmp = snd_ymfpci_readl(chip, YDSXGR_MAPOFREC) & ~(1 << ypcm->capture_bank_number); in snd_ymfpci_capture_trigger()
456 snd_ymfpci_writel(chip, YDSXGR_MAPOFREC, tmp); in snd_ymfpci_capture_trigger()
463 spin_unlock(&chip->reg_lock); in snd_ymfpci_capture_trigger()
472 snd_ymfpci_voice_free(ypcm->chip, ypcm->voices[1]); in snd_ymfpci_pcm_voice_alloc()
481 snd_ymfpci_voice_free(ypcm->chip, ypcm->voices[0]); in snd_ymfpci_pcm_voice_alloc()
485 err = snd_ymfpci_voice_alloc(ypcm->chip, YMFPCI_PCM, voices > 1, &ypcm->voices[0]); in snd_ymfpci_pcm_voice_alloc()
491 ypcm->voices[1] = &ypcm->chip->voices[ypcm->voices[0]->number + 1]; in snd_ymfpci_pcm_voice_alloc()
522 vol_left = cpu_to_le32(ypcm->chip->pcm_mixer in snd_ymfpci_pcm_init_voice()
524 vol_right = cpu_to_le32(ypcm->chip->pcm_mixer in snd_ymfpci_pcm_init_voice()
530 spin_lock_irqsave(&ypcm->chip->voice_lock, flags); in snd_ymfpci_pcm_init_voice()
534 else if (ypcm->chip->device_id == PCI_DEVICE_ID_YAMAHA_754 && in snd_ymfpci_pcm_init_voice()
536 voiceidx == 0 && (ypcm->chip->src441_used == -1 || in snd_ymfpci_pcm_init_voice()
537 ypcm->chip->src441_used == voice->number)) { in snd_ymfpci_pcm_init_voice()
538 ypcm->chip->src441_used = voice->number; in snd_ymfpci_pcm_init_voice()
542 if (ypcm->chip->src441_used == voice->number && in snd_ymfpci_pcm_init_voice()
544 ypcm->chip->src441_used = -1; in snd_ymfpci_pcm_init_voice()
549 spin_unlock_irqrestore(&ypcm->chip->voice_lock, flags); in snd_ymfpci_pcm_init_voice()
602 static int snd_ymfpci_ac3_init(struct snd_ymfpci *chip) in snd_ymfpci_ac3_init() argument
604 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(chip->pci), in snd_ymfpci_ac3_init()
605 4096, &chip->ac3_tmp_base) < 0) in snd_ymfpci_ac3_init()
608 chip->bank_effect[3][0]->base = in snd_ymfpci_ac3_init()
609 chip->bank_effect[3][1]->base = cpu_to_le32(chip->ac3_tmp_base.addr); in snd_ymfpci_ac3_init()
610 chip->bank_effect[3][0]->loop_end = in snd_ymfpci_ac3_init()
611 chip->bank_effect[3][1]->loop_end = cpu_to_le32(1024); in snd_ymfpci_ac3_init()
612 chip->bank_effect[4][0]->base = in snd_ymfpci_ac3_init()
613 chip->bank_effect[4][1]->base = cpu_to_le32(chip->ac3_tmp_base.addr + 2048); in snd_ymfpci_ac3_init()
614 chip->bank_effect[4][0]->loop_end = in snd_ymfpci_ac3_init()
615 chip->bank_effect[4][1]->loop_end = cpu_to_le32(1024); in snd_ymfpci_ac3_init()
617 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_ac3_init()
618 snd_ymfpci_writel(chip, YDSXGR_MAPOFEFFECT, in snd_ymfpci_ac3_init()
619 snd_ymfpci_readl(chip, YDSXGR_MAPOFEFFECT) | 3 << 3); in snd_ymfpci_ac3_init()
620 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_ac3_init()
624 static int snd_ymfpci_ac3_done(struct snd_ymfpci *chip) in snd_ymfpci_ac3_done() argument
626 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_ac3_done()
627 snd_ymfpci_writel(chip, YDSXGR_MAPOFEFFECT, in snd_ymfpci_ac3_done()
628 snd_ymfpci_readl(chip, YDSXGR_MAPOFEFFECT) & ~(3 << 3)); in snd_ymfpci_ac3_done()
629 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_ac3_done()
631 if (chip->ac3_tmp_base.area) { in snd_ymfpci_ac3_done()
632 snd_dma_free_pages(&chip->ac3_tmp_base); in snd_ymfpci_ac3_done()
633 chip->ac3_tmp_base.area = NULL; in snd_ymfpci_ac3_done()
654 struct snd_ymfpci *chip = snd_pcm_substream_chip(substream); in snd_ymfpci_playback_hw_free() local
663 snd_ymfpci_irq_wait(chip); in snd_ymfpci_playback_hw_free()
666 snd_ymfpci_voice_free(chip, ypcm->voices[1]); in snd_ymfpci_playback_hw_free()
670 snd_ymfpci_voice_free(chip, ypcm->voices[0]); in snd_ymfpci_playback_hw_free()
678 struct snd_ymfpci *chip = snd_pcm_substream_chip(substream); in snd_ymfpci_playback_prepare() local
690 substream->pcm == chip->pcm); in snd_ymfpci_playback_prepare()
692 if (substream->pcm == chip->pcm && !ypcm->use_441_slot) { in snd_ymfpci_playback_prepare()
693 kctl = chip->pcm_mixer[substream->number].ctl; in snd_ymfpci_playback_prepare()
695 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_INFO, &kctl->id); in snd_ymfpci_playback_prepare()
708 struct snd_ymfpci *chip = snd_pcm_substream_chip(substream); in snd_ymfpci_capture_hw_free() local
711 snd_ymfpci_irq_wait(chip); in snd_ymfpci_capture_hw_free()
717 struct snd_ymfpci *chip = snd_pcm_substream_chip(substream); in snd_ymfpci_capture_prepare() local
741 snd_ymfpci_writel(chip, YDSXGR_RECFORMAT, format); in snd_ymfpci_capture_prepare()
742 snd_ymfpci_writel(chip, YDSXGR_RECSLOTSR, rate); in snd_ymfpci_capture_prepare()
745 snd_ymfpci_writel(chip, YDSXGR_ADCFORMAT, format); in snd_ymfpci_capture_prepare()
746 snd_ymfpci_writel(chip, YDSXGR_ADCSLOTSR, rate); in snd_ymfpci_capture_prepare()
750 bank = chip->bank_capture[ypcm->capture_bank_number][nbank]; in snd_ymfpci_capture_prepare()
761 struct snd_ymfpci *chip = snd_pcm_substream_chip(substream); in snd_ymfpci_playback_pointer() local
768 return le32_to_cpu(voice->bank[chip->active_bank].start); in snd_ymfpci_playback_pointer()
773 struct snd_ymfpci *chip = snd_pcm_substream_chip(substream); in snd_ymfpci_capture_pointer() local
779 …return le32_to_cpu(chip->bank_capture[ypcm->capture_bank_number][chip->active_bank]->start) >> ypc… in snd_ymfpci_capture_pointer()
782 static void snd_ymfpci_irq_wait(struct snd_ymfpci *chip) in snd_ymfpci_irq_wait() argument
788 if ((snd_ymfpci_readl(chip, YDSXGR_MODE) & 3) == 0) in snd_ymfpci_irq_wait()
791 add_wait_queue(&chip->interrupt_sleep, &wait); in snd_ymfpci_irq_wait()
792 atomic_inc(&chip->interrupt_sleep_count); in snd_ymfpci_irq_wait()
794 remove_wait_queue(&chip->interrupt_sleep, &wait); in snd_ymfpci_irq_wait()
800 struct snd_ymfpci *chip = dev_id; in snd_ymfpci_interrupt() local
804 status = snd_ymfpci_readl(chip, YDSXGR_STATUS); in snd_ymfpci_interrupt()
806 chip->active_bank = snd_ymfpci_readl(chip, YDSXGR_CTRLSELECT) & 1; in snd_ymfpci_interrupt()
807 spin_lock(&chip->voice_lock); in snd_ymfpci_interrupt()
809 voice = &chip->voices[nvoice]; in snd_ymfpci_interrupt()
811 voice->interrupt(chip, voice); in snd_ymfpci_interrupt()
814 if (chip->capture_substream[nvoice]) in snd_ymfpci_interrupt()
815 snd_ymfpci_pcm_capture_interrupt(chip->capture_substream[nvoice]); in snd_ymfpci_interrupt()
819 if (chip->effect_substream[nvoice]) in snd_ymfpci_interrupt()
820 snd_ymfpci_pcm_effect_interrupt(chip->effect_substream[nvoice]); in snd_ymfpci_interrupt()
823 spin_unlock(&chip->voice_lock); in snd_ymfpci_interrupt()
824 spin_lock(&chip->reg_lock); in snd_ymfpci_interrupt()
825 snd_ymfpci_writel(chip, YDSXGR_STATUS, 0x80000000); in snd_ymfpci_interrupt()
826 mode = snd_ymfpci_readl(chip, YDSXGR_MODE) | 2; in snd_ymfpci_interrupt()
827 snd_ymfpci_writel(chip, YDSXGR_MODE, mode); in snd_ymfpci_interrupt()
828 spin_unlock(&chip->reg_lock); in snd_ymfpci_interrupt()
830 if (atomic_read(&chip->interrupt_sleep_count)) { in snd_ymfpci_interrupt()
831 atomic_set(&chip->interrupt_sleep_count, 0); in snd_ymfpci_interrupt()
832 wake_up(&chip->interrupt_sleep); in snd_ymfpci_interrupt()
836 status = snd_ymfpci_readw(chip, YDSXGR_INTFLAG); in snd_ymfpci_interrupt()
838 if (chip->timer) in snd_ymfpci_interrupt()
839 snd_timer_interrupt(chip->timer, chip->timer_ticks); in snd_ymfpci_interrupt()
841 snd_ymfpci_writew(chip, YDSXGR_INTFLAG, status); in snd_ymfpci_interrupt()
843 if (chip->rawmidi) in snd_ymfpci_interrupt()
844 snd_mpu401_uart_interrupt(irq, chip->rawmidi->private_data); in snd_ymfpci_interrupt()
899 struct snd_ymfpci *chip = snd_pcm_substream_chip(substream); in snd_ymfpci_playback_open_1() local
918 ypcm->chip = chip; in snd_ymfpci_playback_open_1()
927 static void ymfpci_open_extension(struct snd_ymfpci *chip) in ymfpci_open_extension() argument
929 if (! chip->rear_opened) { in ymfpci_open_extension()
930 if (! chip->spdif_opened) /* set AC3 */ in ymfpci_open_extension()
931 snd_ymfpci_writel(chip, YDSXGR_MODE, in ymfpci_open_extension()
932 snd_ymfpci_readl(chip, YDSXGR_MODE) | (1 << 30)); in ymfpci_open_extension()
934 snd_ymfpci_writew(chip, YDSXGR_SECCONFIG, in ymfpci_open_extension()
935 (snd_ymfpci_readw(chip, YDSXGR_SECCONFIG) & ~0x0330) | 0x0010); in ymfpci_open_extension()
940 static void ymfpci_close_extension(struct snd_ymfpci *chip) in ymfpci_close_extension() argument
942 if (! chip->rear_opened) { in ymfpci_close_extension()
943 if (! chip->spdif_opened) in ymfpci_close_extension()
944 snd_ymfpci_writel(chip, YDSXGR_MODE, in ymfpci_close_extension()
945 snd_ymfpci_readl(chip, YDSXGR_MODE) & ~(1 << 30)); in ymfpci_close_extension()
946 snd_ymfpci_writew(chip, YDSXGR_SECCONFIG, in ymfpci_close_extension()
947 (snd_ymfpci_readw(chip, YDSXGR_SECCONFIG) & ~0x0330) & ~0x0010); in ymfpci_close_extension()
953 struct snd_ymfpci *chip = snd_pcm_substream_chip(substream); in snd_ymfpci_playback_open() local
962 ypcm->output_rear = chip->mode_dup4ch ? 1 : 0; in snd_ymfpci_playback_open()
964 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_playback_open()
966 ymfpci_open_extension(chip); in snd_ymfpci_playback_open()
967 chip->rear_opened++; in snd_ymfpci_playback_open()
969 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_playback_open()
975 struct snd_ymfpci *chip = snd_pcm_substream_chip(substream); in snd_ymfpci_playback_spdif_open() local
986 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_playback_spdif_open()
987 snd_ymfpci_writew(chip, YDSXGR_SPDIFOUTCTRL, in snd_ymfpci_playback_spdif_open()
988 snd_ymfpci_readw(chip, YDSXGR_SPDIFOUTCTRL) | 2); in snd_ymfpci_playback_spdif_open()
989 ymfpci_open_extension(chip); in snd_ymfpci_playback_spdif_open()
990 chip->spdif_pcm_bits = chip->spdif_bits; in snd_ymfpci_playback_spdif_open()
991 snd_ymfpci_writew(chip, YDSXGR_SPDIFOUTSTATUS, chip->spdif_pcm_bits); in snd_ymfpci_playback_spdif_open()
992 chip->spdif_opened++; in snd_ymfpci_playback_spdif_open()
993 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_playback_spdif_open()
995 chip->spdif_pcm_ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; in snd_ymfpci_playback_spdif_open()
996 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE | in snd_ymfpci_playback_spdif_open()
997 SNDRV_CTL_EVENT_MASK_INFO, &chip->spdif_pcm_ctl->id); in snd_ymfpci_playback_spdif_open()
1003 struct snd_ymfpci *chip = snd_pcm_substream_chip(substream); in snd_ymfpci_playback_4ch_open() local
1014 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_playback_4ch_open()
1015 ymfpci_open_extension(chip); in snd_ymfpci_playback_4ch_open()
1016 chip->rear_opened++; in snd_ymfpci_playback_4ch_open()
1017 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_playback_4ch_open()
1024 struct snd_ymfpci *chip = snd_pcm_substream_chip(substream); in snd_ymfpci_capture_open() local
1043 ypcm->chip = chip; in snd_ymfpci_capture_open()
1047 chip->capture_substream[capture_bank_number] = substream; in snd_ymfpci_capture_open()
1050 snd_ymfpci_hw_start(chip); in snd_ymfpci_capture_open()
1071 struct snd_ymfpci *chip = snd_pcm_substream_chip(substream); in snd_ymfpci_playback_close() local
1074 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_playback_close()
1075 if (ypcm->output_rear && chip->rear_opened > 0) { in snd_ymfpci_playback_close()
1076 chip->rear_opened--; in snd_ymfpci_playback_close()
1077 ymfpci_close_extension(chip); in snd_ymfpci_playback_close()
1079 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_playback_close()
1085 struct snd_ymfpci *chip = snd_pcm_substream_chip(substream); in snd_ymfpci_playback_spdif_close() local
1087 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_playback_spdif_close()
1088 chip->spdif_opened = 0; in snd_ymfpci_playback_spdif_close()
1089 ymfpci_close_extension(chip); in snd_ymfpci_playback_spdif_close()
1090 snd_ymfpci_writew(chip, YDSXGR_SPDIFOUTCTRL, in snd_ymfpci_playback_spdif_close()
1091 snd_ymfpci_readw(chip, YDSXGR_SPDIFOUTCTRL) & ~2); in snd_ymfpci_playback_spdif_close()
1092 snd_ymfpci_writew(chip, YDSXGR_SPDIFOUTSTATUS, chip->spdif_bits); in snd_ymfpci_playback_spdif_close()
1093 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_playback_spdif_close()
1094 chip->spdif_pcm_ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE; in snd_ymfpci_playback_spdif_close()
1095 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE | in snd_ymfpci_playback_spdif_close()
1096 SNDRV_CTL_EVENT_MASK_INFO, &chip->spdif_pcm_ctl->id); in snd_ymfpci_playback_spdif_close()
1102 struct snd_ymfpci *chip = snd_pcm_substream_chip(substream); in snd_ymfpci_playback_4ch_close() local
1104 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_playback_4ch_close()
1105 if (chip->rear_opened > 0) { in snd_ymfpci_playback_4ch_close()
1106 chip->rear_opened--; in snd_ymfpci_playback_4ch_close()
1107 ymfpci_close_extension(chip); in snd_ymfpci_playback_4ch_close()
1109 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_playback_4ch_close()
1115 struct snd_ymfpci *chip = snd_pcm_substream_chip(substream); in snd_ymfpci_capture_close() local
1120 chip->capture_substream[ypcm->capture_bank_number] = NULL; in snd_ymfpci_capture_close()
1121 snd_ymfpci_hw_stop(chip); in snd_ymfpci_capture_close()
1148 int snd_ymfpci_pcm(struct snd_ymfpci *chip, int device) in snd_ymfpci_pcm() argument
1153 if ((err = snd_pcm_new(chip->card, "YMFPCI", device, 32, 1, &pcm)) < 0) in snd_ymfpci_pcm()
1155 pcm->private_data = chip; in snd_ymfpci_pcm()
1163 chip->pcm = pcm; in snd_ymfpci_pcm()
1166 snd_dma_pci_data(chip->pci), 64*1024, 256*1024); in snd_ymfpci_pcm()
1183 int snd_ymfpci_pcm2(struct snd_ymfpci *chip, int device) in snd_ymfpci_pcm2() argument
1188 if ((err = snd_pcm_new(chip->card, "YMFPCI - PCM2", device, 0, 1, &pcm)) < 0) in snd_ymfpci_pcm2()
1190 pcm->private_data = chip; in snd_ymfpci_pcm2()
1197 chip->device_id == PCI_DEVICE_ID_YAMAHA_754 ? "Direct Recording" : "AC'97"); in snd_ymfpci_pcm2()
1198 chip->pcm2 = pcm; in snd_ymfpci_pcm2()
1201 snd_dma_pci_data(chip->pci), 64*1024, 256*1024); in snd_ymfpci_pcm2()
1217 int snd_ymfpci_pcm_spdif(struct snd_ymfpci *chip, int device) in snd_ymfpci_pcm_spdif() argument
1222 if ((err = snd_pcm_new(chip->card, "YMFPCI - IEC958", device, 1, 0, &pcm)) < 0) in snd_ymfpci_pcm_spdif()
1224 pcm->private_data = chip; in snd_ymfpci_pcm_spdif()
1231 chip->pcm_spdif = pcm; in snd_ymfpci_pcm_spdif()
1234 snd_dma_pci_data(chip->pci), 64*1024, 256*1024); in snd_ymfpci_pcm_spdif()
1258 int snd_ymfpci_pcm_4ch(struct snd_ymfpci *chip, int device) in snd_ymfpci_pcm_4ch() argument
1263 if ((err = snd_pcm_new(chip->card, "YMFPCI - Rear", device, 1, 0, &pcm)) < 0) in snd_ymfpci_pcm_4ch()
1265 pcm->private_data = chip; in snd_ymfpci_pcm_4ch()
1272 chip->pcm_4ch = pcm; in snd_ymfpci_pcm_4ch()
1275 snd_dma_pci_data(chip->pci), 64*1024, 256*1024); in snd_ymfpci_pcm_4ch()
1291 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_spdif_default_get() local
1293 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_spdif_default_get()
1294 ucontrol->value.iec958.status[0] = (chip->spdif_bits >> 0) & 0xff; in snd_ymfpci_spdif_default_get()
1295 ucontrol->value.iec958.status[1] = (chip->spdif_bits >> 8) & 0xff; in snd_ymfpci_spdif_default_get()
1297 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_spdif_default_get()
1304 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_spdif_default_put() local
1310 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_spdif_default_put()
1311 change = chip->spdif_bits != val; in snd_ymfpci_spdif_default_put()
1312 chip->spdif_bits = val; in snd_ymfpci_spdif_default_put()
1313 if ((snd_ymfpci_readw(chip, YDSXGR_SPDIFOUTCTRL) & 1) && chip->pcm_spdif == NULL) in snd_ymfpci_spdif_default_put()
1314 snd_ymfpci_writew(chip, YDSXGR_SPDIFOUTSTATUS, chip->spdif_bits); in snd_ymfpci_spdif_default_put()
1315 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_spdif_default_put()
1338 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_spdif_mask_get() local
1340 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_spdif_mask_get()
1343 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_spdif_mask_get()
1366 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_spdif_stream_get() local
1368 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_spdif_stream_get()
1369 ucontrol->value.iec958.status[0] = (chip->spdif_pcm_bits >> 0) & 0xff; in snd_ymfpci_spdif_stream_get()
1370 ucontrol->value.iec958.status[1] = (chip->spdif_pcm_bits >> 8) & 0xff; in snd_ymfpci_spdif_stream_get()
1372 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_spdif_stream_get()
1379 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_spdif_stream_put() local
1385 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_spdif_stream_put()
1386 change = chip->spdif_pcm_bits != val; in snd_ymfpci_spdif_stream_put()
1387 chip->spdif_pcm_bits = val; in snd_ymfpci_spdif_stream_put()
1388 if ((snd_ymfpci_readw(chip, YDSXGR_SPDIFOUTCTRL) & 2)) in snd_ymfpci_spdif_stream_put()
1389 snd_ymfpci_writew(chip, YDSXGR_SPDIFOUTSTATUS, chip->spdif_pcm_bits); in snd_ymfpci_spdif_stream_put()
1390 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_spdif_stream_put()
1413 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_drec_source_get() local
1416 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_drec_source_get()
1417 reg = snd_ymfpci_readw(chip, YDSXGR_GLOBALCTRL); in snd_ymfpci_drec_source_get()
1418 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_drec_source_get()
1428 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_drec_source_put() local
1431 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_drec_source_put()
1432 old_reg = snd_ymfpci_readw(chip, YDSXGR_GLOBALCTRL); in snd_ymfpci_drec_source_put()
1437 snd_ymfpci_writew(chip, YDSXGR_GLOBALCTRL, reg); in snd_ymfpci_drec_source_put()
1438 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_drec_source_put()
1466 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_get_single() local
1477 (snd_ymfpci_readl(chip, reg) >> shift) & mask; in snd_ymfpci_get_single()
1484 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_put_single() local
1498 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_put_single()
1499 oval = snd_ymfpci_readl(chip, reg); in snd_ymfpci_put_single()
1502 snd_ymfpci_writel(chip, reg, val); in snd_ymfpci_put_single()
1503 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_put_single()
1532 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_get_double() local
1539 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_get_double()
1540 val = snd_ymfpci_readl(chip, reg); in snd_ymfpci_get_double()
1541 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_get_double()
1549 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_put_double() local
1561 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_put_double()
1562 oval = snd_ymfpci_readl(chip, reg); in snd_ymfpci_put_double()
1565 snd_ymfpci_writel(chip, reg, val1); in snd_ymfpci_put_double()
1566 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_put_double()
1573 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_put_nativedacvol() local
1581 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_put_nativedacvol()
1582 oval = snd_ymfpci_readl(chip, reg); in snd_ymfpci_put_nativedacvol()
1584 snd_ymfpci_writel(chip, reg, value); in snd_ymfpci_put_nativedacvol()
1585 snd_ymfpci_writel(chip, reg2, value); in snd_ymfpci_put_nativedacvol()
1586 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_put_nativedacvol()
1597 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_get_dup4ch() local
1598 ucontrol->value.integer.value[0] = chip->mode_dup4ch; in snd_ymfpci_get_dup4ch()
1604 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_put_dup4ch() local
1606 change = (ucontrol->value.integer.value[0] != chip->mode_dup4ch); in snd_ymfpci_put_dup4ch()
1608 chip->mode_dup4ch = !!ucontrol->value.integer.value[0]; in snd_ymfpci_put_dup4ch()
1655 static int snd_ymfpci_get_gpio_out(struct snd_ymfpci *chip, int pin) in snd_ymfpci_get_gpio_out() argument
1660 spin_lock_irqsave(&chip->reg_lock, flags); in snd_ymfpci_get_gpio_out()
1661 reg = snd_ymfpci_readw(chip, YDSXGR_GPIOFUNCENABLE); in snd_ymfpci_get_gpio_out()
1664 snd_ymfpci_writew(chip, YDSXGR_GPIOFUNCENABLE, reg); in snd_ymfpci_get_gpio_out()
1666 mode = snd_ymfpci_readw(chip, YDSXGR_GPIOTYPECONFIG); in snd_ymfpci_get_gpio_out()
1668 snd_ymfpci_writew(chip, YDSXGR_GPIOTYPECONFIG, mode); in snd_ymfpci_get_gpio_out()
1669 snd_ymfpci_writew(chip, YDSXGR_GPIOFUNCENABLE, reg | (1 << (pin + 8))); in snd_ymfpci_get_gpio_out()
1670 mode = snd_ymfpci_readw(chip, YDSXGR_GPIOINSTATUS); in snd_ymfpci_get_gpio_out()
1671 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_ymfpci_get_gpio_out()
1675 static int snd_ymfpci_set_gpio_out(struct snd_ymfpci *chip, int pin, int enable) in snd_ymfpci_set_gpio_out() argument
1680 spin_lock_irqsave(&chip->reg_lock, flags); in snd_ymfpci_set_gpio_out()
1681 reg = snd_ymfpci_readw(chip, YDSXGR_GPIOFUNCENABLE); in snd_ymfpci_set_gpio_out()
1684 snd_ymfpci_writew(chip, YDSXGR_GPIOFUNCENABLE, reg); in snd_ymfpci_set_gpio_out()
1685 snd_ymfpci_writew(chip, YDSXGR_GPIOOUTCTRL, enable << pin); in snd_ymfpci_set_gpio_out()
1686 snd_ymfpci_writew(chip, YDSXGR_GPIOFUNCENABLE, reg | (1 << (pin + 8))); in snd_ymfpci_set_gpio_out()
1687 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_ymfpci_set_gpio_out()
1696 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_gpio_sw_get() local
1698 ucontrol->value.integer.value[0] = snd_ymfpci_get_gpio_out(chip, pin); in snd_ymfpci_gpio_sw_get()
1704 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_gpio_sw_put() local
1707 if (snd_ymfpci_get_gpio_out(chip, pin) != ucontrol->value.integer.value[0]) { in snd_ymfpci_gpio_sw_put()
1708 snd_ymfpci_set_gpio_out(chip, pin, !!ucontrol->value.integer.value[0]); in snd_ymfpci_gpio_sw_put()
1709 ucontrol->value.integer.value[0] = snd_ymfpci_get_gpio_out(chip, pin); in snd_ymfpci_gpio_sw_put()
1741 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_pcm_vol_get() local
1744 ucontrol->value.integer.value[0] = chip->pcm_mixer[subs].left; in snd_ymfpci_pcm_vol_get()
1745 ucontrol->value.integer.value[1] = chip->pcm_mixer[subs].right; in snd_ymfpci_pcm_vol_get()
1752 struct snd_ymfpci *chip = snd_kcontrol_chip(kcontrol); in snd_ymfpci_pcm_vol_put() local
1757 if (ucontrol->value.integer.value[0] != chip->pcm_mixer[subs].left || in snd_ymfpci_pcm_vol_put()
1758 ucontrol->value.integer.value[1] != chip->pcm_mixer[subs].right) { in snd_ymfpci_pcm_vol_put()
1759 chip->pcm_mixer[subs].left = ucontrol->value.integer.value[0]; in snd_ymfpci_pcm_vol_put()
1760 chip->pcm_mixer[subs].right = ucontrol->value.integer.value[1]; in snd_ymfpci_pcm_vol_put()
1761 if (chip->pcm_mixer[subs].left > 0x8000) in snd_ymfpci_pcm_vol_put()
1762 chip->pcm_mixer[subs].left = 0x8000; in snd_ymfpci_pcm_vol_put()
1763 if (chip->pcm_mixer[subs].right > 0x8000) in snd_ymfpci_pcm_vol_put()
1764 chip->pcm_mixer[subs].right = 0x8000; in snd_ymfpci_pcm_vol_put()
1767 spin_lock_irqsave(&chip->voice_lock, flags); in snd_ymfpci_pcm_vol_put()
1773 spin_unlock_irqrestore(&chip->voice_lock, flags); in snd_ymfpci_pcm_vol_put()
1796 struct snd_ymfpci *chip = bus->private_data; in snd_ymfpci_mixer_free_ac97_bus() local
1797 chip->ac97_bus = NULL; in snd_ymfpci_mixer_free_ac97_bus()
1802 struct snd_ymfpci *chip = ac97->private_data; in snd_ymfpci_mixer_free_ac97() local
1803 chip->ac97 = NULL; in snd_ymfpci_mixer_free_ac97()
1806 int snd_ymfpci_mixer(struct snd_ymfpci *chip, int rear_switch) in snd_ymfpci_mixer() argument
1818 if ((err = snd_ac97_bus(chip->card, 0, &ops, chip, &chip->ac97_bus)) < 0) in snd_ymfpci_mixer()
1820 chip->ac97_bus->private_free = snd_ymfpci_mixer_free_ac97_bus; in snd_ymfpci_mixer()
1821 chip->ac97_bus->no_vra = 1; /* YMFPCI doesn't need VRA */ in snd_ymfpci_mixer()
1824 ac97.private_data = chip; in snd_ymfpci_mixer()
1826 if ((err = snd_ac97_mixer(chip->ac97_bus, &ac97, &chip->ac97)) < 0) in snd_ymfpci_mixer()
1830 snd_ac97_update_bits(chip->ac97, AC97_EXTENDED_STATUS, in snd_ymfpci_mixer()
1834 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_ymfpci_controls[idx], chip))) < 0) in snd_ymfpci_mixer()
1837 if (chip->ac97->ext_id & AC97_EI_SDAC) { in snd_ymfpci_mixer()
1838 kctl = snd_ctl_new1(&snd_ymfpci_dup4ch, chip); in snd_ymfpci_mixer()
1839 err = snd_ctl_add(chip->card, kctl); in snd_ymfpci_mixer()
1845 if (snd_BUG_ON(!chip->pcm_spdif)) in snd_ymfpci_mixer()
1847 if ((err = snd_ctl_add(chip->card, kctl = snd_ctl_new1(&snd_ymfpci_spdif_default, chip))) < 0) in snd_ymfpci_mixer()
1849 kctl->id.device = chip->pcm_spdif->device; in snd_ymfpci_mixer()
1850 if ((err = snd_ctl_add(chip->card, kctl = snd_ctl_new1(&snd_ymfpci_spdif_mask, chip))) < 0) in snd_ymfpci_mixer()
1852 kctl->id.device = chip->pcm_spdif->device; in snd_ymfpci_mixer()
1853 if ((err = snd_ctl_add(chip->card, kctl = snd_ctl_new1(&snd_ymfpci_spdif_stream, chip))) < 0) in snd_ymfpci_mixer()
1855 kctl->id.device = chip->pcm_spdif->device; in snd_ymfpci_mixer()
1856 chip->spdif_pcm_ctl = kctl; in snd_ymfpci_mixer()
1859 if (chip->device_id == PCI_DEVICE_ID_YAMAHA_754 && in snd_ymfpci_mixer()
1860 (err = snd_ctl_add(chip->card, kctl = snd_ctl_new1(&snd_ymfpci_drec_source, chip))) < 0) in snd_ymfpci_mixer()
1867 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_ymfpci_rear_shared, chip))) < 0) in snd_ymfpci_mixer()
1872 substream = chip->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; in snd_ymfpci_mixer()
1874 kctl = snd_ctl_new1(&snd_ymfpci_pcm_volume, chip); in snd_ymfpci_mixer()
1877 kctl->id.device = chip->pcm->device; in snd_ymfpci_mixer()
1880 if ((err = snd_ctl_add(chip->card, kctl)) < 0) in snd_ymfpci_mixer()
1882 chip->pcm_mixer[idx].left = 0x8000; in snd_ymfpci_mixer()
1883 chip->pcm_mixer[idx].right = 0x8000; in snd_ymfpci_mixer()
1884 chip->pcm_mixer[idx].ctl = kctl; in snd_ymfpci_mixer()
1898 struct snd_ymfpci *chip; in snd_ymfpci_timer_start() local
1902 chip = snd_timer_chip(timer); in snd_ymfpci_timer_start()
1903 spin_lock_irqsave(&chip->reg_lock, flags); in snd_ymfpci_timer_start()
1905 chip->timer_ticks = timer->sticks; in snd_ymfpci_timer_start()
1912 chip->timer_ticks = 2; in snd_ymfpci_timer_start()
1915 snd_ymfpci_writew(chip, YDSXGR_TIMERCOUNT, count); in snd_ymfpci_timer_start()
1916 snd_ymfpci_writeb(chip, YDSXGR_TIMERCTRL, 0x03); in snd_ymfpci_timer_start()
1917 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_ymfpci_timer_start()
1923 struct snd_ymfpci *chip; in snd_ymfpci_timer_stop() local
1926 chip = snd_timer_chip(timer); in snd_ymfpci_timer_stop()
1927 spin_lock_irqsave(&chip->reg_lock, flags); in snd_ymfpci_timer_stop()
1928 snd_ymfpci_writeb(chip, YDSXGR_TIMERCTRL, 0x00); in snd_ymfpci_timer_stop()
1929 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_ymfpci_timer_stop()
1950 int snd_ymfpci_timer(struct snd_ymfpci *chip, int device) in snd_ymfpci_timer() argument
1958 tid.card = chip->card->number; in snd_ymfpci_timer()
1961 if ((err = snd_timer_new(chip->card, "YMFPCI", &tid, &timer)) >= 0) { in snd_ymfpci_timer()
1963 timer->private_data = chip; in snd_ymfpci_timer()
1966 chip->timer = timer; in snd_ymfpci_timer()
1978 struct snd_ymfpci *chip = entry->private_data; in snd_ymfpci_proc_read() local
1983 snd_iprintf(buffer, "%04x: %04x\n", i, snd_ymfpci_readl(chip, i)); in snd_ymfpci_proc_read()
1986 static int snd_ymfpci_proc_init(struct snd_card *card, struct snd_ymfpci *chip) in snd_ymfpci_proc_init() argument
1991 snd_info_set_text_ops(entry, chip, snd_ymfpci_proc_read); in snd_ymfpci_proc_init()
2017 static void snd_ymfpci_enable_dsp(struct snd_ymfpci *chip) in snd_ymfpci_enable_dsp() argument
2019 snd_ymfpci_writel(chip, YDSXGR_CONFIG, 0x00000001); in snd_ymfpci_enable_dsp()
2022 static void snd_ymfpci_disable_dsp(struct snd_ymfpci *chip) in snd_ymfpci_disable_dsp() argument
2027 val = snd_ymfpci_readl(chip, YDSXGR_CONFIG); in snd_ymfpci_disable_dsp()
2029 snd_ymfpci_writel(chip, YDSXGR_CONFIG, 0x00000000); in snd_ymfpci_disable_dsp()
2031 val = snd_ymfpci_readl(chip, YDSXGR_STATUS); in snd_ymfpci_disable_dsp()
2037 static int snd_ymfpci_request_firmware(struct snd_ymfpci *chip) in snd_ymfpci_request_firmware() argument
2042 err = request_firmware(&chip->dsp_microcode, "yamaha/ds1_dsp.fw", in snd_ymfpci_request_firmware()
2043 &chip->pci->dev); in snd_ymfpci_request_firmware()
2045 if (chip->dsp_microcode->size != YDSXG_DSPLENGTH) { in snd_ymfpci_request_firmware()
2046 dev_err(chip->card->dev, in snd_ymfpci_request_firmware()
2053 is_1e = chip->device_id == PCI_DEVICE_ID_YAMAHA_724F || in snd_ymfpci_request_firmware()
2054 chip->device_id == PCI_DEVICE_ID_YAMAHA_740C || in snd_ymfpci_request_firmware()
2055 chip->device_id == PCI_DEVICE_ID_YAMAHA_744 || in snd_ymfpci_request_firmware()
2056 chip->device_id == PCI_DEVICE_ID_YAMAHA_754; in snd_ymfpci_request_firmware()
2058 err = request_firmware(&chip->controller_microcode, name, in snd_ymfpci_request_firmware()
2059 &chip->pci->dev); in snd_ymfpci_request_firmware()
2061 if (chip->controller_microcode->size != YDSXG_CTRLLENGTH) { in snd_ymfpci_request_firmware()
2062 dev_err(chip->card->dev, in snd_ymfpci_request_firmware()
2076 static void snd_ymfpci_download_image(struct snd_ymfpci *chip) in snd_ymfpci_download_image() argument
2082 snd_ymfpci_writel(chip, YDSXGR_NATIVEDACOUTVOL, 0x00000000); in snd_ymfpci_download_image()
2083 snd_ymfpci_disable_dsp(chip); in snd_ymfpci_download_image()
2084 snd_ymfpci_writel(chip, YDSXGR_MODE, 0x00010000); in snd_ymfpci_download_image()
2085 snd_ymfpci_writel(chip, YDSXGR_MODE, 0x00000000); in snd_ymfpci_download_image()
2086 snd_ymfpci_writel(chip, YDSXGR_MAPOFREC, 0x00000000); in snd_ymfpci_download_image()
2087 snd_ymfpci_writel(chip, YDSXGR_MAPOFEFFECT, 0x00000000); in snd_ymfpci_download_image()
2088 snd_ymfpci_writel(chip, YDSXGR_PLAYCTRLBASE, 0x00000000); in snd_ymfpci_download_image()
2089 snd_ymfpci_writel(chip, YDSXGR_RECCTRLBASE, 0x00000000); in snd_ymfpci_download_image()
2090 snd_ymfpci_writel(chip, YDSXGR_EFFCTRLBASE, 0x00000000); in snd_ymfpci_download_image()
2091 ctrl = snd_ymfpci_readw(chip, YDSXGR_GLOBALCTRL); in snd_ymfpci_download_image()
2092 snd_ymfpci_writew(chip, YDSXGR_GLOBALCTRL, ctrl & ~0x0007); in snd_ymfpci_download_image()
2095 inst = (const __le32 *)chip->dsp_microcode->data; in snd_ymfpci_download_image()
2097 snd_ymfpci_writel(chip, YDSXGR_DSPINSTRAM + (i << 2), in snd_ymfpci_download_image()
2101 inst = (const __le32 *)chip->controller_microcode->data; in snd_ymfpci_download_image()
2103 snd_ymfpci_writel(chip, YDSXGR_CTRLINSTRAM + (i << 2), in snd_ymfpci_download_image()
2106 snd_ymfpci_enable_dsp(chip); in snd_ymfpci_download_image()
2109 static int snd_ymfpci_memalloc(struct snd_ymfpci *chip) in snd_ymfpci_memalloc() argument
2117 chip->bank_size_playback = snd_ymfpci_readl(chip, YDSXGR_PLAYCTRLSIZE) << 2; in snd_ymfpci_memalloc()
2118 chip->bank_size_capture = snd_ymfpci_readl(chip, YDSXGR_RECCTRLSIZE) << 2; in snd_ymfpci_memalloc()
2119 chip->bank_size_effect = snd_ymfpci_readl(chip, YDSXGR_EFFCTRLSIZE) << 2; in snd_ymfpci_memalloc()
2120 chip->work_size = YDSXG_DEFAULT_WORK_SIZE; in snd_ymfpci_memalloc()
2123 ALIGN(chip->bank_size_playback * 2 * YDSXG_PLAYBACK_VOICES, 0x100) + in snd_ymfpci_memalloc()
2124 ALIGN(chip->bank_size_capture * 2 * YDSXG_CAPTURE_VOICES, 0x100) + in snd_ymfpci_memalloc()
2125 ALIGN(chip->bank_size_effect * 2 * YDSXG_EFFECT_VOICES, 0x100) + in snd_ymfpci_memalloc()
2126 chip->work_size; in snd_ymfpci_memalloc()
2129 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(chip->pci), in snd_ymfpci_memalloc()
2130 size, &chip->work_ptr) < 0) in snd_ymfpci_memalloc()
2132 ptr = chip->work_ptr.area; in snd_ymfpci_memalloc()
2133 ptr_addr = chip->work_ptr.addr; in snd_ymfpci_memalloc()
2136 chip->bank_base_playback = ptr; in snd_ymfpci_memalloc()
2137 chip->bank_base_playback_addr = ptr_addr; in snd_ymfpci_memalloc()
2138 chip->ctrl_playback = (u32 *)ptr; in snd_ymfpci_memalloc()
2139 chip->ctrl_playback[0] = cpu_to_le32(YDSXG_PLAYBACK_VOICES); in snd_ymfpci_memalloc()
2143 chip->voices[voice].number = voice; in snd_ymfpci_memalloc()
2144 chip->voices[voice].bank = (struct snd_ymfpci_playback_bank *)ptr; in snd_ymfpci_memalloc()
2145 chip->voices[voice].bank_addr = ptr_addr; in snd_ymfpci_memalloc()
2147 chip->bank_playback[voice][bank] = (struct snd_ymfpci_playback_bank *)ptr; in snd_ymfpci_memalloc()
2148 ptr += chip->bank_size_playback; in snd_ymfpci_memalloc()
2149 ptr_addr += chip->bank_size_playback; in snd_ymfpci_memalloc()
2154 chip->bank_base_capture = ptr; in snd_ymfpci_memalloc()
2155 chip->bank_base_capture_addr = ptr_addr; in snd_ymfpci_memalloc()
2158 chip->bank_capture[voice][bank] = (struct snd_ymfpci_capture_bank *)ptr; in snd_ymfpci_memalloc()
2159 ptr += chip->bank_size_capture; in snd_ymfpci_memalloc()
2160 ptr_addr += chip->bank_size_capture; in snd_ymfpci_memalloc()
2164 chip->bank_base_effect = ptr; in snd_ymfpci_memalloc()
2165 chip->bank_base_effect_addr = ptr_addr; in snd_ymfpci_memalloc()
2168 chip->bank_effect[voice][bank] = (struct snd_ymfpci_effect_bank *)ptr; in snd_ymfpci_memalloc()
2169 ptr += chip->bank_size_effect; in snd_ymfpci_memalloc()
2170 ptr_addr += chip->bank_size_effect; in snd_ymfpci_memalloc()
2174 chip->work_base = ptr; in snd_ymfpci_memalloc()
2175 chip->work_base_addr = ptr_addr; in snd_ymfpci_memalloc()
2177 snd_BUG_ON(ptr + chip->work_size != in snd_ymfpci_memalloc()
2178 chip->work_ptr.area + chip->work_ptr.bytes); in snd_ymfpci_memalloc()
2180 snd_ymfpci_writel(chip, YDSXGR_PLAYCTRLBASE, chip->bank_base_playback_addr); in snd_ymfpci_memalloc()
2181 snd_ymfpci_writel(chip, YDSXGR_RECCTRLBASE, chip->bank_base_capture_addr); in snd_ymfpci_memalloc()
2182 snd_ymfpci_writel(chip, YDSXGR_EFFCTRLBASE, chip->bank_base_effect_addr); in snd_ymfpci_memalloc()
2183 snd_ymfpci_writel(chip, YDSXGR_WORKBASE, chip->work_base_addr); in snd_ymfpci_memalloc()
2184 snd_ymfpci_writel(chip, YDSXGR_WORKSIZE, chip->work_size >> 2); in snd_ymfpci_memalloc()
2187 chip->spdif_bits = chip->spdif_pcm_bits = SNDRV_PCM_DEFAULT_CON_SPDIF & 0xffff; in snd_ymfpci_memalloc()
2188 snd_ymfpci_writew(chip, YDSXGR_SPDIFOUTCTRL, 0); in snd_ymfpci_memalloc()
2189 snd_ymfpci_writew(chip, YDSXGR_SPDIFOUTSTATUS, chip->spdif_bits); in snd_ymfpci_memalloc()
2192 snd_ymfpci_writew(chip, YDSXGR_SPDIFINCTRL, 0); in snd_ymfpci_memalloc()
2196 snd_ymfpci_writel(chip, reg, 0); in snd_ymfpci_memalloc()
2197 snd_ymfpci_writel(chip, YDSXGR_NATIVEDACOUTVOL, 0x3fff3fff); in snd_ymfpci_memalloc()
2198 snd_ymfpci_writel(chip, YDSXGR_BUF441OUTVOL, 0x3fff3fff); in snd_ymfpci_memalloc()
2199 snd_ymfpci_writel(chip, YDSXGR_ZVOUTVOL, 0x3fff3fff); in snd_ymfpci_memalloc()
2200 snd_ymfpci_writel(chip, YDSXGR_SPDIFOUTVOL, 0x3fff3fff); in snd_ymfpci_memalloc()
2201 snd_ymfpci_writel(chip, YDSXGR_NATIVEADCINVOL, 0x3fff3fff); in snd_ymfpci_memalloc()
2202 snd_ymfpci_writel(chip, YDSXGR_NATIVEDACINVOL, 0x3fff3fff); in snd_ymfpci_memalloc()
2203 snd_ymfpci_writel(chip, YDSXGR_PRIADCLOOPVOL, 0x3fff3fff); in snd_ymfpci_memalloc()
2204 snd_ymfpci_writel(chip, YDSXGR_LEGACYOUTVOL, 0x3fff3fff); in snd_ymfpci_memalloc()
2209 static int snd_ymfpci_free(struct snd_ymfpci *chip) in snd_ymfpci_free() argument
2213 if (snd_BUG_ON(!chip)) in snd_ymfpci_free()
2216 if (chip->res_reg_area) { /* don't touch busy hardware */ in snd_ymfpci_free()
2217 snd_ymfpci_writel(chip, YDSXGR_NATIVEDACOUTVOL, 0); in snd_ymfpci_free()
2218 snd_ymfpci_writel(chip, YDSXGR_BUF441OUTVOL, 0); in snd_ymfpci_free()
2219 snd_ymfpci_writel(chip, YDSXGR_LEGACYOUTVOL, 0); in snd_ymfpci_free()
2220 snd_ymfpci_writel(chip, YDSXGR_STATUS, ~0); in snd_ymfpci_free()
2221 snd_ymfpci_disable_dsp(chip); in snd_ymfpci_free()
2222 snd_ymfpci_writel(chip, YDSXGR_PLAYCTRLBASE, 0); in snd_ymfpci_free()
2223 snd_ymfpci_writel(chip, YDSXGR_RECCTRLBASE, 0); in snd_ymfpci_free()
2224 snd_ymfpci_writel(chip, YDSXGR_EFFCTRLBASE, 0); in snd_ymfpci_free()
2225 snd_ymfpci_writel(chip, YDSXGR_WORKBASE, 0); in snd_ymfpci_free()
2226 snd_ymfpci_writel(chip, YDSXGR_WORKSIZE, 0); in snd_ymfpci_free()
2227 ctrl = snd_ymfpci_readw(chip, YDSXGR_GLOBALCTRL); in snd_ymfpci_free()
2228 snd_ymfpci_writew(chip, YDSXGR_GLOBALCTRL, ctrl & ~0x0007); in snd_ymfpci_free()
2231 snd_ymfpci_ac3_done(chip); in snd_ymfpci_free()
2238 pci_set_power_state(chip->pci, PCI_D3hot); in snd_ymfpci_free()
2242 kfree(chip->saved_regs); in snd_ymfpci_free()
2244 if (chip->irq >= 0) in snd_ymfpci_free()
2245 free_irq(chip->irq, chip); in snd_ymfpci_free()
2246 release_and_free_resource(chip->mpu_res); in snd_ymfpci_free()
2247 release_and_free_resource(chip->fm_res); in snd_ymfpci_free()
2248 snd_ymfpci_free_gameport(chip); in snd_ymfpci_free()
2249 iounmap(chip->reg_area_virt); in snd_ymfpci_free()
2250 if (chip->work_ptr.area) in snd_ymfpci_free()
2251 snd_dma_free_pages(&chip->work_ptr); in snd_ymfpci_free()
2253 release_and_free_resource(chip->res_reg_area); in snd_ymfpci_free()
2255 pci_write_config_word(chip->pci, 0x40, chip->old_legacy_ctrl); in snd_ymfpci_free()
2257 pci_disable_device(chip->pci); in snd_ymfpci_free()
2258 release_firmware(chip->dsp_microcode); in snd_ymfpci_free()
2259 release_firmware(chip->controller_microcode); in snd_ymfpci_free()
2260 kfree(chip); in snd_ymfpci_free()
2266 struct snd_ymfpci *chip = device->device_data; in snd_ymfpci_dev_free() local
2267 return snd_ymfpci_free(chip); in snd_ymfpci_dev_free()
2303 struct snd_ymfpci *chip = card->private_data; in snd_ymfpci_suspend() local
2307 snd_pcm_suspend_all(chip->pcm); in snd_ymfpci_suspend()
2308 snd_pcm_suspend_all(chip->pcm2); in snd_ymfpci_suspend()
2309 snd_pcm_suspend_all(chip->pcm_spdif); in snd_ymfpci_suspend()
2310 snd_pcm_suspend_all(chip->pcm_4ch); in snd_ymfpci_suspend()
2311 snd_ac97_suspend(chip->ac97); in snd_ymfpci_suspend()
2313 chip->saved_regs[i] = snd_ymfpci_readl(chip, saved_regs_index[i]); in snd_ymfpci_suspend()
2314 chip->saved_ydsxgr_mode = snd_ymfpci_readl(chip, YDSXGR_MODE); in snd_ymfpci_suspend()
2315 pci_read_config_word(chip->pci, PCIR_DSXG_LEGACY, in snd_ymfpci_suspend()
2316 &chip->saved_dsxg_legacy); in snd_ymfpci_suspend()
2317 pci_read_config_word(chip->pci, PCIR_DSXG_ELEGACY, in snd_ymfpci_suspend()
2318 &chip->saved_dsxg_elegacy); in snd_ymfpci_suspend()
2319 snd_ymfpci_writel(chip, YDSXGR_NATIVEDACOUTVOL, 0); in snd_ymfpci_suspend()
2320 snd_ymfpci_writel(chip, YDSXGR_BUF441OUTVOL, 0); in snd_ymfpci_suspend()
2321 snd_ymfpci_disable_dsp(chip); in snd_ymfpci_suspend()
2329 struct snd_ymfpci *chip = card->private_data; in snd_ymfpci_resume() local
2333 snd_ymfpci_codec_ready(chip, 0); in snd_ymfpci_resume()
2334 snd_ymfpci_download_image(chip); in snd_ymfpci_resume()
2338 snd_ymfpci_writel(chip, saved_regs_index[i], chip->saved_regs[i]); in snd_ymfpci_resume()
2340 snd_ac97_resume(chip->ac97); in snd_ymfpci_resume()
2342 pci_write_config_word(chip->pci, PCIR_DSXG_LEGACY, in snd_ymfpci_resume()
2343 chip->saved_dsxg_legacy); in snd_ymfpci_resume()
2344 pci_write_config_word(chip->pci, PCIR_DSXG_ELEGACY, in snd_ymfpci_resume()
2345 chip->saved_dsxg_elegacy); in snd_ymfpci_resume()
2348 if (chip->start_count > 0) { in snd_ymfpci_resume()
2349 spin_lock_irq(&chip->reg_lock); in snd_ymfpci_resume()
2350 snd_ymfpci_writel(chip, YDSXGR_MODE, chip->saved_ydsxgr_mode); in snd_ymfpci_resume()
2351 chip->active_bank = snd_ymfpci_readl(chip, YDSXGR_CTRLSELECT); in snd_ymfpci_resume()
2352 spin_unlock_irq(&chip->reg_lock); in snd_ymfpci_resume()
2366 struct snd_ymfpci *chip; in snd_ymfpci_create() local
2378 chip = kzalloc(sizeof(*chip), GFP_KERNEL); in snd_ymfpci_create()
2379 if (chip == NULL) { in snd_ymfpci_create()
2383 chip->old_legacy_ctrl = old_legacy_ctrl; in snd_ymfpci_create()
2384 spin_lock_init(&chip->reg_lock); in snd_ymfpci_create()
2385 spin_lock_init(&chip->voice_lock); in snd_ymfpci_create()
2386 init_waitqueue_head(&chip->interrupt_sleep); in snd_ymfpci_create()
2387 atomic_set(&chip->interrupt_sleep_count, 0); in snd_ymfpci_create()
2388 chip->card = card; in snd_ymfpci_create()
2389 chip->pci = pci; in snd_ymfpci_create()
2390 chip->irq = -1; in snd_ymfpci_create()
2391 chip->device_id = pci->device; in snd_ymfpci_create()
2392 chip->rev = pci->revision; in snd_ymfpci_create()
2393 chip->reg_area_phys = pci_resource_start(pci, 0); in snd_ymfpci_create()
2394 chip->reg_area_virt = ioremap_nocache(chip->reg_area_phys, 0x8000); in snd_ymfpci_create()
2396 chip->src441_used = -1; in snd_ymfpci_create()
2398 if ((chip->res_reg_area = request_mem_region(chip->reg_area_phys, 0x8000, "YMFPCI")) == NULL) { in snd_ymfpci_create()
2399 dev_err(chip->card->dev, in snd_ymfpci_create()
2401 chip->reg_area_phys, chip->reg_area_phys + 0x8000 - 1); in snd_ymfpci_create()
2406 KBUILD_MODNAME, chip)) { in snd_ymfpci_create()
2407 dev_err(chip->card->dev, "unable to grab IRQ %d\n", pci->irq); in snd_ymfpci_create()
2411 chip->irq = pci->irq; in snd_ymfpci_create()
2414 if (snd_ymfpci_codec_ready(chip, 0) < 0) { in snd_ymfpci_create()
2419 err = snd_ymfpci_request_firmware(chip); in snd_ymfpci_create()
2421 dev_err(chip->card->dev, "firmware request failed: %d\n", err); in snd_ymfpci_create()
2424 snd_ymfpci_download_image(chip); in snd_ymfpci_create()
2428 if (snd_ymfpci_memalloc(chip) < 0) { in snd_ymfpci_create()
2433 err = snd_ymfpci_ac3_init(chip); in snd_ymfpci_create()
2438 chip->saved_regs = kmalloc(YDSXGR_NUM_SAVED_REGS * sizeof(u32), in snd_ymfpci_create()
2440 if (chip->saved_regs == NULL) { in snd_ymfpci_create()
2446 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); in snd_ymfpci_create()
2450 snd_ymfpci_proc_init(card, chip); in snd_ymfpci_create()
2452 *rchip = chip; in snd_ymfpci_create()
2456 snd_ymfpci_free(chip); in snd_ymfpci_create()