clear-pkgs-linux-iot-lts2018/1121-ASoC-Intel-Skylake-Fix...

93 lines
2.8 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pawe=C5=82=20Har=C5=82ozi=C5=84ski?=
<pawel.harlozinski@intel.com>
Date: Fri, 12 Apr 2019 14:12:37 +0200
Subject: [PATCH] ASoC: Intel: Skylake: Fix cores power managment
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Because core0 shouldn't be suspended if any other core is awake:
change core0 usage_count in case of change usage_count of other cores
Change usage_count only when it really have changed
Change-Id: Ie2bc789d7e2217da6e695c9e4cac0eef01c47c3d
Tracked-On: OAM-83351
Signed-off-by: Paweł Harłoziński <pawel.harlozinski@intel.com>
---
sound/soc/intel/skylake/skl-sst-dsp.c | 29 ++++++++++++++++++++++++---
1 file changed, 26 insertions(+), 3 deletions(-)
diff --git a/sound/soc/intel/skylake/skl-sst-dsp.c b/sound/soc/intel/skylake/skl-sst-dsp.c
index 0f5e497e6f93..891438d13f2d 100644
--- a/sound/soc/intel/skylake/skl-sst-dsp.c
+++ b/sound/soc/intel/skylake/skl-sst-dsp.c
@@ -384,15 +384,24 @@ int skl_dsp_get_core(struct sst_dsp *ctx, unsigned int core_id)
return -EINVAL;
}
- skl->cores.usage_count[core_id]++;
+ if (core_id != SKL_DSP_CORE0_ID) {
+ ret = skl_dsp_get_core(ctx, SKL_DSP_CORE0_ID);
+ if (ret < 0) {
+ dev_err(ctx->dev, "unable to get core0 before core%d\n",
+ core_id);
+ goto out;
+ }
+ }
if (skl->cores.state[core_id] == SKL_DSP_RESET) {
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);
+ skl_dsp_put_core(ctx, SKL_DSP_CORE0_ID);
goto out;
}
}
+ skl->cores.usage_count[core_id]++;
out:
dev_dbg(ctx->dev, "core id %d state %d usage_count %d\n",
@@ -412,14 +421,20 @@ int skl_dsp_put_core(struct sst_dsp *ctx, unsigned int core_id)
dev_err(ctx->dev, "invalid core id: %d\n", core_id);
return -EINVAL;
}
+ if (skl->cores.usage_count[core_id] == 0) {
+ dev_info(ctx->dev, "core id %d state %d already unused!\n",
+ core_id, skl->cores.state[core_id]);
+ return 0;
+ }
- if ((--skl->cores.usage_count[core_id] == 0) &&
- (skl->cores.state[core_id] != SKL_DSP_RESET)) {
+ if ((skl->cores.state[core_id] != SKL_DSP_RESET) &&
+ (--skl->cores.usage_count[core_id] == 0)) {
ret = ctx->fw_ops.set_state_D3(ctx, core_id);
if (ret < 0) {
dev_err(ctx->dev, "unable to put core %d: %d\n",
core_id, ret);
skl->cores.usage_count[core_id]++;
+ return ret;
}
}
@@ -427,6 +442,14 @@ int skl_dsp_put_core(struct sst_dsp *ctx, unsigned int core_id)
core_id, skl->cores.state[core_id],
skl->cores.usage_count[core_id]);
+ if (core_id != SKL_DSP_CORE0_ID) {
+ ret = skl_dsp_put_core(ctx, SKL_DSP_CORE0_ID);
+ if (ret < 0) {
+ dev_err(ctx->dev, "unable to put core0 after core%d\n",
+ core_id);
+ }
+ }
+
return ret;
}
EXPORT_SYMBOL_GPL(skl_dsp_put_core);
--
https://clearlinux.org