Commit dc0ba516 authored by Jonathan Cameron's avatar Jonathan Cameron

iio: adc: cc10001: Add devm_add_action_or_reset() to disable regulator.

As the voltage of this regulator is queried, we cannot use the
devm_regulator_get_enable() call and have to role our own disable.
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: default avatarNuno Sá <nuno.sa@analog.com>
Link: https://lore.kernel.org/r/20221016170950.387751-3-jic23@kernel.org
parent 26bfb581
...@@ -305,6 +305,11 @@ static int cc10001_adc_channel_init(struct iio_dev *indio_dev, ...@@ -305,6 +305,11 @@ static int cc10001_adc_channel_init(struct iio_dev *indio_dev,
return 0; return 0;
} }
static void cc10001_reg_disable(void *priv)
{
regulator_disable(priv);
}
static int cc10001_adc_probe(struct platform_device *pdev) static int cc10001_adc_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
...@@ -335,27 +340,28 @@ static int cc10001_adc_probe(struct platform_device *pdev) ...@@ -335,27 +340,28 @@ static int cc10001_adc_probe(struct platform_device *pdev)
if (ret) if (ret)
return ret; return ret;
ret = devm_add_action_or_reset(dev, cc10001_reg_disable, adc_dev->reg);
if (ret)
return ret;
indio_dev->name = dev_name(dev); indio_dev->name = dev_name(dev);
indio_dev->info = &cc10001_adc_info; indio_dev->info = &cc10001_adc_info;
indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->modes = INDIO_DIRECT_MODE;
adc_dev->reg_base = devm_platform_ioremap_resource(pdev, 0); adc_dev->reg_base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(adc_dev->reg_base)) { if (IS_ERR(adc_dev->reg_base))
ret = PTR_ERR(adc_dev->reg_base); return PTR_ERR(adc_dev->reg_base);
goto err_disable_reg;
}
adc_dev->adc_clk = devm_clk_get(dev, "adc"); adc_dev->adc_clk = devm_clk_get(dev, "adc");
if (IS_ERR(adc_dev->adc_clk)) { if (IS_ERR(adc_dev->adc_clk)) {
dev_err(dev, "failed to get the clock\n"); dev_err(dev, "failed to get the clock\n");
ret = PTR_ERR(adc_dev->adc_clk); return PTR_ERR(adc_dev->adc_clk);
goto err_disable_reg;
} }
ret = clk_prepare_enable(adc_dev->adc_clk); ret = clk_prepare_enable(adc_dev->adc_clk);
if (ret) { if (ret) {
dev_err(dev, "failed to enable the clock\n"); dev_err(dev, "failed to enable the clock\n");
goto err_disable_reg; return ret;
} }
adc_clk_rate = clk_get_rate(adc_dev->adc_clk); adc_clk_rate = clk_get_rate(adc_dev->adc_clk);
...@@ -400,8 +406,6 @@ static int cc10001_adc_probe(struct platform_device *pdev) ...@@ -400,8 +406,6 @@ static int cc10001_adc_probe(struct platform_device *pdev)
iio_triggered_buffer_cleanup(indio_dev); iio_triggered_buffer_cleanup(indio_dev);
err_disable_clk: err_disable_clk:
clk_disable_unprepare(adc_dev->adc_clk); clk_disable_unprepare(adc_dev->adc_clk);
err_disable_reg:
regulator_disable(adc_dev->reg);
return ret; return ret;
} }
...@@ -414,7 +418,6 @@ static int cc10001_adc_remove(struct platform_device *pdev) ...@@ -414,7 +418,6 @@ static int cc10001_adc_remove(struct platform_device *pdev)
iio_device_unregister(indio_dev); iio_device_unregister(indio_dev);
iio_triggered_buffer_cleanup(indio_dev); iio_triggered_buffer_cleanup(indio_dev);
clk_disable_unprepare(adc_dev->adc_clk); clk_disable_unprepare(adc_dev->adc_clk);
regulator_disable(adc_dev->reg);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment