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: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Charles Keepax 2018-09-05 15:21:00 +01:00 committed by Mark Brown
parent 94e630a35d
commit 778ff5bb86
No known key found for this signature in database
GPG key ID: 24D68B725D5487D0
3 changed files with 68 additions and 92 deletions

View file

@ -406,12 +406,6 @@ int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,
struct snd_soc_dai *dai); struct snd_soc_dai *dai);
int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card); 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); 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 */ /* dapm path setup */
int snd_soc_dapm_new_widgets(struct snd_soc_card *card); int snd_soc_dapm_new_widgets(struct snd_soc_card *card);

View file

@ -1463,48 +1463,6 @@ static int soc_link_dai_pcm_new(struct snd_soc_dai **dais, int num_dais,
return 0; 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, static int soc_probe_link_dais(struct snd_soc_card *card,
struct snd_soc_pcm_runtime *rtd, int order) struct snd_soc_pcm_runtime *rtd, int order)
{ {
@ -1606,11 +1564,6 @@ static int soc_probe_link_dais(struct snd_soc_card *card,
} else { } else {
INIT_DELAYED_WORK(&rtd->delayed_work, INIT_DELAYED_WORK(&rtd->delayed_work,
codec2codec_close_delayed_work); codec2codec_close_delayed_work);
/* link the DAI widgets */
ret = soc_link_dai_widgets(card, dai_link, rtd);
if (ret)
return ret;
} }
} }

View file

@ -3860,10 +3860,8 @@ snd_soc_dapm_alloc_kcontrol(struct snd_soc_card *card,
return NULL; return NULL;
} }
int snd_soc_dapm_new_pcm(struct snd_soc_card *card, static struct snd_soc_dapm_widget *
struct snd_soc_pcm_runtime *rtd, snd_soc_dapm_new_dai(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 *source,
struct snd_soc_dapm_widget *sink) 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", link_name = devm_kasprintf(card->dev, GFP_KERNEL, "%s-%s",
source->name, sink->name); source->name, sink->name);
if (!link_name) if (!link_name)
return -ENOMEM; return ERR_PTR(-ENOMEM);
memset(&template, 0, sizeof(template)); memset(&template, 0, sizeof(template));
template.reg = SND_SOC_NOPM; template.reg = SND_SOC_NOPM;
@ -3889,8 +3887,9 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
template.kcontrol_news = NULL; template.kcontrol_news = NULL;
/* allocate memory for control, only in case of multiple configs */ /* allocate memory for control, only in case of multiple configs */
if (num_params > 1) { if (rtd->dai_link->num_params > 1) {
w_param_text = devm_kcalloc(card->dev, num_params, w_param_text = devm_kcalloc(card->dev,
rtd->dai_link->num_params,
sizeof(char *), GFP_KERNEL); sizeof(char *), GFP_KERNEL);
if (!w_param_text) { if (!w_param_text) {
ret = -ENOMEM; ret = -ENOMEM;
@ -3900,7 +3899,9 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
template.num_kcontrols = 1; template.num_kcontrols = 1;
template.kcontrol_news = template.kcontrol_news =
snd_soc_dapm_alloc_kcontrol(card, 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); w_param_text, &private_value);
if (!template.kcontrol_news) { if (!template.kcontrol_news) {
ret = -ENOMEM; ret = -ENOMEM;
@ -3915,23 +3916,19 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
if (IS_ERR(w)) if (IS_ERR(w))
goto outfree_kcontrol_news; goto outfree_kcontrol_news;
w->params = params; w->params = rtd->dai_link->params;
w->num_params = num_params; w->num_params = rtd->dai_link->num_params;
w->priv = rtd; w->priv = rtd;
ret = snd_soc_dapm_add_path(&card->dapm, source, w, NULL, NULL); return w;
if (ret)
goto outfree_w;
return snd_soc_dapm_add_path(&card->dapm, w, sink, NULL, NULL);
outfree_w:
devm_kfree(card->dev, w);
outfree_kcontrol_news: outfree_kcontrol_news:
devm_kfree(card->dev, (void *)template.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: param_fail:
devm_kfree(card->dev, link_name); 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, 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 *cpu_dai = rtd->cpu_dai;
struct snd_soc_dai *codec_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; 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) { for_each_rtd_codec_dai(rtd, i, codec_dai) {
/* connect BE DAI playback if widgets are valid */ /* connect BE DAI playback if widgets are valid */
if (codec_dai->playback_widget && cpu_dai->playback_widget) { codec = codec_dai->playback_widget;
source = cpu_dai->playback_widget;
sink = codec_dai->playback_widget;
dev_dbg(rtd->dev, "connected DAI link %s:%s -> %s:%s\n",
cpu_dai->component->name, source->name,
codec_dai->component->name, sink->name);
snd_soc_dapm_add_path(&card->dapm, source, sink, 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, playback_cpu->name,
codec_dai->component->name, codec->name);
snd_soc_dapm_add_path(&card->dapm, playback, codec,
NULL, NULL); NULL, NULL);
} }
/* connect BE DAI capture if widgets are valid */ /* connect BE DAI capture if widgets are valid */
if (codec_dai->capture_widget && cpu_dai->capture_widget) { codec = codec_dai->capture_widget;
source = codec_dai->capture_widget;
sink = cpu_dai->capture_widget;
dev_dbg(rtd->dev, "connected DAI link %s:%s -> %s:%s\n",
codec_dai->component->name, source->name,
cpu_dai->component->name, sink->name);
snd_soc_dapm_add_path(&card->dapm, source, sink, 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, codec->name,
cpu_dai->component->name, capture_cpu->name);
snd_soc_dapm_add_path(&card->dapm, codec, capture,
NULL, NULL); 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. * dynamic FE links have no fixed DAI mapping.
* CODEC<->CODEC links have no direct connection. * CODEC<->CODEC links have no direct connection.
*/ */
if (rtd->dai_link->dynamic || rtd->dai_link->params) if (rtd->dai_link->dynamic)
continue; continue;
dapm_connect_dai_link_widgets(card, rtd); dapm_connect_dai_link_widgets(card, rtd);