| From foo@baz Fri Mar 16 15:43:17 CET 2018 |
| From: Peter Meerwald-Stadler <pmeerw@pmeerw.net> |
| Date: Fri, 27 Oct 2017 21:45:38 +0200 |
| Subject: iio: health: max30102: Add power enable parameter to get_temp function |
| |
| From: Peter Meerwald-Stadler <pmeerw@pmeerw.net> |
| |
| |
| [ Upstream commit a9c47abbdd71dceeaf1b923e5ce10e700e036905 ] |
| |
| Chip must not be in shutdown for reading temperature, so briefly leave |
| shutdown if buffer is not already running |
| |
| Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net> |
| Acked-by: Matt Ranostay <matt.ranostay@konsulko.com> |
| Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/iio/health/max30102.c | 36 +++++++++++++++++++++++------------- |
| 1 file changed, 23 insertions(+), 13 deletions(-) |
| |
| --- a/drivers/iio/health/max30102.c |
| +++ b/drivers/iio/health/max30102.c |
| @@ -329,20 +329,31 @@ static int max30102_read_temp(struct max |
| return 0; |
| } |
| |
| -static int max30102_get_temp(struct max30102_data *data, int *val) |
| +static int max30102_get_temp(struct max30102_data *data, int *val, bool en) |
| { |
| int ret; |
| |
| + if (en) { |
| + ret = max30102_set_powermode(data, true); |
| + if (ret) |
| + return ret; |
| + } |
| + |
| /* start acquisition */ |
| ret = regmap_update_bits(data->regmap, MAX30102_REG_TEMP_CONFIG, |
| MAX30102_REG_TEMP_CONFIG_TEMP_EN, |
| MAX30102_REG_TEMP_CONFIG_TEMP_EN); |
| if (ret) |
| - return ret; |
| + goto out; |
| |
| msleep(35); |
| + ret = max30102_read_temp(data, val); |
| + |
| +out: |
| + if (en) |
| + max30102_set_powermode(data, false); |
| |
| - return max30102_read_temp(data, val); |
| + return ret; |
| } |
| |
| static int max30102_read_raw(struct iio_dev *indio_dev, |
| @@ -355,20 +366,19 @@ static int max30102_read_raw(struct iio_ |
| switch (mask) { |
| case IIO_CHAN_INFO_RAW: |
| /* |
| - * Temperature reading can only be acquired while engine |
| - * is running |
| + * Temperature reading can only be acquired when not in |
| + * shutdown; leave shutdown briefly when buffer not running |
| */ |
| mutex_lock(&indio_dev->mlock); |
| - |
| if (!iio_buffer_enabled(indio_dev)) |
| - ret = -EBUSY; |
| - else { |
| - ret = max30102_get_temp(data, val); |
| - if (!ret) |
| - ret = IIO_VAL_INT; |
| - } |
| - |
| + ret = max30102_get_temp(data, val, true); |
| + else |
| + ret = max30102_get_temp(data, val, false); |
| mutex_unlock(&indio_dev->mlock); |
| + if (ret) |
| + return ret; |
| + |
| + ret = IIO_VAL_INT; |
| break; |
| case IIO_CHAN_INFO_SCALE: |
| *val = 1000; /* 62.5 */ |