Commit e79986ce authored by Amadeusz Sławiński's avatar Amadeusz Sławiński Committed by Mark Brown

ASoC: Intel: Skylake: Properly cleanup on component removal

When we remove component we need to reverse things which were done on
init, this consists of topology cleanup, lists cleanup and releasing
firmware.

Currently cleanup handlers are put in wrong places or otherwise missing.
So add proper component cleanup function and perform cleanups in it.
Signed-off-by: default avatarAmadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 5b8e4c1c
...@@ -1471,8 +1471,12 @@ static int skl_platform_soc_probe(struct snd_soc_component *component) ...@@ -1471,8 +1471,12 @@ static int skl_platform_soc_probe(struct snd_soc_component *component)
static void skl_pcm_remove(struct snd_soc_component *component) static void skl_pcm_remove(struct snd_soc_component *component)
{ {
/* remove topology */ struct hdac_bus *bus = dev_get_drvdata(component->dev);
snd_soc_tplg_component_remove(component, SND_SOC_TPLG_INDEX_ALL); struct skl *skl = bus_to_skl(bus);
skl_tplg_exit(component, bus);
skl_debugfs_exit(skl);
} }
static const struct snd_soc_component_driver skl_component = { static const struct snd_soc_component_driver skl_component = {
......
...@@ -3757,3 +3757,18 @@ int skl_tplg_init(struct snd_soc_component *component, struct hdac_bus *bus) ...@@ -3757,3 +3757,18 @@ int skl_tplg_init(struct snd_soc_component *component, struct hdac_bus *bus)
return 0; return 0;
} }
void skl_tplg_exit(struct snd_soc_component *component, struct hdac_bus *bus)
{
struct skl *skl = bus_to_skl(bus);
struct skl_pipeline *ppl, *tmp;
if (!list_empty(&skl->ppl_list))
list_for_each_entry_safe(ppl, tmp, &skl->ppl_list, node)
list_del(&ppl->node);
/* clean up topology */
snd_soc_tplg_component_remove(component, SND_SOC_TPLG_INDEX_ALL);
release_firmware(skl->tplg);
}
...@@ -471,6 +471,8 @@ void skl_tplg_set_be_dmic_config(struct snd_soc_dai *dai, ...@@ -471,6 +471,8 @@ void skl_tplg_set_be_dmic_config(struct snd_soc_dai *dai,
struct skl_pipe_params *params, int stream); struct skl_pipe_params *params, int stream);
int skl_tplg_init(struct snd_soc_component *component, int skl_tplg_init(struct snd_soc_component *component,
struct hdac_bus *ebus); struct hdac_bus *ebus);
void skl_tplg_exit(struct snd_soc_component *component,
struct hdac_bus *bus);
struct skl_module_cfg *skl_tplg_fe_get_cpr_module( struct skl_module_cfg *skl_tplg_fe_get_cpr_module(
struct snd_soc_dai *dai, int stream); struct snd_soc_dai *dai, int stream);
int skl_tplg_update_pipe_params(struct device *dev, int skl_tplg_update_pipe_params(struct device *dev,
......
...@@ -1119,14 +1119,12 @@ static void skl_remove(struct pci_dev *pci) ...@@ -1119,14 +1119,12 @@ static void skl_remove(struct pci_dev *pci)
struct skl *skl = bus_to_skl(bus); struct skl *skl = bus_to_skl(bus);
cancel_work_sync(&skl->probe_work); cancel_work_sync(&skl->probe_work);
release_firmware(skl->tplg);
pm_runtime_get_noresume(&pci->dev); pm_runtime_get_noresume(&pci->dev);
/* codec removal, invoke bus_device_remove */ /* codec removal, invoke bus_device_remove */
snd_hdac_ext_bus_device_remove(bus); snd_hdac_ext_bus_device_remove(bus);
skl->debugfs = NULL;
skl_platform_unregister(&pci->dev); skl_platform_unregister(&pci->dev);
skl_free_dsp(skl); skl_free_dsp(skl);
skl_machine_device_unregister(skl); skl_machine_device_unregister(skl);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment