From 1341bf639b28ddc6d1dc9bf5ffb4a064e4e2ddd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20S=C3=A1?= Date: Tue, 4 Oct 2022 15:49:00 +0200 Subject: [PATCH] BACKPORT: iio: adc: rockchip_saradc: do not use internal iio_dev lock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The iio_device lock is only meant for internal use. Hence define a device local lock to protect against concurrent accesses. While at it, properly include "mutex.h" for mutex related APIs. Signed-off-by: Nuno Sá Acked-by: Heiko Stuebner Link: https://lore.kernel.org/r/20221004134909.1692021-8-nuno.sa@analog.com Signed-off-by: Jonathan Cameron Signed-off-by: Simon Xue (cherry picked from commit bb690935df8dd8f97612b422c669bd1a5fe87096) Change-Id: If04914774fec56645b1eb9bbb82d504fdd44779f --- drivers/iio/adc/rockchip_saradc.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/drivers/iio/adc/rockchip_saradc.c b/drivers/iio/adc/rockchip_saradc.c index 4fb68c1143e6..4aa7afcd94ee 100644 --- a/drivers/iio/adc/rockchip_saradc.c +++ b/drivers/iio/adc/rockchip_saradc.c @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -68,6 +69,8 @@ struct rockchip_saradc { struct clk *clk; struct completion completion; struct regulator *vref; + /* lock to protect against multiple access to the device */ + struct mutex lock; int uv_vref; struct reset_control *reset; const struct rockchip_saradc_data *data; @@ -189,22 +192,22 @@ static int rockchip_saradc_read_raw(struct iio_dev *indio_dev, #endif switch (mask) { case IIO_CHAN_INFO_RAW: - mutex_lock(&indio_dev->mlock); + mutex_lock(&info->lock); if (info->suspended) { - mutex_unlock(&indio_dev->mlock); + mutex_unlock(&info->lock); return -EBUSY; } ret = rockchip_saradc_conversion(info, chan); if (ret) { rockchip_saradc_power_down(info); - mutex_unlock(&indio_dev->mlock); + mutex_unlock(&info->lock); return ret; } *val = info->last_val; - mutex_unlock(&indio_dev->mlock); + mutex_unlock(&info->lock); return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE: /* It is a dummy regulator */ @@ -476,7 +479,7 @@ static irqreturn_t rockchip_saradc_trigger_handler(int irq, void *p) int ret; int i, j = 0; - mutex_lock(&i_dev->mlock); + mutex_lock(&info->lock); for_each_set_bit(i, i_dev->active_scan_mask, i_dev->masklength) { const struct iio_chan_spec *chan = &i_dev->channels[i]; @@ -493,7 +496,7 @@ static irqreturn_t rockchip_saradc_trigger_handler(int irq, void *p) iio_push_to_buffers_with_timestamp(i_dev, &data, iio_get_time_ns(i_dev)); out: - mutex_unlock(&i_dev->mlock); + mutex_unlock(&info->lock); iio_trigger_notify_done(i_dev->trig); @@ -784,6 +787,8 @@ static int rockchip_saradc_probe(struct platform_device *pdev) return ret; } #endif + mutex_init(&info->lock); + return devm_iio_device_register(&pdev->dev, indio_dev); } @@ -794,14 +799,14 @@ static int rockchip_saradc_suspend(struct device *dev) struct rockchip_saradc *info = iio_priv(indio_dev); /* Avoid reading saradc when suspending */ - mutex_lock(&indio_dev->mlock); + mutex_lock(&info->lock); clk_disable_unprepare(info->clk); clk_disable_unprepare(info->pclk); regulator_disable(info->vref); info->suspended = true; - mutex_unlock(&indio_dev->mlock); + mutex_unlock(&info->lock); return 0; }