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);