ASoC: samsung: i2s: Handle return value of clk_prepare_enable.
authorArvind Yadav <arvind.yadav.cs@gmail.com>
Tue, 25 Jul 2017 10:14:31 +0000 (15:44 +0530)
committerMark Brown <broonie@kernel.org>
Wed, 26 Jul 2017 12:00:27 +0000 (13:00 +0100)
clk_prepare_enable() can fail here and we must check its return value.

Signed-off-by: Arvind Yadav <arvind.yadav.cs@gmail.com>
Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/samsung/i2s.c

index c9f87f7bae9925a9d1db14b9648f2779e205af46..daf7b892c9675fac17f96c6063eb53c1d2a6cc69 100644 (file)
@@ -551,7 +551,9 @@ static int i2s_set_sysclk(struct snd_soc_dai *dai,
                                goto err;
                        }
 
-                       clk_prepare_enable(i2s->op_clk);
+                       ret = clk_prepare_enable(i2s->op_clk);
+                       if (ret)
+                               goto err;
                        i2s->rclk_srcrate = clk_get_rate(i2s->op_clk);
 
                        /* Over-ride the other's */
@@ -1133,10 +1135,19 @@ static int i2s_runtime_suspend(struct device *dev)
 static int i2s_runtime_resume(struct device *dev)
 {
        struct i2s_dai *i2s = dev_get_drvdata(dev);
+       int ret;
 
-       clk_prepare_enable(i2s->clk);
-       if (i2s->op_clk)
-               clk_prepare_enable(i2s->op_clk);
+       ret = clk_prepare_enable(i2s->clk);
+       if (ret)
+               return ret;
+
+       if (i2s->op_clk) {
+               ret = clk_prepare_enable(i2s->op_clk);
+               if (ret) {
+                       clk_disable_unprepare(i2s->clk);
+                       return ret;
+               }
+       }
 
        writel(i2s->suspend_i2scon, i2s->addr + I2SCON);
        writel(i2s->suspend_i2smod, i2s->addr + I2SMOD);