All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] iio: dht11: Use boottime
@ 2016-01-27 22:46 Abhilash Jindal
  2016-01-30 17:50 ` Jonathan Cameron
  0 siblings, 1 reply; 6+ messages in thread
From: Abhilash Jindal @ 2016-01-27 22:46 UTC (permalink / raw)
  To: linux-iio; +Cc: jic23, Abhilash Jindal

Wall time obtained from ktime_get_real_ns is susceptible to sudden jumps due to
user setting the time or due to NTP.  Boot time is constantly increasing time
better suited for comparing two timestamps.

Signed-off-by: Abhilash Jindal <klock.android@gmail.com>
---
 drivers/iio/humidity/dht11.c |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/iio/humidity/dht11.c b/drivers/iio/humidity/dht11.c
index 1165b1c..cfc5a05 100644
--- a/drivers/iio/humidity/dht11.c
+++ b/drivers/iio/humidity/dht11.c
@@ -117,7 +117,7 @@ static int dht11_decode(struct dht11 *dht11, int offset, int timeres)
 	if (((hum_int + hum_dec + temp_int + temp_dec) & 0xff) != checksum)
 		return -EIO;
 
-	dht11->timestamp = ktime_get_real_ns();
+	dht11->timestamp = ktime_get_boot_ns();
 	if (hum_int < 20) {  /* DHT22 */
 		dht11->temperature = (((temp_int & 0x7f) << 8) + temp_dec) *
 					((temp_int & 0x80) ? -100 : 100);
@@ -145,7 +145,7 @@ static irqreturn_t dht11_handle_irq(int irq, void *data)
 
 	/* TODO: Consider making the handler safe for IRQ sharing */
 	if (dht11->num_edges < DHT11_EDGES_PER_READ && dht11->num_edges >= 0) {
-		dht11->edges[dht11->num_edges].ts = ktime_get_real_ns();
+		dht11->edges[dht11->num_edges].ts = ktime_get_boot_ns();
 		dht11->edges[dht11->num_edges++].value =
 						gpio_get_value(dht11->gpio);
 
@@ -164,7 +164,7 @@ static int dht11_read_raw(struct iio_dev *iio_dev,
 	int ret, timeres;
 
 	mutex_lock(&dht11->lock);
-	if (dht11->timestamp + DHT11_DATA_VALID_TIME < ktime_get_real_ns()) {
+	if (dht11->timestamp + DHT11_DATA_VALID_TIME < ktime_get_boot_ns()) {
 		timeres = ktime_get_resolution_ns();
 		if (DHT11_DATA_BIT_HIGH < 2 * timeres) {
 			dev_err(dht11->dev, "timeresolution %dns too low\n",
@@ -279,7 +279,7 @@ static int dht11_probe(struct platform_device *pdev)
 		return -EINVAL;
 	}
 
-	dht11->timestamp = ktime_get_real_ns() - DHT11_DATA_VALID_TIME - 1;
+	dht11->timestamp = ktime_get_boot_ns() - DHT11_DATA_VALID_TIME - 1;
 	dht11->num_edges = -1;
 
 	platform_set_drvdata(pdev, iio);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] iio: dht11: Use boottime
  2016-01-27 22:46 [PATCH] iio: dht11: Use boottime Abhilash Jindal
@ 2016-01-30 17:50 ` Jonathan Cameron
  2016-01-30 19:11   ` Harald Geyer
  0 siblings, 1 reply; 6+ messages in thread
From: Jonathan Cameron @ 2016-01-30 17:50 UTC (permalink / raw)
  To: Abhilash Jindal, linux-iio, Richard Weinberger, Harald Geyer

On 27/01/16 22:46, Abhilash Jindal wrote:
> Wall time obtained from ktime_get_real_ns is susceptible to sudden jumps due to
> user setting the time or due to NTP.  Boot time is constantly increasing time
> better suited for comparing two timestamps.
> 
> Signed-off-by: Abhilash Jindal <klock.android@gmail.com>
Seems sensible to me, but would like Richard / Harald to take a quick
look before I apply it.

Thanks,

Jonathan
> ---
>  drivers/iio/humidity/dht11.c |    8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/iio/humidity/dht11.c b/drivers/iio/humidity/dht11.c
> index 1165b1c..cfc5a05 100644
> --- a/drivers/iio/humidity/dht11.c
> +++ b/drivers/iio/humidity/dht11.c
> @@ -117,7 +117,7 @@ static int dht11_decode(struct dht11 *dht11, int offset, int timeres)
>  	if (((hum_int + hum_dec + temp_int + temp_dec) & 0xff) != checksum)
>  		return -EIO;
>  
> -	dht11->timestamp = ktime_get_real_ns();
> +	dht11->timestamp = ktime_get_boot_ns();
>  	if (hum_int < 20) {  /* DHT22 */
>  		dht11->temperature = (((temp_int & 0x7f) << 8) + temp_dec) *
>  					((temp_int & 0x80) ? -100 : 100);
> @@ -145,7 +145,7 @@ static irqreturn_t dht11_handle_irq(int irq, void *data)
>  
>  	/* TODO: Consider making the handler safe for IRQ sharing */
>  	if (dht11->num_edges < DHT11_EDGES_PER_READ && dht11->num_edges >= 0) {
> -		dht11->edges[dht11->num_edges].ts = ktime_get_real_ns();
> +		dht11->edges[dht11->num_edges].ts = ktime_get_boot_ns();
>  		dht11->edges[dht11->num_edges++].value =
>  						gpio_get_value(dht11->gpio);
>  
> @@ -164,7 +164,7 @@ static int dht11_read_raw(struct iio_dev *iio_dev,
>  	int ret, timeres;
>  
>  	mutex_lock(&dht11->lock);
> -	if (dht11->timestamp + DHT11_DATA_VALID_TIME < ktime_get_real_ns()) {
> +	if (dht11->timestamp + DHT11_DATA_VALID_TIME < ktime_get_boot_ns()) {
>  		timeres = ktime_get_resolution_ns();
>  		if (DHT11_DATA_BIT_HIGH < 2 * timeres) {
>  			dev_err(dht11->dev, "timeresolution %dns too low\n",
> @@ -279,7 +279,7 @@ static int dht11_probe(struct platform_device *pdev)
>  		return -EINVAL;
>  	}
>  
> -	dht11->timestamp = ktime_get_real_ns() - DHT11_DATA_VALID_TIME - 1;
> +	dht11->timestamp = ktime_get_boot_ns() - DHT11_DATA_VALID_TIME - 1;
>  	dht11->num_edges = -1;
>  
>  	platform_set_drvdata(pdev, iio);
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] iio: dht11: Use boottime
  2016-01-30 17:50 ` Jonathan Cameron
@ 2016-01-30 19:11   ` Harald Geyer
  2016-01-31  5:08     ` Abhilash Jindal
  0 siblings, 1 reply; 6+ messages in thread
From: Harald Geyer @ 2016-01-30 19:11 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Abhilash Jindal, linux-iio, Richard Weinberger, Harald Geyer

Jonathan Cameron writes:
> On 27/01/16 22:46, Abhilash Jindal wrote:
> > Wall time obtained from ktime_get_real_ns is susceptible to sudden jumps due to
> > user setting the time or due to NTP.  Boot time is constantly increasing time
> > better suited for comparing two timestamps.
> > 
> > Signed-off-by: Abhilash Jindal <klock.android@gmail.com>
> Seems sensible to me, but would like Richard / Harald to take a quick
> look before I apply it.

Reviewed-by: Harald Geyer <harald@ccbib.org>

I can't test this right now, but I think it will fix an odd issue I
have seen in a log file (apparently was completely off track debugging it).
As this very likely is a real world issue, I'd recommend applying the patch
to the fixes branch, so that it hopefully gets picked up for LTS kernels.

I used ktime_get_real_ns() because that is what iio_get_time_ns() uses.
I should have thought about this twice - sorry about being sloppy!

I just grepped the other iio drivers and none is using iio_get_time_ns() in
a comparision like dht11 did, so maybe the other uses are safe. However
I couldn't check variables containing timestamps that way, so maybe
reviewing the users of iio_get_time_ns(), whether wall time is actually
what is wanted, would be a worthwhile task if somebody has the time ...

Thanks for the patch!
Harald

> Thanks,
> 
> Jonathan
> > ---
> >  drivers/iio/humidity/dht11.c |    8 ++++----
> >  1 file changed, 4 insertions(+), 4 deletions(-)
> > 
> > diff --git a/drivers/iio/humidity/dht11.c b/drivers/iio/humidity/dht11.c
> > index 1165b1c..cfc5a05 100644
> > --- a/drivers/iio/humidity/dht11.c
> > +++ b/drivers/iio/humidity/dht11.c
> > @@ -117,7 +117,7 @@ static int dht11_decode(struct dht11 *dht11, int offset, int timeres)
> >  	if (((hum_int + hum_dec + temp_int + temp_dec) & 0xff) != checksum)
> >  		return -EIO;
> >  
> > -	dht11->timestamp = ktime_get_real_ns();
> > +	dht11->timestamp = ktime_get_boot_ns();
> >  	if (hum_int < 20) {  /* DHT22 */
> >  		dht11->temperature = (((temp_int & 0x7f) << 8) + temp_dec) *
> >  					((temp_int & 0x80) ? -100 : 100);
> > @@ -145,7 +145,7 @@ static irqreturn_t dht11_handle_irq(int irq, void *data)
> >  
> >  	/* TODO: Consider making the handler safe for IRQ sharing */
> >  	if (dht11->num_edges < DHT11_EDGES_PER_READ && dht11->num_edges >= 0) {
> > -		dht11->edges[dht11->num_edges].ts = ktime_get_real_ns();
> > +		dht11->edges[dht11->num_edges].ts = ktime_get_boot_ns();
> >  		dht11->edges[dht11->num_edges++].value =
> >  						gpio_get_value(dht11->gpio);
> >  
> > @@ -164,7 +164,7 @@ static int dht11_read_raw(struct iio_dev *iio_dev,
> >  	int ret, timeres;
> >  
> >  	mutex_lock(&dht11->lock);
> > -	if (dht11->timestamp + DHT11_DATA_VALID_TIME < ktime_get_real_ns()) {
> > +	if (dht11->timestamp + DHT11_DATA_VALID_TIME < ktime_get_boot_ns()) {
> >  		timeres = ktime_get_resolution_ns();
> >  		if (DHT11_DATA_BIT_HIGH < 2 * timeres) {
> >  			dev_err(dht11->dev, "timeresolution %dns too low\n",
> > @@ -279,7 +279,7 @@ static int dht11_probe(struct platform_device *pdev)
> >  		return -EINVAL;
> >  	}
> >  
> > -	dht11->timestamp = ktime_get_real_ns() - DHT11_DATA_VALID_TIME - 1;
> > +	dht11->timestamp = ktime_get_boot_ns() - DHT11_DATA_VALID_TIME - 1;
> >  	dht11->num_edges = -1;
> >  
> >  	platform_set_drvdata(pdev, iio);
> > 
> 

-- 
If you want to support my work:
see http://friends.ccbib.org/harald/supporting/
or donate via peercoin to P98LRdhit3gZbHDBe7ta5jtXrMJUms4p7w
or bitcoin 1FUtd8T9jRN1rFz63vZz7s2fDtB6d6A7aS

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] iio: dht11: Use boottime
  2016-01-30 19:11   ` Harald Geyer
@ 2016-01-31  5:08     ` Abhilash Jindal
  2016-01-31 10:09       ` Harald Geyer
  0 siblings, 1 reply; 6+ messages in thread
From: Abhilash Jindal @ 2016-01-31  5:08 UTC (permalink / raw)
  To: Harald Geyer; +Cc: Jonathan Cameron, linux-iio, Richard Weinberger

[-- Attachment #1: Type: text/plain, Size: 4027 bytes --]

Thanks Harald and Jonathan.

I would absolutely love to know the symptoms of the odd issue you mentioned.

Cheers,
Abhilash

On Sat, Jan 30, 2016 at 2:11 PM, Harald Geyer <harald@ccbib.org> wrote:

> Jonathan Cameron writes:
> > On 27/01/16 22:46, Abhilash Jindal wrote:
> > > Wall time obtained from ktime_get_real_ns is susceptible to sudden
> jumps due to
> > > user setting the time or due to NTP.  Boot time is constantly
> increasing time
> > > better suited for comparing two timestamps.
> > >
> > > Signed-off-by: Abhilash Jindal <klock.android@gmail.com>
> > Seems sensible to me, but would like Richard / Harald to take a quick
> > look before I apply it.
>
> Reviewed-by: Harald Geyer <harald@ccbib.org>
>
> I can't test this right now, but I think it will fix an odd issue I
> have seen in a log file (apparently was completely off track debugging it).
> As this very likely is a real world issue, I'd recommend applying the patch
> to the fixes branch, so that it hopefully gets picked up for LTS kernels.
>
> I used ktime_get_real_ns() because that is what iio_get_time_ns() uses.
> I should have thought about this twice - sorry about being sloppy!
>
> I just grepped the other iio drivers and none is using iio_get_time_ns() in
> a comparision like dht11 did, so maybe the other uses are safe. However
> I couldn't check variables containing timestamps that way, so maybe
> reviewing the users of iio_get_time_ns(), whether wall time is actually
> what is wanted, would be a worthwhile task if somebody has the time ...
>
> Thanks for the patch!
> Harald
>
> > Thanks,
> >
> > Jonathan
> > > ---
> > >  drivers/iio/humidity/dht11.c |    8 ++++----
> > >  1 file changed, 4 insertions(+), 4 deletions(-)
> > >
> > > diff --git a/drivers/iio/humidity/dht11.c
> b/drivers/iio/humidity/dht11.c
> > > index 1165b1c..cfc5a05 100644
> > > --- a/drivers/iio/humidity/dht11.c
> > > +++ b/drivers/iio/humidity/dht11.c
> > > @@ -117,7 +117,7 @@ static int dht11_decode(struct dht11 *dht11, int
> offset, int timeres)
> > >     if (((hum_int + hum_dec + temp_int + temp_dec) & 0xff) != checksum)
> > >             return -EIO;
> > >
> > > -   dht11->timestamp = ktime_get_real_ns();
> > > +   dht11->timestamp = ktime_get_boot_ns();
> > >     if (hum_int < 20) {  /* DHT22 */
> > >             dht11->temperature = (((temp_int & 0x7f) << 8) + temp_dec)
> *
> > >                                     ((temp_int & 0x80) ? -100 : 100);
> > > @@ -145,7 +145,7 @@ static irqreturn_t dht11_handle_irq(int irq, void
> *data)
> > >
> > >     /* TODO: Consider making the handler safe for IRQ sharing */
> > >     if (dht11->num_edges < DHT11_EDGES_PER_READ && dht11->num_edges >=
> 0) {
> > > -           dht11->edges[dht11->num_edges].ts = ktime_get_real_ns();
> > > +           dht11->edges[dht11->num_edges].ts = ktime_get_boot_ns();
> > >             dht11->edges[dht11->num_edges++].value =
> > >
>  gpio_get_value(dht11->gpio);
> > >
> > > @@ -164,7 +164,7 @@ static int dht11_read_raw(struct iio_dev *iio_dev,
> > >     int ret, timeres;
> > >
> > >     mutex_lock(&dht11->lock);
> > > -   if (dht11->timestamp + DHT11_DATA_VALID_TIME <
> ktime_get_real_ns()) {
> > > +   if (dht11->timestamp + DHT11_DATA_VALID_TIME <
> ktime_get_boot_ns()) {
> > >             timeres = ktime_get_resolution_ns();
> > >             if (DHT11_DATA_BIT_HIGH < 2 * timeres) {
> > >                     dev_err(dht11->dev, "timeresolution %dns too
> low\n",
> > > @@ -279,7 +279,7 @@ static int dht11_probe(struct platform_device
> *pdev)
> > >             return -EINVAL;
> > >     }
> > >
> > > -   dht11->timestamp = ktime_get_real_ns() - DHT11_DATA_VALID_TIME - 1;
> > > +   dht11->timestamp = ktime_get_boot_ns() - DHT11_DATA_VALID_TIME - 1;
> > >     dht11->num_edges = -1;
> > >
> > >     platform_set_drvdata(pdev, iio);
> > >
> >
>
> --
> If you want to support my work:
> see http://friends.ccbib.org/harald/supporting/
> or donate via peercoin to P98LRdhit3gZbHDBe7ta5jtXrMJUms4p7w
> or bitcoin 1FUtd8T9jRN1rFz63vZz7s2fDtB6d6A7aS
>

[-- Attachment #2: Type: text/html, Size: 5565 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] iio: dht11: Use boottime
  2016-01-31  5:08     ` Abhilash Jindal
@ 2016-01-31 10:09       ` Harald Geyer
  2016-02-01  5:15         ` Abhilash Jindal
  0 siblings, 1 reply; 6+ messages in thread
From: Harald Geyer @ 2016-01-31 10:09 UTC (permalink / raw)
  To: Abhilash Jindal
  Cc: Harald Geyer, Jonathan Cameron, linux-iio, Richard Weinberger

Abhilash Jindal writes:
> Thanks Harald and Jonathan.
> 
> I would absolutely love to know the symptoms of the odd issue you mentioned.

Sure. What I was seeing was a number of zero humidity, zero temperature
values reported for some time after boot. Then the sensors started to work
normally.

Given that "all transmission bits zero" passes the checksum test, I thought
that maybe there is some ressource conflict of the irq line causing
edges to come in at way too fast pace. However the bug you found explains
it neatly if we assume that the system clock is set after probe() but before
the sensor is read for the first time and the zeros I saw in the log were
actually uninitialized memory.

Maybe setting
dht11->timestamp = ktime_get_real_ns() - DHT11_DATA_VALID_TIME - 1;
in probe() wasn't such a good idea.
dht11->timestamp = -1;
probably would have been more robust. But of course your patch is fixing
the true problem.

best regards,
Harald

> Cheers,
> Abhilash
> 
> On Sat, Jan 30, 2016 at 2:11 PM, Harald Geyer <harald@ccbib.org> wrote:
> 
> > Jonathan Cameron writes:
> > > On 27/01/16 22:46, Abhilash Jindal wrote:
> > > > Wall time obtained from ktime_get_real_ns is susceptible to sudden
> > jumps due to
> > > > user setting the time or due to NTP.  Boot time is constantly
> > increasing time
> > > > better suited for comparing two timestamps.
> > > >
> > > > Signed-off-by: Abhilash Jindal <klock.android@gmail.com>
> > > Seems sensible to me, but would like Richard / Harald to take a quick
> > > look before I apply it.
> >
> > Reviewed-by: Harald Geyer <harald@ccbib.org>
> >
> > I can't test this right now, but I think it will fix an odd issue I
> > have seen in a log file (apparently was completely off track debugging it).
> > As this very likely is a real world issue, I'd recommend applying the patch
> > to the fixes branch, so that it hopefully gets picked up for LTS kernels.
> >
> > I used ktime_get_real_ns() because that is what iio_get_time_ns() uses.
> > I should have thought about this twice - sorry about being sloppy!
> >
> > I just grepped the other iio drivers and none is using iio_get_time_ns() in
> > a comparision like dht11 did, so maybe the other uses are safe. However
> > I couldn't check variables containing timestamps that way, so maybe
> > reviewing the users of iio_get_time_ns(), whether wall time is actually
> > what is wanted, would be a worthwhile task if somebody has the time ...
> >
> > Thanks for the patch!
> > Harald
> >
> > > Thanks,
> > >
> > > Jonathan
> > > > ---
> > > >  drivers/iio/humidity/dht11.c |    8 ++++----
> > > >  1 file changed, 4 insertions(+), 4 deletions(-)
> > > >
> > > > diff --git a/drivers/iio/humidity/dht11.c
> > b/drivers/iio/humidity/dht11.c
> > > > index 1165b1c..cfc5a05 100644
> > > > --- a/drivers/iio/humidity/dht11.c
> > > > +++ b/drivers/iio/humidity/dht11.c
> > > > @@ -117,7 +117,7 @@ static int dht11_decode(struct dht11 *dht11, int
> > offset, int timeres)
> > > >     if (((hum_int + hum_dec + temp_int + temp_dec) & 0xff) != checksum)
> > > >             return -EIO;
> > > >
> > > > -   dht11->timestamp = ktime_get_real_ns();
> > > > +   dht11->timestamp = ktime_get_boot_ns();
> > > >     if (hum_int < 20) {  /* DHT22 */
> > > >             dht11->temperature = (((temp_int & 0x7f) << 8) + temp_dec)
> > *
> > > >                                     ((temp_int & 0x80) ? -100 : 100);
> > > > @@ -145,7 +145,7 @@ static irqreturn_t dht11_handle_irq(int irq, void
> > *data)
> > > >
> > > >     /* TODO: Consider making the handler safe for IRQ sharing */
> > > >     if (dht11->num_edges < DHT11_EDGES_PER_READ && dht11->num_edges >=
> > 0) {
> > > > -           dht11->edges[dht11->num_edges].ts = ktime_get_real_ns();
> > > > +           dht11->edges[dht11->num_edges].ts = ktime_get_boot_ns();
> > > >             dht11->edges[dht11->num_edges++].value =
> > > >
> >  gpio_get_value(dht11->gpio);
> > > >
> > > > @@ -164,7 +164,7 @@ static int dht11_read_raw(struct iio_dev *iio_dev,
> > > >     int ret, timeres;
> > > >
> > > >     mutex_lock(&dht11->lock);
> > > > -   if (dht11->timestamp + DHT11_DATA_VALID_TIME <
> > ktime_get_real_ns()) {
> > > > +   if (dht11->timestamp + DHT11_DATA_VALID_TIME <
> > ktime_get_boot_ns()) {
> > > >             timeres = ktime_get_resolution_ns();
> > > >             if (DHT11_DATA_BIT_HIGH < 2 * timeres) {
> > > >                     dev_err(dht11->dev, "timeresolution %dns too
> > low\n",
> > > > @@ -279,7 +279,7 @@ static int dht11_probe(struct platform_device
> > *pdev)
> > > >             return -EINVAL;
> > > >     }
> > > >
> > > > -   dht11->timestamp = ktime_get_real_ns() - DHT11_DATA_VALID_TIME - 1;
> > > > +   dht11->timestamp = ktime_get_boot_ns() - DHT11_DATA_VALID_TIME - 1;
> > > >     dht11->num_edges = -1;
> > > >
> > > >     platform_set_drvdata(pdev, iio);
> > > >
> > >
> >
> > --
> > If you want to support my work:
> > see http://friends.ccbib.org/harald/supporting/
> > or donate via peercoin to P98LRdhit3gZbHDBe7ta5jtXrMJUms4p7w
> > or bitcoin 1FUtd8T9jRN1rFz63vZz7s2fDtB6d6A7aS
> >
> 

-- 
If you want to support my work:
see http://friends.ccbib.org/harald/supporting/
or donate via peercoin to P98LRdhit3gZbHDBe7ta5jtXrMJUms4p7w
or bitcoin 1FUtd8T9jRN1rFz63vZz7s2fDtB6d6A7aS

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] iio: dht11: Use boottime
  2016-01-31 10:09       ` Harald Geyer
@ 2016-02-01  5:15         ` Abhilash Jindal
  0 siblings, 0 replies; 6+ messages in thread
From: Abhilash Jindal @ 2016-02-01  5:15 UTC (permalink / raw)
  To: Harald Geyer; +Cc: Jonathan Cameron, linux-iio, Richard Weinberger

[-- Attachment #1: Type: text/plain, Size: 5670 bytes --]

Great, thanks.

Best,
Abhilash

On Sun, Jan 31, 2016 at 5:09 AM, Harald Geyer <harald@ccbib.org> wrote:

> Abhilash Jindal writes:
> > Thanks Harald and Jonathan.
> >
> > I would absolutely love to know the symptoms of the odd issue you
> mentioned.
>
> Sure. What I was seeing was a number of zero humidity, zero temperature
> values reported for some time after boot. Then the sensors started to work
> normally.
>
> Given that "all transmission bits zero" passes the checksum test, I thought
> that maybe there is some ressource conflict of the irq line causing
> edges to come in at way too fast pace. However the bug you found explains
> it neatly if we assume that the system clock is set after probe() but
> before
> the sensor is read for the first time and the zeros I saw in the log were
> actually uninitialized memory.
>
> Maybe setting
> dht11->timestamp = ktime_get_real_ns() - DHT11_DATA_VALID_TIME - 1;
> in probe() wasn't such a good idea.
> dht11->timestamp = -1;
> probably would have been more robust. But of course your patch is fixing
> the true problem.
>
> best regards,
> Harald
>
> > Cheers,
> > Abhilash
> >
> > On Sat, Jan 30, 2016 at 2:11 PM, Harald Geyer <harald@ccbib.org> wrote:
> >
> > > Jonathan Cameron writes:
> > > > On 27/01/16 22:46, Abhilash Jindal wrote:
> > > > > Wall time obtained from ktime_get_real_ns is susceptible to sudden
> > > jumps due to
> > > > > user setting the time or due to NTP.  Boot time is constantly
> > > increasing time
> > > > > better suited for comparing two timestamps.
> > > > >
> > > > > Signed-off-by: Abhilash Jindal <klock.android@gmail.com>
> > > > Seems sensible to me, but would like Richard / Harald to take a quick
> > > > look before I apply it.
> > >
> > > Reviewed-by: Harald Geyer <harald@ccbib.org>
> > >
> > > I can't test this right now, but I think it will fix an odd issue I
> > > have seen in a log file (apparently was completely off track debugging
> it).
> > > As this very likely is a real world issue, I'd recommend applying the
> patch
> > > to the fixes branch, so that it hopefully gets picked up for LTS
> kernels.
> > >
> > > I used ktime_get_real_ns() because that is what iio_get_time_ns() uses.
> > > I should have thought about this twice - sorry about being sloppy!
> > >
> > > I just grepped the other iio drivers and none is using
> iio_get_time_ns() in
> > > a comparision like dht11 did, so maybe the other uses are safe. However
> > > I couldn't check variables containing timestamps that way, so maybe
> > > reviewing the users of iio_get_time_ns(), whether wall time is actually
> > > what is wanted, would be a worthwhile task if somebody has the time ...
> > >
> > > Thanks for the patch!
> > > Harald
> > >
> > > > Thanks,
> > > >
> > > > Jonathan
> > > > > ---
> > > > >  drivers/iio/humidity/dht11.c |    8 ++++----
> > > > >  1 file changed, 4 insertions(+), 4 deletions(-)
> > > > >
> > > > > diff --git a/drivers/iio/humidity/dht11.c
> > > b/drivers/iio/humidity/dht11.c
> > > > > index 1165b1c..cfc5a05 100644
> > > > > --- a/drivers/iio/humidity/dht11.c
> > > > > +++ b/drivers/iio/humidity/dht11.c
> > > > > @@ -117,7 +117,7 @@ static int dht11_decode(struct dht11 *dht11,
> int
> > > offset, int timeres)
> > > > >     if (((hum_int + hum_dec + temp_int + temp_dec) & 0xff) !=
> checksum)
> > > > >             return -EIO;
> > > > >
> > > > > -   dht11->timestamp = ktime_get_real_ns();
> > > > > +   dht11->timestamp = ktime_get_boot_ns();
> > > > >     if (hum_int < 20) {  /* DHT22 */
> > > > >             dht11->temperature = (((temp_int & 0x7f) << 8) +
> temp_dec)
> > > *
> > > > >                                     ((temp_int & 0x80) ? -100 :
> 100);
> > > > > @@ -145,7 +145,7 @@ static irqreturn_t dht11_handle_irq(int irq,
> void
> > > *data)
> > > > >
> > > > >     /* TODO: Consider making the handler safe for IRQ sharing */
> > > > >     if (dht11->num_edges < DHT11_EDGES_PER_READ &&
> dht11->num_edges >=
> > > 0) {
> > > > > -           dht11->edges[dht11->num_edges].ts =
> ktime_get_real_ns();
> > > > > +           dht11->edges[dht11->num_edges].ts =
> ktime_get_boot_ns();
> > > > >             dht11->edges[dht11->num_edges++].value =
> > > > >
> > >  gpio_get_value(dht11->gpio);
> > > > >
> > > > > @@ -164,7 +164,7 @@ static int dht11_read_raw(struct iio_dev
> *iio_dev,
> > > > >     int ret, timeres;
> > > > >
> > > > >     mutex_lock(&dht11->lock);
> > > > > -   if (dht11->timestamp + DHT11_DATA_VALID_TIME <
> > > ktime_get_real_ns()) {
> > > > > +   if (dht11->timestamp + DHT11_DATA_VALID_TIME <
> > > ktime_get_boot_ns()) {
> > > > >             timeres = ktime_get_resolution_ns();
> > > > >             if (DHT11_DATA_BIT_HIGH < 2 * timeres) {
> > > > >                     dev_err(dht11->dev, "timeresolution %dns too
> > > low\n",
> > > > > @@ -279,7 +279,7 @@ static int dht11_probe(struct platform_device
> > > *pdev)
> > > > >             return -EINVAL;
> > > > >     }
> > > > >
> > > > > -   dht11->timestamp = ktime_get_real_ns() - DHT11_DATA_VALID_TIME
> - 1;
> > > > > +   dht11->timestamp = ktime_get_boot_ns() - DHT11_DATA_VALID_TIME
> - 1;
> > > > >     dht11->num_edges = -1;
> > > > >
> > > > >     platform_set_drvdata(pdev, iio);
> > > > >
> > > >
> > >
> > > --
> > > If you want to support my work:
> > > see http://friends.ccbib.org/harald/supporting/
> > > or donate via peercoin to P98LRdhit3gZbHDBe7ta5jtXrMJUms4p7w
> > > or bitcoin 1FUtd8T9jRN1rFz63vZz7s2fDtB6d6A7aS
> > >
> >
>
> --
> If you want to support my work:
> see http://friends.ccbib.org/harald/supporting/
> or donate via peercoin to P98LRdhit3gZbHDBe7ta5jtXrMJUms4p7w
> or bitcoin 1FUtd8T9jRN1rFz63vZz7s2fDtB6d6A7aS
>

[-- Attachment #2: Type: text/html, Size: 7990 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2016-02-01  5:15 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-01-27 22:46 [PATCH] iio: dht11: Use boottime Abhilash Jindal
2016-01-30 17:50 ` Jonathan Cameron
2016-01-30 19:11   ` Harald Geyer
2016-01-31  5:08     ` Abhilash Jindal
2016-01-31 10:09       ` Harald Geyer
2016-02-01  5:15         ` Abhilash Jindal

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.