patch "iio: adc: ad7124: Fix missbalanced regulator enable / disable on" added to staging-linus
Subsystems (3)
This is a note to let you know that I've just added the patch titled
iio: adc: ad7124: Fix missbalanced regulator enable / disable on
to my staging git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
in the staging-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From 4573472315f0fa461330545ff2aa2f6da0b1ae76 Mon Sep 17 00:00:00 2001
From: Jonathan Cameron <[email protected]>
Date: Thu, 13 May 2021 15:07:41 +0300
Subject: iio: adc: ad7124: Fix missbalanced regulator enable / disable on
error.
If the devm_regulator_get() call succeeded but not the regulator_enable() then regulator_disable() would be called on a regulator that was not enabled.
Fix this by moving regulator enabling / disabling over to devm_ management via devm_add_action_or_reset.
Alexandru's sign-off here because he pulled Jonathan's patch into a larger set which Jonathan then applied.
--- drivers/iio/adc/ad7124.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-)
drivers/iio/adc/ad7124.c +13 -16
@@ -850,6 +850,11 @@ static int ad7124_setup(struct ad7124_state *st)return ret; } +static void ad7124_reg_disable (void *r) +{ +regulator_disable (r); +} +static int ad7124_probe (struct spi_device *spi) {const struct ad7124_chip_info *info;
@@ -895,17 +900,20 @@ static int ad7124_probe(struct spi_device *spi) ret =regulator_enable (st->vref[i]);if (ret)return ret; + + ret =devm_add_action_or_reset (&spi->dev, ad7124_reg_disable, + st->vref[i]); +if (ret) +return ret; } st->mclk =devm_clk_get (&spi->dev,"mclk" ); -if (IS_ERR (st->mclk)) { - ret =PTR_ERR (st->mclk); - goto error_regulator_disable; - } +if (IS_ERR (st->mclk)) +return PTR_ERR (st->mclk); ret =clk_prepare_enable (st->mclk);if (ret <0 ) - goto error_regulator_disable; +return ret; ret =ad7124_soft_reset (st);if (ret <0 )
@@ -935,11 +943,6 @@ static int ad7124_probe(struct spi_device *spi)ad_sd_cleanup_buffer_and_trigger (indio_dev); error_clk_disable_unprepare:clk_disable_unprepare (st->mclk); -error_regulator_disable: -for (i =ARRAY_SIZE (st->vref) -1 ; i >=0 ; i--) { -if (!IS_ERR_OR_NULL (st->vref[i])) -regulator_disable (st->vref[i]); - }return ret; }
@@ -948,17 +951,11 @@ static int ad7124_remove(struct spi_device *spi) {struct iio_dev *indio_dev =spi_get_drvdata (spi);struct ad7124_state *st =iio_priv (indio_dev); -int i;iio_device_unregister (indio_dev);ad_sd_cleanup_buffer_and_trigger (indio_dev);clk_disable_unprepare (st->mclk); -for (i =ARRAY_SIZE (st->vref) -1 ; i >=0 ; i--) { -if (!IS_ERR_OR_NULL (st->vref[i])) -regulator_disable (st->vref[i]); - } -return 0 ; }
Signature · 1 line
2.31.1