mirror of
https://github.com/torvalds/linux.git
synced 2024-11-07 12:41:55 +00:00
ASoC: when initializing CPU DAI, don't duplicate any CODEC init
If the CPU-side of a DAI link is a CODEC rather than a standalone DAI, the codec initialization will call try_module_get() and create the DAI widgets. Ensure that this isn't duplicated when the CPU DAI itself is probed, if the CPU DAI is part of a CODEC. Note that this is not a complete fix on its own, since there's no guarantee that the CODEC itself will be initialized - currently that only happens if the CODEC is also used as the CODEC-side of a DAI link, and that initialization may happen before or after the DAIs within the CODEC are initialized. However, such a scenario doesn't necessarily currently work, and I don't think this change alone makes it any worse. This is fixed in a couple patches time. Signed-off-by: Stephen Warren <swarren@nvidia.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
parent
b883f36349
commit
a9db7dbee0
@ -983,7 +983,9 @@ 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);
|
||||
module_put(cpu_dai->dev->driver->owner);
|
||||
|
||||
if (!cpu_dai->codec)
|
||||
module_put(cpu_dai->dev->driver->owner);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1257,11 +1259,13 @@ static int soc_probe_dai_link(struct snd_soc_card *card, int num, int order)
|
||||
/* probe the cpu_dai */
|
||||
if (!cpu_dai->probed &&
|
||||
cpu_dai->driver->probe_order == order) {
|
||||
cpu_dai->dapm.card = card;
|
||||
if (!try_module_get(cpu_dai->dev->driver->owner))
|
||||
return -ENODEV;
|
||||
if (!cpu_dai->codec) {
|
||||
cpu_dai->dapm.card = card;
|
||||
if (!try_module_get(cpu_dai->dev->driver->owner))
|
||||
return -ENODEV;
|
||||
|
||||
snd_soc_dapm_new_dai_widgets(&cpu_dai->dapm, cpu_dai);
|
||||
snd_soc_dapm_new_dai_widgets(&cpu_dai->dapm, cpu_dai);
|
||||
}
|
||||
|
||||
if (cpu_dai->driver->probe) {
|
||||
ret = cpu_dai->driver->probe(cpu_dai);
|
||||
|
Loading…
Reference in New Issue
Block a user