On 17/03/16 11:55, Gregor Boirie wrote: > Ensure optional regulator is properly disabled when present. > > Fixes: 3145229f9191 ("iio:pressure:ms5611: power regulator support") > Signed-off-by: Gregor Boirie <gregor.boirie@xxxxxxxxxx> I've applied this to the togreg branch of iio.git. Decided to do this rather than fixes as the worst that happens is a regulator gets left on. As this support is relatively new and before that it always got left on, I'm not considering this to important. Feel free to argue otherwise! Jonathan > --- > drivers/iio/pressure/ms5611.h | 3 +++ > drivers/iio/pressure/ms5611_core.c | 41 +++++++++++++++++++++++++++++--------- > 2 files changed, 35 insertions(+), 9 deletions(-) > > diff --git a/drivers/iio/pressure/ms5611.h b/drivers/iio/pressure/ms5611.h > index d725a307..ccda63c 100644 > --- a/drivers/iio/pressure/ms5611.h > +++ b/drivers/iio/pressure/ms5611.h > @@ -16,6 +16,8 @@ > #include <linux/iio/iio.h> > #include <linux/mutex.h> > > +struct regulator; > + > #define MS5611_RESET 0x1e > #define MS5611_READ_ADC 0x00 > #define MS5611_READ_PROM_WORD 0xA0 > @@ -57,6 +59,7 @@ struct ms5611_state { > s32 *temp, s32 *pressure); > > struct ms5611_chip_info *chip_info; > + struct regulator *vdd; > }; > > int ms5611_probe(struct iio_dev *indio_dev, struct device *dev, > diff --git a/drivers/iio/pressure/ms5611_core.c b/drivers/iio/pressure/ms5611_core.c > index 37dbc04..c4e6586 100644 > --- a/drivers/iio/pressure/ms5611_core.c > +++ b/drivers/iio/pressure/ms5611_core.c > @@ -387,24 +387,45 @@ static const struct iio_info ms5611_info = { > static int ms5611_init(struct iio_dev *indio_dev) > { > int ret; > - struct regulator *vdd = devm_regulator_get(indio_dev->dev.parent, > - "vdd"); > + struct ms5611_state *st = iio_priv(indio_dev); > > /* Enable attached regulator if any. */ > - if (!IS_ERR(vdd)) { > - ret = regulator_enable(vdd); > + st->vdd = devm_regulator_get(indio_dev->dev.parent, "vdd"); > + if (!IS_ERR(st->vdd)) { > + ret = regulator_enable(st->vdd); > if (ret) { > dev_err(indio_dev->dev.parent, > - "failed to enable Vdd supply: %d\n", ret); > + "failed to enable Vdd supply: %d\n", ret); > return ret; > } > + } else { > + ret = PTR_ERR(st->vdd); > + if (ret != -ENODEV) > + return ret; > } > > ret = ms5611_reset(indio_dev); > if (ret < 0) > - return ret; > + goto err_regulator_disable; > + > + ret = ms5611_read_prom(indio_dev); > + if (ret < 0) > + goto err_regulator_disable; > + > + return 0; > > - return ms5611_read_prom(indio_dev); > +err_regulator_disable: > + if (!IS_ERR_OR_NULL(st->vdd)) > + regulator_disable(st->vdd); > + return ret; > +} > + > +static void ms5611_fini(const struct iio_dev *indio_dev) > +{ > + const struct ms5611_state *st = iio_priv(indio_dev); > + > + if (!IS_ERR_OR_NULL(st->vdd)) > + regulator_disable(st->vdd); > } > > int ms5611_probe(struct iio_dev *indio_dev, struct device *dev, > @@ -436,7 +457,7 @@ int ms5611_probe(struct iio_dev *indio_dev, struct device *dev, > ms5611_trigger_handler, NULL); > if (ret < 0) { > dev_err(dev, "iio triggered buffer setup failed\n"); > - return ret; > + goto err_fini; > } > > ret = iio_device_register(indio_dev); > @@ -449,7 +470,8 @@ int ms5611_probe(struct iio_dev *indio_dev, struct device *dev, > > err_buffer_cleanup: > iio_triggered_buffer_cleanup(indio_dev); > - > +err_fini: > + ms5611_fini(indio_dev); > return ret; > } > EXPORT_SYMBOL(ms5611_probe); > @@ -458,6 +480,7 @@ int ms5611_remove(struct iio_dev *indio_dev) > { > iio_device_unregister(indio_dev); > iio_triggered_buffer_cleanup(indio_dev); > + ms5611_fini(indio_dev); > > return 0; > } > -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html