Commit 683b54ef authored by Ranjani Sridharan's avatar Ranjani Sridharan Committed by Mark Brown

ASoC: SOF: topology: Make mux/demux widget parsing IPC agnostic

Define the list of tokens pertaining to the mux/demux widgets, parse and
save them as part of the swidget tuples array. Once topology parsing is
complete, these tokens will be applied to create the IPC structure for the
mux/demux component based on the topology widget_setup op in ipc3_tplg_ops.
Signed-off-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.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>
Link: https://lore.kernel.org/r/20220314200520.1233427-11-ranjani.sridharan@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 30f41680
...@@ -324,6 +324,41 @@ static int sof_ipc3_widget_setup_comp_buffer(struct snd_sof_widget *swidget) ...@@ -324,6 +324,41 @@ static int sof_ipc3_widget_setup_comp_buffer(struct snd_sof_widget *swidget)
return 0; return 0;
} }
/*
* Mux topology
*/
static int sof_ipc3_widget_setup_comp_mux(struct snd_sof_widget *swidget)
{
struct snd_soc_component *scomp = swidget->scomp;
struct sof_ipc_comp_mux *mux;
size_t ipc_size = sizeof(*mux);
int ret;
mux = sof_comp_alloc(swidget, &ipc_size, swidget->pipeline_id);
if (!mux)
return -ENOMEM;
swidget->private = mux;
/* configure mux IPC message */
mux->comp.type = SOF_COMP_MUX;
mux->config.hdr.size = sizeof(mux->config);
/* parse one set of comp tokens */
ret = sof_update_ipc_object(scomp, &mux->config, SOF_COMP_TOKENS,
swidget->tuples, swidget->num_tuples, sizeof(mux->config), 1);
if (ret < 0) {
kfree(swidget->private);
swidget->private = NULL;
return ret;
}
dev_dbg(scomp->dev, "loaded mux %s\n", swidget->widget->name);
sof_dbg_comp_config(scomp, &mux->config);
return 0;
}
/* /*
* PGA Topology * PGA Topology
*/ */
...@@ -430,6 +465,11 @@ static const struct sof_ipc_tplg_widget_ops tplg_ipc3_widget_ops[SND_SOC_DAPM_TY ...@@ -430,6 +465,11 @@ static const struct sof_ipc_tplg_widget_ops tplg_ipc3_widget_ops[SND_SOC_DAPM_TY
pipeline_token_list, ARRAY_SIZE(pipeline_token_list), NULL}, pipeline_token_list, ARRAY_SIZE(pipeline_token_list), NULL},
[snd_soc_dapm_pga] = {sof_ipc3_widget_setup_comp_pga, sof_ipc3_widget_free_comp, [snd_soc_dapm_pga] = {sof_ipc3_widget_setup_comp_pga, sof_ipc3_widget_free_comp,
pga_token_list, ARRAY_SIZE(pga_token_list), NULL}, pga_token_list, ARRAY_SIZE(pga_token_list), NULL},
[snd_soc_dapm_mux] = {sof_ipc3_widget_setup_comp_mux, sof_ipc3_widget_free_comp,
comp_generic_token_list, ARRAY_SIZE(comp_generic_token_list), NULL},
[snd_soc_dapm_demux] = {sof_ipc3_widget_setup_comp_mux, sof_ipc3_widget_free_comp,
comp_generic_token_list, ARRAY_SIZE(comp_generic_token_list),
NULL},
}; };
static const struct sof_ipc_tplg_ops ipc3_tplg_ops = { static const struct sof_ipc_tplg_ops ipc3_tplg_ops = {
......
...@@ -1792,44 +1792,6 @@ static int sof_widget_parse_tokens(struct snd_soc_component *scomp, struct snd_s ...@@ -1792,44 +1792,6 @@ static int sof_widget_parse_tokens(struct snd_soc_component *scomp, struct snd_s
return ret; return ret;
} }
/*
* Mux topology
*/
static int sof_widget_load_mux(struct snd_soc_component *scomp, int index,
struct snd_sof_widget *swidget,
struct snd_soc_tplg_dapm_widget *tw)
{
struct snd_soc_tplg_private *private = &tw->priv;
struct sof_ipc_comp_mux *mux;
size_t ipc_size = sizeof(*mux);
int ret;
mux = (struct sof_ipc_comp_mux *)
sof_comp_alloc(swidget, &ipc_size, index);
if (!mux)
return -ENOMEM;
/* configure mux IPC message */
mux->comp.type = SOF_COMP_MUX;
mux->config.hdr.size = sizeof(mux->config);
ret = sof_parse_tokens(scomp, &mux->config, comp_tokens,
ARRAY_SIZE(comp_tokens), private->array,
le32_to_cpu(private->size));
if (ret != 0) {
dev_err(scomp->dev, "error: parse mux.cfg tokens failed %d\n",
private->size);
kfree(mux);
return ret;
}
sof_dbg_comp_config(scomp, &mux->config);
swidget->private = mux;
return 0;
}
/* /*
* SRC Topology * SRC Topology
*/ */
...@@ -2316,6 +2278,8 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index, ...@@ -2316,6 +2278,8 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index,
case snd_soc_dapm_scheduler: case snd_soc_dapm_scheduler:
case snd_soc_dapm_aif_out: case snd_soc_dapm_aif_out:
case snd_soc_dapm_aif_in: case snd_soc_dapm_aif_in:
case snd_soc_dapm_mux:
case snd_soc_dapm_demux:
ret = sof_widget_parse_tokens(scomp, swidget, tw, token_list, token_list_size); ret = sof_widget_parse_tokens(scomp, swidget, tw, token_list, token_list_size);
break; break;
case snd_soc_dapm_src: case snd_soc_dapm_src:
...@@ -2330,10 +2294,6 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index, ...@@ -2330,10 +2294,6 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index,
case snd_soc_dapm_effect: case snd_soc_dapm_effect:
ret = sof_widget_load_process(scomp, index, swidget, tw); ret = sof_widget_load_process(scomp, index, swidget, tw);
break; break;
case snd_soc_dapm_mux:
case snd_soc_dapm_demux:
ret = sof_widget_load_mux(scomp, index, swidget, tw);
break;
case snd_soc_dapm_switch: case snd_soc_dapm_switch:
case snd_soc_dapm_dai_link: case snd_soc_dapm_dai_link:
case snd_soc_dapm_kcontrol: case snd_soc_dapm_kcontrol:
......
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