On Sun, Jun 14, 2020 at 6:39 AM Jonathan Cameron <jic23@xxxxxxxxxx> wrote: > > On Tue, 9 Jun 2020 12:41:17 -0700 > Matt Ranostay <matt.ranostay@xxxxxxxxxxxx> wrote: > > > Add support for the Atlas EZO O2 chemical sensor which required > > some refactoring of the driver and parsing of i2c transfer. > > > > Sensor data is converted by the scaling value from percent to > > IIO_CONCENTRATION. > > > > Signed-off-by: Matt Ranostay <matt.ranostay@xxxxxxxxxxxx> > Hohum. I could just apply this series today (looks good) but > given you just fixed that missing strings problem, that will make > for a messy merge for Greg when I send this via togreg and the > fix via fixes-togreg. > > As such I'm going to sit on this one until that fix ends up in my > upstream then pick this up. > > Do remind me if I seem to have lost it though once that's true! Will do! - Matt > > Thanks, > > Jonathan > > > --- > > drivers/iio/chemical/atlas-ezo-sensor.c | 74 ++++++++++++++++++------- > > 1 file changed, 55 insertions(+), 19 deletions(-) > > > > diff --git a/drivers/iio/chemical/atlas-ezo-sensor.c b/drivers/iio/chemical/atlas-ezo-sensor.c > > index a94eb8a6bf32..94188c84e65f 100644 > > --- a/drivers/iio/chemical/atlas-ezo-sensor.c > > +++ b/drivers/iio/chemical/atlas-ezo-sensor.c > > @@ -16,10 +16,11 @@ > > #include <linux/iio/iio.h> > > > > #define ATLAS_EZO_DRV_NAME "atlas-ezo-sensor" > > -#define ATLAS_CO2_INT_TIME_IN_MS 950 > > +#define ATLAS_INT_TIME_IN_MS 950 > > > > enum { > > ATLAS_CO2_EZO, > > + ATLAS_O2_EZO, > > }; > > > > struct atlas_ezo_device { > > @@ -38,31 +39,54 @@ struct atlas_ezo_data { > > u8 buffer[8]; > > }; > > > > +#define ATLAS_CONCENTRATION_CHANNEL(_modifier) \ > > + { \ > > + .type = IIO_CONCENTRATION, \ > > + .modified = 1,\ > > + .channel2 = _modifier, \ > > + .info_mask_separate = \ > > + BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE), \ > > + .scan_index = 0, \ > > + .scan_type = { \ > > + .sign = 'u', \ > > + .realbits = 32, \ > > + .storagebits = 32, \ > > + .endianness = IIO_CPU, \ > > + }, \ > > + } > > + > > static const struct iio_chan_spec atlas_co2_ezo_channels[] = { > > - { > > - .type = IIO_CONCENTRATION, > > - .modified = 1, > > - .channel2 = IIO_MOD_CO2, > > - .info_mask_separate = > > - BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE), > > - .scan_index = 0, > > - .scan_type = { > > - .sign = 'u', > > - .realbits = 32, > > - .storagebits = 32, > > - .endianness = IIO_CPU, > > - }, > > - }, > > + ATLAS_CONCENTRATION_CHANNEL(IIO_MOD_CO2), > > +}; > > + > > +static const struct iio_chan_spec atlas_o2_ezo_channels[] = { > > + ATLAS_CONCENTRATION_CHANNEL(IIO_MOD_O2), > > }; > > > > static struct atlas_ezo_device atlas_ezo_devices[] = { > > [ATLAS_CO2_EZO] = { > > .channels = atlas_co2_ezo_channels, > > .num_channels = 1, > > - .delay = ATLAS_CO2_INT_TIME_IN_MS, > > + .delay = ATLAS_INT_TIME_IN_MS, > > }, > > + [ATLAS_O2_EZO] = { > > + .channels = atlas_o2_ezo_channels, > > + .num_channels = 1, > > + .delay = ATLAS_INT_TIME_IN_MS, > > + } > > }; > > > > +static void atlas_ezo_sanitize(char *buf) > > +{ > > + char *ptr = strchr(buf, '.'); > > + > > + if (!ptr) > > + return; > > + > > + for (; *ptr; ptr++) > > + *ptr = *(ptr + 1); > > +} > > + > > static int atlas_ezo_read_raw(struct iio_dev *indio_dev, > > struct iio_chan_spec const *chan, > > int *val, int *val2, long mask) > > @@ -96,6 +120,9 @@ static int atlas_ezo_read_raw(struct iio_dev *indio_dev, > > return -EBUSY; > > } > > > > + /* removing floating point for fixed number representation */ > > + atlas_ezo_sanitize(data->buffer + 2); > > + > > ret = kstrtol(data->buffer + 1, 10, &tmp); > > > > *val = tmp; > > @@ -105,9 +132,16 @@ static int atlas_ezo_read_raw(struct iio_dev *indio_dev, > > return ret ? ret : IIO_VAL_INT; > > } > > case IIO_CHAN_INFO_SCALE: > > - *val = 0; > > - *val2 = 100; /* 0.0001 */ > > - return IIO_VAL_INT_PLUS_MICRO; > > + switch (chan->channel2) { > > + case IIO_MOD_CO2: > > + *val = 0; > > + *val2 = 100; /* 0.0001 */ > > + return IIO_VAL_INT_PLUS_MICRO; > > + case IIO_MOD_O2: > > + *val = 100; > > + return IIO_VAL_INT; > > + } > > + return -EINVAL; > > } > > > > return 0; > > @@ -119,12 +153,14 @@ static const struct iio_info atlas_info = { > > > > static const struct i2c_device_id atlas_ezo_id[] = { > > { "atlas-co2-ezo", ATLAS_CO2_EZO }, > > + { "atlas-o2-ezo", ATLAS_O2_EZO }, > > {} > > }; > > MODULE_DEVICE_TABLE(i2c, atlas_ezo_id); > > > > static const struct of_device_id atlas_ezo_dt_ids[] = { > > { .compatible = "atlas,co2-ezo", .data = (void *)ATLAS_CO2_EZO, }, > > + { .compatible = "atlas,o2-ezo", .data = (void *)ATLAS_O2_EZO, }, > > {} > > }; > > MODULE_DEVICE_TABLE(of, atlas_ezo_dt_ids); >