summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarsha Priya <priya.harsha@intel.com>2011-01-05 11:34:51 +0530
committerMark Brown <broonie@opensource.wolfsonmicro.com>2011-01-05 11:29:00 +0000
commitf6c2ed5dd6ab43447dacc136585fc894e3f3a82d (patch)
tree5738b81956b7544495ffe9b7e9f6308d590bf7c7
parent5e79d64b038ae0039663f721f4b9f5ce1951d9da (diff)
downloadlinux-3.10-f6c2ed5dd6ab43447dacc136585fc894e3f3a82d.tar.gz
linux-3.10-f6c2ed5dd6ab43447dacc136585fc894e3f3a82d.tar.bz2
linux-3.10-f6c2ed5dd6ab43447dacc136585fc894e3f3a82d.zip
ASoC: Fix the device references to codec and platform drivers
The soc-core takes the platform and codec driver reference during probe. Few of these references are not released during remove. This cause the platform and codec driver module unload to fail. This patch fixes by the taking only one reference to platform and codec module during probe and releases them correctly during remove. This allows load/unload properly Signed-off-by: Vinod Koul <vinod.koul@intel.com> Signed-off-by: Harsha Priya <priya.harsha@intel.com> Acked-by: Liam Girdwood <lrg@slimlogic.co.uk> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r--sound/soc/soc-core.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index a233607a73c..bac7291b6ff 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -1259,9 +1259,6 @@ find_codec:
if (!strcmp(codec->name, dai_link->codec_name)) {
rtd->codec = codec;
- if (!try_module_get(codec->dev->driver->owner))
- return -ENODEV;
-
/* CODEC found, so find CODEC DAI from registered DAIs from this CODEC*/
list_for_each_entry(codec_dai, &dai_list, list) {
if (codec->dev == codec_dai->dev &&
@@ -1287,10 +1284,6 @@ find_platform:
/* no, then find CPU DAI from registered DAIs*/
list_for_each_entry(platform, &platform_list, list) {
if (!strcmp(platform->name, dai_link->platform_name)) {
-
- if (!try_module_get(platform->dev->driver->owner))
- return -ENODEV;
-
rtd->platform = platform;
goto out;
}
@@ -1425,6 +1418,9 @@ static int soc_probe_codec(struct snd_soc_card *card,
soc_init_codec_debugfs(codec);
/* mark codec as probed and add to card codec list */
+ if (!try_module_get(codec->dev->driver->owner))
+ return -ENODEV;
+
codec->probed = 1;
list_add(&codec->card_list, &card->codec_dev_list);
list_add(&codec->dapm.list, &card->dapm_list);
@@ -1556,6 +1552,10 @@ static int soc_probe_dai_link(struct snd_soc_card *card, int num)
}
}
/* mark platform as probed and add to card platform list */
+
+ if (!try_module_get(platform->dev->driver->owner))
+ return -ENODEV;
+
platform->probed = 1;
list_add(&platform->card_list, &card->platform_dev_list);
}