staging: iio: ad7606: rework regulator handling
authorEva Rachel Retuya <[email protected]>
Thu, 20 Oct 2016 13:08:23 +0000 (21:08 +0800)
committerJonathan Cameron <[email protected]>
Sun, 23 Oct 2016 18:34:19 +0000 (19:34 +0100)
Currently, this driver ignores all errors from regulator_get(). The way
it is now, it also breaks probe deferral (EPROBE_DEFER). The correct
behavior is to propagate the error to the upper layers so they can
handle it accordingly.

Rework the regulator handling so that it matches the standard behavior.
If the specific design uses a static always-on regulator and does not
explicitly specify it, regulator_get() will return the dummy regulator.

Suggested-by: Lars-Peter Clausen <[email protected]>
Signed-off-by: Eva Rachel Retuya <[email protected]>
Acked-by: Lars-Peter Clausen <[email protected]>
Signed-off-by: Jonathan Cameron <[email protected]>
drivers/staging/iio/adc/ad7606.c

index f9b354ff820a9502857635148b333837fed39d2b..b0ae04a449eaf92fda0f568803534b247af3e71f 100644 (file)
@@ -425,10 +425,13 @@ int ad7606_probe(struct device *dev, int irq, void __iomem *base_address,
        INIT_WORK(&st->poll_work, &ad7606_poll_bh_to_ring);
 
        st->reg = devm_regulator_get(dev, "avcc");
-       if (!IS_ERR(st->reg)) {
-               ret = regulator_enable(st->reg);
-               if (ret)
-                       return ret;
+       if (IS_ERR(st->reg))
+               return PTR_ERR(st->reg);
+
+       ret = regulator_enable(st->reg);
+       if (ret) {
+               dev_err(dev, "Failed to enable specified AVcc supply\n");
+               return ret;
        }
 
        ret = ad7606_request_gpios(st);
@@ -484,8 +487,7 @@ error_free_irq:
        free_irq(irq, indio_dev);
 
 error_disable_reg:
-       if (!IS_ERR(st->reg))
-               regulator_disable(st->reg);
+       regulator_disable(st->reg);
        return ret;
 }
 EXPORT_SYMBOL_GPL(ad7606_probe);
@@ -499,8 +501,7 @@ int ad7606_remove(struct device *dev, int irq)
        iio_triggered_buffer_cleanup(indio_dev);
 
        free_irq(irq, indio_dev);
-       if (!IS_ERR(st->reg))
-               regulator_disable(st->reg);
+       regulator_disable(st->reg);
 
        return 0;
 }