Lines Matching +full:heart +full:- +full:rate
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * max30102.c - Support for MAX30102 heart rate and pulse oximeter sensor
8 * Copyright (C) 2017 Peter Meerwald-Stadler <pmeerw@pmeerw.net>
10 * 7-bit I2C chip address: 0x57
72 #define MAX30102_REG_MODE_CONFIG_MODE_MULTI 0x07 /* multi-LED mode */
76 #define MAX30102_REG_MODE_CONTROL_SLOT21 0x11 /* multi-LED control */
110 __be32 processed_buffer[3]; /* 3 x 18-bit (padded to 32-bits) */
153 .scan_index = -1,
165 .scan_index = -1,
171 return regmap_update_bits(data->regmap, MAX30102_REG_MODE_CONFIG, in max30102_set_power()
183 return regmap_update_bits(data->regmap, MAX30102_REG_MODE_CONFIG, in max30102_set_powermode()
197 switch (*indio_dev->active_scan_mask) { in max30102_buffer_postenable()
203 ret = regmap_update_bits(data->regmap, in max30102_buffer_postenable()
210 ret = regmap_update_bits(data->regmap, in max30102_buffer_postenable()
220 return -EINVAL; in max30102_buffer_postenable()
244 ret = regmap_read(data->regmap, MAX30102_REG_INT_STATUS, &val); in max30102_fifo_count()
256 memcpy(&data->processed_buffer[(i)], \
264 u8 *buffer = (u8 *) &data->buffer; in max30102_read_measurement()
266 ret = i2c_smbus_read_i2c_block_data(data->client, in max30102_read_measurement()
283 return -EINVAL; in max30102_read_measurement()
287 0 : -EINVAL; in max30102_read_measurement()
294 unsigned int measurements = bitmap_weight(indio_dev->active_scan_mask, in max30102_interrupt_handler()
298 mutex_lock(&data->lock); in max30102_interrupt_handler()
305 iio_push_to_buffers(data->indio_dev, data->processed_buffer); in max30102_interrupt_handler()
306 cnt--; in max30102_interrupt_handler()
309 mutex_unlock(&data->lock); in max30102_interrupt_handler()
319 return *reg > 0xff ? -EINVAL : 0; in max30102_get_current_idx()
324 struct device *dev = &data->client->dev; in max30102_led_init()
328 ret = device_property_read_u32(dev, "maxim,red-led-current-microamp", &val); in max30102_led_init()
330 dev_info(dev, "no red-led-current-microamp set\n"); in max30102_led_init()
342 ret = regmap_write(data->regmap, MAX30102_REG_RED_LED_CONFIG, reg); in max30102_led_init()
346 if (data->chip_id == max30105) { in max30102_led_init()
348 "maxim,green-led-current-microamp", &val); in max30102_led_init()
350 dev_info(dev, "no green-led-current-microamp set\n"); in max30102_led_init()
363 ret = regmap_write(data->regmap, MAX30105_REG_GREEN_LED_CONFIG, in max30102_led_init()
369 ret = device_property_read_u32(dev, "maxim,ir-led-current-microamp", &val); in max30102_led_init()
371 dev_info(dev, "no ir-led-current-microamp set\n"); in max30102_led_init()
383 return regmap_write(data->regmap, MAX30102_REG_IR_LED_CONFIG, reg); in max30102_led_init()
395 /* configure 18-bit HR + SpO2 readings at 400Hz */ in max30102_chip_init()
396 ret = regmap_write(data->regmap, MAX30102_REG_SPO2_CONFIG, in max30102_chip_init()
406 ret = regmap_write(data->regmap, MAX30102_REG_FIFO_CONFIG, in max30102_chip_init()
414 return regmap_update_bits(data->regmap, MAX30102_REG_INT_ENABLE, in max30102_chip_init()
424 ret = regmap_read(data->regmap, MAX30102_REG_TEMP_INTEGER, ®); in max30102_read_temp()
429 ret = regmap_read(data->regmap, MAX30102_REG_TEMP_FRACTION, ®); in max30102_read_temp()
450 ret = regmap_set_bits(data->regmap, MAX30102_REG_TEMP_CONFIG, in max30102_get_temp()
470 int ret = -EINVAL; in max30102_read_raw()
522 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in max30102_probe()
524 return -ENOMEM; in max30102_probe()
526 indio_dev->name = MAX30102_DRV_NAME; in max30102_probe()
527 indio_dev->info = &max30102_info; in max30102_probe()
528 indio_dev->modes = INDIO_DIRECT_MODE; in max30102_probe()
531 data->indio_dev = indio_dev; in max30102_probe()
532 data->client = client; in max30102_probe()
533 data->chip_id = id->driver_data; in max30102_probe()
535 mutex_init(&data->lock); in max30102_probe()
538 switch (data->chip_id) { in max30102_probe()
540 indio_dev->channels = max30105_channels; in max30102_probe()
541 indio_dev->num_channels = ARRAY_SIZE(max30105_channels); in max30102_probe()
542 indio_dev->available_scan_masks = max30105_scan_masks; in max30102_probe()
545 indio_dev->channels = max30102_channels; in max30102_probe()
546 indio_dev->num_channels = ARRAY_SIZE(max30102_channels); in max30102_probe()
547 indio_dev->available_scan_masks = max30102_scan_masks; in max30102_probe()
550 return -ENODEV; in max30102_probe()
553 ret = devm_iio_kfifo_buffer_setup(&client->dev, indio_dev, in max30102_probe()
558 data->regmap = devm_regmap_init_i2c(client, &max30102_regmap_config); in max30102_probe()
559 if (IS_ERR(data->regmap)) { in max30102_probe()
560 dev_err(&client->dev, "regmap initialization failed\n"); in max30102_probe()
561 return PTR_ERR(data->regmap); in max30102_probe()
565 ret = regmap_read(data->regmap, MAX30102_REG_PART_ID, ®); in max30102_probe()
569 return -ENODEV; in max30102_probe()
572 ret = regmap_read(data->regmap, MAX30102_REG_REV_ID, ®); in max30102_probe()
575 dev_dbg(&client->dev, "max3010x revision %02x\n", reg); in max30102_probe()
587 if (client->irq <= 0) { in max30102_probe()
588 dev_err(&client->dev, "no valid irq defined\n"); in max30102_probe()
589 return -EINVAL; in max30102_probe()
592 ret = devm_request_threaded_irq(&client->dev, client->irq, in max30102_probe()
597 dev_err(&client->dev, "request irq (%d) failed\n", client->irq); in max30102_probe()
641 MODULE_DESCRIPTION("MAX30102 heart rate/pulse oximeter and MAX30105 particle sensor driver");