mirror of
https://github.com/torvalds/linux.git
synced 2024-10-23 13:40:56 +00:00
iio: adc: rockchip_saradc: do not use internal iio_dev lock
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á <nuno.sa@analog.com> Acked-by: Heiko Stuebner <heiko@sntech.de> Link: https://lore.kernel.org/r/20221004134909.1692021-8-nuno.sa@analog.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
d0c09264f1
commit
bb690935df
|
@ -5,6 +5,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/mutex.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
@ -49,6 +50,8 @@ struct rockchip_saradc {
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
struct completion completion;
|
struct completion completion;
|
||||||
struct regulator *vref;
|
struct regulator *vref;
|
||||||
|
/* lock to protect against multiple access to the device */
|
||||||
|
struct mutex lock;
|
||||||
int uv_vref;
|
int uv_vref;
|
||||||
struct reset_control *reset;
|
struct reset_control *reset;
|
||||||
const struct rockchip_saradc_data *data;
|
const struct rockchip_saradc_data *data;
|
||||||
|
@ -94,17 +97,17 @@ static int rockchip_saradc_read_raw(struct iio_dev *indio_dev,
|
||||||
|
|
||||||
switch (mask) {
|
switch (mask) {
|
||||||
case IIO_CHAN_INFO_RAW:
|
case IIO_CHAN_INFO_RAW:
|
||||||
mutex_lock(&indio_dev->mlock);
|
mutex_lock(&info->lock);
|
||||||
|
|
||||||
ret = rockchip_saradc_conversion(info, chan);
|
ret = rockchip_saradc_conversion(info, chan);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
rockchip_saradc_power_down(info);
|
rockchip_saradc_power_down(info);
|
||||||
mutex_unlock(&indio_dev->mlock);
|
mutex_unlock(&info->lock);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
*val = info->last_val;
|
*val = info->last_val;
|
||||||
mutex_unlock(&indio_dev->mlock);
|
mutex_unlock(&info->lock);
|
||||||
return IIO_VAL_INT;
|
return IIO_VAL_INT;
|
||||||
case IIO_CHAN_INFO_SCALE:
|
case IIO_CHAN_INFO_SCALE:
|
||||||
*val = info->uv_vref / 1000;
|
*val = info->uv_vref / 1000;
|
||||||
|
@ -270,7 +273,7 @@ static irqreturn_t rockchip_saradc_trigger_handler(int irq, void *p)
|
||||||
int ret;
|
int ret;
|
||||||
int i, j = 0;
|
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) {
|
for_each_set_bit(i, i_dev->active_scan_mask, i_dev->masklength) {
|
||||||
const struct iio_chan_spec *chan = &i_dev->channels[i];
|
const struct iio_chan_spec *chan = &i_dev->channels[i];
|
||||||
|
@ -287,7 +290,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));
|
iio_push_to_buffers_with_timestamp(i_dev, &data, iio_get_time_ns(i_dev));
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&i_dev->mlock);
|
mutex_unlock(&info->lock);
|
||||||
|
|
||||||
iio_trigger_notify_done(i_dev->trig);
|
iio_trigger_notify_done(i_dev->trig);
|
||||||
|
|
||||||
|
@ -478,6 +481,8 @@ static int rockchip_saradc_probe(struct platform_device *pdev)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
mutex_init(&info->lock);
|
||||||
|
|
||||||
return devm_iio_device_register(&pdev->dev, indio_dev);
|
return devm_iio_device_register(&pdev->dev, indio_dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user