staging: iio: meter: Replace mlock with driver private buf_lock
Subsystems (4)
PATCH 1/1 staging: iio: meter: Replace mlock with driver private buf_lock
The driver needs to insure atomicity during frequency changes of bus and device. The iiodev->mlock as used was not doing that. Replace it with the drivers existing buffer lock and execute spi_write directly.
--- drivers/staging/iio/meter/ade7759.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/staging/iio/meter/ade7759.c +6 -3
@@ -429,7 +429,7 @@ static ssize_t ade7759_write_frequency(struct device *dev,if (!val)return -EINVAL ; -mutex_lock (&indio_dev->mlock); +mutex_lock (&st->buf_lock); t =27900 / val;if (t >0 )
@@ -447,10 +447,13 @@ static ssize_t ade7759_write_frequency(struct device *dev, reg &= ~(3 <<13 ); reg |= t <<13 ; - ret =ade7759_spi_write_reg_16 (dev,ADE7759_MODE , reg); + st->tx[0 ] =ADE7759_WRITE_REG (ADE7759_MODE ); + st->tx[1 ] = reg; + + ret =spi_write (st->us, st->tx,2 ); out: -mutex_unlock (&indio_dev->mlock); +mutex_unlock (&st->buf_lock);return ret ? ret : len; }
Signature · 1 line
2.11.0
Jonathan Cameron
maintainerQuoted 6 lines · Arushi Singhal
The driver needs to insure atomicity during frequency changes of bus and device. The
iiodev->mlockas used was not doing that. Replace it with the drivers existing buffer lock and executespi_writedirectly.Signed-off-by Arushi Singhal <[email protected]>
Firstly please put the driver name in the title when a patch only effects one driver.
Secondly, please see final version of Gargi Sharma's patch for the ade7754.
As with that one, the basic principle is fine, but I didn't like the V2 version which did the local copy of spi_write as you have here.
Introduced an unlocked version of the ade7759_spi_write_reg_16 function and call it both from ade7759_spi_write_reg_16 and directly here.
Puts the _WRITE_REG magic all in one place.
Otherwise, looks good!
Jonathan
Quoted 34 lines
--- drivers/staging/iio/meter/ade7759.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)drivers/staging/iio/meter/ade7759.c +6
-3@@ -429,7 +429,7 @@ static ssize_t ade7759_write_frequency(struct device *dev,if (!val)return -EINVAL ; -mutex_lock (&indio_dev->mlock); +mutex_lock (&st->buf_lock); t =27900 / val;if (t >0 )@@ -447,10 +447,13 @@ static ssize_t ade7759_write_frequency(struct device *dev, reg &= ~(3 <<13 ); reg |= t <<13 ; - ret =ade7759_spi_write_reg_16 (dev,ADE7759_MODE , reg); + st->tx[0 ] =ADE7759_WRITE_REG (ADE7759_MODE ); + st->tx[1 ] = reg; + + ret =spi_write (st->us, st->tx,2 ); out: -mutex_unlock (&indio_dev->mlock); +mutex_unlock (&st->buf_lock);return ret ? ret : len; }