mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-12 05:24:12 +08:00
ASoC: soc-dapm.c: tidyup dapm_connect_dai_pair()
dapm_connect_dai_pair() handles "Normal/Codec2Codec" x "CPU/Codec" x "Playback/Capture". (A) is "Codec2Codec" case of "CPU" widget x "Playback/Capture", (B) is "Normal" case of "CPU" widget x "Playback/Capture", (C) is each case of "Codec" widget. (X) is handling "Playback" case DAI connecting, (Y) is handling "Capture" case DAI connecting. static void dapm_connect_dai_pair(...) { ... (A) if (dai_link->params) { playback_cpu = ... capture_cpu = ... (B) } else { playback_cpu = ... capture_cpu = ... } ^ /* connect BE DAI playback if widgets are valid */ | stream = SNDRV_PCM_STREAM_PLAYBACK; | (C) codec = codec_dai->playback_widget; | | if (playback_cpu && codec) { (X) if (dai_link->params && !rtd->c2c_widget[stream]) { | ... | } | | (z) dapm_connect_dai_routes(...); v } capture: ^ /* connect BE DAI capture if widgets are valid */ | stream = SNDRV_PCM_STREAM_CAPTURE; | (C) codec = codec_dai->capture_widget; | | if (codec && capture_cpu) { (Y) if (dai_link->params && !rtd->c2c_widget[stream]) { | ... | } | | (z) dapm_connect_dai_routes(...); v } } (X) part and (Y) part are almost same. Main purpose of these parts (and this function) is calling dapm_connect_dai_routes() (= z) on each cases. The difference is "parameter" (= Normal/Codec2Codec x CPU/Codec x Playback/Capture). This patch cleanup these, but nothing changed for meaning. Link: https://lore.kernel.org/r/87ilen6ni4.wl-kuninori.morimoto.gx@renesas.com Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Link: https://lore.kernel.org/r/877cuqvswc.wl-kuninori.morimoto.gx@renesas.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
99fddc1618
commit
3456aeb02a
@ -4325,60 +4325,81 @@ static void dapm_connect_dai_routes(struct snd_soc_dapm_context *dapm,
|
||||
snd_soc_dapm_add_path(dapm, src, sink, NULL, NULL);
|
||||
}
|
||||
|
||||
static int get_stream_cpu(struct snd_soc_dai_link *dai_link, int stream)
|
||||
{
|
||||
/*
|
||||
* [Normal]
|
||||
*
|
||||
* Playback
|
||||
* CPU : SNDRV_PCM_STREAM_PLAYBACK
|
||||
* Codec: SNDRV_PCM_STREAM_PLAYBACK
|
||||
*
|
||||
* Playback
|
||||
* CPU : SNDRV_PCM_STREAM_CAPTURE
|
||||
* Codec: SNDRV_PCM_STREAM_CAPTURE
|
||||
*/
|
||||
if (!dai_link->c2c_params)
|
||||
return stream;
|
||||
|
||||
/*
|
||||
* [Codec2Codec]
|
||||
*
|
||||
* Playback
|
||||
* CPU : SNDRV_PCM_STREAM_CAPTURE
|
||||
* Codec: SNDRV_PCM_STREAM_PLAYBACK
|
||||
*
|
||||
* Capture
|
||||
* CPU : SNDRV_PCM_STREAM_PLAYBACK
|
||||
* Codec: SNDRV_PCM_STREAM_CAPTURE
|
||||
*/
|
||||
if (stream == SNDRV_PCM_STREAM_CAPTURE)
|
||||
return SNDRV_PCM_STREAM_PLAYBACK;
|
||||
|
||||
return SNDRV_PCM_STREAM_CAPTURE;
|
||||
}
|
||||
|
||||
static void dapm_connect_dai_pair(struct snd_soc_card *card,
|
||||
struct snd_soc_pcm_runtime *rtd,
|
||||
struct snd_soc_dai *codec_dai,
|
||||
struct snd_soc_dai *cpu_dai)
|
||||
{
|
||||
struct snd_soc_dai_link *dai_link = rtd->dai_link;
|
||||
struct snd_soc_dapm_widget *dai, *codec, *playback_cpu, *capture_cpu;
|
||||
struct snd_pcm_substream *substream;
|
||||
struct snd_pcm_str *streams = rtd->pcm->streams;
|
||||
struct snd_soc_dapm_widget *codec, *cpu;
|
||||
struct snd_soc_dai *src_dai[] = { cpu_dai, codec_dai };
|
||||
struct snd_soc_dai *sink_dai[] = { codec_dai, cpu_dai };
|
||||
struct snd_soc_dapm_widget **src[] = { &cpu, &codec };
|
||||
struct snd_soc_dapm_widget **sink[] = { &codec, &cpu };
|
||||
char *widget_name[] = { "playback", "capture" };
|
||||
int stream;
|
||||
|
||||
if (dai_link->c2c_params) {
|
||||
playback_cpu = snd_soc_dai_get_widget_capture(cpu_dai);
|
||||
capture_cpu = snd_soc_dai_get_widget_playback(cpu_dai);
|
||||
} else {
|
||||
playback_cpu = snd_soc_dai_get_widget_playback(cpu_dai);
|
||||
capture_cpu = snd_soc_dai_get_widget_capture(cpu_dai);
|
||||
}
|
||||
for_each_pcm_streams(stream) {
|
||||
int stream_cpu, stream_codec;
|
||||
|
||||
/* connect BE DAI playback if widgets are valid */
|
||||
stream = SNDRV_PCM_STREAM_PLAYBACK;
|
||||
codec = snd_soc_dai_get_widget(codec_dai, stream);
|
||||
stream_cpu = get_stream_cpu(dai_link, stream);
|
||||
stream_codec = stream;
|
||||
|
||||
if (playback_cpu && codec) {
|
||||
/* connect BE DAI playback if widgets are valid */
|
||||
cpu = snd_soc_dai_get_widget(cpu_dai, stream_cpu);
|
||||
codec = snd_soc_dai_get_widget(codec_dai, stream_codec);
|
||||
|
||||
if (!cpu || !codec)
|
||||
continue;
|
||||
|
||||
/* special handling for [Codec2Codec] */
|
||||
if (dai_link->c2c_params && !rtd->c2c_widget[stream]) {
|
||||
substream = streams[stream].substream;
|
||||
dai = snd_soc_dapm_new_dai(card, substream, "playback");
|
||||
struct snd_pcm_substream *substream = rtd->pcm->streams[stream].substream;
|
||||
struct snd_soc_dapm_widget *dai = snd_soc_dapm_new_dai(card, substream,
|
||||
widget_name[stream]);
|
||||
|
||||
if (IS_ERR(dai))
|
||||
goto capture;
|
||||
continue;
|
||||
|
||||
rtd->c2c_widget[stream] = dai;
|
||||
}
|
||||
|
||||
dapm_connect_dai_routes(&card->dapm, cpu_dai, playback_cpu,
|
||||
dapm_connect_dai_routes(&card->dapm, src_dai[stream], *src[stream],
|
||||
rtd->c2c_widget[stream],
|
||||
codec_dai, codec);
|
||||
}
|
||||
|
||||
capture:
|
||||
/* connect BE DAI capture if widgets are valid */
|
||||
stream = SNDRV_PCM_STREAM_CAPTURE;
|
||||
codec = snd_soc_dai_get_widget(codec_dai, stream);
|
||||
|
||||
if (codec && capture_cpu) {
|
||||
if (dai_link->c2c_params && !rtd->c2c_widget[stream]) {
|
||||
substream = streams[stream].substream;
|
||||
dai = snd_soc_dapm_new_dai(card, substream, "capture");
|
||||
if (IS_ERR(dai))
|
||||
return;
|
||||
rtd->c2c_widget[stream] = dai;
|
||||
}
|
||||
|
||||
dapm_connect_dai_routes(&card->dapm, codec_dai, codec,
|
||||
rtd->c2c_widget[stream],
|
||||
cpu_dai, capture_cpu);
|
||||
sink_dai[stream], *sink[stream]);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user