Message ID | 20210825152518.379386-37-miquel.raynal@bootlin.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | TI AM437X ADC1 | expand |
On Wed, 25 Aug 2021 17:25:14 +0200 Miquel Raynal <miquel.raynal@bootlin.com> wrote: > Without the scale, the values returned to the user are just a picture of > the input voltage against the full scale range of the ADC. We need to > provide the actual conversion factor to get milli-Volts values. > > Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Odd no one did this before, but such is life ;) Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> > --- > drivers/iio/adc/ti_am335x_adc.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c > index d4619fd6fd54..f644898b47dd 100644 > --- a/drivers/iio/adc/ti_am335x_adc.c > +++ b/drivers/iio/adc/ti_am335x_adc.c > @@ -417,6 +417,7 @@ static int tiadc_channel_init(struct device *dev, struct iio_dev *indio_dev, > chan->indexed = 1; > chan->channel = adc_dev->channel_line[i]; > chan->info_mask_separate = BIT(IIO_CHAN_INFO_RAW); > + chan->info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE); > chan->datasheet_name = chan_name_ain[chan->channel]; > chan->scan_index = i; > chan->scan_type.sign = 'u'; > @@ -441,6 +442,23 @@ static int tiadc_read_raw(struct iio_dev *indio_dev, > unsigned long timeout; > int ret; > > + switch (mask) { > + case IIO_CHAN_INFO_RAW: > + break; > + case IIO_CHAN_INFO_SCALE: > + switch (chan->type) { > + case IIO_VOLTAGE: > + *val = 1800; > + *val2 = chan->scan_type.realbits; > + return IIO_VAL_FRACTIONAL_LOG2; > + default: > + return -EINVAL; > + } > + break; > + default: > + return -EINVAL; > + } > + > if (iio_buffer_enabled(indio_dev)) > return -EBUSY; >
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c index d4619fd6fd54..f644898b47dd 100644 --- a/drivers/iio/adc/ti_am335x_adc.c +++ b/drivers/iio/adc/ti_am335x_adc.c @@ -417,6 +417,7 @@ static int tiadc_channel_init(struct device *dev, struct iio_dev *indio_dev, chan->indexed = 1; chan->channel = adc_dev->channel_line[i]; chan->info_mask_separate = BIT(IIO_CHAN_INFO_RAW); + chan->info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE); chan->datasheet_name = chan_name_ain[chan->channel]; chan->scan_index = i; chan->scan_type.sign = 'u'; @@ -441,6 +442,23 @@ static int tiadc_read_raw(struct iio_dev *indio_dev, unsigned long timeout; int ret; + switch (mask) { + case IIO_CHAN_INFO_RAW: + break; + case IIO_CHAN_INFO_SCALE: + switch (chan->type) { + case IIO_VOLTAGE: + *val = 1800; + *val2 = chan->scan_type.realbits; + return IIO_VAL_FRACTIONAL_LOG2; + default: + return -EINVAL; + } + break; + default: + return -EINVAL; + } + if (iio_buffer_enabled(indio_dev)) return -EBUSY;
Without the scale, the values returned to the user are just a picture of the input voltage against the full scale range of the ADC. We need to provide the actual conversion factor to get milli-Volts values. Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> --- drivers/iio/adc/ti_am335x_adc.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)