On Wed, 22 Jul 2020 10:22:01 +0300 Alexandru Ardelean <alexandru.ardelean@xxxxxxxxxx> wrote: > The driver pretty much uses device managed functions. The only left-over is > the iio_device_register() function, which also requires an action-or-reset > hook to disable the regulator on the remove and error path. > > Signed-off-by: Alexandru Ardelean <alexandru.ardelean@xxxxxxxxxx> Applied. Thanks, Jonathan > --- > > Changelog v1 -> v2: > * removed 'probed' message at the end of probe; mostly log spam > > drivers/iio/frequency/ad9523.c | 60 ++++++++++++---------------------- > 1 file changed, 20 insertions(+), 40 deletions(-) > > diff --git a/drivers/iio/frequency/ad9523.c b/drivers/iio/frequency/ad9523.c > index 334e1d779d6d..bdb0bc3b12dd 100644 > --- a/drivers/iio/frequency/ad9523.c > +++ b/drivers/iio/frequency/ad9523.c > @@ -969,6 +969,13 @@ static int ad9523_setup(struct iio_dev *indio_dev) > return 0; > } > > +static void ad9523_reg_disable(void *data) > +{ > + struct regulator *reg = data; > + > + regulator_disable(reg); > +} > + > static int ad9523_probe(struct spi_device *spi) > { > struct ad9523_platform_data *pdata = spi->dev.platform_data; > @@ -994,21 +1001,22 @@ static int ad9523_probe(struct spi_device *spi) > ret = regulator_enable(st->reg); > if (ret) > return ret; > + > + ret = devm_add_action_or_reset(&spi->dev, ad9523_reg_disable, > + st->reg); > + if (ret) > + return ret; > } > > st->pwrdown_gpio = devm_gpiod_get_optional(&spi->dev, "powerdown", > GPIOD_OUT_HIGH); > - if (IS_ERR(st->pwrdown_gpio)) { > - ret = PTR_ERR(st->pwrdown_gpio); > - goto error_disable_reg; > - } > + if (IS_ERR(st->pwrdown_gpio)) > + return PTR_ERR(st->pwrdown_gpio); > > st->reset_gpio = devm_gpiod_get_optional(&spi->dev, "reset", > GPIOD_OUT_LOW); > - if (IS_ERR(st->reset_gpio)) { > - ret = PTR_ERR(st->reset_gpio); > - goto error_disable_reg; > - } > + if (IS_ERR(st->reset_gpio)) > + return PTR_ERR(st->reset_gpio); > > if (st->reset_gpio) { > udelay(1); > @@ -1017,10 +1025,8 @@ static int ad9523_probe(struct spi_device *spi) > > st->sync_gpio = devm_gpiod_get_optional(&spi->dev, "sync", > GPIOD_OUT_HIGH); > - if (IS_ERR(st->sync_gpio)) { > - ret = PTR_ERR(st->sync_gpio); > - goto error_disable_reg; > - } > + if (IS_ERR(st->sync_gpio)) > + return PTR_ERR(st->sync_gpio); > > spi_set_drvdata(spi, indio_dev); > st->spi = spi; > @@ -1035,34 +1041,9 @@ static int ad9523_probe(struct spi_device *spi) > > ret = ad9523_setup(indio_dev); > if (ret < 0) > - goto error_disable_reg; > - > - ret = iio_device_register(indio_dev); > - if (ret) > - goto error_disable_reg; > - > - dev_info(&spi->dev, "probed %s\n", indio_dev->name); > - > - return 0; > - > -error_disable_reg: > - if (!IS_ERR(st->reg)) > - regulator_disable(st->reg); > - > - return ret; > -} > - > -static int ad9523_remove(struct spi_device *spi) > -{ > - struct iio_dev *indio_dev = spi_get_drvdata(spi); > - struct ad9523_state *st = iio_priv(indio_dev); > - > - iio_device_unregister(indio_dev); > - > - if (!IS_ERR(st->reg)) > - regulator_disable(st->reg); > + return ret; > > - return 0; > + return devm_iio_device_register(&spi->dev, indio_dev); > } > > static const struct spi_device_id ad9523_id[] = { > @@ -1076,7 +1057,6 @@ static struct spi_driver ad9523_driver = { > .name = "ad9523", > }, > .probe = ad9523_probe, > - .remove = ad9523_remove, > .id_table = ad9523_id, > }; > module_spi_driver(ad9523_driver);