Lines Matching refs:ctx

195 	struct intel_sst_drv *ctx = container_of(work,  in sst_process_pending_msg()  local
198 ctx->ops->post_message(ctx, NULL, false); in sst_process_pending_msg()
201 static int sst_workqueue_init(struct intel_sst_drv *ctx) in sst_workqueue_init() argument
203 INIT_LIST_HEAD(&ctx->memcpy_list); in sst_workqueue_init()
204 INIT_LIST_HEAD(&ctx->rx_list); in sst_workqueue_init()
205 INIT_LIST_HEAD(&ctx->ipc_dispatch_list); in sst_workqueue_init()
206 INIT_LIST_HEAD(&ctx->block_list); in sst_workqueue_init()
207 INIT_WORK(&ctx->ipc_post_msg_wq, sst_process_pending_msg); in sst_workqueue_init()
208 init_waitqueue_head(&ctx->wait_queue); in sst_workqueue_init()
210 ctx->post_msg_wq = in sst_workqueue_init()
212 if (!ctx->post_msg_wq) in sst_workqueue_init()
217 static void sst_init_locks(struct intel_sst_drv *ctx) in sst_init_locks() argument
219 mutex_init(&ctx->sst_lock); in sst_init_locks()
220 spin_lock_init(&ctx->rx_msg_lock); in sst_init_locks()
221 spin_lock_init(&ctx->ipc_spin_lock); in sst_init_locks()
222 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()
247 struct intel_sst_drv *ctx = dev_get_drvdata(dev); in firmware_version_show() local
249 if (ctx->fw_version.type == 0 && ctx->fw_version.major == 0 && in firmware_version_show()
250 ctx->fw_version.minor == 0 && ctx->fw_version.build == 0) in firmware_version_show()
254 ctx->fw_version.type, ctx->fw_version.major, in firmware_version_show()
255 ctx->fw_version.minor, ctx->fw_version.build); in firmware_version_show()
270 int sst_context_init(struct intel_sst_drv *ctx) in sst_context_init() argument
274 if (!ctx->pdata) in sst_context_init()
277 if (!ctx->pdata->probe_data) in sst_context_init()
280 memcpy(&ctx->info, ctx->pdata->probe_data, sizeof(ctx->info)); in sst_context_init()
282 ret = sst_driver_ops(ctx); in sst_context_init()
286 sst_init_locks(ctx); in sst_context_init()
287 sst_set_fw_state_locked(ctx, SST_RESET); in sst_context_init()
290 ctx->pvt_id = 1; in sst_context_init()
291 ctx->stream_cnt = 0; in sst_context_init()
292 ctx->fw_in_mem = NULL; in sst_context_init()
294 ctx->use_dma = 0; in sst_context_init()
295 ctx->use_lli = 0; in sst_context_init()
297 if (sst_workqueue_init(ctx)) in sst_context_init()
300 ctx->mailbox_recv_offset = ctx->pdata->ipc_info->mbox_recv_off; in sst_context_init()
301 ctx->ipc_reg.ipcx = SST_IPCX + ctx->pdata->ipc_info->ipc_offset; in sst_context_init()
302 ctx->ipc_reg.ipcd = SST_IPCD + ctx->pdata->ipc_info->ipc_offset; in sst_context_init()
304 dev_info(ctx->dev, "Got drv data max stream %d\n", in sst_context_init()
305 ctx->info.max_streams); in sst_context_init()
307 for (i = 1; i <= ctx->info.max_streams; i++) { in sst_context_init()
308 struct stream_info *stream = &ctx->streams[i]; in sst_context_init()
316 ret = devm_request_threaded_irq(ctx->dev, ctx->irq_num, ctx->ops->interrupt, in sst_context_init()
317 ctx->ops->irq_thread, 0, SST_DRV_NAME, in sst_context_init()
318 ctx); in sst_context_init()
322 dev_dbg(ctx->dev, "Registered IRQ %#x\n", ctx->irq_num); in sst_context_init()
325 sst_shim_write64(ctx->shim, SST_IMRX, 0xFFFF0038); in sst_context_init()
327 ctx->qos = devm_kzalloc(ctx->dev, in sst_context_init()
329 if (!ctx->qos) { in sst_context_init()
333 cpu_latency_qos_add_request(ctx->qos, PM_QOS_DEFAULT_VALUE); in sst_context_init()
335 dev_dbg(ctx->dev, "Requesting FW %s now...\n", ctx->firmware_name); in sst_context_init()
336 ret = request_firmware_nowait(THIS_MODULE, true, ctx->firmware_name, in sst_context_init()
337 ctx->dev, GFP_KERNEL, ctx, sst_firmware_load_cb); in sst_context_init()
339 dev_err(ctx->dev, "Firmware download failed:%d\n", ret); in sst_context_init()
343 ret = sysfs_create_group(&ctx->dev->kobj, in sst_context_init()
346 dev_err(ctx->dev, in sst_context_init()
351 sst_register(ctx->dev); in sst_context_init()
354 sysfs_remove_group(&ctx->dev->kobj, &sst_fw_version_attr_group); in sst_context_init()
357 destroy_workqueue(ctx->post_msg_wq); in sst_context_init()
362 void sst_context_cleanup(struct intel_sst_drv *ctx) in sst_context_cleanup() argument
364 pm_runtime_get_noresume(ctx->dev); in sst_context_cleanup()
365 pm_runtime_disable(ctx->dev); in sst_context_cleanup()
366 sst_unregister(ctx->dev); in sst_context_cleanup()
367 sst_set_fw_state_locked(ctx, SST_SHUTDOWN); in sst_context_cleanup()
368 sysfs_remove_group(&ctx->dev->kobj, &sst_fw_version_attr_group); in sst_context_cleanup()
369 destroy_workqueue(ctx->post_msg_wq); in sst_context_cleanup()
370 cpu_latency_qos_remove_request(ctx->qos); in sst_context_cleanup()
371 kfree(ctx->fw_sg_list.src); in sst_context_cleanup()
372 kfree(ctx->fw_sg_list.dst); in sst_context_cleanup()
373 ctx->fw_sg_list.list_len = 0; in sst_context_cleanup()
374 kfree(ctx->fw_in_mem); in sst_context_cleanup()
375 ctx->fw_in_mem = NULL; in sst_context_cleanup()
376 sst_memcpy_free_resources(ctx); in sst_context_cleanup()
380 void sst_configure_runtime_pm(struct intel_sst_drv *ctx) in sst_configure_runtime_pm() argument
382 pm_runtime_set_autosuspend_delay(ctx->dev, SST_SUSPEND_DELAY); in sst_configure_runtime_pm()
383 pm_runtime_use_autosuspend(ctx->dev); in sst_configure_runtime_pm()
391 pm_runtime_set_active(ctx->dev); in sst_configure_runtime_pm()
393 pm_runtime_enable(ctx->dev); in sst_configure_runtime_pm()
396 pm_runtime_set_active(ctx->dev); in sst_configure_runtime_pm()
398 pm_runtime_put_noidle(ctx->dev); in sst_configure_runtime_pm()
405 struct intel_sst_drv *ctx = dev_get_drvdata(dev); in intel_sst_runtime_suspend() local
407 if (ctx->sst_state == SST_RESET) { in intel_sst_runtime_suspend()
412 if (ctx->ops->save_dsp_context(ctx)) in intel_sst_runtime_suspend()
416 sst_set_fw_state_locked(ctx, SST_RESET); in intel_sst_runtime_suspend()
418 synchronize_irq(ctx->irq_num); in intel_sst_runtime_suspend()
419 flush_workqueue(ctx->post_msg_wq); in intel_sst_runtime_suspend()
421 ctx->ops->reset(ctx); 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 if (ctx->pdata->streams_lost_on_suspend) { in intel_sst_suspend()
452 sst_free_stream(ctx, i); in intel_sst_suspend()
455 synchronize_irq(ctx->irq_num); in intel_sst_suspend()
456 flush_workqueue(ctx->post_msg_wq); in intel_sst_suspend()
459 sst_set_fw_state_locked(ctx, SST_RESET); in intel_sst_suspend()
462 if (ctx->ops->save_dsp_context(ctx)) in intel_sst_suspend()
469 fw_save->iram = kvzalloc(ctx->iram_end - ctx->iram_base, GFP_KERNEL); in intel_sst_suspend()
474 fw_save->dram = kvzalloc(ctx->dram_end - ctx->dram_base, GFP_KERNEL); in intel_sst_suspend()
485 fw_save->ddr = kvzalloc(ctx->ddr_end - ctx->ddr_base, GFP_KERNEL); in intel_sst_suspend()
491 memcpy32_fromio(fw_save->iram, ctx->iram, ctx->iram_end - ctx->iram_base); in intel_sst_suspend()
492 memcpy32_fromio(fw_save->dram, ctx->dram, ctx->dram_end - ctx->dram_base); in intel_sst_suspend()
493 memcpy32_fromio(fw_save->sram, ctx->mailbox, SST_MAILBOX_SIZE); in intel_sst_suspend()
494 memcpy32_fromio(fw_save->ddr, ctx->ddr, ctx->ddr_end - ctx->ddr_base); in intel_sst_suspend()
496 ctx->fw_save = fw_save; in intel_sst_suspend()
497 ctx->ops->reset(ctx); in intel_sst_suspend()
512 struct intel_sst_drv *ctx = dev_get_drvdata(dev); in intel_sst_resume() local
513 struct sst_fw_save *fw_save = ctx->fw_save; in intel_sst_resume()
520 sst_set_fw_state_locked(ctx, SST_FW_LOADING); in intel_sst_resume()
523 ctx->ops->reset(ctx); in intel_sst_resume()
525 ctx->fw_save = NULL; in intel_sst_resume()
527 memcpy32_toio(ctx->iram, fw_save->iram, ctx->iram_end - ctx->iram_base); in intel_sst_resume()
528 memcpy32_toio(ctx->dram, fw_save->dram, ctx->dram_end - ctx->dram_base); in intel_sst_resume()
529 memcpy32_toio(ctx->mailbox, fw_save->sram, SST_MAILBOX_SIZE); in intel_sst_resume()
530 memcpy32_toio(ctx->ddr, fw_save->ddr, ctx->ddr_end - ctx->ddr_base); in intel_sst_resume()
538 block = sst_create_block(ctx, 0, FW_DWNL_ID); in intel_sst_resume()
544 ctx->ops->start(ctx); in intel_sst_resume()
545 ret = sst_wait_timeout(ctx, block); in intel_sst_resume()
547 dev_err(ctx->dev, "fw download failed %d\n", ret); in intel_sst_resume()
552 sst_set_fw_state_locked(ctx, SST_FW_RUNNING); in intel_sst_resume()
555 if (ctx->pdata->streams_lost_on_suspend) { in intel_sst_resume()
556 for (i = 1; i <= ctx->info.max_streams; i++) { in intel_sst_resume()
557 struct stream_info *stream = &ctx->streams[i]; in intel_sst_resume()
560 dev_dbg(ctx->dev, "Re-allocing stream %d status %d prev %d\n", in intel_sst_resume()
563 sst_realloc_stream(ctx, i); in intel_sst_resume()
570 sst_free_block(ctx, block); in intel_sst_resume()