Commit d29d41e2 authored by Jaska Uimonen's avatar Jaska Uimonen Committed by Mark Brown

ASoC: topology: Add support for multiple kcontrol types to a widget

Current dapm widget has a single variable to describe its kcontrol's
type. As there can be many kcontrols in one widget it is inherently
presumed that the types are the same.

Lately there has been use cases where different types of kcontrols would
be needed for a single widget. Thus add pointer to dapm widget to hold
an array for different kcontrol types and modify the kcontrol creation
to operate in a loop based on individual kcontrol type.

Change control creation and deletion to use individual kcontrol types in
SOF driver. This is done in the same patch for not breaking bisect. SOF
driver is also currently the only one using the dapm widget
kcontrol_type.
Signed-off-by: default avatarJaska Uimonen <jaska.uimonen@linux.intel.com>
Reviewed-by: default avatarGuennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Reviewed-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Link: https://lore.kernel.org/r/20210507070246.404446-1-jaska.uimonen@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent a75e5cdf
...@@ -54,7 +54,7 @@ struct snd_soc_dobj_control { ...@@ -54,7 +54,7 @@ struct snd_soc_dobj_control {
/* dynamic widget object */ /* dynamic widget object */
struct snd_soc_dobj_widget { struct snd_soc_dobj_widget {
unsigned int kcontrol_type; /* kcontrol type: mixer, enum, bytes */ unsigned int *kcontrol_type; /* kcontrol type: mixer, enum, bytes */
}; };
/* generic dynamic object - all dynamic objects belong to this struct */ /* generic dynamic object - all dynamic objects belong to this struct */
......
This diff is collapsed.
...@@ -1063,6 +1063,7 @@ static int sof_control_load_volume(struct snd_soc_component *scomp, ...@@ -1063,6 +1063,7 @@ static int sof_control_load_volume(struct snd_soc_component *scomp,
scontrol->min_volume_step = le32_to_cpu(mc->min); scontrol->min_volume_step = le32_to_cpu(mc->min);
scontrol->max_volume_step = le32_to_cpu(mc->max); scontrol->max_volume_step = le32_to_cpu(mc->max);
scontrol->num_channels = le32_to_cpu(mc->num_channels); scontrol->num_channels = le32_to_cpu(mc->num_channels);
scontrol->control_data->index = kc->index;
/* set cmd for mixer control */ /* set cmd for mixer control */
if (le32_to_cpu(mc->max) == 1) { if (le32_to_cpu(mc->max) == 1) {
...@@ -1140,7 +1141,7 @@ static int sof_control_load_enum(struct snd_soc_component *scomp, ...@@ -1140,7 +1141,7 @@ static int sof_control_load_enum(struct snd_soc_component *scomp,
scontrol->comp_id = sdev->next_comp_id; scontrol->comp_id = sdev->next_comp_id;
scontrol->num_channels = le32_to_cpu(ec->num_channels); scontrol->num_channels = le32_to_cpu(ec->num_channels);
scontrol->control_data->index = kc->index;
scontrol->cmd = SOF_CTRL_CMD_ENUM; scontrol->cmd = SOF_CTRL_CMD_ENUM;
dev_dbg(scomp->dev, "tplg: load kcontrol index %d chans %d comp_id %d\n", dev_dbg(scomp->dev, "tplg: load kcontrol index %d chans %d comp_id %d\n",
...@@ -1188,6 +1189,7 @@ static int sof_control_load_bytes(struct snd_soc_component *scomp, ...@@ -1188,6 +1189,7 @@ static int sof_control_load_bytes(struct snd_soc_component *scomp,
scontrol->comp_id = sdev->next_comp_id; scontrol->comp_id = sdev->next_comp_id;
scontrol->cmd = SOF_CTRL_CMD_BINARY; scontrol->cmd = SOF_CTRL_CMD_BINARY;
scontrol->control_data->index = kc->index;
dev_dbg(scomp->dev, "tplg: load kcontrol index %d chans %d\n", dev_dbg(scomp->dev, "tplg: load kcontrol index %d chans %d\n",
scontrol->comp_id, scontrol->num_channels); scontrol->comp_id, scontrol->num_channels);
...@@ -2133,7 +2135,7 @@ static int sof_get_control_data(struct snd_soc_component *scomp, ...@@ -2133,7 +2135,7 @@ static int sof_get_control_data(struct snd_soc_component *scomp,
for (i = 0; i < widget->num_kcontrols; i++) { for (i = 0; i < widget->num_kcontrols; i++) {
kc = &widget->kcontrol_news[i]; kc = &widget->kcontrol_news[i];
switch (widget->dobj.widget.kcontrol_type) { switch (widget->dobj.widget.kcontrol_type[i]) {
case SND_SOC_TPLG_TYPE_MIXER: case SND_SOC_TPLG_TYPE_MIXER:
sm = (struct soc_mixer_control *)kc->private_value; sm = (struct soc_mixer_control *)kc->private_value;
wdata[i].control = sm->dobj.private; wdata[i].control = sm->dobj.private;
...@@ -2147,8 +2149,8 @@ static int sof_get_control_data(struct snd_soc_component *scomp, ...@@ -2147,8 +2149,8 @@ static int sof_get_control_data(struct snd_soc_component *scomp,
wdata[i].control = se->dobj.private; wdata[i].control = se->dobj.private;
break; break;
default: default:
dev_err(scomp->dev, "error: unknown kcontrol type %d in widget %s\n", dev_err(scomp->dev, "error: unknown kcontrol type %u in widget %s\n",
widget->dobj.widget.kcontrol_type, widget->dobj.widget.kcontrol_type[i],
widget->name); widget->name);
return -EINVAL; return -EINVAL;
} }
...@@ -2164,7 +2166,8 @@ static int sof_get_control_data(struct snd_soc_component *scomp, ...@@ -2164,7 +2166,8 @@ static int sof_get_control_data(struct snd_soc_component *scomp,
return -EINVAL; return -EINVAL;
/* make sure data is valid - data can be updated at runtime */ /* make sure data is valid - data can be updated at runtime */
if (wdata[i].pdata->magic != SOF_ABI_MAGIC) if (widget->dobj.widget.kcontrol_type[i] == SND_SOC_TPLG_TYPE_BYTES &&
wdata[i].pdata->magic != SOF_ABI_MAGIC)
return -EINVAL; return -EINVAL;
*size += wdata[i].pdata->size; *size += wdata[i].pdata->size;
...@@ -2605,7 +2608,7 @@ static int sof_widget_unload(struct snd_soc_component *scomp, ...@@ -2605,7 +2608,7 @@ static int sof_widget_unload(struct snd_soc_component *scomp,
} }
for (i = 0; i < widget->num_kcontrols; i++) { for (i = 0; i < widget->num_kcontrols; i++) {
kc = &widget->kcontrol_news[i]; kc = &widget->kcontrol_news[i];
switch (dobj->widget.kcontrol_type) { switch (widget->dobj.widget.kcontrol_type[i]) {
case SND_SOC_TPLG_TYPE_MIXER: case SND_SOC_TPLG_TYPE_MIXER:
sm = (struct soc_mixer_control *)kc->private_value; sm = (struct soc_mixer_control *)kc->private_value;
scontrol = sm->dobj.private; scontrol = sm->dobj.private;
......
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