]> www.infradead.org Git - linux.git/commitdiff
ASoC: SOF: sof-audio: Skip unprepare for in-use widgets on error rollback
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Wed, 12 Jun 2024 12:12:03 +0000 (15:12 +0300)
committerMark Brown <broonie@kernel.org>
Wed, 12 Jun 2024 17:26:30 +0000 (18:26 +0100)
If the ipc_prepare() callback fails for a module instance, on error rewind
we must skip the ipc_unprepare() call for ones that has positive use count.

The positive use count means that the module instance is in active use, it
cannot be unprepared.

The issue affects capture direction paths with branches (single dai with
multiple PCMs), the affected widgets are in the shared part of the paths.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-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>
Link: https://lore.kernel.org/r/20240612121203.15468-1-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/sof-audio.c

index b3ac040811e796c9de5ed7b9ebdbba66a02c98a4..ef9318947d74f5b06575d81e0d961be5eade441c 100644 (file)
@@ -485,7 +485,7 @@ sink_prepare:
                        if (ret < 0) {
                                /* unprepare the source widget */
                                if (widget_ops[widget->id].ipc_unprepare &&
-                                   swidget && swidget->prepared) {
+                                   swidget && swidget->prepared && swidget->use_count == 0) {
                                        widget_ops[widget->id].ipc_unprepare(swidget);
                                        swidget->prepared = false;
                                }