Lines Matching refs:ctx
200 struct intel_sst_drv *ctx = container_of(work, in sst_process_pending_msg() local
203 ctx->ops->post_message(ctx, NULL, false); in sst_process_pending_msg()
206 static int sst_workqueue_init(struct intel_sst_drv *ctx) in sst_workqueue_init() argument
208 INIT_LIST_HEAD(&ctx->memcpy_list); in sst_workqueue_init()
209 INIT_LIST_HEAD(&ctx->rx_list); in sst_workqueue_init()
210 INIT_LIST_HEAD(&ctx->ipc_dispatch_list); in sst_workqueue_init()
211 INIT_LIST_HEAD(&ctx->block_list); in sst_workqueue_init()
212 INIT_WORK(&ctx->ipc_post_msg_wq, sst_process_pending_msg); in sst_workqueue_init()
213 init_waitqueue_head(&ctx->wait_queue); in sst_workqueue_init()
215 ctx->post_msg_wq = in sst_workqueue_init()
217 if (!ctx->post_msg_wq) in sst_workqueue_init()
222 static void sst_init_locks(struct intel_sst_drv *ctx) in sst_init_locks() argument
224 mutex_init(&ctx->sst_lock); in sst_init_locks()
225 spin_lock_init(&ctx->rx_msg_lock); in sst_init_locks()
226 spin_lock_init(&ctx->ipc_spin_lock); in sst_init_locks()
227 spin_lock_init(&ctx->block_lock); in sst_init_locks()
230 int sst_alloc_drv_context(struct intel_sst_drv **ctx, in sst_alloc_drv_context() argument
233 *ctx = devm_kzalloc(dev, sizeof(struct intel_sst_drv), GFP_KERNEL); in sst_alloc_drv_context()
234 if (!(*ctx)) in sst_alloc_drv_context()
237 (*ctx)->dev = dev; in sst_alloc_drv_context()
238 (*ctx)->dev_id = dev_id; in sst_alloc_drv_context()
244 int sst_context_init(struct intel_sst_drv *ctx) in sst_context_init() argument
248 if (!ctx->pdata) in sst_context_init()
251 if (!ctx->pdata->probe_data) in sst_context_init()
254 memcpy(&ctx->info, ctx->pdata->probe_data, sizeof(ctx->info)); in sst_context_init()
256 ret = sst_driver_ops(ctx); in sst_context_init()
260 sst_init_locks(ctx); in sst_context_init()
261 sst_set_fw_state_locked(ctx, SST_RESET); in sst_context_init()
264 ctx->pvt_id = 1; in sst_context_init()
265 ctx->stream_cnt = 0; in sst_context_init()
266 ctx->fw_in_mem = NULL; in sst_context_init()
268 ctx->use_dma = 0; in sst_context_init()
269 ctx->use_lli = 0; in sst_context_init()
271 if (sst_workqueue_init(ctx)) in sst_context_init()
274 ctx->mailbox_recv_offset = ctx->pdata->ipc_info->mbox_recv_off; in sst_context_init()
275 ctx->ipc_reg.ipcx = SST_IPCX + ctx->pdata->ipc_info->ipc_offset; in sst_context_init()
276 ctx->ipc_reg.ipcd = SST_IPCD + ctx->pdata->ipc_info->ipc_offset; in sst_context_init()
278 dev_info(ctx->dev, "Got drv data max stream %d\n", in sst_context_init()
279 ctx->info.max_streams); in sst_context_init()
281 for (i = 1; i <= ctx->info.max_streams; i++) { in sst_context_init()
282 struct stream_info *stream = &ctx->streams[i]; in sst_context_init()
290 ret = devm_request_threaded_irq(ctx->dev, ctx->irq_num, ctx->ops->interrupt, in sst_context_init()
291 ctx->ops->irq_thread, 0, SST_DRV_NAME, in sst_context_init()
292 ctx); in sst_context_init()
296 dev_dbg(ctx->dev, "Registered IRQ %#x\n", ctx->irq_num); in sst_context_init()
299 sst_shim_write64(ctx->shim, SST_IMRX, 0xFFFF0038); in sst_context_init()
301 ctx->qos = devm_kzalloc(ctx->dev, in sst_context_init()
303 if (!ctx->qos) { in sst_context_init()
307 pm_qos_add_request(ctx->qos, PM_QOS_CPU_DMA_LATENCY, in sst_context_init()
310 dev_dbg(ctx->dev, "Requesting FW %s now...\n", ctx->firmware_name); in sst_context_init()
311 ret = request_firmware_nowait(THIS_MODULE, true, ctx->firmware_name, in sst_context_init()
312 ctx->dev, GFP_KERNEL, ctx, sst_firmware_load_cb); in sst_context_init()
314 dev_err(ctx->dev, "Firmware download failed:%d\n", ret); in sst_context_init()
317 sst_register(ctx->dev); in sst_context_init()
321 destroy_workqueue(ctx->post_msg_wq); in sst_context_init()
326 void sst_context_cleanup(struct intel_sst_drv *ctx) in sst_context_cleanup() argument
328 pm_runtime_get_noresume(ctx->dev); in sst_context_cleanup()
329 pm_runtime_disable(ctx->dev); in sst_context_cleanup()
330 sst_unregister(ctx->dev); in sst_context_cleanup()
331 sst_set_fw_state_locked(ctx, SST_SHUTDOWN); in sst_context_cleanup()
333 destroy_workqueue(ctx->post_msg_wq); in sst_context_cleanup()
334 pm_qos_remove_request(ctx->qos); in sst_context_cleanup()
335 kfree(ctx->fw_sg_list.src); in sst_context_cleanup()
336 kfree(ctx->fw_sg_list.dst); in sst_context_cleanup()
337 ctx->fw_sg_list.list_len = 0; in sst_context_cleanup()
338 kfree(ctx->fw_in_mem); in sst_context_cleanup()
339 ctx->fw_in_mem = NULL; in sst_context_cleanup()
340 sst_memcpy_free_resources(ctx); in sst_context_cleanup()
341 ctx = NULL; in sst_context_cleanup()
345 static inline void sst_save_shim64(struct intel_sst_drv *ctx, in sst_save_shim64() argument
351 spin_lock_irqsave(&ctx->ipc_spin_lock, irq_flags); in sst_save_shim64()
357 spin_unlock_irqrestore(&ctx->ipc_spin_lock, irq_flags); in sst_save_shim64()
360 static inline void sst_restore_shim64(struct intel_sst_drv *ctx, in sst_restore_shim64() argument
370 spin_lock_irqsave(&ctx->ipc_spin_lock, irq_flags); in sst_restore_shim64()
373 spin_unlock_irqrestore(&ctx->ipc_spin_lock, irq_flags); in sst_restore_shim64()
376 void sst_configure_runtime_pm(struct intel_sst_drv *ctx) in sst_configure_runtime_pm() argument
378 pm_runtime_set_autosuspend_delay(ctx->dev, SST_SUSPEND_DELAY); in sst_configure_runtime_pm()
379 pm_runtime_use_autosuspend(ctx->dev); in sst_configure_runtime_pm()
387 pm_runtime_set_active(ctx->dev); in sst_configure_runtime_pm()
389 pm_runtime_enable(ctx->dev); in sst_configure_runtime_pm()
392 pm_runtime_set_active(ctx->dev); in sst_configure_runtime_pm()
394 pm_runtime_put_noidle(ctx->dev); in sst_configure_runtime_pm()
396 sst_save_shim64(ctx, ctx->shim, ctx->shim_regs64); in sst_configure_runtime_pm()
403 struct intel_sst_drv *ctx = dev_get_drvdata(dev); in intel_sst_runtime_suspend() local
405 if (ctx->sst_state == SST_RESET) { in intel_sst_runtime_suspend()
410 if (ctx->ops->save_dsp_context(ctx)) in intel_sst_runtime_suspend()
414 sst_set_fw_state_locked(ctx, SST_RESET); in intel_sst_runtime_suspend()
416 synchronize_irq(ctx->irq_num); in intel_sst_runtime_suspend()
417 flush_workqueue(ctx->post_msg_wq); in intel_sst_runtime_suspend()
419 ctx->ops->reset(ctx); in intel_sst_runtime_suspend()
421 sst_save_shim64(ctx, ctx->shim, ctx->shim_regs64); in intel_sst_runtime_suspend()
428 struct intel_sst_drv *ctx = dev_get_drvdata(dev); in intel_sst_suspend() local
433 if (ctx->sst_state == SST_RESET) in intel_sst_suspend()
440 for (i = 1; i <= ctx->info.max_streams; i++) { in intel_sst_suspend()
441 struct stream_info *stream = &ctx->streams[i]; in intel_sst_suspend()
448 synchronize_irq(ctx->irq_num); in intel_sst_suspend()
449 flush_workqueue(ctx->post_msg_wq); in intel_sst_suspend()
452 sst_set_fw_state_locked(ctx, SST_RESET); in intel_sst_suspend()
455 if (ctx->ops->save_dsp_context(ctx)) in intel_sst_suspend()
462 fw_save->iram = kzalloc(ctx->iram_end - ctx->iram_base, GFP_KERNEL); in intel_sst_suspend()
467 fw_save->dram = kzalloc(ctx->dram_end - ctx->dram_base, GFP_KERNEL); in intel_sst_suspend()
478 fw_save->ddr = kzalloc(ctx->ddr_end - ctx->ddr_base, GFP_KERNEL); in intel_sst_suspend()
484 memcpy32_fromio(fw_save->iram, ctx->iram, ctx->iram_end - ctx->iram_base); in intel_sst_suspend()
485 memcpy32_fromio(fw_save->dram, ctx->dram, ctx->dram_end - ctx->dram_base); in intel_sst_suspend()
486 memcpy32_fromio(fw_save->sram, ctx->mailbox, SST_MAILBOX_SIZE); in intel_sst_suspend()
487 memcpy32_fromio(fw_save->ddr, ctx->ddr, ctx->ddr_end - ctx->ddr_base); in intel_sst_suspend()
489 ctx->fw_save = fw_save; in intel_sst_suspend()
490 ctx->ops->reset(ctx); in intel_sst_suspend()
505 struct intel_sst_drv *ctx = dev_get_drvdata(dev); in intel_sst_resume() local
506 struct sst_fw_save *fw_save = ctx->fw_save; in intel_sst_resume()
513 sst_set_fw_state_locked(ctx, SST_FW_LOADING); in intel_sst_resume()
516 ctx->ops->reset(ctx); in intel_sst_resume()
518 ctx->fw_save = NULL; in intel_sst_resume()
520 memcpy32_toio(ctx->iram, fw_save->iram, ctx->iram_end - ctx->iram_base); in intel_sst_resume()
521 memcpy32_toio(ctx->dram, fw_save->dram, ctx->dram_end - ctx->dram_base); in intel_sst_resume()
522 memcpy32_toio(ctx->mailbox, fw_save->sram, SST_MAILBOX_SIZE); in intel_sst_resume()
523 memcpy32_toio(ctx->ddr, fw_save->ddr, ctx->ddr_end - ctx->ddr_base); in intel_sst_resume()
531 block = sst_create_block(ctx, 0, FW_DWNL_ID); in intel_sst_resume()
537 ctx->ops->start(ctx); in intel_sst_resume()
538 ret = sst_wait_timeout(ctx, block); in intel_sst_resume()
540 dev_err(ctx->dev, "fw download failed %d\n", ret); in intel_sst_resume()
545 sst_set_fw_state_locked(ctx, SST_FW_RUNNING); in intel_sst_resume()
548 sst_free_block(ctx, block); in intel_sst_resume()