On Sun, 19 Nov 2017 12:56:28 -0800 Matt Ranostay <matt.ranostay@xxxxxxxxxxxx> wrote: > On Fri, Oct 27, 2017 at 12:45 PM, Peter Meerwald-Stadler > <pmeerw@xxxxxxxxxx> wrote: > > 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: Peter Meerwald-Stadler <pmeerw@xxxxxxxxxx> > > Cc: Matt Ranostay <matt.ranostay@xxxxxxxxxxxx> > > Acked-by: Matt Ranostay <matt.ranostay@xxxxxxxxxxxx> Applied. > > > --- > > drivers/iio/health/max30102.c | 44 +++++++++++++++++++++++++++---------------- > > 1 file changed, 28 insertions(+), 16 deletions(-) > > > > diff --git a/drivers/iio/health/max30102.c b/drivers/iio/health/max30102.c > > index 37176c2..1c7fe63 100644 > > --- a/drivers/iio/health/max30102.c > > +++ b/drivers/iio/health/max30102.c > > @@ -66,6 +66,7 @@ enum max3012_led_idx { > > #define MAX30102_REG_FIFO_CONFIG_AFULL BIT(0) > > > > #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_SPO2 0x03 /* red + IR LED */ > > #define MAX30102_REG_MODE_CONFIG_MODE_MULTI 0x07 /* multi-LED mode */ > > @@ -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, > > 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) > > { > > 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) > > { > > 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 = { > > @@ -278,7 +295,7 @@ static int max30102_chip_init(struct max30102_data *data) > > if (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, > > (MAX30102_REG_SPO2_CONFIG_ADC_4096_STEPS > > << MAX30102_REG_SPO2_CONFIG_ADC_MASK_SHIFT) | > > @@ -288,13 +305,6 @@ static int max30102_chip_init(struct max30102_data *data) > > if (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 */ > > ret = regmap_write(data->regmap, MAX30102_REG_FIFO_CONFIG, > > (MAX30102_REG_FIFO_CONFIG_AVG_4SAMPLES > > @@ -334,7 +344,7 @@ static int max30102_get_temp(struct max30102_data *data, int *val, bool en) > > int ret; > > > > if (en) { > > - ret = max30102_set_powermode(data, true); > > + ret = max30102_set_power(data, true); > > if (ret) > > return ret; > > } > > @@ -351,7 +361,7 @@ static int max30102_get_temp(struct max30102_data *data, int *val, bool en) > > > > out: > > if (en) > > - max30102_set_powermode(data, false); > > + max30102_set_power(data, false); > > > > return ret; > > } > > @@ -448,7 +458,9 @@ static int max30102_probe(struct i2c_client *client, > > return ret; > > 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) > > return ret; > > > > @@ -479,7 +491,7 @@ static int max30102_remove(struct i2c_client *client) > > struct max30102_data *data = iio_priv(indio_dev); > > > > iio_device_unregister(indio_dev); > > - max30102_set_powermode(data, false); > > + max30102_set_power(data, false); > > > > return 0; > > } > > -- > > 2.7.4 > > -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html