mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 14:41:39 +00:00
iio: dac: ad5592r-base: Replace indio_dev->mlock with own device lock
As part of the general cleanup of indio_dev->mlock, this change replaces it with a local lock on the device's state structure. This also removes unused iio_dev pointers. Signed-off-by: Sergiu Cuciurean <sergiu.cuciurean@analog.com> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
ac101e6b31
commit
33c53cbf8f
@ -156,7 +156,6 @@ static void ad5592r_gpio_cleanup(struct ad5592r_state *st)
|
||||
static int ad5592r_reset(struct ad5592r_state *st)
|
||||
{
|
||||
struct gpio_desc *gpio;
|
||||
struct iio_dev *iio_dev = iio_priv_to_dev(st);
|
||||
|
||||
gpio = devm_gpiod_get_optional(st->dev, "reset", GPIOD_OUT_LOW);
|
||||
if (IS_ERR(gpio))
|
||||
@ -166,10 +165,10 @@ static int ad5592r_reset(struct ad5592r_state *st)
|
||||
udelay(1);
|
||||
gpiod_set_value(gpio, 1);
|
||||
} else {
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
/* Writing this magic value resets the device */
|
||||
st->ops->reg_write(st, AD5592R_REG_RESET, 0xdac);
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
}
|
||||
|
||||
udelay(250);
|
||||
@ -197,7 +196,6 @@ static int ad5592r_set_channel_modes(struct ad5592r_state *st)
|
||||
const struct ad5592r_rw_ops *ops = st->ops;
|
||||
int ret;
|
||||
unsigned i;
|
||||
struct iio_dev *iio_dev = iio_priv_to_dev(st);
|
||||
u8 pulldown = 0, tristate = 0, dac = 0, adc = 0;
|
||||
u16 read_back;
|
||||
|
||||
@ -247,7 +245,7 @@ static int ad5592r_set_channel_modes(struct ad5592r_state *st)
|
||||
}
|
||||
}
|
||||
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
/* Pull down unused pins to GND */
|
||||
ret = ops->reg_write(st, AD5592R_REG_PULLDOWN, pulldown);
|
||||
@ -285,7 +283,7 @@ static int ad5592r_set_channel_modes(struct ad5592r_state *st)
|
||||
ret = -EIO;
|
||||
|
||||
err_unlock:
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -314,11 +312,11 @@ static int ad5592r_write_raw(struct iio_dev *iio_dev,
|
||||
if (!chan->output)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
ret = st->ops->write_dac(st, chan->channel, val);
|
||||
if (!ret)
|
||||
st->cached_dac[chan->channel] = val;
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
return ret;
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
if (chan->type == IIO_VOLTAGE) {
|
||||
@ -333,12 +331,12 @@ static int ad5592r_write_raw(struct iio_dev *iio_dev,
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
ret = st->ops->reg_read(st, AD5592R_REG_CTRL,
|
||||
&st->cached_gp_ctrl);
|
||||
if (ret < 0) {
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -360,7 +358,7 @@ static int ad5592r_write_raw(struct iio_dev *iio_dev,
|
||||
|
||||
ret = st->ops->reg_write(st, AD5592R_REG_CTRL,
|
||||
st->cached_gp_ctrl);
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -382,7 +380,7 @@ static int ad5592r_read_raw(struct iio_dev *iio_dev,
|
||||
|
||||
switch (m) {
|
||||
case IIO_CHAN_INFO_RAW:
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
if (!chan->output) {
|
||||
ret = st->ops->read_adc(st, chan->channel, &read_val);
|
||||
@ -419,7 +417,7 @@ static int ad5592r_read_raw(struct iio_dev *iio_dev,
|
||||
} else {
|
||||
int mult;
|
||||
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
if (chan->output)
|
||||
mult = !!(st->cached_gp_ctrl &
|
||||
@ -437,7 +435,7 @@ static int ad5592r_read_raw(struct iio_dev *iio_dev,
|
||||
case IIO_CHAN_INFO_OFFSET:
|
||||
ret = ad5592r_get_vref(st);
|
||||
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
if (st->cached_gp_ctrl & AD5592R_REG_CTRL_ADC_RANGE)
|
||||
*val = (-34365 * 25) / ret;
|
||||
@ -450,7 +448,7 @@ static int ad5592r_read_raw(struct iio_dev *iio_dev,
|
||||
}
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -625,6 +623,8 @@ int ad5592r_probe(struct device *dev, const char *name,
|
||||
iio_dev->info = &ad5592r_info;
|
||||
iio_dev->modes = INDIO_DIRECT_MODE;
|
||||
|
||||
mutex_init(&st->lock);
|
||||
|
||||
ad5592r_init_scales(st, ad5592r_get_vref(st));
|
||||
|
||||
ret = ad5592r_reset(st);
|
||||
|
@ -52,6 +52,7 @@ struct ad5592r_state {
|
||||
struct regulator *reg;
|
||||
struct gpio_chip gpiochip;
|
||||
struct mutex gpio_lock; /* Protect cached gpio_out, gpio_val, etc. */
|
||||
struct mutex lock;
|
||||
unsigned int num_channels;
|
||||
const struct ad5592r_rw_ops *ops;
|
||||
int scale_avail[2][2];
|
||||
|
Loading…
Reference in New Issue
Block a user