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 --- |