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, &reg);
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, &reg);
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 ---