/***************************************************************************** AudioScience HPI driver Copyright (C) 1997-2011 AudioScience Inc. This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation; This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Debug macros. *****************************************************************************/ #ifndef _HPIDEBUG_H #define _HPIDEBUG_H #include "hpi_internal.h" /* Define debugging levels. */ enum { HPI_DEBUG_LEVEL_ERROR = 0, /* always log errors */ HPI_DEBUG_LEVEL_WARNING = 1, HPI_DEBUG_LEVEL_NOTICE = 2, HPI_DEBUG_LEVEL_INFO = 3, HPI_DEBUG_LEVEL_DEBUG = 4, HPI_DEBUG_LEVEL_VERBOSE = 5 /* same printk level as DEBUG */ }; #define HPI_DEBUG_LEVEL_DEFAULT HPI_DEBUG_LEVEL_NOTICE /* an OS can define an extra flag string that is appended to the start of each message, eg see linux kernel hpios.h */ #ifdef SOURCEFILE_NAME #define FILE_LINE SOURCEFILE_NAME ":" __stringify(__LINE__) " " #else #define FILE_LINE __FILE__ ":" __stringify(__LINE__) " " #endif #define HPI_DEBUG_ASSERT(expression) \ do { \ if (!(expression)) { \ printk(KERN_ERR FILE_LINE \ "ASSERT " __stringify(expression)); \ } \ } while (0) #define HPI_DEBUG_LOG(level, ...) \ do { \ if (hpi_debug_level >= HPI_DEBUG_LEVEL_##level) { \ printk(HPI_DEBUG_FLAG_##level \ FILE_LINE __VA_ARGS__); \ } \ } while (0) void hpi_debug_init(void); int hpi_debug_level_set(int level); int hpi_debug_level_get(void); /* needed by Linux driver for dynamic debug level changes */ extern int hpi_debug_level; void hpi_debug_message(struct hpi_message *phm, char *sz_fileline); void hpi_debug_data(u16 *pdata, u32 len); #define HPI_DEBUG_DATA(pdata, len) \ do { \ if (hpi_debug_level >= HPI_DEBUG_LEVEL_VERBOSE) \ hpi_debug_data(pdata, len); \ } while (0) #define HPI_DEBUG_MESSAGE(level, phm) \ do { \ if (hpi_debug_level >= HPI_DEBUG_LEVEL_##level) { \ hpi_debug_message(phm, HPI_DEBUG_FLAG_##level \ FILE_LINE __stringify(level)); \ } \ } while (0) #define HPI_DEBUG_RESPONSE(phr) \ do { \ if (((hpi_debug_level >= HPI_DEBUG_LEVEL_DEBUG) && \ (phr->error)) ||\ (hpi_debug_level >= HPI_DEBUG_LEVEL_VERBOSE)) \ printk(KERN_DEBUG "HPI_RES%d,%d,%d\n", \ phr->version, phr->error, phr->specific_error); \ } while (0) #ifndef compile_time_assert #define compile_time_assert(cond, msg) \ typedef char msg[(cond) ? 1 : -1] #endif #endif /* _HPIDEBUG_H_ */ ate-remove&id=5c113b5e0082e90d2e1c7b12e96a7b8cf0623e27'>root/drivers/usb/serial/metro-usb.c
diff options
context:
space:
mode:
authorJohn Brooks <john@fastquake.com>2017-01-18 21:50:39 +0000
committerJonathan Cameron <jic23@kernel.org>2017-01-22 13:35:40 +0000
commit5c113b5e0082e90d2e1c7b12e96a7b8cf0623e27 (patch)
treecaf374a799c6c5f8bdf865d7fc0e936e9685f4ca /drivers/usb/serial/metro-usb.c
parentd1aaf20ee655888c227d5137b7a63551f8d15416 (diff)
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>
Diffstat (limited to 'drivers/usb/serial/metro-usb.c')