ASoC: Intel: Skylake: Fix to free dsp resource on ipc_init failure
authorSubhransu S. Prusty <subhransu.s.prusty@intel.com>
Tue, 22 Aug 2017 11:15:50 +0000 (16:45 +0530)
committerMark Brown <broonie@kernel.org>
Wed, 23 Aug 2017 10:55:07 +0000 (11:55 +0100)
For some dsp init error path, irq and few more resources are not freed.
This results in oops. So, fix it by freeing up the resources on ipc_init
failure.

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/bxt-sst.c
sound/soc/intel/skylake/cnl-sst.c
sound/soc/intel/skylake/skl-sst.c

index 5e1ac99ffa8b959f04e62a70f72094c152c06b7b..4524211960e4a4a5941f08a8a2066096e471cf6f 100644 (file)
@@ -582,8 +582,10 @@ int bxt_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
                        SKL_ADSP_W0_UP_SZ, BXT_ADSP_SRAM1_BASE, SKL_ADSP_W1_SZ);
 
        ret = skl_ipc_init(dev, skl);
-       if (ret)
+       if (ret) {
+               skl_dsp_free(sst);
                return ret;
+       }
 
        /* set the D0i3 check */
        skl->ipc.ops.check_dsp_lp_on = skl_ipc_check_D0i0;
index 48ef04d5da893e6ecdae4025cf09ae111a58bb2b..387de388ce29405be5ad10875cb66a17adf39f55 100644 (file)
@@ -450,8 +450,10 @@ int cnl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
                             CNL_ADSP_W1_SZ);
 
        ret = cnl_ipc_init(dev, cnl);
-       if (ret)
+       if (ret) {
+               skl_dsp_free(sst);
                return ret;
+       }
 
        cnl->boot_complete = false;
        init_waitqueue_head(&cnl->boot_wait);
index a7ad734f591d5ea5d483009e8318bd7a0b32a309..a436abf2fe3f38b65e93f9637de0f804b859a2aa 100644 (file)
@@ -562,8 +562,10 @@ int skl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
                        SKL_ADSP_W0_UP_SZ, SKL_ADSP_SRAM1_BASE, SKL_ADSP_W1_SZ);
 
        ret = skl_ipc_init(dev, skl);
-       if (ret)
+       if (ret) {
+               skl_dsp_free(sst);
                return ret;
+       }
 
        sst->fw_ops = skl_fw_ops;