Skip to content

Commit

Permalink
iio: health: max30102: Add power enable parameter to get_temp function
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Peter Meerwald-Stadler authored and Jonathan Cameron committed Dec 2, 2017
1 parent 839a74c commit a9c47ab
Showing 1 changed file with 23 additions and 13 deletions.
36 changes: 23 additions & 13 deletions drivers/iio/health/max30102.c
Original file line number Diff line number Diff line change
Expand Up @@ -321,20 +321,31 @@ static int max30102_read_temp(struct max30102_data *data, int *val)
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,
Expand All @@ -347,20 +358,19 @@ static int max30102_read_raw(struct iio_dev *indio_dev,
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 = 1; /* 0.0625 */
Expand Down

0 comments on commit a9c47ab

Please sign in to comment.