aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc
diff options
context:
space:
mode:
authorSubhransu S. Prusty <subhransu.s.prusty@intel.com>2017-08-22 16:45:51 +0530
committerMark Brown <broonie@kernel.org>2017-08-23 11:55:11 +0100
commitf77d443c4c299aff5ad9c74811dd063f4d8bebcf (patch)
tree71587209e85a4faa3722486c3656f7a6e5814a5b /sound/soc
parentASoC: Intel: Skylake: Fix to free dsp resource on ipc_init failure (diff)
downloadlinux-dev-f77d443c4c299aff5ad9c74811dd063f4d8bebcf.tar.xz
linux-dev-f77d443c4c299aff5ad9c74811dd063f4d8bebcf.zip
ASoC: Intel: Skylake: Fix to free resources for dsp_init failure
unmap mmio and free memory resources if dsp_init fails. Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com> Acked-By: Vinod Koul <vinod.koul@intel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound/soc')
-rw-r--r--sound/soc/intel/skylake/skl-messages.c26
1 files changed, 19 insertions, 7 deletions
diff --git a/sound/soc/intel/skylake/skl-messages.c b/sound/soc/intel/skylake/skl-messages.c
index bfb3332a77ca..f0f11f597b21 100644
--- a/sound/soc/intel/skylake/skl-messages.c
+++ b/sound/soc/intel/skylake/skl-messages.c
@@ -277,8 +277,10 @@ int skl_init_dsp(struct skl *skl)
}
ops = skl_get_dsp_ops(skl->pci->device);
- if (!ops)
- return -EIO;
+ if (!ops) {
+ goto unmap_mmio;
+ ret = -EIO;
+ }
loader_ops = ops->loader_ops();
ret = ops->init(bus->dev, mmio_base, irq,
@@ -286,25 +288,35 @@ int skl_init_dsp(struct skl *skl)
&skl->skl_sst);
if (ret < 0)
- return ret;
+ goto unmap_mmio;
skl->skl_sst->dsp_ops = ops;
cores = &skl->skl_sst->cores;
cores->count = ops->num_cores;
cores->state = kcalloc(cores->count, sizeof(*cores->state), GFP_KERNEL);
- if (!cores->state)
- return -ENOMEM;
+ if (!cores->state) {
+ ret = -ENOMEM;
+ goto unmap_mmio;
+ }
cores->usage_count = kcalloc(cores->count, sizeof(*cores->usage_count),
GFP_KERNEL);
if (!cores->usage_count) {
- kfree(cores->state);
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto free_core_state;
}
dev_dbg(bus->dev, "dsp registration status=%d\n", ret);
+ return 0;
+
+free_core_state:
+ kfree(cores->state);
+
+unmap_mmio:
+ iounmap(mmio_base);
+
return ret;
}