提交 57511976 编写于 作者: A Amadeusz Sławiński 提交者: Zheng Zengkai

ASoC: topology: Properly unregister DAI on removal

stable inclusion
from stable-5.10.13
commit 4a97f42a6690ea8b81c4b17bc422934dfd505821
bugzilla: 47995

--------------------------------

commit fc4cb1e1 upstream.

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: 6ae4902f ("ASoC: soc-topology: use devm_snd_soc_register_dai()")
Signed-off-by: NAmadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Tested-by: NPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20210120152846.1703655-2-amadeuszx.slawinski@linux.intel.comSigned-off-by: NMark Brown <broonie@kernel.org>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
上级 843ef2e8
......@@ -506,7 +506,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;
......@@ -514,9 +514,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);
kfree(dai_drv->playback.stream_name);
kfree(dai_drv->capture.stream_name);
......@@ -1876,7 +1876,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->comp->dev, tplg->comp, dai_drv, false);
dai = snd_soc_register_dai(tplg->comp, dai_drv, false);
if (!dai)
return -ENOMEM;
......@@ -1884,6 +1884,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;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册