Skip to content

Commit

Permalink
ASoC: when initializing CPU DAI, don't duplicate any CODEC init
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Stephen Warren authored and Mark Brown committed Jun 13, 2012
1 parent b883f36 commit a9db7db
Showing 1 changed file with 9 additions and 5 deletions.
14 changes: 9 additions & 5 deletions sound/soc/soc-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit a9db7db

Please sign in to comment.