Lines Matching refs:chip
210 void (*enable_dma)(struct atiixp_modem *chip, int on);
212 void (*enable_transfer)(struct atiixp_modem *chip, int on);
214 void (*flush_dma)(struct atiixp_modem *chip);
281 static int snd_atiixp_update_bits(struct atiixp_modem *chip, unsigned int reg, in snd_atiixp_update_bits() argument
284 void __iomem *addr = chip->remap_addr + reg; in snd_atiixp_update_bits()
298 #define atiixp_write(chip,reg,value) \ argument
299 writel(value, chip->remap_addr + ATI_REG_##reg)
300 #define atiixp_read(chip,reg) \ argument
301 readl(chip->remap_addr + ATI_REG_##reg)
302 #define atiixp_update(chip,reg,mask,val) \ argument
303 snd_atiixp_update_bits(chip, ATI_REG_##reg, mask, val)
324 static int atiixp_build_dma_packets(struct atiixp_modem *chip, in atiixp_build_dma_packets() argument
338 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(chip->pci), in atiixp_build_dma_packets()
348 spin_lock_irqsave(&chip->reg_lock, flags); in atiixp_build_dma_packets()
349 writel(0, chip->remap_addr + dma->ops->llp_offset); in atiixp_build_dma_packets()
350 dma->ops->enable_dma(chip, 0); in atiixp_build_dma_packets()
351 dma->ops->enable_dma(chip, 1); in atiixp_build_dma_packets()
352 spin_unlock_irqrestore(&chip->reg_lock, flags); in atiixp_build_dma_packets()
372 chip->remap_addr + dma->ops->llp_offset); in atiixp_build_dma_packets()
383 static void atiixp_clear_dma_packets(struct atiixp_modem *chip, in atiixp_clear_dma_packets() argument
388 writel(0, chip->remap_addr + dma->ops->llp_offset); in atiixp_clear_dma_packets()
397 static int snd_atiixp_acquire_codec(struct atiixp_modem *chip) in snd_atiixp_acquire_codec() argument
401 while (atiixp_read(chip, PHYS_OUT_ADDR) & ATI_REG_PHYS_OUT_ADDR_EN) { in snd_atiixp_acquire_codec()
403 dev_warn(chip->card->dev, "codec acquire timeout\n"); in snd_atiixp_acquire_codec()
411 static unsigned short snd_atiixp_codec_read(struct atiixp_modem *chip, in snd_atiixp_codec_read() argument
418 if (snd_atiixp_acquire_codec(chip) < 0) in snd_atiixp_codec_read()
424 atiixp_write(chip, PHYS_OUT_ADDR, data); in snd_atiixp_codec_read()
425 if (snd_atiixp_acquire_codec(chip) < 0) in snd_atiixp_codec_read()
429 data = atiixp_read(chip, PHYS_IN_ADDR); in snd_atiixp_codec_read()
436 dev_warn(chip->card->dev, "codec read timeout (reg %x)\n", reg); in snd_atiixp_codec_read()
441 static void snd_atiixp_codec_write(struct atiixp_modem *chip, in snd_atiixp_codec_write() argument
447 if (snd_atiixp_acquire_codec(chip) < 0) in snd_atiixp_codec_write()
452 atiixp_write(chip, PHYS_OUT_ADDR, data); in snd_atiixp_codec_write()
459 struct atiixp_modem *chip = ac97->private_data; in snd_atiixp_ac97_read() local
460 return snd_atiixp_codec_read(chip, ac97->num, reg); in snd_atiixp_ac97_read()
467 struct atiixp_modem *chip = ac97->private_data; in snd_atiixp_ac97_write() local
469 atiixp_write(chip, MODEM_OUT_GPIO, in snd_atiixp_ac97_write()
473 snd_atiixp_codec_write(chip, ac97->num, reg, val); in snd_atiixp_ac97_write()
479 static int snd_atiixp_aclink_reset(struct atiixp_modem *chip) in snd_atiixp_aclink_reset() argument
484 if (atiixp_update(chip, CMD, ATI_REG_CMD_POWERDOWN, 0)) in snd_atiixp_aclink_reset()
488 atiixp_update(chip, CMD, ATI_REG_CMD_AC_SOFT_RESET, ATI_REG_CMD_AC_SOFT_RESET); in snd_atiixp_aclink_reset()
489 atiixp_read(chip, CMD); in snd_atiixp_aclink_reset()
491 atiixp_update(chip, CMD, ATI_REG_CMD_AC_SOFT_RESET, 0); in snd_atiixp_aclink_reset()
494 while (! (atiixp_read(chip, CMD) & ATI_REG_CMD_ACLINK_ACTIVE)) { in snd_atiixp_aclink_reset()
496 atiixp_update(chip, CMD, ATI_REG_CMD_AC_SYNC|ATI_REG_CMD_AC_RESET, in snd_atiixp_aclink_reset()
498 atiixp_read(chip, CMD); in snd_atiixp_aclink_reset()
500 atiixp_update(chip, CMD, ATI_REG_CMD_AC_RESET, ATI_REG_CMD_AC_RESET); in snd_atiixp_aclink_reset()
502 dev_err(chip->card->dev, "codec reset timeout\n"); in snd_atiixp_aclink_reset()
508 atiixp_update(chip, CMD, ATI_REG_CMD_AC_SYNC|ATI_REG_CMD_AC_RESET, in snd_atiixp_aclink_reset()
515 static int snd_atiixp_aclink_down(struct atiixp_modem *chip) in snd_atiixp_aclink_down() argument
519 atiixp_update(chip, CMD, in snd_atiixp_aclink_down()
540 static int snd_atiixp_codec_detect(struct atiixp_modem *chip) in snd_atiixp_codec_detect() argument
544 chip->codec_not_ready_bits = 0; in snd_atiixp_codec_detect()
545 atiixp_write(chip, IER, CODEC_CHECK_BITS); in snd_atiixp_codec_detect()
550 if (chip->codec_not_ready_bits) in snd_atiixp_codec_detect()
553 atiixp_write(chip, IER, 0); /* disable irqs */ in snd_atiixp_codec_detect()
555 if ((chip->codec_not_ready_bits & ALL_CODEC_NOT_READY) == ALL_CODEC_NOT_READY) { in snd_atiixp_codec_detect()
556 dev_err(chip->card->dev, "no codec detected!\n"); in snd_atiixp_codec_detect()
566 static int snd_atiixp_chip_start(struct atiixp_modem *chip) in snd_atiixp_chip_start() argument
571 reg = atiixp_read(chip, CMD); in snd_atiixp_chip_start()
575 atiixp_write(chip, CMD, reg); in snd_atiixp_chip_start()
578 atiixp_write(chip, ISR, 0xffffffff); in snd_atiixp_chip_start()
580 atiixp_write(chip, IER, in snd_atiixp_chip_start()
591 static int snd_atiixp_chip_stop(struct atiixp_modem *chip) in snd_atiixp_chip_stop() argument
594 atiixp_write(chip, ISR, atiixp_read(chip, ISR)); in snd_atiixp_chip_stop()
596 atiixp_write(chip, IER, 0); in snd_atiixp_chip_stop()
612 struct atiixp_modem *chip = snd_pcm_substream_chip(substream); in snd_atiixp_pcm_pointer() local
619 curptr = readl(chip->remap_addr + dma->ops->dt_cur); in snd_atiixp_pcm_pointer()
627 dev_dbg(chip->card->dev, "invalid DMA pointer read 0x%x (buf=%x)\n", in snd_atiixp_pcm_pointer()
628 readl(chip->remap_addr + dma->ops->dt_cur), dma->buf_addr); in snd_atiixp_pcm_pointer()
635 static void snd_atiixp_xrun_dma(struct atiixp_modem *chip, in snd_atiixp_xrun_dma() argument
640 dev_dbg(chip->card->dev, "XRUN detected (DMA %d)\n", dma->ops->type); in snd_atiixp_xrun_dma()
647 static void snd_atiixp_update_dma(struct atiixp_modem *chip, in snd_atiixp_update_dma() argument
657 static void snd_atiixp_check_bus_busy(struct atiixp_modem *chip) in snd_atiixp_check_bus_busy() argument
660 if (atiixp_read(chip, CMD) & (ATI_REG_CMD_MODEM_SEND1_EN | in snd_atiixp_check_bus_busy()
665 atiixp_update(chip, IER, ATI_REG_IER_MODEM_SET_BUS_BUSY, bus_busy); in snd_atiixp_check_bus_busy()
673 struct atiixp_modem *chip = snd_pcm_substream_chip(substream); in snd_atiixp_pcm_trigger() local
681 spin_lock(&chip->reg_lock); in snd_atiixp_pcm_trigger()
684 dma->ops->enable_transfer(chip, 1); in snd_atiixp_pcm_trigger()
688 dma->ops->enable_transfer(chip, 0); in snd_atiixp_pcm_trigger()
696 snd_atiixp_check_bus_busy(chip); in snd_atiixp_pcm_trigger()
698 dma->ops->flush_dma(chip); in snd_atiixp_pcm_trigger()
699 snd_atiixp_check_bus_busy(chip); in snd_atiixp_pcm_trigger()
702 spin_unlock(&chip->reg_lock); in snd_atiixp_pcm_trigger()
714 static void atiixp_out_flush_dma(struct atiixp_modem *chip) in atiixp_out_flush_dma() argument
716 atiixp_write(chip, MODEM_FIFO_FLUSH, ATI_REG_MODEM_FIFO_OUT1_FLUSH); in atiixp_out_flush_dma()
720 static void atiixp_out_enable_dma(struct atiixp_modem *chip, int on) in atiixp_out_enable_dma() argument
723 data = atiixp_read(chip, CMD); in atiixp_out_enable_dma()
727 atiixp_out_flush_dma(chip); in atiixp_out_enable_dma()
731 atiixp_write(chip, CMD, data); in atiixp_out_enable_dma()
735 static void atiixp_out_enable_transfer(struct atiixp_modem *chip, int on) in atiixp_out_enable_transfer() argument
737 atiixp_update(chip, CMD, ATI_REG_CMD_MODEM_SEND1_EN, in atiixp_out_enable_transfer()
742 static void atiixp_in_enable_dma(struct atiixp_modem *chip, int on) in atiixp_in_enable_dma() argument
744 atiixp_update(chip, CMD, ATI_REG_CMD_MODEM_IN_DMA_EN, in atiixp_in_enable_dma()
749 static void atiixp_in_enable_transfer(struct atiixp_modem *chip, int on) in atiixp_in_enable_transfer() argument
752 unsigned int data = atiixp_read(chip, CMD); in atiixp_in_enable_transfer()
755 atiixp_write(chip, CMD, data); in atiixp_in_enable_transfer()
758 atiixp_update(chip, CMD, ATI_REG_CMD_MODEM_RECEIVE_EN, 0); in atiixp_in_enable_transfer()
762 static void atiixp_in_flush_dma(struct atiixp_modem *chip) in atiixp_in_flush_dma() argument
764 atiixp_write(chip, MODEM_FIFO_FLUSH, ATI_REG_MODEM_FIFO_IN_FLUSH); in atiixp_in_flush_dma()
770 struct atiixp_modem *chip = snd_pcm_substream_chip(substream); in snd_atiixp_playback_prepare() local
773 spin_lock_irq(&chip->reg_lock); in snd_atiixp_playback_prepare()
775 data = atiixp_read(chip, MODEM_OUT_FIFO); in snd_atiixp_playback_prepare()
778 atiixp_write(chip, MODEM_OUT_FIFO, data); in snd_atiixp_playback_prepare()
779 spin_unlock_irq(&chip->reg_lock); in snd_atiixp_playback_prepare()
795 struct atiixp_modem *chip = snd_pcm_substream_chip(substream); in snd_atiixp_pcm_hw_params() local
806 err = atiixp_build_dma_packets(chip, dma, substream, in snd_atiixp_pcm_hw_params()
814 if (! chip->ac97[i]) in snd_atiixp_pcm_hw_params()
816 snd_ac97_write(chip->ac97[i], AC97_LINE1_RATE, params_rate(hw_params)); in snd_atiixp_pcm_hw_params()
817 snd_ac97_write(chip->ac97[i], AC97_LINE1_LEVEL, 0); in snd_atiixp_pcm_hw_params()
825 struct atiixp_modem *chip = snd_pcm_substream_chip(substream); in snd_atiixp_pcm_hw_free() local
828 atiixp_clear_dma_packets(chip, dma, substream); in snd_atiixp_pcm_hw_free()
860 struct atiixp_modem *chip = snd_pcm_substream_chip(substream); in snd_atiixp_pcm_open() local
888 spin_lock_irq(&chip->reg_lock); in snd_atiixp_pcm_open()
889 dma->ops->enable_dma(chip, 1); in snd_atiixp_pcm_open()
890 spin_unlock_irq(&chip->reg_lock); in snd_atiixp_pcm_open()
899 struct atiixp_modem *chip = snd_pcm_substream_chip(substream); in snd_atiixp_pcm_close() local
903 spin_lock_irq(&chip->reg_lock); in snd_atiixp_pcm_close()
904 dma->ops->enable_dma(chip, 0); in snd_atiixp_pcm_close()
905 spin_unlock_irq(&chip->reg_lock); in snd_atiixp_pcm_close()
915 struct atiixp_modem *chip = snd_pcm_substream_chip(substream); in snd_atiixp_playback_open() local
918 mutex_lock(&chip->open_mutex); in snd_atiixp_playback_open()
919 err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK], 0); in snd_atiixp_playback_open()
920 mutex_unlock(&chip->open_mutex); in snd_atiixp_playback_open()
928 struct atiixp_modem *chip = snd_pcm_substream_chip(substream); in snd_atiixp_playback_close() local
930 mutex_lock(&chip->open_mutex); in snd_atiixp_playback_close()
931 err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]); in snd_atiixp_playback_close()
932 mutex_unlock(&chip->open_mutex); in snd_atiixp_playback_close()
938 struct atiixp_modem *chip = snd_pcm_substream_chip(substream); in snd_atiixp_capture_open() local
939 return snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_CAPTURE], 1); in snd_atiixp_capture_open()
944 struct atiixp_modem *chip = snd_pcm_substream_chip(substream); in snd_atiixp_capture_close() local
945 return snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_CAPTURE]); in snd_atiixp_capture_close()
991 static int snd_atiixp_pcm_new(struct atiixp_modem *chip) in snd_atiixp_pcm_new() argument
997 chip->dmas[ATI_DMA_PLAYBACK].ops = &snd_atiixp_playback_dma_ops; in snd_atiixp_pcm_new()
998 chip->dmas[ATI_DMA_CAPTURE].ops = &snd_atiixp_capture_dma_ops; in snd_atiixp_pcm_new()
1001 err = snd_pcm_new(chip->card, "ATI IXP MC97", ATI_PCMDEV_ANALOG, 1, 1, &pcm); in snd_atiixp_pcm_new()
1007 pcm->private_data = chip; in snd_atiixp_pcm_new()
1009 chip->pcmdevs[ATI_PCMDEV_ANALOG] = pcm; in snd_atiixp_pcm_new()
1012 snd_dma_pci_data(chip->pci), in snd_atiixp_pcm_new()
1025 struct atiixp_modem *chip = dev_id; in snd_atiixp_interrupt() local
1028 status = atiixp_read(chip, ISR); in snd_atiixp_interrupt()
1035 snd_atiixp_xrun_dma(chip, &chip->dmas[ATI_DMA_PLAYBACK]); in snd_atiixp_interrupt()
1037 snd_atiixp_update_dma(chip, &chip->dmas[ATI_DMA_PLAYBACK]); in snd_atiixp_interrupt()
1039 snd_atiixp_xrun_dma(chip, &chip->dmas[ATI_DMA_CAPTURE]); in snd_atiixp_interrupt()
1041 snd_atiixp_update_dma(chip, &chip->dmas[ATI_DMA_CAPTURE]); in snd_atiixp_interrupt()
1047 spin_lock(&chip->reg_lock); in snd_atiixp_interrupt()
1048 chip->codec_not_ready_bits |= detected; in snd_atiixp_interrupt()
1049 atiixp_update(chip, IER, detected, 0); /* disable the detected irqs */ in snd_atiixp_interrupt()
1050 spin_unlock(&chip->reg_lock); in snd_atiixp_interrupt()
1054 atiixp_write(chip, ISR, status); in snd_atiixp_interrupt()
1064 static int snd_atiixp_mixer_new(struct atiixp_modem *chip, int clock) in snd_atiixp_mixer_new() argument
1080 if (snd_atiixp_codec_detect(chip) < 0) in snd_atiixp_mixer_new()
1083 if ((err = snd_ac97_bus(chip->card, 0, &ops, chip, &pbus)) < 0) in snd_atiixp_mixer_new()
1086 chip->ac97_bus = pbus; in snd_atiixp_mixer_new()
1090 if (chip->codec_not_ready_bits & codec_skip[i]) in snd_atiixp_mixer_new()
1093 ac97.private_data = chip; in snd_atiixp_mixer_new()
1094 ac97.pci = chip->pci; in snd_atiixp_mixer_new()
1097 if ((err = snd_ac97_mixer(pbus, &ac97, &chip->ac97[i])) < 0) { in snd_atiixp_mixer_new()
1098 chip->ac97[i] = NULL; /* to be sure */ in snd_atiixp_mixer_new()
1099 dev_dbg(chip->card->dev, in snd_atiixp_mixer_new()
1107 dev_err(chip->card->dev, "no codec available\n"); in snd_atiixp_mixer_new()
1124 struct atiixp_modem *chip = card->private_data; in snd_atiixp_suspend() local
1129 snd_pcm_suspend_all(chip->pcmdevs[i]); in snd_atiixp_suspend()
1131 snd_ac97_suspend(chip->ac97[i]); in snd_atiixp_suspend()
1132 snd_atiixp_aclink_down(chip); in snd_atiixp_suspend()
1133 snd_atiixp_chip_stop(chip); in snd_atiixp_suspend()
1140 struct atiixp_modem *chip = card->private_data; in snd_atiixp_resume() local
1143 snd_atiixp_aclink_reset(chip); in snd_atiixp_resume()
1144 snd_atiixp_chip_start(chip); in snd_atiixp_resume()
1147 snd_ac97_resume(chip->ac97[i]); in snd_atiixp_resume()
1167 struct atiixp_modem *chip = entry->private_data; in snd_atiixp_proc_read() local
1171 snd_iprintf(buffer, "%02x: %08x\n", i, readl(chip->remap_addr + i)); in snd_atiixp_proc_read()
1174 static void snd_atiixp_proc_init(struct atiixp_modem *chip) in snd_atiixp_proc_init() argument
1178 if (! snd_card_proc_new(chip->card, "atiixp-modem", &entry)) in snd_atiixp_proc_init()
1179 snd_info_set_text_ops(entry, chip, snd_atiixp_proc_read); in snd_atiixp_proc_init()
1182 #define snd_atiixp_proc_init(chip) argument
1190 static int snd_atiixp_free(struct atiixp_modem *chip) in snd_atiixp_free() argument
1192 if (chip->irq < 0) in snd_atiixp_free()
1194 snd_atiixp_chip_stop(chip); in snd_atiixp_free()
1197 if (chip->irq >= 0) in snd_atiixp_free()
1198 free_irq(chip->irq, chip); in snd_atiixp_free()
1199 iounmap(chip->remap_addr); in snd_atiixp_free()
1200 pci_release_regions(chip->pci); in snd_atiixp_free()
1201 pci_disable_device(chip->pci); in snd_atiixp_free()
1202 kfree(chip); in snd_atiixp_free()
1208 struct atiixp_modem *chip = device->device_data; in snd_atiixp_dev_free() local
1209 return snd_atiixp_free(chip); in snd_atiixp_dev_free()
1222 struct atiixp_modem *chip; in snd_atiixp_create() local
1228 chip = kzalloc(sizeof(*chip), GFP_KERNEL); in snd_atiixp_create()
1229 if (chip == NULL) { in snd_atiixp_create()
1234 spin_lock_init(&chip->reg_lock); in snd_atiixp_create()
1235 mutex_init(&chip->open_mutex); in snd_atiixp_create()
1236 chip->card = card; in snd_atiixp_create()
1237 chip->pci = pci; in snd_atiixp_create()
1238 chip->irq = -1; in snd_atiixp_create()
1240 kfree(chip); in snd_atiixp_create()
1244 chip->addr = pci_resource_start(pci, 0); in snd_atiixp_create()
1245 chip->remap_addr = pci_ioremap_bar(pci, 0); in snd_atiixp_create()
1246 if (chip->remap_addr == NULL) { in snd_atiixp_create()
1248 snd_atiixp_free(chip); in snd_atiixp_create()
1253 KBUILD_MODNAME, chip)) { in snd_atiixp_create()
1255 snd_atiixp_free(chip); in snd_atiixp_create()
1258 chip->irq = pci->irq; in snd_atiixp_create()
1260 synchronize_irq(chip->irq); in snd_atiixp_create()
1262 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) { in snd_atiixp_create()
1263 snd_atiixp_free(chip); in snd_atiixp_create()
1267 *r_chip = chip; in snd_atiixp_create()
1276 struct atiixp_modem *chip; in snd_atiixp_probe() local
1285 if ((err = snd_atiixp_create(card, pci, &chip)) < 0) in snd_atiixp_probe()
1287 card->private_data = chip; in snd_atiixp_probe()
1289 if ((err = snd_atiixp_aclink_reset(chip)) < 0) in snd_atiixp_probe()
1292 if ((err = snd_atiixp_mixer_new(chip, ac97_clock)) < 0) in snd_atiixp_probe()
1295 if ((err = snd_atiixp_pcm_new(chip)) < 0) in snd_atiixp_probe()
1298 snd_atiixp_proc_init(chip); in snd_atiixp_probe()
1300 snd_atiixp_chip_start(chip); in snd_atiixp_probe()
1303 card->shortname, pci->revision, chip->addr, chip->irq); in snd_atiixp_probe()