diff options
Diffstat (limited to 'sound/soc/intel/atom/sst/sst.c')
-rw-r--r-- | sound/soc/intel/atom/sst/sst.c | 59 |
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 | ||
261 | DEVICE_ATTR_RO(firmware_version); | 261 | static DEVICE_ATTR_RO(firmware_version); |
262 | 262 | ||
263 | static const struct attribute *sst_fw_version_attrs[] = { | 263 | static 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 | } |
383 | EXPORT_SYMBOL_GPL(sst_context_cleanup); | 383 | EXPORT_SYMBOL_GPL(sst_context_cleanup); |
384 | 384 | ||
385 | static 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 | |||
400 | static 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 | |||
416 | void sst_configure_runtime_pm(struct intel_sst_drv *ctx) | 385 | void 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 | } |
438 | EXPORT_SYMBOL_GPL(sst_configure_runtime_pm); | 405 | EXPORT_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; |
532 | ddr: | 497 | ddr: |
533 | kfree(fw_save->sram); | 498 | kvfree(fw_save->sram); |
534 | sram: | 499 | sram: |
535 | kfree(fw_save->dram); | 500 | kvfree(fw_save->dram); |
536 | dram: | 501 | dram: |
537 | kfree(fw_save->iram); | 502 | kvfree(fw_save->iram); |
538 | iram: | 503 | iram: |
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); |