ASoC: topology: create tlv before soc_tplg_init_kcontrol
authorBard liao <yung-chuan.liao@linux.intel.com>
Wed, 13 Mar 2019 13:49:43 +0000 (21:49 +0800)
committerMark Brown <broonie@kernel.org>
Fri, 15 Mar 2019 16:27:14 +0000 (16:27 +0000)
Component driver may want to use tlv data. Create tlv before
soc_tplg_init_kcontrol so component driver can use the tlv data
in the control_load ops.

Signed-off-by: Bard liao <yung-chuan.liao@linux.intel.com>
Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/soc-topology.c

index 25fca70..fbee472 100644 (file)
@@ -894,19 +894,20 @@ static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count,
                        continue;
                }
 
+               /* create any TLV data */
+               soc_tplg_create_tlv(tplg, &kc, &mc->hdr);
+
                /* pass control to driver for optional further init */
                err = soc_tplg_init_kcontrol(tplg, &kc,
                        (struct snd_soc_tplg_ctl_hdr *) mc);
                if (err < 0) {
                        dev_err(tplg->dev, "ASoC: failed to init %s\n",
                                mc->hdr.name);
+                       soc_tplg_free_tlv(tplg, &kc);
                        kfree(sm);
                        continue;
                }
 
-               /* create any TLV data */
-               soc_tplg_create_tlv(tplg, &kc, &mc->hdr);
-
                /* register control here */
                err = soc_tplg_add_kcontrol(tplg, &kc,
                        &sm->dobj.control.kcontrol);
@@ -1324,18 +1325,19 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_dmixer_create(
                        continue;
                }
 
+               /* create any TLV data */
+               soc_tplg_create_tlv(tplg, &kc[i], &mc->hdr);
+
                /* pass control to driver for optional further init */
                err = soc_tplg_init_kcontrol(tplg, &kc[i],
                        (struct snd_soc_tplg_ctl_hdr *)mc);
                if (err < 0) {
                        dev_err(tplg->dev, "ASoC: failed to init %s\n",
                                mc->hdr.name);
+                       soc_tplg_free_tlv(tplg, &kc[i]);
                        kfree(sm);
                        continue;
                }
-
-               /* create any TLV data */
-               soc_tplg_create_tlv(tplg, &kc[i], &mc->hdr);
        }
        return kc;