diff options
Diffstat (limited to 'drivers/iio/adc/npcm_adc.c')
| -rw-r--r-- | drivers/iio/adc/npcm_adc.c | 15 | 
1 files changed, 13 insertions, 2 deletions
| diff --git a/drivers/iio/adc/npcm_adc.c b/drivers/iio/adc/npcm_adc.c index d9d105920001..f7bc0bb7f112 100644 --- a/drivers/iio/adc/npcm_adc.c +++ b/drivers/iio/adc/npcm_adc.c @@ -25,6 +25,15 @@ struct npcm_adc {  	wait_queue_head_t wq;  	struct regulator *vref;  	struct reset_control *reset; +	/* +	 * Lock to protect the device state during a potential concurrent +	 * read access from userspace. Reading a raw value requires a sequence +	 * of register writes, then a wait for a event and finally a register +	 * read, during which userspace could issue another read request. +	 * This lock protects a read access from ocurring before another one +	 * has finished. +	 */ +	struct mutex lock;  };  /* ADC registers */ @@ -135,9 +144,9 @@ static int npcm_adc_read_raw(struct iio_dev *indio_dev,  	switch (mask) {  	case IIO_CHAN_INFO_RAW: -		mutex_lock(&indio_dev->mlock); +		mutex_lock(&info->lock);  		ret = npcm_adc_read(info, val, chan->channel); -		mutex_unlock(&indio_dev->mlock); +		mutex_unlock(&info->lock);  		if (ret) {  			dev_err(info->dev, "NPCM ADC read failed\n");  			return ret; @@ -187,6 +196,8 @@ static int npcm_adc_probe(struct platform_device *pdev)  		return -ENOMEM;  	info = iio_priv(indio_dev); +	mutex_init(&info->lock); +  	info->dev = &pdev->dev;  	info->regs = devm_platform_ioremap_resource(pdev, 0); | 
