Lines Matching +full:dai +full:- +full:format
1 // SPDX-License-Identifier: GPL-2.0
3 * mtk-afe-fe-dais.c -- Mediatek afe fe dai operator
14 #include "mtk-afe-platform-driver.h"
16 #include "mtk-afe-fe-dai.h"
17 #include "mtk-base-afe.h"
38 struct snd_soc_dai *dai)
41 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
42 struct snd_pcm_runtime *runtime = substream->runtime;
43 int memif_num = snd_soc_rtd_to_cpu(rtd, 0)->id;
44 struct mtk_base_afe_memif *memif = &afe->memif[memif_num];
45 const struct snd_pcm_hardware *mtk_afe_hardware = afe->mtk_afe_hardware;
48 memif->substream = substream;
50 snd_pcm_hw_constraint_step(substream->runtime, 0,
53 mtk_regmap_update_bits(afe->regmap, memif->data->agent_disable_reg,
54 1, 0, memif->data->agent_disable_shift);
59 * Capture cannot use ping-pong buffer since hw_ptr at IRQ may be
64 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
65 int periods_max = mtk_afe_hardware->periods_max;
71 dev_err(afe->dev, "hw_constraint_minmax failed\n");
79 dev_err(afe->dev, "snd_pcm_hw_constraint_integer failed\n");
82 if (memif->irq_usage < 0) {
85 if (irq_id != afe->irqs_size) {
87 memif->irq_usage = irq_id;
89 dev_err(afe->dev, "%s() error: no more asys irq\n",
91 ret = -EBUSY;
99 struct snd_soc_dai *dai)
102 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
103 struct mtk_base_afe_memif *memif = &afe->memif[snd_soc_rtd_to_cpu(rtd, 0)->id];
106 irq_id = memif->irq_usage;
108 mtk_regmap_update_bits(afe->regmap, memif->data->agent_disable_reg,
109 1, 1, memif->data->agent_disable_shift);
111 if (!memif->const_irq) {
113 memif->irq_usage = -1;
114 memif->substream = NULL;
121 struct snd_soc_dai *dai)
124 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
125 int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
126 struct mtk_base_afe_memif *memif = &afe->memif[id];
130 snd_pcm_format_t format = params_format(params);
132 if (afe->request_dram_resource)
133 afe->request_dram_resource(afe->dev);
135 dev_dbg(afe->dev, "%s(), %s, ch %d, rate %d, fmt %d, dma_addr %pad, dma_area %p, dma_bytes 0x%zx\n",
136 __func__, memif->data->name,
137 channels, rate, format,
138 &substream->runtime->dma_addr,
139 substream->runtime->dma_area,
140 substream->runtime->dma_bytes);
142 memset_io((void __force __iomem *)substream->runtime->dma_area, 0,
143 substream->runtime->dma_bytes);
147 substream->runtime->dma_area,
148 substream->runtime->dma_addr,
149 substream->runtime->dma_bytes);
151 dev_err(afe->dev, "%s(), error, id %d, set addr, ret %d\n",
159 dev_err(afe->dev, "%s(), error, id %d, set channel %d, ret %d\n",
167 dev_err(afe->dev, "%s(), error, id %d, set rate %d, ret %d\n",
172 /* set format */
173 ret = mtk_memif_set_format(afe, id, format);
175 dev_err(afe->dev, "%s(), error, id %d, set format %d, ret %d\n",
176 __func__, id, format, ret);
185 struct snd_soc_dai *dai)
187 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
189 if (afe->release_dram_resource)
190 afe->release_dram_resource(afe->dev);
197 struct snd_soc_dai *dai)
200 struct snd_pcm_runtime * const runtime = substream->runtime;
201 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
202 int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
203 struct mtk_base_afe_memif *memif = &afe->memif[id];
204 struct mtk_base_afe_irq *irqs = &afe->irqs[memif->irq_usage];
205 const struct mtk_base_irq_data *irq_data = irqs->irq_data;
206 unsigned int counter = runtime->period_size;
210 dev_dbg(afe->dev, "%s %s cmd=%d\n", __func__, memif->data->name, cmd);
217 dev_err(afe->dev, "%s(), error, id %d, memif enable, ret %d\n",
223 mtk_regmap_update_bits(afe->regmap, irq_data->irq_cnt_reg,
224 irq_data->irq_cnt_maskbit, counter,
225 irq_data->irq_cnt_shift);
228 fs = afe->irq_fs(substream, runtime->rate);
231 return -EINVAL;
233 mtk_regmap_update_bits(afe->regmap, irq_data->irq_fs_reg,
234 irq_data->irq_fs_maskbit, fs,
235 irq_data->irq_fs_shift);
238 mtk_regmap_update_bits(afe->regmap, irq_data->irq_en_reg,
239 1, 1, irq_data->irq_en_shift);
246 dev_err(afe->dev, "%s(), error, id %d, memif enable, ret %d\n",
251 mtk_regmap_update_bits(afe->regmap, irq_data->irq_en_reg,
252 1, 0, irq_data->irq_en_shift);
254 mtk_regmap_write(afe->regmap, irq_data->irq_clr_reg,
255 1 << irq_data->irq_clr_shift);
258 return -EINVAL;
264 struct snd_soc_dai *dai)
267 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
268 int id = snd_soc_rtd_to_cpu(rtd, 0)->id;
271 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
272 if (afe->get_memif_pbuf_size) {
273 pbuf_size = afe->get_memif_pbuf_size(substream);
295 mutex_lock(&afe->irq_alloc_lock);
296 for (i = 0; i < afe->irqs_size; ++i) {
297 if (afe->irqs[i].irq_occupyed == 0) {
298 afe->irqs[i].irq_occupyed = 1;
299 mutex_unlock(&afe->irq_alloc_lock);
303 mutex_unlock(&afe->irq_alloc_lock);
304 return afe->irqs_size;
310 mutex_lock(&afe->irq_alloc_lock);
311 if (irq_id >= 0 && irq_id < afe->irqs_size) {
312 afe->irqs[irq_id].irq_occupyed = 0;
313 mutex_unlock(&afe->irq_alloc_lock);
316 mutex_unlock(&afe->irq_alloc_lock);
317 return -EINVAL;
324 struct device *dev = afe->dev;
325 struct regmap *regmap = afe->regmap;
328 if (pm_runtime_status_suspended(dev) || afe->suspended)
331 if (!afe->reg_back_up)
332 afe->reg_back_up =
333 devm_kcalloc(dev, afe->reg_back_up_list_num,
336 if (afe->reg_back_up) {
337 for (i = 0; i < afe->reg_back_up_list_num; i++)
338 regmap_read(regmap, afe->reg_back_up_list[i],
339 &afe->reg_back_up[i]);
342 afe->suspended = true;
343 afe->runtime_suspend(dev);
351 struct device *dev = afe->dev;
352 struct regmap *regmap = afe->regmap;
355 if (pm_runtime_status_suspended(dev) || !afe->suspended)
358 afe->runtime_resume(dev);
360 if (!afe->reg_back_up) {
363 for (i = 0; i < afe->reg_back_up_list_num; i++)
364 mtk_regmap_write(regmap, afe->reg_back_up_list[i],
365 afe->reg_back_up[i]);
368 afe->suspended = false;
375 struct mtk_base_afe_memif *memif = &afe->memif[id];
377 if (memif->data->enable_shift < 0) {
378 dev_warn(afe->dev, "%s(), error, id %d, enable_shift < 0\n",
382 return mtk_regmap_update_bits(afe->regmap, memif->data->enable_reg,
383 1, 1, memif->data->enable_shift);
389 struct mtk_base_afe_memif *memif = &afe->memif[id];
391 if (memif->data->enable_shift < 0) {
392 dev_warn(afe->dev, "%s(), error, id %d, enable_shift < 0\n",
396 return mtk_regmap_update_bits(afe->regmap, memif->data->enable_reg,
397 1, 0, memif->data->enable_shift);
406 struct mtk_base_afe_memif *memif = &afe->memif[id];
411 memif->dma_area = dma_area;
412 memif->dma_addr = dma_addr;
413 memif->dma_bytes = dma_bytes;
416 mtk_regmap_write(afe->regmap, memif->data->reg_ofs_base,
419 if (memif->data->reg_ofs_end)
420 mtk_regmap_write(afe->regmap,
421 memif->data->reg_ofs_end,
422 phys_buf_addr + dma_bytes - 1);
424 mtk_regmap_write(afe->regmap,
425 memif->data->reg_ofs_base +
427 phys_buf_addr + dma_bytes - 1);
430 if (memif->data->reg_ofs_base_msb) {
431 mtk_regmap_write(afe->regmap, memif->data->reg_ofs_base_msb,
433 mtk_regmap_write(afe->regmap,
434 memif->data->reg_ofs_end_msb,
439 * set MSB to 33-bit, for memif address
442 if (memif->data->msb_reg)
443 mtk_regmap_update_bits(afe->regmap, memif->data->msb_reg,
444 1, msb_at_bit33, memif->data->msb_shift);
446 /* set MSB to 33-bit, for memif end address */
447 if (memif->data->msb_end_reg)
448 mtk_regmap_update_bits(afe->regmap, memif->data->msb_end_reg,
450 memif->data->msb_end_shift);
459 struct mtk_base_afe_memif *memif = &afe->memif[id];
462 if (memif->data->mono_shift < 0)
465 if (memif->data->quad_ch_mask) {
468 mtk_regmap_update_bits(afe->regmap, memif->data->quad_ch_reg,
469 memif->data->quad_ch_mask,
470 quad_ch, memif->data->quad_ch_shift);
473 if (memif->data->mono_invert)
479 if (memif->data->int_odd_flag_reg)
480 mtk_regmap_update_bits(afe->regmap,
481 memif->data->int_odd_flag_reg,
483 memif->data->int_odd_flag_shift);
485 return mtk_regmap_update_bits(afe->regmap, memif->data->mono_reg,
486 1, mono, memif->data->mono_shift);
493 struct mtk_base_afe_memif *memif = &afe->memif[id];
495 if (memif->data->fs_shift >= 0)
496 mtk_regmap_update_bits(afe->regmap, memif->data->fs_reg,
497 memif->data->fs_maskbit,
498 fs, memif->data->fs_shift);
513 if (!afe->memif_fs) {
514 dev_err(afe->dev, "%s(), error, afe->memif_fs == NULL\n",
516 return -EINVAL;
519 fs = afe->memif_fs(substream, rate);
522 return -EINVAL;
529 int id, snd_pcm_format_t format)
531 struct mtk_base_afe_memif *memif = &afe->memif[id];
536 switch (format) {
543 if (afe->memif_32bit_supported) {
556 dev_err(afe->dev, "%s() error: unsupported format %d\n",
557 __func__, format);
561 mtk_regmap_update_bits(afe->regmap, memif->data->hd_reg,
562 0x3, hd_audio, memif->data->hd_shift);
564 mtk_regmap_update_bits(afe->regmap, memif->data->hd_align_reg,
565 0x1, hd_align, memif->data->hd_align_mshift);
574 const struct mtk_base_memif_data *memif_data = afe->memif[id].data;
576 if (memif_data->pbuf_mask == 0 || memif_data->minlen_mask == 0)
579 mtk_regmap_update_bits(afe->regmap, memif_data->pbuf_reg,
580 memif_data->pbuf_mask,
581 pbuf_size, memif_data->pbuf_shift);
583 mtk_regmap_update_bits(afe->regmap, memif_data->minlen_reg,
584 memif_data->minlen_mask,
585 pbuf_size, memif_data->minlen_shift);
590 MODULE_DESCRIPTION("Mediatek simple fe dai operator");