Lines Matching full:rtd
29 #define soc_pcm_ret(rtd, ret) _soc_pcm_ret(rtd, __func__, ret) argument
30 static inline int _soc_pcm_ret(struct snd_soc_pcm_runtime *rtd, in _soc_pcm_ret() argument
43 dev_err(rtd->dev, in _soc_pcm_ret()
45 func, rtd->dai_link->name, ret); in _soc_pcm_ret()
152 static inline const char *soc_cpu_dai_name(struct snd_soc_pcm_runtime *rtd) in soc_cpu_dai_name() argument
154 return (rtd)->dai_link->num_cpus == 1 ? snd_soc_rtd_to_cpu(rtd, 0)->name : "multicpu"; in soc_cpu_dai_name()
156 static inline const char *soc_codec_dai_name(struct snd_soc_pcm_runtime *rtd) in soc_codec_dai_name() argument
158 return (rtd)->dai_link->num_codecs == 1 ? snd_soc_rtd_to_codec(rtd, 0)->name : "multicodec"; in soc_codec_dai_name()
285 void soc_dpcm_debugfs_add(struct snd_soc_pcm_runtime *rtd) in soc_dpcm_debugfs_add() argument
287 if (!rtd->dai_link->dynamic) in soc_dpcm_debugfs_add()
290 if (!rtd->card->debugfs_card_root) in soc_dpcm_debugfs_add()
293 rtd->debugfs_dpcm_root = debugfs_create_dir(rtd->dai_link->name, in soc_dpcm_debugfs_add()
294 rtd->card->debugfs_card_root); in soc_dpcm_debugfs_add()
296 debugfs_create_file("state", 0444, rtd->debugfs_dpcm_root, in soc_dpcm_debugfs_add()
297 rtd, &dpcm_state_fops); in soc_dpcm_debugfs_add()
362 * @rtd: ASoC PCM runtime that is activated
370 * Must be called with the rtd->card->pcm_mutex being held
372 void snd_soc_runtime_action(struct snd_soc_pcm_runtime *rtd, in snd_soc_runtime_action() argument
379 snd_soc_dpcm_mutex_assert_held(rtd); in snd_soc_runtime_action()
381 for_each_rtd_dais(rtd, i, dai) in snd_soc_runtime_action()
385 for_each_rtd_components(rtd, i, component) { in snd_soc_runtime_action()
395 * @rtd: The ASoC PCM runtime that should be checked.
402 bool snd_soc_runtime_ignore_pmdown_time(struct snd_soc_pcm_runtime *rtd) in snd_soc_runtime_ignore_pmdown_time() argument
407 if (!rtd->pmdown_time || rtd->dai_link->ignore_pmdown_time) in snd_soc_runtime_ignore_pmdown_time()
410 for_each_rtd_components(rtd, i, component) in snd_soc_runtime_ignore_pmdown_time()
462 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_apply_symmetry() local
470 (soc_dai->driver->symmetric_##name || rtd->dai_link->symmetric_##name)) { \ in soc_pcm_apply_symmetry()
495 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_params_symmetry() local
505 symmetry = rtd->dai_link->symmetric_##xxx; \ in soc_pcm_params_symmetry()
506 for_each_rtd_dais(rtd, i, dai) \ in soc_pcm_params_symmetry()
510 for_each_rtd_cpu_dais(rtd, i, cpu_dai) \ in soc_pcm_params_symmetry()
514 dev_err(rtd->dev, "ASoC: unmatched %s symmetry: %s:%d - %s:%d\n", \ in soc_pcm_params_symmetry()
530 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_update_symmetry() local
531 struct snd_soc_dai_link *link = rtd->dai_link; in soc_pcm_update_symmetry()
539 for_each_rtd_dais(rtd, i, dai) in soc_pcm_update_symmetry()
551 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_set_msb() local
559 dev_warn(rtd->dev, "ASoC: Failed to set MSB %d: %d\n", in soc_pcm_set_msb()
565 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_apply_msb() local
572 for_each_rtd_codec_dais(rtd, i, codec_dai) { in soc_pcm_apply_msb()
582 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_pcm_apply_msb()
640 * @rtd: ASoC PCM runtime
647 int snd_soc_runtime_calc_hw(struct snd_soc_pcm_runtime *rtd, in snd_soc_runtime_calc_hw() argument
660 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in snd_soc_runtime_calc_hw()
682 for_each_rtd_codec_dais(rtd, i, codec_dai) { in snd_soc_runtime_calc_hw()
710 if (rtd->dai_link->num_codecs > 1) { in snd_soc_runtime_calc_hw()
722 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_init_runtime_hw() local
730 snd_soc_runtime_calc_hw(rtd, hw, substream->stream); in soc_pcm_init_runtime_hw()
738 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_components_open() local
742 for_each_rtd_components(rtd, i, component) { in soc_pcm_components_open()
758 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_components_close() local
762 for_each_rtd_components(rtd, i, component) { in soc_pcm_components_close()
773 static int soc_pcm_clean(struct snd_soc_pcm_runtime *rtd, in soc_pcm_clean() argument
780 snd_soc_dpcm_mutex_assert_held(rtd); in soc_pcm_clean()
783 snd_soc_runtime_deactivate(rtd, substream->stream); in soc_pcm_clean()
786 for_each_rtd_dais(rtd, i, dai) { in soc_pcm_clean()
792 for_each_rtd_dais_reverse(rtd, i, dai) in soc_pcm_clean()
799 snd_soc_pcm_component_pm_runtime_put(rtd, substream, rollback); in soc_pcm_clean()
801 for_each_rtd_components(rtd, i, component) in soc_pcm_clean()
813 static int __soc_pcm_close(struct snd_soc_pcm_runtime *rtd, in __soc_pcm_close() argument
816 return soc_pcm_clean(rtd, substream, 0); in __soc_pcm_close()
822 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_close() local
824 snd_soc_dpcm_mutex_lock(rtd); in soc_pcm_close()
825 __soc_pcm_close(rtd, substream); in soc_pcm_close()
826 snd_soc_dpcm_mutex_unlock(rtd); in soc_pcm_close()
832 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_hw_sanity_check() local
834 const char *name_cpu = soc_cpu_dai_name(rtd); in soc_hw_sanity_check()
835 const char *name_codec = soc_codec_dai_name(rtd); in soc_hw_sanity_check()
837 struct device *dev = rtd->dev; in soc_hw_sanity_check()
873 static int __soc_pcm_open(struct snd_soc_pcm_runtime *rtd, in __soc_pcm_open() argument
880 snd_soc_dpcm_mutex_assert_held(rtd); in __soc_pcm_open()
882 for_each_rtd_components(rtd, i, component) in __soc_pcm_open()
885 ret = snd_soc_pcm_component_pm_runtime_get(rtd, substream); in __soc_pcm_open()
898 for_each_rtd_dais(rtd, i, dai) { in __soc_pcm_open()
905 if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm) in __soc_pcm_open()
920 for_each_rtd_dais(rtd, i, dai) { in __soc_pcm_open()
926 snd_soc_runtime_activate(rtd, substream->stream); in __soc_pcm_open()
930 soc_pcm_clean(rtd, substream, 1); in __soc_pcm_open()
932 return soc_pcm_ret(rtd, ret); in __soc_pcm_open()
938 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_open() local
941 snd_soc_dpcm_mutex_lock(rtd); in soc_pcm_open()
942 ret = __soc_pcm_open(rtd, substream); in soc_pcm_open()
943 snd_soc_dpcm_mutex_unlock(rtd); in soc_pcm_open()
952 static int __soc_pcm_prepare(struct snd_soc_pcm_runtime *rtd, in __soc_pcm_prepare() argument
958 snd_soc_dpcm_mutex_assert_held(rtd); in __soc_pcm_prepare()
974 rtd->pop_wait) { in __soc_pcm_prepare()
975 rtd->pop_wait = 0; in __soc_pcm_prepare()
976 cancel_delayed_work(&rtd->delayed_work); in __soc_pcm_prepare()
979 snd_soc_dapm_stream_event(rtd, substream->stream, in __soc_pcm_prepare()
982 for_each_rtd_dais(rtd, i, dai) { in __soc_pcm_prepare()
1000 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_prepare() local
1003 snd_soc_dpcm_mutex_lock(rtd); in soc_pcm_prepare()
1004 ret = __soc_pcm_prepare(rtd, substream); in soc_pcm_prepare()
1005 snd_soc_dpcm_mutex_unlock(rtd); in soc_pcm_prepare()
1027 static int soc_pcm_hw_clean(struct snd_soc_pcm_runtime *rtd, in soc_pcm_hw_clean() argument
1033 snd_soc_dpcm_mutex_assert_held(rtd); in soc_pcm_hw_clean()
1036 for_each_rtd_dais(rtd, i, dai) { in soc_pcm_hw_clean()
1047 snd_soc_dapm_stream_stop(rtd, substream->stream); in soc_pcm_hw_clean()
1056 for_each_rtd_dais(rtd, i, dai) in soc_pcm_hw_clean()
1066 static int __soc_pcm_hw_free(struct snd_soc_pcm_runtime *rtd, in __soc_pcm_hw_free() argument
1069 return soc_pcm_hw_clean(rtd, substream, 0); in __soc_pcm_hw_free()
1075 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_hw_free() local
1078 snd_soc_dpcm_mutex_lock(rtd); in soc_pcm_hw_free()
1079 ret = __soc_pcm_hw_free(rtd, substream); in soc_pcm_hw_free()
1080 snd_soc_dpcm_mutex_unlock(rtd); in soc_pcm_hw_free()
1089 static int __soc_pcm_hw_params(struct snd_soc_pcm_runtime *rtd, in __soc_pcm_hw_params() argument
1098 snd_soc_dpcm_mutex_assert_held(rtd); in __soc_pcm_hw_params()
1108 for_each_rtd_codec_dais(rtd, i, codec_dai) { in __soc_pcm_hw_params()
1144 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in __soc_pcm_hw_params()
1165 for_each_rtd_ch_maps(rtd, j, ch_maps) in __soc_pcm_hw_params()
1185 soc_pcm_hw_clean(rtd, substream, 1); in __soc_pcm_hw_params()
1187 return soc_pcm_ret(rtd, ret); in __soc_pcm_hw_params()
1194 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_hw_params() local
1197 snd_soc_dpcm_mutex_lock(rtd); in soc_pcm_hw_params()
1198 ret = __soc_pcm_hw_params(rtd, substream, params); in soc_pcm_hw_params()
1199 snd_soc_dpcm_mutex_unlock(rtd); in soc_pcm_hw_params()
1219 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_trigger() local
1228 for_each_rtd_components(rtd, i, component) { in soc_pcm_trigger()
1234 if (rtd->dai_link->trigger_start) in soc_pcm_trigger()
1235 start = rtd->dai_link->trigger_start; in soc_pcm_trigger()
1236 if (rtd->dai_link->trigger_stop) in soc_pcm_trigger()
1237 stop = rtd->dai_link->trigger_stop; in soc_pcm_trigger()
1487 struct snd_soc_pcm_runtime *rtd; in dpcm_end_walk_at_be() local
1496 rtd = dpcm_get_be(card, widget, stream); in dpcm_end_walk_at_be()
1497 if (rtd) in dpcm_end_walk_at_be()
1610 /* is there a valid BE rtd for this widget */ in dpcm_add_paths()
1960 struct snd_soc_pcm_runtime *rtd; in dpcm_apply_symmetry() local
1967 rtd = snd_soc_substream_to_rtd(be_substream); in dpcm_apply_symmetry()
1968 if (rtd->dai_link->be_hw_params_fixup) in dpcm_apply_symmetry()
1974 for_each_rtd_dais(rtd, i, dai) { in dpcm_apply_symmetry()
2845 static int soc_get_playback_capture(struct snd_soc_pcm_runtime *rtd, in soc_get_playback_capture() argument
2848 struct snd_soc_dai_link *dai_link = rtd->dai_link; in soc_get_playback_capture()
2860 dev_err(rtd->dev, "DPCM doesn't support Multi CPU for Front-Ends yet\n"); in soc_get_playback_capture()
2872 for_each_rtd_ch_maps(rtd, i, ch_maps) { in soc_get_playback_capture()
2873 cpu_dai = snd_soc_rtd_to_cpu(rtd, ch_maps->cpu); in soc_get_playback_capture()
2874 codec_dai = snd_soc_rtd_to_codec(rtd, ch_maps->codec); in soc_get_playback_capture()
2905 dev_err(rtd->dev, "substream %s has no playback, no capture\n", in soc_get_playback_capture()
2918 struct snd_soc_pcm_runtime *rtd, in soc_create_pcm() argument
2925 if (rtd->dai_link->c2c_params) { in soc_create_pcm()
2927 rtd->dai_link->stream_name); in soc_create_pcm()
2929 ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, rtd->id, in soc_create_pcm()
2931 } else if (rtd->dai_link->no_pcm) { in soc_create_pcm()
2933 rtd->dai_link->stream_name); in soc_create_pcm()
2935 ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, rtd->id, in soc_create_pcm()
2938 if (rtd->dai_link->dynamic) in soc_create_pcm()
2940 rtd->dai_link->stream_name); in soc_create_pcm()
2943 rtd->dai_link->stream_name, in soc_create_pcm()
2944 soc_codec_dai_name(rtd), rtd->id); in soc_create_pcm()
2946 ret = snd_pcm_new(rtd->card->snd_card, new_name, rtd->id, playback, in soc_create_pcm()
2950 dev_err(rtd->card->dev, "ASoC: can't create pcm %s for dailink %s: %d\n", in soc_create_pcm()
2951 new_name, rtd->dai_link->name, ret); in soc_create_pcm()
2954 dev_dbg(rtd->card->dev, "ASoC: registered pcm #%d %s\n", rtd->id, new_name); in soc_create_pcm()
2960 int soc_new_pcm(struct snd_soc_pcm_runtime *rtd) in soc_new_pcm() argument
2967 ret = soc_get_playback_capture(rtd, &playback, &capture); in soc_new_pcm()
2971 ret = soc_create_pcm(&pcm, rtd, playback, capture); in soc_new_pcm()
2982 if (!rtd->dai_link->c2c_params) in soc_new_pcm()
2983 rtd->close_delayed_work_func = snd_soc_close_delayed_work; in soc_new_pcm()
2985 rtd->pcm = pcm; in soc_new_pcm()
2986 pcm->nonatomic = rtd->dai_link->nonatomic; in soc_new_pcm()
2987 pcm->private_data = rtd; in soc_new_pcm()
2990 if (rtd->dai_link->no_pcm || rtd->dai_link->c2c_params) { in soc_new_pcm()
2992 pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd; in soc_new_pcm()
2994 pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd; in soc_new_pcm()
2999 if (rtd->dai_link->dynamic) { in soc_new_pcm()
3000 rtd->ops.open = dpcm_fe_dai_open; in soc_new_pcm()
3001 rtd->ops.hw_params = dpcm_fe_dai_hw_params; in soc_new_pcm()
3002 rtd->ops.prepare = dpcm_fe_dai_prepare; in soc_new_pcm()
3003 rtd->ops.trigger = dpcm_fe_dai_trigger; in soc_new_pcm()
3004 rtd->ops.hw_free = dpcm_fe_dai_hw_free; in soc_new_pcm()
3005 rtd->ops.close = dpcm_fe_dai_close; in soc_new_pcm()
3006 rtd->ops.pointer = soc_pcm_pointer; in soc_new_pcm()
3008 rtd->ops.open = soc_pcm_open; in soc_new_pcm()
3009 rtd->ops.hw_params = soc_pcm_hw_params; in soc_new_pcm()
3010 rtd->ops.prepare = soc_pcm_prepare; in soc_new_pcm()
3011 rtd->ops.trigger = soc_pcm_trigger; in soc_new_pcm()
3012 rtd->ops.hw_free = soc_pcm_hw_free; in soc_new_pcm()
3013 rtd->ops.close = soc_pcm_close; in soc_new_pcm()
3014 rtd->ops.pointer = soc_pcm_pointer; in soc_new_pcm()
3017 for_each_rtd_components(rtd, i, component) { in soc_new_pcm()
3021 rtd->ops.ioctl = snd_soc_pcm_component_ioctl; in soc_new_pcm()
3023 rtd->ops.sync_stop = snd_soc_pcm_component_sync_stop; in soc_new_pcm()
3025 rtd->ops.copy = snd_soc_pcm_component_copy; in soc_new_pcm()
3027 rtd->ops.page = snd_soc_pcm_component_page; in soc_new_pcm()
3029 rtd->ops.mmap = snd_soc_pcm_component_mmap; in soc_new_pcm()
3031 rtd->ops.ack = snd_soc_pcm_component_ack; in soc_new_pcm()
3035 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &rtd->ops); in soc_new_pcm()
3038 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &rtd->ops); in soc_new_pcm()
3040 ret = snd_soc_pcm_component_new(rtd); in soc_new_pcm()
3044 dev_dbg(rtd->card->dev, "%s <-> %s mapping ok\n", in soc_new_pcm()
3045 soc_codec_dai_name(rtd), soc_cpu_dai_name(rtd)); in soc_new_pcm()