From: Fabrice Gasnier <fabrice.gasn...@st.com>

commit 7685010fca2ba0284f31fd1380df3cffc96d847e upstream.

Add missing vdda-supply, analog power supply, to STM32 ADC. When vdda is
an independent supply, it needs to be properly turned on or off to supply
the ADC.

Signed-off-by: Fabrice Gasnier <fabrice.gasn...@st.com>
Fixes: 1add69880240 ("iio: adc: Add support for STM32 ADC core").
Cc: <sta...@vger.kernel.org>
Signed-off-by: Jonathan Cameron <jonathan.came...@huawei.com>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 drivers/iio/adc/stm32-adc-core.c |   21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

--- a/drivers/iio/adc/stm32-adc-core.c
+++ b/drivers/iio/adc/stm32-adc-core.c
@@ -87,6 +87,7 @@ struct stm32_adc_priv_cfg {
  * @domain:            irq domain reference
  * @aclk:              clock reference for the analog circuitry
  * @bclk:              bus clock common for all ADCs, depends on part used
+ * @vdda:              vdda analog supply reference
  * @vref:              regulator reference
  * @cfg:               compatible configuration data
  * @common:            common data for all ADC instances
@@ -97,6 +98,7 @@ struct stm32_adc_priv {
        struct irq_domain               *domain;
        struct clk                      *aclk;
        struct clk                      *bclk;
+       struct regulator                *vdda;
        struct regulator                *vref;
        const struct stm32_adc_priv_cfg *cfg;
        struct stm32_adc_common         common;
@@ -394,10 +396,16 @@ static int stm32_adc_core_hw_start(struc
        struct stm32_adc_priv *priv = to_stm32_adc_priv(common);
        int ret;
 
+       ret = regulator_enable(priv->vdda);
+       if (ret < 0) {
+               dev_err(dev, "vdda enable failed %d\n", ret);
+               return ret;
+       }
+
        ret = regulator_enable(priv->vref);
        if (ret < 0) {
                dev_err(dev, "vref enable failed\n");
-               return ret;
+               goto err_vdda_disable;
        }
 
        if (priv->bclk) {
@@ -425,6 +433,8 @@ err_bclk_disable:
                clk_disable_unprepare(priv->bclk);
 err_regulator_disable:
        regulator_disable(priv->vref);
+err_vdda_disable:
+       regulator_disable(priv->vdda);
 
        return ret;
 }
@@ -441,6 +451,7 @@ static void stm32_adc_core_hw_stop(struc
        if (priv->bclk)
                clk_disable_unprepare(priv->bclk);
        regulator_disable(priv->vref);
+       regulator_disable(priv->vdda);
 }
 
 static int stm32_adc_probe(struct platform_device *pdev)
@@ -468,6 +479,14 @@ static int stm32_adc_probe(struct platfo
                return PTR_ERR(priv->common.base);
        priv->common.phys_base = res->start;
 
+       priv->vdda = devm_regulator_get(&pdev->dev, "vdda");
+       if (IS_ERR(priv->vdda)) {
+               ret = PTR_ERR(priv->vdda);
+               if (ret != -EPROBE_DEFER)
+                       dev_err(&pdev->dev, "vdda get failed, %d\n", ret);
+               return ret;
+       }
+
        priv->vref = devm_regulator_get(&pdev->dev, "vref");
        if (IS_ERR(priv->vref)) {
                ret = PTR_ERR(priv->vref);


Reply via email to