ASoC: fsl_esai: Check the return value from clk_prepare_enable()
authorFabio Estevam <fabio.estevam@freescale.com>
Mon, 10 Feb 2014 18:01:28 +0000 (16:01 -0200)
committerMark Brown <broonie@linaro.org>
Tue, 11 Feb 2014 12:54:28 +0000 (12:54 +0000)
clk_prepare_enable() may fail, so let's check its return value and propagate it
in the case of error.

Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
sound/soc/fsl/fsl_esai.c

index d0c72ed..f55341e 100644 (file)
@@ -431,17 +431,26 @@ static int fsl_esai_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
 static int fsl_esai_startup(struct snd_pcm_substream *substream,
                            struct snd_soc_dai *dai)
 {
+       int ret;
        struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai);
 
        /*
         * Some platforms might use the same bit to gate all three or two of
         * clocks, so keep all clocks open/close at the same time for safety
         */
-       clk_prepare_enable(esai_priv->coreclk);
-       if (!IS_ERR(esai_priv->extalclk))
-               clk_prepare_enable(esai_priv->extalclk);
-       if (!IS_ERR(esai_priv->fsysclk))
-               clk_prepare_enable(esai_priv->fsysclk);
+       ret = clk_prepare_enable(esai_priv->coreclk);
+       if (ret)
+               return ret;
+       if (!IS_ERR(esai_priv->extalclk)) {
+               ret = clk_prepare_enable(esai_priv->extalclk);
+               if (ret)
+                       goto err_extalck;
+       }
+       if (!IS_ERR(esai_priv->fsysclk)) {
+               ret = clk_prepare_enable(esai_priv->fsysclk);
+               if (ret)
+                       goto err_fsysclk;
+       }
 
        if (!dai->active) {
                /* Reset Port C */
@@ -463,6 +472,14 @@ static int fsl_esai_startup(struct snd_pcm_substream *substream,
        }
 
        return 0;
+
+err_fsysclk:
+       if (!IS_ERR(esai_priv->extalclk))
+               clk_disable_unprepare(esai_priv->extalclk);
+err_extalck:
+       clk_disable_unprepare(esai_priv->coreclk);
+
+       return ret;
 }
 
 static int fsl_esai_hw_params(struct snd_pcm_substream *substream,