Lines Matching full:rtd
157 void soc_dpcm_debugfs_add(struct snd_soc_pcm_runtime *rtd) in soc_dpcm_debugfs_add() argument
159 if (!rtd->dai_link) in soc_dpcm_debugfs_add()
162 if (!rtd->dai_link->dynamic) in soc_dpcm_debugfs_add()
165 if (!rtd->card->debugfs_card_root) in soc_dpcm_debugfs_add()
168 rtd->debugfs_dpcm_root = debugfs_create_dir(rtd->dai_link->name, in soc_dpcm_debugfs_add()
169 rtd->card->debugfs_card_root); in soc_dpcm_debugfs_add()
171 debugfs_create_file("state", 0444, rtd->debugfs_dpcm_root, in soc_dpcm_debugfs_add()
172 rtd, &dpcm_state_fops); in soc_dpcm_debugfs_add()
209 * @rtd: ASoC PCM runtime that is activated
217 * Must be called with the rtd->card->pcm_mutex being held
219 void snd_soc_runtime_action(struct snd_soc_pcm_runtime *rtd, in snd_soc_runtime_action() argument
225 lockdep_assert_held(&rtd->card->pcm_mutex); in snd_soc_runtime_action()
227 for_each_rtd_dais(rtd, i, dai) in snd_soc_runtime_action()
234 * @rtd: The ASoC PCM runtime that should be checked.
241 bool snd_soc_runtime_ignore_pmdown_time(struct snd_soc_pcm_runtime *rtd) in snd_soc_runtime_ignore_pmdown_time() argument
247 if (!rtd->pmdown_time || rtd->dai_link->ignore_pmdown_time) in snd_soc_runtime_ignore_pmdown_time()
250 for_each_rtd_components(rtd, i, component) in snd_soc_runtime_ignore_pmdown_time()
307 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_apply_symmetry() local
311 rtd->dai_link->symmetric_rates)) { in soc_pcm_apply_symmetry()
327 rtd->dai_link->symmetric_channels)) { in soc_pcm_apply_symmetry()
343 rtd->dai_link->symmetric_samplebits)) { in soc_pcm_apply_symmetry()
364 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_params_symmetry() local
374 symmetry = rtd->dai_link->symmetric_rates; in soc_pcm_params_symmetry()
376 for_each_rtd_cpu_dais(rtd, i, dai) in soc_pcm_params_symmetry()
380 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_pcm_params_symmetry()
382 dev_err(rtd->dev, "ASoC: unmatched rate symmetry: %d - %d\n", in soc_pcm_params_symmetry()
389 symmetry = rtd->dai_link->symmetric_channels; in soc_pcm_params_symmetry()
391 for_each_rtd_dais(rtd, i, dai) in soc_pcm_params_symmetry()
395 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_pcm_params_symmetry()
398 dev_err(rtd->dev, "ASoC: unmatched channel symmetry: %d - %d\n", in soc_pcm_params_symmetry()
405 symmetry = rtd->dai_link->symmetric_samplebits; in soc_pcm_params_symmetry()
407 for_each_rtd_dais(rtd, i, dai) in soc_pcm_params_symmetry()
411 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_pcm_params_symmetry()
414 dev_err(rtd->dev, "ASoC: unmatched sample bits symmetry: %d - %d\n", in soc_pcm_params_symmetry()
426 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_has_symmetry() local
427 struct snd_soc_dai_link *link = rtd->dai_link; in soc_pcm_has_symmetry()
435 for_each_rtd_dais(rtd, i, dai) in soc_pcm_has_symmetry()
446 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_set_msb() local
454 dev_warn(rtd->dev, "ASoC: Failed to set MSB %d: %d\n", in soc_pcm_set_msb()
460 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_apply_msb() local
468 for_each_rtd_codec_dais(rtd, i, codec_dai) { in soc_pcm_apply_msb()
478 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_pcm_apply_msb()
494 * @rtd: ASoC PCM runtime
501 int snd_soc_runtime_calc_hw(struct snd_soc_pcm_runtime *rtd, in snd_soc_runtime_calc_hw() argument
517 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in snd_soc_runtime_calc_hw()
540 for_each_rtd_codec_dais(rtd, i, codec_dai) { in snd_soc_runtime_calc_hw()
570 if (rtd->num_codecs > 1) { in snd_soc_runtime_calc_hw()
595 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_init_runtime_hw() local
603 snd_soc_runtime_calc_hw(rtd, hw, substream->stream); in soc_pcm_init_runtime_hw()
611 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_components_open() local
615 for_each_rtd_components(rtd, i, component) { in soc_pcm_components_open()
631 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_components_close() local
635 for_each_rtd_components(rtd, i, component) { in soc_pcm_components_close()
648 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_clean() local
653 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); in soc_pcm_clean()
656 snd_soc_runtime_deactivate(rtd, substream->stream); in soc_pcm_clean()
658 for_each_rtd_dais(rtd, i, dai) in soc_pcm_clean()
666 snd_soc_dapm_stream_stop(rtd, substream->stream); in soc_pcm_clean()
668 mutex_unlock(&rtd->card->pcm_mutex); in soc_pcm_clean()
670 snd_soc_pcm_component_pm_runtime_put(rtd, substream, rollback); in soc_pcm_clean()
672 for_each_rtd_components(rtd, i, component) in soc_pcm_clean()
696 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_open() local
704 for_each_rtd_components(rtd, i, component) in soc_pcm_open()
707 ret = snd_soc_pcm_component_pm_runtime_get(rtd, substream); in soc_pcm_open()
711 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); in soc_pcm_open()
722 for_each_rtd_dais(rtd, i, dai) { in soc_pcm_open()
729 if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm) in soc_pcm_open()
735 if (rtd->num_codecs == 1) in soc_pcm_open()
736 codec_dai_name = asoc_rtd_to_codec(rtd, 0)->name; in soc_pcm_open()
738 if (rtd->num_cpus == 1) in soc_pcm_open()
739 cpu_dai_name = asoc_rtd_to_cpu(rtd, 0)->name; in soc_pcm_open()
765 for_each_rtd_dais(rtd, i, dai) { in soc_pcm_open()
781 snd_soc_runtime_activate(rtd, substream->stream); in soc_pcm_open()
784 mutex_unlock(&rtd->card->pcm_mutex); in soc_pcm_open()
792 static void codec2codec_close_delayed_work(struct snd_soc_pcm_runtime *rtd) in codec2codec_close_delayed_work() argument
809 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_prepare() local
813 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); in soc_pcm_prepare()
825 dev_err(rtd->dev, "ASoC: DAI prepare error: %d\n", ret); in soc_pcm_prepare()
831 rtd->pop_wait) { in soc_pcm_prepare()
832 rtd->pop_wait = 0; in soc_pcm_prepare()
833 cancel_delayed_work(&rtd->delayed_work); in soc_pcm_prepare()
836 snd_soc_dapm_stream_event(rtd, substream->stream, in soc_pcm_prepare()
839 for_each_rtd_dais(rtd, i, dai) in soc_pcm_prepare()
843 mutex_unlock(&rtd->card->pcm_mutex); in soc_pcm_prepare()
866 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_hw_params() local
872 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); in soc_pcm_hw_params()
882 for_each_rtd_codec_dais(rtd, i, codec_dai) { in soc_pcm_hw_params()
929 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_pcm_hw_params()
955 mutex_unlock(&rtd->card->pcm_mutex); in soc_pcm_hw_params()
961 i = rtd->num_cpus; in soc_pcm_hw_params()
964 for_each_rtd_cpu_dais_rollback(rtd, i, cpu_dai) { in soc_pcm_hw_params()
972 i = rtd->num_codecs; in soc_pcm_hw_params()
975 for_each_rtd_codec_dais_rollback(rtd, i, codec_dai) { in soc_pcm_hw_params()
985 mutex_unlock(&rtd->card->pcm_mutex); in soc_pcm_hw_params()
994 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_hw_free() local
998 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); in soc_pcm_hw_free()
1001 for_each_rtd_dais(rtd, i, dai) { in soc_pcm_hw_free()
1021 for_each_rtd_dais(rtd, i, dai) { in soc_pcm_hw_free()
1028 mutex_unlock(&rtd->card->pcm_mutex); in soc_pcm_hw_free()
1075 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_pointer() local
1093 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_pcm_pointer()
1099 for_each_rtd_codec_dais(rtd, i, codec_dai) { in soc_pcm_pointer()
1254 struct snd_soc_pcm_runtime *rtd; in dpcm_end_walk_at_be() local
1263 rtd = dpcm_get_be(card, widget, stream); in dpcm_end_walk_at_be()
1264 if (rtd) in dpcm_end_walk_at_be()
1367 /* is there a valid BE rtd for this widget */ in dpcm_add_paths()
1685 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in dpcm_set_fe_runtime() local
1689 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in dpcm_set_fe_runtime()
1759 struct snd_soc_pcm_runtime *rtd; in dpcm_apply_symmetry() local
1767 rtd = asoc_substream_to_rtd(be_substream); in dpcm_apply_symmetry()
1768 if (rtd->dai_link->be_hw_params_fixup) in dpcm_apply_symmetry()
1775 for_each_rtd_dais(rtd, i, dai) { in dpcm_apply_symmetry()
2688 int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) in soc_new_pcm() argument
2699 if (rtd->dai_link->dynamic && rtd->num_cpus > 1) { in soc_new_pcm()
2700 dev_err(rtd->dev, in soc_new_pcm()
2705 if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm) { in soc_new_pcm()
2706 if (rtd->dai_link->dpcm_playback) { in soc_new_pcm()
2709 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_new_pcm()
2717 dev_err(rtd->card->dev, in soc_new_pcm()
2719 rtd->dai_link->stream_name); in soc_new_pcm()
2723 if (rtd->dai_link->dpcm_capture) { in soc_new_pcm()
2726 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_new_pcm()
2734 dev_err(rtd->card->dev, in soc_new_pcm()
2736 rtd->dai_link->stream_name); in soc_new_pcm()
2742 int cpu_capture = rtd->dai_link->params ? in soc_new_pcm()
2744 int cpu_playback = rtd->dai_link->params ? in soc_new_pcm()
2747 for_each_rtd_codec_dais(rtd, i, codec_dai) { in soc_new_pcm()
2748 if (rtd->num_cpus == 1) { in soc_new_pcm()
2749 cpu_dai = asoc_rtd_to_cpu(rtd, 0); in soc_new_pcm()
2750 } else if (rtd->num_cpus == rtd->num_codecs) { in soc_new_pcm()
2751 cpu_dai = asoc_rtd_to_cpu(rtd, i); in soc_new_pcm()
2753 dev_err(rtd->card->dev, in soc_new_pcm()
2767 if (rtd->dai_link->playback_only) { in soc_new_pcm()
2772 if (rtd->dai_link->capture_only) { in soc_new_pcm()
2778 if (rtd->dai_link->params) { in soc_new_pcm()
2780 rtd->dai_link->stream_name); in soc_new_pcm()
2782 ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num, in soc_new_pcm()
2784 } else if (rtd->dai_link->no_pcm) { in soc_new_pcm()
2786 rtd->dai_link->stream_name); in soc_new_pcm()
2788 ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num, in soc_new_pcm()
2791 if (rtd->dai_link->dynamic) in soc_new_pcm()
2793 rtd->dai_link->stream_name); in soc_new_pcm()
2796 rtd->dai_link->stream_name, in soc_new_pcm()
2797 (rtd->num_codecs > 1) ? in soc_new_pcm()
2798 "multicodec" : asoc_rtd_to_codec(rtd, 0)->name, num); in soc_new_pcm()
2800 ret = snd_pcm_new(rtd->card->snd_card, new_name, num, playback, in soc_new_pcm()
2804 dev_err(rtd->card->dev, "ASoC: can't create pcm %s for dailink %s: %d\n", in soc_new_pcm()
2805 new_name, rtd->dai_link->name, ret); in soc_new_pcm()
2808 dev_dbg(rtd->card->dev, "ASoC: registered pcm #%d %s\n",num, new_name); in soc_new_pcm()
2811 if (rtd->dai_link->params) in soc_new_pcm()
2812 rtd->close_delayed_work_func = codec2codec_close_delayed_work; in soc_new_pcm()
2814 rtd->close_delayed_work_func = snd_soc_close_delayed_work; in soc_new_pcm()
2816 pcm->nonatomic = rtd->dai_link->nonatomic; in soc_new_pcm()
2817 rtd->pcm = pcm; in soc_new_pcm()
2818 pcm->private_data = rtd; in soc_new_pcm()
2820 if (rtd->dai_link->no_pcm || rtd->dai_link->params) { in soc_new_pcm()
2822 pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd; in soc_new_pcm()
2824 pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd; in soc_new_pcm()
2829 if (rtd->dai_link->dynamic) { in soc_new_pcm()
2830 rtd->ops.open = dpcm_fe_dai_open; in soc_new_pcm()
2831 rtd->ops.hw_params = dpcm_fe_dai_hw_params; in soc_new_pcm()
2832 rtd->ops.prepare = dpcm_fe_dai_prepare; in soc_new_pcm()
2833 rtd->ops.trigger = dpcm_fe_dai_trigger; in soc_new_pcm()
2834 rtd->ops.hw_free = dpcm_fe_dai_hw_free; in soc_new_pcm()
2835 rtd->ops.close = dpcm_fe_dai_close; in soc_new_pcm()
2836 rtd->ops.pointer = soc_pcm_pointer; in soc_new_pcm()
2838 rtd->ops.open = soc_pcm_open; in soc_new_pcm()
2839 rtd->ops.hw_params = soc_pcm_hw_params; in soc_new_pcm()
2840 rtd->ops.prepare = soc_pcm_prepare; in soc_new_pcm()
2841 rtd->ops.trigger = soc_pcm_trigger; in soc_new_pcm()
2842 rtd->ops.hw_free = soc_pcm_hw_free; in soc_new_pcm()
2843 rtd->ops.close = soc_pcm_close; in soc_new_pcm()
2844 rtd->ops.pointer = soc_pcm_pointer; in soc_new_pcm()
2847 for_each_rtd_components(rtd, i, component) { in soc_new_pcm()
2851 rtd->ops.ioctl = snd_soc_pcm_component_ioctl; in soc_new_pcm()
2853 rtd->ops.sync_stop = snd_soc_pcm_component_sync_stop; in soc_new_pcm()
2855 rtd->ops.copy_user = snd_soc_pcm_component_copy_user; in soc_new_pcm()
2857 rtd->ops.page = snd_soc_pcm_component_page; in soc_new_pcm()
2859 rtd->ops.mmap = snd_soc_pcm_component_mmap; in soc_new_pcm()
2863 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &rtd->ops); in soc_new_pcm()
2866 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &rtd->ops); in soc_new_pcm()
2868 ret = snd_soc_pcm_component_new(rtd); in soc_new_pcm()
2870 dev_err(rtd->dev, "ASoC: pcm %s constructor failed for dailink %s: %d\n", in soc_new_pcm()
2871 new_name, rtd->dai_link->name, ret); in soc_new_pcm()
2877 dev_dbg(rtd->card->dev, "%s <-> %s mapping ok\n", in soc_new_pcm()
2878 (rtd->num_codecs > 1) ? "multicodec" : asoc_rtd_to_codec(rtd, 0)->name, in soc_new_pcm()
2879 (rtd->num_cpus > 1) ? "multicpu" : asoc_rtd_to_cpu(rtd, 0)->name); in soc_new_pcm()