Message ID | 20220920112821.975359-6-nuno.sa@analog.com (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | Make 'mlock' really private | expand |
On Tue, 20 Sep 2022 13:28:11 +0200 Nuno Sá <nuno.sa@analog.com> wrote: > The iio_device lock is only meant for internal use. Hence define a > device local lock to protect against concurrent accesses. As with previous patch, mention the additional include cleanup. > > Signed-off-by: Nuno Sá <nuno.sa@analog.com> > --- > drivers/iio/adc/lpc32xx_adc.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/drivers/iio/adc/lpc32xx_adc.c b/drivers/iio/adc/lpc32xx_adc.c > index b56ce15255cf..4136cf536d58 100644 > --- a/drivers/iio/adc/lpc32xx_adc.c > +++ b/drivers/iio/adc/lpc32xx_adc.c > @@ -15,6 +15,7 @@ > #include <linux/io.h> > #include <linux/module.h> > #include <linux/mod_devicetable.h> > +#include <linux/mutex.h> > #include <linux/platform_device.h> > #include <linux/regulator/consumer.h> > > @@ -49,6 +50,8 @@ struct lpc32xx_adc_state { > struct clk *clk; > struct completion completion; > struct regulator *vref; > + /* lock to protect against multiple access to the device */ > + struct mutex lock; > > u32 value; > }; > @@ -64,10 +67,10 @@ static int lpc32xx_read_raw(struct iio_dev *indio_dev, > > switch (mask) { > case IIO_CHAN_INFO_RAW: > - mutex_lock(&indio_dev->mlock); > + mutex_lock(&st->lock); > ret = clk_prepare_enable(st->clk); > if (ret) { > - mutex_unlock(&indio_dev->mlock); > + mutex_unlock(&st->lock); > return ret; > } > /* Measurement setup */ > @@ -80,7 +83,7 @@ static int lpc32xx_read_raw(struct iio_dev *indio_dev, > wait_for_completion(&st->completion); /* set by ISR */ > clk_disable_unprepare(st->clk); > *val = st->value; > - mutex_unlock(&indio_dev->mlock); > + mutex_unlock(&st->lock); > > return IIO_VAL_INT; > > @@ -158,6 +161,7 @@ static int lpc32xx_adc_probe(struct platform_device *pdev) > return -ENOMEM; > > st = iio_priv(iodev); > + mutex_init(&st->lock); > > st->adc_base = devm_ioremap(&pdev->dev, res->start, > resource_size(res));
diff --git a/drivers/iio/adc/lpc32xx_adc.c b/drivers/iio/adc/lpc32xx_adc.c index b56ce15255cf..4136cf536d58 100644 --- a/drivers/iio/adc/lpc32xx_adc.c +++ b/drivers/iio/adc/lpc32xx_adc.c @@ -15,6 +15,7 @@ #include <linux/io.h> #include <linux/module.h> #include <linux/mod_devicetable.h> +#include <linux/mutex.h> #include <linux/platform_device.h> #include <linux/regulator/consumer.h> @@ -49,6 +50,8 @@ struct lpc32xx_adc_state { struct clk *clk; struct completion completion; struct regulator *vref; + /* lock to protect against multiple access to the device */ + struct mutex lock; u32 value; }; @@ -64,10 +67,10 @@ static int lpc32xx_read_raw(struct iio_dev *indio_dev, switch (mask) { case IIO_CHAN_INFO_RAW: - mutex_lock(&indio_dev->mlock); + mutex_lock(&st->lock); ret = clk_prepare_enable(st->clk); if (ret) { - mutex_unlock(&indio_dev->mlock); + mutex_unlock(&st->lock); return ret; } /* Measurement setup */ @@ -80,7 +83,7 @@ static int lpc32xx_read_raw(struct iio_dev *indio_dev, wait_for_completion(&st->completion); /* set by ISR */ clk_disable_unprepare(st->clk); *val = st->value; - mutex_unlock(&indio_dev->mlock); + mutex_unlock(&st->lock); return IIO_VAL_INT; @@ -158,6 +161,7 @@ static int lpc32xx_adc_probe(struct platform_device *pdev) return -ENOMEM; st = iio_priv(iodev); + mutex_init(&st->lock); st->adc_base = devm_ioremap(&pdev->dev, res->start, resource_size(res));
The iio_device lock is only meant for internal use. Hence define a device local lock to protect against concurrent accesses. Signed-off-by: Nuno Sá <nuno.sa@analog.com> --- drivers/iio/adc/lpc32xx_adc.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)