diff mbox series

ASoC: core: unregister clients and machine drivers in .shutdown

Message ID 20220215180628.3893282-1-kai.vehmanen@linux.intel.com
State Superseded
Headers show
Series ASoC: core: unregister clients and machine drivers in .shutdown | expand

Commit Message

Kai Vehmanen Feb. 15, 2022, 6:06 p.m. UTC
From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>

On a platform shutdown, the expectation for most drivers is that
userspace tasks will release all resources. When those sequences do
not complete, it can be the case that PCM devices exposed by ALSA
cards are used *after* the DSP shutdown completes, leading to a
platform hang.

When the clients and machine drivers provide an _unregister callback,
let's invoke it in the shutdown sequence.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
---
 sound/soc/sof/core.c | 9 +++++++++
 1 file changed, 9 insertions(+)


base-commit: f7d344a2bd5ec81fbd1ce76928fd059e57ec9bea

Comments

Kai Vehmanen Feb. 16, 2022, 1:49 p.m. UTC | #1
Hi,

On Wed, 16 Feb 2022, Amadeusz Sławiński wrote:

> On 2/15/2022 7:06 PM, Kai Vehmanen wrote:
> 
> Nitpicking, but I guess "SOF:" got lost in title ;)

thanks Amadeusz, that's indeed true. V2 sent with the correct title.

Br, Kai
diff mbox series

Patch

diff --git a/sound/soc/sof/core.c b/sound/soc/sof/core.c
index d99ecbb4282d..2a35d8ddf43e 100644
--- a/sound/soc/sof/core.c
+++ b/sound/soc/sof/core.c
@@ -463,10 +463,19 @@  EXPORT_SYMBOL(snd_sof_device_remove);
 int snd_sof_device_shutdown(struct device *dev)
 {
 	struct snd_sof_dev *sdev = dev_get_drvdata(dev);
+	struct snd_sof_pdata *pdata = sdev->pdata;
 
 	if (IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE))
 		cancel_work_sync(&sdev->probe_work);
 
+	/*
+	 * make sure clients and machine driver(s) are unregistered to force
+	 * all userspace devices to be closed prior to the DSP shutdown sequence
+	 */
+	sof_unregister_clients(sdev);
+
+	snd_sof_machine_unregister(sdev, pdata);
+
 	if (sdev->fw_state == SOF_FW_BOOT_COMPLETE)
 		return snd_sof_shutdown(sdev);