Lines Matching +full:cs +full:- +full:enable +full:- +full:mask

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * kirkwood-dma.c
6 * (c) 2010 Arnaud Patard <arnaud.patard@rtp-net.org>
15 #include <linux/dma-mapping.h>
44 unsigned long mask, status, cause; in kirkwood_dma_irq() local
46 mask = readl(priv->io + KIRKWOOD_INT_MASK); in kirkwood_dma_irq()
47 status = readl(priv->io + KIRKWOOD_INT_CAUSE) & mask; in kirkwood_dma_irq()
49 cause = readl(priv->io + KIRKWOOD_ERR_CAUSE); in kirkwood_dma_irq()
53 writel(cause, priv->io + KIRKWOOD_ERR_CAUSE); in kirkwood_dma_irq()
65 writel(status, priv->io + KIRKWOOD_INT_CAUSE); in kirkwood_dma_irq()
68 snd_pcm_period_elapsed(priv->substream_play); in kirkwood_dma_irq()
71 snd_pcm_period_elapsed(priv->substream_rec); in kirkwood_dma_irq()
87 /* try to find matching cs for current dma address */ in kirkwood_dma_conf_mbus_windows()
88 for (i = 0; i < dram->num_cs; i++) { in kirkwood_dma_conf_mbus_windows()
89 const struct mbus_dram_window *cs = &dram->cs[i]; in kirkwood_dma_conf_mbus_windows() local
90 if ((cs->base & 0xffff0000) < (dma & 0xffff0000)) { in kirkwood_dma_conf_mbus_windows()
91 writel(cs->base & 0xffff0000, in kirkwood_dma_conf_mbus_windows()
93 writel(((cs->size - 1) & 0xffff0000) | in kirkwood_dma_conf_mbus_windows()
94 (cs->mbus_attr << 8) | in kirkwood_dma_conf_mbus_windows()
95 (dram->mbus_dram_target_id << 4) | 1, in kirkwood_dma_conf_mbus_windows()
105 struct snd_pcm_runtime *runtime = substream->runtime; in kirkwood_dma_open()
113 priv->burst * 2, in kirkwood_dma_open()
114 KIRKWOOD_AUDIO_BUF_MAX-1); in kirkwood_dma_open()
120 priv->burst); in kirkwood_dma_open()
124 err = snd_pcm_hw_constraint_step(substream->runtime, 0, in kirkwood_dma_open()
126 priv->burst); in kirkwood_dma_open()
130 if (!priv->substream_play && !priv->substream_rec) { in kirkwood_dma_open()
131 err = request_irq(priv->irq, kirkwood_dma_irq, IRQF_SHARED, in kirkwood_dma_open()
132 "kirkwood-i2s", priv); in kirkwood_dma_open()
137 * Enable Error interrupts. We're only ack'ing them but in kirkwood_dma_open()
140 writel((unsigned int)-1, priv->io + KIRKWOOD_ERR_MASK); in kirkwood_dma_open()
143 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in kirkwood_dma_open()
144 if (priv->substream_play) in kirkwood_dma_open()
145 return -EBUSY; in kirkwood_dma_open()
146 priv->substream_play = substream; in kirkwood_dma_open()
148 if (priv->substream_rec) in kirkwood_dma_open()
149 return -EBUSY; in kirkwood_dma_open()
150 priv->substream_rec = substream; in kirkwood_dma_open()
164 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in kirkwood_dma_close()
165 priv->substream_play = NULL; in kirkwood_dma_close()
167 priv->substream_rec = NULL; in kirkwood_dma_close()
169 if (!priv->substream_play && !priv->substream_rec) { in kirkwood_dma_close()
170 writel(0, priv->io + KIRKWOOD_ERR_MASK); in kirkwood_dma_close()
171 free_irq(priv->irq, priv); in kirkwood_dma_close()
183 unsigned long addr = substream->runtime->dma_addr; in kirkwood_dma_hw_params()
188 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in kirkwood_dma_hw_params()
189 kirkwood_dma_conf_mbus_windows(priv->io, in kirkwood_dma_hw_params()
192 kirkwood_dma_conf_mbus_windows(priv->io, in kirkwood_dma_hw_params()
200 struct snd_pcm_runtime *runtime = substream->runtime; in kirkwood_dma_prepare()
205 size = frames_to_bytes(runtime, runtime->buffer_size); in kirkwood_dma_prepare()
206 size = (size>>2)-1; in kirkwood_dma_prepare()
209 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in kirkwood_dma_prepare()
210 writel(count, priv->io + KIRKWOOD_PLAY_BYTE_INT_COUNT); in kirkwood_dma_prepare()
211 writel(runtime->dma_addr, priv->io + KIRKWOOD_PLAY_BUF_ADDR); in kirkwood_dma_prepare()
212 writel(size, priv->io + KIRKWOOD_PLAY_BUF_SIZE); in kirkwood_dma_prepare()
214 writel(count, priv->io + KIRKWOOD_REC_BYTE_INT_COUNT); in kirkwood_dma_prepare()
215 writel(runtime->dma_addr, priv->io + KIRKWOOD_REC_BUF_ADDR); in kirkwood_dma_prepare()
216 writel(size, priv->io + KIRKWOOD_REC_BUF_SIZE); in kirkwood_dma_prepare()
230 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in kirkwood_dma_pointer()
231 count = bytes_to_frames(substream->runtime, in kirkwood_dma_pointer()
232 readl(priv->io + KIRKWOOD_PLAY_BYTE_COUNT)); in kirkwood_dma_pointer()
234 count = bytes_to_frames(substream->runtime, in kirkwood_dma_pointer()
235 readl(priv->io + KIRKWOOD_REC_BYTE_COUNT)); in kirkwood_dma_pointer()
244 struct snd_card *card = rtd->card->snd_card; in kirkwood_dma_new()
247 ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32)); in kirkwood_dma_new()
251 snd_pcm_set_managed_buffer_all(rtd->pcm, SNDRV_DMA_TYPE_DEV, in kirkwood_dma_new()
252 card->dev, size, size); in kirkwood_dma_new()