iio: dht11: Improve logging
authorHarald Geyer <harald@ccbib.org>
Sun, 17 Jan 2016 16:13:31 +0000 (16:13 +0000)
committerJonathan Cameron <jic23@kernel.org>
Sun, 10 Apr 2016 16:40:06 +0000 (17:40 +0100)
* Unify log messages
* Add more DEBUG messages

Apparently this driver is working unreliably on some platforms that I can't
test. Therefore I want an easy way for bug reporters to provide useful
information without making the driver too chatty by default.

Signed-off-by: Harald Geyer <harald@ccbib.org>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/humidity/dht11.c

index 20b500da94db3f5914cd7e0e2c1118f2a47ec979..9c47bc98f3acdea4cb4b56b23a72e582c34a413b 100644 (file)
@@ -96,6 +96,24 @@ struct dht11 {
        struct {s64 ts; int value; }    edges[DHT11_EDGES_PER_READ];
 };
 
+#ifdef CONFIG_DYNAMIC_DEBUG
+/*
+ * dht11_edges_print: show the data as actually received by the
+ *                    driver.
+ */
+static void dht11_edges_print(struct dht11 *dht11)
+{
+       int i;
+
+       dev_dbg(dht11->dev, "%d edges detected:\n", dht11->num_edges);
+       for (i = 1; i < dht11->num_edges; ++i) {
+               dev_dbg(dht11->dev, "%d: %lld ns %s\n", i,
+                       dht11->edges[i].ts - dht11->edges[i - 1].ts,
+                       dht11->edges[i - 1].value ? "high" : "low");
+       }
+}
+#endif /* CONFIG_DYNAMIC_DEBUG */
+
 static unsigned char dht11_decode_byte(char *bits)
 {
        unsigned char ret = 0;
@@ -119,8 +137,12 @@ static int dht11_decode(struct dht11 *dht11, int offset)
        for (i = 0; i < DHT11_BITS_PER_READ; ++i) {
                t = dht11->edges[offset + 2 * i + 2].ts -
                        dht11->edges[offset + 2 * i + 1].ts;
-               if (!dht11->edges[offset + 2 * i + 1].value)
-                       return -EIO;  /* lost synchronisation */
+               if (!dht11->edges[offset + 2 * i + 1].value) {
+                       dev_dbg(dht11->dev,
+                               "lost synchronisation at edge %d\n",
+                               offset + 2 * i + 1);
+                       return -EIO;
+               }
                bits[i] = t > DHT11_THRESHOLD;
        }
 
@@ -130,8 +152,10 @@ static int dht11_decode(struct dht11 *dht11, int offset)
        temp_dec = dht11_decode_byte(&bits[24]);
        checksum = dht11_decode_byte(&bits[32]);
 
-       if (((hum_int + hum_dec + temp_int + temp_dec) & 0xff) != checksum)
+       if (((hum_int + hum_dec + temp_int + temp_dec) & 0xff) != checksum) {
+               dev_dbg(dht11->dev, "invalid checksum\n");
                return -EIO;
+       }
 
        dht11->timestamp = ktime_get_boot_ns();
        if (hum_int < 20) {  /* DHT22 */
@@ -182,6 +206,7 @@ static int dht11_read_raw(struct iio_dev *iio_dev,
        mutex_lock(&dht11->lock);
        if (dht11->timestamp + DHT11_DATA_VALID_TIME < ktime_get_boot_ns()) {
                timeres = ktime_get_resolution_ns();
+               dev_dbg(dht11->dev, "current timeresolution: %dns\n", timeres);
                if (timeres > DHT11_MIN_TIMERES) {
                        dev_err(dht11->dev, "timeresolution %dns too low\n",
                                timeres);
@@ -219,10 +244,13 @@ static int dht11_read_raw(struct iio_dev *iio_dev,
 
                free_irq(dht11->irq, iio_dev);
 
+#ifdef CONFIG_DYNAMIC_DEBUG
+               dht11_edges_print(dht11);
+#endif
+
                if (ret == 0 && dht11->num_edges < DHT11_EDGES_PER_READ - 1) {
-                       dev_err(&iio_dev->dev,
-                               "Only %d signal edges detected\n",
-                                       dht11->num_edges);
+                       dev_err(dht11->dev, "Only %d signal edges detected\n",
+                               dht11->num_edges);
                        ret = -ETIMEDOUT;
                }
                if (ret < 0)