• Home
  • Raw
  • Download

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 ? asoc_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 ? asoc_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
298 snd_soc_dpcm_mutex_assert_held(rtd); in snd_soc_runtime_action()
300 for_each_rtd_dais(rtd, i, dai) in snd_soc_runtime_action()
307 * @rtd: The ASoC PCM runtime that should be checked.
314 bool snd_soc_runtime_ignore_pmdown_time(struct snd_soc_pcm_runtime *rtd) in snd_soc_runtime_ignore_pmdown_time() argument
320 if (!rtd->pmdown_time || rtd->dai_link->ignore_pmdown_time) in snd_soc_runtime_ignore_pmdown_time()
323 for_each_rtd_components(rtd, i, component) in snd_soc_runtime_ignore_pmdown_time()
389 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_apply_symmetry() local
397 rtd->dai_link->symmetric_##name)) { \ in soc_pcm_apply_symmetry()
422 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_params_symmetry() local
432 symmetry = rtd->dai_link->symmetric_##xxx; \ in soc_pcm_params_symmetry()
433 for_each_rtd_dais(rtd, i, dai) \ in soc_pcm_params_symmetry()
437 for_each_rtd_cpu_dais(rtd, i, cpu_dai) \ in soc_pcm_params_symmetry()
440 dev_err(rtd->dev, "ASoC: unmatched %s symmetry: %s:%d - %s:%d\n", \ in soc_pcm_params_symmetry()
455 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_update_symmetry() local
456 struct snd_soc_dai_link *link = rtd->dai_link; in soc_pcm_update_symmetry()
464 for_each_rtd_dais(rtd, i, dai) in soc_pcm_update_symmetry()
476 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_set_msb() local
484 dev_warn(rtd->dev, "ASoC: Failed to set MSB %d: %d\n", in soc_pcm_set_msb()
490 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_apply_msb() local
497 for_each_rtd_codec_dais(rtd, i, codec_dai) { in soc_pcm_apply_msb()
507 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_pcm_apply_msb()
559 * @rtd: ASoC PCM runtime
566 int snd_soc_runtime_calc_hw(struct snd_soc_pcm_runtime *rtd, in snd_soc_runtime_calc_hw() argument
579 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in snd_soc_runtime_calc_hw()
600 for_each_rtd_codec_dais(rtd, i, codec_dai) { in snd_soc_runtime_calc_hw()
627 if (rtd->dai_link->num_codecs > 1) { in snd_soc_runtime_calc_hw()
639 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_init_runtime_hw() local
647 snd_soc_runtime_calc_hw(rtd, hw, substream->stream); in soc_pcm_init_runtime_hw()
655 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_components_open() local
659 for_each_rtd_components(rtd, i, component) { in soc_pcm_components_open()
675 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_components_close() local
679 for_each_rtd_components(rtd, i, component) { in soc_pcm_components_close()
690 static int soc_pcm_clean(struct snd_soc_pcm_runtime *rtd, in soc_pcm_clean() argument
697 snd_soc_dpcm_mutex_assert_held(rtd); in soc_pcm_clean()
700 snd_soc_runtime_deactivate(rtd, substream->stream); in soc_pcm_clean()
703 for_each_rtd_dais(rtd, i, dai) in soc_pcm_clean()
709 for_each_rtd_dais(rtd, i, dai) in soc_pcm_clean()
716 snd_soc_pcm_component_pm_runtime_put(rtd, substream, rollback); in soc_pcm_clean()
718 for_each_rtd_components(rtd, i, component) in soc_pcm_clean()
730 static int __soc_pcm_close(struct snd_soc_pcm_runtime *rtd, in __soc_pcm_close() argument
733 return soc_pcm_clean(rtd, substream, 0); in __soc_pcm_close()
739 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_close() local
741 snd_soc_dpcm_mutex_lock(rtd); in soc_pcm_close()
742 __soc_pcm_close(rtd, substream); in soc_pcm_close()
743 snd_soc_dpcm_mutex_unlock(rtd); in soc_pcm_close()
749 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_hw_sanity_check() local
751 const char *name_cpu = soc_cpu_dai_name(rtd); in soc_hw_sanity_check()
752 const char *name_codec = soc_codec_dai_name(rtd); in soc_hw_sanity_check()
754 struct device *dev = rtd->dev; in soc_hw_sanity_check()
790 static int __soc_pcm_open(struct snd_soc_pcm_runtime *rtd, in __soc_pcm_open() argument
797 snd_soc_dpcm_mutex_assert_held(rtd); in __soc_pcm_open()
799 for_each_rtd_components(rtd, i, component) in __soc_pcm_open()
802 ret = snd_soc_pcm_component_pm_runtime_get(rtd, substream); in __soc_pcm_open()
815 for_each_rtd_dais(rtd, i, dai) { in __soc_pcm_open()
822 if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm) in __soc_pcm_open()
837 for_each_rtd_dais(rtd, i, dai) { in __soc_pcm_open()
843 snd_soc_runtime_activate(rtd, substream->stream); in __soc_pcm_open()
847 soc_pcm_clean(rtd, substream, 1); in __soc_pcm_open()
849 return soc_pcm_ret(rtd, ret); in __soc_pcm_open()
855 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_open() local
858 snd_soc_dpcm_mutex_lock(rtd); in soc_pcm_open()
859 ret = __soc_pcm_open(rtd, substream); in soc_pcm_open()
860 snd_soc_dpcm_mutex_unlock(rtd); in soc_pcm_open()
869 static int __soc_pcm_prepare(struct snd_soc_pcm_runtime *rtd, in __soc_pcm_prepare() argument
875 snd_soc_dpcm_mutex_assert_held(rtd); in __soc_pcm_prepare()
891 rtd->pop_wait) { in __soc_pcm_prepare()
892 rtd->pop_wait = 0; in __soc_pcm_prepare()
893 cancel_delayed_work(&rtd->delayed_work); in __soc_pcm_prepare()
896 snd_soc_dapm_stream_event(rtd, substream->stream, in __soc_pcm_prepare()
899 for_each_rtd_dais(rtd, i, dai) { in __soc_pcm_prepare()
905 return soc_pcm_ret(rtd, ret); in __soc_pcm_prepare()
911 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_prepare() local
914 snd_soc_dpcm_mutex_lock(rtd); in soc_pcm_prepare()
915 ret = __soc_pcm_prepare(rtd, substream); in soc_pcm_prepare()
916 snd_soc_dpcm_mutex_unlock(rtd); in soc_pcm_prepare()
931 static int soc_pcm_hw_clean(struct snd_soc_pcm_runtime *rtd, in soc_pcm_hw_clean() argument
937 snd_soc_dpcm_mutex_assert_held(rtd); in soc_pcm_hw_clean()
940 for_each_rtd_dais(rtd, i, dai) { in soc_pcm_hw_clean()
951 snd_soc_dapm_stream_stop(rtd, substream->stream); in soc_pcm_hw_clean()
960 for_each_rtd_dais(rtd, i, dai) in soc_pcm_hw_clean()
970 static int __soc_pcm_hw_free(struct snd_soc_pcm_runtime *rtd, in __soc_pcm_hw_free() argument
973 return soc_pcm_hw_clean(rtd, substream, 0); in __soc_pcm_hw_free()
979 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_hw_free() local
982 snd_soc_dpcm_mutex_lock(rtd); in soc_pcm_hw_free()
983 ret = __soc_pcm_hw_free(rtd, substream); in soc_pcm_hw_free()
984 snd_soc_dpcm_mutex_unlock(rtd); in soc_pcm_hw_free()
993 static int __soc_pcm_hw_params(struct snd_soc_pcm_runtime *rtd, in __soc_pcm_hw_params() argument
1002 snd_soc_dpcm_mutex_assert_held(rtd); in __soc_pcm_hw_params()
1012 for_each_rtd_codec_dais(rtd, i, codec_dai) { in __soc_pcm_hw_params()
1048 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in __soc_pcm_hw_params()
1062 if (!rtd->dai_link->codec_ch_maps) in __soc_pcm_hw_params()
1068 for_each_rtd_codec_dais(rtd, j, codec_dai) { in __soc_pcm_hw_params()
1069 if (rtd->dai_link->codec_ch_maps[j].connected_cpu_id == i) in __soc_pcm_hw_params()
1070 ch_mask |= rtd->dai_link->codec_ch_maps[j].ch_mask; in __soc_pcm_hw_params()
1090 soc_pcm_hw_clean(rtd, substream, 1); in __soc_pcm_hw_params()
1092 return soc_pcm_ret(rtd, ret); in __soc_pcm_hw_params()
1099 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_hw_params() local
1102 snd_soc_dpcm_mutex_lock(rtd); in soc_pcm_hw_params()
1103 ret = __soc_pcm_hw_params(rtd, substream, params); in soc_pcm_hw_params()
1104 snd_soc_dpcm_mutex_unlock(rtd); in soc_pcm_hw_params()
1124 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); in soc_pcm_trigger() local
1133 for_each_rtd_components(rtd, i, component) { in soc_pcm_trigger()
1139 if (rtd->dai_link->trigger_start) in soc_pcm_trigger()
1140 start = rtd->dai_link->trigger_start; in soc_pcm_trigger()
1141 if (rtd->dai_link->trigger_stop) in soc_pcm_trigger()
1142 stop = rtd->dai_link->trigger_stop; in soc_pcm_trigger()
1391 struct snd_soc_pcm_runtime *rtd; in dpcm_end_walk_at_be() local
1400 rtd = dpcm_get_be(card, widget, stream); in dpcm_end_walk_at_be()
1401 if (rtd) in dpcm_end_walk_at_be()
1514 /* is there a valid BE rtd for this widget */ in dpcm_add_paths()
1862 struct snd_soc_pcm_runtime *rtd; in dpcm_apply_symmetry() local
1869 rtd = asoc_substream_to_rtd(be_substream); in dpcm_apply_symmetry()
1870 if (rtd->dai_link->be_hw_params_fixup) in dpcm_apply_symmetry()
1876 for_each_rtd_dais(rtd, i, dai) { in dpcm_apply_symmetry()
2774 static int soc_get_playback_capture(struct snd_soc_pcm_runtime *rtd, in soc_get_playback_capture() argument
2777 struct snd_soc_dai_link *dai_link = rtd->dai_link; in soc_get_playback_capture()
2784 dev_err(rtd->dev, "DPCM doesn't support Multi CPU for Front-Ends yet\n"); in soc_get_playback_capture()
2794 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_get_playback_capture()
2801 dev_err(rtd->card->dev, in soc_get_playback_capture()
2810 for_each_rtd_cpu_dais(rtd, i, cpu_dai) { in soc_get_playback_capture()
2818 dev_err(rtd->card->dev, in soc_get_playback_capture()
2831 for_each_rtd_codec_dais(rtd, i, codec_dai) { in soc_get_playback_capture()
2833 cpu_dai = asoc_rtd_to_cpu(rtd, 0); in soc_get_playback_capture()
2835 cpu_dai = asoc_rtd_to_cpu(rtd, i); in soc_get_playback_capture()
2836 } else if (rtd->dai_link->num_codecs > rtd->dai_link->num_cpus) { in soc_get_playback_capture()
2839 if (!rtd->dai_link->codec_ch_maps) { in soc_get_playback_capture()
2840 dev_err(rtd->card->dev, "%s: no codec channel mapping table provided\n", in soc_get_playback_capture()
2845 cpu_id = rtd->dai_link->codec_ch_maps[i].connected_cpu_id; in soc_get_playback_capture()
2846 cpu_dai = asoc_rtd_to_cpu(rtd, cpu_id); in soc_get_playback_capture()
2848 dev_err(rtd->card->dev, in soc_get_playback_capture()
2850 __func__, rtd->dai_link->num_codecs, in soc_get_playback_capture()
2851 rtd->dai_link->num_cpus); in soc_get_playback_capture()
2871 dev_err(rtd->dev, "substream %s has no playback, no capture\n", in soc_get_playback_capture()
2884 struct snd_soc_pcm_runtime *rtd, in soc_create_pcm() argument
2891 if (rtd->dai_link->c2c_params) { in soc_create_pcm()
2893 rtd->dai_link->stream_name); in soc_create_pcm()
2895 ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num, in soc_create_pcm()
2897 } else if (rtd->dai_link->no_pcm) { in soc_create_pcm()
2899 rtd->dai_link->stream_name); in soc_create_pcm()
2901 ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num, in soc_create_pcm()
2904 if (rtd->dai_link->dynamic) in soc_create_pcm()
2906 rtd->dai_link->stream_name); in soc_create_pcm()
2909 rtd->dai_link->stream_name, in soc_create_pcm()
2910 soc_codec_dai_name(rtd), num); in soc_create_pcm()
2912 ret = snd_pcm_new(rtd->card->snd_card, new_name, num, playback, in soc_create_pcm()
2916 dev_err(rtd->card->dev, "ASoC: can't create pcm %s for dailink %s: %d\n", in soc_create_pcm()
2917 new_name, rtd->dai_link->name, ret); in soc_create_pcm()
2920 dev_dbg(rtd->card->dev, "ASoC: registered pcm #%d %s\n",num, new_name); in soc_create_pcm()
2926 int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) in soc_new_pcm() argument
2933 ret = soc_get_playback_capture(rtd, &playback, &capture); in soc_new_pcm()
2937 ret = soc_create_pcm(&pcm, rtd, playback, capture, num); in soc_new_pcm()
2948 if (!rtd->dai_link->c2c_params) in soc_new_pcm()
2949 rtd->close_delayed_work_func = snd_soc_close_delayed_work; in soc_new_pcm()
2951 rtd->pcm = pcm; in soc_new_pcm()
2952 pcm->nonatomic = rtd->dai_link->nonatomic; in soc_new_pcm()
2953 pcm->private_data = rtd; in soc_new_pcm()
2956 if (rtd->dai_link->no_pcm || rtd->dai_link->c2c_params) { in soc_new_pcm()
2958 pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd; in soc_new_pcm()
2960 pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd; in soc_new_pcm()
2965 if (rtd->dai_link->dynamic) { in soc_new_pcm()
2966 rtd->ops.open = dpcm_fe_dai_open; in soc_new_pcm()
2967 rtd->ops.hw_params = dpcm_fe_dai_hw_params; in soc_new_pcm()
2968 rtd->ops.prepare = dpcm_fe_dai_prepare; in soc_new_pcm()
2969 rtd->ops.trigger = dpcm_fe_dai_trigger; in soc_new_pcm()
2970 rtd->ops.hw_free = dpcm_fe_dai_hw_free; in soc_new_pcm()
2971 rtd->ops.close = dpcm_fe_dai_close; in soc_new_pcm()
2972 rtd->ops.pointer = soc_pcm_pointer; in soc_new_pcm()
2974 rtd->ops.open = soc_pcm_open; in soc_new_pcm()
2975 rtd->ops.hw_params = soc_pcm_hw_params; in soc_new_pcm()
2976 rtd->ops.prepare = soc_pcm_prepare; in soc_new_pcm()
2977 rtd->ops.trigger = soc_pcm_trigger; in soc_new_pcm()
2978 rtd->ops.hw_free = soc_pcm_hw_free; in soc_new_pcm()
2979 rtd->ops.close = soc_pcm_close; in soc_new_pcm()
2980 rtd->ops.pointer = soc_pcm_pointer; in soc_new_pcm()
2983 for_each_rtd_components(rtd, i, component) { in soc_new_pcm()
2987 rtd->ops.ioctl = snd_soc_pcm_component_ioctl; in soc_new_pcm()
2989 rtd->ops.sync_stop = snd_soc_pcm_component_sync_stop; in soc_new_pcm()
2991 rtd->ops.copy = snd_soc_pcm_component_copy; in soc_new_pcm()
2993 rtd->ops.page = snd_soc_pcm_component_page; in soc_new_pcm()
2995 rtd->ops.mmap = snd_soc_pcm_component_mmap; in soc_new_pcm()
2997 rtd->ops.ack = snd_soc_pcm_component_ack; in soc_new_pcm()
3001 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &rtd->ops); in soc_new_pcm()
3004 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &rtd->ops); in soc_new_pcm()
3006 ret = snd_soc_pcm_component_new(rtd); in soc_new_pcm()
3010 dev_dbg(rtd->card->dev, "%s <-> %s mapping ok\n", in soc_new_pcm()
3011 soc_codec_dai_name(rtd), soc_cpu_dai_name(rtd)); in soc_new_pcm()