aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/intel/atom/sst/sst.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/intel/atom/sst/sst.c')
-rw-r--r--sound/soc/intel/atom/sst/sst.c59
1 files changed, 12 insertions, 47 deletions
diff --git a/sound/soc/intel/atom/sst/sst.c b/sound/soc/intel/atom/sst/sst.c
index f9ba71315e33..8afdff457579 100644
--- a/sound/soc/intel/atom/sst/sst.c
+++ b/sound/soc/intel/atom/sst/sst.c
@@ -258,7 +258,7 @@ static ssize_t firmware_version_show(struct device *dev,
258 258
259} 259}
260 260
261DEVICE_ATTR_RO(firmware_version); 261static DEVICE_ATTR_RO(firmware_version);
262 262
263static const struct attribute *sst_fw_version_attrs[] = { 263static const struct attribute *sst_fw_version_attrs[] = {
264 &dev_attr_firmware_version.attr, 264 &dev_attr_firmware_version.attr,
@@ -382,37 +382,6 @@ void sst_context_cleanup(struct intel_sst_drv *ctx)
382} 382}
383EXPORT_SYMBOL_GPL(sst_context_cleanup); 383EXPORT_SYMBOL_GPL(sst_context_cleanup);
384 384
385static inline void sst_save_shim64(struct intel_sst_drv *ctx,
386 void __iomem *shim,
387 struct sst_shim_regs64 *shim_regs)
388{
389 unsigned long irq_flags;
390
391 spin_lock_irqsave(&ctx->ipc_spin_lock, irq_flags);
392
393 shim_regs->imrx = sst_shim_read64(shim, SST_IMRX);
394 shim_regs->csr = sst_shim_read64(shim, SST_CSR);
395
396
397 spin_unlock_irqrestore(&ctx->ipc_spin_lock, irq_flags);
398}
399
400static inline void sst_restore_shim64(struct intel_sst_drv *ctx,
401 void __iomem *shim,
402 struct sst_shim_regs64 *shim_regs)
403{
404 unsigned long irq_flags;
405
406 /*
407 * we only need to restore IMRX for this case, rest will be
408 * initialize by FW or driver when firmware is loaded
409 */
410 spin_lock_irqsave(&ctx->ipc_spin_lock, irq_flags);
411 sst_shim_write64(shim, SST_IMRX, shim_regs->imrx);
412 sst_shim_write64(shim, SST_CSR, shim_regs->csr);
413 spin_unlock_irqrestore(&ctx->ipc_spin_lock, irq_flags);
414}
415
416void sst_configure_runtime_pm(struct intel_sst_drv *ctx) 385void sst_configure_runtime_pm(struct intel_sst_drv *ctx)
417{ 386{
418 pm_runtime_set_autosuspend_delay(ctx->dev, SST_SUSPEND_DELAY); 387 pm_runtime_set_autosuspend_delay(ctx->dev, SST_SUSPEND_DELAY);
@@ -432,8 +401,6 @@ void sst_configure_runtime_pm(struct intel_sst_drv *ctx)
432 pm_runtime_set_active(ctx->dev); 401 pm_runtime_set_active(ctx->dev);
433 else 402 else
434 pm_runtime_put_noidle(ctx->dev); 403 pm_runtime_put_noidle(ctx->dev);
435
436 sst_save_shim64(ctx, ctx->shim, ctx->shim_regs64);
437} 404}
438EXPORT_SYMBOL_GPL(sst_configure_runtime_pm); 405EXPORT_SYMBOL_GPL(sst_configure_runtime_pm);
439 406
@@ -457,8 +424,6 @@ static int intel_sst_runtime_suspend(struct device *dev)
457 flush_workqueue(ctx->post_msg_wq); 424 flush_workqueue(ctx->post_msg_wq);
458 425
459 ctx->ops->reset(ctx); 426 ctx->ops->reset(ctx);
460 /* save the shim registers because PMC doesn't save state */
461 sst_save_shim64(ctx, ctx->shim, ctx->shim_regs64);
462 427
463 return ret; 428 return ret;
464} 429}
@@ -499,23 +464,23 @@ static int intel_sst_suspend(struct device *dev)
499 fw_save = kzalloc(sizeof(*fw_save), GFP_KERNEL); 464 fw_save = kzalloc(sizeof(*fw_save), GFP_KERNEL);
500 if (!fw_save) 465 if (!fw_save)
501 return -ENOMEM; 466 return -ENOMEM;
502 fw_save->iram = kzalloc(ctx->iram_end - ctx->iram_base, GFP_KERNEL); 467 fw_save->iram = kvzalloc(ctx->iram_end - ctx->iram_base, GFP_KERNEL);
503 if (!fw_save->iram) { 468 if (!fw_save->iram) {
504 ret = -ENOMEM; 469 ret = -ENOMEM;
505 goto iram; 470 goto iram;
506 } 471 }
507 fw_save->dram = kzalloc(ctx->dram_end - ctx->dram_base, GFP_KERNEL); 472 fw_save->dram = kvzalloc(ctx->dram_end - ctx->dram_base, GFP_KERNEL);
508 if (!fw_save->dram) { 473 if (!fw_save->dram) {
509 ret = -ENOMEM; 474 ret = -ENOMEM;
510 goto dram; 475 goto dram;
511 } 476 }
512 fw_save->sram = kzalloc(SST_MAILBOX_SIZE, GFP_KERNEL); 477 fw_save->sram = kvzalloc(SST_MAILBOX_SIZE, GFP_KERNEL);
513 if (!fw_save->sram) { 478 if (!fw_save->sram) {
514 ret = -ENOMEM; 479 ret = -ENOMEM;
515 goto sram; 480 goto sram;
516 } 481 }
517 482
518 fw_save->ddr = kzalloc(ctx->ddr_end - ctx->ddr_base, GFP_KERNEL); 483 fw_save->ddr = kvzalloc(ctx->ddr_end - ctx->ddr_base, GFP_KERNEL);
519 if (!fw_save->ddr) { 484 if (!fw_save->ddr) {
520 ret = -ENOMEM; 485 ret = -ENOMEM;
521 goto ddr; 486 goto ddr;
@@ -530,11 +495,11 @@ static int intel_sst_suspend(struct device *dev)
530 ctx->ops->reset(ctx); 495 ctx->ops->reset(ctx);
531 return 0; 496 return 0;
532ddr: 497ddr:
533 kfree(fw_save->sram); 498 kvfree(fw_save->sram);
534sram: 499sram:
535 kfree(fw_save->dram); 500 kvfree(fw_save->dram);
536dram: 501dram:
537 kfree(fw_save->iram); 502 kvfree(fw_save->iram);
538iram: 503iram:
539 kfree(fw_save); 504 kfree(fw_save);
540 return ret; 505 return ret;
@@ -562,10 +527,10 @@ static int intel_sst_resume(struct device *dev)
562 memcpy32_toio(ctx->mailbox, fw_save->sram, SST_MAILBOX_SIZE); 527 memcpy32_toio(ctx->mailbox, fw_save->sram, SST_MAILBOX_SIZE);
563 memcpy32_toio(ctx->ddr, fw_save->ddr, ctx->ddr_end - ctx->ddr_base); 528 memcpy32_toio(ctx->ddr, fw_save->ddr, ctx->ddr_end - ctx->ddr_base);
564 529
565 kfree(fw_save->sram); 530 kvfree(fw_save->sram);
566 kfree(fw_save->dram); 531 kvfree(fw_save->dram);
567 kfree(fw_save->iram); 532 kvfree(fw_save->iram);
568 kfree(fw_save->ddr); 533 kvfree(fw_save->ddr);
569 kfree(fw_save); 534 kfree(fw_save);
570 535
571 block = sst_create_block(ctx, 0, FW_DWNL_ID); 536 block = sst_create_block(ctx, 0, FW_DWNL_ID);