Skip to content

Commit

Permalink
staging: iio: update locking method during frequency writes
Browse files Browse the repository at this point in the history
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 introduce an auxiliary spi_write() that does
not hold the lock.

Signed-off-by: Gargi Sharma <[email protected]>
Signed-off-by: Jonathan Cameron <[email protected]>
  • Loading branch information
gs0510 authored and jic23 committed Mar 30, 2017
1 parent 5e13b6f commit b71244b
Showing 1 changed file with 16 additions and 8 deletions.
24 changes: 16 additions & 8 deletions drivers/staging/iio/meter/ade7754.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@
/**
* struct ade7754_state - device instance specific data
* @us: actual spi_device
* @buf_lock: mutex to protect tx and rx
* @buf_lock: mutex to protect tx, rx and write frequency
* @tx: transmit buffer
* @rx: receive buffer
**/
Expand All @@ -107,17 +107,25 @@ struct ade7754_state {
u8 rx[ADE7754_MAX_RX];
};

static int ade7754_spi_write_reg_8(struct device *dev, u8 reg_address, u8 val)
/* Unlocked version of ade7754_spi_write_reg_8 function */
static int __ade7754_spi_write_reg_8(struct device *dev, u8 reg_address, u8 val)
{
int ret;
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
struct ade7754_state *st = iio_priv(indio_dev);

mutex_lock(&st->buf_lock);
st->tx[0] = ADE7754_WRITE_REG(reg_address);
st->tx[1] = val;
return spi_write(st->us, st->tx, 2);
}

ret = spi_write(st->us, st->tx, 2);
static int ade7754_spi_write_reg_8(struct device *dev, u8 reg_address, u8 val)
{
int ret;
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
struct ade7754_state *st = iio_priv(indio_dev);

mutex_lock(&st->buf_lock);
ret = __ade7754_spi_write_reg_8(dev, reg_address, val);
mutex_unlock(&st->buf_lock);

return ret;
Expand Down Expand Up @@ -512,7 +520,7 @@ static ssize_t ade7754_write_frequency(struct device *dev,
if (!val)
return -EINVAL;

mutex_lock(&indio_dev->mlock);
mutex_lock(&st->buf_lock);

t = 26000 / val;
if (t > 0)
Expand All @@ -530,10 +538,10 @@ static ssize_t ade7754_write_frequency(struct device *dev,
reg &= ~(3 << 3);
reg |= t << 3;

ret = ade7754_spi_write_reg_8(dev, ADE7754_WAVMODE, reg);
ret = __ade7754_spi_write_reg_8(dev, ADE7754_WAVMODE, reg);

out:
mutex_unlock(&indio_dev->mlock);
mutex_unlock(&st->buf_lock);

return ret ? ret : len;
}
Expand Down

0 comments on commit b71244b

Please sign in to comment.