Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

W1: feature, w1_therm.c use strong pullup and documentation

Added strong pullup to thermal sensor driver and general documentation on
the sensor.

Signed-off-by: David Fries <david@fries.net>
Signed-off-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

David Fries and committed by
Linus Torvalds
6cd15974 6a158c0d

+60 -2
+2
Documentation/w1/00-INDEX
··· 1 1 00-INDEX 2 2 - This file 3 + slaves/ 4 + - Drivers that provide support for specific family codes. 3 5 masters/ 4 6 - Individual chips providing 1-wire busses. 5 7 w1.generic
+4
Documentation/w1/slaves/00-INDEX
··· 1 + 00-INDEX 2 + - This file 3 + w1_therm 4 + - The Maxim/Dallas Semiconductor ds18*20 temperature sensor.
+41
Documentation/w1/slaves/w1_therm
··· 1 + Kernel driver w1_therm 2 + ==================== 3 + 4 + Supported chips: 5 + * Maxim ds18*20 based temperature sensors. 6 + 7 + Author: Evgeniy Polyakov <johnpol@2ka.mipt.ru> 8 + 9 + 10 + Description 11 + ----------- 12 + 13 + w1_therm provides basic temperature conversion for ds18*20 devices. 14 + supported family codes: 15 + W1_THERM_DS18S20 0x10 16 + W1_THERM_DS1822 0x22 17 + W1_THERM_DS18B20 0x28 18 + 19 + Support is provided through the sysfs w1_slave file. Each open and 20 + read sequence will initiate a temperature conversion then provide two 21 + lines of ASCII output. The first line contains the nine hex bytes 22 + read along with a calculated crc value and YES or NO if it matched. 23 + If the crc matched the returned values are retained. The second line 24 + displays the retained values along with a temperature in millidegrees 25 + Centigrade after t=. 26 + 27 + Parasite powered devices are limited to one slave performing a 28 + temperature conversion at a time. If none of the devices are parasite 29 + powered it would be possible to convert all the devices at the same 30 + time and then go back to read individual sensors. That isn't 31 + currently supported. The driver also doesn't support reduced 32 + precision (which would also reduce the conversion time). 33 + 34 + The module parameter strong_pullup can be set to 0 to disable the 35 + strong pullup or 1 to enable. If enabled the 5V strong pullup will be 36 + enabled when the conversion is taking place provided the master driver 37 + must support the strong pullup (or it falls back to a pullup 38 + resistor). The DS18b20 temperature sensor specification lists a 39 + maximum current draw of 1.5mA and that a 5k pullup resistor is not 40 + sufficient. The strong pullup is designed to provide the additional 41 + current required.
+13 -2
drivers/w1/slaves/w1_therm.c
··· 37 37 MODULE_AUTHOR("Evgeniy Polyakov <johnpol@2ka.mipt.ru>"); 38 38 MODULE_DESCRIPTION("Driver for 1-wire Dallas network protocol, temperature family."); 39 39 40 + /* Allow the strong pullup to be disabled, but default to enabled. 41 + * If it was disabled a parasite powered device might not get the require 42 + * current to do a temperature conversion. If it is enabled parasite powered 43 + * devices have a better chance of getting the current required. 44 + */ 45 + static int w1_strong_pullup = 1; 46 + module_param_named(strong_pullup, w1_strong_pullup, int, 0); 47 + 40 48 static u8 bad_roms[][9] = { 41 49 {0xaa, 0x00, 0x4b, 0x46, 0xff, 0xff, 0x0c, 0x10, 0x87}, 42 50 {} ··· 200 192 int count = 0; 201 193 unsigned int tm = 750; 202 194 195 + /* 750ms strong pullup (or delay) after the convert */ 196 + if (w1_strong_pullup) 197 + w1_next_pullup(dev, tm); 203 198 w1_write_8(dev, W1_CONVERT_TEMP); 204 - 205 - msleep(tm); 199 + if (!w1_strong_pullup) 200 + msleep(tm); 206 201 207 202 if (!w1_reset_select_slave(sl)) { 208 203