diff options
Diffstat (limited to 'drivers/iio/proximity/sx9500.c')
-rw-r--r-- | drivers/iio/proximity/sx9500.c | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/drivers/iio/proximity/sx9500.c b/drivers/iio/proximity/sx9500.c index 2042e375f835..3d756bd8c703 100644 --- a/drivers/iio/proximity/sx9500.c +++ b/drivers/iio/proximity/sx9500.c | |||
@@ -80,6 +80,7 @@ | |||
80 | #define SX9500_COMPSTAT_MASK GENMASK(3, 0) | 80 | #define SX9500_COMPSTAT_MASK GENMASK(3, 0) |
81 | 81 | ||
82 | #define SX9500_NUM_CHANNELS 4 | 82 | #define SX9500_NUM_CHANNELS 4 |
83 | #define SX9500_CHAN_MASK GENMASK(SX9500_NUM_CHANNELS - 1, 0) | ||
83 | 84 | ||
84 | struct sx9500_data { | 85 | struct sx9500_data { |
85 | struct mutex mutex; | 86 | struct mutex mutex; |
@@ -281,7 +282,7 @@ static int sx9500_read_prox_data(struct sx9500_data *data, | |||
281 | if (ret < 0) | 282 | if (ret < 0) |
282 | return ret; | 283 | return ret; |
283 | 284 | ||
284 | *val = 32767 - (s16)be16_to_cpu(regval); | 285 | *val = be16_to_cpu(regval); |
285 | 286 | ||
286 | return IIO_VAL_INT; | 287 | return IIO_VAL_INT; |
287 | } | 288 | } |
@@ -329,27 +330,29 @@ static int sx9500_read_proximity(struct sx9500_data *data, | |||
329 | else | 330 | else |
330 | ret = sx9500_wait_for_sample(data); | 331 | ret = sx9500_wait_for_sample(data); |
331 | 332 | ||
332 | if (ret < 0) | ||
333 | return ret; | ||
334 | |||
335 | mutex_lock(&data->mutex); | 333 | mutex_lock(&data->mutex); |
336 | 334 | ||
337 | ret = sx9500_read_prox_data(data, chan, val); | ||
338 | if (ret < 0) | 335 | if (ret < 0) |
339 | goto out; | 336 | goto out_dec_data_rdy; |
340 | 337 | ||
341 | ret = sx9500_dec_chan_users(data, chan->channel); | 338 | ret = sx9500_read_prox_data(data, chan, val); |
342 | if (ret < 0) | 339 | if (ret < 0) |
343 | goto out; | 340 | goto out_dec_data_rdy; |
344 | 341 | ||
345 | ret = sx9500_dec_data_rdy_users(data); | 342 | ret = sx9500_dec_data_rdy_users(data); |
346 | if (ret < 0) | 343 | if (ret < 0) |
344 | goto out_dec_chan; | ||
345 | |||
346 | ret = sx9500_dec_chan_users(data, chan->channel); | ||
347 | if (ret < 0) | ||
347 | goto out; | 348 | goto out; |
348 | 349 | ||
349 | ret = IIO_VAL_INT; | 350 | ret = IIO_VAL_INT; |
350 | 351 | ||
351 | goto out; | 352 | goto out; |
352 | 353 | ||
354 | out_dec_data_rdy: | ||
355 | sx9500_dec_data_rdy_users(data); | ||
353 | out_dec_chan: | 356 | out_dec_chan: |
354 | sx9500_dec_chan_users(data, chan->channel); | 357 | sx9500_dec_chan_users(data, chan->channel); |
355 | out: | 358 | out: |
@@ -679,7 +682,7 @@ out: | |||
679 | static int sx9500_buffer_preenable(struct iio_dev *indio_dev) | 682 | static int sx9500_buffer_preenable(struct iio_dev *indio_dev) |
680 | { | 683 | { |
681 | struct sx9500_data *data = iio_priv(indio_dev); | 684 | struct sx9500_data *data = iio_priv(indio_dev); |
682 | int ret, i; | 685 | int ret = 0, i; |
683 | 686 | ||
684 | mutex_lock(&data->mutex); | 687 | mutex_lock(&data->mutex); |
685 | 688 | ||
@@ -703,7 +706,7 @@ static int sx9500_buffer_preenable(struct iio_dev *indio_dev) | |||
703 | static int sx9500_buffer_predisable(struct iio_dev *indio_dev) | 706 | static int sx9500_buffer_predisable(struct iio_dev *indio_dev) |
704 | { | 707 | { |
705 | struct sx9500_data *data = iio_priv(indio_dev); | 708 | struct sx9500_data *data = iio_priv(indio_dev); |
706 | int ret, i; | 709 | int ret = 0, i; |
707 | 710 | ||
708 | iio_triggered_buffer_predisable(indio_dev); | 711 | iio_triggered_buffer_predisable(indio_dev); |
709 | 712 | ||
@@ -800,8 +803,7 @@ static int sx9500_init_compensation(struct iio_dev *indio_dev) | |||
800 | unsigned int val; | 803 | unsigned int val; |
801 | 804 | ||
802 | ret = regmap_update_bits(data->regmap, SX9500_REG_PROX_CTRL0, | 805 | ret = regmap_update_bits(data->regmap, SX9500_REG_PROX_CTRL0, |
803 | GENMASK(SX9500_NUM_CHANNELS, 0), | 806 | SX9500_CHAN_MASK, SX9500_CHAN_MASK); |
804 | GENMASK(SX9500_NUM_CHANNELS, 0)); | ||
805 | if (ret < 0) | 807 | if (ret < 0) |
806 | return ret; | 808 | return ret; |
807 | 809 | ||
@@ -821,7 +823,7 @@ static int sx9500_init_compensation(struct iio_dev *indio_dev) | |||
821 | 823 | ||
822 | out: | 824 | out: |
823 | regmap_update_bits(data->regmap, SX9500_REG_PROX_CTRL0, | 825 | regmap_update_bits(data->regmap, SX9500_REG_PROX_CTRL0, |
824 | GENMASK(SX9500_NUM_CHANNELS, 0), 0); | 826 | SX9500_CHAN_MASK, 0); |
825 | return ret; | 827 | return ret; |
826 | } | 828 | } |
827 | 829 | ||