ASoC: Intel: Skylake: read params from DSP if module is on
authorOmair M Abdullah <omair.m.abdullah@intel.com>
Thu, 3 Dec 2015 17:59:56 +0000 (23:29 +0530)
committerMark Brown <broonie@kernel.org>
Tue, 8 Dec 2015 17:57:51 +0000 (17:57 +0000)
If a module is ON then we should read the module parameters from
DSP rather than driver cached values

Signed-off-by: Omair M Abdullah <omair.m.abdullah@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/skylake/skl-messages.c
sound/soc/intel/skylake/skl-topology.c
sound/soc/intel/skylake/skl-topology.h

index a91161be7f5d875da006a74403aacf512830cedd..46310d9ac008bc4d2637b0ba6937b46614a69fa3 100644 (file)
@@ -927,3 +927,16 @@ int skl_set_module_params(struct skl_sst *ctx, u32 *params, int size,
 
        return skl_ipc_set_large_config(&ctx->ipc, &msg, params);
 }
+
+int skl_get_module_params(struct skl_sst *ctx, u32 *params, int size,
+                         u32 param_id, struct skl_module_cfg *mcfg)
+{
+       struct skl_ipc_large_config_msg msg;
+
+       msg.module_id = mcfg->id.module_id;
+       msg.instance_id = mcfg->id.instance_id;
+       msg.param_data_size = size;
+       msg.large_param_id = param_id;
+
+       return skl_ipc_get_large_config(&ctx->ipc, &msg, params);
+}
index eb31235f704096dcd81037ae496a1ebe2156b044..b824450edcb4d1e96ede5cb9cc2c79c08f2e9b01 100644 (file)
@@ -908,6 +908,13 @@ static int skl_tplg_tlv_control_get(struct snd_kcontrol *kcontrol,
        struct soc_bytes_ext *sb =
                        (struct soc_bytes_ext *)kcontrol->private_value;
        struct skl_algo_data *bc = (struct skl_algo_data *)sb->dobj.private;
+       struct snd_soc_dapm_widget *w = snd_soc_dapm_kcontrol_widget(kcontrol);
+       struct skl_module_cfg *mconfig = w->priv;
+       struct skl *skl = get_skl_ctx(w->dapm->dev);
+
+       if (w->power)
+               skl_get_module_params(skl->skl_sst, (u32 *)bc->params,
+                                     bc->max, bc->param_id, mconfig);
 
        if (bc->params) {
                if (copy_to_user(data, &bc->param_id, sizeof(u32)))
index 6ba0bdc7753c121883ea6939feee9eb73c990901..9aa2a2b6598a3ede5dff38f0570c5b16e30bcb70 100644 (file)
@@ -342,6 +342,8 @@ int skl_unbind_modules(struct skl_sst *ctx, struct skl_module_cfg
 
 int skl_set_module_params(struct skl_sst *ctx, u32 *params, int size,
                        u32 param_id, struct skl_module_cfg *mcfg);
+int skl_get_module_params(struct skl_sst *ctx, u32 *params, int size,
+                         u32 param_id, struct skl_module_cfg *mcfg);
 
 enum skl_bitdepth skl_get_bit_depth(int params);
 #endif