aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/intel/sst/sst.c
diff options
context:
space:
mode:
authorSubhransu S. Prusty <subhransu.s.prusty@intel.com>2014-10-30 16:21:49 +0530
committerMark Brown <broonie@kernel.org>2014-10-31 16:57:33 +0000
commit7fb73c74ffee65bda3b6d3b00c1b841f557a1191 (patch)
treebc1ca689fb9b101109c8aa917e884017da4834a3 /sound/soc/intel/sst/sst.c
parentASoC: Intel: modularize driver probe and remove (diff)
downloadlinux-dev-7fb73c74ffee65bda3b6d3b00c1b841f557a1191.tar.xz
linux-dev-7fb73c74ffee65bda3b6d3b00c1b841f557a1191.zip
ASoC: Intel: more probe modularization for sst
Move the PCI BAR and resource initialization to a separate routine Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com> Signed-off-by: Vinod Koul <vinod.koul@intel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to '')
-rw-r--r--sound/soc/intel/sst/sst.c158
1 files changed, 86 insertions, 72 deletions
diff --git a/sound/soc/intel/sst/sst.c b/sound/soc/intel/sst/sst.c
index 09d367aeaa15..2bfb404ea7c1 100644
--- a/sound/soc/intel/sst/sst.c
+++ b/sound/soc/intel/sst/sst.c
@@ -332,114 +332,132 @@ void sst_context_cleanup(struct intel_sst_drv *ctx)
ctx = NULL;
}
-/*
-* intel_sst_probe - PCI probe function
-*
-* @pci: PCI device structure
-* @pci_id: PCI device ID structure
-*
-*/
-static int intel_sst_probe(struct pci_dev *pci,
- const struct pci_device_id *pci_id)
+void sst_configure_runtime_pm(struct intel_sst_drv *ctx)
{
- int ret = 0;
- struct intel_sst_drv *sst_drv_ctx;
- struct sst_platform_info *sst_pdata = pci->dev.platform_data;
- int ddr_base;
-
- dev_dbg(&pci->dev, "Probe for DID %x\n", pci->device);
-
- ret = sst_alloc_drv_context(&sst_drv_ctx, &pci->dev, pci->device);
- if (ret < 0)
- return ret;
-
- sst_drv_ctx->pdata = sst_pdata;
-
- ret = sst_context_init(sst_drv_ctx);
- if (ret < 0)
- goto do_free_drv_ctx;
-
+ pm_runtime_set_autosuspend_delay(ctx->dev, SST_SUSPEND_DELAY);
+ pm_runtime_use_autosuspend(ctx->dev);
+ pm_runtime_allow(ctx->dev);
+ pm_runtime_put_noidle(ctx->dev);
+}
- /* Init the device */
- ret = pcim_enable_device(pci);
- if (ret) {
- dev_err(sst_drv_ctx->dev,
- "device can't be enabled. Returned err: %d\n", ret);
- goto do_free_mem;
- }
- sst_drv_ctx->pci = pci_dev_get(pci);
+static int sst_platform_get_resources(struct intel_sst_drv *ctx)
+{
+ int ddr_base, ret = 0;
+ struct pci_dev *pci = ctx->pci;
ret = pci_request_regions(pci, SST_DRV_NAME);
if (ret)
- goto do_free_mem;
+ return ret;
/* map registers */
/* DDR base */
- if (sst_drv_ctx->dev_id == SST_MRFLD_PCI_ID) {
- sst_drv_ctx->ddr_base = pci_resource_start(pci, 0);
+ if (ctx->dev_id == SST_MRFLD_PCI_ID) {
+ ctx->ddr_base = pci_resource_start(pci, 0);
/* check that the relocated IMR base matches with FW Binary */
- ddr_base = relocate_imr_addr_mrfld(sst_drv_ctx->ddr_base);
- if (!sst_drv_ctx->pdata->lib_info) {
- dev_err(sst_drv_ctx->dev, "lib_info pointer NULL\n");
+ ddr_base = relocate_imr_addr_mrfld(ctx->ddr_base);
+ if (!ctx->pdata->lib_info) {
+ dev_err(ctx->dev, "lib_info pointer NULL\n");
ret = -EINVAL;
goto do_release_regions;
}
- if (ddr_base != sst_drv_ctx->pdata->lib_info->mod_base) {
- dev_err(sst_drv_ctx->dev,
+ if (ddr_base != ctx->pdata->lib_info->mod_base) {
+ dev_err(ctx->dev,
"FW LSP DDR BASE does not match with IFWI\n");
ret = -EINVAL;
goto do_release_regions;
}
- sst_drv_ctx->ddr_end = pci_resource_end(pci, 0);
+ ctx->ddr_end = pci_resource_end(pci, 0);
- sst_drv_ctx->ddr = pcim_iomap(pci, 0,
+ ctx->ddr = pcim_iomap(pci, 0,
pci_resource_len(pci, 0));
- if (!sst_drv_ctx->ddr) {
+ if (!ctx->ddr) {
ret = -EINVAL;
goto do_release_regions;
}
- dev_dbg(sst_drv_ctx->dev, "sst: DDR Ptr %p\n", sst_drv_ctx->ddr);
+ dev_dbg(ctx->dev, "sst: DDR Ptr %p\n", ctx->ddr);
} else {
- sst_drv_ctx->ddr = NULL;
+ ctx->ddr = NULL;
}
-
/* SHIM */
- sst_drv_ctx->shim_phy_add = pci_resource_start(pci, 1);
- sst_drv_ctx->shim = pcim_iomap(pci, 1, pci_resource_len(pci, 1));
- if (!sst_drv_ctx->shim) {
+ ctx->shim_phy_add = pci_resource_start(pci, 1);
+ ctx->shim = pcim_iomap(pci, 1, pci_resource_len(pci, 1));
+ if (!ctx->shim) {
ret = -EINVAL;
goto do_release_regions;
}
- dev_dbg(sst_drv_ctx->dev, "SST Shim Ptr %p\n", sst_drv_ctx->shim);
+ dev_dbg(ctx->dev, "SST Shim Ptr %p\n", ctx->shim);
/* Shared SRAM */
- sst_drv_ctx->mailbox_add = pci_resource_start(pci, 2);
- sst_drv_ctx->mailbox = pcim_iomap(pci, 2, pci_resource_len(pci, 2));
- if (!sst_drv_ctx->mailbox) {
+ ctx->mailbox_add = pci_resource_start(pci, 2);
+ ctx->mailbox = pcim_iomap(pci, 2, pci_resource_len(pci, 2));
+ if (!ctx->mailbox) {
ret = -EINVAL;
goto do_release_regions;
}
- dev_dbg(sst_drv_ctx->dev, "SRAM Ptr %p\n", sst_drv_ctx->mailbox);
+ dev_dbg(ctx->dev, "SRAM Ptr %p\n", ctx->mailbox);
/* IRAM */
- sst_drv_ctx->iram_end = pci_resource_end(pci, 3);
- sst_drv_ctx->iram_base = pci_resource_start(pci, 3);
- sst_drv_ctx->iram = pcim_iomap(pci, 3, pci_resource_len(pci, 3));
- if (!sst_drv_ctx->iram) {
+ ctx->iram_end = pci_resource_end(pci, 3);
+ ctx->iram_base = pci_resource_start(pci, 3);
+ ctx->iram = pcim_iomap(pci, 3, pci_resource_len(pci, 3));
+ if (!ctx->iram) {
ret = -EINVAL;
goto do_release_regions;
}
- dev_dbg(sst_drv_ctx->dev, "IRAM Ptr %p\n", sst_drv_ctx->iram);
+ dev_dbg(ctx->dev, "IRAM Ptr %p\n", ctx->iram);
/* DRAM */
- sst_drv_ctx->dram_end = pci_resource_end(pci, 4);
- sst_drv_ctx->dram_base = pci_resource_start(pci, 4);
- sst_drv_ctx->dram = pcim_iomap(pci, 4, pci_resource_len(pci, 4));
- if (!sst_drv_ctx->dram) {
+ ctx->dram_end = pci_resource_end(pci, 4);
+ ctx->dram_base = pci_resource_start(pci, 4);
+ ctx->dram = pcim_iomap(pci, 4, pci_resource_len(pci, 4));
+ if (!ctx->dram) {
ret = -EINVAL;
goto do_release_regions;
}
- dev_dbg(sst_drv_ctx->dev, "DRAM Ptr %p\n", sst_drv_ctx->dram);
+ dev_dbg(ctx->dev, "DRAM Ptr %p\n", ctx->dram);
+do_release_regions:
+ pci_release_regions(pci);
+ return 0;
+}
+/*
+* intel_sst_probe - PCI probe function
+*
+* @pci: PCI device structure
+* @pci_id: PCI device ID structure
+*
+*/
+static int intel_sst_probe(struct pci_dev *pci,
+ const struct pci_device_id *pci_id)
+{
+ int ret = 0;
+ struct intel_sst_drv *sst_drv_ctx;
+ struct sst_platform_info *sst_pdata = pci->dev.platform_data;
+
+ dev_dbg(&pci->dev, "Probe for DID %x\n", pci->device);
+
+ ret = sst_alloc_drv_context(&sst_drv_ctx, &pci->dev, pci->device);
+ if (ret < 0)
+ return ret;
+
+ sst_drv_ctx->pdata = sst_pdata;
+ sst_drv_ctx->irq_num = pci->irq;
+
+ ret = sst_context_init(sst_drv_ctx);
+ if (ret < 0)
+ goto do_free_drv_ctx;
+
+
+ /* Init the device */
+ ret = pcim_enable_device(pci);
+ if (ret) {
+ dev_err(sst_drv_ctx->dev,
+ "device can't be enabled. Returned err: %d\n", ret);
+ goto do_destroy_wq;
+ }
+ sst_drv_ctx->pci = pci_dev_get(pci);
+ ret = sst_platform_get_resources(sst_drv_ctx);
+ if (ret < 0)
+ goto do_destroy_wq;
sst_set_fw_state_locked(sst_drv_ctx, SST_RESET);
snprintf(sst_drv_ctx->firmware_name, sizeof(sst_drv_ctx->firmware_name),
@@ -457,20 +475,16 @@ static int intel_sst_probe(struct pci_dev *pci,
goto do_release_regions;
}
- sst_drv_ctx->irq_num = pci->irq;
pci_set_drvdata(pci, sst_drv_ctx);
- pm_runtime_set_autosuspend_delay(sst_drv_ctx->dev, SST_SUSPEND_DELAY);
- pm_runtime_use_autosuspend(sst_drv_ctx->dev);
- pm_runtime_allow(sst_drv_ctx->dev);
- pm_runtime_put_noidle(sst_drv_ctx->dev);
+ sst_configure_runtime_pm(sst_drv_ctx);
sst_register(sst_drv_ctx->dev);
return ret;
do_release_regions:
pci_release_regions(pci);
-do_free_mem:
+do_destroy_wq:
destroy_workqueue(sst_drv_ctx->post_msg_wq);
do_free_drv_ctx:
dev_err(sst_drv_ctx->dev, "Probe failed with %d\n", ret);