2019-05-29 07:08:45 +08:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Dominik Bozek <dominikx.bozek@intel.com>
|
|
|
|
Date: Fri, 17 May 2019 10:56:20 +0200
|
|
|
|
Subject: [PATCH] ASoC: Intel: Skylake: BXT: read FwStatus and ErrorCode before
|
|
|
|
power down
|
|
|
|
|
|
|
|
Reading of FwStatus and ErrorCode after DSP power down always returns FF.
|
|
|
|
This patch move the reading of that two registers before power down.
|
|
|
|
|
|
|
|
Change-Id: I49618851bb297e91501d2a0785c1884562c6ddee
|
|
|
|
Tracked-On: ACI-5767
|
|
|
|
Tracked-On: OAM-80502
|
|
|
|
Signed-off-by: Dominik Bozek <dominikx.bozek@intel.com>
|
|
|
|
---
|
|
|
|
sound/soc/intel/skylake/bxt-sst.c | 16 ++++++++++------
|
|
|
|
1 file changed, 10 insertions(+), 6 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/sound/soc/intel/skylake/bxt-sst.c b/sound/soc/intel/skylake/bxt-sst.c
|
2020-10-27 02:14:06 +08:00
|
|
|
index 887a43bcd43b..7e20ba424efa 100644
|
2019-05-29 07:08:45 +08:00
|
|
|
--- a/sound/soc/intel/skylake/bxt-sst.c
|
|
|
|
+++ b/sound/soc/intel/skylake/bxt-sst.c
|
|
|
|
@@ -213,7 +213,7 @@ int sst_fw_status_poll(struct sst_dsp *ctx, u32 module, u32 state,
|
|
|
|
* reset/stall and then turn it off
|
|
|
|
*/
|
|
|
|
static int sst_bxt_prepare_fw(struct sst_dsp *ctx,
|
|
|
|
- const void *fwdata, u32 fwsize)
|
|
|
|
+ const void *fwdata, u32 fwsize, u32 *fwerr, u32 *fwsts)
|
|
|
|
{
|
|
|
|
int stream_tag, ret;
|
|
|
|
|
|
|
|
@@ -283,6 +283,11 @@ static int sst_bxt_prepare_fw(struct sst_dsp *ctx,
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
base_fw_load_failed:
|
|
|
|
+ if (fwerr)
|
|
|
|
+ *fwerr = sst_dsp_shim_read(ctx, BXT_ADSP_ERROR_CODE);
|
|
|
|
+ if (fwsts)
|
|
|
|
+ *fwsts = sst_dsp_shim_read(ctx, BXT_ADSP_FW_STATUS);
|
|
|
|
+
|
|
|
|
ctx->dsp_ops.cleanup(ctx->dev, &ctx->dmab, stream_tag,
|
|
|
|
SNDRV_PCM_STREAM_PLAYBACK);
|
|
|
|
|
|
|
|
@@ -313,6 +318,7 @@ static int bxt_load_base_firmware(struct sst_dsp *ctx)
|
|
|
|
struct firmware stripped_fw;
|
|
|
|
struct skl_sst *skl = ctx->thread_context;
|
|
|
|
int ret, i;
|
|
|
|
+ u32 fwerr = 0, fwsts = 0;
|
|
|
|
|
|
|
|
if (ctx->fw == NULL) {
|
|
|
|
ret = request_firmware(&ctx->fw, ctx->fw_name, ctx->dev);
|
|
|
|
@@ -334,12 +340,10 @@ static int bxt_load_base_firmware(struct sst_dsp *ctx)
|
|
|
|
skl_dsp_strip_extended_manifest(&stripped_fw);
|
|
|
|
|
|
|
|
for (i = 0; i < BXT_FW_INIT_RETRY; i++) {
|
|
|
|
- ret = sst_bxt_prepare_fw(ctx, stripped_fw.data, stripped_fw.size);
|
|
|
|
+ ret = sst_bxt_prepare_fw(ctx, stripped_fw.data,
|
|
|
|
+ stripped_fw.size, &fwerr, &fwsts);
|
|
|
|
if (ret < 0) {
|
|
|
|
- dev_err(ctx->dev, "Error code=0x%x: FW status=0x%x\n",
|
|
|
|
- sst_dsp_shim_read(ctx, BXT_ADSP_ERROR_CODE),
|
|
|
|
- sst_dsp_shim_read(ctx, BXT_ADSP_FW_STATUS));
|
|
|
|
-
|
|
|
|
+ dev_err(ctx->dev, "Error code=0x%x: FW status=0x%x\n", fwerr, fwsts);
|
|
|
|
dev_err(ctx->dev, "Iteration %d Core En/ROM load fail:%d\n", i, ret);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
--
|
|
|
|
https://clearlinux.org
|
|
|
|
|