ASoC: Intel: Skylake: Move modules query to runtime
authorVinod Koul <vinod.koul@intel.com>
Tue, 26 Jul 2016 12:36:40 +0000 (18:06 +0530)
committerMark Brown <broonie@kernel.org>
Mon, 8 Aug 2016 10:54:59 +0000 (11:54 +0100)
Since we are moving DSP init to later, at the topology load the
module info is not available.

So set the module id to -1 at init and query at first module
initialization.

Signed-off-by: Senthilnathan Veppur <senthilnathanx.veppur@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 cc0150fc2601ef10e163a239b76a4a6fabd1130c..904103056d629b0d423a2493c9db7ac5f1b9b941 100644 (file)
@@ -473,6 +473,28 @@ skl_tplg_init_pipe_modules(struct skl *skl, struct skl_pipe *pipe)
                w = w_module->w;
                mconfig = w->priv;
 
+               /* check if module ids are populated */
+               if (mconfig->id.module_id < 0) {
+                       struct skl_dfw_module *dfw_config;
+
+                       dfw_config = kzalloc(sizeof(dfw_config), GFP_KERNEL);
+                       if (!dfw_config)
+                               return -ENOMEM;
+
+                       ret = snd_skl_get_module_info(skl->skl_sst,
+                               mconfig->guid, dfw_config);
+                       if (ret < 0) {
+                               dev_err(skl->skl_sst->dev,
+                                       "query module info failed: %d\n", ret);
+                               kfree(dfw_config);
+                               return ret;
+                       }
+                       mconfig->id.module_id = dfw_config->module_id;
+                       mconfig->is_loadable = dfw_config->is_loadable;
+
+                       kfree(dfw_config);
+               }
+
                /* check resource available */
                if (!skl_is_pipe_mcps_avail(skl, mconfig))
                        return -ENOMEM;
@@ -1621,11 +1643,11 @@ static int skl_tplg_widget_load(struct snd_soc_component *cmpnt,
        w->priv = mconfig;
        memcpy(&mconfig->guid, &dfw_config->uuid, 16);
 
-       ret = snd_skl_get_module_info(skl->skl_sst, mconfig->guid, dfw_config);
-       if (ret < 0)
-               return ret;
-
-       mconfig->id.module_id = dfw_config->module_id;
+       /*
+        * module binary can be loaded later, so set it to query when
+        * module is load for a use case
+        */
+       mconfig->id.module_id = -1;
        mconfig->id.instance_id = dfw_config->instance_id;
        mconfig->mcps = dfw_config->max_mcps;
        mconfig->ibs = dfw_config->ibs;
index 22d3ef83817dfdfa762c65d08bba11b4628dc74f..96fa86d0f93aa3157b39e5a7eac9214d532c922e 100644 (file)
@@ -216,7 +216,7 @@ struct skl_module_fmt {
 struct skl_module_cfg;
 
 struct skl_module_inst_id {
-       u32 module_id;
+       int module_id;
        u32 instance_id;
 };