ASoC: wm0010: fix memory leak
[sfrench/cifs-2.6.git] / sound / soc / codecs / wm0010.c
index 6560a66b3f3539ea79cfd8d9ef20f3825d2e03df..7a1bc40538ca5ad1c9c70e93f3c0d3fd362504c5 100644 (file)
@@ -577,7 +577,6 @@ static int wm0010_boot(struct snd_soc_codec *codec)
        struct wm0010_priv *wm0010 = snd_soc_codec_get_drvdata(codec);
        unsigned long flags;
        int ret;
-       const struct firmware *fw;
        struct spi_message m;
        struct spi_transfer t;
        struct dfw_pllrec pll_rec;
@@ -623,14 +622,6 @@ static int wm0010_boot(struct snd_soc_codec *codec)
        wm0010->state = WM0010_OUT_OF_RESET;
        spin_unlock_irqrestore(&wm0010->irq_lock, flags);
 
-       /* First the bootloader */
-       ret = request_firmware(&fw, "wm0010_stage2.bin", codec->dev);
-       if (ret != 0) {
-               dev_err(codec->dev, "Failed to request stage2 loader: %d\n",
-                       ret);
-               goto abort;
-       }
-
        if (!wait_for_completion_timeout(&wm0010->boot_completion,
                                         msecs_to_jiffies(20)))
                dev_err(codec->dev, "Failed to get interrupt from DSP\n");
@@ -672,8 +663,10 @@ static int wm0010_boot(struct snd_soc_codec *codec)
                }
 
                img_swap = kzalloc(len, GFP_KERNEL | GFP_DMA);
-               if (!img_swap)
+               if (!img_swap) {
+                       kfree(out);
                        goto abort;
+               }
 
                /* We need to re-order for 0010 */
                byte_swap_64((u64 *)&pll_rec, img_swap, len);
@@ -690,6 +683,8 @@ static int wm0010_boot(struct snd_soc_codec *codec)
                ret = spi_sync(spi, &m);
                if (ret != 0) {
                        dev_err(codec->dev, "First PLL write failed: %d\n", ret);
+                       kfree(img_swap);
+                       kfree(out);
                        goto abort;
                }
 
@@ -697,6 +692,8 @@ static int wm0010_boot(struct snd_soc_codec *codec)
                ret = spi_sync(spi, &m);
                if (ret != 0) {
                        dev_err(codec->dev, "Second PLL write failed: %d\n", ret);
+                       kfree(img_swap);
+                       kfree(out);
                        goto abort;
                }