ASoC: Intel: Skylake: Correct the runtime handler behaviour
On runtime pm resume, we need to download the firmware, also on suspend we need to ensure all the interrupts from controller and DSP are disabled. Also since we download the firmware on resume, we don't need to do so on init, so remove that bit Signed-off-by: Jeeja KP <jeeja.kp@intel.com> Signed-off-by: Vinod Koul <vinod.koul@intel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
このコミットが含まれているのは:
@@ -70,15 +70,31 @@ static int skl_transfer_firmware(struct sst_dsp *ctx,
|
||||
static int skl_load_base_firmware(struct sst_dsp *ctx)
|
||||
{
|
||||
int ret = 0, i;
|
||||
const struct firmware *fw = NULL;
|
||||
struct skl_sst *skl = ctx->thread_context;
|
||||
u32 reg;
|
||||
|
||||
ret = request_firmware(&fw, "dsp_fw_release.bin", ctx->dev);
|
||||
skl->boot_complete = false;
|
||||
init_waitqueue_head(&skl->boot_wait);
|
||||
|
||||
if (ctx->fw == NULL) {
|
||||
ret = request_firmware(&ctx->fw, "dsp_fw_release.bin", ctx->dev);
|
||||
if (ret < 0) {
|
||||
dev_err(ctx->dev, "Request firmware failed %d\n", ret);
|
||||
skl_dsp_disable_core(ctx);
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
ret = skl_dsp_boot(ctx);
|
||||
if (ret < 0) {
|
||||
dev_err(ctx->dev, "Request firmware failed %d\n", ret);
|
||||
skl_dsp_disable_core(ctx);
|
||||
return -EIO;
|
||||
dev_err(ctx->dev, "Boot dsp core failed ret: %d", ret);
|
||||
goto skl_load_base_firmware_failed;
|
||||
}
|
||||
|
||||
ret = skl_cldma_prepare(ctx);
|
||||
if (ret < 0) {
|
||||
dev_err(ctx->dev, "CL dma prepare failed : %d", ret);
|
||||
goto skl_load_base_firmware_failed;
|
||||
}
|
||||
|
||||
/* enable Interrupt */
|
||||
@@ -102,7 +118,7 @@ static int skl_load_base_firmware(struct sst_dsp *ctx)
|
||||
goto skl_load_base_firmware_failed;
|
||||
}
|
||||
|
||||
ret = skl_transfer_firmware(ctx, fw->data, fw->size);
|
||||
ret = skl_transfer_firmware(ctx, ctx->fw->data, ctx->fw->size);
|
||||
if (ret < 0) {
|
||||
dev_err(ctx->dev, "Transfer firmware failed%d\n", ret);
|
||||
goto skl_load_base_firmware_failed;
|
||||
@@ -118,13 +134,12 @@ static int skl_load_base_firmware(struct sst_dsp *ctx)
|
||||
dev_dbg(ctx->dev, "Download firmware successful%d\n", ret);
|
||||
skl_dsp_set_state_locked(ctx, SKL_DSP_RUNNING);
|
||||
}
|
||||
release_firmware(fw);
|
||||
|
||||
return 0;
|
||||
|
||||
skl_load_base_firmware_failed:
|
||||
skl_dsp_disable_core(ctx);
|
||||
release_firmware(fw);
|
||||
release_firmware(ctx->fw);
|
||||
ctx->fw = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -172,6 +187,12 @@ static int skl_set_dsp_D3(struct sst_dsp *ctx)
|
||||
}
|
||||
skl_dsp_set_state_locked(ctx, SKL_DSP_RESET);
|
||||
|
||||
/* disable Interrupt */
|
||||
ctx->cl_dev.ops.cl_cleanup_controller(ctx);
|
||||
skl_cldma_int_disable(ctx);
|
||||
skl_ipc_op_int_disable(ctx);
|
||||
skl_ipc_int_disable(ctx);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -235,22 +256,6 @@ int skl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
skl->boot_complete = false;
|
||||
init_waitqueue_head(&skl->boot_wait);
|
||||
|
||||
ret = skl_dsp_boot(sst);
|
||||
if (ret < 0) {
|
||||
dev_err(skl->dev, "Boot dsp core failed ret: %d", ret);
|
||||
goto free_ipc;
|
||||
}
|
||||
|
||||
ret = skl_cldma_prepare(sst);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "CL dma prepare failed : %d", ret);
|
||||
goto free_ipc;
|
||||
}
|
||||
|
||||
|
||||
ret = sst->fw_ops.load_fw(sst);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Load base fw failed : %d", ret);
|
||||
@@ -262,7 +267,6 @@ int skl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
|
||||
|
||||
return 0;
|
||||
|
||||
free_ipc:
|
||||
skl_ipc_free(&skl->ipc);
|
||||
return ret;
|
||||
}
|
||||
|
新しいイシューから参照
ユーザーをブロックする