Commit 171d5cce authored by Ranjani Sridharan's avatar Ranjani Sridharan Committed by Mark Brown

ASoC: SOF: ipc4-topology: Parse the SOF_COMP_TOKENS only once

There is no need to parse the cpc and is_pages values multiple times.
It is enough to parse the 2 tokens directly into the base_config field
in each module's init_instance IPC payload.
Signed-off-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarRander Wang <rander.wang@intel.com>
Reviewed-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: default avatarPéter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://lore.kernel.org/r/20230313124856.8140-6-peter.ujfalusi@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 594c1bb9
...@@ -170,6 +170,7 @@ static void sof_ipc4_dbg_audio_format(struct device *dev, ...@@ -170,6 +170,7 @@ static void sof_ipc4_dbg_audio_format(struct device *dev,
* @scomp: pointer to pointer to SOC component * @scomp: pointer to pointer to SOC component
* @swidget: pointer to struct snd_sof_widget containing tuples * @swidget: pointer to struct snd_sof_widget containing tuples
* @available_fmt: pointer to struct sof_ipc4_available_audio_format being filling in * @available_fmt: pointer to struct sof_ipc4_available_audio_format being filling in
* @module_base_cfg: Pointer to the base_config in the module init IPC payload
* @has_out_format: true if available_fmt contains output format * @has_out_format: true if available_fmt contains output format
* *
* Return: 0 if successful * Return: 0 if successful
...@@ -177,6 +178,7 @@ static void sof_ipc4_dbg_audio_format(struct device *dev, ...@@ -177,6 +178,7 @@ static void sof_ipc4_dbg_audio_format(struct device *dev,
static int sof_ipc4_get_audio_fmt(struct snd_soc_component *scomp, static int sof_ipc4_get_audio_fmt(struct snd_soc_component *scomp,
struct snd_sof_widget *swidget, struct snd_sof_widget *swidget,
struct sof_ipc4_available_audio_format *available_fmt, struct sof_ipc4_available_audio_format *available_fmt,
struct sof_ipc4_base_module_cfg *module_base_cfg,
bool has_out_format) bool has_out_format)
{ {
struct sof_ipc4_base_module_cfg *base_config; struct sof_ipc4_base_module_cfg *base_config;
...@@ -199,17 +201,18 @@ static int sof_ipc4_get_audio_fmt(struct snd_soc_component *scomp, ...@@ -199,17 +201,18 @@ static int sof_ipc4_get_audio_fmt(struct snd_soc_component *scomp,
if (!base_config) if (!base_config)
return -ENOMEM; return -ENOMEM;
/* set cpc and is_pages for all base_cfg */ /* set cpc and is_pages in the module's base_config */
for (i = 0; i < available_fmt->audio_fmt_num; i++) { ret = sof_update_ipc_object(scomp, module_base_cfg, SOF_COMP_TOKENS, swidget->tuples,
ret = sof_update_ipc_object(scomp, &base_config[i], swidget->num_tuples, sizeof(*module_base_cfg), 1);
SOF_COMP_TOKENS, swidget->tuples, if (ret) {
swidget->num_tuples, sizeof(*base_config), 1); dev_err(scomp->dev, "parse comp tokens for %s failed, error: %d\n",
if (ret) { swidget->widget->name, ret);
dev_err(scomp->dev, "parse comp tokens failed %d\n", ret); goto err;
goto err;
}
} }
dev_dbg(scomp->dev, "widget %s cpc: %d is_pages: %d\n",
swidget->widget->name, module_base_cfg->cpc, module_base_cfg->is_pages);
/* copy the ibs/obs for each base_cfg */ /* copy the ibs/obs for each base_cfg */
ret = sof_update_ipc_object(scomp, base_config, ret = sof_update_ipc_object(scomp, base_config,
SOF_AUDIO_FORMAT_BUFFER_SIZE_TOKENS, swidget->tuples, SOF_AUDIO_FORMAT_BUFFER_SIZE_TOKENS, swidget->tuples,
...@@ -221,9 +224,8 @@ static int sof_ipc4_get_audio_fmt(struct snd_soc_component *scomp, ...@@ -221,9 +224,8 @@ static int sof_ipc4_get_audio_fmt(struct snd_soc_component *scomp,
} }
for (i = 0; i < available_fmt->audio_fmt_num; i++) for (i = 0; i < available_fmt->audio_fmt_num; i++)
dev_dbg(scomp->dev, "%d: ibs: %d obs: %d cpc: %d is_pages: %d\n", i, dev_dbg(scomp->dev, "%d: ibs: %d obs: %d\n", i,
base_config[i].ibs, base_config[i].obs, base_config[i].ibs, base_config[i].obs);
base_config[i].cpc, base_config[i].is_pages);
in_format = kcalloc(available_fmt->audio_fmt_num, in_format = kcalloc(available_fmt->audio_fmt_num,
sizeof(struct sof_ipc4_audio_format), GFP_KERNEL); sizeof(struct sof_ipc4_audio_format), GFP_KERNEL);
...@@ -359,7 +361,8 @@ static int sof_ipc4_widget_setup_pcm(struct snd_sof_widget *swidget) ...@@ -359,7 +361,8 @@ static int sof_ipc4_widget_setup_pcm(struct snd_sof_widget *swidget)
dev_dbg(scomp->dev, "Updating IPC structure for %s\n", swidget->widget->name); dev_dbg(scomp->dev, "Updating IPC structure for %s\n", swidget->widget->name);
ret = sof_ipc4_get_audio_fmt(scomp, swidget, available_fmt, true); ret = sof_ipc4_get_audio_fmt(scomp, swidget, available_fmt,
&ipc4_copier->data.base_config, true);
if (ret) if (ret)
goto free_copier; goto free_copier;
...@@ -457,7 +460,8 @@ static int sof_ipc4_widget_setup_comp_dai(struct snd_sof_widget *swidget) ...@@ -457,7 +460,8 @@ static int sof_ipc4_widget_setup_comp_dai(struct snd_sof_widget *swidget)
dev_dbg(scomp->dev, "Updating IPC structure for %s\n", swidget->widget->name); dev_dbg(scomp->dev, "Updating IPC structure for %s\n", swidget->widget->name);
ret = sof_ipc4_get_audio_fmt(scomp, swidget, available_fmt, true); ret = sof_ipc4_get_audio_fmt(scomp, swidget, available_fmt,
&ipc4_copier->data.base_config, true);
if (ret) if (ret)
goto free_copier; goto free_copier;
...@@ -665,7 +669,8 @@ static int sof_ipc4_widget_setup_comp_pga(struct snd_sof_widget *swidget) ...@@ -665,7 +669,8 @@ static int sof_ipc4_widget_setup_comp_pga(struct snd_sof_widget *swidget)
gain->data.init_val = SOF_IPC4_VOL_ZERO_DB; gain->data.init_val = SOF_IPC4_VOL_ZERO_DB;
/* The out_audio_fmt in topology is ignored as it is not required to be sent to the FW */ /* The out_audio_fmt in topology is ignored as it is not required to be sent to the FW */
ret = sof_ipc4_get_audio_fmt(scomp, swidget, &gain->available_fmt, false); ret = sof_ipc4_get_audio_fmt(scomp, swidget, &gain->available_fmt, &gain->base_config,
false);
if (ret) if (ret)
goto err; goto err;
...@@ -731,7 +736,8 @@ static int sof_ipc4_widget_setup_comp_mixer(struct snd_sof_widget *swidget) ...@@ -731,7 +736,8 @@ static int sof_ipc4_widget_setup_comp_mixer(struct snd_sof_widget *swidget)
swidget->private = mixer; swidget->private = mixer;
/* The out_audio_fmt in topology is ignored as it is not required to be sent to the FW */ /* The out_audio_fmt in topology is ignored as it is not required to be sent to the FW */
ret = sof_ipc4_get_audio_fmt(scomp, swidget, &mixer->available_fmt, false); ret = sof_ipc4_get_audio_fmt(scomp, swidget, &mixer->available_fmt,
&mixer->base_config, false);
if (ret) if (ret)
goto err; goto err;
...@@ -762,7 +768,8 @@ static int sof_ipc4_widget_setup_comp_src(struct snd_sof_widget *swidget) ...@@ -762,7 +768,8 @@ static int sof_ipc4_widget_setup_comp_src(struct snd_sof_widget *swidget)
swidget->private = src; swidget->private = src;
/* The out_audio_fmt in topology is ignored as it is not required by SRC */ /* The out_audio_fmt in topology is ignored as it is not required by SRC */
ret = sof_ipc4_get_audio_fmt(scomp, swidget, &src->available_fmt, false); ret = sof_ipc4_get_audio_fmt(scomp, swidget, &src->available_fmt, &src->base_config,
false);
if (ret) if (ret)
goto err; goto err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment