Lines Matching refs:aaci

40 static void aaci_ac97_select_codec(struct aaci *aaci, struct snd_ac97 *ac97)  in aaci_ac97_select_codec()  argument
42 u32 v, maincr = aaci->maincr | MAINCR_SCRA(ac97->num); in aaci_ac97_select_codec()
47 v = readl(aaci->base + AACI_SLFR); in aaci_ac97_select_codec()
49 readl(aaci->base + AACI_SL2RX); in aaci_ac97_select_codec()
51 readl(aaci->base + AACI_SL1RX); in aaci_ac97_select_codec()
53 if (maincr != readl(aaci->base + AACI_MAINCR)) { in aaci_ac97_select_codec()
54 writel(maincr, aaci->base + AACI_MAINCR); in aaci_ac97_select_codec()
55 readl(aaci->base + AACI_MAINCR); in aaci_ac97_select_codec()
72 struct aaci *aaci = ac97->private_data; in aaci_ac97_write() local
79 mutex_lock(&aaci->ac97_sem); in aaci_ac97_write()
81 aaci_ac97_select_codec(aaci, ac97); in aaci_ac97_write()
87 writel(val << 4, aaci->base + AACI_SL2TX); in aaci_ac97_write()
88 writel(reg << 12, aaci->base + AACI_SL1TX); in aaci_ac97_write()
97 v = readl(aaci->base + AACI_SLFR); in aaci_ac97_write()
101 dev_err(&aaci->dev->dev, in aaci_ac97_write()
104 mutex_unlock(&aaci->ac97_sem); in aaci_ac97_write()
112 struct aaci *aaci = ac97->private_data; in aaci_ac97_read() local
119 mutex_lock(&aaci->ac97_sem); in aaci_ac97_read()
121 aaci_ac97_select_codec(aaci, ac97); in aaci_ac97_read()
126 writel((reg << 12) | (1 << 19), aaci->base + AACI_SL1TX); in aaci_ac97_read()
135 v = readl(aaci->base + AACI_SLFR); in aaci_ac97_read()
139 dev_err(&aaci->dev->dev, "timeout on slot 1 TX busy\n"); in aaci_ac97_read()
152 v = readl(aaci->base + AACI_SLFR) & (SLFR_1RXV|SLFR_2RXV); in aaci_ac97_read()
156 dev_err(&aaci->dev->dev, "timeout on RX valid\n"); in aaci_ac97_read()
162 v = readl(aaci->base + AACI_SL1RX) >> 12; in aaci_ac97_read()
164 v = readl(aaci->base + AACI_SL2RX) >> 4; in aaci_ac97_read()
167 dev_warn(&aaci->dev->dev, in aaci_ac97_read()
171 dev_warn(&aaci->dev->dev, in aaci_ac97_read()
178 mutex_unlock(&aaci->ac97_sem); in aaci_ac97_read()
199 static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask) in aaci_fifo_irq() argument
202 dev_warn(&aaci->dev->dev, "RX overrun on chan %d\n", channel); in aaci_fifo_irq()
203 writel(ICLR_RXOEC1 << channel, aaci->base + AACI_INTCLR); in aaci_fifo_irq()
207 dev_warn(&aaci->dev->dev, "RX timeout on chan %d\n", channel); in aaci_fifo_irq()
208 writel(ICLR_RXTOFEC1 << channel, aaci->base + AACI_INTCLR); in aaci_fifo_irq()
212 struct aaci_runtime *aacirun = &aaci->capture; in aaci_fifo_irq()
217 dev_warn(&aaci->dev->dev, "RX interrupt???\n"); in aaci_fifo_irq()
267 dev_dbg(&aaci->dev->dev, "TX underrun on chan %d\n", channel); in aaci_fifo_irq()
268 writel(ICLR_TXUEC1 << channel, aaci->base + AACI_INTCLR); in aaci_fifo_irq()
272 struct aaci_runtime *aacirun = &aaci->playback; in aaci_fifo_irq()
277 dev_warn(&aaci->dev->dev, "TX interrupt???\n"); in aaci_fifo_irq()
329 struct aaci *aaci = devid; in aaci_irq() local
333 mask = readl(aaci->base + AACI_ALLINTS); in aaci_irq()
338 aaci_fifo_irq(aaci, i, m); in aaci_irq()
387 struct aaci *aaci = rule->private; in aaci_rule_channels() local
391 slots = aaci->ac97_bus->pcms[0].r[0].slots; in aaci_rule_channels()
405 struct aaci *aaci = substream->private_data; in aaci_pcm_open() local
410 aacirun = &aaci->playback; in aaci_pcm_open()
412 aacirun = &aaci->capture; in aaci_pcm_open()
427 aaci_rule_channels, aaci, in aaci_pcm_open()
441 runtime->hw.fifo_size = aaci->fifo_depth * 2; in aaci_pcm_open()
443 mutex_lock(&aaci->irq_lock); in aaci_pcm_open()
444 if (!aaci->users++) { in aaci_pcm_open()
445 ret = request_irq(aaci->dev->irq[0], aaci_irq, in aaci_pcm_open()
446 IRQF_SHARED, DRIVER_NAME, aaci); in aaci_pcm_open()
448 aaci->users--; in aaci_pcm_open()
450 mutex_unlock(&aaci->irq_lock); in aaci_pcm_open()
461 struct aaci *aaci = substream->private_data; in aaci_pcm_close() local
468 mutex_lock(&aaci->irq_lock); in aaci_pcm_close()
469 if (!--aaci->users) in aaci_pcm_close()
470 free_irq(aaci->dev->irq[0], aaci); in aaci_pcm_close()
471 mutex_unlock(&aaci->irq_lock); in aaci_pcm_close()
526 struct aaci *aaci = substream->private_data; in aaci_pcm_hw_params() local
540 aacirun->fifo_bytes = aaci->fifo_depth * 4 / 2; in aaci_pcm_hw_params()
726 struct aaci *aaci = substream->private_data; in aaci_pcm_capture_prepare() local
731 aaci_ac97_write(aaci->ac97, AC97_EXTENDED_STATUS, 0x0001); /* VRA */ in aaci_pcm_capture_prepare()
732 aaci_ac97_write(aaci->ac97, AC97_PCM_LR_ADC_RATE, runtime->rate); in aaci_pcm_capture_prepare()
733 aaci_ac97_write(aaci->ac97, AC97_PCM_MIC_ADC_RATE, runtime->rate); in aaci_pcm_capture_prepare()
736 aaci_ac97_write(aaci->ac97, AC97_REC_SEL, 0x0404); in aaci_pcm_capture_prepare()
758 struct aaci *aaci = card->private_data; in aaci_do_suspend() local
760 snd_pcm_suspend_all(aaci->pcm); in aaci_do_suspend()
835 static int aaci_probe_ac97(struct aaci *aaci) in aaci_probe_ac97() argument
845 writel(0, aaci->base + AACI_RESET); in aaci_probe_ac97()
847 writel(RESET_NRST, aaci->base + AACI_RESET); in aaci_probe_ac97()
855 ret = snd_ac97_bus(aaci->card, 0, &aaci_bus_ops, aaci, &ac97_bus); in aaci_probe_ac97()
860 aaci->ac97_bus = ac97_bus; in aaci_probe_ac97()
863 ac97_template.private_data = aaci; in aaci_probe_ac97()
870 aaci->ac97 = ac97; in aaci_probe_ac97()
882 aaci->playback.pcm = &ac97_bus->pcms[0]; in aaci_probe_ac97()
883 aaci->capture.pcm = &ac97_bus->pcms[1]; in aaci_probe_ac97()
891 struct aaci *aaci = card->private_data; in aaci_free_card() local
893 iounmap(aaci->base); in aaci_free_card()
896 static struct aaci *aaci_init_card(struct amba_device *dev) in aaci_init_card()
898 struct aaci *aaci; in aaci_init_card() local
903 THIS_MODULE, sizeof(struct aaci), &card); in aaci_init_card()
916 aaci = card->private_data; in aaci_init_card()
917 mutex_init(&aaci->ac97_sem); in aaci_init_card()
918 mutex_init(&aaci->irq_lock); in aaci_init_card()
919 aaci->card = card; in aaci_init_card()
920 aaci->dev = dev; in aaci_init_card()
923 aaci->maincr = MAINCR_IE | MAINCR_SL1RXEN | MAINCR_SL1TXEN | in aaci_init_card()
926 return aaci; in aaci_init_card()
929 static int aaci_init_pcm(struct aaci *aaci) in aaci_init_pcm() argument
934 ret = snd_pcm_new(aaci->card, "AACI AC'97", 0, 1, 1, &pcm); in aaci_init_pcm()
936 aaci->pcm = pcm; in aaci_init_pcm()
937 pcm->private_data = aaci; in aaci_init_pcm()
951 static unsigned int aaci_size_fifo(struct aaci *aaci) in aaci_size_fifo() argument
953 struct aaci_runtime *aacirun = &aaci->playback; in aaci_size_fifo()
972 writel(aaci->maincr & ~MAINCR_IE, aaci->base + AACI_MAINCR); in aaci_size_fifo()
973 readl(aaci->base + AACI_MAINCR); in aaci_size_fifo()
975 writel(aaci->maincr, aaci->base + AACI_MAINCR); in aaci_size_fifo()
990 struct aaci *aaci; in aaci_probe() local
997 aaci = aaci_init_card(dev); in aaci_probe()
998 if (!aaci) { in aaci_probe()
1003 aaci->base = ioremap(dev->res.start, resource_size(&dev->res)); in aaci_probe()
1004 if (!aaci->base) { in aaci_probe()
1012 spin_lock_init(&aaci->playback.lock); in aaci_probe()
1013 aaci->playback.base = aaci->base + AACI_CSCH1; in aaci_probe()
1014 aaci->playback.fifo = aaci->base + AACI_DR1; in aaci_probe()
1019 spin_lock_init(&aaci->capture.lock); in aaci_probe()
1020 aaci->capture.base = aaci->base + AACI_CSCH1; in aaci_probe()
1021 aaci->capture.fifo = aaci->base + AACI_DR1; in aaci_probe()
1024 void __iomem *base = aaci->base + i * 0x14; in aaci_probe()
1031 writel(0x1fff, aaci->base + AACI_INTCLR); in aaci_probe()
1032 writel(aaci->maincr, aaci->base + AACI_MAINCR); in aaci_probe()
1037 readl(aaci->base + AACI_CSCH1); in aaci_probe()
1038 ret = aaci_probe_ac97(aaci); in aaci_probe()
1046 aaci->fifo_depth = aaci_size_fifo(aaci); in aaci_probe()
1047 if (aaci->fifo_depth & 15) { in aaci_probe()
1049 aaci->fifo_depth); in aaci_probe()
1054 ret = aaci_init_pcm(aaci); in aaci_probe()
1058 ret = snd_card_register(aaci->card); in aaci_probe()
1060 dev_info(&dev->dev, "%s\n", aaci->card->longname); in aaci_probe()
1061 dev_info(&dev->dev, "FIFO %u entries\n", aaci->fifo_depth); in aaci_probe()
1062 amba_set_drvdata(dev, aaci->card); in aaci_probe()
1067 if (aaci) in aaci_probe()
1068 snd_card_free(aaci->card); in aaci_probe()
1078 struct aaci *aaci = card->private_data; in aaci_remove() local
1079 writel(0, aaci->base + AACI_MAINCR); in aaci_remove()