Lines Matching refs:dht11
60 struct dht11 { struct
93 static int dht11_decode(struct dht11 *dht11, int offset, int timeres) in dht11_decode() argument
104 t = dht11->edges[offset + 2 * i + 2].ts - in dht11_decode()
105 dht11->edges[offset + 2 * i + 1].ts; in dht11_decode()
106 if (!dht11->edges[offset + 2 * i + 1].value) in dht11_decode()
120 dht11->timestamp = ktime_get_real_ns(); in dht11_decode()
122 dht11->temperature = (((temp_int & 0x7f) << 8) + temp_dec) * in dht11_decode()
124 dht11->humidity = ((hum_int << 8) + hum_dec) * 100; in dht11_decode()
126 dht11->temperature = temp_int * 1000; in dht11_decode()
127 dht11->humidity = hum_int * 1000; in dht11_decode()
129 dev_err(dht11->dev, in dht11_decode()
144 struct dht11 *dht11 = iio_priv(iio); in dht11_handle_irq() local
147 if (dht11->num_edges < DHT11_EDGES_PER_READ && dht11->num_edges >= 0) { in dht11_handle_irq()
148 dht11->edges[dht11->num_edges].ts = ktime_get_real_ns(); in dht11_handle_irq()
149 dht11->edges[dht11->num_edges++].value = in dht11_handle_irq()
150 gpio_get_value(dht11->gpio); in dht11_handle_irq()
152 if (dht11->num_edges >= DHT11_EDGES_PER_READ) in dht11_handle_irq()
153 complete(&dht11->completion); in dht11_handle_irq()
163 struct dht11 *dht11 = iio_priv(iio_dev); in dht11_read_raw() local
166 mutex_lock(&dht11->lock); in dht11_read_raw()
167 if (dht11->timestamp + DHT11_DATA_VALID_TIME < ktime_get_real_ns()) { in dht11_read_raw()
170 dev_err(dht11->dev, "timeresolution %dns too low\n", in dht11_read_raw()
180 reinit_completion(&dht11->completion); in dht11_read_raw()
182 dht11->num_edges = 0; in dht11_read_raw()
183 ret = gpio_direction_output(dht11->gpio, 0); in dht11_read_raw()
187 ret = gpio_direction_input(dht11->gpio); in dht11_read_raw()
191 ret = request_irq(dht11->irq, dht11_handle_irq, in dht11_read_raw()
197 ret = wait_for_completion_killable_timeout(&dht11->completion, in dht11_read_raw()
200 free_irq(dht11->irq, iio_dev); in dht11_read_raw()
202 if (ret == 0 && dht11->num_edges < DHT11_EDGES_PER_READ - 1) { in dht11_read_raw()
205 dht11->num_edges); in dht11_read_raw()
211 ret = dht11_decode(dht11, in dht11_read_raw()
212 dht11->num_edges == DHT11_EDGES_PER_READ ? in dht11_read_raw()
222 *val = dht11->temperature; in dht11_read_raw()
224 *val = dht11->humidity; in dht11_read_raw()
228 dht11->num_edges = -1; in dht11_read_raw()
229 mutex_unlock(&dht11->lock); in dht11_read_raw()
255 struct dht11 *dht11; in dht11_probe() local
259 iio = devm_iio_device_alloc(dev, sizeof(*dht11)); in dht11_probe()
265 dht11 = iio_priv(iio); in dht11_probe()
266 dht11->dev = dev; in dht11_probe()
271 dht11->gpio = ret; in dht11_probe()
272 ret = devm_gpio_request_one(dev, dht11->gpio, GPIOF_IN, pdev->name); in dht11_probe()
276 dht11->irq = gpio_to_irq(dht11->gpio); in dht11_probe()
277 if (dht11->irq < 0) { in dht11_probe()
278 dev_err(dev, "GPIO %d has no interrupt\n", dht11->gpio); in dht11_probe()
282 dht11->timestamp = ktime_get_real_ns() - DHT11_DATA_VALID_TIME - 1; in dht11_probe()
283 dht11->num_edges = -1; in dht11_probe()
287 init_completion(&dht11->completion); in dht11_probe()
288 mutex_init(&dht11->lock); in dht11_probe()