ASoC: stm32: i2s: improve error management on probe deferral
[linux-2.6-microblaze.git] / sound / soc / stm / stm32_i2s.c
index 3e7226a..2478405 100644 (file)
@@ -831,25 +831,33 @@ static int stm32_i2s_parse_dt(struct platform_device *pdev,
        /* Get clocks */
        i2s->pclk = devm_clk_get(&pdev->dev, "pclk");
        if (IS_ERR(i2s->pclk)) {
-               dev_err(&pdev->dev, "Could not get pclk\n");
+               if (PTR_ERR(i2s->pclk) != -EPROBE_DEFER)
+                       dev_err(&pdev->dev, "Could not get pclk: %ld\n",
+                               PTR_ERR(i2s->pclk));
                return PTR_ERR(i2s->pclk);
        }
 
        i2s->i2sclk = devm_clk_get(&pdev->dev, "i2sclk");
        if (IS_ERR(i2s->i2sclk)) {
-               dev_err(&pdev->dev, "Could not get i2sclk\n");
+               if (PTR_ERR(i2s->i2sclk) != -EPROBE_DEFER)
+                       dev_err(&pdev->dev, "Could not get i2sclk: %ld\n",
+                               PTR_ERR(i2s->i2sclk));
                return PTR_ERR(i2s->i2sclk);
        }
 
        i2s->x8kclk = devm_clk_get(&pdev->dev, "x8k");
        if (IS_ERR(i2s->x8kclk)) {
-               dev_err(&pdev->dev, "missing x8k parent clock\n");
+               if (PTR_ERR(i2s->x8kclk) != -EPROBE_DEFER)
+                       dev_err(&pdev->dev, "Could not get x8k parent clock: %ld\n",
+                               PTR_ERR(i2s->x8kclk));
                return PTR_ERR(i2s->x8kclk);
        }
 
        i2s->x11kclk = devm_clk_get(&pdev->dev, "x11k");
        if (IS_ERR(i2s->x11kclk)) {
-               dev_err(&pdev->dev, "missing x11k parent clock\n");
+               if (PTR_ERR(i2s->x11kclk) != -EPROBE_DEFER)
+                       dev_err(&pdev->dev, "Could not get x11k parent clock: %ld\n",
+                               PTR_ERR(i2s->x11kclk));
                return PTR_ERR(i2s->x11kclk);
        }
 
@@ -866,12 +874,16 @@ static int stm32_i2s_parse_dt(struct platform_device *pdev,
        }
 
        /* Reset */
-       rst = devm_reset_control_get_exclusive(&pdev->dev, NULL);
-       if (!IS_ERR(rst)) {
-               reset_control_assert(rst);
-               udelay(2);
-               reset_control_deassert(rst);
+       rst = devm_reset_control_get_optional_exclusive(&pdev->dev, NULL);
+       if (IS_ERR(rst)) {
+               if (PTR_ERR(rst) != -EPROBE_DEFER)
+                       dev_err(&pdev->dev, "Reset controller error %ld\n",
+                               PTR_ERR(rst));
+               return PTR_ERR(rst);
        }
+       reset_control_assert(rst);
+       udelay(2);
+       reset_control_deassert(rst);
 
        return 0;
 }
@@ -903,7 +915,9 @@ static int stm32_i2s_probe(struct platform_device *pdev)
        i2s->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "pclk",
                                                i2s->base, i2s->regmap_conf);
        if (IS_ERR(i2s->regmap)) {
-               dev_err(&pdev->dev, "regmap init failed\n");
+               if (PTR_ERR(i2s->regmap) != -EPROBE_DEFER)
+                       dev_err(&pdev->dev, "Regmap init error %ld\n",
+                               PTR_ERR(i2s->regmap));
                return PTR_ERR(i2s->regmap);
        }
 
@@ -914,8 +928,11 @@ static int stm32_i2s_probe(struct platform_device *pdev)
 
        ret = devm_snd_dmaengine_pcm_register(&pdev->dev,
                                              &stm32_i2s_pcm_config, 0);
-       if (ret)
+       if (ret) {
+               if (ret != -EPROBE_DEFER)
+                       dev_err(&pdev->dev, "PCM DMA register error %d\n", ret);
                return ret;
+       }
 
        /* Set SPI/I2S in i2s mode */
        ret = regmap_update_bits(i2s->regmap, STM32_I2S_CGFR_REG,