Lines Matching +full:enable +full:- +full:modem +full:- +full:interrupt
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * ALSA driver for ATI IXP 150/200/250 AC97 modem controllers
10 #include <linux/interrupt.h>
27 static int index = -2; /* Exclude the first card */
39 static bool enable;
40 module_param(enable, bool, 0444);
46 #define ATI_REG_ISR 0x00 /* interrupt source */
63 #define ATI_REG_IER 0x04 /* interrupt enable */
75 #define ATI_REG_IER_MODEM_GPIO_DATA_EN (1U<<14) /* (WO) modem is running */
80 #define ATI_REG_CMD_MODEM_RECEIVE_EN (1U<<1) /* modem only */
81 #define ATI_REG_CMD_MODEM_SEND1_EN (1U<<2) /* modem only */
82 #define ATI_REG_CMD_MODEM_SEND2_EN (1U<<3) /* modem only */
83 #define ATI_REG_CMD_MODEM_SEND3_EN (1U<<4) /* modem only */
84 #define ATI_REG_CMD_MODEM_STATUS_MEM (1U<<5) /* modem only */
85 #define ATI_REG_CMD_MODEM_IN_DMA_EN (1U<<8) /* modem only */
86 #define ATI_REG_CMD_MODEM_OUT_DMA1_EN (1U<<9) /* modem only */
87 #define ATI_REG_CMD_MODEM_OUT_DMA2_EN (1U<<10) /* modem only */
88 #define ATI_REG_CMD_MODEM_OUT_DMA3_EN (1U<<11) /* modem only */
90 #define ATI_REG_CMD_MODEM_GPIO_THRU_DMA (1U<<22) /* modem only */
214 int ac97_pcm_type; /* index # of ac97_pcm to access, -1 = not used */
269 void __iomem *addr = chip->remap_addr + reg;
284 writel(value, chip->remap_addr + ATI_REG_##reg)
286 readl(chip->remap_addr + ATI_REG_##reg)
294 * in a future version, a scatter-gather buffer should be implemented.
319 return -ENOMEM;
321 if (dma->desc_buf.area == NULL) {
322 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &chip->pci->dev,
323 ATI_DESC_LIST_SIZE, &dma->desc_buf) < 0)
324 return -ENOMEM;
325 dma->period_bytes = dma->periods = 0; /* clear */
328 if (dma->periods == periods && dma->period_bytes == period_bytes)
332 scoped_guard(spinlock_irqsave, &chip->reg_lock) {
333 writel(0, chip->remap_addr + dma->ops->llp_offset);
334 dma->ops->enable_dma(chip, 0);
335 dma->ops->enable_dma(chip, 1);
339 addr = (u32)substream->runtime->dma_addr;
340 desc_addr = (u32)dma->desc_buf.addr;
343 desc = &((struct atiixp_dma_desc *)dma->desc_buf.area)[i];
344 desc->addr = cpu_to_le32(addr);
345 desc->status = 0;
346 desc->size = period_bytes >> 2; /* in dwords */
348 if (i == periods - 1)
349 desc->next = cpu_to_le32((u32)dma->desc_buf.addr);
351 desc->next = cpu_to_le32(desc_addr);
355 writel((u32)dma->desc_buf.addr | ATI_REG_LINKPTR_EN,
356 chip->remap_addr + dma->ops->llp_offset);
358 dma->period_bytes = period_bytes;
359 dma->periods = periods;
371 if (dma->desc_buf.area) {
372 writel(0, chip->remap_addr + dma->ops->llp_offset);
373 snd_dma_free_pages(&dma->desc_buf);
374 dma->desc_buf.area = NULL;
386 if (! timeout--) {
387 dev_warn(chip->card->dev, "codec acquire timeout\n");
388 return -EBUSY;
417 } while (--timeout);
420 dev_warn(chip->card->dev, "codec read timeout (reg %x)\n", reg);
443 struct atiixp_modem *chip = ac97->private_data;
444 return snd_atiixp_codec_read(chip, ac97->num, reg);
451 struct atiixp_modem *chip = ac97->private_data;
457 snd_atiixp_codec_write(chip, ac97->num, reg, val);
485 if (!--timeout) {
486 dev_err(chip->card->dev, "codec reset timeout\n");
500 // if (atiixp_read(chip, MODEM_MIRROR) & 0x1) /* modem running, too? */
501 // return -EBUSY;
509 * auto-detection of codecs
511 * the IXP chip can generate interrupts for the non-existing codecs.
512 * NEW_FRAME interrupt is used to make sure that the interrupt is generated
526 chip->codec_not_ready_bits = 0;
530 while (timeout-- > 0) {
532 if (chip->codec_not_ready_bits)
537 if ((chip->codec_not_ready_bits & ALL_CODEC_NOT_READY) == ALL_CODEC_NOT_READY) {
538 dev_err(chip->card->dev, "no codec detected!\n");
539 return -ENXIO;
546 * enable DMA and irqs
552 /* set up spdif, enable burst mode */
559 /* clear all interrupt source */
561 /* enable irqs */
575 /* clear interrupt source */
589 * position. when SG-buffer is implemented, the offset must be calculated
595 struct snd_pcm_runtime *runtime = substream->runtime;
596 struct atiixp_dma *dma = runtime->private_data;
600 while (timeout--) {
601 curptr = readl(chip->remap_addr + dma->ops->dt_cur);
602 if (curptr < dma->buf_addr)
604 curptr -= dma->buf_addr;
605 if (curptr >= dma->buf_bytes)
609 dev_dbg(chip->card->dev, "invalid DMA pointer read 0x%x (buf=%x)\n",
610 readl(chip->remap_addr + dma->ops->dt_cur), dma->buf_addr);
620 if (! dma->substream || ! dma->running)
622 dev_dbg(chip->card->dev, "XRUN detected (DMA %d)\n", dma->ops->type);
623 snd_pcm_stop_xrun(dma->substream);
632 if (! dma->substream || ! dma->running)
634 snd_pcm_period_elapsed(dma->substream);
637 /* set BUS_BUSY interrupt bit if any DMA is running */
656 struct atiixp_dma *dma = substream->runtime->private_data;
659 if (snd_BUG_ON(!dma->ops->enable_transfer ||
660 !dma->ops->flush_dma))
661 return -EINVAL;
663 guard(spinlock)(&chip->reg_lock);
666 dma->ops->enable_transfer(chip, 1);
667 dma->running = 1;
670 dma->ops->enable_transfer(chip, 0);
671 dma->running = 0;
674 err = -EINVAL;
680 dma->ops->flush_dma(chip);
691 * every callback is supposed to be called in chip->reg_lock spinlock
700 /* enable/disable analog OUT DMA */
722 /* enable/disable analog IN DMA */
754 guard(spinlock_irq)(&chip->reg_lock);
770 * hw_params - allocate the buffer and set up buffer descriptors
776 struct atiixp_dma *dma = substream->runtime->private_data;
780 dma->buf_addr = substream->runtime->dma_addr;
781 dma->buf_bytes = params_buffer_bytes(hw_params);
789 /* set up modem rate */
791 if (! chip->ac97[i])
793 snd_ac97_write(chip->ac97[i], AC97_LINE1_RATE, params_rate(hw_params));
794 snd_ac97_write(chip->ac97[i], AC97_LINE1_LEVEL, 0);
803 struct atiixp_dma *dma = substream->runtime->private_data;
837 struct snd_pcm_runtime *runtime = substream->runtime;
846 if (snd_BUG_ON(!dma->ops || !dma->ops->enable_dma))
847 return -EINVAL;
849 if (dma->opened)
850 return -EBUSY;
851 dma->substream = substream;
852 runtime->hw = snd_atiixp_pcm_hw;
853 dma->ac97_pcm_type = pcm_type;
861 runtime->private_data = dma;
863 /* enable DMA bits */
864 scoped_guard(spinlock_irq, &chip->reg_lock) {
865 dma->ops->enable_dma(chip, 1);
867 dma->opened = 1;
877 if (snd_BUG_ON(!dma->ops || !dma->ops->enable_dma))
878 return -EINVAL;
879 scoped_guard(spinlock_irq, &chip->reg_lock) {
880 dma->ops->enable_dma(chip, 0);
882 dma->substream = NULL;
883 dma->opened = 0;
893 guard(mutex)(&chip->open_mutex);
894 return snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK], 0);
901 guard(mutex)(&chip->open_mutex);
902 return snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]);
908 return snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_CAPTURE], 1);
914 return snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_CAPTURE]);
964 chip->dmas[ATI_DMA_PLAYBACK].ops = &snd_atiixp_playback_dma_ops;
965 chip->dmas[ATI_DMA_CAPTURE].ops = &snd_atiixp_capture_dma_ops;
968 err = snd_pcm_new(chip->card, "ATI IXP MC97", ATI_PCMDEV_ANALOG, 1, 1, &pcm);
973 pcm->dev_class = SNDRV_PCM_CLASS_MODEM;
974 pcm->private_data = chip;
975 strscpy(pcm->name, "ATI IXP MC97");
976 chip->pcmdevs[ATI_PCMDEV_ANALOG] = pcm;
979 &chip->pci->dev, 64*1024, 128*1024);
987 * interrupt handler
1001 snd_atiixp_xrun_dma(chip, &chip->dmas[ATI_DMA_PLAYBACK]);
1003 snd_atiixp_update_dma(chip, &chip->dmas[ATI_DMA_PLAYBACK]);
1005 snd_atiixp_xrun_dma(chip, &chip->dmas[ATI_DMA_CAPTURE]);
1007 snd_atiixp_update_dma(chip, &chip->dmas[ATI_DMA_CAPTURE]);
1013 guard(spinlock)(&chip->reg_lock);
1014 chip->codec_not_ready_bits |= detected;
1046 return -ENXIO;
1048 err = snd_ac97_bus(chip->card, 0, &ops, chip, &pbus);
1051 pbus->clock = clock;
1052 chip->ac97_bus = pbus;
1056 if (chip->codec_not_ready_bits & codec_skip[i])
1060 ac97.pci = chip->pci;
1063 err = snd_ac97_mixer(pbus, &ac97, &chip->ac97[i]);
1065 chip->ac97[i] = NULL; /* to be sure */
1066 dev_dbg(chip->card->dev,
1067 "codec %d not available for modem\n", i);
1074 dev_err(chip->card->dev, "no codec available\n");
1075 return -ENODEV;
1078 /* snd_ac97_tune_hardware(chip->ac97, ac97_quirks); */
1090 struct atiixp_modem *chip = card->private_data;
1095 snd_ac97_suspend(chip->ac97[i]);
1104 struct atiixp_modem *chip = card->private_data;
1111 snd_ac97_resume(chip->ac97[i]);
1126 struct atiixp_modem *chip = entry->private_data;
1130 snd_iprintf(buffer, "%02x: %08x\n", i, readl(chip->remap_addr + i));
1135 snd_card_ro_proc_new(chip->card, "atiixp-modem", chip,
1146 snd_atiixp_chip_stop(card->private_data);
1154 struct atiixp_modem *chip = card->private_data;
1161 spin_lock_init(&chip->reg_lock);
1162 mutex_init(&chip->open_mutex);
1163 chip->card = card;
1164 chip->pci = pci;
1165 chip->irq = -1;
1166 chip->remap_addr = pcim_iomap_region(pci, 0, "ATI IXP MC97");
1167 if (IS_ERR(chip->remap_addr))
1168 return PTR_ERR(chip->remap_addr);
1169 chip->addr = pci_resource_start(pci, 0);
1171 if (devm_request_irq(&pci->dev, pci->irq, snd_atiixp_interrupt,
1173 dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq);
1174 return -EBUSY;
1176 chip->irq = pci->irq;
1177 card->sync_irq = chip->irq;
1178 card->private_free = snd_atiixp_free;
1192 err = snd_devm_card_new(&pci->dev, index, id, THIS_MODULE,
1196 chip = card->private_data;
1198 strscpy(card->driver, "ATIIXP-MODEM");
1199 strscpy(card->shortname, "ATI IXP Modem");
1220 sprintf(card->longname, "%s rev %x at 0x%lx, irq %i",
1221 card->shortname, pci->revision, chip->addr, chip->irq);
1234 return snd_card_free_on_error(&pci->dev, __snd_atiixp_probe(pci, pci_id));