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:
Kuninori Morimoto 2023-04-05 22:57:55 +00:00 committed by Mark Brown
parent 99fddc1618
commit 3456aeb02a
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0

View File

@ -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]);
}
}