Lines Matching +full:on +full:- +full:chip
1 // SPDX-License-Identifier: GPL-2.0-or-later
28 static int index = SNDRV_DEFAULT_IDX1; /* Index 0-MAX */
33 static int ac97_codec = -1;
46 MODULE_PARM_DESC(spdif_aclink, "S/PDIF over AC-link.");
144 #define ATI_REG_OUT_DMA_SLOT_BIT(x) (1U << ((x) - 3))
170 #define ATI_REG_6CH_REORDER_EN (1U<<0) /* 3,4,7,8,6,9 -> 3,4,6,9,7,8 */
220 void (*enable_dma)(struct atiixp *chip, int on);
222 void (*enable_transfer)(struct atiixp *chip, int on);
224 void (*flush_dma)(struct atiixp *chip);
240 int ac97_pcm_type; /* index # of ac97_pcm to access, -1 = not used */
245 * ATI IXP chip
286 SND_PCI_QUIRK(0x105b, 0x0c81, "Foxconn RC4107MA-RS2", 0),
299 static int snd_atiixp_update_bits(struct atiixp *chip, unsigned int reg, in snd_atiixp_update_bits() argument
302 void __iomem *addr = chip->remap_addr + reg; in snd_atiixp_update_bits()
316 #define atiixp_write(chip,reg,value) \ argument
317 writel(value, chip->remap_addr + ATI_REG_##reg)
318 #define atiixp_read(chip,reg) \ argument
319 readl(chip->remap_addr + ATI_REG_##reg)
320 #define atiixp_update(chip,reg,mask,val) \ argument
321 snd_atiixp_update_bits(chip, ATI_REG_##reg, mask, val)
327 * in a future version, a scatter-gather buffer should be implemented.
342 static int atiixp_build_dma_packets(struct atiixp *chip, struct atiixp_dma *dma, in atiixp_build_dma_packets() argument
352 return -ENOMEM; in atiixp_build_dma_packets()
354 if (dma->desc_buf.area == NULL) { in atiixp_build_dma_packets()
356 &chip->pci->dev, in atiixp_build_dma_packets()
358 &dma->desc_buf) < 0) in atiixp_build_dma_packets()
359 return -ENOMEM; in atiixp_build_dma_packets()
360 dma->period_bytes = dma->periods = 0; /* clear */ in atiixp_build_dma_packets()
363 if (dma->periods == periods && dma->period_bytes == period_bytes) in atiixp_build_dma_packets()
367 spin_lock_irqsave(&chip->reg_lock, flags); in atiixp_build_dma_packets()
368 writel(0, chip->remap_addr + dma->ops->llp_offset); in atiixp_build_dma_packets()
369 dma->ops->enable_dma(chip, 0); in atiixp_build_dma_packets()
370 dma->ops->enable_dma(chip, 1); in atiixp_build_dma_packets()
371 spin_unlock_irqrestore(&chip->reg_lock, flags); in atiixp_build_dma_packets()
374 addr = (u32)substream->runtime->dma_addr; in atiixp_build_dma_packets()
375 desc_addr = (u32)dma->desc_buf.addr; in atiixp_build_dma_packets()
378 desc = &((struct atiixp_dma_desc *)dma->desc_buf.area)[i]; in atiixp_build_dma_packets()
379 desc->addr = cpu_to_le32(addr); in atiixp_build_dma_packets()
380 desc->status = 0; in atiixp_build_dma_packets()
381 desc->size = period_bytes >> 2; /* in dwords */ in atiixp_build_dma_packets()
383 if (i == periods - 1) in atiixp_build_dma_packets()
384 desc->next = cpu_to_le32((u32)dma->desc_buf.addr); in atiixp_build_dma_packets()
386 desc->next = cpu_to_le32(desc_addr); in atiixp_build_dma_packets()
390 writel((u32)dma->desc_buf.addr | ATI_REG_LINKPTR_EN, in atiixp_build_dma_packets()
391 chip->remap_addr + dma->ops->llp_offset); in atiixp_build_dma_packets()
393 dma->period_bytes = period_bytes; in atiixp_build_dma_packets()
394 dma->periods = periods; in atiixp_build_dma_packets()
402 static void atiixp_clear_dma_packets(struct atiixp *chip, struct atiixp_dma *dma, in atiixp_clear_dma_packets() argument
405 if (dma->desc_buf.area) { in atiixp_clear_dma_packets()
406 writel(0, chip->remap_addr + dma->ops->llp_offset); in atiixp_clear_dma_packets()
407 snd_dma_free_pages(&dma->desc_buf); in atiixp_clear_dma_packets()
408 dma->desc_buf.area = NULL; in atiixp_clear_dma_packets()
415 static int snd_atiixp_acquire_codec(struct atiixp *chip) in snd_atiixp_acquire_codec() argument
419 while (atiixp_read(chip, PHYS_OUT_ADDR) & ATI_REG_PHYS_OUT_ADDR_EN) { in snd_atiixp_acquire_codec()
420 if (! timeout--) { in snd_atiixp_acquire_codec()
421 dev_warn(chip->card->dev, "codec acquire timeout\n"); in snd_atiixp_acquire_codec()
422 return -EBUSY; in snd_atiixp_acquire_codec()
429 static unsigned short snd_atiixp_codec_read(struct atiixp *chip, unsigned short codec, unsigned sho… in snd_atiixp_codec_read() argument
434 if (snd_atiixp_acquire_codec(chip) < 0) in snd_atiixp_codec_read()
440 atiixp_write(chip, PHYS_OUT_ADDR, data); in snd_atiixp_codec_read()
441 if (snd_atiixp_acquire_codec(chip) < 0) in snd_atiixp_codec_read()
445 data = atiixp_read(chip, PHYS_IN_ADDR); in snd_atiixp_codec_read()
449 } while (--timeout); in snd_atiixp_codec_read()
452 dev_warn(chip->card->dev, "codec read timeout (reg %x)\n", reg); in snd_atiixp_codec_read()
457 static void snd_atiixp_codec_write(struct atiixp *chip, unsigned short codec, in snd_atiixp_codec_write() argument
462 if (snd_atiixp_acquire_codec(chip) < 0) in snd_atiixp_codec_write()
467 atiixp_write(chip, PHYS_OUT_ADDR, data); in snd_atiixp_codec_write()
474 struct atiixp *chip = ac97->private_data; in snd_atiixp_ac97_read() local
475 return snd_atiixp_codec_read(chip, ac97->num, reg); in snd_atiixp_ac97_read()
482 struct atiixp *chip = ac97->private_data; in snd_atiixp_ac97_write() local
483 snd_atiixp_codec_write(chip, ac97->num, reg, val); in snd_atiixp_ac97_write()
489 static int snd_atiixp_aclink_reset(struct atiixp *chip) in snd_atiixp_aclink_reset() argument
494 if (atiixp_update(chip, CMD, ATI_REG_CMD_POWERDOWN, 0)) in snd_atiixp_aclink_reset()
498 atiixp_update(chip, CMD, ATI_REG_CMD_AC_SOFT_RESET, ATI_REG_CMD_AC_SOFT_RESET); in snd_atiixp_aclink_reset()
499 atiixp_read(chip, CMD); in snd_atiixp_aclink_reset()
501 atiixp_update(chip, CMD, ATI_REG_CMD_AC_SOFT_RESET, 0); in snd_atiixp_aclink_reset()
504 while (! (atiixp_read(chip, CMD) & ATI_REG_CMD_ACLINK_ACTIVE)) { in snd_atiixp_aclink_reset()
506 atiixp_update(chip, CMD, ATI_REG_CMD_AC_SYNC|ATI_REG_CMD_AC_RESET, in snd_atiixp_aclink_reset()
508 atiixp_read(chip, CMD); in snd_atiixp_aclink_reset()
510 atiixp_update(chip, CMD, ATI_REG_CMD_AC_RESET, ATI_REG_CMD_AC_RESET); in snd_atiixp_aclink_reset()
511 if (!--timeout) { in snd_atiixp_aclink_reset()
512 dev_err(chip->card->dev, "codec reset timeout\n"); in snd_atiixp_aclink_reset()
518 atiixp_update(chip, CMD, ATI_REG_CMD_AC_SYNC|ATI_REG_CMD_AC_RESET, in snd_atiixp_aclink_reset()
525 static int snd_atiixp_aclink_down(struct atiixp *chip) in snd_atiixp_aclink_down() argument
527 // if (atiixp_read(chip, MODEM_MIRROR) & 0x1) /* modem running, too? */ in snd_atiixp_aclink_down()
528 // return -EBUSY; in snd_atiixp_aclink_down()
529 atiixp_update(chip, CMD, in snd_atiixp_aclink_down()
537 * auto-detection of codecs
539 * the IXP chip can generate interrupts for the non-existing codecs.
556 dev_dbg(&pci->dev, "atiixp quirk for %s. Forcing codec %d\n", in ac97_probing_bugs()
557 snd_pci_quirk_name(q), q->value); in ac97_probing_bugs()
558 return q->value; in ac97_probing_bugs()
561 return -1; in ac97_probing_bugs()
564 static int snd_atiixp_codec_detect(struct atiixp *chip) in snd_atiixp_codec_detect() argument
568 chip->codec_not_ready_bits = 0; in snd_atiixp_codec_detect()
569 if (ac97_codec == -1) in snd_atiixp_codec_detect()
570 ac97_codec = ac97_probing_bugs(chip->pci); in snd_atiixp_codec_detect()
572 chip->codec_not_ready_bits |= in snd_atiixp_codec_detect()
577 atiixp_write(chip, IER, CODEC_CHECK_BITS); in snd_atiixp_codec_detect()
580 while (timeout-- > 0) { in snd_atiixp_codec_detect()
582 if (chip->codec_not_ready_bits) in snd_atiixp_codec_detect()
585 atiixp_write(chip, IER, 0); /* disable irqs */ in snd_atiixp_codec_detect()
587 if ((chip->codec_not_ready_bits & ALL_CODEC_NOT_READY) == ALL_CODEC_NOT_READY) { in snd_atiixp_codec_detect()
588 dev_err(chip->card->dev, "no codec detected!\n"); in snd_atiixp_codec_detect()
589 return -ENXIO; in snd_atiixp_codec_detect()
598 static int snd_atiixp_chip_start(struct atiixp *chip) in snd_atiixp_chip_start() argument
603 reg = atiixp_read(chip, CMD); in snd_atiixp_chip_start()
606 atiixp_write(chip, CMD, reg); in snd_atiixp_chip_start()
608 reg = atiixp_read(chip, SPDF_CMD); in snd_atiixp_chip_start()
610 atiixp_write(chip, SPDF_CMD, reg); in snd_atiixp_chip_start()
613 atiixp_write(chip, ISR, 0xffffffff); in snd_atiixp_chip_start()
615 atiixp_write(chip, IER, in snd_atiixp_chip_start()
628 static int snd_atiixp_chip_stop(struct atiixp *chip) in snd_atiixp_chip_stop() argument
631 atiixp_write(chip, ISR, atiixp_read(chip, ISR)); in snd_atiixp_chip_stop()
633 atiixp_write(chip, IER, 0); in snd_atiixp_chip_stop()
644 * position. when SG-buffer is implemented, the offset must be calculated
649 struct atiixp *chip = snd_pcm_substream_chip(substream); in snd_atiixp_pcm_pointer() local
650 struct snd_pcm_runtime *runtime = substream->runtime; in snd_atiixp_pcm_pointer()
651 struct atiixp_dma *dma = runtime->private_data; in snd_atiixp_pcm_pointer()
655 while (timeout--) { in snd_atiixp_pcm_pointer()
656 curptr = readl(chip->remap_addr + dma->ops->dt_cur); in snd_atiixp_pcm_pointer()
657 if (curptr < dma->buf_addr) in snd_atiixp_pcm_pointer()
659 curptr -= dma->buf_addr; in snd_atiixp_pcm_pointer()
660 if (curptr >= dma->buf_bytes) in snd_atiixp_pcm_pointer()
664 dev_dbg(chip->card->dev, "invalid DMA pointer read 0x%x (buf=%x)\n", in snd_atiixp_pcm_pointer()
665 readl(chip->remap_addr + dma->ops->dt_cur), dma->buf_addr); in snd_atiixp_pcm_pointer()
672 static void snd_atiixp_xrun_dma(struct atiixp *chip, struct atiixp_dma *dma) in snd_atiixp_xrun_dma() argument
674 if (! dma->substream || ! dma->running) in snd_atiixp_xrun_dma()
676 dev_dbg(chip->card->dev, "XRUN detected (DMA %d)\n", dma->ops->type); in snd_atiixp_xrun_dma()
677 snd_pcm_stop_xrun(dma->substream); in snd_atiixp_xrun_dma()
683 static void snd_atiixp_update_dma(struct atiixp *chip, struct atiixp_dma *dma) in snd_atiixp_update_dma() argument
685 if (! dma->substream || ! dma->running) in snd_atiixp_update_dma()
687 snd_pcm_period_elapsed(dma->substream); in snd_atiixp_update_dma()
692 static void snd_atiixp_check_bus_busy(struct atiixp *chip) in snd_atiixp_check_bus_busy() argument
695 if (atiixp_read(chip, CMD) & (ATI_REG_CMD_SEND_EN | in snd_atiixp_check_bus_busy()
701 atiixp_update(chip, IER, ATI_REG_IER_SET_BUS_BUSY, bus_busy); in snd_atiixp_check_bus_busy()
709 struct atiixp *chip = snd_pcm_substream_chip(substream); in snd_atiixp_pcm_trigger() local
710 struct atiixp_dma *dma = substream->runtime->private_data; in snd_atiixp_pcm_trigger()
713 if (snd_BUG_ON(!dma->ops->enable_transfer || in snd_atiixp_pcm_trigger()
714 !dma->ops->flush_dma)) in snd_atiixp_pcm_trigger()
715 return -EINVAL; in snd_atiixp_pcm_trigger()
717 spin_lock(&chip->reg_lock); in snd_atiixp_pcm_trigger()
722 if (dma->running && dma->suspended && in snd_atiixp_pcm_trigger()
724 writel(dma->saved_curptr, chip->remap_addr + in snd_atiixp_pcm_trigger()
725 dma->ops->dt_cur); in snd_atiixp_pcm_trigger()
726 dma->ops->enable_transfer(chip, 1); in snd_atiixp_pcm_trigger()
727 dma->running = 1; in snd_atiixp_pcm_trigger()
728 dma->suspended = 0; in snd_atiixp_pcm_trigger()
733 dma->suspended = cmd == SNDRV_PCM_TRIGGER_SUSPEND; in snd_atiixp_pcm_trigger()
734 if (dma->running && dma->suspended) in snd_atiixp_pcm_trigger()
735 dma->saved_curptr = readl(chip->remap_addr + in snd_atiixp_pcm_trigger()
736 dma->ops->dt_cur); in snd_atiixp_pcm_trigger()
737 dma->ops->enable_transfer(chip, 0); in snd_atiixp_pcm_trigger()
738 dma->running = 0; in snd_atiixp_pcm_trigger()
741 err = -EINVAL; in snd_atiixp_pcm_trigger()
745 snd_atiixp_check_bus_busy(chip); in snd_atiixp_pcm_trigger()
747 dma->ops->flush_dma(chip); in snd_atiixp_pcm_trigger()
748 snd_atiixp_check_bus_busy(chip); in snd_atiixp_pcm_trigger()
751 spin_unlock(&chip->reg_lock); in snd_atiixp_pcm_trigger()
759 * every callback is supposed to be called in chip->reg_lock spinlock
763 static void atiixp_out_flush_dma(struct atiixp *chip) in atiixp_out_flush_dma() argument
765 atiixp_write(chip, FIFO_FLUSH, ATI_REG_FIFO_OUT_FLUSH); in atiixp_out_flush_dma()
769 static void atiixp_out_enable_dma(struct atiixp *chip, int on) in atiixp_out_enable_dma() argument
772 data = atiixp_read(chip, CMD); in atiixp_out_enable_dma()
773 if (on) { in atiixp_out_enable_dma()
776 atiixp_out_flush_dma(chip); in atiixp_out_enable_dma()
780 atiixp_write(chip, CMD, data); in atiixp_out_enable_dma()
784 static void atiixp_out_enable_transfer(struct atiixp *chip, int on) in atiixp_out_enable_transfer() argument
786 atiixp_update(chip, CMD, ATI_REG_CMD_SEND_EN, in atiixp_out_enable_transfer()
787 on ? ATI_REG_CMD_SEND_EN : 0); in atiixp_out_enable_transfer()
791 static void atiixp_in_enable_dma(struct atiixp *chip, int on) in atiixp_in_enable_dma() argument
793 atiixp_update(chip, CMD, ATI_REG_CMD_IN_DMA_EN, in atiixp_in_enable_dma()
794 on ? ATI_REG_CMD_IN_DMA_EN : 0); in atiixp_in_enable_dma()
798 static void atiixp_in_enable_transfer(struct atiixp *chip, int on) in atiixp_in_enable_transfer() argument
800 if (on) { in atiixp_in_enable_transfer()
801 unsigned int data = atiixp_read(chip, CMD); in atiixp_in_enable_transfer()
806 while ((atiixp_read(chip, COUNTER) & in atiixp_in_enable_transfer()
810 atiixp_write(chip, CMD, data); in atiixp_in_enable_transfer()
813 atiixp_update(chip, CMD, ATI_REG_CMD_RECEIVE_EN, 0); in atiixp_in_enable_transfer()
817 static void atiixp_in_flush_dma(struct atiixp *chip) in atiixp_in_flush_dma() argument
819 atiixp_write(chip, FIFO_FLUSH, ATI_REG_FIFO_IN_FLUSH); in atiixp_in_flush_dma()
823 static void atiixp_spdif_enable_dma(struct atiixp *chip, int on) in atiixp_spdif_enable_dma() argument
825 atiixp_update(chip, CMD, ATI_REG_CMD_SPDF_DMA_EN, in atiixp_spdif_enable_dma()
826 on ? ATI_REG_CMD_SPDF_DMA_EN : 0); in atiixp_spdif_enable_dma()
830 static void atiixp_spdif_enable_transfer(struct atiixp *chip, int on) in atiixp_spdif_enable_transfer() argument
833 data = atiixp_read(chip, CMD); in atiixp_spdif_enable_transfer()
834 if (on) in atiixp_spdif_enable_transfer()
838 atiixp_write(chip, CMD, data); in atiixp_spdif_enable_transfer()
842 static void atiixp_spdif_flush_dma(struct atiixp *chip) in atiixp_spdif_flush_dma() argument
846 /* DMA off, transfer on */ in atiixp_spdif_flush_dma()
847 atiixp_spdif_enable_dma(chip, 0); in atiixp_spdif_flush_dma()
848 atiixp_spdif_enable_transfer(chip, 1); in atiixp_spdif_flush_dma()
852 if (! (atiixp_read(chip, SPDF_DMA_DT_SIZE) & ATI_REG_DMA_FIFO_USED)) in atiixp_spdif_flush_dma()
855 } while (timeout-- > 0); in atiixp_spdif_flush_dma()
857 atiixp_spdif_enable_transfer(chip, 0); in atiixp_spdif_flush_dma()
863 struct atiixp *chip = snd_pcm_substream_chip(substream); in snd_atiixp_spdif_prepare() local
865 spin_lock_irq(&chip->reg_lock); in snd_atiixp_spdif_prepare()
866 if (chip->spdif_over_aclink) { in snd_atiixp_spdif_prepare()
869 atiixp_update(chip, CMD, ATI_REG_CMD_SPDF_CONFIG_MASK, in snd_atiixp_spdif_prepare()
871 data = atiixp_read(chip, OUT_DMA_SLOT) & ~ATI_REG_OUT_DMA_SLOT_MASK; in snd_atiixp_spdif_prepare()
875 atiixp_write(chip, OUT_DMA_SLOT, data); in snd_atiixp_spdif_prepare()
876 atiixp_update(chip, CMD, ATI_REG_CMD_INTERLEAVE_OUT, in snd_atiixp_spdif_prepare()
877 substream->runtime->format == SNDRV_PCM_FORMAT_S16_LE ? in snd_atiixp_spdif_prepare()
880 atiixp_update(chip, CMD, ATI_REG_CMD_SPDF_CONFIG_MASK, 0); in snd_atiixp_spdif_prepare()
881 atiixp_update(chip, CMD, ATI_REG_CMD_INTERLEAVE_SPDF, 0); in snd_atiixp_spdif_prepare()
883 spin_unlock_irq(&chip->reg_lock); in snd_atiixp_spdif_prepare()
890 struct atiixp *chip = snd_pcm_substream_chip(substream); in snd_atiixp_playback_prepare() local
893 spin_lock_irq(&chip->reg_lock); in snd_atiixp_playback_prepare()
894 data = atiixp_read(chip, OUT_DMA_SLOT) & ~ATI_REG_OUT_DMA_SLOT_MASK; in snd_atiixp_playback_prepare()
895 switch (substream->runtime->channels) { in snd_atiixp_playback_prepare()
916 atiixp_write(chip, OUT_DMA_SLOT, data); in snd_atiixp_playback_prepare()
918 atiixp_update(chip, CMD, ATI_REG_CMD_INTERLEAVE_OUT, in snd_atiixp_playback_prepare()
919 substream->runtime->format == SNDRV_PCM_FORMAT_S16_LE ? in snd_atiixp_playback_prepare()
923 * enable 6 channel re-ordering bit if needed in snd_atiixp_playback_prepare()
925 atiixp_update(chip, 6CH_REORDER, ATI_REG_6CH_REORDER_EN, in snd_atiixp_playback_prepare()
926 substream->runtime->channels >= 6 ? ATI_REG_6CH_REORDER_EN: 0); in snd_atiixp_playback_prepare()
928 spin_unlock_irq(&chip->reg_lock); in snd_atiixp_playback_prepare()
935 struct atiixp *chip = snd_pcm_substream_chip(substream); in snd_atiixp_capture_prepare() local
937 spin_lock_irq(&chip->reg_lock); in snd_atiixp_capture_prepare()
938 atiixp_update(chip, CMD, ATI_REG_CMD_INTERLEAVE_IN, in snd_atiixp_capture_prepare()
939 substream->runtime->format == SNDRV_PCM_FORMAT_S16_LE ? in snd_atiixp_capture_prepare()
941 spin_unlock_irq(&chip->reg_lock); in snd_atiixp_capture_prepare()
946 * hw_params - allocate the buffer and set up buffer descriptors
951 struct atiixp *chip = snd_pcm_substream_chip(substream); in snd_atiixp_pcm_hw_params() local
952 struct atiixp_dma *dma = substream->runtime->private_data; in snd_atiixp_pcm_hw_params()
955 dma->buf_addr = substream->runtime->dma_addr; in snd_atiixp_pcm_hw_params()
956 dma->buf_bytes = params_buffer_bytes(hw_params); in snd_atiixp_pcm_hw_params()
958 err = atiixp_build_dma_packets(chip, dma, substream, in snd_atiixp_pcm_hw_params()
964 if (dma->ac97_pcm_type >= 0) { in snd_atiixp_pcm_hw_params()
965 struct ac97_pcm *pcm = chip->pcms[dma->ac97_pcm_type]; in snd_atiixp_pcm_hw_params()
969 if (dma->pcm_open_flag) { in snd_atiixp_pcm_hw_params()
971 dma->pcm_open_flag = 0; in snd_atiixp_pcm_hw_params()
975 pcm->r[0].slots); in snd_atiixp_pcm_hw_params()
977 dma->pcm_open_flag = 1; in snd_atiixp_pcm_hw_params()
985 struct atiixp *chip = snd_pcm_substream_chip(substream); in snd_atiixp_pcm_hw_free() local
986 struct atiixp_dma *dma = substream->runtime->private_data; in snd_atiixp_pcm_hw_free()
988 if (dma->pcm_open_flag) { in snd_atiixp_pcm_hw_free()
989 struct ac97_pcm *pcm = chip->pcms[dma->ac97_pcm_type]; in snd_atiixp_pcm_hw_free()
991 dma->pcm_open_flag = 0; in snd_atiixp_pcm_hw_free()
993 atiixp_clear_dma_packets(chip, dma, substream); in snd_atiixp_pcm_hw_free()
1024 struct atiixp *chip = snd_pcm_substream_chip(substream); in snd_atiixp_pcm_open() local
1025 struct snd_pcm_runtime *runtime = substream->runtime; in snd_atiixp_pcm_open()
1028 if (snd_BUG_ON(!dma->ops || !dma->ops->enable_dma)) in snd_atiixp_pcm_open()
1029 return -EINVAL; in snd_atiixp_pcm_open()
1031 if (dma->opened) in snd_atiixp_pcm_open()
1032 return -EBUSY; in snd_atiixp_pcm_open()
1033 dma->substream = substream; in snd_atiixp_pcm_open()
1034 runtime->hw = snd_atiixp_pcm_hw; in snd_atiixp_pcm_open()
1035 dma->ac97_pcm_type = pcm_type; in snd_atiixp_pcm_open()
1037 runtime->hw.rates = chip->pcms[pcm_type]->rates; in snd_atiixp_pcm_open()
1041 runtime->hw.formats = SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE; in snd_atiixp_pcm_open()
1045 runtime->private_data = dma; in snd_atiixp_pcm_open()
1048 spin_lock_irq(&chip->reg_lock); in snd_atiixp_pcm_open()
1049 dma->ops->enable_dma(chip, 1); in snd_atiixp_pcm_open()
1050 spin_unlock_irq(&chip->reg_lock); in snd_atiixp_pcm_open()
1051 dma->opened = 1; in snd_atiixp_pcm_open()
1059 struct atiixp *chip = snd_pcm_substream_chip(substream); in snd_atiixp_pcm_close() local
1061 if (snd_BUG_ON(!dma->ops || !dma->ops->enable_dma)) in snd_atiixp_pcm_close()
1062 return -EINVAL; in snd_atiixp_pcm_close()
1063 spin_lock_irq(&chip->reg_lock); in snd_atiixp_pcm_close()
1064 dma->ops->enable_dma(chip, 0); in snd_atiixp_pcm_close()
1065 spin_unlock_irq(&chip->reg_lock); in snd_atiixp_pcm_close()
1066 dma->substream = NULL; in snd_atiixp_pcm_close()
1067 dma->opened = 0; in snd_atiixp_pcm_close()
1075 struct atiixp *chip = snd_pcm_substream_chip(substream); in snd_atiixp_playback_open() local
1078 mutex_lock(&chip->open_mutex); in snd_atiixp_playback_open()
1079 err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK], 0); in snd_atiixp_playback_open()
1080 mutex_unlock(&chip->open_mutex); in snd_atiixp_playback_open()
1083 substream->runtime->hw.channels_max = chip->max_channels; in snd_atiixp_playback_open()
1084 if (chip->max_channels > 2) in snd_atiixp_playback_open()
1086 snd_pcm_hw_constraint_step(substream->runtime, 0, in snd_atiixp_playback_open()
1093 struct atiixp *chip = snd_pcm_substream_chip(substream); in snd_atiixp_playback_close() local
1095 mutex_lock(&chip->open_mutex); in snd_atiixp_playback_close()
1096 err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]); in snd_atiixp_playback_close()
1097 mutex_unlock(&chip->open_mutex); in snd_atiixp_playback_close()
1103 struct atiixp *chip = snd_pcm_substream_chip(substream); in snd_atiixp_capture_open() local
1104 return snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_CAPTURE], 1); in snd_atiixp_capture_open()
1109 struct atiixp *chip = snd_pcm_substream_chip(substream); in snd_atiixp_capture_close() local
1110 return snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_CAPTURE]); in snd_atiixp_capture_close()
1115 struct atiixp *chip = snd_pcm_substream_chip(substream); in snd_atiixp_spdif_open() local
1117 mutex_lock(&chip->open_mutex); in snd_atiixp_spdif_open()
1118 if (chip->spdif_over_aclink) /* share DMA_PLAYBACK */ in snd_atiixp_spdif_open()
1119 err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK], 2); in snd_atiixp_spdif_open()
1121 err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_SPDIF], -1); in snd_atiixp_spdif_open()
1122 mutex_unlock(&chip->open_mutex); in snd_atiixp_spdif_open()
1128 struct atiixp *chip = snd_pcm_substream_chip(substream); in snd_atiixp_spdif_close() local
1130 mutex_lock(&chip->open_mutex); in snd_atiixp_spdif_close()
1131 if (chip->spdif_over_aclink) in snd_atiixp_spdif_close()
1132 err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]); in snd_atiixp_spdif_close()
1134 err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_SPDIF]); in snd_atiixp_spdif_close()
1135 mutex_unlock(&chip->open_mutex); in snd_atiixp_spdif_close()
1236 static int snd_atiixp_pcm_new(struct atiixp *chip) in snd_atiixp_pcm_new() argument
1240 struct snd_ac97_bus *pbus = chip->ac97_bus; in snd_atiixp_pcm_new()
1244 chip->dmas[ATI_DMA_PLAYBACK].ops = &snd_atiixp_playback_dma_ops; in snd_atiixp_pcm_new()
1245 chip->dmas[ATI_DMA_CAPTURE].ops = &snd_atiixp_capture_dma_ops; in snd_atiixp_pcm_new()
1246 if (! chip->spdif_over_aclink) in snd_atiixp_pcm_new()
1247 chip->dmas[ATI_DMA_SPDIF].ops = &snd_atiixp_spdif_dma_ops; in snd_atiixp_pcm_new()
1250 if (chip->spdif_over_aclink) in snd_atiixp_pcm_new()
1258 chip->pcms[i] = &pbus->pcms[i]; in snd_atiixp_pcm_new()
1260 chip->max_channels = 2; in snd_atiixp_pcm_new()
1261 if (pbus->pcms[ATI_PCM_OUT].r[0].slots & (1 << AC97_SLOT_PCM_SLEFT)) { in snd_atiixp_pcm_new()
1262 if (pbus->pcms[ATI_PCM_OUT].r[0].slots & (1 << AC97_SLOT_LFE)) in snd_atiixp_pcm_new()
1263 chip->max_channels = 6; in snd_atiixp_pcm_new()
1265 chip->max_channels = 4; in snd_atiixp_pcm_new()
1269 err = snd_pcm_new(chip->card, "ATI IXP AC97", in snd_atiixp_pcm_new()
1275 pcm->private_data = chip; in snd_atiixp_pcm_new()
1276 strcpy(pcm->name, "ATI IXP AC97"); in snd_atiixp_pcm_new()
1277 chip->pcmdevs[ATI_PCMDEV_ANALOG] = pcm; in snd_atiixp_pcm_new()
1280 &chip->pci->dev, 64*1024, 128*1024); in snd_atiixp_pcm_new()
1283 snd_pcm_alt_chmaps, chip->max_channels, 0, in snd_atiixp_pcm_new()
1287 chmap->channel_mask = SND_PCM_CHMAP_MASK_2468; in snd_atiixp_pcm_new()
1288 chip->ac97[0]->chmaps[SNDRV_PCM_STREAM_PLAYBACK] = chmap; in snd_atiixp_pcm_new()
1290 /* no SPDIF support on codec? */ in snd_atiixp_pcm_new()
1291 if (chip->pcms[ATI_PCM_SPDIF] && ! chip->pcms[ATI_PCM_SPDIF]->rates) in snd_atiixp_pcm_new()
1294 /* FIXME: non-48k sample rate doesn't work on my test machine with AD1888 */ in snd_atiixp_pcm_new()
1295 if (chip->pcms[ATI_PCM_SPDIF]) in snd_atiixp_pcm_new()
1296 chip->pcms[ATI_PCM_SPDIF]->rates = SNDRV_PCM_RATE_48000; in snd_atiixp_pcm_new()
1299 err = snd_pcm_new(chip->card, "ATI IXP IEC958", in snd_atiixp_pcm_new()
1304 pcm->private_data = chip; in snd_atiixp_pcm_new()
1305 if (chip->spdif_over_aclink) in snd_atiixp_pcm_new()
1306 strcpy(pcm->name, "ATI IXP IEC958 (AC97)"); in snd_atiixp_pcm_new()
1308 strcpy(pcm->name, "ATI IXP IEC958 (Direct)"); in snd_atiixp_pcm_new()
1309 chip->pcmdevs[ATI_PCMDEV_DIGITAL] = pcm; in snd_atiixp_pcm_new()
1312 &chip->pci->dev, 64*1024, 128*1024); in snd_atiixp_pcm_new()
1314 /* pre-select AC97 SPDIF slots 10/11 */ in snd_atiixp_pcm_new()
1316 if (chip->ac97[i]) in snd_atiixp_pcm_new()
1317 snd_ac97_update_bits(chip->ac97[i], in snd_atiixp_pcm_new()
1332 struct atiixp *chip = dev_id; in snd_atiixp_interrupt() local
1335 status = atiixp_read(chip, ISR); in snd_atiixp_interrupt()
1342 snd_atiixp_xrun_dma(chip, &chip->dmas[ATI_DMA_PLAYBACK]); in snd_atiixp_interrupt()
1344 snd_atiixp_update_dma(chip, &chip->dmas[ATI_DMA_PLAYBACK]); in snd_atiixp_interrupt()
1346 snd_atiixp_xrun_dma(chip, &chip->dmas[ATI_DMA_CAPTURE]); in snd_atiixp_interrupt()
1348 snd_atiixp_update_dma(chip, &chip->dmas[ATI_DMA_CAPTURE]); in snd_atiixp_interrupt()
1349 if (! chip->spdif_over_aclink) { in snd_atiixp_interrupt()
1351 snd_atiixp_xrun_dma(chip, &chip->dmas[ATI_DMA_SPDIF]); in snd_atiixp_interrupt()
1353 snd_atiixp_update_dma(chip, &chip->dmas[ATI_DMA_SPDIF]); in snd_atiixp_interrupt()
1360 spin_lock(&chip->reg_lock); in snd_atiixp_interrupt()
1361 chip->codec_not_ready_bits |= detected; in snd_atiixp_interrupt()
1362 atiixp_update(chip, IER, detected, 0); /* disable the detected irqs */ in snd_atiixp_interrupt()
1363 spin_unlock(&chip->reg_lock); in snd_atiixp_interrupt()
1367 atiixp_write(chip, ISR, status); in snd_atiixp_interrupt()
1399 static int snd_atiixp_mixer_new(struct atiixp *chip, int clock, in snd_atiixp_mixer_new() argument
1416 if (snd_atiixp_codec_detect(chip) < 0) in snd_atiixp_mixer_new()
1417 return -ENXIO; in snd_atiixp_mixer_new()
1419 if ((err = snd_ac97_bus(chip->card, 0, &ops, chip, &pbus)) < 0) in snd_atiixp_mixer_new()
1421 pbus->clock = clock; in snd_atiixp_mixer_new()
1422 chip->ac97_bus = pbus; in snd_atiixp_mixer_new()
1426 if (chip->codec_not_ready_bits & codec_skip[i]) in snd_atiixp_mixer_new()
1429 ac97.private_data = chip; in snd_atiixp_mixer_new()
1430 ac97.pci = chip->pci; in snd_atiixp_mixer_new()
1433 if (! chip->spdif_over_aclink) in snd_atiixp_mixer_new()
1435 if ((err = snd_ac97_mixer(pbus, &ac97, &chip->ac97[i])) < 0) { in snd_atiixp_mixer_new()
1436 chip->ac97[i] = NULL; /* to be sure */ in snd_atiixp_mixer_new()
1437 dev_dbg(chip->card->dev, in snd_atiixp_mixer_new()
1445 dev_err(chip->card->dev, "no codec available\n"); in snd_atiixp_mixer_new()
1446 return -ENODEV; in snd_atiixp_mixer_new()
1449 snd_ac97_tune_hardware(chip->ac97[0], ac97_quirks, quirk_override); in snd_atiixp_mixer_new()
1462 struct atiixp *chip = card->private_data; in snd_atiixp_suspend() local
1467 snd_ac97_suspend(chip->ac97[i]); in snd_atiixp_suspend()
1468 snd_atiixp_aclink_down(chip); in snd_atiixp_suspend()
1469 snd_atiixp_chip_stop(chip); in snd_atiixp_suspend()
1476 struct atiixp *chip = card->private_data; in snd_atiixp_resume() local
1479 snd_atiixp_aclink_reset(chip); in snd_atiixp_resume()
1480 snd_atiixp_chip_start(chip); in snd_atiixp_resume()
1483 snd_ac97_resume(chip->ac97[i]); in snd_atiixp_resume()
1486 if (chip->pcmdevs[i]) { in snd_atiixp_resume()
1487 struct atiixp_dma *dma = &chip->dmas[i]; in snd_atiixp_resume()
1488 if (dma->substream && dma->suspended) { in snd_atiixp_resume()
1489 dma->ops->enable_dma(chip, 1); in snd_atiixp_resume()
1490 dma->substream->ops->prepare(dma->substream); in snd_atiixp_resume()
1491 writel((u32)dma->desc_buf.addr | ATI_REG_LINKPTR_EN, in snd_atiixp_resume()
1492 chip->remap_addr + dma->ops->llp_offset); in snd_atiixp_resume()
1514 struct atiixp *chip = entry->private_data; in snd_atiixp_proc_read() local
1518 snd_iprintf(buffer, "%02x: %08x\n", i, readl(chip->remap_addr + i)); in snd_atiixp_proc_read()
1521 static void snd_atiixp_proc_init(struct atiixp *chip) in snd_atiixp_proc_init() argument
1523 snd_card_ro_proc_new(chip->card, "atiixp", chip, snd_atiixp_proc_read); in snd_atiixp_proc_init()
1531 static int snd_atiixp_free(struct atiixp *chip) in snd_atiixp_free() argument
1533 if (chip->irq < 0) in snd_atiixp_free()
1535 snd_atiixp_chip_stop(chip); in snd_atiixp_free()
1538 if (chip->irq >= 0) in snd_atiixp_free()
1539 free_irq(chip->irq, chip); in snd_atiixp_free()
1540 iounmap(chip->remap_addr); in snd_atiixp_free()
1541 pci_release_regions(chip->pci); in snd_atiixp_free()
1542 pci_disable_device(chip->pci); in snd_atiixp_free()
1543 kfree(chip); in snd_atiixp_free()
1549 struct atiixp *chip = device->device_data; in snd_atiixp_dev_free() local
1550 return snd_atiixp_free(chip); in snd_atiixp_dev_free()
1554 * constructor for chip instance
1563 struct atiixp *chip; in snd_atiixp_create() local
1569 chip = kzalloc(sizeof(*chip), GFP_KERNEL); in snd_atiixp_create()
1570 if (chip == NULL) { in snd_atiixp_create()
1572 return -ENOMEM; in snd_atiixp_create()
1575 spin_lock_init(&chip->reg_lock); in snd_atiixp_create()
1576 mutex_init(&chip->open_mutex); in snd_atiixp_create()
1577 chip->card = card; in snd_atiixp_create()
1578 chip->pci = pci; in snd_atiixp_create()
1579 chip->irq = -1; in snd_atiixp_create()
1582 kfree(chip); in snd_atiixp_create()
1585 chip->addr = pci_resource_start(pci, 0); in snd_atiixp_create()
1586 chip->remap_addr = pci_ioremap_bar(pci, 0); in snd_atiixp_create()
1587 if (chip->remap_addr == NULL) { in snd_atiixp_create()
1588 dev_err(card->dev, "AC'97 space ioremap problem\n"); in snd_atiixp_create()
1589 snd_atiixp_free(chip); in snd_atiixp_create()
1590 return -EIO; in snd_atiixp_create()
1593 if (request_irq(pci->irq, snd_atiixp_interrupt, IRQF_SHARED, in snd_atiixp_create()
1594 KBUILD_MODNAME, chip)) { in snd_atiixp_create()
1595 dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); in snd_atiixp_create()
1596 snd_atiixp_free(chip); in snd_atiixp_create()
1597 return -EBUSY; in snd_atiixp_create()
1599 chip->irq = pci->irq; in snd_atiixp_create()
1600 card->sync_irq = chip->irq; in snd_atiixp_create()
1603 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) { in snd_atiixp_create()
1604 snd_atiixp_free(chip); in snd_atiixp_create()
1608 *r_chip = chip; in snd_atiixp_create()
1617 struct atiixp *chip; in snd_atiixp_probe() local
1620 err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card); in snd_atiixp_probe()
1624 strcpy(card->driver, spdif_aclink ? "ATIIXP" : "ATIIXP-SPDMA"); in snd_atiixp_probe()
1625 strcpy(card->shortname, "ATI IXP"); in snd_atiixp_probe()
1626 if ((err = snd_atiixp_create(card, pci, &chip)) < 0) in snd_atiixp_probe()
1628 card->private_data = chip; in snd_atiixp_probe()
1630 if ((err = snd_atiixp_aclink_reset(chip)) < 0) in snd_atiixp_probe()
1633 chip->spdif_over_aclink = spdif_aclink; in snd_atiixp_probe()
1635 if ((err = snd_atiixp_mixer_new(chip, ac97_clock, ac97_quirk)) < 0) in snd_atiixp_probe()
1638 if ((err = snd_atiixp_pcm_new(chip)) < 0) in snd_atiixp_probe()
1641 snd_atiixp_proc_init(chip); in snd_atiixp_probe()
1643 snd_atiixp_chip_start(chip); in snd_atiixp_probe()
1645 snprintf(card->longname, sizeof(card->longname), in snd_atiixp_probe()
1646 "%s rev %x with %s at %#lx, irq %i", card->shortname, in snd_atiixp_probe()
1647 pci->revision, in snd_atiixp_probe()
1648 chip->ac97[0] ? snd_ac97_get_short_name(chip->ac97[0]) : "?", in snd_atiixp_probe()
1649 chip->addr, chip->irq); in snd_atiixp_probe()