ASoC: SOF: enable dual control for pga
authorJaska Uimonen <jaska.uimonen@linux.intel.com>
Tue, 8 Oct 2019 16:44:41 +0000 (11:44 -0500)
committerMark Brown <broonie@kernel.org>
Thu, 10 Oct 2019 14:14:24 +0000 (15:14 +0100)
Currently sof pga element supports only 1 kcontrol and you can't create
for example a mixer element with combined volume slider and mute switch.
So enable sof pga to have more than 1 kcontrol associated with it. Also
check for possible NULL tlv pointer as switch element might not have it.

Signed-off-by: Jaska Uimonen <jaska.uimonen@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20191008164443.1358-8-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/topology.c

index 0aabb3190ddc9735aebdbc494805a28f9b97d035..a0b1c38e666bf0a614e17d691f37fb479f7bfa3a 100644 (file)
@@ -1580,7 +1580,7 @@ static int sof_widget_load_pga(struct snd_soc_component *scomp, int index,
        if (!volume)
                return -ENOMEM;
 
-       if (le32_to_cpu(tw->num_kcontrols) != 1) {
+       if (!le32_to_cpu(tw->num_kcontrols)) {
                dev_err(sdev->dev, "error: invalid kcontrol count %d for volume\n",
                        tw->num_kcontrols);
                ret = -EINVAL;
@@ -1617,7 +1617,8 @@ static int sof_widget_load_pga(struct snd_soc_component *scomp, int index,
        swidget->private = volume;
 
        list_for_each_entry(scontrol, &sdev->kcontrol_list, list) {
-               if (scontrol->comp_id == swidget->comp_id) {
+               if (scontrol->comp_id == swidget->comp_id &&
+                   scontrol->volume_table) {
                        min_step = scontrol->min_volume_step;
                        max_step = scontrol->max_volume_step;
                        volume->min_value = scontrol->volume_table[min_step];