Merge remote-tracking branches 'asoc/topic/tlv320aic3x', 'asoc/topic/width', 'asoc...
[firefly-linux-kernel-4.4.55.git] / sound / soc / codecs / sgtl5000.c
index a0e1f9c67ab288a998301ef99e91a766680a7fcd..e997d271728d4943c1ffa63d59f7930ef2b59e65 100644 (file)
@@ -843,10 +843,8 @@ static int ldo_regulator_register(struct snd_soc_codec *codec,
 
        ldo = kzalloc(sizeof(struct ldo_regulator), GFP_KERNEL);
 
-       if (!ldo) {
-               dev_err(codec->dev, "failed to allocate ldo_regulator\n");
+       if (!ldo)
                return -ENOMEM;
-       }
 
        ldo->desc.name = kstrdup(dev_name(codec->dev), GFP_KERNEL);
        if (!ldo->desc.name) {
@@ -1277,7 +1275,7 @@ static int sgtl5000_enable_regulators(struct snd_soc_codec *codec)
                        return ret;
        }
 
-       ret = devm_regulator_bulk_get(codec->dev, ARRAY_SIZE(sgtl5000->supplies),
+       ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(sgtl5000->supplies),
                                 sgtl5000->supplies);
        if (ret)
                goto err_ldo_remove;
@@ -1285,13 +1283,16 @@ static int sgtl5000_enable_regulators(struct snd_soc_codec *codec)
        ret = regulator_bulk_enable(ARRAY_SIZE(sgtl5000->supplies),
                                        sgtl5000->supplies);
        if (ret)
-               goto err_ldo_remove;
+               goto err_regulator_free;
 
        /* wait for all power rails bring up */
        udelay(10);
 
        return 0;
 
+err_regulator_free:
+       regulator_bulk_free(ARRAY_SIZE(sgtl5000->supplies),
+                               sgtl5000->supplies);
 err_ldo_remove:
        if (!external_vddd)
                ldo_regulator_remove(codec);
@@ -1361,6 +1362,8 @@ static int sgtl5000_probe(struct snd_soc_codec *codec)
 err:
        regulator_bulk_disable(ARRAY_SIZE(sgtl5000->supplies),
                                                sgtl5000->supplies);
+       regulator_bulk_free(ARRAY_SIZE(sgtl5000->supplies),
+                               sgtl5000->supplies);
        ldo_regulator_remove(codec);
 
        return ret;
@@ -1374,6 +1377,8 @@ static int sgtl5000_remove(struct snd_soc_codec *codec)
 
        regulator_bulk_disable(ARRAY_SIZE(sgtl5000->supplies),
                                                sgtl5000->supplies);
+       regulator_bulk_free(ARRAY_SIZE(sgtl5000->supplies),
+                               sgtl5000->supplies);
        ldo_regulator_remove(codec);
 
        return 0;