Lines Matching +full:sub +full:- +full:device
1 // SPDX-License-Identifier: GPL-2.0
5 // Copyright (c) 2017-2018 Socionext Inc.
9 #include <linux/dma-mapping.h>
24 struct snd_compr *compr = rtd->compr; in uniphier_aio_comprdma_new()
25 struct device *dev = compr->card->dev; in uniphier_aio_comprdma_new()
26 struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); in uniphier_aio_comprdma_new()
27 struct uniphier_aio_sub *sub = &aio->sub[compr->direction]; in uniphier_aio_comprdma_new() local
35 sub->compr_area = kzalloc(size, GFP_KERNEL); in uniphier_aio_comprdma_new()
36 if (!sub->compr_area) in uniphier_aio_comprdma_new()
37 return -ENOMEM; in uniphier_aio_comprdma_new()
39 if (sub->swm->dir == PORT_DIR_OUTPUT) in uniphier_aio_comprdma_new()
42 sub->compr_addr = dma_map_single(dev, sub->compr_area, size, dma_dir); in uniphier_aio_comprdma_new()
43 if (dma_mapping_error(dev, sub->compr_addr)) { in uniphier_aio_comprdma_new()
44 kfree(sub->compr_area); in uniphier_aio_comprdma_new()
45 sub->compr_area = NULL; in uniphier_aio_comprdma_new()
47 return -ENOMEM; in uniphier_aio_comprdma_new()
50 sub->compr_bytes = size; in uniphier_aio_comprdma_new()
57 struct snd_compr *compr = rtd->compr; in uniphier_aio_comprdma_free()
58 struct device *dev = compr->card->dev; in uniphier_aio_comprdma_free()
59 struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); in uniphier_aio_comprdma_free()
60 struct uniphier_aio_sub *sub = &aio->sub[compr->direction]; in uniphier_aio_comprdma_free() local
63 if (sub->swm->dir == PORT_DIR_OUTPUT) in uniphier_aio_comprdma_free()
66 dma_unmap_single(dev, sub->compr_addr, sub->compr_bytes, dma_dir); in uniphier_aio_comprdma_free()
67 kfree(sub->compr_area); in uniphier_aio_comprdma_free()
68 sub->compr_area = NULL; in uniphier_aio_comprdma_free()
75 struct snd_soc_pcm_runtime *rtd = cstream->private_data; in uniphier_aio_compr_open()
76 struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); in uniphier_aio_compr_open()
77 struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; in uniphier_aio_compr_open() local
80 if (sub->cstream) in uniphier_aio_compr_open()
81 return -EBUSY; in uniphier_aio_compr_open()
83 sub->cstream = cstream; in uniphier_aio_compr_open()
84 sub->pass_through = 1; in uniphier_aio_compr_open()
85 sub->use_mmap = false; in uniphier_aio_compr_open()
91 ret = aio_init(sub); in uniphier_aio_compr_open()
100 struct snd_soc_pcm_runtime *rtd = cstream->private_data; in uniphier_aio_compr_free()
101 struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); in uniphier_aio_compr_free()
102 struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; in uniphier_aio_compr_free() local
112 sub->cstream = NULL; in uniphier_aio_compr_free()
120 struct snd_soc_pcm_runtime *rtd = cstream->private_data; in uniphier_aio_compr_get_params()
121 struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); in uniphier_aio_compr_get_params()
122 struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; in uniphier_aio_compr_get_params() local
124 *params = sub->cparams.codec; in uniphier_aio_compr_get_params()
132 struct snd_soc_pcm_runtime *rtd = cstream->private_data; in uniphier_aio_compr_set_params()
133 struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); in uniphier_aio_compr_set_params()
134 struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; in uniphier_aio_compr_set_params() local
135 struct device *dev = &aio->chip->pdev->dev; in uniphier_aio_compr_set_params()
138 if (params->codec.id != SND_AUDIOCODEC_IEC61937) { in uniphier_aio_compr_set_params()
140 params->codec.id); in uniphier_aio_compr_set_params()
141 return -EINVAL; in uniphier_aio_compr_set_params()
143 if (params->codec.profile != SND_AUDIOPROFILE_IEC61937_SPDIF) { in uniphier_aio_compr_set_params()
145 params->codec.profile); in uniphier_aio_compr_set_params()
146 return -EINVAL; in uniphier_aio_compr_set_params()
150 sub->iec_pc = IEC61937_PC_AAC; in uniphier_aio_compr_set_params()
152 sub->cparams = *params; in uniphier_aio_compr_set_params()
153 sub->setting = 1; in uniphier_aio_compr_set_params()
155 aio_port_reset(sub); in uniphier_aio_compr_set_params()
156 aio_src_reset(sub); in uniphier_aio_compr_set_params()
167 struct snd_soc_pcm_runtime *rtd = cstream->private_data; in uniphier_aio_compr_hw_free()
168 struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); in uniphier_aio_compr_hw_free()
169 struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; in uniphier_aio_compr_hw_free() local
171 sub->setting = 0; in uniphier_aio_compr_hw_free()
178 struct snd_soc_pcm_runtime *rtd = cstream->private_data; in uniphier_aio_compr_prepare()
179 struct snd_compr_runtime *runtime = cstream->runtime; in uniphier_aio_compr_prepare()
180 struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); in uniphier_aio_compr_prepare()
181 struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; in uniphier_aio_compr_prepare() local
182 int bytes = runtime->fragment_size; in uniphier_aio_compr_prepare()
186 ret = aiodma_ch_set_param(sub); in uniphier_aio_compr_prepare()
190 spin_lock_irqsave(&sub->lock, flags); in uniphier_aio_compr_prepare()
191 ret = aiodma_rb_set_buffer(sub, sub->compr_addr, in uniphier_aio_compr_prepare()
192 sub->compr_addr + sub->compr_bytes, in uniphier_aio_compr_prepare()
194 spin_unlock_irqrestore(&sub->lock, flags); in uniphier_aio_compr_prepare()
198 ret = aio_port_set_param(sub, sub->pass_through, &sub->params); in uniphier_aio_compr_prepare()
201 ret = aio_oport_set_stream_type(sub, sub->iec_pc); in uniphier_aio_compr_prepare()
204 aio_port_set_enable(sub, 1); in uniphier_aio_compr_prepare()
206 ret = aio_if_set_param(sub, sub->pass_through); in uniphier_aio_compr_prepare()
216 struct snd_soc_pcm_runtime *rtd = cstream->private_data; in uniphier_aio_compr_trigger()
217 struct snd_compr_runtime *runtime = cstream->runtime; in uniphier_aio_compr_trigger()
218 struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); in uniphier_aio_compr_trigger()
219 struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; in uniphier_aio_compr_trigger() local
220 struct device *dev = &aio->chip->pdev->dev; in uniphier_aio_compr_trigger()
221 int bytes = runtime->fragment_size, ret = 0; in uniphier_aio_compr_trigger()
224 spin_lock_irqsave(&sub->lock, flags); in uniphier_aio_compr_trigger()
227 aiodma_rb_sync(sub, sub->compr_addr, sub->compr_bytes, bytes); in uniphier_aio_compr_trigger()
228 aiodma_ch_set_enable(sub, 1); in uniphier_aio_compr_trigger()
229 sub->running = 1; in uniphier_aio_compr_trigger()
233 sub->running = 0; in uniphier_aio_compr_trigger()
234 aiodma_ch_set_enable(sub, 0); in uniphier_aio_compr_trigger()
239 ret = -EINVAL; in uniphier_aio_compr_trigger()
241 spin_unlock_irqrestore(&sub->lock, flags); in uniphier_aio_compr_trigger()
249 struct snd_soc_pcm_runtime *rtd = cstream->private_data; in uniphier_aio_compr_pointer()
250 struct snd_compr_runtime *runtime = cstream->runtime; in uniphier_aio_compr_pointer()
251 struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); in uniphier_aio_compr_pointer()
252 struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; in uniphier_aio_compr_pointer() local
253 int bytes = runtime->fragment_size; in uniphier_aio_compr_pointer()
257 spin_lock_irqsave(&sub->lock, flags); in uniphier_aio_compr_pointer()
259 aiodma_rb_sync(sub, sub->compr_addr, sub->compr_bytes, bytes); in uniphier_aio_compr_pointer()
261 if (sub->swm->dir == PORT_DIR_OUTPUT) { in uniphier_aio_compr_pointer()
262 pos = sub->rd_offs; in uniphier_aio_compr_pointer()
264 tstamp->copied_total = sub->rd_total / 2; in uniphier_aio_compr_pointer()
266 pos = sub->wr_offs; in uniphier_aio_compr_pointer()
267 tstamp->copied_total = sub->rd_total; in uniphier_aio_compr_pointer()
269 tstamp->byte_offset = pos; in uniphier_aio_compr_pointer()
271 spin_unlock_irqrestore(&sub->lock, flags); in uniphier_aio_compr_pointer()
276 static int aio_compr_send_to_hw(struct uniphier_aio_sub *sub, in aio_compr_send_to_hw() argument
280 u32 *dstbuf = (u32 *)(sub->compr_area + sub->wr_offs); in aio_compr_send_to_hw()
297 sub->iec_header = true; in aio_compr_send_to_hw()
301 if (sub->iec_header && sub->iec_pc != pc) { in aio_compr_send_to_hw()
303 sub->iec_pc = pc; in aio_compr_send_to_hw()
304 ret = aio_oport_set_stream_type(sub, pc); in aio_compr_send_to_hw()
308 sub->iec_header = false; in aio_compr_send_to_hw()
313 dstsize -= sizeof(u32) * 2; in aio_compr_send_to_hw()
322 struct snd_soc_pcm_runtime *rtd = cstream->private_data; in uniphier_aio_compr_copy()
323 struct snd_compr_runtime *runtime = cstream->runtime; in uniphier_aio_compr_copy()
324 struct device *carddev = rtd->compr->card->dev; in uniphier_aio_compr_copy()
325 struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); in uniphier_aio_compr_copy()
326 struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; in uniphier_aio_compr_copy() local
327 size_t cnt = min_t(size_t, count, aio_rb_space_to_end(sub) / 2); in uniphier_aio_compr_copy()
328 int bytes = runtime->fragment_size; in uniphier_aio_compr_copy()
336 if (sub->swm->dir == PORT_DIR_OUTPUT) { in uniphier_aio_compr_copy()
337 dma_addr_t dmapos = sub->compr_addr + sub->wr_offs; in uniphier_aio_compr_copy()
343 ret = aio_compr_send_to_hw(sub, buf, s); in uniphier_aio_compr_copy()
346 dma_addr_t dmapos = sub->compr_addr + sub->rd_offs; in uniphier_aio_compr_copy()
351 ret = copy_to_user(buf, sub->compr_area + sub->rd_offs, s); in uniphier_aio_compr_copy()
355 return -EFAULT; in uniphier_aio_compr_copy()
357 spin_lock_irqsave(&sub->lock, flags); in uniphier_aio_compr_copy()
359 sub->threshold = 2 * bytes; in uniphier_aio_compr_copy()
360 aiodma_rb_set_threshold(sub, sub->compr_bytes, 2 * bytes); in uniphier_aio_compr_copy()
362 if (sub->swm->dir == PORT_DIR_OUTPUT) { in uniphier_aio_compr_copy()
363 sub->wr_offs += s; in uniphier_aio_compr_copy()
364 if (sub->wr_offs >= sub->compr_bytes) in uniphier_aio_compr_copy()
365 sub->wr_offs -= sub->compr_bytes; in uniphier_aio_compr_copy()
367 sub->rd_offs += s; in uniphier_aio_compr_copy()
368 if (sub->rd_offs >= sub->compr_bytes) in uniphier_aio_compr_copy()
369 sub->rd_offs -= sub->compr_bytes; in uniphier_aio_compr_copy()
371 aiodma_rb_sync(sub, sub->compr_addr, sub->compr_bytes, bytes); in uniphier_aio_compr_copy()
373 spin_unlock_irqrestore(&sub->lock, flags); in uniphier_aio_compr_copy()
381 caps->num_codecs = 1; in uniphier_aio_compr_get_caps()
382 caps->min_fragment_size = AUD_MIN_FRAGMENT_SIZE; in uniphier_aio_compr_get_caps()
383 caps->max_fragment_size = AUD_MAX_FRAGMENT_SIZE; in uniphier_aio_compr_get_caps()
384 caps->min_fragments = AUD_MIN_FRAGMENT; in uniphier_aio_compr_get_caps()
385 caps->max_fragments = AUD_MAX_FRAGMENT; in uniphier_aio_compr_get_caps()
386 caps->codecs[0] = SND_AUDIOCODEC_IEC61937; in uniphier_aio_compr_get_caps()
407 if (codec->codec == SND_AUDIOCODEC_IEC61937) in uniphier_aio_compr_get_codec_caps()
410 return -EINVAL; in uniphier_aio_compr_get_codec_caps()