patch "iio: adc: mcp3422: fix locking scope" added to staging-linus
Subsystems (2)
This is a note to let you know that I've just added the patch titled
iio: adc: mcp3422: fix locking scope
to my staging git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
in the staging-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From 3f1093d83d7164e4705e4232ccf76da54adfda85 Mon Sep 17 00:00:00 2001
From: Angelo Compagnucci <[email protected]>
Date: Wed, 19 Aug 2020 09:55:25 +0200
Subject: iio: adc: mcp3422: fix locking scope
Locking should be held for the entire reading sequence involving setting the channel, waiting for the channel switch and reading from the channel.
If not, reading from a channel can result mixing with the reading from another channel.
--- drivers/iio/adc/mcp3422.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/iio/adc/mcp3422.c +7 -5
@@ -96,16 +96,12 @@ static int mcp3422_update_config(struct mcp3422 *adc, u8 newconfig) {int ret; -mutex_lock (&adc->lock); - ret =i2c_master_send (adc->i2c, &newconfig,1 );if (ret >0 ) { adc->config = newconfig; ret =0 ; } -mutex_unlock (&adc->lock); -return ret; }
@@ -138,6 +134,8 @@ static int mcp3422_read_channel(struct mcp3422 *adc,u8 config;u8 req_channel = channel->channel; +mutex_lock (&adc->lock); +if (req_channel !=MCP3422_CHANNEL (adc->config)) { config = adc->config; config &= ~MCP3422_CHANNEL_MASK ;
@@ -150,7 +148,11 @@ static int mcp3422_read_channel(struct mcp3422 *adc,msleep (mcp3422_read_times[MCP3422_SAMPLE_RATE (adc->config)]); } -return mcp3422_read (adc, value, &config); + ret =mcp3422_read (adc, value, &config); + +mutex_unlock (&adc->lock); + +return ret; } static int mcp3422_read_raw(struct iio_dev *iio,
Signature · 1 line
2.28.0