ASoC: Intel: bxtn: Update DSP core state in D0
authorJeeja KP <jeeja.kp@intel.com>
Mon, 13 Mar 2017 16:41:26 +0000 (22:11 +0530)
committerMark Brown <broonie@kernel.org>
Wed, 15 Mar 2017 17:28:01 +0000 (17:28 +0000)
In system suspend, firmware needs to be re-downloaded as IMR is cleared.
When firmware is downloaded in D0, core state is not set to running
state causing instability with subsequent D0-D3 cycles.

So set the core state correctly during D0 and check the DSP core state
if not in reset to set the DSP to D3.

Signed-off-by: Jeeja KP <jeeja.kp@intel.com>
Acked-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/skylake/bxt-sst.c
sound/soc/intel/skylake/skl-sst-dsp.c

index b34c965086058e099f8e7e0d12ff557400d80657..2a2bb944cd40e2cf9e9f470a3cd0686aaa01f626 100644 (file)
@@ -446,6 +446,7 @@ static int bxt_set_dsp_D0(struct sst_dsp *ctx, unsigned int core_id)
                                return ret;
                        }
                }
+               skl->cores.state[core_id] = SKL_DSP_RUNNING;
                return ret;
        }
 
index c3deefab65d6f80a6efa2c3c58fa119d99e3925e..08332723c70029fa49fa3b991b68b358cc1d4158 100644 (file)
@@ -355,12 +355,13 @@ int skl_dsp_get_core(struct sst_dsp *ctx, unsigned int core_id)
                ret = ctx->fw_ops.set_state_D0(ctx, core_id);
                if (ret < 0) {
                        dev_err(ctx->dev, "unable to get core%d\n", core_id);
-                       return ret;
+                       goto out;
                }
        }
 
        skl->cores.usage_count[core_id]++;
 
+out:
        dev_dbg(ctx->dev, "core id %d state %d usage_count %d\n",
                        core_id, skl->cores.state[core_id],
                        skl->cores.usage_count[core_id]);
@@ -379,7 +380,8 @@ int skl_dsp_put_core(struct sst_dsp *ctx, unsigned int core_id)
                return -EINVAL;
        }
 
-       if (--skl->cores.usage_count[core_id] == 0) {
+       if ((--skl->cores.usage_count[core_id] == 0) &&
+               (skl->cores.state[core_id] != SKL_DSP_RESET)) {
                ret = ctx->fw_ops.set_state_D3(ctx, core_id);
                if (ret < 0) {
                        dev_err(ctx->dev, "unable to put core %d: %d\n",