mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
ASoC: topology: Properly unregister DAI on removal
DAIs need to be removed when topology unload function is called (usually
done when component is being removed). We can't do this when device is
being removed, as structures we operate on when removing DAI can already
be freed.
Fixes: 6ae4902f2f
("ASoC: soc-topology: use devm_snd_soc_register_dai()")
Signed-off-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Tested-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20210120152846.1703655-2-amadeuszx.slawinski@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
e36626bb09
commit
fc4cb1e15f
1 changed files with 5 additions and 4 deletions
|
@ -447,7 +447,7 @@ static void remove_dai(struct snd_soc_component *comp,
|
|||
{
|
||||
struct snd_soc_dai_driver *dai_drv =
|
||||
container_of(dobj, struct snd_soc_dai_driver, dobj);
|
||||
struct snd_soc_dai *dai;
|
||||
struct snd_soc_dai *dai, *_dai;
|
||||
|
||||
if (pass != SOC_TPLG_PASS_PCM_DAI)
|
||||
return;
|
||||
|
@ -455,9 +455,9 @@ static void remove_dai(struct snd_soc_component *comp,
|
|||
if (dobj->ops && dobj->ops->dai_unload)
|
||||
dobj->ops->dai_unload(comp, dobj);
|
||||
|
||||
for_each_component_dais(comp, dai)
|
||||
for_each_component_dais_safe(comp, dai, _dai)
|
||||
if (dai->driver == dai_drv)
|
||||
dai->driver = NULL;
|
||||
snd_soc_unregister_dai(dai);
|
||||
|
||||
list_del(&dobj->list);
|
||||
}
|
||||
|
@ -1742,7 +1742,7 @@ static int soc_tplg_dai_create(struct soc_tplg *tplg,
|
|||
list_add(&dai_drv->dobj.list, &tplg->comp->dobj_list);
|
||||
|
||||
/* register the DAI to the component */
|
||||
dai = devm_snd_soc_register_dai(tplg->dev, tplg->comp, dai_drv, false);
|
||||
dai = snd_soc_register_dai(tplg->comp, dai_drv, false);
|
||||
if (!dai)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -1750,6 +1750,7 @@ static int soc_tplg_dai_create(struct soc_tplg *tplg,
|
|||
ret = snd_soc_dapm_new_dai_widgets(dapm, dai);
|
||||
if (ret != 0) {
|
||||
dev_err(dai->dev, "Failed to create DAI widgets %d\n", ret);
|
||||
snd_soc_unregister_dai(dai);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue