Skip to content

Commit 30f4168

Browse files
ranj063broonie
authored andcommitted
ASoC: SOF: topology: Make mixer widget parsing IPC agnostic
Define the list of tokens pertaining to the mixer 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 mixer component based on the topology widget_setup op in ipc3_tplg_ops. Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://lore.kernel.org/r/20220314200520.1233427-10-ranjani.sridharan@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 8a2e4a7 commit 30f4168

2 files changed

Lines changed: 44 additions & 42 deletions

File tree

sound/soc/sof/ipc3-topology.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,40 @@ static void sof_ipc3_widget_free_comp(struct snd_sof_widget *swidget)
190190
kfree(swidget->private);
191191
}
192192

193+
static int sof_ipc3_widget_setup_comp_mixer(struct snd_sof_widget *swidget)
194+
{
195+
struct snd_soc_component *scomp = swidget->scomp;
196+
struct sof_ipc_comp_mixer *mixer;
197+
size_t ipc_size = sizeof(*mixer);
198+
int ret;
199+
200+
mixer = sof_comp_alloc(swidget, &ipc_size, swidget->pipeline_id);
201+
if (!mixer)
202+
return -ENOMEM;
203+
204+
swidget->private = mixer;
205+
206+
/* configure mixer IPC message */
207+
mixer->comp.type = SOF_COMP_MIXER;
208+
mixer->config.hdr.size = sizeof(mixer->config);
209+
210+
/* parse one set of comp tokens */
211+
ret = sof_update_ipc_object(scomp, &mixer->config, SOF_COMP_TOKENS,
212+
swidget->tuples, swidget->num_tuples,
213+
sizeof(mixer->config), 1);
214+
if (ret < 0) {
215+
kfree(swidget->private);
216+
swidget->private = NULL;
217+
218+
return ret;
219+
}
220+
221+
dev_dbg(scomp->dev, "loaded mixer %s\n", swidget->widget->name);
222+
sof_dbg_comp_config(scomp, &mixer->config);
223+
224+
return 0;
225+
}
226+
193227
static int sof_ipc3_widget_setup_comp_pipeline(struct snd_sof_widget *swidget)
194228
{
195229
struct snd_soc_component *scomp = swidget->scomp;
@@ -358,6 +392,12 @@ static enum sof_tokens host_token_list[] = {
358392
SOF_COMP_TOKENS,
359393
};
360394

395+
static enum sof_tokens comp_generic_token_list[] = {
396+
SOF_CORE_TOKENS,
397+
SOF_COMP_EXT_TOKENS,
398+
SOF_COMP_TOKENS,
399+
};
400+
361401
static enum sof_tokens buffer_token_list[] = {
362402
SOF_BUFFER_TOKENS,
363403
};
@@ -383,6 +423,9 @@ static const struct sof_ipc_tplg_widget_ops tplg_ipc3_widget_ops[SND_SOC_DAPM_TY
383423
host_token_list, ARRAY_SIZE(host_token_list), NULL},
384424
[snd_soc_dapm_buffer] = {sof_ipc3_widget_setup_comp_buffer, sof_ipc3_widget_free_comp,
385425
buffer_token_list, ARRAY_SIZE(buffer_token_list), NULL},
426+
[snd_soc_dapm_mixer] = {sof_ipc3_widget_setup_comp_mixer, sof_ipc3_widget_free_comp,
427+
comp_generic_token_list, ARRAY_SIZE(comp_generic_token_list),
428+
NULL},
386429
[snd_soc_dapm_scheduler] = {sof_ipc3_widget_setup_comp_pipeline, sof_ipc3_widget_free_comp,
387430
pipeline_token_list, ARRAY_SIZE(pipeline_token_list), NULL},
388431
[snd_soc_dapm_pga] = {sof_ipc3_widget_setup_comp_pga, sof_ipc3_widget_free_comp,

sound/soc/sof/topology.c

Lines changed: 1 addition & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1792,45 +1792,6 @@ static int sof_widget_parse_tokens(struct snd_soc_component *scomp, struct snd_s
17921792
return ret;
17931793
}
17941794

1795-
/*
1796-
* Mixer topology
1797-
*/
1798-
1799-
static int sof_widget_load_mixer(struct snd_soc_component *scomp, int index,
1800-
struct snd_sof_widget *swidget,
1801-
struct snd_soc_tplg_dapm_widget *tw)
1802-
{
1803-
struct snd_soc_tplg_private *private = &tw->priv;
1804-
struct sof_ipc_comp_mixer *mixer;
1805-
size_t ipc_size = sizeof(*mixer);
1806-
int ret;
1807-
1808-
mixer = (struct sof_ipc_comp_mixer *)
1809-
sof_comp_alloc(swidget, &ipc_size, index);
1810-
if (!mixer)
1811-
return -ENOMEM;
1812-
1813-
/* configure mixer IPC message */
1814-
mixer->comp.type = SOF_COMP_MIXER;
1815-
mixer->config.hdr.size = sizeof(mixer->config);
1816-
1817-
ret = sof_parse_tokens(scomp, &mixer->config, comp_tokens,
1818-
ARRAY_SIZE(comp_tokens), private->array,
1819-
le32_to_cpu(private->size));
1820-
if (ret != 0) {
1821-
dev_err(scomp->dev, "error: parse mixer.cfg tokens failed %d\n",
1822-
private->size);
1823-
kfree(mixer);
1824-
return ret;
1825-
}
1826-
1827-
sof_dbg_comp_config(scomp, &mixer->config);
1828-
1829-
swidget->private = mixer;
1830-
1831-
return 0;
1832-
}
1833-
18341795
/*
18351796
* Mux topology
18361797
*/
@@ -2341,9 +2302,6 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index,
23412302
list_add(&dai->list, &sdev->dai_list);
23422303
swidget->private = dai;
23432304
break;
2344-
case snd_soc_dapm_mixer:
2345-
ret = sof_widget_load_mixer(scomp, index, swidget, tw);
2346-
break;
23472305
case snd_soc_dapm_pga:
23482306
if (!le32_to_cpu(tw->num_kcontrols)) {
23492307
dev_err(scomp->dev, "invalid kcontrol count %d for volume\n",
@@ -2353,6 +2311,7 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index,
23532311
}
23542312

23552313
fallthrough;
2314+
case snd_soc_dapm_mixer:
23562315
case snd_soc_dapm_buffer:
23572316
case snd_soc_dapm_scheduler:
23582317
case snd_soc_dapm_aif_out:

0 commit comments

Comments
 (0)