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
44 dev_err(rtd->dev, in _soc_pcm_ret()
46 func, rtd->dai_link->name, ret); in _soc_pcm_ret()
52 static inline void snd_soc_dpcm_stream_lock_irq(struct snd_soc_pcm_runtime *rtd, in snd_soc_dpcm_stream_lock_irq() argument
55 snd_pcm_stream_lock_irq(snd_soc_dpcm_get_substream(rtd, stream)); in snd_soc_dpcm_stream_lock_irq()
58 #define snd_soc_dpcm_stream_lock_irqsave_nested(rtd, stream, flags) \ argument
59 snd_pcm_stream_lock_irqsave_nested(snd_soc_dpcm_get_substream(rtd, stream), flags)
61 static inline void snd_soc_dpcm_stream_unlock_irq(struct snd_soc_pcm_runtime *rtd, in snd_soc_dpcm_stream_unlock_irq() argument
64 snd_pcm_stream_unlock_irq(snd_soc_dpcm_get_substream(rtd, stream)); in snd_soc_dpcm_stream_unlock_irq()
67 #define snd_soc_dpcm_stream_unlock_irqrestore(rtd, stream, flags) \ argument
68 snd_pcm_stream_unlock_irqrestore(snd_soc_dpcm_get_substream(rtd, stream), flags)
72 static inline const char *soc_cpu_dai_name(struct snd_soc_pcm_runtime *rtd) in soc_cpu_dai_name() argument
74 return (rtd)->dai_link->num_cpus == 1 ? snd_soc_rtd_to_cpu(rtd, 0)->name : "multicpu"; in soc_cpu_dai_name()
76 static inline const char *soc_codec_dai_name(struct snd_soc_pcm_runtime *rtd) in soc_codec_dai_name() argument
78 return (rtd)->dai_link->num_codecs == 1 ? snd_soc_rtd_to_codec(rtd, 0)->name : "multicodec"; in soc_codec_dai_name()
205 void soc_dpcm_debugfs_add(struct snd_soc_pcm_runtime *rtd) in soc_dpcm_debugfs_add() argument
207 if (!rtd->dai_link->dynamic) in soc_dpcm_debugfs_add()
210 if (!rtd->card->debugfs_card_root) in soc_dpcm_debugfs_add()
213 rtd->debugfs_dpcm_root = debugfs_create_dir(rtd->dai_link->name, in soc_dpcm_debugfs_add()
214 rtd->card->debugfs_card_root); in soc_dpcm_debugfs_add()
216 debugfs_create_file("state", 0444, rtd->debugfs_dpcm_root, in soc_dpcm_debugfs_add()
217 rtd, &dpcm_state_fops); in soc_dpcm_debugfs_add()
282 * @rtd: ASoC PCM runtime that is activated
290 * Must be called with the rtd->card->pcm_mutex being held
292 void snd_soc_runtime_action(struct snd_soc_pcm_runtime *rtd, in snd_soc_runtime_action() argument
299 snd_soc_dpcm_mutex_assert_held(rtd); in snd_soc_runtime_action()
301 for_each_rtd_dais(rtd, i, dai) in snd_soc_runtime_action()
305 for_each_rtd_components(rtd, i, component) { in snd_soc_runtime_action()
315 * @rtd: The ASoC PCM runtime that should be checked.
322 bool snd_soc_runtime_ignore_pmdown_time(struct snd_soc_pcm_runtime *rtd) in snd_soc_runtime_ignore_pmdown_time() argument
328 if (!rtd->pmdown_time || rtd->dai_link->ignore_pmdown_time) in snd_soc_runtime_ignore_pmdown_time()
331 for_each_rtd_components(rtd, i, component) in snd_soc_runtime_ignore_pmdown_time()
397 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_apply_symmetry() local
405 rtd->dai_link->symmetric_##name)) { \ in soc_pcm_apply_symmetry()
430 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_params_symmetry() local
440 symmetry = rtd->dai_link->symmetric_##xxx; \ in soc_pcm_params_symmetry()
441 for_each_rtd_dais(rtd, i, dai) \ in soc_pcm_params_symmetry()
445 for_each_rtd_cpu_dais(rtd, i, cpu_dai) \ in soc_pcm_params_symmetry()
448 dev_err(rtd->dev, "ASoC: unmatched %s symmetry: %s:%d - %s:%d\n", \ in soc_pcm_params_symmetry()
463 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_update_symmetry() local
464 struct snd_soc_dai_link *link = rtd->dai_link; in soc_pcm_update_symmetry()
472 for_each_rtd_dais(rtd, i, dai) in soc_pcm_update_symmetry()
484 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_set_msb() local
492 dev_warn(rtd->dev, "ASoC: Failed to set MSB %d: %d\n", in soc_pcm_set_msb()
498 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_apply_msb() local
505 for_each_rtd_codec_dais(rtd, i, codec_dai) { in soc_pcm_apply_msb()
515 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_pcm_apply_msb()
573 * @rtd: ASoC PCM runtime
580 int snd_soc_runtime_calc_hw(struct snd_soc_pcm_runtime *rtd, in snd_soc_runtime_calc_hw() argument
593 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in snd_soc_runtime_calc_hw()
615 for_each_rtd_codec_dais(rtd, i, codec_dai) { in snd_soc_runtime_calc_hw()
643 if (rtd->dai_link->num_codecs > 1) { in snd_soc_runtime_calc_hw()
655 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_init_runtime_hw() local
663 snd_soc_runtime_calc_hw(rtd, hw, substream->stream); in soc_pcm_init_runtime_hw()
671 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_components_open() local
675 for_each_rtd_components(rtd, i, component) { in soc_pcm_components_open()
691 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_components_close() local
695 for_each_rtd_components(rtd, i, component) { in soc_pcm_components_close()
706 static int soc_pcm_clean(struct snd_soc_pcm_runtime *rtd, in soc_pcm_clean() argument
713 snd_soc_dpcm_mutex_assert_held(rtd); in soc_pcm_clean()
716 snd_soc_runtime_deactivate(rtd, substream->stream); in soc_pcm_clean()
719 for_each_rtd_dais(rtd, i, dai) { in soc_pcm_clean()
726 for_each_rtd_dais(rtd, i, dai) in soc_pcm_clean()
733 snd_soc_pcm_component_pm_runtime_put(rtd, substream, rollback); in soc_pcm_clean()
735 for_each_rtd_components(rtd, i, component) in soc_pcm_clean()
747 static int __soc_pcm_close(struct snd_soc_pcm_runtime *rtd, in __soc_pcm_close() argument
750 return soc_pcm_clean(rtd, substream, 0); in __soc_pcm_close()
756 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_close() local
758 snd_soc_dpcm_mutex_lock(rtd); in soc_pcm_close()
759 __soc_pcm_close(rtd, substream); in soc_pcm_close()
760 snd_soc_dpcm_mutex_unlock(rtd); in soc_pcm_close()
766 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_hw_sanity_check() local
768 const char *name_cpu = soc_cpu_dai_name(rtd); in soc_hw_sanity_check()
769 const char *name_codec = soc_codec_dai_name(rtd); in soc_hw_sanity_check()
771 struct device *dev = rtd->dev; in soc_hw_sanity_check()
807 static int __soc_pcm_open(struct snd_soc_pcm_runtime *rtd, in __soc_pcm_open() argument
814 snd_soc_dpcm_mutex_assert_held(rtd); in __soc_pcm_open()
816 for_each_rtd_components(rtd, i, component) in __soc_pcm_open()
819 ret = snd_soc_pcm_component_pm_runtime_get(rtd, substream); in __soc_pcm_open()
832 for_each_rtd_dais(rtd, i, dai) { in __soc_pcm_open()
839 if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm) in __soc_pcm_open()
854 for_each_rtd_dais(rtd, i, dai) { in __soc_pcm_open()
860 snd_soc_runtime_activate(rtd, substream->stream); in __soc_pcm_open()
864 soc_pcm_clean(rtd, substream, 1); in __soc_pcm_open()
866 return soc_pcm_ret(rtd, ret); in __soc_pcm_open()
872 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_open() local
875 snd_soc_dpcm_mutex_lock(rtd); in soc_pcm_open()
876 ret = __soc_pcm_open(rtd, substream); in soc_pcm_open()
877 snd_soc_dpcm_mutex_unlock(rtd); in soc_pcm_open()
886 static int __soc_pcm_prepare(struct snd_soc_pcm_runtime *rtd, in __soc_pcm_prepare() argument
892 snd_soc_dpcm_mutex_assert_held(rtd); in __soc_pcm_prepare()
908 rtd->pop_wait) { in __soc_pcm_prepare()
909 rtd->pop_wait = 0; in __soc_pcm_prepare()
910 cancel_delayed_work(&rtd->delayed_work); in __soc_pcm_prepare()
913 snd_soc_dapm_stream_event(rtd, substream->stream, in __soc_pcm_prepare()
916 for_each_rtd_dais(rtd, i, dai) { in __soc_pcm_prepare()
922 return soc_pcm_ret(rtd, ret); in __soc_pcm_prepare()
928 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_prepare() local
931 snd_soc_dpcm_mutex_lock(rtd); in soc_pcm_prepare()
932 ret = __soc_pcm_prepare(rtd, substream); in soc_pcm_prepare()
933 snd_soc_dpcm_mutex_unlock(rtd); in soc_pcm_prepare()
948 static int soc_pcm_hw_clean(struct snd_soc_pcm_runtime *rtd, in soc_pcm_hw_clean() argument
954 snd_soc_dpcm_mutex_assert_held(rtd); in soc_pcm_hw_clean()
957 for_each_rtd_dais(rtd, i, dai) { in soc_pcm_hw_clean()
968 snd_soc_dapm_stream_stop(rtd, substream->stream); in soc_pcm_hw_clean()
977 for_each_rtd_dais(rtd, i, dai) in soc_pcm_hw_clean()
987 static int __soc_pcm_hw_free(struct snd_soc_pcm_runtime *rtd, in __soc_pcm_hw_free() argument
990 return soc_pcm_hw_clean(rtd, substream, 0); in __soc_pcm_hw_free()
996 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_hw_free() local
999 snd_soc_dpcm_mutex_lock(rtd); in soc_pcm_hw_free()
1000 ret = __soc_pcm_hw_free(rtd, substream); in soc_pcm_hw_free()
1001 snd_soc_dpcm_mutex_unlock(rtd); in soc_pcm_hw_free()
1010 static int __soc_pcm_hw_params(struct snd_soc_pcm_runtime *rtd, in __soc_pcm_hw_params() argument
1019 snd_soc_dpcm_mutex_assert_held(rtd); in __soc_pcm_hw_params()
1029 for_each_rtd_codec_dais(rtd, i, codec_dai) { in __soc_pcm_hw_params()
1065 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in __soc_pcm_hw_params()
1086 for_each_rtd_ch_maps(rtd, j, ch_maps) in __soc_pcm_hw_params()
1106 soc_pcm_hw_clean(rtd, substream, 1); in __soc_pcm_hw_params()
1108 return soc_pcm_ret(rtd, ret); in __soc_pcm_hw_params()
1115 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_hw_params() local
1118 snd_soc_dpcm_mutex_lock(rtd); in soc_pcm_hw_params()
1119 ret = __soc_pcm_hw_params(rtd, substream, params); in soc_pcm_hw_params()
1120 snd_soc_dpcm_mutex_unlock(rtd); in soc_pcm_hw_params()
1140 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); in soc_pcm_trigger() local
1149 for_each_rtd_components(rtd, i, component) { in soc_pcm_trigger()
1155 if (rtd->dai_link->trigger_start) in soc_pcm_trigger()
1156 start = rtd->dai_link->trigger_start; in soc_pcm_trigger()
1157 if (rtd->dai_link->trigger_stop) in soc_pcm_trigger()
1158 stop = rtd->dai_link->trigger_stop; in soc_pcm_trigger()
1407 struct snd_soc_pcm_runtime *rtd; in dpcm_end_walk_at_be() local
1416 rtd = dpcm_get_be(card, widget, stream); in dpcm_end_walk_at_be()
1417 if (rtd) in dpcm_end_walk_at_be()
1530 /* is there a valid BE rtd for this widget */ in dpcm_add_paths()
1880 struct snd_soc_pcm_runtime *rtd; in dpcm_apply_symmetry() local
1887 rtd = snd_soc_substream_to_rtd(be_substream); in dpcm_apply_symmetry()
1888 if (rtd->dai_link->be_hw_params_fixup) in dpcm_apply_symmetry()
1894 for_each_rtd_dais(rtd, i, dai) { in dpcm_apply_symmetry()
2792 static int soc_get_playback_capture(struct snd_soc_pcm_runtime *rtd, in soc_get_playback_capture() argument
2795 struct snd_soc_dai_link *dai_link = rtd->dai_link; in soc_get_playback_capture()
2802 dev_err(rtd->dev, "DPCM doesn't support Multi CPU for Front-Ends yet\n"); in soc_get_playback_capture()
2812 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_get_playback_capture()
2819 dev_err(rtd->card->dev, in soc_get_playback_capture()
2828 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_get_playback_capture()
2836 dev_err(rtd->card->dev, in soc_get_playback_capture()
2854 for_each_rtd_ch_maps(rtd, i, ch_maps) { in soc_get_playback_capture()
2855 cpu_dai = snd_soc_rtd_to_cpu(rtd, ch_maps->cpu); in soc_get_playback_capture()
2856 codec_dai = snd_soc_rtd_to_codec(rtd, ch_maps->codec); in soc_get_playback_capture()
2874 dev_err(rtd->dev, "substream %s has no playback, no capture\n", in soc_get_playback_capture()
2887 struct snd_soc_pcm_runtime *rtd, in soc_create_pcm() argument
2894 if (rtd->dai_link->c2c_params) { in soc_create_pcm()
2896 rtd->dai_link->stream_name); in soc_create_pcm()
2898 ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num, in soc_create_pcm()
2900 } else if (rtd->dai_link->no_pcm) { in soc_create_pcm()
2902 rtd->dai_link->stream_name); in soc_create_pcm()
2904 ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num, in soc_create_pcm()
2907 if (rtd->dai_link->dynamic) in soc_create_pcm()
2909 rtd->dai_link->stream_name); in soc_create_pcm()
2912 rtd->dai_link->stream_name, in soc_create_pcm()
2913 soc_codec_dai_name(rtd), num); in soc_create_pcm()
2915 ret = snd_pcm_new(rtd->card->snd_card, new_name, num, playback, in soc_create_pcm()
2919 dev_err(rtd->card->dev, "ASoC: can't create pcm %s for dailink %s: %d\n", in soc_create_pcm()
2920 new_name, rtd->dai_link->name, ret); in soc_create_pcm()
2923 dev_dbg(rtd->card->dev, "ASoC: registered pcm #%d %s\n",num, new_name); in soc_create_pcm()
2929 int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) in soc_new_pcm() argument
2936 ret = soc_get_playback_capture(rtd, &playback, &capture); in soc_new_pcm()
2940 ret = soc_create_pcm(&pcm, rtd, playback, capture, num); in soc_new_pcm()
2951 if (!rtd->dai_link->c2c_params) in soc_new_pcm()
2952 rtd->close_delayed_work_func = snd_soc_close_delayed_work; in soc_new_pcm()
2954 rtd->pcm = pcm; in soc_new_pcm()
2955 pcm->nonatomic = rtd->dai_link->nonatomic; in soc_new_pcm()
2956 pcm->private_data = rtd; in soc_new_pcm()
2959 if (rtd->dai_link->no_pcm || rtd->dai_link->c2c_params) { in soc_new_pcm()
2961 pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd; in soc_new_pcm()
2963 pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd; in soc_new_pcm()
2968 if (rtd->dai_link->dynamic) { in soc_new_pcm()
2969 rtd->ops.open = dpcm_fe_dai_open; in soc_new_pcm()
2970 rtd->ops.hw_params = dpcm_fe_dai_hw_params; in soc_new_pcm()
2971 rtd->ops.prepare = dpcm_fe_dai_prepare; in soc_new_pcm()
2972 rtd->ops.trigger = dpcm_fe_dai_trigger; in soc_new_pcm()
2973 rtd->ops.hw_free = dpcm_fe_dai_hw_free; in soc_new_pcm()
2974 rtd->ops.close = dpcm_fe_dai_close; in soc_new_pcm()
2975 rtd->ops.pointer = soc_pcm_pointer; in soc_new_pcm()
2977 rtd->ops.open = soc_pcm_open; in soc_new_pcm()
2978 rtd->ops.hw_params = soc_pcm_hw_params; in soc_new_pcm()
2979 rtd->ops.prepare = soc_pcm_prepare; in soc_new_pcm()
2980 rtd->ops.trigger = soc_pcm_trigger; in soc_new_pcm()
2981 rtd->ops.hw_free = soc_pcm_hw_free; in soc_new_pcm()
2982 rtd->ops.close = soc_pcm_close; in soc_new_pcm()
2983 rtd->ops.pointer = soc_pcm_pointer; in soc_new_pcm()
2986 for_each_rtd_components(rtd, i, component) { in soc_new_pcm()
2990 rtd->ops.ioctl = snd_soc_pcm_component_ioctl; in soc_new_pcm()
2992 rtd->ops.sync_stop = snd_soc_pcm_component_sync_stop; in soc_new_pcm()
2994 rtd->ops.copy = snd_soc_pcm_component_copy; in soc_new_pcm()
2996 rtd->ops.page = snd_soc_pcm_component_page; in soc_new_pcm()
2998 rtd->ops.mmap = snd_soc_pcm_component_mmap; in soc_new_pcm()
3000 rtd->ops.ack = snd_soc_pcm_component_ack; in soc_new_pcm()
3004 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &rtd->ops); in soc_new_pcm()
3007 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &rtd->ops); in soc_new_pcm()
3009 ret = snd_soc_pcm_component_new(rtd); in soc_new_pcm()
3013 dev_dbg(rtd->card->dev, "%s <-> %s mapping ok\n", in soc_new_pcm()
3014 soc_codec_dai_name(rtd), soc_cpu_dai_name(rtd)); in soc_new_pcm()