Lines Matching full:rtd
158 void soc_dpcm_debugfs_add(struct snd_soc_pcm_runtime *rtd) in soc_dpcm_debugfs_add() argument
160 if (!rtd->dai_link) in soc_dpcm_debugfs_add()
163 if (!rtd->dai_link->dynamic) in soc_dpcm_debugfs_add()
166 if (!rtd->card->debugfs_card_root) in soc_dpcm_debugfs_add()
169 rtd->debugfs_dpcm_root = debugfs_create_dir(rtd->dai_link->name, in soc_dpcm_debugfs_add()
170 rtd->card->debugfs_card_root); in soc_dpcm_debugfs_add()
172 debugfs_create_file("state", 0444, rtd->debugfs_dpcm_root, in soc_dpcm_debugfs_add()
173 rtd, &dpcm_state_fops); in soc_dpcm_debugfs_add()
210 * @rtd: ASoC PCM runtime that is activated
218 * Must be called with the rtd->card->pcm_mutex being held
220 void snd_soc_runtime_action(struct snd_soc_pcm_runtime *rtd, in snd_soc_runtime_action() argument
226 lockdep_assert_held(&rtd->card->pcm_mutex); in snd_soc_runtime_action()
228 for_each_rtd_dais(rtd, i, dai) in snd_soc_runtime_action()
235 * @rtd: The ASoC PCM runtime that should be checked.
242 bool snd_soc_runtime_ignore_pmdown_time(struct snd_soc_pcm_runtime *rtd) in snd_soc_runtime_ignore_pmdown_time() argument
248 if (!rtd->pmdown_time || rtd->dai_link->ignore_pmdown_time) in snd_soc_runtime_ignore_pmdown_time()
251 for_each_rtd_components(rtd, i, component) in snd_soc_runtime_ignore_pmdown_time()
308 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_apply_symmetry() local
312 rtd->dai_link->symmetric_rates)) { in soc_pcm_apply_symmetry()
328 rtd->dai_link->symmetric_channels)) { in soc_pcm_apply_symmetry()
344 rtd->dai_link->symmetric_samplebits)) { in soc_pcm_apply_symmetry()
365 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_params_symmetry() local
375 symmetry = rtd->dai_link->symmetric_rates; in soc_pcm_params_symmetry()
377 for_each_rtd_cpu_dais(rtd, i, dai) in soc_pcm_params_symmetry()
381 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_pcm_params_symmetry()
383 dev_err(rtd->dev, "ASoC: unmatched rate symmetry: %d - %d\n", in soc_pcm_params_symmetry()
390 symmetry = rtd->dai_link->symmetric_channels; in soc_pcm_params_symmetry()
392 for_each_rtd_dais(rtd, i, dai) in soc_pcm_params_symmetry()
396 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_pcm_params_symmetry()
399 dev_err(rtd->dev, "ASoC: unmatched channel symmetry: %d - %d\n", in soc_pcm_params_symmetry()
406 symmetry = rtd->dai_link->symmetric_samplebits; in soc_pcm_params_symmetry()
408 for_each_rtd_dais(rtd, i, dai) in soc_pcm_params_symmetry()
412 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_pcm_params_symmetry()
415 dev_err(rtd->dev, "ASoC: unmatched sample bits symmetry: %d - %d\n", in soc_pcm_params_symmetry()
427 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_has_symmetry() local
428 struct snd_soc_dai_link *link = rtd->dai_link; in soc_pcm_has_symmetry()
436 for_each_rtd_dais(rtd, i, dai) in soc_pcm_has_symmetry()
447 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_set_msb() local
455 dev_warn(rtd->dev, "ASoC: Failed to set MSB %d: %d\n", in soc_pcm_set_msb()
461 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_apply_msb() local
469 for_each_rtd_codec_dais(rtd, i, codec_dai) { in soc_pcm_apply_msb()
479 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_pcm_apply_msb()
495 * @rtd: ASoC PCM runtime
502 int snd_soc_runtime_calc_hw(struct snd_soc_pcm_runtime *rtd, in snd_soc_runtime_calc_hw() argument
518 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in snd_soc_runtime_calc_hw()
541 for_each_rtd_codec_dais(rtd, i, codec_dai) { in snd_soc_runtime_calc_hw()
571 if (rtd->num_codecs > 1) { in snd_soc_runtime_calc_hw()
596 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_init_runtime_hw() local
604 snd_soc_runtime_calc_hw(rtd, hw, substream->stream); in soc_pcm_init_runtime_hw()
612 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_components_open() local
616 for_each_rtd_components(rtd, i, component) { in soc_pcm_components_open()
632 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_components_close() local
636 for_each_rtd_components(rtd, i, component) { in soc_pcm_components_close()
649 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_clean() local
654 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); in soc_pcm_clean()
657 snd_soc_runtime_deactivate(rtd, substream->stream); in soc_pcm_clean()
659 for_each_rtd_dais(rtd, i, dai) in soc_pcm_clean()
667 snd_soc_dapm_stream_stop(rtd, substream->stream); in soc_pcm_clean()
669 mutex_unlock(&rtd->card->pcm_mutex); in soc_pcm_clean()
671 snd_soc_pcm_component_pm_runtime_put(rtd, substream, rollback); in soc_pcm_clean()
673 for_each_rtd_components(rtd, i, component) in soc_pcm_clean()
697 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_open() local
705 for_each_rtd_components(rtd, i, component) in soc_pcm_open()
708 ret = snd_soc_pcm_component_pm_runtime_get(rtd, substream); in soc_pcm_open()
712 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); in soc_pcm_open()
723 for_each_rtd_dais(rtd, i, dai) { in soc_pcm_open()
730 if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm) in soc_pcm_open()
736 if (rtd->num_codecs == 1) in soc_pcm_open()
737 codec_dai_name = asoc_rtd_to_codec(rtd, 0)->name; in soc_pcm_open()
739 if (rtd->num_cpus == 1) in soc_pcm_open()
740 cpu_dai_name = asoc_rtd_to_cpu(rtd, 0)->name; in soc_pcm_open()
766 for_each_rtd_dais(rtd, i, dai) { in soc_pcm_open()
782 snd_soc_runtime_activate(rtd, substream->stream); in soc_pcm_open()
785 mutex_unlock(&rtd->card->pcm_mutex); in soc_pcm_open()
793 static void codec2codec_close_delayed_work(struct snd_soc_pcm_runtime *rtd) in codec2codec_close_delayed_work() argument
810 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_prepare() local
814 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); in soc_pcm_prepare()
826 dev_err(rtd->dev, "ASoC: DAI prepare error: %d\n", ret); in soc_pcm_prepare()
832 rtd->pop_wait) { in soc_pcm_prepare()
833 rtd->pop_wait = 0; in soc_pcm_prepare()
834 cancel_delayed_work(&rtd->delayed_work); in soc_pcm_prepare()
837 snd_soc_dapm_stream_event(rtd, substream->stream, in soc_pcm_prepare()
840 for_each_rtd_dais(rtd, i, dai) in soc_pcm_prepare()
844 mutex_unlock(&rtd->card->pcm_mutex); in soc_pcm_prepare()
867 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_hw_params() local
873 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); in soc_pcm_hw_params()
883 for_each_rtd_codec_dais(rtd, i, codec_dai) { in soc_pcm_hw_params()
930 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_pcm_hw_params()
956 mutex_unlock(&rtd->card->pcm_mutex); in soc_pcm_hw_params()
962 i = rtd->num_cpus; in soc_pcm_hw_params()
965 for_each_rtd_cpu_dais_rollback(rtd, i, cpu_dai) { in soc_pcm_hw_params()
973 i = rtd->num_codecs; in soc_pcm_hw_params()
976 for_each_rtd_codec_dais_rollback(rtd, i, codec_dai) { in soc_pcm_hw_params()
986 mutex_unlock(&rtd->card->pcm_mutex); in soc_pcm_hw_params()
995 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_hw_free() local
999 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); in soc_pcm_hw_free()
1002 for_each_rtd_dais(rtd, i, dai) { in soc_pcm_hw_free()
1022 for_each_rtd_dais(rtd, i, dai) { in soc_pcm_hw_free()
1029 mutex_unlock(&rtd->card->pcm_mutex); in soc_pcm_hw_free()
1076 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_pointer() local
1094 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_pcm_pointer()
1100 for_each_rtd_codec_dais(rtd, i, codec_dai) { in soc_pcm_pointer()
1255 struct snd_soc_pcm_runtime *rtd; in dpcm_end_walk_at_be() local
1264 rtd = dpcm_get_be(card, widget, stream); in dpcm_end_walk_at_be()
1265 if (rtd) in dpcm_end_walk_at_be()
1371 /* is there a valid BE rtd for this widget */ in dpcm_add_paths()
1689 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in dpcm_set_fe_runtime() local
1693 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in dpcm_set_fe_runtime()
1763 struct snd_soc_pcm_runtime *rtd; in dpcm_apply_symmetry() local
1771 rtd = asoc_substream_to_rtd(be_substream); in dpcm_apply_symmetry()
1772 if (rtd->dai_link->be_hw_params_fixup) in dpcm_apply_symmetry()
1779 for_each_rtd_dais(rtd, i, dai) { in dpcm_apply_symmetry()
2689 int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) in soc_new_pcm() argument
2700 if (rtd->dai_link->dynamic && rtd->num_cpus > 1) { in soc_new_pcm()
2701 dev_err(rtd->dev, in soc_new_pcm()
2706 if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm) { in soc_new_pcm()
2707 if (rtd->dai_link->dpcm_playback) { in soc_new_pcm()
2710 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_new_pcm()
2718 dev_err(rtd->card->dev, in soc_new_pcm()
2720 rtd->dai_link->stream_name); in soc_new_pcm()
2724 if (rtd->dai_link->dpcm_capture) { in soc_new_pcm()
2727 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_new_pcm()
2735 dev_err(rtd->card->dev, in soc_new_pcm()
2737 rtd->dai_link->stream_name); in soc_new_pcm()
2743 int cpu_capture = rtd->dai_link->params ? in soc_new_pcm()
2745 int cpu_playback = rtd->dai_link->params ? in soc_new_pcm()
2748 for_each_rtd_codec_dais(rtd, i, codec_dai) { in soc_new_pcm()
2749 if (rtd->num_cpus == 1) { in soc_new_pcm()
2750 cpu_dai = asoc_rtd_to_cpu(rtd, 0); in soc_new_pcm()
2751 } else if (rtd->num_cpus == rtd->num_codecs) { in soc_new_pcm()
2752 cpu_dai = asoc_rtd_to_cpu(rtd, i); in soc_new_pcm()
2754 dev_err(rtd->card->dev, in soc_new_pcm()
2768 if (rtd->dai_link->playback_only) { in soc_new_pcm()
2773 if (rtd->dai_link->capture_only) { in soc_new_pcm()
2779 if (rtd->dai_link->params) { in soc_new_pcm()
2781 rtd->dai_link->stream_name); in soc_new_pcm()
2783 ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num, in soc_new_pcm()
2785 } else if (rtd->dai_link->no_pcm) { in soc_new_pcm()
2787 rtd->dai_link->stream_name); in soc_new_pcm()
2789 ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num, in soc_new_pcm()
2792 if (rtd->dai_link->dynamic) in soc_new_pcm()
2794 rtd->dai_link->stream_name); in soc_new_pcm()
2797 rtd->dai_link->stream_name, in soc_new_pcm()
2798 (rtd->num_codecs > 1) ? in soc_new_pcm()
2799 "multicodec" : asoc_rtd_to_codec(rtd, 0)->name, num); in soc_new_pcm()
2801 ret = snd_pcm_new(rtd->card->snd_card, new_name, num, playback, in soc_new_pcm()
2805 dev_err(rtd->card->dev, "ASoC: can't create pcm %s for dailink %s: %d\n", in soc_new_pcm()
2806 new_name, rtd->dai_link->name, ret); in soc_new_pcm()
2809 dev_dbg(rtd->card->dev, "ASoC: registered pcm #%d %s\n",num, new_name); in soc_new_pcm()
2812 if (rtd->dai_link->params) in soc_new_pcm()
2813 rtd->close_delayed_work_func = codec2codec_close_delayed_work; in soc_new_pcm()
2815 rtd->close_delayed_work_func = snd_soc_close_delayed_work; in soc_new_pcm()
2817 pcm->nonatomic = rtd->dai_link->nonatomic; in soc_new_pcm()
2818 rtd->pcm = pcm; in soc_new_pcm()
2819 pcm->private_data = rtd; in soc_new_pcm()
2821 if (rtd->dai_link->no_pcm || rtd->dai_link->params) { in soc_new_pcm()
2823 pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd; in soc_new_pcm()
2825 pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd; in soc_new_pcm()
2830 if (rtd->dai_link->dynamic) { in soc_new_pcm()
2831 rtd->ops.open = dpcm_fe_dai_open; in soc_new_pcm()
2832 rtd->ops.hw_params = dpcm_fe_dai_hw_params; in soc_new_pcm()
2833 rtd->ops.prepare = dpcm_fe_dai_prepare; in soc_new_pcm()
2834 rtd->ops.trigger = dpcm_fe_dai_trigger; in soc_new_pcm()
2835 rtd->ops.hw_free = dpcm_fe_dai_hw_free; in soc_new_pcm()
2836 rtd->ops.close = dpcm_fe_dai_close; in soc_new_pcm()
2837 rtd->ops.pointer = soc_pcm_pointer; in soc_new_pcm()
2839 rtd->ops.open = soc_pcm_open; in soc_new_pcm()
2840 rtd->ops.hw_params = soc_pcm_hw_params; in soc_new_pcm()
2841 rtd->ops.prepare = soc_pcm_prepare; in soc_new_pcm()
2842 rtd->ops.trigger = soc_pcm_trigger; in soc_new_pcm()
2843 rtd->ops.hw_free = soc_pcm_hw_free; in soc_new_pcm()
2844 rtd->ops.close = soc_pcm_close; in soc_new_pcm()
2845 rtd->ops.pointer = soc_pcm_pointer; in soc_new_pcm()
2848 for_each_rtd_components(rtd, i, component) { in soc_new_pcm()
2852 rtd->ops.ioctl = snd_soc_pcm_component_ioctl; in soc_new_pcm()
2854 rtd->ops.sync_stop = snd_soc_pcm_component_sync_stop; in soc_new_pcm()
2856 rtd->ops.copy_user = snd_soc_pcm_component_copy_user; in soc_new_pcm()
2858 rtd->ops.page = snd_soc_pcm_component_page; in soc_new_pcm()
2860 rtd->ops.mmap = snd_soc_pcm_component_mmap; in soc_new_pcm()
2862 rtd->ops.ack = snd_soc_pcm_component_ack; in soc_new_pcm()
2866 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &rtd->ops); in soc_new_pcm()
2869 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &rtd->ops); in soc_new_pcm()
2871 ret = snd_soc_pcm_component_new(rtd); in soc_new_pcm()
2873 dev_err(rtd->dev, "ASoC: pcm %s constructor failed for dailink %s: %d\n", in soc_new_pcm()
2874 new_name, rtd->dai_link->name, ret); in soc_new_pcm()
2880 dev_dbg(rtd->card->dev, "%s <-> %s mapping ok\n", in soc_new_pcm()
2881 (rtd->num_codecs > 1) ? "multicodec" : asoc_rtd_to_codec(rtd, 0)->name, in soc_new_pcm()
2882 (rtd->num_cpus > 1) ? "multicpu" : asoc_rtd_to_cpu(rtd, 0)->name); in soc_new_pcm()