summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Klinger <ak@it-klinger.de>2017-12-13 18:10:34 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-01-08 16:03:42 +0100
commit1fe899e3ed504b3c982157ba44a3d66970dac6e4 (patch)
treea3a6ad21bf825e86dcf2b7afc0b3721b59e71aa9
parentd3bf60450d47c180d6588ae0d0bb9ea7147718df (diff)
downloadlinux-stable-1fe899e3ed504b3c982157ba44a3d66970dac6e4.tar.gz
linux-stable-1fe899e3ed504b3c982157ba44a3d66970dac6e4.tar.bz2
linux-stable-1fe899e3ed504b3c982157ba44a3d66970dac6e4.zip
iio: hx711: fix bug in reset functionality
Return value in hx711_reset() should indicate status of dout otherwise the calling function is reporting an error as false positive If there are two reads too close to each other, then the second one will never succeed. This happens especially when using buffered mode with both channels enabled. When changing the channel on every trigger event the former 100 ms are not enough for waiting until the device indicates normal mode. Wait up to 1 second until the device turns into normal mode. Signed-off-by: Andreas Klinger <ak@it-klinger.de> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/iio/adc/hx711.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/drivers/iio/adc/hx711.c b/drivers/iio/adc/hx711.c
index a38162ee7dcb..9430b54121e0 100644
--- a/drivers/iio/adc/hx711.c
+++ b/drivers/iio/adc/hx711.c
@@ -153,15 +153,16 @@ static int hx711_wait_for_ready(struct hx711_data *hx711_data)
int i, val;
/*
- * a maximum reset cycle time of 56 ms was measured.
- * we round it up to 100 ms
+ * in some rare cases the reset takes quite a long time
+ * especially when the channel is changed.
+ * Allow up to one second for it
*/
for (i = 0; i < 100; i++) {
val = gpiod_get_value(hx711_data->gpiod_dout);
if (!val)
break;
- /* sleep at least 1 ms */
- msleep(1);
+ /* sleep at least 10 ms */
+ msleep(10);
}
if (val)
return -EIO;
@@ -203,9 +204,7 @@ static int hx711_reset(struct hx711_data *hx711_data)
* after a dummy read we need to wait vor readiness
* for not mixing gain pulses with the clock
*/
- ret = hx711_wait_for_ready(hx711_data);
- if (ret)
- return ret;
+ val = hx711_wait_for_ready(hx711_data);
}
return val;