OSDN Git Service

ASoC: Intel: Skylake: Fix to free resources for dsp_init failure
authorSubhransu S. Prusty <subhransu.s.prusty@intel.com>
Tue, 22 Aug 2017 11:15:51 +0000 (16:45 +0530)
committerMark Brown <broonie@kernel.org>
Wed, 23 Aug 2017 10:55:11 +0000 (11:55 +0100)
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>
sound/soc/intel/skylake/skl-messages.c

index bfb3332..f0f11f5 100644 (file)
@@ -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;
 }