Skip to content

Commit

Permalink
ASoc: SOF: topology: connect DAI to a single DAI link
Browse files Browse the repository at this point in the history
The partial matching of DAI widget to link names, can cause problems if
one of the widget names is a substring of another. E.g. with names
"Foo1" and Foo10", it's not possible to correctly link up "Foo1".

Modify the logic so that if multiple DAI links match the widget stream
name, prioritize a full match if one is found.

Fixes: fe88788 ("ASoC: SOF: topology: Use partial match for connecting DAI link and DAI widget")
Link: #5308
Signed-off-by: Kai Vehmanen <[email protected]>
  • Loading branch information
kv2019i committed Feb 3, 2025
1 parent e0657c0 commit 09c2646
Showing 1 changed file with 14 additions and 4 deletions.
18 changes: 14 additions & 4 deletions sound/soc/sof/topology.c
Original file line number Diff line number Diff line change
Expand Up @@ -1063,7 +1063,7 @@ static int sof_connect_dai_widget(struct snd_soc_component *scomp,
struct snd_sof_dai *dai)
{
struct snd_soc_card *card = scomp->card;
struct snd_soc_pcm_runtime *rtd;
struct snd_soc_pcm_runtime *rtd, *full, *partial;
struct snd_soc_dai *cpu_dai;
int stream;
int i;
Expand All @@ -1080,12 +1080,22 @@ static int sof_connect_dai_widget(struct snd_soc_component *scomp,
else
goto end;

full = partial = NULL;
list_for_each_entry(rtd, &card->rtd_list, list) {
/* does stream match DAI link ? */
if (!rtd->dai_link->stream_name ||
!strstr(rtd->dai_link->stream_name, w->sname))
continue;
if (rtd->dai_link->stream_name) {
if (!strcmp(rtd->dai_link->stream_name, w->sname)) {
full = rtd;
break;
}
else if (strstr(rtd->dai_link->stream_name, w->sname)) {
partial = rtd;
}
}
}

rtd = full ? full : partial;
if (rtd) {
for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
/*
* Please create DAI widget in the right order
Expand Down

0 comments on commit 09c2646

Please sign in to comment.