提交 f6c2ed5d 编写于 作者: H Harsha Priya 提交者: Mark Brown

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: NVinod Koul <vinod.koul@intel.com>
Signed-off-by: NHarsha Priya <priya.harsha@intel.com>
Acked-by: NLiam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
上级 5e79d64b
...@@ -1259,9 +1259,6 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num) ...@@ -1259,9 +1259,6 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
if (!strcmp(codec->name, dai_link->codec_name)) { if (!strcmp(codec->name, dai_link->codec_name)) {
rtd->codec = codec; 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*/ /* CODEC found, so find CODEC DAI from registered DAIs from this CODEC*/
list_for_each_entry(codec_dai, &dai_list, list) { list_for_each_entry(codec_dai, &dai_list, list) {
if (codec->dev == codec_dai->dev && if (codec->dev == codec_dai->dev &&
...@@ -1287,10 +1284,6 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num) ...@@ -1287,10 +1284,6 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
/* no, then find CPU DAI from registered DAIs*/ /* no, then find CPU DAI from registered DAIs*/
list_for_each_entry(platform, &platform_list, list) { list_for_each_entry(platform, &platform_list, list) {
if (!strcmp(platform->name, dai_link->platform_name)) { if (!strcmp(platform->name, dai_link->platform_name)) {
if (!try_module_get(platform->dev->driver->owner))
return -ENODEV;
rtd->platform = platform; rtd->platform = platform;
goto out; goto out;
} }
...@@ -1425,6 +1418,9 @@ static int soc_probe_codec(struct snd_soc_card *card, ...@@ -1425,6 +1418,9 @@ static int soc_probe_codec(struct snd_soc_card *card,
soc_init_codec_debugfs(codec); soc_init_codec_debugfs(codec);
/* mark codec as probed and add to card codec list */ /* mark codec as probed and add to card codec list */
if (!try_module_get(codec->dev->driver->owner))
return -ENODEV;
codec->probed = 1; codec->probed = 1;
list_add(&codec->card_list, &card->codec_dev_list); list_add(&codec->card_list, &card->codec_dev_list);
list_add(&codec->dapm.list, &card->dapm_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) ...@@ -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 */ /* mark platform as probed and add to card platform list */
if (!try_module_get(platform->dev->driver->owner))
return -ENODEV;
platform->probed = 1; platform->probed = 1;
list_add(&platform->card_list, &card->platform_dev_list); list_add(&platform->card_list, &card->platform_dev_list);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册