summaryrefslogtreecommitdiffstats
path: root/sound/soc/soc-core.c
diff options
context:
space:
mode:
authorStephen Warren <swarren@nvidia.com>2012-06-08 12:34:21 -0600
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-06-13 13:18:04 +0100
commit18d756440e8ed292b772682c4440a9d33643225b (patch)
treeacf3fc935339dfdd105ff3376be0e690121c9f15 /sound/soc/soc-core.c
parenta9db7dbee0436f0c741c6dfb39ab0241d4131539 (diff)
downloadlinux-18d756440e8ed292b772682c4440a9d33643225b.tar.gz
linux-18d756440e8ed292b772682c4440a9d33643225b.tar.bz2
linux-18d756440e8ed292b772682c4440a9d33643225b.zip
ASoC: when removing a CPU DAI, clean up its DAPM context
When a standalone CPU DAI (one not part of a CODEC) is probed, widgets are created for it. Add a call to snd_soc_dapm_free() in order to clean these up when the CPU DAI is removed. In order for snd_soc_dapm_free() to work, the CPU DAI's DAPM context's list member must be initialized, since snd_soc_dapm_free() removes that from the list it's part of. Add it to the card's list of DAPM contexts. Signed-off-by: Stephen Warren <swarren@nvidia.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/soc-core.c')
-rw-r--r--sound/soc/soc-core.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 448d4a7c09dd..621c5bdea483 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -984,8 +984,10 @@ static void soc_remove_dai_link(struct snd_soc_card *card, int num, int order)
cpu_dai->probed = 0;
list_del(&cpu_dai->card_list);
- if (!cpu_dai->codec)
+ if (!cpu_dai->codec) {
+ snd_soc_dapm_free(&cpu_dai->dapm);
module_put(cpu_dai->dev->driver->owner);
+ }
}
}
@@ -1264,6 +1266,7 @@ static int soc_probe_dai_link(struct snd_soc_card *card, int num, int order)
if (!try_module_get(cpu_dai->dev->driver->owner))
return -ENODEV;
+ list_add(&cpu_dai->dapm.list, &card->dapm_list);
snd_soc_dapm_new_dai_widgets(&cpu_dai->dapm, cpu_dai);
}