diff options
author | Mark Brown <broonie@kernel.org> | 2022-04-08 12:22:10 +0100 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2022-04-08 12:22:10 +0100 |
commit | 3d5746a187a0e2a10025ead3472f796a761abd26 (patch) | |
tree | 629929b235b07ca4d4a58d7d0042824efa7c5f59 /sound/soc/sof/topology.c | |
parent | 5cfe477f6a3f9a4d9b2906d442964f2115b0403f (diff) | |
parent | aa70527d36d74db80a1c40e792f5320ab56e6eae (diff) | |
download | linux-3d5746a187a0e2a10025ead3472f796a761abd26.tar.bz2 |
ASoC: Merge fixes
Pull in wm8731 fix.
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound/soc/sof/topology.c')
-rw-r--r-- | sound/soc/sof/topology.c | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c index 6ab760256fc5..38e560ccaa57 100644 --- a/sound/soc/sof/topology.c +++ b/sound/soc/sof/topology.c @@ -915,8 +915,10 @@ static int sof_control_load(struct snd_soc_component *scomp, int index, return -ENOMEM; scontrol->name = kstrdup(hdr->name, GFP_KERNEL); - if (!scontrol->name) + if (!scontrol->name) { + kfree(scontrol); return -ENOMEM; + } scontrol->scomp = scomp; scontrol->access = kc->access; @@ -1081,6 +1083,46 @@ static int sof_connect_dai_widget(struct snd_soc_component *scomp, return 0; } +static void sof_disconnect_dai_widget(struct snd_soc_component *scomp, + struct snd_soc_dapm_widget *w) +{ + struct snd_soc_card *card = scomp->card; + struct snd_soc_pcm_runtime *rtd; + struct snd_soc_dai *cpu_dai; + int i; + + if (!w->sname) + return; + + list_for_each_entry(rtd, &card->rtd_list, list) { + /* does stream match DAI link ? */ + if (!rtd->dai_link->stream_name || + strcmp(w->sname, rtd->dai_link->stream_name)) + continue; + + switch (w->id) { + case snd_soc_dapm_dai_out: + for_each_rtd_cpu_dais(rtd, i, cpu_dai) { + if (cpu_dai->capture_widget == w) { + cpu_dai->capture_widget = NULL; + break; + } + } + break; + case snd_soc_dapm_dai_in: + for_each_rtd_cpu_dais(rtd, i, cpu_dai) { + if (cpu_dai->playback_widget == w) { + cpu_dai->playback_widget = NULL; + break; + } + } + break; + default: + break; + } + } +} + /* bind PCM ID to host component ID */ static int spcm_bind(struct snd_soc_component *scomp, struct snd_sof_pcm *spcm, int dir) @@ -1364,6 +1406,9 @@ static int sof_widget_unload(struct snd_soc_component *scomp, if (dai) list_del(&dai->list); + + sof_disconnect_dai_widget(scomp, widget); + break; default: break; |