max30102.c (839a74cde7ee6da20ee908a570c0e88970ac13c9) max30102.c (a9c47abbdd71dceeaf1b923e5ce10e700e036905)
1/*
2 * max30102.c - Support for MAX30102 heart rate and pulse oximeter sensor
3 *
4 * Copyright (C) 2017 Matt Ranostay <matt@ranostay.consulting>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or

--- 307 unchanged lines hidden (view full) ---

316 return ret;
317
318 *val |= reg & 0xf;
319 *val = sign_extend32(*val, 11);
320
321 return 0;
322}
323
1/*
2 * max30102.c - Support for MAX30102 heart rate and pulse oximeter sensor
3 *
4 * Copyright (C) 2017 Matt Ranostay <matt@ranostay.consulting>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or

--- 307 unchanged lines hidden (view full) ---

316 return ret;
317
318 *val |= reg & 0xf;
319 *val = sign_extend32(*val, 11);
320
321 return 0;
322}
323
324static int max30102_get_temp(struct max30102_data *data, int *val)
324static int max30102_get_temp(struct max30102_data *data, int *val, bool en)
325{
326 int ret;
327
325{
326 int ret;
327
328 if (en) {
329 ret = max30102_set_powermode(data, true);
330 if (ret)
331 return ret;
332 }
333
328 /* start acquisition */
329 ret = regmap_update_bits(data->regmap, MAX30102_REG_TEMP_CONFIG,
330 MAX30102_REG_TEMP_CONFIG_TEMP_EN,
331 MAX30102_REG_TEMP_CONFIG_TEMP_EN);
332 if (ret)
334 /* start acquisition */
335 ret = regmap_update_bits(data->regmap, MAX30102_REG_TEMP_CONFIG,
336 MAX30102_REG_TEMP_CONFIG_TEMP_EN,
337 MAX30102_REG_TEMP_CONFIG_TEMP_EN);
338 if (ret)
333 return ret;
339 goto out;
334
335 msleep(35);
340
341 msleep(35);
342 ret = max30102_read_temp(data, val);
336
343
337 return max30102_read_temp(data, val);
344out:
345 if (en)
346 max30102_set_powermode(data, false);
347
348 return ret;
338}
339
340static int max30102_read_raw(struct iio_dev *indio_dev,
341 struct iio_chan_spec const *chan,
342 int *val, int *val2, long mask)
343{
344 struct max30102_data *data = iio_priv(indio_dev);
345 int ret = -EINVAL;
346
347 switch (mask) {
348 case IIO_CHAN_INFO_RAW:
349 /*
349}
350
351static int max30102_read_raw(struct iio_dev *indio_dev,
352 struct iio_chan_spec const *chan,
353 int *val, int *val2, long mask)
354{
355 struct max30102_data *data = iio_priv(indio_dev);
356 int ret = -EINVAL;
357
358 switch (mask) {
359 case IIO_CHAN_INFO_RAW:
360 /*
350 * Temperature reading can only be acquired while engine
351 * is running
361 * Temperature reading can only be acquired when not in
362 * shutdown; leave shutdown briefly when buffer not running
352 */
353 mutex_lock(&indio_dev->mlock);
363 */
364 mutex_lock(&indio_dev->mlock);
354
355 if (!iio_buffer_enabled(indio_dev))
365 if (!iio_buffer_enabled(indio_dev))
356 ret = -EBUSY;
357 else {
358 ret = max30102_get_temp(data, val);
359 if (!ret)
360 ret = IIO_VAL_INT;
361 }
362
366 ret = max30102_get_temp(data, val, true);
367 else
368 ret = max30102_get_temp(data, val, false);
363 mutex_unlock(&indio_dev->mlock);
369 mutex_unlock(&indio_dev->mlock);
370 if (ret)
371 return ret;
372
373 ret = IIO_VAL_INT;
364 break;
365 case IIO_CHAN_INFO_SCALE:
366 *val = 1; /* 0.0625 */
367 *val2 = 16;
368 ret = IIO_VAL_FRACTIONAL;
369 break;
370 }
371

--- 123 unchanged lines hidden ---
374 break;
375 case IIO_CHAN_INFO_SCALE:
376 *val = 1; /* 0.0625 */
377 *val2 = 16;
378 ret = IIO_VAL_FRACTIONAL;
379 break;
380 }
381

--- 123 unchanged lines hidden ---