ASoC: Intel: Skylake: Fix to use the actual size for TLV control
authorDharageswari R <dharageswari.r@intel.com>
Fri, 8 Jul 2016 12:45:03 +0000 (18:15 +0530)
committerMark Brown <broonie@kernel.org>
Fri, 8 Jul 2016 12:47:04 +0000 (14:47 +0200)
DSP expects the actual length of parameters that is set through
TLV to be passed in large config set, so pass the actual size
received in tlv_control_set() instead of max size.

Signed-off-by: Dharageswari R <dharageswari.r@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/skylake/skl-topology.c
sound/soc/intel/skylake/skl-topology.h

index 3e036b0..c15b7f8 100644 (file)
@@ -448,7 +448,7 @@ static int skl_tplg_set_module_params(struct snd_soc_dapm_widget *w,
 
                        if (bc->set_params == SKL_PARAM_SET) {
                                ret = skl_set_module_params(ctx,
-                                               (u32 *)bc->params, bc->max,
+                                               (u32 *)bc->params, bc->size,
                                                bc->param_id, mconfig);
                                if (ret < 0)
                                        return ret;
@@ -483,7 +483,7 @@ static int skl_tplg_set_module_init_data(struct snd_soc_dapm_widget *w)
                                continue;
 
                        mconfig->formats_config.caps = (u32 *)&bc->params;
-                       mconfig->formats_config.caps_size = bc->max;
+                       mconfig->formats_config.caps_size = bc->size;
 
                        break;
                }
@@ -1102,7 +1102,7 @@ static int skl_tplg_tlv_control_get(struct snd_kcontrol *kcontrol,
 
        if (w->power)
                skl_get_module_params(skl->skl_sst, (u32 *)bc->params,
-                                     bc->max, bc->param_id, mconfig);
+                                     bc->size, bc->param_id, mconfig);
 
        /* decrement size for TLV header */
        size -= 2 * sizeof(u32);
@@ -1136,6 +1136,10 @@ static int skl_tplg_tlv_control_set(struct snd_kcontrol *kcontrol,
        struct skl *skl = get_skl_ctx(w->dapm->dev);
 
        if (ac->params) {
+               if (size > ac->max)
+                       return -EINVAL;
+
+               ac->size = size;
                /*
                 * if the param_is is of type Vendor, firmware expects actual
                 * parameter id and size from the control.
@@ -1151,7 +1155,7 @@ static int skl_tplg_tlv_control_set(struct snd_kcontrol *kcontrol,
 
                if (w->power)
                        return skl_set_module_params(skl->skl_sst,
-                                               (u32 *)ac->params, ac->max,
+                                               (u32 *)ac->params, ac->size,
                                                ac->param_id, mconfig);
        }
 
@@ -1683,6 +1687,7 @@ static int skl_init_algo_data(struct device *dev, struct soc_bytes_ext *be,
        ac->max = dfw_ac->max;
        ac->param_id = dfw_ac->param_id;
        ac->set_params = dfw_ac->set_params;
+       ac->size = dfw_ac->max;
 
        if (ac->max) {
                ac->params = (char *) devm_kzalloc(dev, ac->max, GFP_KERNEL);
index e4b399c..28d1d2c 100644 (file)
@@ -319,6 +319,7 @@ struct skl_algo_data {
        u32 param_id;
        u32 set_params;
        u32 max;
+       u32 size;
        char *params;
 };