dht11 95 drivers/iio/humidity/dht11.c static void dht11_edges_print(struct dht11 *dht11) dht11 99 drivers/iio/humidity/dht11.c dev_dbg(dht11->dev, "%d edges detected:\n", dht11->num_edges); dht11 100 drivers/iio/humidity/dht11.c for (i = 1; i < dht11->num_edges; ++i) { dht11 101 drivers/iio/humidity/dht11.c dev_dbg(dht11->dev, "%d: %lld ns %s\n", i, dht11 102 drivers/iio/humidity/dht11.c dht11->edges[i].ts - dht11->edges[i - 1].ts, dht11 103 drivers/iio/humidity/dht11.c dht11->edges[i - 1].value ? "high" : "low"); dht11 122 drivers/iio/humidity/dht11.c static int dht11_decode(struct dht11 *dht11, int offset) dht11 129 drivers/iio/humidity/dht11.c t = dht11->edges[offset + 2 * i + 2].ts - dht11 130 drivers/iio/humidity/dht11.c dht11->edges[offset + 2 * i + 1].ts; dht11 131 drivers/iio/humidity/dht11.c if (!dht11->edges[offset + 2 * i + 1].value) { dht11 132 drivers/iio/humidity/dht11.c dev_dbg(dht11->dev, dht11 147 drivers/iio/humidity/dht11.c dev_dbg(dht11->dev, "invalid checksum\n"); dht11 151 drivers/iio/humidity/dht11.c dht11->timestamp = ktime_get_boottime_ns(); dht11 153 drivers/iio/humidity/dht11.c dht11->temperature = (((temp_int & 0x7f) << 8) + temp_dec) * dht11 155 drivers/iio/humidity/dht11.c dht11->humidity = ((hum_int << 8) + hum_dec) * 100; dht11 157 drivers/iio/humidity/dht11.c dht11->temperature = temp_int * 1000; dht11 158 drivers/iio/humidity/dht11.c dht11->humidity = hum_int * 1000; dht11 160 drivers/iio/humidity/dht11.c dev_err(dht11->dev, dht11 175 drivers/iio/humidity/dht11.c struct dht11 *dht11 = iio_priv(iio); dht11 178 drivers/iio/humidity/dht11.c if (dht11->num_edges < DHT11_EDGES_PER_READ && dht11->num_edges >= 0) { dht11 179 drivers/iio/humidity/dht11.c dht11->edges[dht11->num_edges].ts = ktime_get_boottime_ns(); dht11 180 drivers/iio/humidity/dht11.c dht11->edges[dht11->num_edges++].value = dht11 181 drivers/iio/humidity/dht11.c gpiod_get_value(dht11->gpiod); dht11 183 drivers/iio/humidity/dht11.c if (dht11->num_edges >= DHT11_EDGES_PER_READ) dht11 184 drivers/iio/humidity/dht11.c complete(&dht11->completion); dht11 194 drivers/iio/humidity/dht11.c struct dht11 *dht11 = iio_priv(iio_dev); dht11 197 drivers/iio/humidity/dht11.c mutex_lock(&dht11->lock); dht11 198 drivers/iio/humidity/dht11.c if (dht11->timestamp + DHT11_DATA_VALID_TIME < ktime_get_boottime_ns()) { dht11 200 drivers/iio/humidity/dht11.c dev_dbg(dht11->dev, "current timeresolution: %dns\n", timeres); dht11 202 drivers/iio/humidity/dht11.c dev_err(dht11->dev, "timeresolution %dns too low\n", dht11 212 drivers/iio/humidity/dht11.c dev_warn(dht11->dev, dht11 216 drivers/iio/humidity/dht11.c reinit_completion(&dht11->completion); dht11 218 drivers/iio/humidity/dht11.c dht11->num_edges = 0; dht11 219 drivers/iio/humidity/dht11.c ret = gpiod_direction_output(dht11->gpiod, 0); dht11 224 drivers/iio/humidity/dht11.c ret = gpiod_direction_input(dht11->gpiod); dht11 228 drivers/iio/humidity/dht11.c ret = request_irq(dht11->irq, dht11_handle_irq, dht11 234 drivers/iio/humidity/dht11.c ret = wait_for_completion_killable_timeout(&dht11->completion, dht11 237 drivers/iio/humidity/dht11.c free_irq(dht11->irq, iio_dev); dht11 240 drivers/iio/humidity/dht11.c dht11_edges_print(dht11); dht11 243 drivers/iio/humidity/dht11.c if (ret == 0 && dht11->num_edges < DHT11_EDGES_PER_READ - 1) { dht11 244 drivers/iio/humidity/dht11.c dev_err(dht11->dev, "Only %d signal edges detected\n", dht11 245 drivers/iio/humidity/dht11.c dht11->num_edges); dht11 252 drivers/iio/humidity/dht11.c dht11->num_edges - DHT11_EDGES_PER_READ; dht11 254 drivers/iio/humidity/dht11.c ret = dht11_decode(dht11, offset); dht11 265 drivers/iio/humidity/dht11.c *val = dht11->temperature; dht11 267 drivers/iio/humidity/dht11.c *val = dht11->humidity; dht11 271 drivers/iio/humidity/dht11.c dht11->num_edges = -1; dht11 272 drivers/iio/humidity/dht11.c mutex_unlock(&dht11->lock); dht11 296 drivers/iio/humidity/dht11.c struct dht11 *dht11; dht11 299 drivers/iio/humidity/dht11.c iio = devm_iio_device_alloc(dev, sizeof(*dht11)); dht11 305 drivers/iio/humidity/dht11.c dht11 = iio_priv(iio); dht11 306 drivers/iio/humidity/dht11.c dht11->dev = dev; dht11 307 drivers/iio/humidity/dht11.c dht11->gpiod = devm_gpiod_get(dev, NULL, GPIOD_IN); dht11 308 drivers/iio/humidity/dht11.c if (IS_ERR(dht11->gpiod)) dht11 309 drivers/iio/humidity/dht11.c return PTR_ERR(dht11->gpiod); dht11 311 drivers/iio/humidity/dht11.c dht11->irq = gpiod_to_irq(dht11->gpiod); dht11 312 drivers/iio/humidity/dht11.c if (dht11->irq < 0) { dht11 313 drivers/iio/humidity/dht11.c dev_err(dev, "GPIO %d has no interrupt\n", desc_to_gpio(dht11->gpiod)); dht11 317 drivers/iio/humidity/dht11.c dht11->timestamp = ktime_get_boottime_ns() - DHT11_DATA_VALID_TIME - 1; dht11 318 drivers/iio/humidity/dht11.c dht11->num_edges = -1; dht11 322 drivers/iio/humidity/dht11.c init_completion(&dht11->completion); dht11 323 drivers/iio/humidity/dht11.c mutex_init(&dht11->lock);