Lines Matching +full:dai +full:- +full:format

1 // SPDX-License-Identifier: GPL-2.0
10 #include <linux/dma-mapping.h>
67 struct snd_card *card = rtd->card->snd_card; in qmc_audio_pcm_construct()
70 ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32)); in qmc_audio_pcm_construct()
74 snd_pcm_set_managed_buffer_all(rtd->pcm, SNDRV_DMA_TYPE_DEV, card->dev, in qmc_audio_pcm_construct()
95 struct snd_pcm_runtime *runtime = substream->runtime; in qmc_audio_pcm_hw_params()
96 struct qmc_dai_prtd *prtd = substream->runtime->private_data; in qmc_audio_pcm_hw_params()
100 * channels whereas in non-interleaved mode, it uses one QMC channel per in qmc_audio_pcm_hw_params()
103 prtd->channels = qmc_audio_access_is_interleaved(params_access(params)) ? in qmc_audio_pcm_hw_params()
106 prtd->substream = substream; in qmc_audio_pcm_hw_params()
108 prtd->buffer_ended = 0; in qmc_audio_pcm_hw_params()
109 prtd->buffer_size = params_buffer_size(params); in qmc_audio_pcm_hw_params()
110 prtd->period_size = params_period_size(params); in qmc_audio_pcm_hw_params()
112 prtd->ch_dma_addr_start = runtime->dma_addr; in qmc_audio_pcm_hw_params()
113 prtd->ch_dma_offset = params_buffer_bytes(params) / prtd->channels; in qmc_audio_pcm_hw_params()
114 prtd->ch_dma_addr_end = runtime->dma_addr + prtd->ch_dma_offset; in qmc_audio_pcm_hw_params()
115 prtd->ch_dma_addr_current = prtd->ch_dma_addr_start; in qmc_audio_pcm_hw_params()
116 prtd->ch_dma_size = params_period_bytes(params) / prtd->channels; in qmc_audio_pcm_hw_params()
128 for (i = 0; i < prtd->channels; i++) { in qmc_audio_pcm_write_submit()
129 bitmap_set(prtd->chans_pending, i, 1); in qmc_audio_pcm_write_submit()
131 ret = qmc_chan_write_submit(prtd->qmc_dai->chans[i].qmc_chan, in qmc_audio_pcm_write_submit()
132 prtd->ch_dma_addr_current + i * prtd->ch_dma_offset, in qmc_audio_pcm_write_submit()
133 prtd->ch_dma_size, in qmc_audio_pcm_write_submit()
135 &prtd->qmc_dai->chans[i]); in qmc_audio_pcm_write_submit()
137 dev_err(prtd->qmc_dai->dev, "write_submit %u failed %d\n", in qmc_audio_pcm_write_submit()
139 bitmap_clear(prtd->chans_pending, i, 1); in qmc_audio_pcm_write_submit()
152 prtd = chan->prtd_tx; in qmc_audio_pcm_write_complete()
155 bitmap_clear(prtd->chans_pending, chan - prtd->qmc_dai->chans, 1); in qmc_audio_pcm_write_complete()
161 if (!bitmap_empty(prtd->chans_pending, 64)) in qmc_audio_pcm_write_complete()
164 prtd->buffer_ended += prtd->period_size; in qmc_audio_pcm_write_complete()
165 if (prtd->buffer_ended >= prtd->buffer_size) in qmc_audio_pcm_write_complete()
166 prtd->buffer_ended = 0; in qmc_audio_pcm_write_complete()
168 prtd->ch_dma_addr_current += prtd->ch_dma_size; in qmc_audio_pcm_write_complete()
169 if (prtd->ch_dma_addr_current >= prtd->ch_dma_addr_end) in qmc_audio_pcm_write_complete()
170 prtd->ch_dma_addr_current = prtd->ch_dma_addr_start; in qmc_audio_pcm_write_complete()
174 snd_pcm_period_elapsed(prtd->substream); in qmc_audio_pcm_write_complete()
184 for (i = 0; i < prtd->channels; i++) { in qmc_audio_pcm_read_submit()
185 bitmap_set(prtd->chans_pending, i, 1); in qmc_audio_pcm_read_submit()
187 ret = qmc_chan_read_submit(prtd->qmc_dai->chans[i].qmc_chan, in qmc_audio_pcm_read_submit()
188 prtd->ch_dma_addr_current + i * prtd->ch_dma_offset, in qmc_audio_pcm_read_submit()
189 prtd->ch_dma_size, in qmc_audio_pcm_read_submit()
191 &prtd->qmc_dai->chans[i]); in qmc_audio_pcm_read_submit()
193 dev_err(prtd->qmc_dai->dev, "read_submit %u failed %d\n", in qmc_audio_pcm_read_submit()
195 bitmap_clear(prtd->chans_pending, i, 1); in qmc_audio_pcm_read_submit()
208 prtd = chan->prtd_rx; in qmc_audio_pcm_read_complete()
211 bitmap_clear(prtd->chans_pending, chan - prtd->qmc_dai->chans, 1); in qmc_audio_pcm_read_complete()
213 if (length != prtd->ch_dma_size) { in qmc_audio_pcm_read_complete()
214 dev_err(prtd->qmc_dai->dev, "read complete length = %zu, exp %zu\n", in qmc_audio_pcm_read_complete()
215 length, prtd->ch_dma_size); in qmc_audio_pcm_read_complete()
222 if (!bitmap_empty(prtd->chans_pending, 64)) in qmc_audio_pcm_read_complete()
225 prtd->buffer_ended += prtd->period_size; in qmc_audio_pcm_read_complete()
226 if (prtd->buffer_ended >= prtd->buffer_size) in qmc_audio_pcm_read_complete()
227 prtd->buffer_ended = 0; in qmc_audio_pcm_read_complete()
229 prtd->ch_dma_addr_current += prtd->ch_dma_size; in qmc_audio_pcm_read_complete()
230 if (prtd->ch_dma_addr_current >= prtd->ch_dma_addr_end) in qmc_audio_pcm_read_complete()
231 prtd->ch_dma_addr_current = prtd->ch_dma_addr_start; in qmc_audio_pcm_read_complete()
235 snd_pcm_period_elapsed(prtd->substream); in qmc_audio_pcm_read_complete()
241 struct qmc_dai_prtd *prtd = substream->runtime->private_data; in qmc_audio_pcm_trigger()
245 if (!prtd->qmc_dai) { in qmc_audio_pcm_trigger()
246 dev_err(component->dev, "qmc_dai is not set\n"); in qmc_audio_pcm_trigger()
247 return -EINVAL; in qmc_audio_pcm_trigger()
252 bitmap_zero(prtd->chans_pending, 64); in qmc_audio_pcm_trigger()
253 prtd->buffer_ended = 0; in qmc_audio_pcm_trigger()
254 prtd->ch_dma_addr_current = prtd->ch_dma_addr_start; in qmc_audio_pcm_trigger()
256 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in qmc_audio_pcm_trigger()
257 for (i = 0; i < prtd->channels; i++) in qmc_audio_pcm_trigger()
258 prtd->qmc_dai->chans[i].prtd_tx = prtd; in qmc_audio_pcm_trigger()
266 prtd->ch_dma_addr_current += prtd->ch_dma_size; in qmc_audio_pcm_trigger()
267 if (prtd->ch_dma_addr_current >= prtd->ch_dma_addr_end) in qmc_audio_pcm_trigger()
268 prtd->ch_dma_addr_current = prtd->ch_dma_addr_start; in qmc_audio_pcm_trigger()
275 for (i = 0; i < prtd->channels; i++) in qmc_audio_pcm_trigger()
276 prtd->qmc_dai->chans[i].prtd_rx = prtd; in qmc_audio_pcm_trigger()
284 prtd->ch_dma_addr_current += prtd->ch_dma_size; in qmc_audio_pcm_trigger()
285 if (prtd->ch_dma_addr_current >= prtd->ch_dma_addr_end) in qmc_audio_pcm_trigger()
286 prtd->ch_dma_addr_current = prtd->ch_dma_addr_start; in qmc_audio_pcm_trigger()
305 return -EINVAL; in qmc_audio_pcm_trigger()
314 struct qmc_dai_prtd *prtd = substream->runtime->private_data; in qmc_audio_pcm_pointer()
316 return prtd->buffer_ended; in qmc_audio_pcm_pointer()
323 struct qmc_audio *qmc_audio = dev_get_drvdata(component->dev); in qmc_audio_of_xlate_dai_name()
325 int id = args->args[0]; in qmc_audio_of_xlate_dai_name()
328 for (i = 0; i < qmc_audio->num_dais; i++) { in qmc_audio_of_xlate_dai_name()
329 dai_driver = qmc_audio->dai_drivers + i; in qmc_audio_of_xlate_dai_name()
330 if (dai_driver->id == id) { in qmc_audio_of_xlate_dai_name()
331 *dai_name = dai_driver->name; in qmc_audio_of_xlate_dai_name()
336 return -EINVAL; in qmc_audio_of_xlate_dai_name()
355 struct snd_pcm_runtime *runtime = substream->runtime; in qmc_audio_pcm_open()
368 return -ENOMEM; in qmc_audio_pcm_open()
370 runtime->private_data = prtd; in qmc_audio_pcm_open()
378 struct qmc_dai_prtd *prtd = substream->runtime->private_data; in qmc_audio_pcm_close()
394 static unsigned int qmc_dai_get_index(struct snd_soc_dai *dai) in qmc_dai_get_index() argument
396 struct qmc_audio *qmc_audio = snd_soc_dai_get_drvdata(dai); in qmc_dai_get_index()
398 return dai->driver - qmc_audio->dai_drivers; in qmc_dai_get_index()
401 static struct qmc_dai *qmc_dai_get_data(struct snd_soc_dai *dai) in qmc_dai_get_data() argument
403 struct qmc_audio *qmc_audio = snd_soc_dai_get_drvdata(dai); in qmc_dai_get_data()
406 index = qmc_dai_get_index(dai); in qmc_dai_get_data()
407 if (index > qmc_audio->num_dais) in qmc_dai_get_data()
410 return qmc_audio->dais + index; in qmc_dai_get_data()
414 * The constraints for format/channel is to match with the number of 8bit
415 * time-slots available.
422 snd_pcm_format_t format = params_format(params); in qmc_dai_hw_rule_channels_by_format() local
425 switch (snd_pcm_format_physical_width(format)) { in qmc_dai_hw_rule_channels_by_format()
439 dev_err(qmc_dai->dev, "format physical width %u not supported\n", in qmc_dai_hw_rule_channels_by_format()
440 snd_pcm_format_physical_width(format)); in qmc_dai_hw_rule_channels_by_format()
441 return -EINVAL; in qmc_dai_hw_rule_channels_by_format()
452 struct qmc_dai *qmc_dai = rule->private; in qmc_dai_hw_rule_playback_channels_by_format()
454 return qmc_dai_hw_rule_channels_by_format(qmc_dai, params, qmc_dai->nb_tx_ts); in qmc_dai_hw_rule_playback_channels_by_format()
460 struct qmc_dai *qmc_dai = rule->private; in qmc_dai_hw_rule_capture_channels_by_format()
462 return qmc_dai_hw_rule_channels_by_format(qmc_dai, params, qmc_dai->nb_rx_ts); in qmc_dai_hw_rule_capture_channels_by_format()
472 snd_pcm_format_t format; in qmc_dai_hw_rule_format_by_channels() local
476 dev_err(qmc_dai->dev, "channels %u not supported\n", in qmc_dai_hw_rule_format_by_channels()
478 return -EINVAL; in qmc_dai_hw_rule_format_by_channels()
484 pcm_for_each_format(format) { in qmc_dai_hw_rule_format_by_channels()
485 if (snd_mask_test_format(f_old, format)) { in qmc_dai_hw_rule_format_by_channels()
486 if (snd_pcm_format_physical_width(format) <= slot_width) in qmc_dai_hw_rule_format_by_channels()
487 snd_mask_set_format(&f_new, format); in qmc_dai_hw_rule_format_by_channels()
497 struct qmc_dai *qmc_dai = rule->private; in qmc_dai_hw_rule_playback_format_by_channels()
499 return qmc_dai_hw_rule_format_by_channels(qmc_dai, params, qmc_dai->nb_tx_ts); in qmc_dai_hw_rule_playback_format_by_channels()
505 struct qmc_dai *qmc_dai = rule->private; in qmc_dai_hw_rule_capture_format_by_channels()
507 return qmc_dai_hw_rule_format_by_channels(qmc_dai, params, qmc_dai->nb_rx_ts); in qmc_dai_hw_rule_capture_format_by_channels()
519 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { in qmc_dai_constraints_interleaved()
522 frame_bits = qmc_dai->nb_rx_ts * 8; in qmc_dai_constraints_interleaved()
526 frame_bits = qmc_dai->nb_tx_ts * 8; in qmc_dai_constraints_interleaved()
529 ret = snd_pcm_hw_rule_add(substream->runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, in qmc_dai_constraints_interleaved()
531 SNDRV_PCM_HW_PARAM_FORMAT, -1); in qmc_dai_constraints_interleaved()
533 dev_err(qmc_dai->dev, "Failed to add channels rule (%d)\n", ret); in qmc_dai_constraints_interleaved()
537 ret = snd_pcm_hw_rule_add(substream->runtime, 0, SNDRV_PCM_HW_PARAM_FORMAT, in qmc_dai_constraints_interleaved()
539 SNDRV_PCM_HW_PARAM_CHANNELS, -1); in qmc_dai_constraints_interleaved()
541 dev_err(qmc_dai->dev, "Failed to add format rule (%d)\n", ret); in qmc_dai_constraints_interleaved()
545 ret = snd_pcm_hw_constraint_single(substream->runtime, in qmc_dai_constraints_interleaved()
549 dev_err(qmc_dai->dev, "Failed to add frame_bits constraint (%d)\n", ret); in qmc_dai_constraints_interleaved()
555 ret = snd_pcm_hw_constraint_mask64(substream->runtime, SNDRV_PCM_HW_PARAM_ACCESS, in qmc_dai_constraints_interleaved()
558 dev_err(qmc_dai->dev, "Failed to add hw_param_access constraint (%d)\n", ret); in qmc_dai_constraints_interleaved()
572 frame_bits = (substream->stream == SNDRV_PCM_STREAM_CAPTURE) ? in qmc_dai_constraints_noninterleaved()
573 qmc_dai->nb_rx_ts * 8 : qmc_dai->nb_tx_ts * 8; in qmc_dai_constraints_noninterleaved()
574 ret = snd_pcm_hw_constraint_single(substream->runtime, in qmc_dai_constraints_noninterleaved()
578 dev_err(qmc_dai->dev, "Failed to add frame_bits constraint (%d)\n", ret); in qmc_dai_constraints_noninterleaved()
584 ret = snd_pcm_hw_constraint_mask64(substream->runtime, SNDRV_PCM_HW_PARAM_ACCESS, in qmc_dai_constraints_noninterleaved()
587 dev_err(qmc_dai->dev, "Failed to add hw_param_access constraint (%d)\n", ret); in qmc_dai_constraints_noninterleaved()
595 struct snd_soc_dai *dai) in qmc_dai_startup() argument
597 struct qmc_dai_prtd *prtd = substream->runtime->private_data; in qmc_dai_startup()
600 qmc_dai = qmc_dai_get_data(dai); in qmc_dai_startup()
602 dev_err(dai->dev, "Invalid dai\n"); in qmc_dai_startup()
603 return -EINVAL; in qmc_dai_startup()
606 prtd->qmc_dai = qmc_dai; in qmc_dai_startup()
608 return qmc_dai->nb_chans_avail > 1 ? in qmc_dai_startup()
615 struct snd_soc_dai *dai) in qmc_dai_hw_params() argument
623 qmc_dai = qmc_dai_get_data(dai); in qmc_dai_hw_params()
625 dev_err(dai->dev, "Invalid dai\n"); in qmc_dai_hw_params()
626 return -EINVAL; in qmc_dai_hw_params()
631 * channels whereas in non-interleaved mode, it uses one QMC channel per in qmc_dai_hw_params()
637 if (nb_chans_used > qmc_dai->nb_chans_avail) { in qmc_dai_hw_params()
638 dev_err(dai->dev, "Not enough qmc_chans. Need %u, avail %u\n", in qmc_dai_hw_params()
639 nb_chans_used, qmc_dai->nb_chans_avail); in qmc_dai_hw_params()
640 return -EINVAL; in qmc_dai_hw_params()
643 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { in qmc_dai_hw_params()
647 ret = qmc_chan_set_param(qmc_dai->chans[i].qmc_chan, &chan_param); in qmc_dai_hw_params()
649 dev_err(dai->dev, "chans[%u], set param failed %d\n", in qmc_dai_hw_params()
654 qmc_dai->nb_chans_used_rx = nb_chans_used; in qmc_dai_hw_params()
656 qmc_dai->nb_chans_used_tx = nb_chans_used; in qmc_dai_hw_params()
663 struct snd_soc_dai *dai) in qmc_dai_trigger() argument
672 qmc_dai = qmc_dai_get_data(dai); in qmc_dai_trigger()
674 dev_err(dai->dev, "Invalid dai\n"); in qmc_dai_trigger()
675 return -EINVAL; in qmc_dai_trigger()
678 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in qmc_dai_trigger()
680 nb_chans_used = qmc_dai->nb_chans_used_tx; in qmc_dai_trigger()
683 nb_chans_used = qmc_dai->nb_chans_used_rx; in qmc_dai_trigger()
691 ret = qmc_chan_start(qmc_dai->chans[i].qmc_chan, direction); in qmc_dai_trigger()
700 ret_tmp = qmc_chan_stop(qmc_dai->chans[i].qmc_chan, direction); in qmc_dai_trigger()
706 ret_tmp = qmc_chan_reset(qmc_dai->chans[i].qmc_chan, direction); in qmc_dai_trigger()
718 ret_tmp = qmc_chan_stop(qmc_dai->chans[i].qmc_chan, direction); in qmc_dai_trigger()
727 return -EINVAL; in qmc_dai_trigger()
733 while (i--) { in qmc_dai_trigger()
734 qmc_chan_stop(qmc_dai->chans[i].qmc_chan, direction); in qmc_dai_trigger()
735 qmc_chan_reset(qmc_dai->chans[i].qmc_chan, direction); in qmc_dai_trigger()
750 snd_pcm_format_t format; in qmc_audio_formats() local
758 pcm_for_each_format(format) { in qmc_audio_formats()
760 * Support format other than little-endian (ie big-endian or in qmc_audio_formats()
763 if (snd_pcm_format_little_endian(format) == 1) in qmc_audio_formats()
767 format_width = snd_pcm_format_physical_width(format); in qmc_audio_formats()
785 formats_mask |= pcm_format_to_bits(format); in qmc_audio_formats()
804 qmc_dai->dev = qmc_audio->dev; in qmc_audio_dai_parse()
808 dev_err(qmc_audio->dev, "%pOF: failed to read reg\n", np); in qmc_audio_dai_parse()
811 qmc_dai->id = val; in qmc_audio_dai_parse()
813 qmc_dai->name = devm_kasprintf(qmc_audio->dev, GFP_KERNEL, "%s.%d", in qmc_audio_dai_parse()
814 np->parent->name, qmc_dai->id); in qmc_audio_dai_parse()
815 if (!qmc_dai->name) in qmc_audio_dai_parse()
816 return -ENOMEM; in qmc_audio_dai_parse()
818 count = qmc_chan_count_phandles(np, "fsl,qmc-chan"); in qmc_audio_dai_parse()
820 return dev_err_probe(qmc_audio->dev, count, in qmc_audio_dai_parse()
821 "dai %d get number of QMC channel failed\n", qmc_dai->id); in qmc_audio_dai_parse()
823 return dev_err_probe(qmc_audio->dev, -EINVAL, in qmc_audio_dai_parse()
824 "dai %d no QMC channel defined\n", qmc_dai->id); in qmc_audio_dai_parse()
826 qmc_dai->chans = devm_kcalloc(qmc_audio->dev, count, sizeof(*qmc_dai->chans), GFP_KERNEL); in qmc_audio_dai_parse()
827 if (!qmc_dai->chans) in qmc_audio_dai_parse()
828 return -ENOMEM; in qmc_audio_dai_parse()
831 qmc_dai->chans[i].qmc_chan = devm_qmc_chan_get_byphandles_index(qmc_audio->dev, np, in qmc_audio_dai_parse()
832 "fsl,qmc-chan", i); in qmc_audio_dai_parse()
833 if (IS_ERR(qmc_dai->chans[i].qmc_chan)) { in qmc_audio_dai_parse()
834 return dev_err_probe(qmc_audio->dev, PTR_ERR(qmc_dai->chans[i].qmc_chan), in qmc_audio_dai_parse()
835 "dai %d get QMC channel %d failed\n", qmc_dai->id, i); in qmc_audio_dai_parse()
838 ret = qmc_chan_get_info(qmc_dai->chans[i].qmc_chan, &info); in qmc_audio_dai_parse()
840 dev_err(qmc_audio->dev, "dai %d get QMC %d channel info failed %d\n", in qmc_audio_dai_parse()
841 qmc_dai->id, i, ret); in qmc_audio_dai_parse()
846 dev_err(qmc_audio->dev, "dai %d QMC chan %d mode %d is not QMC_TRANSPARENT\n", in qmc_audio_dai_parse()
847 qmc_dai->id, i, info.mode); in qmc_audio_dai_parse()
848 return -EINVAL; in qmc_audio_dai_parse()
862 …dev_err(qmc_audio->dev, "dai %d QMC chan %d inconsistent number of Tx timeslots (%u instead of %u)… in qmc_audio_dai_parse()
863 qmc_dai->id, i, info.nb_tx_ts, nb_tx_ts); in qmc_audio_dai_parse()
864 return -EINVAL; in qmc_audio_dai_parse()
867 …dev_err(qmc_audio->dev, "dai %d QMC chan %d inconsistent number of Rx timeslots (%u instead of %u)… in qmc_audio_dai_parse()
868 qmc_dai->id, i, info.nb_rx_ts, nb_rx_ts); in qmc_audio_dai_parse()
869 return -EINVAL; in qmc_audio_dai_parse()
872 …dev_err(qmc_audio->dev, "dai %d QMC chan %d inconsistent Tx frame sample rate (%lu instead of %lu)… in qmc_audio_dai_parse()
873 qmc_dai->id, i, info.tx_fs_rate, tx_fs_rate); in qmc_audio_dai_parse()
874 return -EINVAL; in qmc_audio_dai_parse()
877 …dev_err(qmc_audio->dev, "dai %d QMC chan %d inconsistent Rx frame sample rate (%lu instead of %lu)… in qmc_audio_dai_parse()
878 qmc_dai->id, i, info.rx_fs_rate, rx_fs_rate); in qmc_audio_dai_parse()
879 return -EINVAL; in qmc_audio_dai_parse()
884 qmc_dai->nb_chans_avail = count; in qmc_audio_dai_parse()
885 qmc_dai->nb_tx_ts = nb_tx_ts * count; in qmc_audio_dai_parse()
886 qmc_dai->nb_rx_ts = nb_rx_ts * count; in qmc_audio_dai_parse()
888 qmc_soc_dai_driver->id = qmc_dai->id; in qmc_audio_dai_parse()
889 qmc_soc_dai_driver->name = qmc_dai->name; in qmc_audio_dai_parse()
891 qmc_soc_dai_driver->playback.channels_min = 0; in qmc_audio_dai_parse()
892 qmc_soc_dai_driver->playback.channels_max = 0; in qmc_audio_dai_parse()
894 qmc_soc_dai_driver->playback.channels_min = 1; in qmc_audio_dai_parse()
895 qmc_soc_dai_driver->playback.channels_max = count > 1 ? count : nb_tx_ts; in qmc_audio_dai_parse()
897 qmc_soc_dai_driver->playback.formats = qmc_audio_formats(nb_tx_ts, in qmc_audio_dai_parse()
900 qmc_soc_dai_driver->capture.channels_min = 0; in qmc_audio_dai_parse()
901 qmc_soc_dai_driver->capture.channels_max = 0; in qmc_audio_dai_parse()
903 qmc_soc_dai_driver->capture.channels_min = 1; in qmc_audio_dai_parse()
904 qmc_soc_dai_driver->capture.channels_max = count > 1 ? count : nb_rx_ts; in qmc_audio_dai_parse()
906 qmc_soc_dai_driver->capture.formats = qmc_audio_formats(nb_rx_ts, in qmc_audio_dai_parse()
909 qmc_soc_dai_driver->playback.rates = snd_pcm_rate_to_rate_bit(tx_fs_rate); in qmc_audio_dai_parse()
910 qmc_soc_dai_driver->playback.rate_min = tx_fs_rate; in qmc_audio_dai_parse()
911 qmc_soc_dai_driver->playback.rate_max = tx_fs_rate; in qmc_audio_dai_parse()
912 qmc_soc_dai_driver->capture.rates = snd_pcm_rate_to_rate_bit(rx_fs_rate); in qmc_audio_dai_parse()
913 qmc_soc_dai_driver->capture.rate_min = rx_fs_rate; in qmc_audio_dai_parse()
914 qmc_soc_dai_driver->capture.rate_max = rx_fs_rate; in qmc_audio_dai_parse()
916 qmc_soc_dai_driver->ops = &qmc_dai_ops; in qmc_audio_dai_parse()
923 struct device_node *np = pdev->dev.of_node; in qmc_audio_probe()
929 qmc_audio = devm_kzalloc(&pdev->dev, sizeof(*qmc_audio), GFP_KERNEL); in qmc_audio_probe()
931 return -ENOMEM; in qmc_audio_probe()
933 qmc_audio->dev = &pdev->dev; in qmc_audio_probe()
935 qmc_audio->num_dais = of_get_available_child_count(np); in qmc_audio_probe()
936 if (qmc_audio->num_dais) { in qmc_audio_probe()
937 qmc_audio->dais = devm_kcalloc(&pdev->dev, qmc_audio->num_dais, in qmc_audio_probe()
938 sizeof(*qmc_audio->dais), in qmc_audio_probe()
940 if (!qmc_audio->dais) in qmc_audio_probe()
941 return -ENOMEM; in qmc_audio_probe()
943 qmc_audio->dai_drivers = devm_kcalloc(&pdev->dev, qmc_audio->num_dais, in qmc_audio_probe()
944 sizeof(*qmc_audio->dai_drivers), in qmc_audio_probe()
946 if (!qmc_audio->dai_drivers) in qmc_audio_probe()
947 return -ENOMEM; in qmc_audio_probe()
953 qmc_audio->dais + i, in qmc_audio_probe()
954 qmc_audio->dai_drivers + i); in qmc_audio_probe()
964 ret = devm_snd_soc_register_component(qmc_audio->dev, in qmc_audio_probe()
966 qmc_audio->dai_drivers, in qmc_audio_probe()
967 qmc_audio->num_dais); in qmc_audio_probe()
975 { .compatible = "fsl,qmc-audio" },
982 .name = "fsl-qmc-audio",