linux/drivers/iio
John Brooks 5c113b5e00 iio: dht11: Use usleep_range instead of msleep for start signal
The DHT22 (AM2302) datasheet specifies that the LOW start pulse should not
exceed 20ms. However, observations with an oscilloscope of an RPi Model 2B
(rev 1.1) communicating with a DHT22 sensor showed that the driver was
consistently sending start pulses longer than 20ms:

Kernel 4.7.10-v7+ (n=132):
    Minimum pulse length: 20.20ms
    Maximum:              29.84ms
    Mean:                 24.96ms
    StDev:                2.82ms
    Sensor response rate: 100%
    Read success rate:    76%

On kernel 4.8, the start pulse was so long that the sensor would not even
respond 97% of the time:

Kernel 4.8.16-v7+ (n=100):
    Minimum pulse length: 30.4ms
    Maximum:              74.4ms
    Mean:                 39.3ms
    StDev:                10.2ms
    Sensor response rate: 3%
    Read success rate:    3%

The driver would return ETIMEDOUT and write log messages like this:

[   51.430987] dht11 dht11@0: Only 1 signal edges detected
[   66.311019] dht11 dht11@0: Only 0 signal edges detected

Replacing msleep(18) with usleep_range(18000, 20000) made the pulse length
sane again and restored responsiveness:

Kernel 4.8.16-v7+ with usleep_range (n=123):
    Minimum pulse length: 18.16ms
    Maximum:              20.20ms
    Mean:                 19.85ms
    StDev:                0.51ms
    Sensor response rate: 100%
    Read success rate:    84%

Cc: stable@vger.kernel.org
Signed-off-by: John Brooks <john@fastquake.com>
Reviewed-by: Harald Geyer <harald@ccbib.org>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
2017-01-22 13:35:40 +00:00
..
accel iio: accel: st_accel: fix LIS3LV02 reading and scaling 2016-12-31 14:35:04 +00:00
adc iio: adc: palmas_gpadc: retrieve a valid iio_dev in suspend/resume 2017-01-21 14:26:03 +00:00
amplifiers
buffer
chemical
common iio: accel: st_accel: fix LIS3LV02 reading and scaling 2016-12-31 14:35:04 +00:00
counter iio: 104-quad-8: Fix active level mismatch for the preset enable option 2016-12-03 10:08:09 +00:00
dac iio: dpot-dac: DAC driver based on a digital potentiometer 2016-11-13 13:07:15 +00:00
dummy
frequency
gyro iio: gyro: st_gyro: inline per-sensor data 2016-11-12 15:38:09 +00:00
health iio: health: max30100: fixed parenthesis around FIFO count check 2017-01-21 14:16:20 +00:00
humidity iio: dht11: Use usleep_range instead of msleep for start signal 2017-01-22 13:35:40 +00:00
imu iio: bmi160: Fix time needed to sleep after command execution 2016-12-30 10:52:00 +00:00
light iio: max44000: correct value in illuminance_integration_time_available 2016-12-30 20:20:23 +00:00
magnetometer iio: magnetometer: separate the values of attributes based on their usage type for HID compass sensor 2016-11-24 20:41:30 +00:00
orientation iio: orientation: hid-sensor-rotation: Add PM function (fix non working driver) 2016-11-05 17:47:47 +00:00
potentiometer iio: mcp4531: provide range of available raw values 2016-11-13 11:40:26 +00:00
potentiostat
pressure iio: pressure: st_pressure: inline per-sensor data 2016-11-12 15:50:10 +00:00
proximity
temperature iio: maxim_thermocouple: detect invalid storage size in read() 2016-11-13 10:08:32 +01:00
trigger ktime: Cleanup ktime_set() usage 2016-12-25 17:21:22 +01:00
iio_core_trigger.h
iio_core.h
industrialio-buffer.c
industrialio-configfs.c
industrialio-core.c iio:core: add a callback to allow drivers to provide _available attributes 2016-11-13 11:40:25 +00:00
industrialio-event.c
industrialio-sw-device.c
industrialio-sw-trigger.c
industrialio-trigger.c
industrialio-triggered-event.c
inkern.c iio: inkern: add helpers to query available values from channels 2016-11-13 11:40:26 +00:00
Kconfig
Makefile