Hi Jonathan, only patch 1 fixes a bug which is occurring on systems. In my test it happened every one of about 10 - 15.000 measurements. But this depends on the interrupt load of the system. With a high interrupt load there might be much more wrong measurements. Patch 2 is a performance optimization which prevents unneded reads. There is no bug which is fixed by it. I'll send out the patch set with more detailed commit messages. Thanks, Andreas Jonathan Cameron <jic23@xxxxxxxxxx> schrieb am So, 08. Sep 14:49: > On Sat, 7 Sep 2019 12:18:00 +0200 > Andreas Klinger <ak@xxxxxxxxxxxxx> wrote: > > > Fix bug in sampling function hx711_cycle() when interrupt occures while > > PD_SCK is high. If PD_SCK is high for at least 60 us power down mode of > > the sensor is entered which in turn leads to a wrong measurement. > > > > Move query of DOUT at the latest point of time which is at the end of > > PD_SCK low period. > > > > Signed-off-by: Andreas Klinger <ak@xxxxxxxxxxxxx> > > Hi Andreas, > > One thing I'm not clear on from these is how much a 'fix' they > are. That just effects whether we mark them for stable / push them > out as quickly as possible or not. So has this been seen in > normal operation? > > + please add fixes tags to the two fixes. > > For patch 3, it's in the very low importance category so it may > well get forgotten if these two go through the fixes tree > (up to you to remind me!) > > Thanks, > > Jonathan > > > --- > > drivers/iio/adc/hx711.c | 9 +++++---- > > 1 file changed, 5 insertions(+), 4 deletions(-) > > > > diff --git a/drivers/iio/adc/hx711.c b/drivers/iio/adc/hx711.c > > index 88c7fe15003b..0678964dbd21 100644 > > --- a/drivers/iio/adc/hx711.c > > +++ b/drivers/iio/adc/hx711.c > > @@ -101,13 +101,14 @@ struct hx711_data { > > static int hx711_cycle(struct hx711_data *hx711_data) > > { > > int val; > > + unsigned long flags; > > > > /* > > * if preempted for more then 60us while PD_SCK is high: > > * hx711 is going in reset > > * ==> measuring is false > > */ > > - preempt_disable(); > > + local_irq_save(flags); > > gpiod_set_value(hx711_data->gpiod_pd_sck, 1); > > > > /* > > @@ -117,7 +118,6 @@ static int hx711_cycle(struct hx711_data *hx711_data) > > */ > > ndelay(hx711_data->data_ready_delay_ns); > > > > - val = gpiod_get_value(hx711_data->gpiod_dout); > > /* > > * here we are not waiting for 0.2 us as suggested by the datasheet, > > * because the oscilloscope showed in a test scenario > > @@ -125,7 +125,7 @@ static int hx711_cycle(struct hx711_data *hx711_data) > > * and 0.56 us for PD_SCK low on TI Sitara with 800 MHz > > */ > > gpiod_set_value(hx711_data->gpiod_pd_sck, 0); > > - preempt_enable(); > > + local_irq_restore(flags); > > > > /* > > * make it a square wave for addressing cases with capacitance on > > @@ -133,7 +133,8 @@ static int hx711_cycle(struct hx711_data *hx711_data) > > */ > > ndelay(hx711_data->data_ready_delay_ns); > > > > - return val; > > + /* sample as late as possible */ > > + return gpiod_get_value(hx711_data->gpiod_dout); > > } > > > > static int hx711_read(struct hx711_data *hx711_data) > -- Andreas Klinger Grabenreith 27 84508 Burgkirchen +49 8623 919966 ak@xxxxxxxxxxxxx www.it-klinger.de www.grabenreith.de