diff options
-rw-r--r-- | sound/soc/intel/common/sst-dsp-priv.h | 1 | ||||
-rw-r--r-- | sound/soc/intel/skylake/skl-sst-ipc.c | 12 | ||||
-rw-r--r-- | sound/soc/intel/skylake/skl-sst-ipc.h | 1 | ||||
-rw-r--r-- | sound/soc/intel/skylake/skl-sst.c | 56 |
4 files changed, 44 insertions, 26 deletions
diff --git a/sound/soc/intel/common/sst-dsp-priv.h b/sound/soc/intel/common/sst-dsp-priv.h index cbd568eac033..2151652d37b7 100644 --- a/sound/soc/intel/common/sst-dsp-priv.h +++ b/sound/soc/intel/common/sst-dsp-priv.h | |||
@@ -314,6 +314,7 @@ struct sst_dsp { | |||
314 | int sst_state; | 314 | int sst_state; |
315 | struct skl_cl_dev cl_dev; | 315 | struct skl_cl_dev cl_dev; |
316 | u32 intr_status; | 316 | u32 intr_status; |
317 | const struct firmware *fw; | ||
317 | }; | 318 | }; |
318 | 319 | ||
319 | /* Size optimised DRAM/IRAM memcpy */ | 320 | /* Size optimised DRAM/IRAM memcpy */ |
diff --git a/sound/soc/intel/skylake/skl-sst-ipc.c b/sound/soc/intel/skylake/skl-sst-ipc.c index 937a0a3a63a0..3345ea0d4414 100644 --- a/sound/soc/intel/skylake/skl-sst-ipc.c +++ b/sound/soc/intel/skylake/skl-sst-ipc.c | |||
@@ -464,6 +464,18 @@ void skl_ipc_op_int_enable(struct sst_dsp *ctx) | |||
464 | SKL_ADSP_REG_HIPCCTL_BUSY, SKL_ADSP_REG_HIPCCTL_BUSY); | 464 | SKL_ADSP_REG_HIPCCTL_BUSY, SKL_ADSP_REG_HIPCCTL_BUSY); |
465 | } | 465 | } |
466 | 466 | ||
467 | void skl_ipc_op_int_disable(struct sst_dsp *ctx) | ||
468 | { | ||
469 | /* disable IPC DONE interrupt */ | ||
470 | sst_dsp_shim_update_bits_unlocked(ctx, SKL_ADSP_REG_HIPCCTL, | ||
471 | SKL_ADSP_REG_HIPCCTL_DONE, 0); | ||
472 | |||
473 | /* Disable IPC BUSY interrupt */ | ||
474 | sst_dsp_shim_update_bits_unlocked(ctx, SKL_ADSP_REG_HIPCCTL, | ||
475 | SKL_ADSP_REG_HIPCCTL_BUSY, 0); | ||
476 | |||
477 | } | ||
478 | |||
467 | bool skl_ipc_int_status(struct sst_dsp *ctx) | 479 | bool skl_ipc_int_status(struct sst_dsp *ctx) |
468 | { | 480 | { |
469 | return sst_dsp_shim_read_unlocked(ctx, | 481 | return sst_dsp_shim_read_unlocked(ctx, |
diff --git a/sound/soc/intel/skylake/skl-sst-ipc.h b/sound/soc/intel/skylake/skl-sst-ipc.h index 9f5f67202858..f1a154e45dc3 100644 --- a/sound/soc/intel/skylake/skl-sst-ipc.h +++ b/sound/soc/intel/skylake/skl-sst-ipc.h | |||
@@ -116,6 +116,7 @@ int skl_ipc_set_large_config(struct sst_generic_ipc *ipc, | |||
116 | 116 | ||
117 | void skl_ipc_int_enable(struct sst_dsp *dsp); | 117 | void skl_ipc_int_enable(struct sst_dsp *dsp); |
118 | void skl_ipc_op_int_enable(struct sst_dsp *ctx); | 118 | void skl_ipc_op_int_enable(struct sst_dsp *ctx); |
119 | void skl_ipc_op_int_disable(struct sst_dsp *ctx); | ||
119 | void skl_ipc_int_disable(struct sst_dsp *dsp); | 120 | void skl_ipc_int_disable(struct sst_dsp *dsp); |
120 | 121 | ||
121 | bool skl_ipc_int_status(struct sst_dsp *dsp); | 122 | bool skl_ipc_int_status(struct sst_dsp *dsp); |
diff --git a/sound/soc/intel/skylake/skl-sst.c b/sound/soc/intel/skylake/skl-sst.c index c18ea51b7484..3b83dc99f1d4 100644 --- a/sound/soc/intel/skylake/skl-sst.c +++ b/sound/soc/intel/skylake/skl-sst.c | |||
@@ -70,15 +70,31 @@ static int skl_transfer_firmware(struct sst_dsp *ctx, | |||
70 | static int skl_load_base_firmware(struct sst_dsp *ctx) | 70 | static int skl_load_base_firmware(struct sst_dsp *ctx) |
71 | { | 71 | { |
72 | int ret = 0, i; | 72 | int ret = 0, i; |
73 | const struct firmware *fw = NULL; | ||
74 | struct skl_sst *skl = ctx->thread_context; | 73 | struct skl_sst *skl = ctx->thread_context; |
75 | u32 reg; | 74 | u32 reg; |
76 | 75 | ||
77 | ret = request_firmware(&fw, "dsp_fw_release.bin", ctx->dev); | 76 | skl->boot_complete = false; |
77 | init_waitqueue_head(&skl->boot_wait); | ||
78 | |||
79 | if (ctx->fw == NULL) { | ||
80 | ret = request_firmware(&ctx->fw, "dsp_fw_release.bin", ctx->dev); | ||
81 | if (ret < 0) { | ||
82 | dev_err(ctx->dev, "Request firmware failed %d\n", ret); | ||
83 | skl_dsp_disable_core(ctx); | ||
84 | return -EIO; | ||
85 | } | ||
86 | } | ||
87 | |||
88 | ret = skl_dsp_boot(ctx); | ||
78 | if (ret < 0) { | 89 | if (ret < 0) { |
79 | dev_err(ctx->dev, "Request firmware failed %d\n", ret); | 90 | dev_err(ctx->dev, "Boot dsp core failed ret: %d", ret); |
80 | skl_dsp_disable_core(ctx); | 91 | goto skl_load_base_firmware_failed; |
81 | return -EIO; | 92 | } |
93 | |||
94 | ret = skl_cldma_prepare(ctx); | ||
95 | if (ret < 0) { | ||
96 | dev_err(ctx->dev, "CL dma prepare failed : %d", ret); | ||
97 | goto skl_load_base_firmware_failed; | ||
82 | } | 98 | } |
83 | 99 | ||
84 | /* enable Interrupt */ | 100 | /* enable Interrupt */ |
@@ -102,7 +118,7 @@ static int skl_load_base_firmware(struct sst_dsp *ctx) | |||
102 | goto skl_load_base_firmware_failed; | 118 | goto skl_load_base_firmware_failed; |
103 | } | 119 | } |
104 | 120 | ||
105 | ret = skl_transfer_firmware(ctx, fw->data, fw->size); | 121 | ret = skl_transfer_firmware(ctx, ctx->fw->data, ctx->fw->size); |
106 | if (ret < 0) { | 122 | if (ret < 0) { |
107 | dev_err(ctx->dev, "Transfer firmware failed%d\n", ret); | 123 | dev_err(ctx->dev, "Transfer firmware failed%d\n", ret); |
108 | goto skl_load_base_firmware_failed; | 124 | goto skl_load_base_firmware_failed; |
@@ -118,13 +134,12 @@ static int skl_load_base_firmware(struct sst_dsp *ctx) | |||
118 | dev_dbg(ctx->dev, "Download firmware successful%d\n", ret); | 134 | dev_dbg(ctx->dev, "Download firmware successful%d\n", ret); |
119 | skl_dsp_set_state_locked(ctx, SKL_DSP_RUNNING); | 135 | skl_dsp_set_state_locked(ctx, SKL_DSP_RUNNING); |
120 | } | 136 | } |
121 | release_firmware(fw); | ||
122 | |||
123 | return 0; | 137 | return 0; |
124 | 138 | ||
125 | skl_load_base_firmware_failed: | 139 | skl_load_base_firmware_failed: |
126 | skl_dsp_disable_core(ctx); | 140 | skl_dsp_disable_core(ctx); |
127 | release_firmware(fw); | 141 | release_firmware(ctx->fw); |
142 | ctx->fw = NULL; | ||
128 | return ret; | 143 | return ret; |
129 | } | 144 | } |
130 | 145 | ||
@@ -172,6 +187,12 @@ static int skl_set_dsp_D3(struct sst_dsp *ctx) | |||
172 | } | 187 | } |
173 | skl_dsp_set_state_locked(ctx, SKL_DSP_RESET); | 188 | skl_dsp_set_state_locked(ctx, SKL_DSP_RESET); |
174 | 189 | ||
190 | /* disable Interrupt */ | ||
191 | ctx->cl_dev.ops.cl_cleanup_controller(ctx); | ||
192 | skl_cldma_int_disable(ctx); | ||
193 | skl_ipc_op_int_disable(ctx); | ||
194 | skl_ipc_int_disable(ctx); | ||
195 | |||
175 | return ret; | 196 | return ret; |
176 | } | 197 | } |
177 | 198 | ||
@@ -235,22 +256,6 @@ int skl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq, | |||
235 | if (ret) | 256 | if (ret) |
236 | return ret; | 257 | return ret; |
237 | 258 | ||
238 | skl->boot_complete = false; | ||
239 | init_waitqueue_head(&skl->boot_wait); | ||
240 | |||
241 | ret = skl_dsp_boot(sst); | ||
242 | if (ret < 0) { | ||
243 | dev_err(skl->dev, "Boot dsp core failed ret: %d", ret); | ||
244 | goto free_ipc; | ||
245 | } | ||
246 | |||
247 | ret = skl_cldma_prepare(sst); | ||
248 | if (ret < 0) { | ||
249 | dev_err(dev, "CL dma prepare failed : %d", ret); | ||
250 | goto free_ipc; | ||
251 | } | ||
252 | |||
253 | |||
254 | ret = sst->fw_ops.load_fw(sst); | 259 | ret = sst->fw_ops.load_fw(sst); |
255 | if (ret < 0) { | 260 | if (ret < 0) { |
256 | dev_err(dev, "Load base fw failed : %d", ret); | 261 | 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, | |||
262 | 267 | ||
263 | return 0; | 268 | return 0; |
264 | 269 | ||
265 | free_ipc: | ||
266 | skl_ipc_free(&skl->ipc); | 270 | skl_ipc_free(&skl->ipc); |
267 | return ret; | 271 | return ret; |
268 | } | 272 | } |