Skip to contentSkip to conversation

ASoC: SOF: sof-audio: Fixes for widget prepare and unprepare

PATCH Superseded Peter Ujfalusi 2 participants 5 messages Jan 13, 2023 – Jan 16, 2023

Subsystems (3)

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore

Peter Ujfalusi

author maintainer
#0 lore raw

cover ASoC: SOF: sof-audio: Fixes for widget prepare and unprepare

Hi,

This series contains one fix (first patch) followed by a nice to have safety belts in case we get a widget from topology which is not handled by SOF and will not have corresponding swidget associated with.

I think these can be sent selectively to stable kernels with appropriate adjustments to apply.

I was not comfortable to add Fixes or Complements tags since the last patch for sure going to conflict in some stable variants.

Regards,
Peter
---
Bard Liao (2):
ASoC: SOF: sof-audio: Unprepare when swidget->use_count > 0
ASoC: SOF: sof-audio: keep prepare/unprepare widgets in sink path

Ranjani Sridharan (1):
ASoC: SOF: sof-audio: skip prepare/unprepare if swidget is NULL

 sound/soc/sof/sof-audio.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)
Signature · 1 line
2.39.0
author maintainer
#1 lore raw

PATCH 1/3 ASoC: SOF: sof-audio: Unprepare when swidget->use_count > 0

From: Bard Liao <[email protected]>

We should unprepare the widget if its use_count = 1.

Fixes 9862dcf70245 ("ASoC: SOF: don't unprepare widget used other pipelines")
---
 sound/soc/sof/sof-audio.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/sof/sof-audio.c +1 -1
index e1ab8380e7d8..068501ed7951 100644
@@ -274,7 +274,7 @@ sof_unprepare_widgets_in_path(struct snd_sof_dev *sdev, struct snd_soc_dapm_widg
 	struct snd_soc_dapm_path *p;
 
 	/* return if the widget is in use or if it is already unprepared */
-	if (!swidget->prepared || swidget->use_count > 1)
+	if (!swidget->prepared || swidget->use_count > 0)
 		return;
 
 	widget_ops = tplg_ops ? tplg_ops->widget : NULL;
Signature · 1 line
2.39.0
author maintainer
#2 lore raw

PATCH 2/3 ASoC: SOF: sof-audio: keep prepare/unprepare widgets in sink path

In reply to Peter Ujfalusi

From: Bard Liao <[email protected]>

The existing code return when a widget doesn't need to prepare/unprepare. This will prevent widgets in the sink path from being prepared/unprepared.

---
 sound/soc/sof/sof-audio.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
sound/soc/sof/sof-audio.c +3 -2
index 068501ed7951..721de96fdb83 100644
@@ -273,9 +273,9 @@ sof_unprepare_widgets_in_path(struct snd_sof_dev *sdev, struct snd_soc_dapm_widg
 	const struct sof_ipc_tplg_widget_ops *widget_ops;
 	struct snd_soc_dapm_path *p;
 
-	/* return if the widget is in use or if it is already unprepared */
+	/* skip if the widget is in use or if it is already unprepared */
 	if (!swidget->prepared || swidget->use_count > 0)
-		return;
+		goto sink_unprepare;
 
 	widget_ops = tplg_ops ? tplg_ops->widget : NULL;
 	if (widget_ops && widget_ops[widget->id].ipc_unprepare)
@@ -284,6 +284,7 @@ sof_unprepare_widgets_in_path(struct snd_sof_dev *sdev, struct snd_soc_dapm_widg
 
 	swidget->prepared = false;
 
+sink_unprepare:
 	/* unprepare all widgets in the sink paths */
 	snd_soc_dapm_widget_for_each_sink_path(widget, p) {
 		if (!p->walking && p->sink->dobj.private) {
Signature · 1 line
2.39.0
author maintainer
#3 lore raw

PATCH 3/3 ASoC: SOF: sof-audio: skip prepare/unprepare if swidget is NULL

In reply to Peter Ujfalusi

From: Ranjani Sridharan <[email protected]>

Skip preparing/unpreparing widgets if the swidget pointer is NULL. This will be true in the case of virtual widgets in topology that were added for reusing the legacy HDA machine driver with SOF.

---
 sound/soc/sof/sof-audio.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/sof/sof-audio.c +2 -2
index 721de96fdb83..5c878788dedb 100644
@@ -274,7 +274,7 @@ sof_unprepare_widgets_in_path(struct snd_sof_dev *sdev, struct snd_soc_dapm_widg
 	struct snd_soc_dapm_path *p;
 
 	/* skip if the widget is in use or if it is already unprepared */
-	if (!swidget->prepared || swidget->use_count > 0)
+	if (!swidget || !swidget->prepared || swidget->use_count > 0)
 		goto sink_unprepare;
 
 	widget_ops = tplg_ops ? tplg_ops->widget : NULL;
@@ -311,7 +311,7 @@ sof_prepare_widgets_in_path(struct snd_sof_dev *sdev, struct snd_soc_dapm_widget
 	if (!widget_ops)
 		return 0;
 
-	if (!widget_ops[widget->id].ipc_prepare || swidget->prepared)
+	if (!swidget || !widget_ops[widget->id].ipc_prepare || swidget->prepared)
 		goto sink_prepare;
 
 	/* prepare the source widget */
Signature · 1 line
2.39.0
#4 lore raw

Re: [PATCH 3/3] ASoC: SOF: sof-audio: skip prepare/unprepare if swidget is NULL

Il 13/01/23 17:18, Peter Ujfalusi ha scritto:

Quoted 9 lines

From: Ranjani Sridharan <[email protected]>

Skip preparing/unpreparing widgets if the swidget pointer is NULL. This will be true in the case of virtual widgets in topology that were added for reusing the legacy HDA machine driver with SOF.

I asked you to add a Fixes tag to this commit before you pushed it.

Please add a Fixes tag.

Regards,
Angelo