| From foo@baz Thu Nov 9 09:48:01 CET 2017 |
| From: Alison Schofield <amsfield22@gmail.com> |
| Date: Fri, 20 Jan 2017 14:11:30 -0800 |
| Subject: iio: proximity: sx9500: claim direct mode during raw proximity reads |
| |
| From: Alison Schofield <amsfield22@gmail.com> |
| |
| |
| [ Upstream commit 6b2e7589b82ff534dd5c6d67dd83c53f13691bec ] |
| |
| Driver was checking for direct mode but not locking it. Use the |
| claim/release helper functions to guarantee the device stays in |
| direct mode during raw reads of proximity data. |
| |
| Signed-off-by: Alison Schofield <amsfield22@gmail.com> |
| Reviewed-by: Vlad Dogaru <ddvlad@gmail.com> |
| Signed-off-by: Jonathan Cameron <jic23@kernel.org> |
| Signed-off-by: Sasha Levin <alexander.levin@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/iio/proximity/sx9500.c | 10 +++++++--- |
| 1 file changed, 7 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/iio/proximity/sx9500.c |
| +++ b/drivers/iio/proximity/sx9500.c |
| @@ -387,14 +387,18 @@ static int sx9500_read_raw(struct iio_de |
| int *val, int *val2, long mask) |
| { |
| struct sx9500_data *data = iio_priv(indio_dev); |
| + int ret; |
| |
| switch (chan->type) { |
| case IIO_PROXIMITY: |
| switch (mask) { |
| case IIO_CHAN_INFO_RAW: |
| - if (iio_buffer_enabled(indio_dev)) |
| - return -EBUSY; |
| - return sx9500_read_proximity(data, chan, val); |
| + ret = iio_device_claim_direct_mode(indio_dev); |
| + if (ret) |
| + return ret; |
| + ret = sx9500_read_proximity(data, chan, val); |
| + iio_device_release_direct_mode(indio_dev); |
| + return ret; |
| case IIO_CHAN_INFO_SAMP_FREQ: |
| return sx9500_read_samp_freq(data, val, val2); |
| default: |