Skip to content

Commit 778ff5b

Browse files
charleskeepaxbroonie
authored andcommitted
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>
1 parent 94e630a commit 778ff5b

File tree

3 files changed

+66
-90
lines changed

3 files changed

+66
-90
lines changed

include/sound/soc-dapm.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -406,12 +406,6 @@ int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,
406406
struct snd_soc_dai *dai);
407407
int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card);
408408
void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card);
409-
int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
410-
struct snd_soc_pcm_runtime *rtd,
411-
const struct snd_soc_pcm_stream *params,
412-
unsigned int num_params,
413-
struct snd_soc_dapm_widget *source,
414-
struct snd_soc_dapm_widget *sink);
415409

416410
/* dapm path setup */
417411
int snd_soc_dapm_new_widgets(struct snd_soc_card *card);

sound/soc/soc-core.c

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1463,48 +1463,6 @@ static int soc_link_dai_pcm_new(struct snd_soc_dai **dais, int num_dais,
14631463
return 0;
14641464
}
14651465

1466-
static int soc_link_dai_widgets(struct snd_soc_card *card,
1467-
struct snd_soc_dai_link *dai_link,
1468-
struct snd_soc_pcm_runtime *rtd)
1469-
{
1470-
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1471-
struct snd_soc_dai *codec_dai = rtd->codec_dai;
1472-
struct snd_soc_dapm_widget *sink, *source;
1473-
int ret;
1474-
1475-
if (rtd->num_codecs > 1)
1476-
dev_warn(card->dev, "ASoC: Multiple codecs not supported yet\n");
1477-
1478-
/* link the DAI widgets */
1479-
sink = codec_dai->playback_widget;
1480-
source = cpu_dai->capture_widget;
1481-
if (sink && source) {
1482-
ret = snd_soc_dapm_new_pcm(card, rtd, dai_link->params,
1483-
dai_link->num_params,
1484-
source, sink);
1485-
if (ret != 0) {
1486-
dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n",
1487-
sink->name, source->name, ret);
1488-
return ret;
1489-
}
1490-
}
1491-
1492-
sink = cpu_dai->playback_widget;
1493-
source = codec_dai->capture_widget;
1494-
if (sink && source) {
1495-
ret = snd_soc_dapm_new_pcm(card, rtd, dai_link->params,
1496-
dai_link->num_params,
1497-
source, sink);
1498-
if (ret != 0) {
1499-
dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n",
1500-
sink->name, source->name, ret);
1501-
return ret;
1502-
}
1503-
}
1504-
1505-
return 0;
1506-
}
1507-
15081466
static int soc_probe_link_dais(struct snd_soc_card *card,
15091467
struct snd_soc_pcm_runtime *rtd, int order)
15101468
{
@@ -1606,11 +1564,6 @@ static int soc_probe_link_dais(struct snd_soc_card *card,
16061564
} else {
16071565
INIT_DELAYED_WORK(&rtd->delayed_work,
16081566
codec2codec_close_delayed_work);
1609-
1610-
/* link the DAI widgets */
1611-
ret = soc_link_dai_widgets(card, dai_link, rtd);
1612-
if (ret)
1613-
return ret;
16141567
}
16151568
}
16161569

sound/soc/soc-dapm.c

Lines changed: 66 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3860,12 +3860,10 @@ snd_soc_dapm_alloc_kcontrol(struct snd_soc_card *card,
38603860
return NULL;
38613861
}
38623862

3863-
int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
3864-
struct snd_soc_pcm_runtime *rtd,
3865-
const struct snd_soc_pcm_stream *params,
3866-
unsigned int num_params,
3867-
struct snd_soc_dapm_widget *source,
3868-
struct snd_soc_dapm_widget *sink)
3863+
static struct snd_soc_dapm_widget *
3864+
snd_soc_dapm_new_dai(struct snd_soc_card *card, struct snd_soc_pcm_runtime *rtd,
3865+
struct snd_soc_dapm_widget *source,
3866+
struct snd_soc_dapm_widget *sink)
38693867
{
38703868
struct snd_soc_dapm_widget template;
38713869
struct snd_soc_dapm_widget *w;
@@ -3877,7 +3875,7 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
38773875
link_name = devm_kasprintf(card->dev, GFP_KERNEL, "%s-%s",
38783876
source->name, sink->name);
38793877
if (!link_name)
3880-
return -ENOMEM;
3878+
return ERR_PTR(-ENOMEM);
38813879

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

38913889
/* allocate memory for control, only in case of multiple configs */
3892-
if (num_params > 1) {
3893-
w_param_text = devm_kcalloc(card->dev, num_params,
3894-
sizeof(char *), GFP_KERNEL);
3890+
if (rtd->dai_link->num_params > 1) {
3891+
w_param_text = devm_kcalloc(card->dev,
3892+
rtd->dai_link->num_params,
3893+
sizeof(char *), GFP_KERNEL);
38953894
if (!w_param_text) {
38963895
ret = -ENOMEM;
38973896
goto param_fail;
@@ -3900,7 +3899,9 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
39003899
template.num_kcontrols = 1;
39013900
template.kcontrol_news =
39023901
snd_soc_dapm_alloc_kcontrol(card,
3903-
link_name, params, num_params,
3902+
link_name,
3903+
rtd->dai_link->params,
3904+
rtd->dai_link->num_params,
39043905
w_param_text, &private_value);
39053906
if (!template.kcontrol_news) {
39063907
ret = -ENOMEM;
@@ -3915,23 +3916,19 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
39153916
if (IS_ERR(w))
39163917
goto outfree_kcontrol_news;
39173918

3918-
w->params = params;
3919-
w->num_params = num_params;
3919+
w->params = rtd->dai_link->params;
3920+
w->num_params = rtd->dai_link->num_params;
39203921
w->priv = rtd;
39213922

3922-
ret = snd_soc_dapm_add_path(&card->dapm, source, w, NULL, NULL);
3923-
if (ret)
3924-
goto outfree_w;
3925-
return snd_soc_dapm_add_path(&card->dapm, w, sink, NULL, NULL);
3923+
return w;
39263924

3927-
outfree_w:
3928-
devm_kfree(card->dev, w);
39293925
outfree_kcontrol_news:
39303926
devm_kfree(card->dev, (void *)template.kcontrol_news);
3931-
snd_soc_dapm_free_kcontrol(card, &private_value, num_params, w_param_text);
3927+
snd_soc_dapm_free_kcontrol(card, &private_value,
3928+
rtd->dai_link->num_params, w_param_text);
39323929
param_fail:
39333930
devm_kfree(card->dev, link_name);
3934-
return ret;
3931+
return ERR_PTR(ret);
39353932
}
39363933

39373934
int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,
@@ -4041,33 +4038,65 @@ static void dapm_connect_dai_link_widgets(struct snd_soc_card *card,
40414038
{
40424039
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
40434040
struct snd_soc_dai *codec_dai;
4044-
struct snd_soc_dapm_widget *sink, *source;
4041+
struct snd_soc_dapm_widget *playback = NULL, *capture = NULL;
4042+
struct snd_soc_dapm_widget *codec, *playback_cpu, *capture_cpu;
40454043
int i;
40464044

4045+
if (rtd->dai_link->params) {
4046+
if (rtd->num_codecs > 1)
4047+
dev_warn(card->dev, "ASoC: Multiple codecs not supported yet\n");
4048+
4049+
playback_cpu = cpu_dai->capture_widget;
4050+
capture_cpu = cpu_dai->playback_widget;
4051+
} else {
4052+
playback = cpu_dai->playback_widget;
4053+
capture = cpu_dai->capture_widget;
4054+
playback_cpu = playback;
4055+
capture_cpu = capture;
4056+
}
4057+
40474058
for_each_rtd_codec_dai(rtd, i, codec_dai) {
40484059

40494060
/* connect BE DAI playback if widgets are valid */
4050-
if (codec_dai->playback_widget && cpu_dai->playback_widget) {
4051-
source = cpu_dai->playback_widget;
4052-
sink = codec_dai->playback_widget;
4061+
codec = codec_dai->playback_widget;
4062+
4063+
if (playback_cpu && codec) {
4064+
if (!playback) {
4065+
playback = snd_soc_dapm_new_dai(card, rtd,
4066+
playback_cpu,
4067+
codec);
4068+
4069+
snd_soc_dapm_add_path(&card->dapm, playback_cpu,
4070+
playback, NULL, NULL);
4071+
}
4072+
40534073
dev_dbg(rtd->dev, "connected DAI link %s:%s -> %s:%s\n",
4054-
cpu_dai->component->name, source->name,
4055-
codec_dai->component->name, sink->name);
4074+
cpu_dai->component->name, playback_cpu->name,
4075+
codec_dai->component->name, codec->name);
40564076

4057-
snd_soc_dapm_add_path(&card->dapm, source, sink,
4058-
NULL, NULL);
4077+
snd_soc_dapm_add_path(&card->dapm, playback, codec,
4078+
NULL, NULL);
40594079
}
40604080

40614081
/* connect BE DAI capture if widgets are valid */
4062-
if (codec_dai->capture_widget && cpu_dai->capture_widget) {
4063-
source = codec_dai->capture_widget;
4064-
sink = cpu_dai->capture_widget;
4082+
codec = codec_dai->capture_widget;
4083+
4084+
if (codec && capture_cpu) {
4085+
if (!capture) {
4086+
capture = snd_soc_dapm_new_dai(card, rtd,
4087+
codec,
4088+
capture_cpu);
4089+
4090+
snd_soc_dapm_add_path(&card->dapm, capture,
4091+
capture_cpu, NULL, NULL);
4092+
}
4093+
40654094
dev_dbg(rtd->dev, "connected DAI link %s:%s -> %s:%s\n",
4066-
codec_dai->component->name, source->name,
4067-
cpu_dai->component->name, sink->name);
4095+
codec_dai->component->name, codec->name,
4096+
cpu_dai->component->name, capture_cpu->name);
40684097

4069-
snd_soc_dapm_add_path(&card->dapm, source, sink,
4070-
NULL, NULL);
4098+
snd_soc_dapm_add_path(&card->dapm, codec, capture,
4099+
NULL, NULL);
40714100
}
40724101
}
40734102
}
@@ -4122,7 +4151,7 @@ void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card)
41224151
* dynamic FE links have no fixed DAI mapping.
41234152
* CODEC<->CODEC links have no direct connection.
41244153
*/
4125-
if (rtd->dai_link->dynamic || rtd->dai_link->params)
4154+
if (rtd->dai_link->dynamic)
41264155
continue;
41274156

41284157
dapm_connect_dai_link_widgets(card, rtd);

0 commit comments

Comments
 (0)