diff options
author | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2023-10-09 14:54:25 +0300 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2023-10-19 15:52:32 +0300 |
commit | f549a82aff57865c47b5abd17336b23cd9bb2d2c (patch) | |
tree | bc11a512d9326f5fa423d8b1ef185917519da0f8 /sound/soc/sof/core.c | |
parent | 87543ce5030a17ff5056668d7e6c433168c63bb5 (diff) | |
download | linux-f549a82aff57865c47b5abd17336b23cd9bb2d2c.tar.xz |
ASoC: SOF: core: Ensure sof_ops_free() is still called when probe never ran.
In an effort to not call sof_ops_free twice, we stopped running it when
probe was aborted.
Check the result of cancel_work_sync to see if this was the case.
Fixes: 31bb7bd9ffee ("ASoC: SOF: core: Only call sof_ops_free() on remove if the probe was successful")
Cc: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Acked-by: Mark Brown <broonie@kernel.org>
Reviewed-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Acked-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://lore.kernel.org/r/20231009115437.99976-2-maarten.lankhorst@linux.intel.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/soc/sof/core.c')
-rw-r--r-- | sound/soc/sof/core.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/sound/soc/sof/core.c b/sound/soc/sof/core.c index 2d1616b81485..0938b259f703 100644 --- a/sound/soc/sof/core.c +++ b/sound/soc/sof/core.c @@ -459,9 +459,10 @@ int snd_sof_device_remove(struct device *dev) struct snd_sof_dev *sdev = dev_get_drvdata(dev); struct snd_sof_pdata *pdata = sdev->pdata; int ret; + bool aborted = false; if (IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE)) - cancel_work_sync(&sdev->probe_work); + aborted = cancel_work_sync(&sdev->probe_work); /* * Unregister any registered client device first before IPC and debugfs @@ -487,6 +488,9 @@ int snd_sof_device_remove(struct device *dev) snd_sof_free_debug(sdev); snd_sof_remove(sdev); sof_ops_free(sdev); + } else if (aborted) { + /* probe_work never ran */ + sof_ops_free(sdev); } /* release firmware */ |