Lines Matching +full:sub +full:- +full:device
1 // SPDX-License-Identifier: GPL-2.0
5 // Copyright (c) 2016-2018 Socionext Inc.
7 #include <linux/dma-mapping.h>
28 static void aiodma_pcm_irq(struct uniphier_aio_sub *sub) in aiodma_pcm_irq() argument
30 struct snd_pcm_runtime *runtime = sub->substream->runtime; in aiodma_pcm_irq()
31 int bytes = runtime->period_size * in aiodma_pcm_irq()
32 runtime->channels * samples_to_bytes(runtime, 1); in aiodma_pcm_irq()
35 spin_lock(&sub->lock); in aiodma_pcm_irq()
36 ret = aiodma_rb_set_threshold(sub, runtime->dma_bytes, in aiodma_pcm_irq()
37 sub->threshold + bytes); in aiodma_pcm_irq()
39 sub->threshold += bytes; in aiodma_pcm_irq()
41 aiodma_rb_sync(sub, runtime->dma_addr, runtime->dma_bytes, bytes); in aiodma_pcm_irq()
42 aiodma_rb_clear_irq(sub); in aiodma_pcm_irq()
43 spin_unlock(&sub->lock); in aiodma_pcm_irq()
45 snd_pcm_period_elapsed(sub->substream); in aiodma_pcm_irq()
48 static void aiodma_compr_irq(struct uniphier_aio_sub *sub) in aiodma_compr_irq() argument
50 struct snd_compr_runtime *runtime = sub->cstream->runtime; in aiodma_compr_irq()
51 int bytes = runtime->fragment_size; in aiodma_compr_irq()
54 spin_lock(&sub->lock); in aiodma_compr_irq()
55 ret = aiodma_rb_set_threshold(sub, sub->compr_bytes, in aiodma_compr_irq()
56 sub->threshold + bytes); in aiodma_compr_irq()
58 sub->threshold += bytes; in aiodma_compr_irq()
60 aiodma_rb_sync(sub, sub->compr_addr, sub->compr_bytes, bytes); in aiodma_compr_irq()
61 aiodma_rb_clear_irq(sub); in aiodma_compr_irq()
62 spin_unlock(&sub->lock); in aiodma_compr_irq()
64 snd_compr_fragment_elapsed(sub->cstream); in aiodma_compr_irq()
74 for (i = 0; i < chip->num_aios; i++) { in aiodma_irq()
75 struct uniphier_aio *aio = &chip->aios[i]; in aiodma_irq()
77 for (j = 0; j < ARRAY_SIZE(aio->sub); j++) { in aiodma_irq()
78 struct uniphier_aio_sub *sub = &aio->sub[j]; in aiodma_irq() local
81 if (!sub->running || !aiodma_rb_is_irq(sub)) in aiodma_irq()
84 if (sub->substream) in aiodma_irq()
85 aiodma_pcm_irq(sub); in aiodma_irq()
86 if (sub->cstream) in aiodma_irq()
87 aiodma_compr_irq(sub); in aiodma_irq()
98 struct snd_pcm_runtime *runtime = substream->runtime; in uniphier_aiodma_open()
109 snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); in uniphier_aiodma_hw_params()
110 substream->runtime->dma_bytes = params_buffer_bytes(params); in uniphier_aiodma_hw_params()
118 substream->runtime->dma_bytes = 0; in uniphier_aiodma_hw_free()
125 struct snd_pcm_runtime *runtime = substream->runtime; in uniphier_aiodma_prepare()
127 struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); in uniphier_aiodma_prepare()
128 struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; in uniphier_aiodma_prepare() local
129 int bytes = runtime->period_size * in uniphier_aiodma_prepare()
130 runtime->channels * samples_to_bytes(runtime, 1); in uniphier_aiodma_prepare()
134 ret = aiodma_ch_set_param(sub); in uniphier_aiodma_prepare()
138 spin_lock_irqsave(&sub->lock, flags); in uniphier_aiodma_prepare()
139 ret = aiodma_rb_set_buffer(sub, runtime->dma_addr, in uniphier_aiodma_prepare()
140 runtime->dma_addr + runtime->dma_bytes, in uniphier_aiodma_prepare()
142 spin_unlock_irqrestore(&sub->lock, flags); in uniphier_aiodma_prepare()
151 struct snd_pcm_runtime *runtime = substream->runtime; in uniphier_aiodma_trigger()
153 struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); in uniphier_aiodma_trigger()
154 struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; in uniphier_aiodma_trigger() local
155 struct device *dev = &aio->chip->pdev->dev; in uniphier_aiodma_trigger()
156 int bytes = runtime->period_size * in uniphier_aiodma_trigger()
157 runtime->channels * samples_to_bytes(runtime, 1); in uniphier_aiodma_trigger()
160 spin_lock_irqsave(&sub->lock, flags); in uniphier_aiodma_trigger()
163 aiodma_rb_sync(sub, runtime->dma_addr, runtime->dma_bytes, in uniphier_aiodma_trigger()
165 aiodma_ch_set_enable(sub, 1); in uniphier_aiodma_trigger()
166 sub->running = 1; in uniphier_aiodma_trigger()
170 sub->running = 0; in uniphier_aiodma_trigger()
171 aiodma_ch_set_enable(sub, 0); in uniphier_aiodma_trigger()
178 spin_unlock_irqrestore(&sub->lock, flags); in uniphier_aiodma_trigger()
186 struct snd_pcm_runtime *runtime = substream->runtime; in uniphier_aiodma_pointer()
188 struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); in uniphier_aiodma_pointer()
189 struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; in uniphier_aiodma_pointer() local
190 int bytes = runtime->period_size * in uniphier_aiodma_pointer()
191 runtime->channels * samples_to_bytes(runtime, 1); in uniphier_aiodma_pointer()
195 spin_lock_irqsave(&sub->lock, flags); in uniphier_aiodma_pointer()
196 aiodma_rb_sync(sub, runtime->dma_addr, runtime->dma_bytes, bytes); in uniphier_aiodma_pointer()
198 if (sub->swm->dir == PORT_DIR_OUTPUT) in uniphier_aiodma_pointer()
199 pos = bytes_to_frames(runtime, sub->rd_offs); in uniphier_aiodma_pointer()
201 pos = bytes_to_frames(runtime, sub->wr_offs); in uniphier_aiodma_pointer()
202 spin_unlock_irqrestore(&sub->lock, flags); in uniphier_aiodma_pointer()
210 vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); in uniphier_aiodma_mmap()
212 return remap_pfn_range(vma, vma->vm_start, in uniphier_aiodma_mmap()
213 substream->dma_buffer.addr >> PAGE_SHIFT, in uniphier_aiodma_mmap()
214 vma->vm_end - vma->vm_start, vma->vm_page_prot); in uniphier_aiodma_mmap()
230 struct device *dev = rtd->card->snd_card->dev; in uniphier_aiodma_new()
231 struct snd_pcm *pcm = rtd->pcm; in uniphier_aiodma_new()
265 * uniphier_aiodma_soc_register_platform - register the AIO DMA
266 * @pdev: the platform device
268 * Register and setup the DMA of AIO to transfer the sound data to device.
277 struct device *dev = &pdev->dev; in uniphier_aiodma_soc_register_platform()
287 chip->regmap = devm_regmap_init_mmio(dev, preg, in uniphier_aiodma_soc_register_platform()
289 if (IS_ERR(chip->regmap)) in uniphier_aiodma_soc_register_platform()
290 return PTR_ERR(chip->regmap); in uniphier_aiodma_soc_register_platform()