Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 778ff5bb authored by Charles Keepax's avatar Charles Keepax Committed by Mark Brown
Browse files

ASoC: dapm: Move connection of CODEC to CODEC DAIs



Currently, snd_soc_dapm_connect_dai_link_widgets connects up the routes
representing normal DAIs, however CODEC to CODEC links are hooked up
through separate infrastructure in soc_link_dai_widgets. Improve the
consistency of the code by using snd_soc_dapm_connect_dai_link for both
types of DAIs.

Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 94e630a3
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -406,12 +406,6 @@ int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,
				 struct snd_soc_dai *dai);
int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card);
void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card);
int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
			 struct snd_soc_pcm_runtime *rtd,
			 const struct snd_soc_pcm_stream *params,
			 unsigned int num_params,
			 struct snd_soc_dapm_widget *source,
			 struct snd_soc_dapm_widget *sink);

/* dapm path setup */
int snd_soc_dapm_new_widgets(struct snd_soc_card *card);
+0 −47
Original line number Diff line number Diff line
@@ -1463,48 +1463,6 @@ static int soc_link_dai_pcm_new(struct snd_soc_dai **dais, int num_dais,
	return 0;
}

static int soc_link_dai_widgets(struct snd_soc_card *card,
				struct snd_soc_dai_link *dai_link,
				struct snd_soc_pcm_runtime *rtd)
{
	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
	struct snd_soc_dai *codec_dai = rtd->codec_dai;
	struct snd_soc_dapm_widget *sink, *source;
	int ret;

	if (rtd->num_codecs > 1)
		dev_warn(card->dev, "ASoC: Multiple codecs not supported yet\n");

	/* link the DAI widgets */
	sink = codec_dai->playback_widget;
	source = cpu_dai->capture_widget;
	if (sink && source) {
		ret = snd_soc_dapm_new_pcm(card, rtd, dai_link->params,
					   dai_link->num_params,
					   source, sink);
		if (ret != 0) {
			dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n",
				sink->name, source->name, ret);
			return ret;
		}
	}

	sink = cpu_dai->playback_widget;
	source = codec_dai->capture_widget;
	if (sink && source) {
		ret = snd_soc_dapm_new_pcm(card, rtd, dai_link->params,
					   dai_link->num_params,
					   source, sink);
		if (ret != 0) {
			dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n",
				sink->name, source->name, ret);
			return ret;
		}
	}

	return 0;
}

static int soc_probe_link_dais(struct snd_soc_card *card,
		struct snd_soc_pcm_runtime *rtd, int order)
{
@@ -1606,11 +1564,6 @@ static int soc_probe_link_dais(struct snd_soc_card *card,
		} else {
			INIT_DELAYED_WORK(&rtd->delayed_work,
						codec2codec_close_delayed_work);

			/* link the DAI widgets */
			ret = soc_link_dai_widgets(card, dai_link, rtd);
			if (ret)
				return ret;
		}
	}

+66 −37
Original line number Diff line number Diff line
@@ -3860,10 +3860,8 @@ snd_soc_dapm_alloc_kcontrol(struct snd_soc_card *card,
	return NULL;
}

int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
			 struct snd_soc_pcm_runtime *rtd,
			 const struct snd_soc_pcm_stream *params,
			 unsigned int num_params,
static struct snd_soc_dapm_widget *
snd_soc_dapm_new_dai(struct snd_soc_card *card, struct snd_soc_pcm_runtime *rtd,
		     struct snd_soc_dapm_widget *source,
		     struct snd_soc_dapm_widget *sink)
{
@@ -3877,7 +3875,7 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
	link_name = devm_kasprintf(card->dev, GFP_KERNEL, "%s-%s",
				   source->name, sink->name);
	if (!link_name)
		return -ENOMEM;
		return ERR_PTR(-ENOMEM);

	memset(&template, 0, sizeof(template));
	template.reg = SND_SOC_NOPM;
@@ -3889,8 +3887,9 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
	template.kcontrol_news = NULL;

	/* allocate memory for control, only in case of multiple configs */
	if (num_params > 1) {
		w_param_text = devm_kcalloc(card->dev, num_params,
	if (rtd->dai_link->num_params > 1) {
		w_param_text = devm_kcalloc(card->dev,
					    rtd->dai_link->num_params,
					    sizeof(char *), GFP_KERNEL);
		if (!w_param_text) {
			ret = -ENOMEM;
@@ -3900,7 +3899,9 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
		template.num_kcontrols = 1;
		template.kcontrol_news =
					snd_soc_dapm_alloc_kcontrol(card,
						link_name, params, num_params,
						link_name,
						rtd->dai_link->params,
						rtd->dai_link->num_params,
						w_param_text, &private_value);
		if (!template.kcontrol_news) {
			ret = -ENOMEM;
@@ -3915,23 +3916,19 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
	if (IS_ERR(w))
		goto outfree_kcontrol_news;

	w->params = params;
	w->num_params = num_params;
	w->params = rtd->dai_link->params;
	w->num_params = rtd->dai_link->num_params;
	w->priv = rtd;

	ret = snd_soc_dapm_add_path(&card->dapm, source, w, NULL, NULL);
	if (ret)
		goto outfree_w;
	return snd_soc_dapm_add_path(&card->dapm, w, sink, NULL, NULL);
	return w;

outfree_w:
	devm_kfree(card->dev, w);
outfree_kcontrol_news:
	devm_kfree(card->dev, (void *)template.kcontrol_news);
	snd_soc_dapm_free_kcontrol(card, &private_value, num_params, w_param_text);
	snd_soc_dapm_free_kcontrol(card, &private_value,
				   rtd->dai_link->num_params, w_param_text);
param_fail:
	devm_kfree(card->dev, link_name);
	return ret;
	return ERR_PTR(ret);
}

int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,
@@ -4041,32 +4038,64 @@ static void dapm_connect_dai_link_widgets(struct snd_soc_card *card,
{
	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
	struct snd_soc_dai *codec_dai;
	struct snd_soc_dapm_widget *sink, *source;
	struct snd_soc_dapm_widget *playback = NULL, *capture = NULL;
	struct snd_soc_dapm_widget *codec, *playback_cpu, *capture_cpu;
	int i;

	if (rtd->dai_link->params) {
		if (rtd->num_codecs > 1)
			dev_warn(card->dev, "ASoC: Multiple codecs not supported yet\n");

		playback_cpu = cpu_dai->capture_widget;
		capture_cpu = cpu_dai->playback_widget;
	} else {
		playback = cpu_dai->playback_widget;
		capture = cpu_dai->capture_widget;
		playback_cpu = playback;
		capture_cpu = capture;
	}

	for_each_rtd_codec_dai(rtd, i, codec_dai) {

		/* connect BE DAI playback if widgets are valid */
		if (codec_dai->playback_widget && cpu_dai->playback_widget) {
			source = cpu_dai->playback_widget;
			sink = codec_dai->playback_widget;
		codec = codec_dai->playback_widget;

		if (playback_cpu && codec) {
			if (!playback) {
				playback = snd_soc_dapm_new_dai(card, rtd,
								playback_cpu,
								codec);

				snd_soc_dapm_add_path(&card->dapm, playback_cpu,
						      playback, NULL, NULL);
			}

			dev_dbg(rtd->dev, "connected DAI link %s:%s -> %s:%s\n",
				cpu_dai->component->name, source->name,
				codec_dai->component->name, sink->name);
				cpu_dai->component->name, playback_cpu->name,
				codec_dai->component->name, codec->name);

			snd_soc_dapm_add_path(&card->dapm, source, sink,
			snd_soc_dapm_add_path(&card->dapm, playback, codec,
					      NULL, NULL);
		}

		/* connect BE DAI capture if widgets are valid */
		if (codec_dai->capture_widget && cpu_dai->capture_widget) {
			source = codec_dai->capture_widget;
			sink = cpu_dai->capture_widget;
		codec = codec_dai->capture_widget;

		if (codec && capture_cpu) {
			if (!capture) {
				capture = snd_soc_dapm_new_dai(card, rtd,
							       codec,
							       capture_cpu);

				snd_soc_dapm_add_path(&card->dapm, capture,
						      capture_cpu, NULL, NULL);
			}

			dev_dbg(rtd->dev, "connected DAI link %s:%s -> %s:%s\n",
				codec_dai->component->name, source->name,
				cpu_dai->component->name, sink->name);
				codec_dai->component->name, codec->name,
				cpu_dai->component->name, capture_cpu->name);

			snd_soc_dapm_add_path(&card->dapm, source, sink,
			snd_soc_dapm_add_path(&card->dapm, codec, capture,
					      NULL, NULL);
		}
	}
@@ -4122,7 +4151,7 @@ void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card)
		 * dynamic FE links have no fixed DAI mapping.
		 * CODEC<->CODEC links have no direct connection.
		 */
		if (rtd->dai_link->dynamic || rtd->dai_link->params)
		if (rtd->dai_link->dynamic)
			continue;

		dapm_connect_dai_link_widgets(card, rtd);