Skip to content

Commit

Permalink
ASoC: SOF: sof-audio: setup sched widgets during pipeline complete step
Browse files Browse the repository at this point in the history
Older firmware prior to ABI 3.19 has a dependency where the scheduler
widgets need to be setup last. Moving the call to sof_widget_setup()
before the pipeline_complete() call also helps remove the need for the
'reverse' direction when walking through the widget list - this was
only working because of the topology macros but the topology does not
require any order.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
  • Loading branch information
plbossart authored and kv2019i committed Aug 24, 2021
1 parent 3148a6d commit 396be61
Showing 1 changed file with 17 additions and 2 deletions.
19 changes: 17 additions & 2 deletions sound/soc/sof/sof-audio.c
Original file line number Diff line number Diff line change
Expand Up @@ -620,12 +620,13 @@ const struct sof_ipc_pipe_new *snd_sof_pipeline_find(struct snd_sof_dev *sdev,

int sof_set_up_pipelines(struct snd_sof_dev *sdev, bool verify)
{
struct sof_ipc_fw_version *v = &sdev->fw_ready.version;
struct snd_sof_widget *swidget;
struct snd_sof_route *sroute;
int ret;

/* restore pipeline components */
list_for_each_entry_reverse(swidget, &sdev->widget_list, list) {
list_for_each_entry(swidget, &sdev->widget_list, list) {
/* only set up the widgets belonging to static pipelines */
if (!verify && swidget->dynamic_pipeline_widget)
continue;
Expand All @@ -638,6 +639,14 @@ int sof_set_up_pipelines(struct snd_sof_dev *sdev, bool verify)
if (!dai || !dai->dai_config)
continue;

/*
* For older firmware, skip scheduler widgets in this loop,
* sof_widget_setup() will be called in the 'complete pipeline' loop
*/
if (v->abi_version < SOF_ABI_VER(3, 19, 0) &&
swidget->id == snd_soc_dapm_scheduler)
continue;

config = dai->dai_config;
/*
* The link DMA channel would be invalidated for running
Expand Down Expand Up @@ -697,6 +706,12 @@ int sof_set_up_pipelines(struct snd_sof_dev *sdev, bool verify)
if (!verify && swidget->dynamic_pipeline_widget)
continue;

if (v->abi_version < SOF_ABI_VER(3, 19, 0)) {
ret = sof_widget_setup(sdev, swidget);
if (ret < 0)
return ret;
}

swidget->complete =
snd_sof_complete_pipeline(sdev, swidget);
break;
Expand Down Expand Up @@ -725,7 +740,7 @@ int sof_tear_down_pipelines(struct snd_sof_dev *sdev, bool verify)
* sroute->setup because during suspend all streams are suspended and during topology
* loading the sound card unavailable to open PCMs.
*/
list_for_each_entry_reverse(swidget, &sdev->widget_list, list) {
list_for_each_entry(swidget, &sdev->widget_list, list) {
if (swidget->dynamic_pipeline_widget)
continue;

Expand Down

0 comments on commit 396be61

Please sign in to comment.