Skip to contentSkip to conversation

staging: iio: ad7780: correct driver read

PATCH Superseded Renato Lui Geh 2 participants 7 messages Oct 25, 2018 – Oct 28, 2018

Subsystems (4)

v2 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

v2 cover staging: iio: ad7780: correct driver read

The purpose of this series is to correct two issues in the driver's raw read function.

Changelog:
* v2

	- separated original patch into two patches
	  (https://marc.info/?l=linux-iio&m=154047435605492)

Renato Lui Geh (2):
staging: iio: ad7780: update voltage on read
staging: iio: ad7780: fix offset read value

drivers/staging/iio/adc/ad7780.c | 6 +++++-

1 file changed, 5 insertions(+), 1 deletion(-)
Signature · 1 line
2.19.1
#1 lore raw

PATCH v2 1/2 staging: iio: ad7780: update voltage on read

The ad7780 driver previously did not read the correct device output, as it read an outdated value set at initialization. It now updates its voltage on read.

---
drivers/staging/iio/adc/ad7780.c | 4 ++++

1 file changed, 4 insertions(+)
drivers/staging/iio/adc/ad7780.c +0 -0
index b67412db0318..27972563bb6a 100644
@@ -87,11 +87,15 @@ static int ad7780_read_raw(struct iio_dev *indio_dev,

long m)

{
	struct ad7780_state *st = iio_priv(indio_dev);

+ int voltage_uv = 0;

	switch (m) {
	case IIO_CHAN_INFO_RAW:
		return ad_sigma_delta_single_conversion(indio_dev, chan, val);
	case IIO_CHAN_INFO_SCALE:
+		voltage_uv = regulator_get_voltage(st->reg);
+		if (voltage_uv)
+			st->int_vref_mv = voltage_uv/1000;
		*val = st->int_vref_mv * st->gain;
		*val2 = chan->scan_type.realbits - 1;
		return IIO_VAL_FRACTIONAL_LOG2;
Signature · 1 line
2.19.1
maintainer
#2 lore raw

Re: [PATCH v2 1/2] staging: iio: ad7780: update voltage on read

Quoted 14 lines · On Thu, 25 Oct 2018 19:30:04 -0300 Renato Lui Geh <[email protected]> wrote:

The ad7780 driver previously did not read the correct device output, as it read an outdated value set at initialization. It now updates its voltage on read.

---
 drivers/staging/iio/adc/ad7780.c | 4 ++++
 1 file changed, 4 insertions(+)
drivers/staging/iio/adc/ad7780.c +0 -0
index b67412db0318..27972563bb6a 100644

drivers/staging/iio/adc/ad7780.c static int ad7780_read_raw(struct iio_dev *indio_dev, · line 90

Quoted 4 lines
drivers/staging/iio/adc/ad7780.c +1 -0
@@ -87,11 +87,15 @@ static int ad7780_read_raw(struct iio_dev *indio_dev,
 			   long m)
 {
 	struct ad7780_state *st = iio_priv(indio_dev);
+	int voltage_uv = 0;

No initialization needed as it is always set in the paths where it is used (before it is used).

drivers/staging/iio/adc/ad7780.c static int ad7780_read_raw(struct iio_dev *indio_dev, · line 98

Quoted 9 lines
drivers/staging/iio/adc/ad7780.c +3 -0
 	switch (m) {
 	case IIO_CHAN_INFO_RAW:
 		return ad_sigma_delta_single_conversion(indio_dev, chan, val);
 	case IIO_CHAN_INFO_SCALE:
+		voltage_uv = regulator_get_voltage(st->reg);
+		if (voltage_uv)
+			st->int_vref_mv = voltage_uv/1000;
 		*val = st->int_vref_mv * st->gain;

Is there actually a reason (now) to have the stashed value of int_vref_mv in the state structure?

Also, I think we are always replacing the value that is retrieved in probe so we can drop reading it there as well.

Thanks,

Jonathan

Quoted 2 lines
drivers/staging/iio/adc/ad7780.c +0 -0
 		*val2 = chan->scan_type.realbits - 1;
 		return IIO_VAL_FRACTIONAL_LOG2;
#3 lore raw

Re: [PATCH v2 1/2] staging: iio: ad7780: update voltage on read

Hi Jonathan,

Thank you for the review.

Quoted 6 lines

Review

Quoted 4 lines
(quoted diff) +3 -0
+		voltage_uv = regulator_get_voltage(st->reg);
+		if (voltage_uv)
+			st->int_vref_mv = voltage_uv/1000;
 		*val = st->int_vref_mv * st->gain;

Is there actually a reason (now) to have the stashed value of int_vref_mv in the state structure?

From probe:

if (voltage_uv)

	st->int_vref_mv = voltage_uv / 1000;
else
	dev_warn(&spi->dev, "Reference voltage unspecified\n");

So the idea was to, when voltage_uv = 0, return the previous voltage. Should I instead handle this as an error the same way as in probe?

Thanks,
Renato

maintainer
#4 lore raw

Re: [PATCH v2 1/2] staging: iio: ad7780: update voltage on read

Quoted 13 lines · On Sun, 28 Oct 2018 13:52:32 -0300 Renato Lui Geh <[email protected]> wrote:

Hi Jonathan,

Thank you for the review.

Quoted 6 lines

Review

Quoted 4 lines
(quoted diff) +3 -0
+		voltage_uv = regulator_get_voltage(st->reg);
+		if (voltage_uv)
+			st->int_vref_mv = voltage_uv/1000;
 		*val = st->int_vref_mv * st->gain;  

Is there actually a reason (now) to have the stashed value of int_vref_mv in the state structure?

From probe:

Quoted 8 lines

if (voltage_uv)

	st->int_vref_mv = voltage_uv / 1000;
else
	dev_warn(&spi->dev, "Reference voltage unspecified\n");

So the idea was to, when voltage_uv = 0, return the previous voltage. Should I instead handle this as an error the same way as in probe?

I would return it as an error. I can't really see how we would get this to occur if the bindings are all correct and appropriate driver support is there for the regulator to actually let us use it.

If we wanted to handle the case of no regulator having been provided cleanly then we should it using an optional regulator get, and not provide the scale attribute at all if we can't know what it will read. This is a weird enough corner case though that I just wouldn't bother handling it as anything other than an error.

Quoted 2 lines

Thanks,
Renato

Thanks,

Jonathan

#5 lore raw

PATCH v2 2/2 staging: iio: ad7780: fix offset read value

In reply to Renato Lui Geh

Variable val subtracted an uninitialized value on IIO_CHAN_INFO_OFFSET. This was fixed by assigning the correct value instead.

---
drivers/staging/iio/adc/ad7780.c | 2 +-

1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/iio/adc/ad7780.c +0 -0
index 27972563bb6a..06700fe554a2 100644
@@ -100,7 +100,7 @@ static int ad7780_read_raw(struct iio_dev *indio_dev,
		*val2 = chan->scan_type.realbits - 1;
		return IIO_VAL_FRACTIONAL_LOG2;
	case IIO_CHAN_INFO_OFFSET:
-		*val -= (1 << (chan->scan_type.realbits - 1));
+		*val = -(1 << (chan->scan_type.realbits - 1));
		return IIO_VAL_INT;
	}
Signature · 1 line
2.19.1
maintainer
#6 lore raw

Re: [PATCH v2 2/2] staging: iio: ad7780: fix offset read value

Quoted 4 lines · On Thu, 25 Oct 2018 19:30:37 -0300 Renato Lui Geh <[email protected]> wrote:

Variable val subtracted an uninitialized value on IIO_CHAN_INFO_OFFSET. This was fixed by assigning the correct value instead.

It obviously doesn't make much difference, but as you are respinning anyway... Please could you always put fixes at the beginning of a set as it makes it easier to back port them. It think this one is simple enough that it is worth applying to the stable kernels.

(naturally I could do that anyway as the rebase is trivial, so I'm just encouraging good practice by asking you to do it in v3!)

Thanks,

Jonathan

Quoted 17 lines
---
 drivers/staging/iio/adc/ad7780.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/iio/adc/ad7780.c +1 -1
index 27972563bb6a..06700fe554a2 100644
@@ -100,7 +100,7 @@ static int ad7780_read_raw(struct iio_dev *indio_dev,
 		*val2 = chan->scan_type.realbits - 1;
 		return IIO_VAL_FRACTIONAL_LOG2;
 	case IIO_CHAN_INFO_OFFSET:
-		*val -= (1 << (chan->scan_type.realbits - 1));
+		*val = -(1 << (chan->scan_type.realbits - 1));
 		return IIO_VAL_INT;
 	}