Commit 83e6415d authored by Peter Meerwald-Stadler's avatar Peter Meerwald-Stadler Committed by Jonathan Cameron

iio: health: max30102: Move mode setting to buffer_postenable

Move the programming of the mode setting from init() to
buffer_postenable()

Split out a separate function to
only update the power/shutdown bit

This changes permits to more easily implement different
modes of measurements in further patches
Signed-off-by: default avatarPeter Meerwald-Stadler <pmeerw@pmeerw.net>
Acked-by: default avatarMatt Ranostay <matt.ranostay@konsulko.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent ad90e570
...@@ -66,6 +66,7 @@ enum max3012_led_idx { ...@@ -66,6 +66,7 @@ enum max3012_led_idx {
#define MAX30102_REG_FIFO_CONFIG_AFULL BIT(0) #define MAX30102_REG_FIFO_CONFIG_AFULL BIT(0)
#define MAX30102_REG_MODE_CONFIG 0x09 #define MAX30102_REG_MODE_CONFIG 0x09
#define MAX30102_REG_MODE_CONFIG_MODE_NONE 0x00
#define MAX30102_REG_MODE_CONFIG_MODE_HR 0x02 /* red LED */ #define MAX30102_REG_MODE_CONFIG_MODE_HR 0x02 /* red LED */
#define MAX30102_REG_MODE_CONFIG_MODE_HR_SPO2 0x03 /* red + IR LED */ #define MAX30102_REG_MODE_CONFIG_MODE_HR_SPO2 0x03 /* red + IR LED */
#define MAX30102_REG_MODE_CONFIG_MODE_MULTI 0x07 /* multi-LED mode */ #define MAX30102_REG_MODE_CONFIG_MODE_MULTI 0x07 /* multi-LED mode */
...@@ -139,25 +140,41 @@ static const struct iio_chan_spec max30102_channels[] = { ...@@ -139,25 +140,41 @@ static const struct iio_chan_spec max30102_channels[] = {
}, },
}; };
static int max30102_set_powermode(struct max30102_data *data, bool state) static int max30102_set_power(struct max30102_data *data, bool en)
{ {
return regmap_update_bits(data->regmap, MAX30102_REG_MODE_CONFIG, return regmap_update_bits(data->regmap, MAX30102_REG_MODE_CONFIG,
MAX30102_REG_MODE_CONFIG_PWR, MAX30102_REG_MODE_CONFIG_PWR,
state ? 0 : MAX30102_REG_MODE_CONFIG_PWR); en ? 0 : MAX30102_REG_MODE_CONFIG_PWR);
}
static int max30102_set_powermode(struct max30102_data *data, u8 mode, bool en)
{
u8 reg = mode;
if (!en)
reg |= MAX30102_REG_MODE_CONFIG_PWR;
return regmap_update_bits(data->regmap, MAX30102_REG_MODE_CONFIG,
MAX30102_REG_MODE_CONFIG_PWR |
MAX30102_REG_MODE_CONFIG_MODE_MASK, reg);
} }
static int max30102_buffer_postenable(struct iio_dev *indio_dev) static int max30102_buffer_postenable(struct iio_dev *indio_dev)
{ {
struct max30102_data *data = iio_priv(indio_dev); struct max30102_data *data = iio_priv(indio_dev);
u8 reg;
reg = MAX30102_REG_MODE_CONFIG_MODE_HR_SPO2;
return max30102_set_powermode(data, true); return max30102_set_powermode(data, reg, true);
} }
static int max30102_buffer_predisable(struct iio_dev *indio_dev) static int max30102_buffer_predisable(struct iio_dev *indio_dev)
{ {
struct max30102_data *data = iio_priv(indio_dev); struct max30102_data *data = iio_priv(indio_dev);
return max30102_set_powermode(data, false); return max30102_set_powermode(data, MAX30102_REG_MODE_CONFIG_MODE_NONE,
false);
} }
static const struct iio_buffer_setup_ops max30102_buffer_setup_ops = { static const struct iio_buffer_setup_ops max30102_buffer_setup_ops = {
...@@ -278,7 +295,7 @@ static int max30102_chip_init(struct max30102_data *data) ...@@ -278,7 +295,7 @@ static int max30102_chip_init(struct max30102_data *data)
if (ret) if (ret)
return ret; return ret;
/* enable 18-bit HR + SPO2 readings at 400Hz */ /* configure 18-bit HR + SpO2 readings at 400Hz */
ret = regmap_write(data->regmap, MAX30102_REG_SPO2_CONFIG, ret = regmap_write(data->regmap, MAX30102_REG_SPO2_CONFIG,
(MAX30102_REG_SPO2_CONFIG_ADC_4096_STEPS (MAX30102_REG_SPO2_CONFIG_ADC_4096_STEPS
<< MAX30102_REG_SPO2_CONFIG_ADC_MASK_SHIFT) | << MAX30102_REG_SPO2_CONFIG_ADC_MASK_SHIFT) |
...@@ -288,13 +305,6 @@ static int max30102_chip_init(struct max30102_data *data) ...@@ -288,13 +305,6 @@ static int max30102_chip_init(struct max30102_data *data)
if (ret) if (ret)
return ret; return ret;
/* enable HR + SPO2 mode */
ret = regmap_update_bits(data->regmap, MAX30102_REG_MODE_CONFIG,
MAX30102_REG_MODE_CONFIG_MODE_MASK,
MAX30102_REG_MODE_CONFIG_MODE_HR_SPO2);
if (ret)
return ret;
/* average 4 samples + generate FIFO interrupt */ /* average 4 samples + generate FIFO interrupt */
ret = regmap_write(data->regmap, MAX30102_REG_FIFO_CONFIG, ret = regmap_write(data->regmap, MAX30102_REG_FIFO_CONFIG,
(MAX30102_REG_FIFO_CONFIG_AVG_4SAMPLES (MAX30102_REG_FIFO_CONFIG_AVG_4SAMPLES
...@@ -334,7 +344,7 @@ static int max30102_get_temp(struct max30102_data *data, int *val, bool en) ...@@ -334,7 +344,7 @@ static int max30102_get_temp(struct max30102_data *data, int *val, bool en)
int ret; int ret;
if (en) { if (en) {
ret = max30102_set_powermode(data, true); ret = max30102_set_power(data, true);
if (ret) if (ret)
return ret; return ret;
} }
...@@ -351,7 +361,7 @@ static int max30102_get_temp(struct max30102_data *data, int *val, bool en) ...@@ -351,7 +361,7 @@ static int max30102_get_temp(struct max30102_data *data, int *val, bool en)
out: out:
if (en) if (en)
max30102_set_powermode(data, false); max30102_set_power(data, false);
return ret; return ret;
} }
...@@ -448,7 +458,9 @@ static int max30102_probe(struct i2c_client *client, ...@@ -448,7 +458,9 @@ static int max30102_probe(struct i2c_client *client,
return ret; return ret;
dev_dbg(&client->dev, "max3010x revision %02x\n", reg); dev_dbg(&client->dev, "max3010x revision %02x\n", reg);
ret = max30102_set_powermode(data, false); /* clear mode setting, chip shutdown */
ret = max30102_set_powermode(data, MAX30102_REG_MODE_CONFIG_MODE_NONE,
false);
if (ret) if (ret)
return ret; return ret;
...@@ -479,7 +491,7 @@ static int max30102_remove(struct i2c_client *client) ...@@ -479,7 +491,7 @@ static int max30102_remove(struct i2c_client *client)
struct max30102_data *data = iio_priv(indio_dev); struct max30102_data *data = iio_priv(indio_dev);
iio_device_unregister(indio_dev); iio_device_unregister(indio_dev);
max30102_set_powermode(data, false); max30102_set_power(data, false);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment