aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/intel/skylake/bxt-sst.c28
-rw-r--r--sound/soc/intel/skylake/skl-sst-dsp.h3
-rw-r--r--sound/soc/intel/skylake/skl-sst-utils.c37
-rw-r--r--sound/soc/intel/skylake/skl-sst.c32
4 files changed, 51 insertions, 49 deletions
diff --git a/sound/soc/intel/skylake/bxt-sst.c b/sound/soc/intel/skylake/bxt-sst.c
index 268bdaec8042..2bf6ebe29f50 100644
--- a/sound/soc/intel/skylake/bxt-sst.c
+++ b/sound/soc/intel/skylake/bxt-sst.c
@@ -590,23 +590,14 @@ int bxt_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
590 struct sst_dsp *sst; 590 struct sst_dsp *sst;
591 int ret; 591 int ret;
592 592
593 skl = devm_kzalloc(dev, sizeof(*skl), GFP_KERNEL); 593 ret = skl_sst_ctx_init(dev, irq, fw_name, dsp_ops, dsp, &skl_dev);
594 if (skl == NULL) 594 if (ret < 0) {
595 return -ENOMEM; 595 dev_err(skl->dev, "%s: no device\n", __func__);
596 596 return ret;
597 skl->dev = dev;
598 skl_dev.thread_context = skl;
599 INIT_LIST_HEAD(&skl->uuid_list);
600
601 skl->dsp = skl_dsp_ctx_init(dev, &skl_dev, irq);
602 if (!skl->dsp) {
603 dev_err(skl->dev, "skl_dsp_ctx_init failed\n");
604 return -ENODEV;
605 } 597 }
606 598
599 skl = *dsp;
607 sst = skl->dsp; 600 sst = skl->dsp;
608 sst->fw_name = fw_name;
609 sst->dsp_ops = dsp_ops;
610 sst->fw_ops = bxt_fw_ops; 601 sst->fw_ops = bxt_fw_ops;
611 sst->addr.lpe = mmio_base; 602 sst->addr.lpe = mmio_base;
612 sst->addr.shim = mmio_base; 603 sst->addr.shim = mmio_base;
@@ -614,24 +605,15 @@ int bxt_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
614 sst_dsp_mailbox_init(sst, (BXT_ADSP_SRAM0_BASE + SKL_ADSP_W0_STAT_SZ), 605 sst_dsp_mailbox_init(sst, (BXT_ADSP_SRAM0_BASE + SKL_ADSP_W0_STAT_SZ),
615 SKL_ADSP_W0_UP_SZ, BXT_ADSP_SRAM1_BASE, SKL_ADSP_W1_SZ); 606 SKL_ADSP_W0_UP_SZ, BXT_ADSP_SRAM1_BASE, SKL_ADSP_W1_SZ);
616 607
617 INIT_LIST_HEAD(&sst->module_list);
618 ret = skl_ipc_init(dev, skl);
619 if (ret)
620 return ret;
621
622 /* set the D0i3 check */ 608 /* set the D0i3 check */
623 skl->ipc.ops.check_dsp_lp_on = skl_ipc_check_D0i0; 609 skl->ipc.ops.check_dsp_lp_on = skl_ipc_check_D0i0;
624 610
625 skl->cores.count = 2; 611 skl->cores.count = 2;
626 skl->boot_complete = false; 612 skl->boot_complete = false;
627 init_waitqueue_head(&skl->boot_wait); 613 init_waitqueue_head(&skl->boot_wait);
628 skl->is_first_boot = true;
629 INIT_DELAYED_WORK(&skl->d0i3.work, bxt_set_dsp_D0i3); 614 INIT_DELAYED_WORK(&skl->d0i3.work, bxt_set_dsp_D0i3);
630 skl->d0i3.state = SKL_DSP_D0I3_NONE; 615 skl->d0i3.state = SKL_DSP_D0I3_NONE;
631 616
632 if (dsp)
633 *dsp = skl;
634
635 return 0; 617 return 0;
636} 618}
637EXPORT_SYMBOL_GPL(bxt_sst_dsp_init); 619EXPORT_SYMBOL_GPL(bxt_sst_dsp_init);
diff --git a/sound/soc/intel/skylake/skl-sst-dsp.h b/sound/soc/intel/skylake/skl-sst-dsp.h
index 7229a12b4c94..c1f95e23933d 100644
--- a/sound/soc/intel/skylake/skl-sst-dsp.h
+++ b/sound/soc/intel/skylake/skl-sst-dsp.h
@@ -247,5 +247,8 @@ void skl_freeup_uuid_list(struct skl_sst *ctx);
247 247
248int skl_dsp_strip_extended_manifest(struct firmware *fw); 248int skl_dsp_strip_extended_manifest(struct firmware *fw);
249void skl_dsp_enable_notification(struct skl_sst *ctx, bool enable); 249void skl_dsp_enable_notification(struct skl_sst *ctx, bool enable);
250int skl_sst_ctx_init(struct device *dev, int irq, const char *fw_name,
251 struct skl_dsp_loader_ops dsp_ops, struct skl_sst **dsp,
252 struct sst_dsp_device *skl_dev);
250 253
251#endif /*__SKL_SST_DSP_H__*/ 254#endif /*__SKL_SST_DSP_H__*/
diff --git a/sound/soc/intel/skylake/skl-sst-utils.c b/sound/soc/intel/skylake/skl-sst-utils.c
index 6d5bff04bf65..a72152123c3c 100644
--- a/sound/soc/intel/skylake/skl-sst-utils.c
+++ b/sound/soc/intel/skylake/skl-sst-utils.c
@@ -361,3 +361,40 @@ int skl_dsp_strip_extended_manifest(struct firmware *fw)
361 361
362 return 0; 362 return 0;
363} 363}
364
365int skl_sst_ctx_init(struct device *dev, int irq, const char *fw_name,
366 struct skl_dsp_loader_ops dsp_ops, struct skl_sst **dsp,
367 struct sst_dsp_device *skl_dev)
368{
369 struct skl_sst *skl;
370 struct sst_dsp *sst;
371 int ret;
372
373 skl = devm_kzalloc(dev, sizeof(*skl), GFP_KERNEL);
374 if (skl == NULL)
375 return -ENOMEM;
376
377 skl->dev = dev;
378 skl_dev->thread_context = skl;
379 INIT_LIST_HEAD(&skl->uuid_list);
380 skl->dsp = skl_dsp_ctx_init(dev, skl_dev, irq);
381 if (!skl->dsp) {
382 dev_err(skl->dev, "%s: no device\n", __func__);
383 return -ENODEV;
384 }
385
386 sst = skl->dsp;
387 sst->fw_name = fw_name;
388 sst->dsp_ops = dsp_ops;
389 init_waitqueue_head(&skl->mod_load_wait);
390 INIT_LIST_HEAD(&sst->module_list);
391 ret = skl_ipc_init(dev, skl);
392 if (ret)
393 return ret;
394
395 skl->is_first_boot = true;
396 if (dsp)
397 *dsp = skl;
398
399 return ret;
400}
diff --git a/sound/soc/intel/skylake/skl-sst.c b/sound/soc/intel/skylake/skl-sst.c
index 539529729e3f..4fdd503a837c 100644
--- a/sound/soc/intel/skylake/skl-sst.c
+++ b/sound/soc/intel/skylake/skl-sst.c
@@ -330,7 +330,6 @@ static int skl_transfer_module(struct sst_dsp *ctx, const void *data,
330 int ret, bytes_left, curr_pos; 330 int ret, bytes_left, curr_pos;
331 struct skl_sst *skl = ctx->thread_context; 331 struct skl_sst *skl = ctx->thread_context;
332 skl->mod_load_complete = false; 332 skl->mod_load_complete = false;
333 init_waitqueue_head(&skl->mod_load_wait);
334 333
335 bytes_left = ctx->cl_dev.ops.cl_copy_to_dmabuf(ctx, data, size, false); 334 bytes_left = ctx->cl_dev.ops.cl_copy_to_dmabuf(ctx, data, size, false);
336 if (bytes_left < 0) 335 if (bytes_left < 0)
@@ -489,43 +488,24 @@ int skl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
489 struct sst_dsp *sst; 488 struct sst_dsp *sst;
490 int ret; 489 int ret;
491 490
492 skl = devm_kzalloc(dev, sizeof(*skl), GFP_KERNEL); 491 ret = skl_sst_ctx_init(dev, irq, fw_name, dsp_ops, dsp, &skl_dev);
493 if (skl == NULL) 492 if (ret < 0) {
494 return -ENOMEM; 493 dev_err(dev, "%s: no device\n", __func__);
495 494 return ret;
496 skl->dev = dev;
497 skl_dev.thread_context = skl;
498 INIT_LIST_HEAD(&skl->uuid_list);
499
500 skl->dsp = skl_dsp_ctx_init(dev, &skl_dev, irq);
501 if (!skl->dsp) {
502 dev_err(skl->dev, "%s: no device\n", __func__);
503 return -ENODEV;
504 } 495 }
505 496
497 skl = *dsp;
506 sst = skl->dsp; 498 sst = skl->dsp;
507
508 sst->fw_name = fw_name;
509 sst->addr.lpe = mmio_base; 499 sst->addr.lpe = mmio_base;
510 sst->addr.shim = mmio_base; 500 sst->addr.shim = mmio_base;
511 sst_dsp_mailbox_init(sst, (SKL_ADSP_SRAM0_BASE + SKL_ADSP_W0_STAT_SZ), 501 sst_dsp_mailbox_init(sst, (SKL_ADSP_SRAM0_BASE + SKL_ADSP_W0_STAT_SZ),
512 SKL_ADSP_W0_UP_SZ, SKL_ADSP_SRAM1_BASE, SKL_ADSP_W1_SZ); 502 SKL_ADSP_W0_UP_SZ, SKL_ADSP_SRAM1_BASE, SKL_ADSP_W1_SZ);
513 503
514 INIT_LIST_HEAD(&sst->module_list);
515 sst->dsp_ops = dsp_ops;
516 sst->fw_ops = skl_fw_ops; 504 sst->fw_ops = skl_fw_ops;
517 505
518 ret = skl_ipc_init(dev, skl);
519 if (ret)
520 return ret;
521
522 skl->cores.count = 2; 506 skl->cores.count = 2;
523 skl->is_first_boot = true;
524
525 if (dsp)
526 *dsp = skl;
527 507
528 return ret; 508 return 0;
529} 509}
530EXPORT_SYMBOL_GPL(skl_sst_dsp_init); 510EXPORT_SYMBOL_GPL(skl_sst_dsp_init);
531 511