max30102.c (d0b950c73dee67c2232482dbb6949b7a4f25a828) | max30102.c (84b0ce05e4a5f1e17b2c74d7afbe72113b6f8a04) |
---|---|
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 --- 18 unchanged lines hidden (view full) --- 27#include <linux/of.h> 28#include <linux/regmap.h> 29#include <linux/iio/iio.h> 30#include <linux/iio/buffer.h> 31#include <linux/iio/kfifo_buf.h> 32 33#define MAX30102_REGMAP_NAME "max30102_regmap" 34#define MAX30102_DRV_NAME "max30102" | 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 --- 18 unchanged lines hidden (view full) --- 27#include <linux/of.h> 28#include <linux/regmap.h> 29#include <linux/iio/iio.h> 30#include <linux/iio/buffer.h> 31#include <linux/iio/kfifo_buf.h> 32 33#define MAX30102_REGMAP_NAME "max30102_regmap" 34#define MAX30102_DRV_NAME "max30102" |
35#define MAX30102_PART_NUMBER 0x15 |
|
35 36#define MAX30102_REG_INT_STATUS 0x00 37#define MAX30102_REG_INT_STATUS_PWR_RDY BIT(0) 38#define MAX30102_REG_INT_STATUS_PROX_INT BIT(4) 39#define MAX30102_REG_INT_STATUS_ALC_OVF BIT(5) 40#define MAX30102_REG_INT_STATUS_PPG_RDY BIT(6) 41#define MAX30102_REG_INT_STATUS_FIFO_RDY BIT(7) 42 --- 35 unchanged lines hidden (view full) --- 78#define MAX30102_REG_IR_LED_CONFIG 0x0d 79 80#define MAX30102_REG_TEMP_CONFIG 0x21 81#define MAX30102_REG_TEMP_CONFIG_TEMP_EN BIT(0) 82 83#define MAX30102_REG_TEMP_INTEGER 0x1f 84#define MAX30102_REG_TEMP_FRACTION 0x20 85 | 36 37#define MAX30102_REG_INT_STATUS 0x00 38#define MAX30102_REG_INT_STATUS_PWR_RDY BIT(0) 39#define MAX30102_REG_INT_STATUS_PROX_INT BIT(4) 40#define MAX30102_REG_INT_STATUS_ALC_OVF BIT(5) 41#define MAX30102_REG_INT_STATUS_PPG_RDY BIT(6) 42#define MAX30102_REG_INT_STATUS_FIFO_RDY BIT(7) 43 --- 35 unchanged lines hidden (view full) --- 79#define MAX30102_REG_IR_LED_CONFIG 0x0d 80 81#define MAX30102_REG_TEMP_CONFIG 0x21 82#define MAX30102_REG_TEMP_CONFIG_TEMP_EN BIT(0) 83 84#define MAX30102_REG_TEMP_INTEGER 0x1f 85#define MAX30102_REG_TEMP_FRACTION 0x20 86 |
87#define MAX30102_REG_REV_ID 0xfe 88#define MAX30102_REG_PART_ID 0xff 89 |
|
86struct max30102_data { 87 struct i2c_client *client; 88 struct iio_dev *indio_dev; 89 struct mutex lock; 90 struct regmap *regmap; 91 92 u8 buffer[8]; 93 __be32 processed_buffer[2]; /* 2 x 18-bit (padded to 32-bits) */ --- 292 unchanged lines hidden (view full) --- 386 387static int max30102_probe(struct i2c_client *client, 388 const struct i2c_device_id *id) 389{ 390 struct max30102_data *data; 391 struct iio_buffer *buffer; 392 struct iio_dev *indio_dev; 393 int ret; | 90struct max30102_data { 91 struct i2c_client *client; 92 struct iio_dev *indio_dev; 93 struct mutex lock; 94 struct regmap *regmap; 95 96 u8 buffer[8]; 97 __be32 processed_buffer[2]; /* 2 x 18-bit (padded to 32-bits) */ --- 292 unchanged lines hidden (view full) --- 390 391static int max30102_probe(struct i2c_client *client, 392 const struct i2c_device_id *id) 393{ 394 struct max30102_data *data; 395 struct iio_buffer *buffer; 396 struct iio_dev *indio_dev; 397 int ret; |
398 unsigned int reg; |
|
394 395 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); 396 if (!indio_dev) 397 return -ENOMEM; 398 399 buffer = devm_iio_kfifo_allocate(&client->dev); 400 if (!buffer) 401 return -ENOMEM; --- 17 unchanged lines hidden (view full) --- 419 i2c_set_clientdata(client, indio_dev); 420 421 data->regmap = devm_regmap_init_i2c(client, &max30102_regmap_config); 422 if (IS_ERR(data->regmap)) { 423 dev_err(&client->dev, "regmap initialization failed\n"); 424 return PTR_ERR(data->regmap); 425 } 426 | 399 400 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); 401 if (!indio_dev) 402 return -ENOMEM; 403 404 buffer = devm_iio_kfifo_allocate(&client->dev); 405 if (!buffer) 406 return -ENOMEM; --- 17 unchanged lines hidden (view full) --- 424 i2c_set_clientdata(client, indio_dev); 425 426 data->regmap = devm_regmap_init_i2c(client, &max30102_regmap_config); 427 if (IS_ERR(data->regmap)) { 428 dev_err(&client->dev, "regmap initialization failed\n"); 429 return PTR_ERR(data->regmap); 430 } 431 |
432 /* check part ID */ 433 ret = regmap_read(data->regmap, MAX30102_REG_PART_ID, ®); 434 if (ret) 435 return ret; 436 if (reg != MAX30102_PART_NUMBER) 437 return -ENODEV; 438 439 /* show revision ID */ 440 ret = regmap_read(data->regmap, MAX30102_REG_REV_ID, ®); 441 if (ret) 442 return ret; 443 dev_dbg(&client->dev, "max3010x revision %02x\n", reg); 444 |
|
427 ret = max30102_set_powermode(data, false); 428 if (ret) 429 return ret; 430 431 ret = max30102_chip_init(data); 432 if (ret) 433 return ret; 434 --- 54 unchanged lines hidden --- | 445 ret = max30102_set_powermode(data, false); 446 if (ret) 447 return ret; 448 449 ret = max30102_chip_init(data); 450 if (ret) 451 return ret; 452 --- 54 unchanged lines hidden --- |