ASoC: Fix WM8960 leaks on probe failure
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Sun, 5 Jul 2009 14:47:03 +0000 (15:47 +0100)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Sun, 5 Jul 2009 14:47:03 +0000 (15:47 +0100)
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/codecs/wm8960.c

index b7894d6dffc0925dfc0f6a76b7877539a5691622..d1769e6c0c4462c5404a68f336d9eb73ab4894d5 100644 (file)
@@ -810,7 +810,8 @@ static int wm8960_register(struct wm8960_priv *wm8960)
 
        if (wm8960_codec) {
                dev_err(codec->dev, "Another WM8960 is registered\n");
-               return -EINVAL;
+               ret = -EINVAL;
+               goto err;
        }
 
        if (!pdata) {
@@ -843,7 +844,7 @@ static int wm8960_register(struct wm8960_priv *wm8960)
        ret = wm8960_reset(codec);
        if (ret < 0) {
                dev_err(codec->dev, "Failed to issue reset\n");
-               return ret;
+               goto err;
        }
 
        wm8960_dai.dev = codec->dev;
@@ -877,17 +878,22 @@ static int wm8960_register(struct wm8960_priv *wm8960)
        ret = snd_soc_register_codec(codec);
        if (ret != 0) {
                dev_err(codec->dev, "Failed to register codec: %d\n", ret);
-               return ret;
+               goto err;
        }
 
        ret = snd_soc_register_dai(&wm8960_dai);
        if (ret != 0) {
                dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
-               snd_soc_unregister_codec(codec);
-               return ret;
+               goto err_codec;
        }
 
        return 0;
+
+err_codec:
+       snd_soc_unregister_codec(codec);
+err:
+       kfree(wm8960);
+       return ret;
 }
 
 static void wm8960_unregister(struct wm8960_priv *wm8960)