Lines Matching +full:tdm +full:- +full:slots

1 // SPDX-License-Identifier: GPL-2.0
3 // soc-dai.c
10 #include <sound/soc-dai.h>
11 #include <sound/soc-link.h>
17 return snd_soc_ret(dai->dev, ret, in _soc_dai_ret()
18 "at %s() on %s\n", func, dai->name); in _soc_dai_ret()
25 #define soc_dai_mark_push(dai, substream, tgt) ((dai)->mark_##tgt = substream)
26 #define soc_dai_mark_pop(dai, tgt) ((dai)->mark_##tgt = NULL)
27 #define soc_dai_mark_match(dai, substream, tgt) ((dai)->mark_##tgt == substream)
30 * snd_soc_dai_set_sysclk - configure DAI system or master clock.
43 if (dai->driver->ops && in snd_soc_dai_set_sysclk()
44 dai->driver->ops->set_sysclk) in snd_soc_dai_set_sysclk()
45 ret = dai->driver->ops->set_sysclk(dai, clk_id, freq, dir); in snd_soc_dai_set_sysclk()
47 ret = snd_soc_component_set_sysclk(dai->component, clk_id, 0, in snd_soc_dai_set_sysclk()
55 * snd_soc_dai_set_clkdiv - configure DAI clock dividers.
67 int ret = -EINVAL; in snd_soc_dai_set_clkdiv()
69 if (dai->driver->ops && in snd_soc_dai_set_clkdiv()
70 dai->driver->ops->set_clkdiv) in snd_soc_dai_set_clkdiv()
71 ret = dai->driver->ops->set_clkdiv(dai, div_id, div); in snd_soc_dai_set_clkdiv()
78 * snd_soc_dai_set_pll - configure DAI PLL.
92 if (dai->driver->ops && in snd_soc_dai_set_pll()
93 dai->driver->ops->set_pll) in snd_soc_dai_set_pll()
94 ret = dai->driver->ops->set_pll(dai, pll_id, source, in snd_soc_dai_set_pll()
97 ret = snd_soc_component_set_pll(dai->component, pll_id, source, in snd_soc_dai_set_pll()
105 * snd_soc_dai_set_bclk_ratio - configure BCLK to sample rate ratio.
113 int ret = -ENOTSUPP; in snd_soc_dai_set_bclk_ratio()
115 if (dai->driver->ops && in snd_soc_dai_set_bclk_ratio()
116 dai->driver->ops->set_bclk_ratio) in snd_soc_dai_set_bclk_ratio()
117 ret = dai->driver->ops->set_bclk_ratio(dai, ratio); in snd_soc_dai_set_bclk_ratio()
132 if (dai->driver->ops && in snd_soc_dai_get_fmt_max_priority()
133 dai->driver->ops->num_auto_selectable_formats) in snd_soc_dai_get_fmt_max_priority()
134 max = max(max, dai->driver->ops->num_auto_selectable_formats); in snd_soc_dai_get_fmt_max_priority()
143 * snd_soc_dai_get_fmt - get supported audio format.
157 const struct snd_soc_dai_ops *ops = dai->driver->ops; in snd_soc_dai_get_fmt()
175 max = ops->num_auto_selectable_formats; in snd_soc_dai_get_fmt()
181 fmt |= ops->auto_selectable_formats[i]; in snd_soc_dai_get_fmt()
187 * snd_soc_dai_set_fmt - configure DAI hardware audio format.
195 int ret = -ENOTSUPP; in snd_soc_dai_set_fmt()
197 if (dai->driver->ops && dai->driver->ops->set_fmt) in snd_soc_dai_set_fmt()
198 ret = dai->driver->ops->set_fmt(dai, fmt); in snd_soc_dai_set_fmt()
205 * snd_soc_xlate_tdm_slot_mask - generate tx/rx slot mask.
206 * @slots: Number of slots in use.
207 * @tx_mask: bitmask representing active TX slots.
208 * @rx_mask: bitmask representing active RX slots.
210 * Generates the TDM tx and rx slot default masks for DAI.
212 static int snd_soc_xlate_tdm_slot_mask(unsigned int slots, in snd_soc_xlate_tdm_slot_mask() argument
219 if (!slots) in snd_soc_xlate_tdm_slot_mask()
220 return -EINVAL; in snd_soc_xlate_tdm_slot_mask()
222 *tx_mask = (1 << slots) - 1; in snd_soc_xlate_tdm_slot_mask()
223 *rx_mask = (1 << slots) - 1; in snd_soc_xlate_tdm_slot_mask()
229 * snd_soc_dai_set_tdm_slot() - Configures a DAI for TDM operation
231 * @tx_mask: bitmask representing active TX slots.
232 * @rx_mask: bitmask representing active RX slots.
233 * @slots: Number of slots in use.
236 * This function configures the specified DAI for TDM operation. @slot contains
237 * the total number of slots of the TDM stream and @slot_with the width of each
239 * active slots of the TDM stream for the specified DAI, i.e. which slots the
246 * TDM mode can be disabled by passing 0 for @slots. In this case @tx_mask,
253 int slots, int slot_width) in snd_soc_dai_set_tdm_slot() argument
255 int ret = -ENOTSUPP; in snd_soc_dai_set_tdm_slot()
262 if (slots) { in snd_soc_dai_set_tdm_slot()
263 if (dai->driver->ops && in snd_soc_dai_set_tdm_slot()
264 dai->driver->ops->xlate_tdm_slot_mask) in snd_soc_dai_set_tdm_slot()
265 ret = dai->driver->ops->xlate_tdm_slot_mask(slots, &tx_mask, &rx_mask); in snd_soc_dai_set_tdm_slot()
267 ret = snd_soc_xlate_tdm_slot_mask(slots, &tx_mask, &rx_mask); in snd_soc_dai_set_tdm_slot()
275 if (dai->driver->ops && in snd_soc_dai_set_tdm_slot()
276 dai->driver->ops->set_tdm_slot) in snd_soc_dai_set_tdm_slot()
277 ret = dai->driver->ops->set_tdm_slot(dai, tx_mask, rx_mask, in snd_soc_dai_set_tdm_slot()
278 slots, slot_width); in snd_soc_dai_set_tdm_slot()
285 * snd_soc_dai_set_channel_map - configure DAI audio channel map
289 * 0~num-1 uses
292 * 0~num-1 uses
294 * configure the relationship between channel number and TDM slot number.
300 int ret = -ENOTSUPP; in snd_soc_dai_set_channel_map()
302 if (dai->driver->ops && in snd_soc_dai_set_channel_map()
303 dai->driver->ops->set_channel_map) in snd_soc_dai_set_channel_map()
304 ret = dai->driver->ops->set_channel_map(dai, tx_num, tx_slot, in snd_soc_dai_set_channel_map()
311 * snd_soc_dai_get_channel_map - Get DAI audio channel map
315 * 0~num-1 uses
318 * 0~num-1 uses
324 int ret = -ENOTSUPP; in snd_soc_dai_get_channel_map()
326 if (dai->driver->ops && in snd_soc_dai_get_channel_map()
327 dai->driver->ops->get_channel_map) in snd_soc_dai_get_channel_map()
328 ret = dai->driver->ops->get_channel_map(dai, tx_num, tx_slot, in snd_soc_dai_get_channel_map()
335 * snd_soc_dai_set_tristate - configure DAI system or master clock.
343 int ret = -EINVAL; in snd_soc_dai_set_tristate()
345 if (dai->driver->ops && in snd_soc_dai_set_tristate()
346 dai->driver->ops->set_tristate) in snd_soc_dai_set_tristate()
347 ret = dai->driver->ops->set_tristate(dai, tristate); in snd_soc_dai_set_tristate()
358 if (!snd_soc_dai_stream_valid(dai, substream->stream)) in snd_soc_dai_prepare()
361 if (dai->driver->ops && in snd_soc_dai_prepare()
362 dai->driver->ops->prepare) in snd_soc_dai_prepare()
363 ret = dai->driver->ops->prepare(substream, dai); in snd_soc_dai_prepare()
371 if (dai->driver->ops) in snd_soc_dai_mute_is_ctrled_at_trigger()
372 return dai->driver->ops->mute_unmute_on_trigger; in snd_soc_dai_mute_is_ctrled_at_trigger()
378 * snd_soc_dai_digital_mute - configure DAI system or master clock.
388 int ret = -ENOTSUPP; in snd_soc_dai_digital_mute()
394 if (dai->driver->ops && in snd_soc_dai_digital_mute()
395 dai->driver->ops->mute_stream && in snd_soc_dai_digital_mute()
397 !dai->driver->ops->no_capture_mute)) in snd_soc_dai_digital_mute()
398 ret = dai->driver->ops->mute_stream(dai, mute, direction); in snd_soc_dai_digital_mute()
410 if (dai->driver->ops && in snd_soc_dai_hw_params()
411 dai->driver->ops->hw_params) in snd_soc_dai_hw_params()
412 ret = dai->driver->ops->hw_params(substream, params, dai); in snd_soc_dai_hw_params()
428 if (dai->driver->ops && in snd_soc_dai_hw_free()
429 dai->driver->ops->hw_free) in snd_soc_dai_hw_free()
430 dai->driver->ops->hw_free(substream, dai); in snd_soc_dai_hw_free()
441 if (!snd_soc_dai_stream_valid(dai, substream->stream)) in snd_soc_dai_startup()
444 if (dai->driver->ops && in snd_soc_dai_startup()
445 dai->driver->ops->startup) in snd_soc_dai_startup()
446 ret = dai->driver->ops->startup(substream, dai); in snd_soc_dai_startup()
459 if (!snd_soc_dai_stream_valid(dai, substream->stream)) in snd_soc_dai_shutdown()
465 if (dai->driver->ops && in snd_soc_dai_shutdown()
466 dai->driver->ops->shutdown) in snd_soc_dai_shutdown()
467 dai->driver->ops->shutdown(substream, dai); in snd_soc_dai_shutdown()
476 int ret = -ENOTSUPP; in snd_soc_dai_compress_new()
477 if (dai->driver->ops && in snd_soc_dai_compress_new()
478 dai->driver->ops->compress_new) in snd_soc_dai_compress_new()
479 ret = dai->driver->ops->compress_new(rtd); in snd_soc_dai_compress_new()
484 * snd_soc_dai_stream_valid() - check if a DAI supports the given stream
493 return stream->channels_min; in snd_soc_dai_stream_valid()
500 dai->stream[stream].active += action; in snd_soc_dai_action()
503 dai->component->active += action; in snd_soc_dai_action()
513 active += dai->stream[stream].active; in snd_soc_dai_active()
525 if (dai->probed) in snd_soc_pcm_dai_probe()
528 if (dai->driver->ops) { in snd_soc_pcm_dai_probe()
529 if (dai->driver->ops->probe_order != order) in snd_soc_pcm_dai_probe()
532 if (dai->driver->ops->probe) { in snd_soc_pcm_dai_probe()
533 int ret = dai->driver->ops->probe(dai); in snd_soc_pcm_dai_probe()
539 dai->probed = 1; in snd_soc_pcm_dai_probe()
551 if (!dai->probed) in snd_soc_pcm_dai_remove()
554 if (dai->driver->ops) { in snd_soc_pcm_dai_remove()
555 if (dai->driver->ops->remove_order != order) in snd_soc_pcm_dai_remove()
558 if (dai->driver->ops->remove) { in snd_soc_pcm_dai_remove()
559 r = dai->driver->ops->remove(dai); in snd_soc_pcm_dai_remove()
564 dai->probed = 0; in snd_soc_pcm_dai_remove()
576 if (dai->driver->ops && in snd_soc_pcm_dai_new()
577 dai->driver->ops->pcm_new) { in snd_soc_pcm_dai_new()
578 int ret = dai->driver->ops->pcm_new(rtd, dai); in snd_soc_pcm_dai_new()
607 if (!snd_soc_dai_stream_valid(dai, substream->stream)) in soc_dai_trigger()
610 if (dai->driver->ops && in soc_dai_trigger()
611 dai->driver->ops->trigger) in soc_dai_trigger()
612 ret = dai->driver->ops->trigger(substream, cmd, dai); in soc_dai_trigger()
634 snd_soc_dai_digital_mute(dai, 0, substream->stream); in snd_soc_pcm_dai_trigger()
647 snd_soc_dai_digital_mute(dai, 1, substream->stream); in snd_soc_pcm_dai_trigger()
676 if (dai->driver->ops && in snd_soc_pcm_dai_delay()
677 dai->driver->ops->delay) in snd_soc_pcm_dai_delay()
678 *cpu_delay = max(*cpu_delay, dai->driver->ops->delay(substream, dai)); in snd_soc_pcm_dai_delay()
682 if (dai->driver->ops && in snd_soc_pcm_dai_delay()
683 dai->driver->ops->delay) in snd_soc_pcm_dai_delay()
684 *codec_delay = max(*codec_delay, dai->driver->ops->delay(substream, dai)); in snd_soc_pcm_dai_delay()
692 if (dai->driver->cops && in snd_soc_dai_compr_startup()
693 dai->driver->cops->startup) in snd_soc_dai_compr_startup()
694 ret = dai->driver->cops->startup(cstream, dai); in snd_soc_dai_compr_startup()
711 if (dai->driver->cops && in snd_soc_dai_compr_shutdown()
712 dai->driver->cops->shutdown) in snd_soc_dai_compr_shutdown()
713 dai->driver->cops->shutdown(cstream, dai); in snd_soc_dai_compr_shutdown()
725 if (dai->driver->cops && in snd_soc_dai_compr_trigger()
726 dai->driver->cops->trigger) in snd_soc_dai_compr_trigger()
727 ret = dai->driver->cops->trigger(cstream, cmd, dai); in snd_soc_dai_compr_trigger()
739 if (dai->driver->cops && in snd_soc_dai_compr_set_params()
740 dai->driver->cops->set_params) in snd_soc_dai_compr_set_params()
741 ret = dai->driver->cops->set_params(cstream, params, dai); in snd_soc_dai_compr_set_params()
753 if (dai->driver->cops && in snd_soc_dai_compr_get_params()
754 dai->driver->cops->get_params) in snd_soc_dai_compr_get_params()
755 ret = dai->driver->cops->get_params(cstream, params, dai); in snd_soc_dai_compr_get_params()
767 if (dai->driver->cops && in snd_soc_dai_compr_ack()
768 dai->driver->cops->ack) in snd_soc_dai_compr_ack()
769 ret = dai->driver->cops->ack(cstream, bytes, dai); in snd_soc_dai_compr_ack()
781 if (dai->driver->cops && in snd_soc_dai_compr_pointer()
782 dai->driver->cops->pointer) in snd_soc_dai_compr_pointer()
783 ret = dai->driver->cops->pointer(cstream, tstamp, dai); in snd_soc_dai_compr_pointer()
795 if (dai->driver->cops && in snd_soc_dai_compr_set_metadata()
796 dai->driver->cops->set_metadata) in snd_soc_dai_compr_set_metadata()
797 ret = dai->driver->cops->set_metadata(cstream, metadata, dai); in snd_soc_dai_compr_set_metadata()
809 if (dai->driver->cops && in snd_soc_dai_compr_get_metadata()
810 dai->driver->cops->get_metadata) in snd_soc_dai_compr_get_metadata()
811 ret = dai->driver->cops->get_metadata(cstream, metadata, dai); in snd_soc_dai_compr_get_metadata()