Commit 68c91e7a authored by Himanshi Jain's avatar Himanshi Jain Committed by Jonathan Cameron

staging: iio: ade7753: expanding buffer lock to cover both buffer and state protection

Dropping the extra lock (used for protecting the write frequency) by
expanding the buffer lock to cover both buffer and state protection.

Doing this by introducing a new function (__ade7753_spi_write_reg_16)
making buffer changes without locking the state, to avoid nested locks
while making device frequency changes.
Signed-off-by: default avatarHimanshi Jain <himshijain.hj@gmail.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent ca481398
...@@ -80,13 +80,11 @@ ...@@ -80,13 +80,11 @@
* @us: actual spi_device * @us: actual spi_device
* @tx: transmit buffer * @tx: transmit buffer
* @rx: receive buffer * @rx: receive buffer
* @buf_lock: mutex to protect tx and rx * @buf_lock: mutex to protect tx, rx and write frequency
* @lock: protect sensor data
**/ **/
struct ade7753_state { struct ade7753_state {
struct spi_device *us; struct spi_device *us;
struct mutex buf_lock; struct mutex buf_lock;
struct mutex lock; /* protect sensor data */
u8 tx[ADE7753_MAX_TX] ____cacheline_aligned; u8 tx[ADE7753_MAX_TX] ____cacheline_aligned;
u8 rx[ADE7753_MAX_RX]; u8 rx[ADE7753_MAX_RX];
}; };
...@@ -109,18 +107,28 @@ static int ade7753_spi_write_reg_8(struct device *dev, ...@@ -109,18 +107,28 @@ static int ade7753_spi_write_reg_8(struct device *dev,
return ret; return ret;
} }
static int ade7753_spi_write_reg_16(struct device *dev, u8 reg_address, static int __ade7753_spi_write_reg_16(struct device *dev, u8 reg_address,
u16 value) u16 value)
{ {
int ret;
struct iio_dev *indio_dev = dev_to_iio_dev(dev); struct iio_dev *indio_dev = dev_to_iio_dev(dev);
struct ade7753_state *st = iio_priv(indio_dev); struct ade7753_state *st = iio_priv(indio_dev);
mutex_lock(&st->buf_lock);
st->tx[0] = ADE7753_WRITE_REG(reg_address); st->tx[0] = ADE7753_WRITE_REG(reg_address);
st->tx[1] = (value >> 8) & 0xFF; st->tx[1] = (value >> 8) & 0xFF;
st->tx[2] = value & 0xFF; st->tx[2] = value & 0xFF;
ret = spi_write(st->us, st->tx, 3);
return spi_write(st->us, st->tx, 3);
}
static int ade7753_spi_write_reg_16(struct device *dev, u8 reg_address,
u16 value)
{
int ret;
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
struct ade7753_state *st = iio_priv(indio_dev);
mutex_lock(&st->buf_lock);
ret = __ade7753_spi_write_reg_16(dev, reg_address, value);
mutex_unlock(&st->buf_lock); mutex_unlock(&st->buf_lock);
return ret; return ret;
...@@ -485,7 +493,7 @@ static ssize_t ade7753_write_frequency(struct device *dev, ...@@ -485,7 +493,7 @@ static ssize_t ade7753_write_frequency(struct device *dev,
if (!val) if (!val)
return -EINVAL; return -EINVAL;
mutex_lock(&st->lock); mutex_lock(&st->buf_lock);
t = 27900 / val; t = 27900 / val;
if (t > 0) if (t > 0)
...@@ -503,10 +511,10 @@ static ssize_t ade7753_write_frequency(struct device *dev, ...@@ -503,10 +511,10 @@ static ssize_t ade7753_write_frequency(struct device *dev,
reg &= ~(3 << 11); reg &= ~(3 << 11);
reg |= t << 11; reg |= t << 11;
ret = ade7753_spi_write_reg_16(dev, ADE7753_MODE, reg); ret = __ade7753_spi_write_reg_16(dev, ADE7753_MODE, reg);
out: out:
mutex_unlock(&st->lock); mutex_unlock(&st->buf_lock);
return ret ? ret : len; return ret ? ret : len;
} }
...@@ -581,7 +589,6 @@ static int ade7753_probe(struct spi_device *spi) ...@@ -581,7 +589,6 @@ static int ade7753_probe(struct spi_device *spi)
st = iio_priv(indio_dev); st = iio_priv(indio_dev);
st->us = spi; st->us = spi;
mutex_init(&st->buf_lock); mutex_init(&st->buf_lock);
mutex_init(&st->lock);
indio_dev->name = spi->dev.driver->name; indio_dev->name = spi->dev.driver->name;
indio_dev->dev.parent = &spi->dev; indio_dev->dev.parent = &spi->dev;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment