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

Merge branch 'release' of git://lm-sensors.org/kernel/mhoffman/hwmon-2.6

* 'release' of git://lm-sensors.org/kernel/mhoffman/hwmon-2.6: (53 commits)
hwmon: (vt8231) fix sparse warning
hwmon: (sis5595) fix sparse warning
hwmon: (w83627hf) don't assume bank 0
hwmon: (w83627hf) Fix setting fan min right after driver load
hwmon: (w83627hf) De-macro sysfs callback functions
hwmon: Add new combined driver for FSC chips
hwmon: (ibmpex) Release IPMI user if hwmon registration fails
hwmon: (dme1737) Add sch311x support
hwmon: (dme1737) group functions logically
hwmon: (dme1737) cleanups
hwmon: IBM power meter driver
hwmon: (coretemp) Add support for Celeron 4xx
hwmon: (lm87) Disable VID when it should be
hwmon: (w83781d) Add individual alarm and beep files
hwmon: VRM is not read from registers
MAINTAINERS: update hwmon subsystem git trees
hwmon: Fix the code examples in documentation
hwmon: update sysfs interface document - error handling
hwmon: (thmc50) Fix a debug message
hwmon: (thmc50) Don't create temp3 if not enabled
...

+6850 -1878
+1 -1
Documentation/hwmon/coretemp
··· 4 4 Supported chips: 5 5 * All Intel Core family 6 6 Prefix: 'coretemp' 7 - CPUID: family 0x6, models 0xe, 0xf 7 + CPUID: family 0x6, models 0xe, 0xf, 0x16 8 8 Datasheet: Intel 64 and IA-32 Architectures Software Developer's Manual 9 9 Volume 3A: System Programming Guide 10 10
+22 -9
Documentation/hwmon/dme1737
··· 6 6 Prefix: 'dme1737' 7 7 Addresses scanned: I2C 0x2c, 0x2d, 0x2e 8 8 Datasheet: Provided by SMSC upon request and under NDA 9 + * SMSC SCH3112, SCH3114, SCH3116 10 + Prefix: 'sch311x' 11 + Addresses scanned: none, address read from Super-I/O config space 12 + Datasheet: http://www.nuhorizons.com/FeaturedProducts/Volume1/SMSC/311x.pdf 9 13 10 14 Authors: 11 15 Juerg Haefliger <juergh@gmail.com> ··· 31 27 ----------- 32 28 33 29 This driver implements support for the hardware monitoring capabilities of the 34 - SMSC DME1737 and Asus A8000 (which are the same) Super-I/O chips. This chip 35 - features monitoring of 3 temp sensors temp[1-3] (2 remote diodes and 1 36 - internal), 7 voltages in[0-6] (6 external and 1 internal) and 6 fan speeds 37 - fan[1-6]. Additionally, the chip implements 5 PWM outputs pwm[1-3,5-6] for 38 - controlling fan speeds both manually and automatically. 30 + SMSC DME1737 and Asus A8000 (which are the same) and SMSC SCH311x Super-I/O 31 + chips. These chips feature monitoring of 3 temp sensors temp[1-3] (2 remote 32 + diodes and 1 internal), 7 voltages in[0-6] (6 external and 1 internal) and up 33 + to 6 fan speeds fan[1-6]. Additionally, the chips implement up to 5 PWM 34 + outputs pwm[1-3,5-6] for controlling fan speeds both manually and 35 + automatically. 39 36 40 - Fan[3-6] and pwm[3,5-6] are optional features and their availability is 41 - dependent on the configuration of the chip. The driver will detect which 42 - features are present during initialization and create the sysfs attributes 43 - accordingly. 37 + For the DME1737 and A8000, fan[1-2] and pwm[1-2] are always present. Fan[3-6] 38 + and pwm[3,5-6] are optional features and their availability depends on the 39 + configuration of the chip. The driver will detect which features are present 40 + during initialization and create the sysfs attributes accordingly. 41 + 42 + For the SCH311x, fan[1-3] and pwm[1-3] are always present and fan[4-6] and 43 + pwm[5-6] don't exist. 44 + 45 + The hardware monitoring features of the DME1737 and A8000 are only accessible 46 + via SMBus, while the SCH311x only provides access via the ISA bus. The driver 47 + will therefore register itself as an I2C client driver if it detects a DME1737 48 + or A8000 and as a platform driver if it detects a SCH311x chip. 44 49 45 50 46 51 Voltage Monitoring
+7
Documentation/hwmon/f71805f
··· 6 6 Prefix: 'f71805f' 7 7 Addresses scanned: none, address read from Super I/O config space 8 8 Datasheet: Available from the Fintek website 9 + * Fintek F71806F/FG 10 + Prefix: 'f71872f' 11 + Addresses scanned: none, address read from Super I/O config space 12 + Datasheet: Available from the Fintek website 9 13 * Fintek F71872F/FG 10 14 Prefix: 'f71872f' 11 15 Addresses scanned: none, address read from Super I/O config space ··· 41 37 The Fintek F71872F/FG Super I/O chip is almost the same, with two 42 38 additional internal voltages monitored (VSB and battery). It also features 43 39 6 VID inputs. The VID inputs are not yet supported by this driver. 40 + 41 + The Fintek F71806F/FG Super-I/O chip is essentially the same as the 42 + F71872F/FG, and is undistinguishable therefrom. 44 43 45 44 The driver assumes that no more than one chip is present, which seems 46 45 reasonable.
+2 -1
Documentation/hwmon/it87
··· 90 90 can't have both on a given board. 91 91 92 92 The IT8716F, IT8718F and later IT8712F revisions have support for 93 - 2 additional fans. They are not yet supported by the driver. 93 + 2 additional fans. They are supported by the driver for the IT8716F and 94 + IT8718F but not for the IT8712F 94 95 95 96 The IT8716F and IT8718F, and late IT8712F and IT8705F also have optional 96 97 16-bit tachometer counters for fans 1 to 3. This is better (no more fan
-10
Documentation/hwmon/lm78
··· 56 56 It is a value in volts. When it is unconnected, you will often find the 57 57 value 3.50 V here. 58 58 59 - In addition to the alarms described above, there are a couple of additional 60 - ones. There is a BTI alarm, which gets triggered when an external chip has 61 - crossed its limits. Usually, this is connected to all LM75 chips; if at 62 - least one crosses its limits, this bit gets set. The CHAS alarm triggers 63 - if your computer case is open. The FIFO alarms should never trigger; it 64 - indicates an internal error. The SMI_IN alarm indicates some other chip 65 - has triggered an SMI interrupt. As we do not use SMI interrupts at all, 66 - this condition usually indicates there is a problem with some other 67 - device. 68 - 69 59 If an alarm triggers, it will remain triggered until the hardware register 70 60 is read at least once. This means that the cause for the alarm may 71 61 already have disappeared! Note that in the current implementation, all
+8 -118
Documentation/hwmon/lm93
··· 7 7 Addresses scanned: I2C 0x2c-0x2e 8 8 Datasheet: http://www.national.com/ds.cgi/LM/LM93.pdf 9 9 10 - Author: 10 + Authors: 11 11 Mark M. Hoffman <mhoffman@lightlink.com> 12 12 Ported to 2.6 by Eric J. Bowersox <ericb@aspsys.com> 13 13 Adapted to 2.6.20 by Carsten Emde <ce@osadl.org> ··· 16 16 Module Parameters 17 17 ----------------- 18 18 19 - (specific to LM93) 20 19 * init: integer 21 20 Set to non-zero to force some initializations (default is 0). 22 21 * disable_block: integer ··· 36 37 I.e. this parameter controls the VID pin input thresholds; if your VID 37 38 inputs are not working, try changing this. The default value is "0". 38 39 39 - (common among sensor drivers) 40 - * force: short array (min = 1, max = 48) 41 - List of adapter,address pairs to assume to be present. Autodetection 42 - of the target device will still be attempted. Use one of the more 43 - specific force directives below if this doesn't detect the device. 44 - * force_lm93: short array (min = 1, max = 48) 45 - List of adapter,address pairs which are unquestionably assumed to contain 46 - a 'lm93' chip 47 - * ignore: short array (min = 1, max = 48) 48 - List of adapter,address pairs not to scan 49 - * ignore_range: short array (min = 1, max = 48) 50 - List of adapter,start-addr,end-addr triples not to scan 51 - * probe: short array (min = 1, max = 48) 52 - List of adapter,address pairs to scan additionally 53 - * probe_range: short array (min = 1, max = 48) 54 - List of adapter,start-addr,end-addr triples to scan additionally 55 - 56 40 57 41 Hardware Description 58 42 -------------------- 59 43 60 44 (from the datasheet) 61 45 62 - The LM93, hardware monitor, has a two wire digital interface compatible with 46 + The LM93 hardware monitor has a two wire digital interface compatible with 63 47 SMBus 2.0. Using an 8-bit ADC, the LM93 measures the temperature of two remote 64 48 diode connected transistors as well as its own die and 16 power supply 65 49 voltages. To set fan speed, the LM93 has two PWM outputs that are each ··· 51 69 temperature readings for better control of fan speed. The LM93 has four 52 70 tachometer inputs to measure fan speed. Limit and status registers for all 53 71 measured values are included. The LM93 builds upon the functionality of 54 - previous motherboard management ASICs and uses some of the LM85 s features 72 + previous motherboard management ASICs and uses some of the LM85's features 55 73 (i.e. smart tachometer mode). It also adds measurement and control support 56 74 for dynamic Vccp monitoring and PROCHOT. It is designed to monitor a dual 57 75 processor Xeon class motherboard with a minimum of external components. 58 - 59 - 60 - Driver Description 61 - ------------------ 62 - 63 - This driver implements support for the National Semiconductor LM93. 64 76 65 77 66 78 User Interface ··· 77 101 prochot2_interval. The values in these files specify the intervals for 78 102 #P1_PROCHOT and #P2_PROCHOT, respectively. Selecting a value not in this 79 103 list will cause the driver to use the next largest interval. The available 80 - intervals are: 104 + intervals are (in seconds): 81 105 82 106 #PROCHOT intervals: 0.73, 1.46, 2.9, 5.8, 11.7, 23.3, 46.6, 93.2, 186, 372 83 107 ··· 87 111 non-zero integer to the sysfs file prochot_short. 88 112 89 113 The LM93 can also override the #PROCHOT pins by driving a PWM signal onto 90 - one or both of them. When overridden, the signal has a period of 3.56 mS, 114 + one or both of them. When overridden, the signal has a period of 3.56 ms, 91 115 a minimum pulse width of 5 clocks (at 22.5kHz => 6.25% duty cycle), and 92 116 a maximum pulse width of 80 clocks (at 22.5kHz => 99.88% duty cycle). 93 117 94 118 The sysfs files prochot1_override and prochot2_override contain boolean 95 - intgers which enable or disable the override function for #P1_PROCHOT and 119 + integers which enable or disable the override function for #P1_PROCHOT and 96 120 #P2_PROCHOT, respectively. The sysfs file prochot_override_duty_cycle 97 121 contains a value controlling the duty cycle for the PWM signal used when 98 122 the override function is enabled. This value ranges from 0 to 15, with 0 ··· 142 166 not available will cause the driver to use the next largest value. Also note 143 167 that this parameter has implications for the Smart Tach Mode (see above). 144 168 145 - PWM Output Frequencies: 12, 36, 48, 60, 72, 84, 96, 22500 (h/w default) 169 + PWM Output Frequencies (in Hz): 12, 36, 48, 60, 72, 84, 96, 22500 (default) 146 170 147 171 Automatic PWM: 148 172 ··· 154 178 The eight control sources are: temp1-temp4 (aka "zones" in the datasheet), 155 179 #PROCHOT 1 & 2, and #VRDHOT 1 & 2. The bindings are expressed as a bitmask 156 180 in the sysfs files pwm<n>_auto_channels, where a "1" enables the binding, and 157 - a "0" disables it. The h/w default is 0x0f (all temperatures bound). 181 + a "0" disables it. The h/w default is 0x0f (all temperatures bound). 158 182 159 183 0x01 - Temp 1 160 184 0x02 - Temp 2 ··· 299 323 temp<n>_auto_boost_hyst temperature channel boost hysteresis 300 324 301 325 gpio input state of 8 GPIO pins; read-only 302 - 303 - 304 - Sample Configuration File 305 - ------------------------- 306 - 307 - Here is a sample LM93 chip config for sensors.conf: 308 - 309 - ---------- cut here ---------- 310 - chip "lm93-*" 311 - 312 - # VOLTAGE INPUTS 313 - 314 - # labels and scaling based on datasheet recommendations 315 - label in1 "+12V1" 316 - compute in1 @ * 12.945, @ / 12.945 317 - set in1_min 12 * 0.90 318 - set in1_max 12 * 1.10 319 - 320 - label in2 "+12V2" 321 - compute in2 @ * 12.945, @ / 12.945 322 - set in2_min 12 * 0.90 323 - set in2_max 12 * 1.10 324 - 325 - label in3 "+12V3" 326 - compute in3 @ * 12.945, @ / 12.945 327 - set in3_min 12 * 0.90 328 - set in3_max 12 * 1.10 329 - 330 - label in4 "FSB_Vtt" 331 - 332 - label in5 "3GIO" 333 - 334 - label in6 "ICH_Core" 335 - 336 - label in7 "Vccp1" 337 - 338 - label in8 "Vccp2" 339 - 340 - label in9 "+3.3V" 341 - set in9_min 3.3 * 0.90 342 - set in9_max 3.3 * 1.10 343 - 344 - label in10 "+5V" 345 - set in10_min 5.0 * 0.90 346 - set in10_max 5.0 * 1.10 347 - 348 - label in11 "SCSI_Core" 349 - 350 - label in12 "Mem_Core" 351 - 352 - label in13 "Mem_Vtt" 353 - 354 - label in14 "Gbit_Core" 355 - 356 - # Assuming R1/R2 = 4.1143, and 3.3V reference 357 - # -12V = (4.1143 + 1) * (@ - 3.3) + 3.3 358 - label in15 "-12V" 359 - compute in15 @ * 5.1143 - 13.57719, (@ + 13.57719) / 5.1143 360 - set in15_min -12 * 0.90 361 - set in15_max -12 * 1.10 362 - 363 - label in16 "+3.3VSB" 364 - set in16_min 3.3 * 0.90 365 - set in16_max 3.3 * 1.10 366 - 367 - # TEMPERATURE INPUTS 368 - 369 - label temp1 "CPU1" 370 - label temp2 "CPU2" 371 - label temp3 "LM93" 372 - 373 - # TACHOMETER INPUTS 374 - 375 - label fan1 "Fan1" 376 - set fan1_min 3000 377 - label fan2 "Fan2" 378 - set fan2_min 3000 379 - label fan3 "Fan3" 380 - set fan3_min 3000 381 - label fan4 "Fan4" 382 - set fan4_min 3000 383 - 384 - # PWM OUTPUTS 385 - 386 - label pwm1 "CPU1" 387 - label pwm2 "CPU2" 388 326
+94 -31
Documentation/hwmon/sysfs-interface
··· 67 67 alarm (for example, whether a threshold must be met or must be exceeded 68 68 to cause an alarm) is chip-dependent. 69 69 70 + When setting values of hwmon sysfs attributes, the string representation of 71 + the desired value must be written, note that strings which are not a number 72 + are interpreted as 0! For more on how written strings are interpreted see the 73 + "sysfs attribute writes interpretation" section at the end of this file. 70 74 71 75 ------------------------------------------------------------------------- 72 76 ··· 82 78 Read/write values may be read-only for some chips, depending on the 83 79 hardware implementation. 84 80 85 - All entries are optional, and should only be created in a given driver 86 - if the chip has the feature. 81 + All entries (except name) are optional, and should only be created in a 82 + given driver if the chip has the feature. 83 + 84 + 85 + ******** 86 + * Name * 87 + ******** 88 + 89 + name The chip name. 90 + This should be a short, lowercase string, not containing 91 + spaces nor dashes, representing the chip name. This is 92 + the only mandatory attribute. 93 + I2C devices get this attribute created automatically. 94 + RO 95 + 87 96 88 97 ************ 89 98 * Voltages * ··· 121 104 by the chip driver, and must be done by the application. 122 105 However, some drivers (notably lm87 and via686a) 123 106 do scale, because of internal resistors built into a chip. 124 - These drivers will output the actual voltage. 107 + These drivers will output the actual voltage. Rule of 108 + thumb: drivers should report the voltage values at the 109 + "pins" of the chip. 125 110 126 - Typical usage: 127 - in0_* CPU #1 voltage (not scaled) 128 - in1_* CPU #2 voltage (not scaled) 129 - in2_* 3.3V nominal (not scaled) 130 - in3_* 5.0V nominal (scaled) 131 - in4_* 12.0V nominal (scaled) 132 - in5_* -12.0V nominal (scaled) 133 - in6_* -5.0V nominal (scaled) 134 - in7_* varies 135 - in8_* varies 111 + in[0-*]_label Suggested voltage channel label. 112 + Text string 113 + Should only be created if the driver has hints about what 114 + this voltage channel is being used for, and user-space 115 + doesn't. In all other cases, the label is provided by 116 + user-space. 117 + RO 136 118 137 119 cpu[0-*]_vid CPU core reference voltage. 138 120 Unit: millivolt ··· 174 158 RW 175 159 Only makes sense if the chip supports closed-loop fan speed 176 160 control based on the measured fan speed. 161 + 162 + fan[1-*]_label Suggested fan channel label. 163 + Text string 164 + Should only be created if the driver has hints about what 165 + this fan channel is being used for, and user-space doesn't. 166 + In all other cases, the label is provided by user-space. 167 + RO 177 168 178 169 Also see the Alarms section for status flags associated with fans. 179 170 ··· 242 219 **************** 243 220 244 221 temp[1-*]_type Sensor type selection. 245 - Integers 1 to 6 or thermistor Beta value (typically 3435) 222 + Integers 1 to 6 246 223 RW 247 224 1: PII/Celeron Diode 248 225 2: 3904 transistor 249 226 3: thermal diode 250 - 4: thermistor (default/unknown Beta) 227 + 4: thermistor 251 228 5: AMD AMDSI 252 229 6: Intel PECI 253 230 Not all types are supported by all chips ··· 283 260 from the critical value. 284 261 RW 285 262 286 - temp[1-4]_offset 263 + temp[1-*]_offset 287 264 Temperature offset which is added to the temperature reading 288 265 by the chip. 289 266 Unit: millidegree Celsius 290 267 Read/Write value. 291 268 292 - If there are multiple temperature sensors, temp1_* is 293 - generally the sensor inside the chip itself, 294 - reported as "motherboard temperature". temp2_* to 295 - temp4_* are generally sensors external to the chip 296 - itself, for example the thermal diode inside the CPU or 297 - a thermistor nearby. 269 + temp[1-*]_label Suggested temperature channel label. 270 + Text string 271 + Should only be created if the driver has hints about what 272 + this temperature channel is being used for, and user-space 273 + doesn't. In all other cases, the label is provided by 274 + user-space. 275 + RO 298 276 299 277 Some chips measure temperature using external thermistors and an ADC, and 300 278 report the temperature measurement as a voltage. Converting this voltage ··· 417 393 RW 418 394 419 395 420 - ********* 421 - * Other * 422 - ********* 396 + sysfs attribute writes interpretation 397 + ------------------------------------- 423 398 424 - eeprom Raw EEPROM data in binary form. 425 - RO 399 + hwmon sysfs attributes always contain numbers, so the first thing to do is to 400 + convert the input to a number, there are 2 ways todo this depending whether 401 + the number can be negative or not: 402 + unsigned long u = simple_strtoul(buf, NULL, 10); 403 + long s = simple_strtol(buf, NULL, 10); 426 404 427 - pec Enable or disable PEC (SMBus only) 428 - 0: disable 429 - 1: enable 430 - RW 405 + With buf being the buffer with the user input being passed by the kernel. 406 + Notice that we do not use the second argument of strto[u]l, and thus cannot 407 + tell when 0 is returned, if this was really 0 or is caused by invalid input. 408 + This is done deliberately as checking this everywhere would add a lot of 409 + code to the kernel. 410 + 411 + Notice that it is important to always store the converted value in an 412 + unsigned long or long, so that no wrap around can happen before any further 413 + checking. 414 + 415 + After the input string is converted to an (unsigned) long, the value should be 416 + checked if its acceptable. Be careful with further conversions on the value 417 + before checking it for validity, as these conversions could still cause a wrap 418 + around before the check. For example do not multiply the result, and only 419 + add/subtract if it has been divided before the add/subtract. 420 + 421 + What to do if a value is found to be invalid, depends on the type of the 422 + sysfs attribute that is being set. If it is a continuous setting like a 423 + tempX_max or inX_max attribute, then the value should be clamped to its 424 + limits using SENSORS_LIMIT(value, min_limit, max_limit). If it is not 425 + continuous like for example a tempX_type, then when an invalid value is 426 + written, -EINVAL should be returned. 427 + 428 + Example1, temp1_max, register is a signed 8 bit value (-128 - 127 degrees): 429 + 430 + long v = simple_strtol(buf, NULL, 10) / 1000; 431 + v = SENSORS_LIMIT(v, -128, 127); 432 + /* write v to register */ 433 + 434 + Example2, fan divider setting, valid values 2, 4 and 8: 435 + 436 + unsigned long v = simple_strtoul(buf, NULL, 10); 437 + 438 + switch (v) { 439 + case 2: v = 1; break; 440 + case 4: v = 2; break; 441 + case 8: v = 3; break; 442 + default: 443 + return -EINVAL; 444 + } 445 + /* write v to register */
+53 -35
Documentation/hwmon/w83791d
··· 75 75 An alarm is triggered if the voltage has crossed a programmable minimum 76 76 or maximum limit. 77 77 78 - The bit ordering for the alarm "realtime status register" and the 79 - "beep enable registers" are different. 78 + The w83791d has a global bit used to enable beeping from the speaker when an 79 + alarm is triggered as well as a bitmask to enable or disable the beep for 80 + specific alarms. You need both the global beep enable bit and the 81 + corresponding beep bit to be on for a triggered alarm to sound a beep. 80 82 81 - in0 (VCORE) : alarms: 0x000001 beep_enable: 0x000001 82 - in1 (VINR0) : alarms: 0x000002 beep_enable: 0x002000 <== mismatch 83 - in2 (+3.3VIN): alarms: 0x000004 beep_enable: 0x000004 84 - in3 (5VDD) : alarms: 0x000008 beep_enable: 0x000008 85 - in4 (+12VIN) : alarms: 0x000100 beep_enable: 0x000100 86 - in5 (-12VIN) : alarms: 0x000200 beep_enable: 0x000200 87 - in6 (-5VIN) : alarms: 0x000400 beep_enable: 0x000400 88 - in7 (VSB) : alarms: 0x080000 beep_enable: 0x010000 <== mismatch 89 - in8 (VBAT) : alarms: 0x100000 beep_enable: 0x020000 <== mismatch 90 - in9 (VINR1) : alarms: 0x004000 beep_enable: 0x004000 91 - temp1 : alarms: 0x000010 beep_enable: 0x000010 92 - temp2 : alarms: 0x000020 beep_enable: 0x000020 93 - temp3 : alarms: 0x002000 beep_enable: 0x000002 <== mismatch 94 - fan1 : alarms: 0x000040 beep_enable: 0x000040 95 - fan2 : alarms: 0x000080 beep_enable: 0x000080 96 - fan3 : alarms: 0x000800 beep_enable: 0x000800 97 - fan4 : alarms: 0x200000 beep_enable: 0x200000 98 - fan5 : alarms: 0x400000 beep_enable: 0x400000 99 - tart1 : alarms: 0x010000 beep_enable: 0x040000 <== mismatch 100 - tart2 : alarms: 0x020000 beep_enable: 0x080000 <== mismatch 101 - tart3 : alarms: 0x040000 beep_enable: 0x100000 <== mismatch 102 - case_open : alarms: 0x001000 beep_enable: 0x001000 103 - user_enable : alarms: -------- beep_enable: 0x800000 83 + The sysfs interface to the gloabal enable is via the sysfs beep_enable file. 84 + This file is used for both legacy and new code. 104 85 105 - *** NOTE: It is the responsibility of user-space code to handle the fact 106 - that the beep enable and alarm bits are in different positions when using that 107 - feature of the chip. 86 + The sysfs interface to the beep bitmask has migrated from the original legacy 87 + method of a single sysfs beep_mask file to a newer method using multiple 88 + *_beep files as described in .../Documentation/hwmon/sysfs-interface. 108 89 109 - When an alarm goes off, you can be warned by a beeping signal through your 110 - computer speaker. It is possible to enable all beeping globally, or only 111 - the beeping for some alarms. 90 + A similar change has occured for the bitmap corresponding to the alarms. The 91 + original legacy method used a single sysfs alarms file containing a bitmap 92 + of triggered alarms. The newer method uses multiple sysfs *_alarm files 93 + (again following the pattern described in sysfs-interface). 112 94 113 - The driver only reads the chip values each 3 seconds; reading them more 114 - often will do no harm, but will return 'old' values. 95 + Since both methods read and write the underlying hardware, they can be used 96 + interchangeably and changes in one will automatically be reflected by 97 + the other. If you use the legacy bitmask method, your user-space code is 98 + responsible for handling the fact that the alarms and beep_mask bitmaps 99 + are not the same (see the table below). 100 + 101 + NOTE: All new code should be written to use the newer sysfs-interface 102 + specification as that avoids bitmap problems and is the preferred interface 103 + going forward. 104 + 105 + The driver reads the hardware chip values at most once every three seconds. 106 + User mode code requesting values more often will receive cached values. 107 + 108 + Alarms bitmap vs. beep_mask bitmask 109 + ------------------------------------ 110 + For legacy code using the alarms and beep_mask files: 111 + 112 + in0 (VCORE) : alarms: 0x000001 beep_mask: 0x000001 113 + in1 (VINR0) : alarms: 0x000002 beep_mask: 0x002000 <== mismatch 114 + in2 (+3.3VIN): alarms: 0x000004 beep_mask: 0x000004 115 + in3 (5VDD) : alarms: 0x000008 beep_mask: 0x000008 116 + in4 (+12VIN) : alarms: 0x000100 beep_mask: 0x000100 117 + in5 (-12VIN) : alarms: 0x000200 beep_mask: 0x000200 118 + in6 (-5VIN) : alarms: 0x000400 beep_mask: 0x000400 119 + in7 (VSB) : alarms: 0x080000 beep_mask: 0x010000 <== mismatch 120 + in8 (VBAT) : alarms: 0x100000 beep_mask: 0x020000 <== mismatch 121 + in9 (VINR1) : alarms: 0x004000 beep_mask: 0x004000 122 + temp1 : alarms: 0x000010 beep_mask: 0x000010 123 + temp2 : alarms: 0x000020 beep_mask: 0x000020 124 + temp3 : alarms: 0x002000 beep_mask: 0x000002 <== mismatch 125 + fan1 : alarms: 0x000040 beep_mask: 0x000040 126 + fan2 : alarms: 0x000080 beep_mask: 0x000080 127 + fan3 : alarms: 0x000800 beep_mask: 0x000800 128 + fan4 : alarms: 0x200000 beep_mask: 0x200000 129 + fan5 : alarms: 0x400000 beep_mask: 0x400000 130 + tart1 : alarms: 0x010000 beep_mask: 0x040000 <== mismatch 131 + tart2 : alarms: 0x020000 beep_mask: 0x080000 <== mismatch 132 + tart3 : alarms: 0x040000 beep_mask: 0x100000 <== mismatch 133 + case_open : alarms: 0x001000 beep_mask: 0x001000 134 + global_enable: alarms: -------- beep_mask: 0x800000 (modified via beep_enable) 115 135 116 136 W83791D TODO: 117 137 --------------- 118 - Provide a patch for per-file alarms and beep enables as defined in the hwmon 119 - documentation (Documentation/hwmon/sysfs-interface) 120 138 Provide a patch for smart-fan control (still need appropriate motherboard/fans)
+3 -2
MAINTAINERS
··· 1660 1660 M: mhoffman@lightlink.com 1661 1661 L: lm-sensors@lm-sensors.org 1662 1662 W: http://www.lm-sensors.org/ 1663 - T: git lm-sensors.org:/kernel/mhoffman/hwmon-2.6.git 1663 + T: git lm-sensors.org:/kernel/mhoffman/hwmon-2.6.git testing 1664 + T: git lm-sensors.org:/kernel/mhoffman/hwmon-2.6.git release 1664 1665 S: Maintained 1665 1666 1666 1667 HARDWARE RANDOM NUMBER GENERATOR CORE ··· 4178 4177 P: Charles Spirakis 4179 4178 M: bezaur@gmail.com 4180 4179 L: lm-sensors@lm-sensors.org 4181 - S: Maintained 4180 + S: Odd Fixes 4182 4181 4183 4182 W83793 HARDWARE MONITORING DRIVER 4184 4183 P: Rudolf Marek
+68 -11
drivers/hwmon/Kconfig
··· 30 30 31 31 config SENSORS_ABITUGURU 32 32 tristate "Abit uGuru (rev 1 & 2)" 33 - depends on EXPERIMENTAL 33 + depends on X86 && EXPERIMENTAL 34 34 help 35 35 If you say yes here you get support for the sensor part of the first 36 36 and second revision of the Abit uGuru chip. The voltage and frequency ··· 45 45 46 46 config SENSORS_ABITUGURU3 47 47 tristate "Abit uGuru (rev 3)" 48 - depends on HWMON && EXPERIMENTAL 48 + depends on X86 && EXPERIMENTAL 49 49 help 50 50 If you say yes here you get support for the sensor part of the 51 51 third revision of the Abit uGuru chip. Only reading the sensors ··· 133 133 This driver can also be built as a module. If so, the module 134 134 will be called adm9240. 135 135 136 + config SENSORS_ADT7470 137 + tristate "Analog Devices ADT7470" 138 + depends on I2C && EXPERIMENTAL 139 + help 140 + If you say yes here you get support for the Analog Devices 141 + ADT7470 temperature monitoring chips. 142 + 143 + This driver can also be built as a module. If so, the module 144 + will be called adt7470. 145 + 136 146 config SENSORS_K8TEMP 137 147 tristate "AMD Athlon64/FX or Opteron temperature sensor" 138 148 depends on X86 && PCI && EXPERIMENTAL ··· 182 172 183 173 config SENSORS_ASB100 184 174 tristate "Asus ASB100 Bach" 185 - depends on I2C && EXPERIMENTAL 175 + depends on X86 && I2C && EXPERIMENTAL 186 176 select HWMON_VID 187 177 help 188 178 If you say yes here you get support for the ASB100 Bach sensor ··· 216 206 will be called ds1621. 217 207 218 208 config SENSORS_F71805F 219 - tristate "Fintek F71805F/FG and F71872F/FG" 209 + tristate "Fintek F71805F/FG, F71806F/FG and F71872F/FG" 220 210 depends on EXPERIMENTAL 221 211 help 222 212 If you say yes here you get support for hardware monitoring 223 - features of the Fintek F71805F/FG and F71872F/FG Super-I/O 224 - chips. 213 + features of the Fintek F71805F/FG, F71806F/FG and F71872F/FG 214 + Super-I/O chips. 225 215 226 216 This driver can also be built as a module. If so, the module 227 217 will be called f71805f. 228 218 219 + config SENSORS_F71882FG 220 + tristate "Fintek F71882FG and F71883FG" 221 + depends on EXPERIMENTAL 222 + help 223 + If you say yes here you get support for hardware monitoring 224 + features of the Fintek F71882FG and F71883FG Super-I/O chips. 225 + 226 + This driver can also be built as a module. If so, the module 227 + will be called f71882fg. 228 + 229 + config SENSORS_F75375S 230 + tristate "Fintek F75375S/SP and F75373"; 231 + depends on I2C && EXPERIMENTAL 232 + help 233 + If you say yes here you get support for hardware monitoring 234 + features of the Fintek F75375S/SP and F75373 235 + 236 + This driver can also be built as a module. If so, the module 237 + will be called f75375s. 238 + 229 239 config SENSORS_FSCHER 230 240 tristate "FSC Hermes" 231 - depends on I2C 241 + depends on X86 && I2C 232 242 help 233 243 If you say yes here you get support for Fujitsu Siemens 234 244 Computers Hermes sensor chips. ··· 258 228 259 229 config SENSORS_FSCPOS 260 230 tristate "FSC Poseidon" 261 - depends on I2C 231 + depends on X86 && I2C 262 232 help 263 233 If you say yes here you get support for Fujitsu Siemens 264 234 Computers Poseidon sensor chips. 265 235 266 236 This driver can also be built as a module. If so, the module 267 237 will be called fscpos. 238 + 239 + config SENSORS_FSCHMD 240 + tristate "FSC Poseidon, Scylla, Hermes, Heimdall and Heracles" 241 + depends on X86 && I2C && EXPERIMENTAL 242 + help 243 + If you say yes here you get support for various Fujitsu Siemens 244 + Computers sensor chips. 245 + 246 + This is a new merged driver for FSC sensor chips which is intended 247 + as a replacment for the fscpos, fscscy and fscher drivers and adds 248 + support for several other FCS sensor chips. 249 + 250 + This driver can also be built as a module. If so, the module 251 + will be called fschmd. 268 252 269 253 config SENSORS_GL518SM 270 254 tristate "Genesys Logic GL518SM" ··· 308 264 If you say yes here you get support for the temperature 309 265 sensor inside your CPU. Supported all are all known variants 310 266 of Intel Core family. 267 + 268 + config SENSORS_IBMPEX 269 + tristate "IBM PowerExecutive temperature/power sensors" 270 + select IPMI_SI 271 + depends on IPMI_HANDLER 272 + help 273 + If you say yes here you get support for the temperature and 274 + power sensors in various IBM System X servers that support 275 + PowerExecutive. So far this includes the x3550, x3650, x3655, 276 + x3755, and certain HS20 blades. 277 + 278 + This driver can also be built as a module. If so, the module 279 + will be called ibmpex. 311 280 312 281 config SENSORS_IT87 313 282 tristate "ITE IT87xx and compatibles" ··· 458 401 459 402 config SENSORS_LM93 460 403 tristate "National Semiconductor LM93 and compatibles" 461 - depends on HWMON && I2C 404 + depends on I2C 462 405 select HWMON_VID 463 406 help 464 407 If you say yes here you get support for National Semiconductor LM93 ··· 523 466 will be called sis5595. 524 467 525 468 config SENSORS_DME1737 526 - tristate "SMSC DME1737 and compatibles" 469 + tristate "SMSC DME1737, SCH311x and compatibles" 527 470 depends on I2C && EXPERIMENTAL 528 471 select HWMON_VID 529 472 help 530 473 If you say yes here you get support for the hardware monitoring 531 474 and fan control features of the SMSC DME1737 (and compatibles 532 - like the Asus A8000) Super-I/O chip. 475 + like the Asus A8000) and SCH311x Super-I/O chips. 533 476 534 477 This driver can also be built as a module. If so, the module 535 478 will be called dme1737.
+5
drivers/hwmon/Makefile
··· 22 22 obj-$(CONFIG_SENSORS_ADM1029) += adm1029.o 23 23 obj-$(CONFIG_SENSORS_ADM1031) += adm1031.o 24 24 obj-$(CONFIG_SENSORS_ADM9240) += adm9240.o 25 + obj-$(CONFIG_SENSORS_ADT7470) += adt7470.o 25 26 obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o 26 27 obj-$(CONFIG_SENSORS_AMS) += ams/ 27 28 obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o ··· 30 29 obj-$(CONFIG_SENSORS_DME1737) += dme1737.o 31 30 obj-$(CONFIG_SENSORS_DS1621) += ds1621.o 32 31 obj-$(CONFIG_SENSORS_F71805F) += f71805f.o 32 + obj-$(CONFIG_SENSORS_F71882FG) += f71882fg.o 33 + obj-$(CONFIG_SENSORS_F75375S) += f75375s.o 33 34 obj-$(CONFIG_SENSORS_FSCHER) += fscher.o 35 + obj-$(CONFIG_SENSORS_FSCHMD) += fschmd.o 34 36 obj-$(CONFIG_SENSORS_FSCPOS) += fscpos.o 35 37 obj-$(CONFIG_SENSORS_GL518SM) += gl518sm.o 36 38 obj-$(CONFIG_SENSORS_GL520SM) += gl520sm.o 37 39 obj-$(CONFIG_SENSORS_HDAPS) += hdaps.o 40 + obj-$(CONFIG_SENSORS_IBMPEX) += ibmpex.o 38 41 obj-$(CONFIG_SENSORS_IT87) += it87.o 39 42 obj-$(CONFIG_SENSORS_K8TEMP) += k8temp.o 40 43 obj-$(CONFIG_SENSORS_LM63) += lm63.o
+5 -5
drivers/hwmon/abituguru.c
··· 176 176 The structure is dynamically allocated, at the same time when a new 177 177 abituguru device is allocated. */ 178 178 struct abituguru_data { 179 - struct class_device *class_dev; /* hwmon registered device */ 179 + struct device *hwmon_dev; /* hwmon registered device */ 180 180 struct mutex update_lock; /* protect access to data and uGuru */ 181 181 unsigned long last_updated; /* In jiffies */ 182 182 unsigned short addr; /* uguru base address */ ··· 1287 1287 &abituguru_sysfs_attr[i].dev_attr)) 1288 1288 goto abituguru_probe_error; 1289 1289 1290 - data->class_dev = hwmon_device_register(&pdev->dev); 1291 - if (!IS_ERR(data->class_dev)) 1290 + data->hwmon_dev = hwmon_device_register(&pdev->dev); 1291 + if (!IS_ERR(data->hwmon_dev)) 1292 1292 return 0; /* success */ 1293 1293 1294 - res = PTR_ERR(data->class_dev); 1294 + res = PTR_ERR(data->hwmon_dev); 1295 1295 abituguru_probe_error: 1296 1296 for (i = 0; data->sysfs_attr[i].dev_attr.attr.name; i++) 1297 1297 device_remove_file(&pdev->dev, &data->sysfs_attr[i].dev_attr); ··· 1308 1308 int i; 1309 1309 struct abituguru_data *data = platform_get_drvdata(pdev); 1310 1310 1311 - hwmon_device_unregister(data->class_dev); 1311 + hwmon_device_unregister(data->hwmon_dev); 1312 1312 for (i = 0; data->sysfs_attr[i].dev_attr.attr.name; i++) 1313 1313 device_remove_file(&pdev->dev, &data->sysfs_attr[i].dev_attr); 1314 1314 for (i = 0; i < ARRAY_SIZE(abituguru_sysfs_attr); i++)
+5 -5
drivers/hwmon/abituguru3.c
··· 124 124 The structure is dynamically allocated, at the same time when a new 125 125 abituguru3 device is allocated. */ 126 126 struct abituguru3_data { 127 - struct class_device *class_dev; /* hwmon registered device */ 127 + struct device *hwmon_dev; /* hwmon registered device */ 128 128 struct mutex update_lock; /* protect access to data and uGuru */ 129 129 unsigned short addr; /* uguru base address */ 130 130 char valid; /* !=0 if following fields are valid */ ··· 933 933 &abituguru3_sysfs_attr[i].dev_attr)) 934 934 goto abituguru3_probe_error; 935 935 936 - data->class_dev = hwmon_device_register(&pdev->dev); 937 - if (IS_ERR(data->class_dev)) { 938 - res = PTR_ERR(data->class_dev); 936 + data->hwmon_dev = hwmon_device_register(&pdev->dev); 937 + if (IS_ERR(data->hwmon_dev)) { 938 + res = PTR_ERR(data->hwmon_dev); 939 939 goto abituguru3_probe_error; 940 940 } 941 941 ··· 957 957 struct abituguru3_data *data = platform_get_drvdata(pdev); 958 958 959 959 platform_set_drvdata(pdev, NULL); 960 - hwmon_device_unregister(data->class_dev); 960 + hwmon_device_unregister(data->hwmon_dev); 961 961 for (i = 0; data->sysfs_attr[i].dev_attr.attr.name; i++) 962 962 device_remove_file(&pdev->dev, &data->sysfs_attr[i].dev_attr); 963 963 for (i = 0; i < ARRAY_SIZE(abituguru3_sysfs_attr); i++)
+6 -6
drivers/hwmon/ad7418.c
··· 47 47 48 48 struct ad7418_data { 49 49 struct i2c_client client; 50 - struct class_device *class_dev; 50 + struct device *hwmon_dev; 51 51 struct attribute_group attrs; 52 52 enum chips type; 53 53 struct mutex lock; ··· 172 172 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 173 173 struct i2c_client *client = to_i2c_client(dev); 174 174 struct ad7418_data *data = i2c_get_clientdata(client); 175 - int temp = simple_strtol(buf, NULL, 10); 175 + long temp = simple_strtol(buf, NULL, 10); 176 176 177 177 mutex_lock(&data->lock); 178 178 data->temp[attr->index] = LM75_TEMP_TO_REG(temp); ··· 326 326 if ((err = sysfs_create_group(&client->dev.kobj, &data->attrs))) 327 327 goto exit_detach; 328 328 329 - data->class_dev = hwmon_device_register(&client->dev); 330 - if (IS_ERR(data->class_dev)) { 331 - err = PTR_ERR(data->class_dev); 329 + data->hwmon_dev = hwmon_device_register(&client->dev); 330 + if (IS_ERR(data->hwmon_dev)) { 331 + err = PTR_ERR(data->hwmon_dev); 332 332 goto exit_remove; 333 333 } 334 334 ··· 347 347 static int ad7418_detach_client(struct i2c_client *client) 348 348 { 349 349 struct ad7418_data *data = i2c_get_clientdata(client); 350 - hwmon_device_unregister(data->class_dev); 350 + hwmon_device_unregister(data->hwmon_dev); 351 351 sysfs_remove_group(&client->dev.kobj, &data->attrs); 352 352 i2c_detach_client(client); 353 353 kfree(data);
+212 -157
drivers/hwmon/adm1021.c
··· 1 1 /* 2 2 adm1021.c - Part of lm_sensors, Linux kernel modules for hardware 3 - monitoring 3 + monitoring 4 4 Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl> and 5 5 Philip Edelbrock <phil@netroedge.com> 6 6 ··· 25 25 #include <linux/jiffies.h> 26 26 #include <linux/i2c.h> 27 27 #include <linux/hwmon.h> 28 + #include <linux/hwmon-sysfs.h> 28 29 #include <linux/err.h> 29 30 #include <linux/mutex.h> 30 31 ··· 33 32 /* Addresses to scan */ 34 33 static unsigned short normal_i2c[] = { 0x18, 0x19, 0x1a, 35 34 0x29, 0x2a, 0x2b, 36 - 0x4c, 0x4d, 0x4e, 35 + 0x4c, 0x4d, 0x4e, 37 36 I2C_CLIENT_END }; 38 37 39 38 /* Insmod parameters */ 40 - I2C_CLIENT_INSMOD_8(adm1021, adm1023, max1617, max1617a, thmc10, lm84, gl523sm, mc1066); 39 + I2C_CLIENT_INSMOD_8(adm1021, adm1023, max1617, max1617a, thmc10, lm84, gl523sm, 40 + mc1066); 41 41 42 42 /* adm1021 constants specified below */ 43 43 44 44 /* The adm1021 registers */ 45 45 /* Read-only */ 46 - #define ADM1021_REG_TEMP 0x00 47 - #define ADM1021_REG_REMOTE_TEMP 0x01 46 + /* For nr in 0-1 */ 47 + #define ADM1021_REG_TEMP(nr) (nr) 48 48 #define ADM1021_REG_STATUS 0x02 49 - #define ADM1021_REG_MAN_ID 0x0FE /* 0x41 = AMD, 0x49 = TI, 0x4D = Maxim, 0x23 = Genesys , 0x54 = Onsemi*/ 50 - #define ADM1021_REG_DEV_ID 0x0FF /* ADM1021 = 0x0X, ADM1023 = 0x3X */ 51 - #define ADM1021_REG_DIE_CODE 0x0FF /* MAX1617A */ 49 + /* 0x41 = AD, 0x49 = TI, 0x4D = Maxim, 0x23 = Genesys , 0x54 = Onsemi */ 50 + #define ADM1021_REG_MAN_ID 0xFE 51 + /* ADM1021 = 0x0X, ADM1023 = 0x3X */ 52 + #define ADM1021_REG_DEV_ID 0xFF 52 53 /* These use different addresses for reading/writing */ 53 54 #define ADM1021_REG_CONFIG_R 0x03 54 55 #define ADM1021_REG_CONFIG_W 0x09 55 56 #define ADM1021_REG_CONV_RATE_R 0x04 56 57 #define ADM1021_REG_CONV_RATE_W 0x0A 57 58 /* These are for the ADM1023's additional precision on the remote temp sensor */ 58 - #define ADM1021_REG_REM_TEMP_PREC 0x010 59 - #define ADM1021_REG_REM_OFFSET 0x011 60 - #define ADM1021_REG_REM_OFFSET_PREC 0x012 61 - #define ADM1021_REG_REM_TOS_PREC 0x013 62 - #define ADM1021_REG_REM_THYST_PREC 0x014 59 + #define ADM1023_REG_REM_TEMP_PREC 0x10 60 + #define ADM1023_REG_REM_OFFSET 0x11 61 + #define ADM1023_REG_REM_OFFSET_PREC 0x12 62 + #define ADM1023_REG_REM_TOS_PREC 0x13 63 + #define ADM1023_REG_REM_THYST_PREC 0x14 63 64 /* limits */ 64 - #define ADM1021_REG_TOS_R 0x05 65 - #define ADM1021_REG_TOS_W 0x0B 66 - #define ADM1021_REG_REMOTE_TOS_R 0x07 67 - #define ADM1021_REG_REMOTE_TOS_W 0x0D 68 - #define ADM1021_REG_THYST_R 0x06 69 - #define ADM1021_REG_THYST_W 0x0C 70 - #define ADM1021_REG_REMOTE_THYST_R 0x08 71 - #define ADM1021_REG_REMOTE_THYST_W 0x0E 65 + /* For nr in 0-1 */ 66 + #define ADM1021_REG_TOS_R(nr) (0x05 + 2 * (nr)) 67 + #define ADM1021_REG_TOS_W(nr) (0x0B + 2 * (nr)) 68 + #define ADM1021_REG_THYST_R(nr) (0x06 + 2 * (nr)) 69 + #define ADM1021_REG_THYST_W(nr) (0x0C + 2 * (nr)) 72 70 /* write-only */ 73 71 #define ADM1021_REG_ONESHOT 0x0F 74 72 75 - 76 - /* Conversions. Rounding and limit checking is only done on the TO_REG 77 - variants. Note that you should be a bit careful with which arguments 78 - these macros are called: arguments may be evaluated more than once. 79 - Fixing this is just not worth it. */ 80 - /* Conversions note: 1021 uses normal integer signed-byte format*/ 81 - #define TEMP_FROM_REG(val) (val > 127 ? (val-256)*1000 : val*1000) 82 - #define TEMP_TO_REG(val) (SENSORS_LIMIT((val < 0 ? (val/1000)+256 : val/1000),0,255)) 83 - 84 73 /* Initial values */ 85 74 86 - /* Note: Even though I left the low and high limits named os and hyst, 87 - they don't quite work like a thermostat the way the LM75 does. I.e., 88 - a lower temp than THYST actually triggers an alarm instead of 75 + /* Note: Even though I left the low and high limits named os and hyst, 76 + they don't quite work like a thermostat the way the LM75 does. I.e., 77 + a lower temp than THYST actually triggers an alarm instead of 89 78 clearing it. Weird, ey? --Phil */ 90 79 91 80 /* Each client has this additional data */ 92 81 struct adm1021_data { 93 82 struct i2c_client client; 94 - struct class_device *class_dev; 83 + struct device *hwmon_dev; 95 84 enum chips type; 96 85 97 86 struct mutex update_lock; 98 87 char valid; /* !=0 if following fields are valid */ 99 88 unsigned long last_updated; /* In jiffies */ 100 89 101 - u8 temp_max; /* Register values */ 102 - u8 temp_hyst; 103 - u8 temp_input; 104 - u8 remote_temp_max; 105 - u8 remote_temp_hyst; 106 - u8 remote_temp_input; 107 - u8 alarms; 108 - /* Special values for ADM1023 only */ 109 - u8 remote_temp_prec; 110 - u8 remote_temp_os_prec; 111 - u8 remote_temp_hyst_prec; 112 - u8 remote_temp_offset; 113 - u8 remote_temp_offset_prec; 90 + s8 temp_max[2]; /* Register values */ 91 + s8 temp_min[2]; 92 + s8 temp[2]; 93 + u8 alarms; 94 + /* Special values for ADM1023 only */ 95 + u8 remote_temp_prec; 96 + u8 remote_temp_os_prec; 97 + u8 remote_temp_hyst_prec; 98 + u8 remote_temp_offset; 99 + u8 remote_temp_offset_prec; 114 100 }; 115 101 116 102 static int adm1021_attach_adapter(struct i2c_adapter *adapter); 117 103 static int adm1021_detect(struct i2c_adapter *adapter, int address, int kind); 118 104 static void adm1021_init_client(struct i2c_client *client); 119 105 static int adm1021_detach_client(struct i2c_client *client); 120 - static int adm1021_read_value(struct i2c_client *client, u8 reg); 121 - static int adm1021_write_value(struct i2c_client *client, u8 reg, 122 - u16 value); 123 106 static struct adm1021_data *adm1021_update_device(struct device *dev); 124 107 125 108 /* (amalysh) read only mode, otherwise any limit's writing confuse BIOS */ ··· 120 135 .detach_client = adm1021_detach_client, 121 136 }; 122 137 123 - #define show(value) \ 124 - static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \ 125 - { \ 126 - struct adm1021_data *data = adm1021_update_device(dev); \ 127 - return sprintf(buf, "%d\n", TEMP_FROM_REG(data->value)); \ 128 - } 129 - show(temp_max); 130 - show(temp_hyst); 131 - show(temp_input); 132 - show(remote_temp_max); 133 - show(remote_temp_hyst); 134 - show(remote_temp_input); 138 + static ssize_t show_temp(struct device *dev, 139 + struct device_attribute *devattr, char *buf) 140 + { 141 + int index = to_sensor_dev_attr(devattr)->index; 142 + struct adm1021_data *data = adm1021_update_device(dev); 135 143 136 - #define show2(value) \ 137 - static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \ 138 - { \ 139 - struct adm1021_data *data = adm1021_update_device(dev); \ 140 - return sprintf(buf, "%d\n", data->value); \ 144 + return sprintf(buf, "%d\n", 1000 * data->temp[index]); 141 145 } 142 - show2(alarms); 143 146 144 - #define set(value, reg) \ 145 - static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ 146 - { \ 147 - struct i2c_client *client = to_i2c_client(dev); \ 148 - struct adm1021_data *data = i2c_get_clientdata(client); \ 149 - int temp = simple_strtoul(buf, NULL, 10); \ 150 - \ 151 - mutex_lock(&data->update_lock); \ 152 - data->value = TEMP_TO_REG(temp); \ 153 - adm1021_write_value(client, reg, data->value); \ 154 - mutex_unlock(&data->update_lock); \ 155 - return count; \ 147 + static ssize_t show_temp_max(struct device *dev, 148 + struct device_attribute *devattr, char *buf) 149 + { 150 + int index = to_sensor_dev_attr(devattr)->index; 151 + struct adm1021_data *data = adm1021_update_device(dev); 152 + 153 + return sprintf(buf, "%d\n", 1000 * data->temp_max[index]); 156 154 } 157 - set(temp_max, ADM1021_REG_TOS_W); 158 - set(temp_hyst, ADM1021_REG_THYST_W); 159 - set(remote_temp_max, ADM1021_REG_REMOTE_TOS_W); 160 - set(remote_temp_hyst, ADM1021_REG_REMOTE_THYST_W); 161 155 162 - static DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max, set_temp_max); 163 - static DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp_hyst, set_temp_hyst); 164 - static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp_input, NULL); 165 - static DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_remote_temp_max, set_remote_temp_max); 166 - static DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_remote_temp_hyst, set_remote_temp_hyst); 167 - static DEVICE_ATTR(temp2_input, S_IRUGO, show_remote_temp_input, NULL); 156 + static ssize_t show_temp_min(struct device *dev, 157 + struct device_attribute *devattr, char *buf) 158 + { 159 + int index = to_sensor_dev_attr(devattr)->index; 160 + struct adm1021_data *data = adm1021_update_device(dev); 161 + 162 + return sprintf(buf, "%d\n", 1000 * data->temp_min[index]); 163 + } 164 + 165 + static ssize_t show_alarm(struct device *dev, struct device_attribute *attr, 166 + char *buf) 167 + { 168 + int index = to_sensor_dev_attr(attr)->index; 169 + struct adm1021_data *data = adm1021_update_device(dev); 170 + return sprintf(buf, "%u\n", (data->alarms >> index) & 1); 171 + } 172 + 173 + static ssize_t show_alarms(struct device *dev, 174 + struct device_attribute *attr, 175 + char *buf) 176 + { 177 + struct adm1021_data *data = adm1021_update_device(dev); 178 + return sprintf(buf, "%u\n", data->alarms); 179 + } 180 + 181 + static ssize_t set_temp_max(struct device *dev, 182 + struct device_attribute *devattr, 183 + const char *buf, size_t count) 184 + { 185 + int index = to_sensor_dev_attr(devattr)->index; 186 + struct i2c_client *client = to_i2c_client(dev); 187 + struct adm1021_data *data = i2c_get_clientdata(client); 188 + long temp = simple_strtol(buf, NULL, 10) / 1000; 189 + 190 + mutex_lock(&data->update_lock); 191 + data->temp_max[index] = SENSORS_LIMIT(temp, -128, 127); 192 + if (!read_only) 193 + i2c_smbus_write_byte_data(client, ADM1021_REG_TOS_W(index), 194 + data->temp_max[index]); 195 + mutex_unlock(&data->update_lock); 196 + 197 + return count; 198 + } 199 + 200 + static ssize_t set_temp_min(struct device *dev, 201 + struct device_attribute *devattr, 202 + const char *buf, size_t count) 203 + { 204 + int index = to_sensor_dev_attr(devattr)->index; 205 + struct i2c_client *client = to_i2c_client(dev); 206 + struct adm1021_data *data = i2c_get_clientdata(client); 207 + long temp = simple_strtol(buf, NULL, 10) / 1000; 208 + 209 + mutex_lock(&data->update_lock); 210 + data->temp_min[index] = SENSORS_LIMIT(temp, -128, 127); 211 + if (!read_only) 212 + i2c_smbus_write_byte_data(client, ADM1021_REG_THYST_W(index), 213 + data->temp_min[index]); 214 + mutex_unlock(&data->update_lock); 215 + 216 + return count; 217 + } 218 + 219 + static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0); 220 + static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max, 221 + set_temp_max, 0); 222 + static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp_min, 223 + set_temp_min, 0); 224 + static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1); 225 + static SENSOR_DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_temp_max, 226 + set_temp_max, 1); 227 + static SENSOR_DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_temp_min, 228 + set_temp_min, 1); 229 + static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 6); 230 + static SENSOR_DEVICE_ATTR(temp1_min_alarm, S_IRUGO, show_alarm, NULL, 5); 231 + static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO, show_alarm, NULL, 4); 232 + static SENSOR_DEVICE_ATTR(temp2_min_alarm, S_IRUGO, show_alarm, NULL, 3); 233 + static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_alarm, NULL, 2); 234 + 168 235 static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); 169 - 170 236 171 237 static int adm1021_attach_adapter(struct i2c_adapter *adapter) 172 238 { ··· 227 191 } 228 192 229 193 static struct attribute *adm1021_attributes[] = { 230 - &dev_attr_temp1_max.attr, 231 - &dev_attr_temp1_min.attr, 232 - &dev_attr_temp1_input.attr, 233 - &dev_attr_temp2_max.attr, 234 - &dev_attr_temp2_min.attr, 235 - &dev_attr_temp2_input.attr, 194 + &sensor_dev_attr_temp1_max.dev_attr.attr, 195 + &sensor_dev_attr_temp1_min.dev_attr.attr, 196 + &sensor_dev_attr_temp1_input.dev_attr.attr, 197 + &sensor_dev_attr_temp2_max.dev_attr.attr, 198 + &sensor_dev_attr_temp2_min.dev_attr.attr, 199 + &sensor_dev_attr_temp2_input.dev_attr.attr, 200 + &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, 201 + &sensor_dev_attr_temp1_min_alarm.dev_attr.attr, 202 + &sensor_dev_attr_temp2_max_alarm.dev_attr.attr, 203 + &sensor_dev_attr_temp2_min_alarm.dev_attr.attr, 204 + &sensor_dev_attr_temp2_fault.dev_attr.attr, 236 205 &dev_attr_alarms.attr, 237 206 NULL 238 207 }; ··· 249 208 static int adm1021_detect(struct i2c_adapter *adapter, int address, int kind) 250 209 { 251 210 int i; 252 - struct i2c_client *new_client; 211 + struct i2c_client *client; 253 212 struct adm1021_data *data; 254 213 int err = 0; 255 214 const char *type_name = ""; 215 + int conv_rate, status, config; 256 216 257 - if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) 217 + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { 218 + pr_debug("adm1021: detect failed, " 219 + "smbus byte data not supported!\n"); 258 220 goto error0; 221 + } 259 222 260 223 /* OK. For now, we presume we have a valid client. We now create the 261 224 client structure, even though we cannot fill it completely yet. 262 - But it allows us to access adm1021_{read,write}_value. */ 225 + But it allows us to access adm1021 register values. */ 263 226 264 227 if (!(data = kzalloc(sizeof(struct adm1021_data), GFP_KERNEL))) { 228 + pr_debug("adm1021: detect failed, kzalloc failed!\n"); 265 229 err = -ENOMEM; 266 230 goto error0; 267 231 } 268 232 269 - new_client = &data->client; 270 - i2c_set_clientdata(new_client, data); 271 - new_client->addr = address; 272 - new_client->adapter = adapter; 273 - new_client->driver = &adm1021_driver; 274 - new_client->flags = 0; 233 + client = &data->client; 234 + i2c_set_clientdata(client, data); 235 + client->addr = address; 236 + client->adapter = adapter; 237 + client->driver = &adm1021_driver; 238 + status = i2c_smbus_read_byte_data(client, ADM1021_REG_STATUS); 239 + conv_rate = i2c_smbus_read_byte_data(client, 240 + ADM1021_REG_CONV_RATE_R); 241 + config = i2c_smbus_read_byte_data(client, ADM1021_REG_CONFIG_R); 275 242 276 243 /* Now, we do the remaining detection. */ 277 244 if (kind < 0) { 278 - if ((adm1021_read_value(new_client, ADM1021_REG_STATUS) & 0x03) != 0x00 279 - || (adm1021_read_value(new_client, ADM1021_REG_CONFIG_R) & 0x3F) != 0x00 280 - || (adm1021_read_value(new_client, ADM1021_REG_CONV_RATE_R) & 0xF8) != 0x00) { 245 + if ((status & 0x03) != 0x00 || (config & 0x3F) != 0x00 246 + || (conv_rate & 0xF8) != 0x00) { 247 + pr_debug("adm1021: detect failed, " 248 + "chip not detected!\n"); 281 249 err = -ENODEV; 282 250 goto error1; 283 251 } ··· 294 244 295 245 /* Determine the chip type. */ 296 246 if (kind <= 0) { 297 - i = adm1021_read_value(new_client, ADM1021_REG_MAN_ID); 247 + i = i2c_smbus_read_byte_data(client, ADM1021_REG_MAN_ID); 298 248 if (i == 0x41) 299 - if ((adm1021_read_value(new_client, ADM1021_REG_DEV_ID) & 0x0F0) == 0x030) 249 + if ((i2c_smbus_read_byte_data(client, 250 + ADM1021_REG_DEV_ID) & 0xF0) == 0x30) 300 251 kind = adm1023; 301 252 else 302 253 kind = adm1021; ··· 306 255 else if (i == 0x23) 307 256 kind = gl523sm; 308 257 else if ((i == 0x4d) && 309 - (adm1021_read_value(new_client, ADM1021_REG_DEV_ID) == 0x01)) 258 + (i2c_smbus_read_byte_data(client, 259 + ADM1021_REG_DEV_ID) == 0x01)) 310 260 kind = max1617a; 311 261 else if (i == 0x54) 312 262 kind = mc1066; 313 263 /* LM84 Mfr ID in a different place, and it has more unused bits */ 314 - else if (adm1021_read_value(new_client, ADM1021_REG_CONV_RATE_R) == 0x00 315 - && (kind == 0 /* skip extra detection */ 316 - || ((adm1021_read_value(new_client, ADM1021_REG_CONFIG_R) & 0x7F) == 0x00 317 - && (adm1021_read_value(new_client, ADM1021_REG_STATUS) & 0xAB) == 0x00))) 264 + else if (conv_rate == 0x00 265 + && (kind == 0 /* skip extra detection */ 266 + || ((config & 0x7F) == 0x00 267 + && (status & 0xAB) == 0x00))) 318 268 kind = lm84; 319 269 else 320 270 kind = max1617; ··· 338 286 } else if (kind == mc1066) { 339 287 type_name = "mc1066"; 340 288 } 289 + pr_debug("adm1021: Detected chip %s at adapter %d, address 0x%02x.\n", 290 + type_name, i2c_adapter_id(adapter), address); 341 291 342 - /* Fill in the remaining client fields and put it into the global list */ 343 - strlcpy(new_client->name, type_name, I2C_NAME_SIZE); 292 + /* Fill in the remaining client fields */ 293 + strlcpy(client->name, type_name, I2C_NAME_SIZE); 344 294 data->type = kind; 345 - data->valid = 0; 346 295 mutex_init(&data->update_lock); 347 296 348 297 /* Tell the I2C layer a new client has arrived */ 349 - if ((err = i2c_attach_client(new_client))) 298 + if ((err = i2c_attach_client(client))) 350 299 goto error1; 351 300 352 301 /* Initialize the ADM1021 chip */ 353 - if (kind != lm84) 354 - adm1021_init_client(new_client); 302 + if (kind != lm84 && !read_only) 303 + adm1021_init_client(client); 355 304 356 305 /* Register sysfs hooks */ 357 - if ((err = sysfs_create_group(&new_client->dev.kobj, &adm1021_group))) 306 + if ((err = sysfs_create_group(&client->dev.kobj, &adm1021_group))) 358 307 goto error2; 359 308 360 - data->class_dev = hwmon_device_register(&new_client->dev); 361 - if (IS_ERR(data->class_dev)) { 362 - err = PTR_ERR(data->class_dev); 309 + data->hwmon_dev = hwmon_device_register(&client->dev); 310 + if (IS_ERR(data->hwmon_dev)) { 311 + err = PTR_ERR(data->hwmon_dev); 363 312 goto error3; 364 313 } 365 314 366 315 return 0; 367 316 368 317 error3: 369 - sysfs_remove_group(&new_client->dev.kobj, &adm1021_group); 318 + sysfs_remove_group(&client->dev.kobj, &adm1021_group); 370 319 error2: 371 - i2c_detach_client(new_client); 320 + i2c_detach_client(client); 372 321 error1: 373 322 kfree(data); 374 323 error0: ··· 379 326 static void adm1021_init_client(struct i2c_client *client) 380 327 { 381 328 /* Enable ADC and disable suspend mode */ 382 - adm1021_write_value(client, ADM1021_REG_CONFIG_W, 383 - adm1021_read_value(client, ADM1021_REG_CONFIG_R) & 0xBF); 329 + i2c_smbus_write_byte_data(client, ADM1021_REG_CONFIG_W, 330 + i2c_smbus_read_byte_data(client, ADM1021_REG_CONFIG_R) & 0xBF); 384 331 /* Set Conversion rate to 1/sec (this can be tinkered with) */ 385 - adm1021_write_value(client, ADM1021_REG_CONV_RATE_W, 0x04); 332 + i2c_smbus_write_byte_data(client, ADM1021_REG_CONV_RATE_W, 0x04); 386 333 } 387 334 388 335 static int adm1021_detach_client(struct i2c_client *client) ··· 390 337 struct adm1021_data *data = i2c_get_clientdata(client); 391 338 int err; 392 339 393 - hwmon_device_unregister(data->class_dev); 340 + hwmon_device_unregister(data->hwmon_dev); 394 341 sysfs_remove_group(&client->dev.kobj, &adm1021_group); 395 342 396 343 if ((err = i2c_detach_client(client))) 397 344 return err; 398 345 399 346 kfree(data); 400 - return 0; 401 - } 402 - 403 - /* All registers are byte-sized */ 404 - static int adm1021_read_value(struct i2c_client *client, u8 reg) 405 - { 406 - return i2c_smbus_read_byte_data(client, reg); 407 - } 408 - 409 - static int adm1021_write_value(struct i2c_client *client, u8 reg, u16 value) 410 - { 411 - if (!read_only) 412 - return i2c_smbus_write_byte_data(client, reg, value); 413 347 return 0; 414 348 } 415 349 ··· 409 369 410 370 if (time_after(jiffies, data->last_updated + HZ + HZ / 2) 411 371 || !data->valid) { 372 + int i; 373 + 412 374 dev_dbg(&client->dev, "Starting adm1021 update\n"); 413 375 414 - data->temp_input = adm1021_read_value(client, ADM1021_REG_TEMP); 415 - data->temp_max = adm1021_read_value(client, ADM1021_REG_TOS_R); 416 - data->temp_hyst = adm1021_read_value(client, ADM1021_REG_THYST_R); 417 - data->remote_temp_input = adm1021_read_value(client, ADM1021_REG_REMOTE_TEMP); 418 - data->remote_temp_max = adm1021_read_value(client, ADM1021_REG_REMOTE_TOS_R); 419 - data->remote_temp_hyst = adm1021_read_value(client, ADM1021_REG_REMOTE_THYST_R); 420 - data->alarms = adm1021_read_value(client, ADM1021_REG_STATUS) & 0x7c; 376 + for (i = 0; i < 2; i++) { 377 + data->temp[i] = i2c_smbus_read_byte_data(client, 378 + ADM1021_REG_TEMP(i)); 379 + data->temp_max[i] = i2c_smbus_read_byte_data(client, 380 + ADM1021_REG_TOS_R(i)); 381 + data->temp_min[i] = i2c_smbus_read_byte_data(client, 382 + ADM1021_REG_THYST_R(i)); 383 + } 384 + data->alarms = i2c_smbus_read_byte_data(client, 385 + ADM1021_REG_STATUS) & 0x7c; 421 386 if (data->type == adm1023) { 422 - data->remote_temp_prec = adm1021_read_value(client, ADM1021_REG_REM_TEMP_PREC); 423 - data->remote_temp_os_prec = adm1021_read_value(client, ADM1021_REG_REM_TOS_PREC); 424 - data->remote_temp_hyst_prec = adm1021_read_value(client, ADM1021_REG_REM_THYST_PREC); 425 - data->remote_temp_offset = adm1021_read_value(client, ADM1021_REG_REM_OFFSET); 426 - data->remote_temp_offset_prec = adm1021_read_value(client, ADM1021_REG_REM_OFFSET_PREC); 387 + data->remote_temp_prec = 388 + i2c_smbus_read_byte_data(client, 389 + ADM1023_REG_REM_TEMP_PREC); 390 + data->remote_temp_os_prec = 391 + i2c_smbus_read_byte_data(client, 392 + ADM1023_REG_REM_TOS_PREC); 393 + data->remote_temp_hyst_prec = 394 + i2c_smbus_read_byte_data(client, 395 + ADM1023_REG_REM_THYST_PREC); 396 + data->remote_temp_offset = 397 + i2c_smbus_read_byte_data(client, 398 + ADM1023_REG_REM_OFFSET); 399 + data->remote_temp_offset_prec = 400 + i2c_smbus_read_byte_data(client, 401 + ADM1023_REG_REM_OFFSET_PREC); 427 402 } 428 403 data->last_updated = jiffies; 429 404 data->valid = 1;
+6 -6
drivers/hwmon/adm1025.c
··· 133 133 134 134 struct adm1025_data { 135 135 struct i2c_client client; 136 - struct class_device *class_dev; 136 + struct device *hwmon_dev; 137 137 struct mutex update_lock; 138 138 char valid; /* zero until following fields are valid */ 139 139 unsigned long last_updated; /* in jiffies */ ··· 292 292 293 293 static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf) 294 294 { 295 - struct adm1025_data *data = adm1025_update_device(dev); 295 + struct adm1025_data *data = dev_get_drvdata(dev); 296 296 return sprintf(buf, "%u\n", data->vrm); 297 297 } 298 298 static ssize_t set_vrm(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) ··· 472 472 goto exit_remove; 473 473 } 474 474 475 - data->class_dev = hwmon_device_register(&new_client->dev); 476 - if (IS_ERR(data->class_dev)) { 477 - err = PTR_ERR(data->class_dev); 475 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 476 + if (IS_ERR(data->hwmon_dev)) { 477 + err = PTR_ERR(data->hwmon_dev); 478 478 goto exit_remove; 479 479 } 480 480 ··· 538 538 struct adm1025_data *data = i2c_get_clientdata(client); 539 539 int err; 540 540 541 - hwmon_device_unregister(data->class_dev); 541 + hwmon_device_unregister(data->hwmon_dev); 542 542 sysfs_remove_group(&client->dev.kobj, &adm1025_group); 543 543 sysfs_remove_group(&client->dev.kobj, &adm1025_group_opt); 544 544
+6 -6
drivers/hwmon/adm1026.c
··· 260 260 261 261 struct adm1026_data { 262 262 struct i2c_client client; 263 - struct class_device *class_dev; 263 + struct device *hwmon_dev; 264 264 enum chips type; 265 265 266 266 struct mutex update_lock; ··· 1221 1221 1222 1222 static ssize_t show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf) 1223 1223 { 1224 - struct adm1026_data *data = adm1026_update_device(dev); 1224 + struct adm1026_data *data = dev_get_drvdata(dev); 1225 1225 return sprintf(buf,"%d\n", data->vrm); 1226 1226 } 1227 1227 static ssize_t store_vrm_reg(struct device *dev, struct device_attribute *attr, const char *buf, ··· 1676 1676 if ((err = sysfs_create_group(&new_client->dev.kobj, &adm1026_group))) 1677 1677 goto exitdetach; 1678 1678 1679 - data->class_dev = hwmon_device_register(&new_client->dev); 1680 - if (IS_ERR(data->class_dev)) { 1681 - err = PTR_ERR(data->class_dev); 1679 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 1680 + if (IS_ERR(data->hwmon_dev)) { 1681 + err = PTR_ERR(data->hwmon_dev); 1682 1682 goto exitremove; 1683 1683 } 1684 1684 ··· 1698 1698 static int adm1026_detach_client(struct i2c_client *client) 1699 1699 { 1700 1700 struct adm1026_data *data = i2c_get_clientdata(client); 1701 - hwmon_device_unregister(data->class_dev); 1701 + hwmon_device_unregister(data->hwmon_dev); 1702 1702 sysfs_remove_group(&client->dev.kobj, &adm1026_group); 1703 1703 i2c_detach_client(client); 1704 1704 kfree(data);
+5 -5
drivers/hwmon/adm1029.c
··· 141 141 142 142 struct adm1029_data { 143 143 struct i2c_client client; 144 - struct class_device *class_dev; 144 + struct device *hwmon_dev; 145 145 struct mutex update_lock; 146 146 char valid; /* zero until following fields are valid */ 147 147 unsigned long last_updated; /* in jiffies */ ··· 391 391 if ((err = sysfs_create_group(&client->dev.kobj, &adm1029_group))) 392 392 goto exit_detach; 393 393 394 - data->class_dev = hwmon_device_register(&client->dev); 395 - if (IS_ERR(data->class_dev)) { 396 - err = PTR_ERR(data->class_dev); 394 + data->hwmon_dev = hwmon_device_register(&client->dev); 395 + if (IS_ERR(data->hwmon_dev)) { 396 + err = PTR_ERR(data->hwmon_dev); 397 397 goto exit_remove_files; 398 398 } 399 399 ··· 431 431 struct adm1029_data *data = i2c_get_clientdata(client); 432 432 int err; 433 433 434 - hwmon_device_unregister(data->class_dev); 434 + hwmon_device_unregister(data->hwmon_dev); 435 435 sysfs_remove_group(&client->dev.kobj, &adm1029_group); 436 436 437 437 if ((err = i2c_detach_client(client)))
+5 -5
drivers/hwmon/adm1031.c
··· 70 70 /* Each client has this additional data */ 71 71 struct adm1031_data { 72 72 struct i2c_client client; 73 - struct class_device *class_dev; 73 + struct device *hwmon_dev; 74 74 struct mutex update_lock; 75 75 int chip_type; 76 76 char valid; /* !=0 if following fields are valid */ ··· 853 853 goto exit_remove; 854 854 } 855 855 856 - data->class_dev = hwmon_device_register(&new_client->dev); 857 - if (IS_ERR(data->class_dev)) { 858 - err = PTR_ERR(data->class_dev); 856 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 857 + if (IS_ERR(data->hwmon_dev)) { 858 + err = PTR_ERR(data->hwmon_dev); 859 859 goto exit_remove; 860 860 } 861 861 ··· 877 877 struct adm1031_data *data = i2c_get_clientdata(client); 878 878 int ret; 879 879 880 - hwmon_device_unregister(data->class_dev); 880 + hwmon_device_unregister(data->hwmon_dev); 881 881 sysfs_remove_group(&client->dev.kobj, &adm1031_group); 882 882 sysfs_remove_group(&client->dev.kobj, &adm1031_group_opt); 883 883 if ((ret = i2c_detach_client(client)) != 0) {
+5 -5
drivers/hwmon/adm9240.c
··· 150 150 struct adm9240_data { 151 151 enum chips type; 152 152 struct i2c_client client; 153 - struct class_device *class_dev; 153 + struct device *hwmon_dev; 154 154 struct mutex update_lock; 155 155 char valid; 156 156 unsigned long last_updated_measure; ··· 590 590 if ((err = sysfs_create_group(&new_client->dev.kobj, &adm9240_group))) 591 591 goto exit_detach; 592 592 593 - data->class_dev = hwmon_device_register(&new_client->dev); 594 - if (IS_ERR(data->class_dev)) { 595 - err = PTR_ERR(data->class_dev); 593 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 594 + if (IS_ERR(data->hwmon_dev)) { 595 + err = PTR_ERR(data->hwmon_dev); 596 596 goto exit_remove; 597 597 } 598 598 ··· 620 620 struct adm9240_data *data = i2c_get_clientdata(client); 621 621 int err; 622 622 623 - hwmon_device_unregister(data->class_dev); 623 + hwmon_device_unregister(data->hwmon_dev); 624 624 sysfs_remove_group(&client->dev.kobj, &adm9240_group); 625 625 626 626 if ((err = i2c_detach_client(client)))
+1050
drivers/hwmon/adt7470.c
··· 1 + /* 2 + * A hwmon driver for the Analog Devices ADT7470 3 + * Copyright (C) 2007 IBM 4 + * 5 + * Author: Darrick J. Wong <djwong@us.ibm.com> 6 + * 7 + * This program is free software; you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License as published by 9 + * the Free Software Foundation; either version 2 of the License, or 10 + * (at your option) any later version. 11 + * 12 + * This program is distributed in the hope that it will be useful, 13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 + * GNU General Public License for more details. 16 + * 17 + * You should have received a copy of the GNU General Public License 18 + * along with this program; if not, write to the Free Software 19 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 + */ 21 + 22 + #include <linux/module.h> 23 + #include <linux/jiffies.h> 24 + #include <linux/i2c.h> 25 + #include <linux/hwmon.h> 26 + #include <linux/hwmon-sysfs.h> 27 + #include <linux/err.h> 28 + #include <linux/mutex.h> 29 + #include <linux/delay.h> 30 + #include <linux/log2.h> 31 + 32 + /* Addresses to scan */ 33 + static unsigned short normal_i2c[] = { 0x2C, 0x2E, 0x2F, I2C_CLIENT_END }; 34 + 35 + /* Insmod parameters */ 36 + I2C_CLIENT_INSMOD_1(adt7470); 37 + 38 + /* ADT7470 registers */ 39 + #define ADT7470_REG_BASE_ADDR 0x20 40 + #define ADT7470_REG_TEMP_BASE_ADDR 0x20 41 + #define ADT7470_REG_TEMP_MAX_ADDR 0x29 42 + #define ADT7470_REG_FAN_BASE_ADDR 0x2A 43 + #define ADT7470_REG_FAN_MAX_ADDR 0x31 44 + #define ADT7470_REG_PWM_BASE_ADDR 0x32 45 + #define ADT7470_REG_PWM_MAX_ADDR 0x35 46 + #define ADT7470_REG_PWM_MAX_BASE_ADDR 0x38 47 + #define ADT7470_REG_PWM_MAX_MAX_ADDR 0x3B 48 + #define ADT7470_REG_CFG 0x40 49 + #define ADT7470_FSPD_MASK 0x04 50 + #define ADT7470_REG_ALARM1 0x41 51 + #define ADT7470_REG_ALARM2 0x42 52 + #define ADT7470_REG_TEMP_LIMITS_BASE_ADDR 0x44 53 + #define ADT7470_REG_TEMP_LIMITS_MAX_ADDR 0x57 54 + #define ADT7470_REG_FAN_MIN_BASE_ADDR 0x58 55 + #define ADT7470_REG_FAN_MIN_MAX_ADDR 0x5F 56 + #define ADT7470_REG_FAN_MAX_BASE_ADDR 0x60 57 + #define ADT7470_REG_FAN_MAX_MAX_ADDR 0x67 58 + #define ADT7470_REG_PWM_CFG_BASE_ADDR 0x68 59 + #define ADT7470_REG_PWM12_CFG 0x68 60 + #define ADT7470_PWM2_AUTO_MASK 0x40 61 + #define ADT7470_PWM1_AUTO_MASK 0x80 62 + #define ADT7470_REG_PWM34_CFG 0x69 63 + #define ADT7470_PWM3_AUTO_MASK 0x40 64 + #define ADT7470_PWM4_AUTO_MASK 0x80 65 + #define ADT7470_REG_PWM_MIN_BASE_ADDR 0x6A 66 + #define ADT7470_REG_PWM_MIN_MAX_ADDR 0x6D 67 + #define ADT7470_REG_PWM_TEMP_MIN_BASE_ADDR 0x6E 68 + #define ADT7470_REG_PWM_TEMP_MIN_MAX_ADDR 0x71 69 + #define ADT7470_REG_ACOUSTICS12 0x75 70 + #define ADT7470_REG_ACOUSTICS34 0x76 71 + #define ADT7470_REG_DEVICE 0x3D 72 + #define ADT7470_REG_VENDOR 0x3E 73 + #define ADT7470_REG_REVISION 0x3F 74 + #define ADT7470_REG_ALARM1_MASK 0x72 75 + #define ADT7470_REG_ALARM2_MASK 0x73 76 + #define ADT7470_REG_PWM_AUTO_TEMP_BASE_ADDR 0x7C 77 + #define ADT7470_REG_PWM_AUTO_TEMP_MAX_ADDR 0x7D 78 + #define ADT7470_REG_MAX_ADDR 0x81 79 + 80 + #define ADT7470_TEMP_COUNT 10 81 + #define ADT7470_TEMP_REG(x) (ADT7470_REG_TEMP_BASE_ADDR + (x)) 82 + #define ADT7470_TEMP_MIN_REG(x) (ADT7470_REG_TEMP_LIMITS_BASE_ADDR + ((x) * 2)) 83 + #define ADT7470_TEMP_MAX_REG(x) (ADT7470_REG_TEMP_LIMITS_BASE_ADDR + \ 84 + ((x) * 2) + 1) 85 + 86 + #define ADT7470_FAN_COUNT 4 87 + #define ADT7470_REG_FAN(x) (ADT7470_REG_FAN_BASE_ADDR + ((x) * 2)) 88 + #define ADT7470_REG_FAN_MIN(x) (ADT7470_REG_FAN_MIN_BASE_ADDR + ((x) * 2)) 89 + #define ADT7470_REG_FAN_MAX(x) (ADT7470_REG_FAN_MAX_BASE_ADDR + ((x) * 2)) 90 + 91 + #define ADT7470_PWM_COUNT 4 92 + #define ADT7470_REG_PWM(x) (ADT7470_REG_PWM_BASE_ADDR + (x)) 93 + #define ADT7470_REG_PWM_MAX(x) (ADT7470_REG_PWM_MAX_BASE_ADDR + (x)) 94 + #define ADT7470_REG_PWM_MIN(x) (ADT7470_REG_PWM_MIN_BASE_ADDR + (x)) 95 + #define ADT7470_REG_PWM_TMIN(x) (ADT7470_REG_PWM_TEMP_MIN_BASE_ADDR + (x)) 96 + #define ADT7470_REG_PWM_CFG(x) (ADT7470_REG_PWM_CFG_BASE_ADDR + ((x) / 2)) 97 + #define ADT7470_REG_PWM_AUTO_TEMP(x) (ADT7470_REG_PWM_AUTO_TEMP_BASE_ADDR + \ 98 + ((x) / 2)) 99 + 100 + #define ADT7470_VENDOR 0x41 101 + #define ADT7470_DEVICE 0x70 102 + /* datasheet only mentions a revision 2 */ 103 + #define ADT7470_REVISION 0x02 104 + 105 + /* "all temps" according to hwmon sysfs interface spec */ 106 + #define ADT7470_PWM_ALL_TEMPS 0x3FF 107 + 108 + /* How often do we reread sensors values? (In jiffies) */ 109 + #define SENSOR_REFRESH_INTERVAL (5 * HZ) 110 + 111 + /* How often do we reread sensor limit values? (In jiffies) */ 112 + #define LIMIT_REFRESH_INTERVAL (60 * HZ) 113 + 114 + /* sleep 1s while gathering temperature data */ 115 + #define TEMP_COLLECTION_TIME 1000 116 + 117 + #define power_of_2(x) (((x) & ((x) - 1)) == 0) 118 + 119 + /* datasheet says to divide this number by the fan reading to get fan rpm */ 120 + #define FAN_PERIOD_TO_RPM(x) ((90000 * 60) / (x)) 121 + #define FAN_RPM_TO_PERIOD FAN_PERIOD_TO_RPM 122 + #define FAN_PERIOD_INVALID 65535 123 + #define FAN_DATA_VALID(x) ((x) && (x) != FAN_PERIOD_INVALID) 124 + 125 + struct adt7470_data { 126 + struct i2c_client client; 127 + struct device *hwmon_dev; 128 + struct attribute_group attrs; 129 + struct mutex lock; 130 + char sensors_valid; 131 + char limits_valid; 132 + unsigned long sensors_last_updated; /* In jiffies */ 133 + unsigned long limits_last_updated; /* In jiffies */ 134 + 135 + s8 temp[ADT7470_TEMP_COUNT]; 136 + s8 temp_min[ADT7470_TEMP_COUNT]; 137 + s8 temp_max[ADT7470_TEMP_COUNT]; 138 + u16 fan[ADT7470_FAN_COUNT]; 139 + u16 fan_min[ADT7470_FAN_COUNT]; 140 + u16 fan_max[ADT7470_FAN_COUNT]; 141 + u16 alarms, alarms_mask; 142 + u8 force_pwm_max; 143 + u8 pwm[ADT7470_PWM_COUNT]; 144 + u8 pwm_max[ADT7470_PWM_COUNT]; 145 + u8 pwm_automatic[ADT7470_PWM_COUNT]; 146 + u8 pwm_min[ADT7470_PWM_COUNT]; 147 + s8 pwm_tmin[ADT7470_PWM_COUNT]; 148 + u8 pwm_auto_temp[ADT7470_PWM_COUNT]; 149 + }; 150 + 151 + static int adt7470_attach_adapter(struct i2c_adapter *adapter); 152 + static int adt7470_detect(struct i2c_adapter *adapter, int address, int kind); 153 + static int adt7470_detach_client(struct i2c_client *client); 154 + 155 + static struct i2c_driver adt7470_driver = { 156 + .driver = { 157 + .name = "adt7470", 158 + }, 159 + .attach_adapter = adt7470_attach_adapter, 160 + .detach_client = adt7470_detach_client, 161 + }; 162 + 163 + /* 164 + * 16-bit registers on the ADT7470 are low-byte first. The data sheet says 165 + * that the low byte must be read before the high byte. 166 + */ 167 + static inline int adt7470_read_word_data(struct i2c_client *client, u8 reg) 168 + { 169 + u16 foo; 170 + foo = i2c_smbus_read_byte_data(client, reg); 171 + foo |= ((u16)i2c_smbus_read_byte_data(client, reg + 1) << 8); 172 + return foo; 173 + } 174 + 175 + static inline int adt7470_write_word_data(struct i2c_client *client, u8 reg, 176 + u16 value) 177 + { 178 + return i2c_smbus_write_byte_data(client, reg, value & 0xFF) 179 + && i2c_smbus_write_byte_data(client, reg + 1, value >> 8); 180 + } 181 + 182 + static void adt7470_init_client(struct i2c_client *client) 183 + { 184 + int reg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG); 185 + 186 + if (reg < 0) { 187 + dev_err(&client->dev, "cannot read configuration register\n"); 188 + } else { 189 + /* start monitoring (and do a self-test) */ 190 + i2c_smbus_write_byte_data(client, ADT7470_REG_CFG, reg | 3); 191 + } 192 + } 193 + 194 + static struct adt7470_data *adt7470_update_device(struct device *dev) 195 + { 196 + struct i2c_client *client = to_i2c_client(dev); 197 + struct adt7470_data *data = i2c_get_clientdata(client); 198 + unsigned long local_jiffies = jiffies; 199 + u8 cfg; 200 + int i; 201 + 202 + mutex_lock(&data->lock); 203 + if (time_before(local_jiffies, data->sensors_last_updated + 204 + SENSOR_REFRESH_INTERVAL) 205 + && data->sensors_valid) 206 + goto no_sensor_update; 207 + 208 + /* start reading temperature sensors */ 209 + cfg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG); 210 + cfg |= 0x80; 211 + i2c_smbus_write_byte_data(client, ADT7470_REG_CFG, cfg); 212 + 213 + /* 214 + * Delay is 200ms * number of tmp05 sensors. Too bad 215 + * there's no way to figure out how many are connected. 216 + * For now, assume 1s will work. 217 + */ 218 + msleep(TEMP_COLLECTION_TIME); 219 + 220 + /* done reading temperature sensors */ 221 + cfg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG); 222 + cfg &= ~0x80; 223 + i2c_smbus_write_byte_data(client, ADT7470_REG_CFG, cfg); 224 + 225 + for (i = 0; i < ADT7470_TEMP_COUNT; i++) 226 + data->temp[i] = i2c_smbus_read_byte_data(client, 227 + ADT7470_TEMP_REG(i)); 228 + 229 + for (i = 0; i < ADT7470_FAN_COUNT; i++) 230 + data->fan[i] = adt7470_read_word_data(client, 231 + ADT7470_REG_FAN(i)); 232 + 233 + for (i = 0; i < ADT7470_PWM_COUNT; i++) { 234 + int reg; 235 + int reg_mask; 236 + 237 + data->pwm[i] = i2c_smbus_read_byte_data(client, 238 + ADT7470_REG_PWM(i)); 239 + 240 + if (i % 2) 241 + reg_mask = ADT7470_PWM2_AUTO_MASK; 242 + else 243 + reg_mask = ADT7470_PWM1_AUTO_MASK; 244 + 245 + reg = ADT7470_REG_PWM_CFG(i); 246 + if (i2c_smbus_read_byte_data(client, reg) & reg_mask) 247 + data->pwm_automatic[i] = 1; 248 + else 249 + data->pwm_automatic[i] = 0; 250 + 251 + reg = ADT7470_REG_PWM_AUTO_TEMP(i); 252 + cfg = i2c_smbus_read_byte_data(client, reg); 253 + if (!(i % 2)) 254 + data->pwm_auto_temp[i] = cfg >> 4; 255 + else 256 + data->pwm_auto_temp[i] = cfg & 0xF; 257 + } 258 + 259 + if (i2c_smbus_read_byte_data(client, ADT7470_REG_CFG) & 260 + ADT7470_FSPD_MASK) 261 + data->force_pwm_max = 1; 262 + else 263 + data->force_pwm_max = 0; 264 + 265 + data->alarms = adt7470_read_word_data(client, ADT7470_REG_ALARM1); 266 + data->alarms_mask = adt7470_read_word_data(client, 267 + ADT7470_REG_ALARM1_MASK); 268 + 269 + data->sensors_last_updated = local_jiffies; 270 + data->sensors_valid = 1; 271 + 272 + no_sensor_update: 273 + if (time_before(local_jiffies, data->limits_last_updated + 274 + LIMIT_REFRESH_INTERVAL) 275 + && data->limits_valid) 276 + goto out; 277 + 278 + for (i = 0; i < ADT7470_TEMP_COUNT; i++) { 279 + data->temp_min[i] = i2c_smbus_read_byte_data(client, 280 + ADT7470_TEMP_MIN_REG(i)); 281 + data->temp_max[i] = i2c_smbus_read_byte_data(client, 282 + ADT7470_TEMP_MAX_REG(i)); 283 + } 284 + 285 + for (i = 0; i < ADT7470_FAN_COUNT; i++) { 286 + data->fan_min[i] = adt7470_read_word_data(client, 287 + ADT7470_REG_FAN_MIN(i)); 288 + data->fan_max[i] = adt7470_read_word_data(client, 289 + ADT7470_REG_FAN_MAX(i)); 290 + } 291 + 292 + for (i = 0; i < ADT7470_PWM_COUNT; i++) { 293 + data->pwm_max[i] = i2c_smbus_read_byte_data(client, 294 + ADT7470_REG_PWM_MAX(i)); 295 + data->pwm_min[i] = i2c_smbus_read_byte_data(client, 296 + ADT7470_REG_PWM_MIN(i)); 297 + data->pwm_tmin[i] = i2c_smbus_read_byte_data(client, 298 + ADT7470_REG_PWM_TMIN(i)); 299 + } 300 + 301 + data->limits_last_updated = local_jiffies; 302 + data->limits_valid = 1; 303 + 304 + out: 305 + mutex_unlock(&data->lock); 306 + return data; 307 + } 308 + 309 + static ssize_t show_temp_min(struct device *dev, 310 + struct device_attribute *devattr, 311 + char *buf) 312 + { 313 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 314 + struct adt7470_data *data = adt7470_update_device(dev); 315 + return sprintf(buf, "%d\n", 1000 * data->temp_min[attr->index]); 316 + } 317 + 318 + static ssize_t set_temp_min(struct device *dev, 319 + struct device_attribute *devattr, 320 + const char *buf, 321 + size_t count) 322 + { 323 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 324 + struct i2c_client *client = to_i2c_client(dev); 325 + struct adt7470_data *data = i2c_get_clientdata(client); 326 + int temp = simple_strtol(buf, NULL, 10) / 1000; 327 + 328 + mutex_lock(&data->lock); 329 + data->temp_min[attr->index] = temp; 330 + i2c_smbus_write_byte_data(client, ADT7470_TEMP_MIN_REG(attr->index), 331 + temp); 332 + mutex_unlock(&data->lock); 333 + 334 + return count; 335 + } 336 + 337 + static ssize_t show_temp_max(struct device *dev, 338 + struct device_attribute *devattr, 339 + char *buf) 340 + { 341 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 342 + struct adt7470_data *data = adt7470_update_device(dev); 343 + return sprintf(buf, "%d\n", 1000 * data->temp_max[attr->index]); 344 + } 345 + 346 + static ssize_t set_temp_max(struct device *dev, 347 + struct device_attribute *devattr, 348 + const char *buf, 349 + size_t count) 350 + { 351 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 352 + struct i2c_client *client = to_i2c_client(dev); 353 + struct adt7470_data *data = i2c_get_clientdata(client); 354 + int temp = simple_strtol(buf, NULL, 10) / 1000; 355 + 356 + mutex_lock(&data->lock); 357 + data->temp_max[attr->index] = temp; 358 + i2c_smbus_write_byte_data(client, ADT7470_TEMP_MAX_REG(attr->index), 359 + temp); 360 + mutex_unlock(&data->lock); 361 + 362 + return count; 363 + } 364 + 365 + static ssize_t show_temp(struct device *dev, struct device_attribute *devattr, 366 + char *buf) 367 + { 368 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 369 + struct adt7470_data *data = adt7470_update_device(dev); 370 + return sprintf(buf, "%d\n", 1000 * data->temp[attr->index]); 371 + } 372 + 373 + static ssize_t show_alarms(struct device *dev, 374 + struct device_attribute *devattr, 375 + char *buf) 376 + { 377 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 378 + struct adt7470_data *data = adt7470_update_device(dev); 379 + 380 + if (attr->index) 381 + return sprintf(buf, "%x\n", data->alarms); 382 + else 383 + return sprintf(buf, "%x\n", data->alarms_mask); 384 + } 385 + 386 + static ssize_t show_fan_max(struct device *dev, 387 + struct device_attribute *devattr, 388 + char *buf) 389 + { 390 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 391 + struct adt7470_data *data = adt7470_update_device(dev); 392 + 393 + if (FAN_DATA_VALID(data->fan_max[attr->index])) 394 + return sprintf(buf, "%d\n", 395 + FAN_PERIOD_TO_RPM(data->fan_max[attr->index])); 396 + else 397 + return sprintf(buf, "0\n"); 398 + } 399 + 400 + static ssize_t set_fan_max(struct device *dev, 401 + struct device_attribute *devattr, 402 + const char *buf, size_t count) 403 + { 404 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 405 + struct i2c_client *client = to_i2c_client(dev); 406 + struct adt7470_data *data = i2c_get_clientdata(client); 407 + int temp = simple_strtol(buf, NULL, 10); 408 + 409 + if (!temp) 410 + return -EINVAL; 411 + temp = FAN_RPM_TO_PERIOD(temp); 412 + 413 + mutex_lock(&data->lock); 414 + data->fan_max[attr->index] = temp; 415 + adt7470_write_word_data(client, ADT7470_REG_FAN_MAX(attr->index), temp); 416 + mutex_unlock(&data->lock); 417 + 418 + return count; 419 + } 420 + 421 + static ssize_t show_fan_min(struct device *dev, 422 + struct device_attribute *devattr, 423 + char *buf) 424 + { 425 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 426 + struct adt7470_data *data = adt7470_update_device(dev); 427 + 428 + if (FAN_DATA_VALID(data->fan_min[attr->index])) 429 + return sprintf(buf, "%d\n", 430 + FAN_PERIOD_TO_RPM(data->fan_min[attr->index])); 431 + else 432 + return sprintf(buf, "0\n"); 433 + } 434 + 435 + static ssize_t set_fan_min(struct device *dev, 436 + struct device_attribute *devattr, 437 + const char *buf, size_t count) 438 + { 439 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 440 + struct i2c_client *client = to_i2c_client(dev); 441 + struct adt7470_data *data = i2c_get_clientdata(client); 442 + int temp = simple_strtol(buf, NULL, 10); 443 + 444 + if (!temp) 445 + return -EINVAL; 446 + temp = FAN_RPM_TO_PERIOD(temp); 447 + 448 + mutex_lock(&data->lock); 449 + data->fan_min[attr->index] = temp; 450 + adt7470_write_word_data(client, ADT7470_REG_FAN_MIN(attr->index), temp); 451 + mutex_unlock(&data->lock); 452 + 453 + return count; 454 + } 455 + 456 + static ssize_t show_fan(struct device *dev, struct device_attribute *devattr, 457 + char *buf) 458 + { 459 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 460 + struct adt7470_data *data = adt7470_update_device(dev); 461 + 462 + if (FAN_DATA_VALID(data->fan[attr->index])) 463 + return sprintf(buf, "%d\n", 464 + FAN_PERIOD_TO_RPM(data->fan[attr->index])); 465 + else 466 + return sprintf(buf, "0\n"); 467 + } 468 + 469 + static ssize_t show_force_pwm_max(struct device *dev, 470 + struct device_attribute *devattr, 471 + char *buf) 472 + { 473 + struct adt7470_data *data = adt7470_update_device(dev); 474 + return sprintf(buf, "%d\n", data->force_pwm_max); 475 + } 476 + 477 + static ssize_t set_force_pwm_max(struct device *dev, 478 + struct device_attribute *devattr, 479 + const char *buf, 480 + size_t count) 481 + { 482 + struct i2c_client *client = to_i2c_client(dev); 483 + struct adt7470_data *data = i2c_get_clientdata(client); 484 + int temp = simple_strtol(buf, NULL, 10); 485 + u8 reg; 486 + 487 + mutex_lock(&data->lock); 488 + data->force_pwm_max = temp; 489 + reg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG); 490 + if (temp) 491 + reg |= ADT7470_FSPD_MASK; 492 + else 493 + reg &= ~ADT7470_FSPD_MASK; 494 + i2c_smbus_write_byte_data(client, ADT7470_REG_CFG, reg); 495 + mutex_unlock(&data->lock); 496 + 497 + return count; 498 + } 499 + 500 + static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr, 501 + char *buf) 502 + { 503 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 504 + struct adt7470_data *data = adt7470_update_device(dev); 505 + return sprintf(buf, "%d\n", data->pwm[attr->index]); 506 + } 507 + 508 + static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr, 509 + const char *buf, size_t count) 510 + { 511 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 512 + struct i2c_client *client = to_i2c_client(dev); 513 + struct adt7470_data *data = i2c_get_clientdata(client); 514 + int temp = simple_strtol(buf, NULL, 10); 515 + 516 + mutex_lock(&data->lock); 517 + data->pwm[attr->index] = temp; 518 + i2c_smbus_write_byte_data(client, ADT7470_REG_PWM(attr->index), temp); 519 + mutex_unlock(&data->lock); 520 + 521 + return count; 522 + } 523 + 524 + static ssize_t show_pwm_max(struct device *dev, 525 + struct device_attribute *devattr, 526 + char *buf) 527 + { 528 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 529 + struct adt7470_data *data = adt7470_update_device(dev); 530 + return sprintf(buf, "%d\n", data->pwm_max[attr->index]); 531 + } 532 + 533 + static ssize_t set_pwm_max(struct device *dev, 534 + struct device_attribute *devattr, 535 + const char *buf, 536 + size_t count) 537 + { 538 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 539 + struct i2c_client *client = to_i2c_client(dev); 540 + struct adt7470_data *data = i2c_get_clientdata(client); 541 + int temp = simple_strtol(buf, NULL, 10); 542 + 543 + mutex_lock(&data->lock); 544 + data->pwm_max[attr->index] = temp; 545 + i2c_smbus_write_byte_data(client, ADT7470_REG_PWM_MAX(attr->index), 546 + temp); 547 + mutex_unlock(&data->lock); 548 + 549 + return count; 550 + } 551 + 552 + static ssize_t show_pwm_min(struct device *dev, 553 + struct device_attribute *devattr, 554 + char *buf) 555 + { 556 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 557 + struct adt7470_data *data = adt7470_update_device(dev); 558 + return sprintf(buf, "%d\n", data->pwm_min[attr->index]); 559 + } 560 + 561 + static ssize_t set_pwm_min(struct device *dev, 562 + struct device_attribute *devattr, 563 + const char *buf, 564 + size_t count) 565 + { 566 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 567 + struct i2c_client *client = to_i2c_client(dev); 568 + struct adt7470_data *data = i2c_get_clientdata(client); 569 + int temp = simple_strtol(buf, NULL, 10); 570 + 571 + mutex_lock(&data->lock); 572 + data->pwm_min[attr->index] = temp; 573 + i2c_smbus_write_byte_data(client, ADT7470_REG_PWM_MIN(attr->index), 574 + temp); 575 + mutex_unlock(&data->lock); 576 + 577 + return count; 578 + } 579 + 580 + static ssize_t show_pwm_tmax(struct device *dev, 581 + struct device_attribute *devattr, 582 + char *buf) 583 + { 584 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 585 + struct adt7470_data *data = adt7470_update_device(dev); 586 + /* the datasheet says that tmax = tmin + 20C */ 587 + return sprintf(buf, "%d\n", 1000 * (20 + data->pwm_tmin[attr->index])); 588 + } 589 + 590 + static ssize_t show_pwm_tmin(struct device *dev, 591 + struct device_attribute *devattr, 592 + char *buf) 593 + { 594 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 595 + struct adt7470_data *data = adt7470_update_device(dev); 596 + return sprintf(buf, "%d\n", 1000 * data->pwm_tmin[attr->index]); 597 + } 598 + 599 + static ssize_t set_pwm_tmin(struct device *dev, 600 + struct device_attribute *devattr, 601 + const char *buf, 602 + size_t count) 603 + { 604 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 605 + struct i2c_client *client = to_i2c_client(dev); 606 + struct adt7470_data *data = i2c_get_clientdata(client); 607 + int temp = simple_strtol(buf, NULL, 10) / 1000; 608 + 609 + mutex_lock(&data->lock); 610 + data->pwm_tmin[attr->index] = temp; 611 + i2c_smbus_write_byte_data(client, ADT7470_REG_PWM_TMIN(attr->index), 612 + temp); 613 + mutex_unlock(&data->lock); 614 + 615 + return count; 616 + } 617 + 618 + static ssize_t show_pwm_auto(struct device *dev, 619 + struct device_attribute *devattr, 620 + char *buf) 621 + { 622 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 623 + struct adt7470_data *data = adt7470_update_device(dev); 624 + return sprintf(buf, "%d\n", 1 + data->pwm_automatic[attr->index]); 625 + } 626 + 627 + static ssize_t set_pwm_auto(struct device *dev, 628 + struct device_attribute *devattr, 629 + const char *buf, 630 + size_t count) 631 + { 632 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 633 + struct i2c_client *client = to_i2c_client(dev); 634 + struct adt7470_data *data = i2c_get_clientdata(client); 635 + int temp = simple_strtol(buf, NULL, 10); 636 + int pwm_auto_reg = ADT7470_REG_PWM_CFG(attr->index); 637 + int pwm_auto_reg_mask; 638 + u8 reg; 639 + 640 + if (attr->index % 2) 641 + pwm_auto_reg_mask = ADT7470_PWM2_AUTO_MASK; 642 + else 643 + pwm_auto_reg_mask = ADT7470_PWM1_AUTO_MASK; 644 + 645 + if (temp != 2 && temp != 1) 646 + return -EINVAL; 647 + temp--; 648 + 649 + mutex_lock(&data->lock); 650 + data->pwm_automatic[attr->index] = temp; 651 + reg = i2c_smbus_read_byte_data(client, pwm_auto_reg); 652 + if (temp) 653 + reg |= pwm_auto_reg_mask; 654 + else 655 + reg &= ~pwm_auto_reg_mask; 656 + i2c_smbus_write_byte_data(client, pwm_auto_reg, reg); 657 + mutex_unlock(&data->lock); 658 + 659 + return count; 660 + } 661 + 662 + static ssize_t show_pwm_auto_temp(struct device *dev, 663 + struct device_attribute *devattr, 664 + char *buf) 665 + { 666 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 667 + struct adt7470_data *data = adt7470_update_device(dev); 668 + u8 ctrl = data->pwm_auto_temp[attr->index]; 669 + 670 + if (ctrl) 671 + return sprintf(buf, "%d\n", 1 << (ctrl - 1)); 672 + else 673 + return sprintf(buf, "%d\n", ADT7470_PWM_ALL_TEMPS); 674 + } 675 + 676 + static int cvt_auto_temp(int input) 677 + { 678 + if (input == ADT7470_PWM_ALL_TEMPS) 679 + return 0; 680 + if (input < 1 || !power_of_2(input)) 681 + return -EINVAL; 682 + return ilog2(input) + 1; 683 + } 684 + 685 + static ssize_t set_pwm_auto_temp(struct device *dev, 686 + struct device_attribute *devattr, 687 + const char *buf, 688 + size_t count) 689 + { 690 + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); 691 + struct i2c_client *client = to_i2c_client(dev); 692 + struct adt7470_data *data = i2c_get_clientdata(client); 693 + int temp = cvt_auto_temp(simple_strtol(buf, NULL, 10)); 694 + int pwm_auto_reg = ADT7470_REG_PWM_AUTO_TEMP(attr->index); 695 + u8 reg; 696 + 697 + if (temp < 0) 698 + return temp; 699 + 700 + mutex_lock(&data->lock); 701 + data->pwm_automatic[attr->index] = temp; 702 + reg = i2c_smbus_read_byte_data(client, pwm_auto_reg); 703 + 704 + if (!(attr->index % 2)) { 705 + reg &= 0xF; 706 + reg |= (temp << 4) & 0xF0; 707 + } else { 708 + reg &= 0xF0; 709 + reg |= temp & 0xF; 710 + } 711 + 712 + i2c_smbus_write_byte_data(client, pwm_auto_reg, reg); 713 + mutex_unlock(&data->lock); 714 + 715 + return count; 716 + } 717 + 718 + static SENSOR_DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL, 0); 719 + static SENSOR_DEVICE_ATTR(alarm_mask, S_IRUGO, show_alarms, NULL, 1); 720 + 721 + static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max, 722 + set_temp_max, 0); 723 + static SENSOR_DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_temp_max, 724 + set_temp_max, 1); 725 + static SENSOR_DEVICE_ATTR(temp3_max, S_IWUSR | S_IRUGO, show_temp_max, 726 + set_temp_max, 2); 727 + static SENSOR_DEVICE_ATTR(temp4_max, S_IWUSR | S_IRUGO, show_temp_max, 728 + set_temp_max, 3); 729 + static SENSOR_DEVICE_ATTR(temp5_max, S_IWUSR | S_IRUGO, show_temp_max, 730 + set_temp_max, 4); 731 + static SENSOR_DEVICE_ATTR(temp6_max, S_IWUSR | S_IRUGO, show_temp_max, 732 + set_temp_max, 5); 733 + static SENSOR_DEVICE_ATTR(temp7_max, S_IWUSR | S_IRUGO, show_temp_max, 734 + set_temp_max, 6); 735 + static SENSOR_DEVICE_ATTR(temp8_max, S_IWUSR | S_IRUGO, show_temp_max, 736 + set_temp_max, 7); 737 + static SENSOR_DEVICE_ATTR(temp9_max, S_IWUSR | S_IRUGO, show_temp_max, 738 + set_temp_max, 8); 739 + static SENSOR_DEVICE_ATTR(temp10_max, S_IWUSR | S_IRUGO, show_temp_max, 740 + set_temp_max, 9); 741 + 742 + static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp_min, 743 + set_temp_min, 0); 744 + static SENSOR_DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_temp_min, 745 + set_temp_min, 1); 746 + static SENSOR_DEVICE_ATTR(temp3_min, S_IWUSR | S_IRUGO, show_temp_min, 747 + set_temp_min, 2); 748 + static SENSOR_DEVICE_ATTR(temp4_min, S_IWUSR | S_IRUGO, show_temp_min, 749 + set_temp_min, 3); 750 + static SENSOR_DEVICE_ATTR(temp5_min, S_IWUSR | S_IRUGO, show_temp_min, 751 + set_temp_min, 4); 752 + static SENSOR_DEVICE_ATTR(temp6_min, S_IWUSR | S_IRUGO, show_temp_min, 753 + set_temp_min, 5); 754 + static SENSOR_DEVICE_ATTR(temp7_min, S_IWUSR | S_IRUGO, show_temp_min, 755 + set_temp_min, 6); 756 + static SENSOR_DEVICE_ATTR(temp8_min, S_IWUSR | S_IRUGO, show_temp_min, 757 + set_temp_min, 7); 758 + static SENSOR_DEVICE_ATTR(temp9_min, S_IWUSR | S_IRUGO, show_temp_min, 759 + set_temp_min, 8); 760 + static SENSOR_DEVICE_ATTR(temp10_min, S_IWUSR | S_IRUGO, show_temp_min, 761 + set_temp_min, 9); 762 + 763 + static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0); 764 + static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1); 765 + static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2); 766 + static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_temp, NULL, 3); 767 + static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO, show_temp, NULL, 4); 768 + static SENSOR_DEVICE_ATTR(temp6_input, S_IRUGO, show_temp, NULL, 5); 769 + static SENSOR_DEVICE_ATTR(temp7_input, S_IRUGO, show_temp, NULL, 6); 770 + static SENSOR_DEVICE_ATTR(temp8_input, S_IRUGO, show_temp, NULL, 7); 771 + static SENSOR_DEVICE_ATTR(temp9_input, S_IRUGO, show_temp, NULL, 8); 772 + static SENSOR_DEVICE_ATTR(temp10_input, S_IRUGO, show_temp, NULL, 9); 773 + 774 + static SENSOR_DEVICE_ATTR(fan1_max, S_IWUSR | S_IRUGO, show_fan_max, 775 + set_fan_max, 0); 776 + static SENSOR_DEVICE_ATTR(fan2_max, S_IWUSR | S_IRUGO, show_fan_max, 777 + set_fan_max, 1); 778 + static SENSOR_DEVICE_ATTR(fan3_max, S_IWUSR | S_IRUGO, show_fan_max, 779 + set_fan_max, 2); 780 + static SENSOR_DEVICE_ATTR(fan4_max, S_IWUSR | S_IRUGO, show_fan_max, 781 + set_fan_max, 3); 782 + 783 + static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO, show_fan_min, 784 + set_fan_min, 0); 785 + static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO, show_fan_min, 786 + set_fan_min, 1); 787 + static SENSOR_DEVICE_ATTR(fan3_min, S_IWUSR | S_IRUGO, show_fan_min, 788 + set_fan_min, 2); 789 + static SENSOR_DEVICE_ATTR(fan4_min, S_IWUSR | S_IRUGO, show_fan_min, 790 + set_fan_min, 3); 791 + 792 + static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0); 793 + static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1); 794 + static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2); 795 + static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 3); 796 + 797 + static SENSOR_DEVICE_ATTR(force_pwm_max, S_IWUSR | S_IRUGO, 798 + show_force_pwm_max, set_force_pwm_max, 0); 799 + 800 + static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 0); 801 + static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 1); 802 + static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 2); 803 + static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 3); 804 + 805 + static SENSOR_DEVICE_ATTR(pwm1_auto_point1_pwm, S_IWUSR | S_IRUGO, 806 + show_pwm_min, set_pwm_min, 0); 807 + static SENSOR_DEVICE_ATTR(pwm2_auto_point1_pwm, S_IWUSR | S_IRUGO, 808 + show_pwm_min, set_pwm_min, 1); 809 + static SENSOR_DEVICE_ATTR(pwm3_auto_point1_pwm, S_IWUSR | S_IRUGO, 810 + show_pwm_min, set_pwm_min, 2); 811 + static SENSOR_DEVICE_ATTR(pwm4_auto_point1_pwm, S_IWUSR | S_IRUGO, 812 + show_pwm_min, set_pwm_min, 3); 813 + 814 + static SENSOR_DEVICE_ATTR(pwm1_auto_point2_pwm, S_IWUSR | S_IRUGO, 815 + show_pwm_max, set_pwm_max, 0); 816 + static SENSOR_DEVICE_ATTR(pwm2_auto_point2_pwm, S_IWUSR | S_IRUGO, 817 + show_pwm_max, set_pwm_max, 1); 818 + static SENSOR_DEVICE_ATTR(pwm3_auto_point2_pwm, S_IWUSR | S_IRUGO, 819 + show_pwm_max, set_pwm_max, 2); 820 + static SENSOR_DEVICE_ATTR(pwm4_auto_point2_pwm, S_IWUSR | S_IRUGO, 821 + show_pwm_max, set_pwm_max, 3); 822 + 823 + static SENSOR_DEVICE_ATTR(pwm1_auto_point1_temp, S_IWUSR | S_IRUGO, 824 + show_pwm_tmin, set_pwm_tmin, 0); 825 + static SENSOR_DEVICE_ATTR(pwm2_auto_point1_temp, S_IWUSR | S_IRUGO, 826 + show_pwm_tmin, set_pwm_tmin, 1); 827 + static SENSOR_DEVICE_ATTR(pwm3_auto_point1_temp, S_IWUSR | S_IRUGO, 828 + show_pwm_tmin, set_pwm_tmin, 2); 829 + static SENSOR_DEVICE_ATTR(pwm4_auto_point1_temp, S_IWUSR | S_IRUGO, 830 + show_pwm_tmin, set_pwm_tmin, 3); 831 + 832 + static SENSOR_DEVICE_ATTR(pwm1_auto_point2_temp, S_IRUGO, show_pwm_tmax, 833 + NULL, 0); 834 + static SENSOR_DEVICE_ATTR(pwm2_auto_point2_temp, S_IRUGO, show_pwm_tmax, 835 + NULL, 1); 836 + static SENSOR_DEVICE_ATTR(pwm3_auto_point2_temp, S_IRUGO, show_pwm_tmax, 837 + NULL, 2); 838 + static SENSOR_DEVICE_ATTR(pwm4_auto_point2_temp, S_IRUGO, show_pwm_tmax, 839 + NULL, 3); 840 + 841 + static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, show_pwm_auto, 842 + set_pwm_auto, 0); 843 + static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO, show_pwm_auto, 844 + set_pwm_auto, 1); 845 + static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO, show_pwm_auto, 846 + set_pwm_auto, 2); 847 + static SENSOR_DEVICE_ATTR(pwm4_enable, S_IWUSR | S_IRUGO, show_pwm_auto, 848 + set_pwm_auto, 3); 849 + 850 + static SENSOR_DEVICE_ATTR(pwm1_auto_channels_temp, S_IWUSR | S_IRUGO, 851 + show_pwm_auto_temp, set_pwm_auto_temp, 0); 852 + static SENSOR_DEVICE_ATTR(pwm2_auto_channels_temp, S_IWUSR | S_IRUGO, 853 + show_pwm_auto_temp, set_pwm_auto_temp, 1); 854 + static SENSOR_DEVICE_ATTR(pwm3_auto_channels_temp, S_IWUSR | S_IRUGO, 855 + show_pwm_auto_temp, set_pwm_auto_temp, 2); 856 + static SENSOR_DEVICE_ATTR(pwm4_auto_channels_temp, S_IWUSR | S_IRUGO, 857 + show_pwm_auto_temp, set_pwm_auto_temp, 3); 858 + 859 + static struct attribute *adt7470_attr[] = 860 + { 861 + &sensor_dev_attr_alarms.dev_attr.attr, 862 + &sensor_dev_attr_alarm_mask.dev_attr.attr, 863 + &sensor_dev_attr_temp1_max.dev_attr.attr, 864 + &sensor_dev_attr_temp2_max.dev_attr.attr, 865 + &sensor_dev_attr_temp3_max.dev_attr.attr, 866 + &sensor_dev_attr_temp4_max.dev_attr.attr, 867 + &sensor_dev_attr_temp5_max.dev_attr.attr, 868 + &sensor_dev_attr_temp6_max.dev_attr.attr, 869 + &sensor_dev_attr_temp7_max.dev_attr.attr, 870 + &sensor_dev_attr_temp8_max.dev_attr.attr, 871 + &sensor_dev_attr_temp9_max.dev_attr.attr, 872 + &sensor_dev_attr_temp10_max.dev_attr.attr, 873 + &sensor_dev_attr_temp1_min.dev_attr.attr, 874 + &sensor_dev_attr_temp2_min.dev_attr.attr, 875 + &sensor_dev_attr_temp3_min.dev_attr.attr, 876 + &sensor_dev_attr_temp4_min.dev_attr.attr, 877 + &sensor_dev_attr_temp5_min.dev_attr.attr, 878 + &sensor_dev_attr_temp6_min.dev_attr.attr, 879 + &sensor_dev_attr_temp7_min.dev_attr.attr, 880 + &sensor_dev_attr_temp8_min.dev_attr.attr, 881 + &sensor_dev_attr_temp9_min.dev_attr.attr, 882 + &sensor_dev_attr_temp10_min.dev_attr.attr, 883 + &sensor_dev_attr_temp1_input.dev_attr.attr, 884 + &sensor_dev_attr_temp2_input.dev_attr.attr, 885 + &sensor_dev_attr_temp3_input.dev_attr.attr, 886 + &sensor_dev_attr_temp4_input.dev_attr.attr, 887 + &sensor_dev_attr_temp5_input.dev_attr.attr, 888 + &sensor_dev_attr_temp6_input.dev_attr.attr, 889 + &sensor_dev_attr_temp7_input.dev_attr.attr, 890 + &sensor_dev_attr_temp8_input.dev_attr.attr, 891 + &sensor_dev_attr_temp9_input.dev_attr.attr, 892 + &sensor_dev_attr_temp10_input.dev_attr.attr, 893 + &sensor_dev_attr_fan1_max.dev_attr.attr, 894 + &sensor_dev_attr_fan2_max.dev_attr.attr, 895 + &sensor_dev_attr_fan3_max.dev_attr.attr, 896 + &sensor_dev_attr_fan4_max.dev_attr.attr, 897 + &sensor_dev_attr_fan1_min.dev_attr.attr, 898 + &sensor_dev_attr_fan2_min.dev_attr.attr, 899 + &sensor_dev_attr_fan3_min.dev_attr.attr, 900 + &sensor_dev_attr_fan4_min.dev_attr.attr, 901 + &sensor_dev_attr_fan1_input.dev_attr.attr, 902 + &sensor_dev_attr_fan2_input.dev_attr.attr, 903 + &sensor_dev_attr_fan3_input.dev_attr.attr, 904 + &sensor_dev_attr_fan4_input.dev_attr.attr, 905 + &sensor_dev_attr_force_pwm_max.dev_attr.attr, 906 + &sensor_dev_attr_pwm1.dev_attr.attr, 907 + &sensor_dev_attr_pwm2.dev_attr.attr, 908 + &sensor_dev_attr_pwm3.dev_attr.attr, 909 + &sensor_dev_attr_pwm4.dev_attr.attr, 910 + &sensor_dev_attr_pwm1_auto_point1_pwm.dev_attr.attr, 911 + &sensor_dev_attr_pwm2_auto_point1_pwm.dev_attr.attr, 912 + &sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr, 913 + &sensor_dev_attr_pwm4_auto_point1_pwm.dev_attr.attr, 914 + &sensor_dev_attr_pwm1_auto_point2_pwm.dev_attr.attr, 915 + &sensor_dev_attr_pwm2_auto_point2_pwm.dev_attr.attr, 916 + &sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr, 917 + &sensor_dev_attr_pwm4_auto_point2_pwm.dev_attr.attr, 918 + &sensor_dev_attr_pwm1_auto_point1_temp.dev_attr.attr, 919 + &sensor_dev_attr_pwm2_auto_point1_temp.dev_attr.attr, 920 + &sensor_dev_attr_pwm3_auto_point1_temp.dev_attr.attr, 921 + &sensor_dev_attr_pwm4_auto_point1_temp.dev_attr.attr, 922 + &sensor_dev_attr_pwm1_auto_point2_temp.dev_attr.attr, 923 + &sensor_dev_attr_pwm2_auto_point2_temp.dev_attr.attr, 924 + &sensor_dev_attr_pwm3_auto_point2_temp.dev_attr.attr, 925 + &sensor_dev_attr_pwm4_auto_point2_temp.dev_attr.attr, 926 + &sensor_dev_attr_pwm1_enable.dev_attr.attr, 927 + &sensor_dev_attr_pwm2_enable.dev_attr.attr, 928 + &sensor_dev_attr_pwm3_enable.dev_attr.attr, 929 + &sensor_dev_attr_pwm4_enable.dev_attr.attr, 930 + &sensor_dev_attr_pwm1_auto_channels_temp.dev_attr.attr, 931 + &sensor_dev_attr_pwm2_auto_channels_temp.dev_attr.attr, 932 + &sensor_dev_attr_pwm3_auto_channels_temp.dev_attr.attr, 933 + &sensor_dev_attr_pwm4_auto_channels_temp.dev_attr.attr, 934 + NULL 935 + }; 936 + 937 + static int adt7470_attach_adapter(struct i2c_adapter *adapter) 938 + { 939 + if (!(adapter->class & I2C_CLASS_HWMON)) 940 + return 0; 941 + return i2c_probe(adapter, &addr_data, adt7470_detect); 942 + } 943 + 944 + static int adt7470_detect(struct i2c_adapter *adapter, int address, int kind) 945 + { 946 + struct i2c_client *client; 947 + struct adt7470_data *data; 948 + int err = 0; 949 + 950 + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) 951 + goto exit; 952 + 953 + if (!(data = kzalloc(sizeof(struct adt7470_data), GFP_KERNEL))) { 954 + err = -ENOMEM; 955 + goto exit; 956 + } 957 + 958 + client = &data->client; 959 + client->addr = address; 960 + client->adapter = adapter; 961 + client->driver = &adt7470_driver; 962 + 963 + i2c_set_clientdata(client, data); 964 + 965 + mutex_init(&data->lock); 966 + 967 + if (kind <= 0) { 968 + int vendor, device, revision; 969 + 970 + vendor = i2c_smbus_read_byte_data(client, ADT7470_REG_VENDOR); 971 + if (vendor != ADT7470_VENDOR) { 972 + err = -ENODEV; 973 + goto exit_free; 974 + } 975 + 976 + device = i2c_smbus_read_byte_data(client, ADT7470_REG_DEVICE); 977 + if (device != ADT7470_DEVICE) { 978 + err = -ENODEV; 979 + goto exit_free; 980 + } 981 + 982 + revision = i2c_smbus_read_byte_data(client, 983 + ADT7470_REG_REVISION); 984 + if (revision != ADT7470_REVISION) { 985 + err = -ENODEV; 986 + goto exit_free; 987 + } 988 + } else 989 + dev_dbg(&adapter->dev, "detection forced\n"); 990 + 991 + strlcpy(client->name, "adt7470", I2C_NAME_SIZE); 992 + 993 + if ((err = i2c_attach_client(client))) 994 + goto exit_free; 995 + 996 + dev_info(&client->dev, "%s chip found\n", client->name); 997 + 998 + /* Initialize the ADT7470 chip */ 999 + adt7470_init_client(client); 1000 + 1001 + /* Register sysfs hooks */ 1002 + data->attrs.attrs = adt7470_attr; 1003 + if ((err = sysfs_create_group(&client->dev.kobj, &data->attrs))) 1004 + goto exit_detach; 1005 + 1006 + data->hwmon_dev = hwmon_device_register(&client->dev); 1007 + if (IS_ERR(data->hwmon_dev)) { 1008 + err = PTR_ERR(data->hwmon_dev); 1009 + goto exit_remove; 1010 + } 1011 + 1012 + return 0; 1013 + 1014 + exit_remove: 1015 + sysfs_remove_group(&client->dev.kobj, &data->attrs); 1016 + exit_detach: 1017 + i2c_detach_client(client); 1018 + exit_free: 1019 + kfree(data); 1020 + exit: 1021 + return err; 1022 + } 1023 + 1024 + static int adt7470_detach_client(struct i2c_client *client) 1025 + { 1026 + struct adt7470_data *data = i2c_get_clientdata(client); 1027 + 1028 + hwmon_device_unregister(data->hwmon_dev); 1029 + sysfs_remove_group(&client->dev.kobj, &data->attrs); 1030 + i2c_detach_client(client); 1031 + kfree(data); 1032 + return 0; 1033 + } 1034 + 1035 + static int __init adt7470_init(void) 1036 + { 1037 + return i2c_add_driver(&adt7470_driver); 1038 + } 1039 + 1040 + static void __exit adt7470_exit(void) 1041 + { 1042 + i2c_del_driver(&adt7470_driver); 1043 + } 1044 + 1045 + MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); 1046 + MODULE_DESCRIPTION("ADT7470 driver"); 1047 + MODULE_LICENSE("GPL"); 1048 + 1049 + module_init(adt7470_init); 1050 + module_exit(adt7470_exit);
+5 -5
drivers/hwmon/applesmc.c
··· 127 127 static s16 rest_y; 128 128 static struct timer_list applesmc_timer; 129 129 static struct input_dev *applesmc_idev; 130 - static struct class_device *hwmon_class_dev; 130 + static struct device *hwmon_dev; 131 131 132 132 /* Indicates whether this computer has an accelerometer. */ 133 133 static unsigned int applesmc_accelerometer; ··· 1287 1287 goto out_light_wq; 1288 1288 } 1289 1289 1290 - hwmon_class_dev = hwmon_device_register(&pdev->dev); 1291 - if (IS_ERR(hwmon_class_dev)) { 1292 - ret = PTR_ERR(hwmon_class_dev); 1290 + hwmon_dev = hwmon_device_register(&pdev->dev); 1291 + if (IS_ERR(hwmon_dev)) { 1292 + ret = PTR_ERR(hwmon_dev); 1293 1293 goto out_light_ledclass; 1294 1294 } 1295 1295 ··· 1331 1331 1332 1332 static void __exit applesmc_exit(void) 1333 1333 { 1334 - hwmon_device_unregister(hwmon_class_dev); 1334 + hwmon_device_unregister(hwmon_dev); 1335 1335 if (applesmc_light) { 1336 1336 led_classdev_unregister(&applesmc_backlight); 1337 1337 destroy_workqueue(applesmc_led_wq);
+8 -8
drivers/hwmon/asb100.c
··· 143 143 144 144 /* TEMP: 0.001C/bit (-128C to +127C) 145 145 REG: 1C/bit, two's complement */ 146 - static u8 TEMP_TO_REG(int temp) 146 + static u8 TEMP_TO_REG(long temp) 147 147 { 148 148 int ntemp = SENSORS_LIMIT(temp, ASB100_TEMP_MIN, ASB100_TEMP_MAX); 149 149 ntemp += (ntemp<0 ? -500 : 500); ··· 182 182 dynamically allocated, at the same time the client itself is allocated. */ 183 183 struct asb100_data { 184 184 struct i2c_client client; 185 - struct class_device *class_dev; 185 + struct device *hwmon_dev; 186 186 struct mutex lock; 187 187 enum chips type; 188 188 ··· 448 448 { \ 449 449 struct i2c_client *client = to_i2c_client(dev); \ 450 450 struct asb100_data *data = i2c_get_clientdata(client); \ 451 - unsigned long val = simple_strtoul(buf, NULL, 10); \ 451 + long val = simple_strtol(buf, NULL, 10); \ 452 452 \ 453 453 mutex_lock(&data->update_lock); \ 454 454 switch (nr) { \ ··· 514 514 /* VRM */ 515 515 static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf) 516 516 { 517 - struct asb100_data *data = asb100_update_device(dev); 517 + struct asb100_data *data = dev_get_drvdata(dev); 518 518 return sprintf(buf, "%d\n", data->vrm); 519 519 } 520 520 ··· 844 844 if ((err = sysfs_create_group(&new_client->dev.kobj, &asb100_group))) 845 845 goto ERROR3; 846 846 847 - data->class_dev = hwmon_device_register(&new_client->dev); 848 - if (IS_ERR(data->class_dev)) { 849 - err = PTR_ERR(data->class_dev); 847 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 848 + if (IS_ERR(data->hwmon_dev)) { 849 + err = PTR_ERR(data->hwmon_dev); 850 850 goto ERROR4; 851 851 } 852 852 ··· 874 874 875 875 /* main client */ 876 876 if (data) { 877 - hwmon_device_unregister(data->class_dev); 877 + hwmon_device_unregister(data->hwmon_dev); 878 878 sysfs_remove_group(&client->dev.kobj, &asb100_group); 879 879 } 880 880
+5 -5
drivers/hwmon/atxp1.c
··· 61 61 62 62 struct atxp1_data { 63 63 struct i2c_client client; 64 - struct class_device *class_dev; 64 + struct device *hwmon_dev; 65 65 struct mutex update_lock; 66 66 unsigned long last_updated; 67 67 u8 valid; ··· 335 335 if ((err = sysfs_create_group(&new_client->dev.kobj, &atxp1_group))) 336 336 goto exit_detach; 337 337 338 - data->class_dev = hwmon_device_register(&new_client->dev); 339 - if (IS_ERR(data->class_dev)) { 340 - err = PTR_ERR(data->class_dev); 338 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 339 + if (IS_ERR(data->hwmon_dev)) { 340 + err = PTR_ERR(data->hwmon_dev); 341 341 goto exit_remove_files; 342 342 } 343 343 ··· 361 361 struct atxp1_data * data = i2c_get_clientdata(client); 362 362 int err; 363 363 364 - hwmon_device_unregister(data->class_dev); 364 + hwmon_device_unregister(data->hwmon_dev); 365 365 sysfs_remove_group(&client->dev.kobj, &atxp1_group); 366 366 367 367 err = i2c_detach_client(client);
+9 -10
drivers/hwmon/coretemp.c
··· 47 47 static struct coretemp_data *coretemp_update_device(struct device *dev); 48 48 49 49 struct coretemp_data { 50 - struct class_device *class_dev; 50 + struct device *hwmon_dev; 51 51 struct mutex update_lock; 52 52 const char *name; 53 53 u32 id; ··· 57 57 int tjmax; 58 58 u8 alarm; 59 59 }; 60 - 61 - static struct coretemp_data *coretemp_update_device(struct device *dev); 62 60 63 61 /* 64 62 * Sysfs stuff ··· 226 228 if ((err = sysfs_create_group(&pdev->dev.kobj, &coretemp_group))) 227 229 goto exit_free; 228 230 229 - data->class_dev = hwmon_device_register(&pdev->dev); 230 - if (IS_ERR(data->class_dev)) { 231 - err = PTR_ERR(data->class_dev); 231 + data->hwmon_dev = hwmon_device_register(&pdev->dev); 232 + if (IS_ERR(data->hwmon_dev)) { 233 + err = PTR_ERR(data->hwmon_dev); 232 234 dev_err(&pdev->dev, "Class registration failed (%d)\n", 233 235 err); 234 236 goto exit_class; ··· 248 250 { 249 251 struct coretemp_data *data = platform_get_drvdata(pdev); 250 252 251 - hwmon_device_unregister(data->class_dev); 253 + hwmon_device_unregister(data->hwmon_dev); 252 254 sysfs_remove_group(&pdev->dev.kobj, &coretemp_group); 253 255 platform_set_drvdata(pdev, NULL); 254 256 kfree(data); ··· 348 350 return NOTIFY_OK; 349 351 } 350 352 351 - static struct notifier_block __cpuinitdata coretemp_cpu_notifier = { 353 + static struct notifier_block coretemp_cpu_notifier = { 352 354 .notifier_call = coretemp_cpu_callback, 353 355 }; 354 356 #endif /* !CONFIG_HOTPLUG_CPU */ ··· 369 371 for_each_online_cpu(i) { 370 372 struct cpuinfo_x86 *c = &(cpu_data)[i]; 371 373 372 - /* check if family 6, models e, f */ 374 + /* check if family 6, models e, f, 16 */ 373 375 if ((c->cpuid_level < 0) || (c->x86 != 0x6) || 374 - !((c->x86_model == 0xe) || (c->x86_model == 0xf))) { 376 + !((c->x86_model == 0xe) || (c->x86_model == 0xf) || 377 + (c->x86_model == 0x16))) { 375 378 376 379 /* supported CPU not found, but report the unknown 377 380 family 6 CPU */
+686 -358
drivers/hwmon/dme1737.c
··· 1 1 /* 2 - * dme1737.c - driver for the SMSC DME1737 and Asus A8000 Super-I/O chips 3 - * integrated hardware monitoring features. 2 + * dme1737.c - Driver for the SMSC DME1737, Asus A8000, and SMSC SCH311x 3 + * Super-I/O chips integrated hardware monitoring features. 4 4 * Copyright (c) 2007 Juerg Haefliger <juergh@gmail.com> 5 5 * 6 - * This driver is based on the LM85 driver. The hardware monitoring 7 - * capabilities of the DME1737 are very similar to the LM85 with some 8 - * additional features. Even though the DME1737 is a Super-I/O chip, the 9 - * hardware monitoring registers are only accessible via SMBus. 6 + * This driver is an I2C/ISA hybrid, meaning that it uses the I2C bus to access 7 + * the chip registers if a DME1737 (or A8000) is found and the ISA bus if a 8 + * SCH311x chip is found. Both types of chips have very similar hardware 9 + * monitoring capabilities but differ in the way they can be accessed. 10 10 * 11 11 * This program is free software; you can redistribute it and/or modify 12 12 * it under the terms of the GNU General Public License as published by ··· 28 28 #include <linux/slab.h> 29 29 #include <linux/jiffies.h> 30 30 #include <linux/i2c.h> 31 + #include <linux/platform_device.h> 31 32 #include <linux/hwmon.h> 32 33 #include <linux/hwmon-sysfs.h> 33 34 #include <linux/hwmon-vid.h> 34 35 #include <linux/err.h> 35 36 #include <linux/mutex.h> 36 37 #include <asm/io.h> 38 + 39 + /* ISA device, if found */ 40 + static struct platform_device *pdev; 37 41 38 42 /* Module load parameters */ 39 43 static int force_start; ··· 137 133 static const u8 DME1737_BIT_ALARM_FAN[] = {10, 11, 12, 13, 22, 23}; 138 134 139 135 /* Miscellaneous registers */ 136 + #define DME1737_REG_DEVICE 0x3d 140 137 #define DME1737_REG_COMPANY 0x3e 141 138 #define DME1737_REG_VERSTEP 0x3f 142 139 #define DME1737_REG_CONFIG 0x40 ··· 153 148 #define DME1737_COMPANY_SMSC 0x5c 154 149 #define DME1737_VERSTEP 0x88 155 150 #define DME1737_VERSTEP_MASK 0xf8 151 + #define SCH311X_DEVICE 0x8c 152 + 153 + /* Length of ISA address segment */ 154 + #define DME1737_EXTENT 2 156 155 157 156 /* --------------------------------------------------------------------- 158 157 * Data structures and manipulation thereof 159 158 * --------------------------------------------------------------------- */ 160 159 160 + /* For ISA chips, we abuse the i2c_client addr and name fields. We also use 161 + the driver field to differentiate between I2C and ISA chips. */ 161 162 struct dme1737_data { 162 163 struct i2c_client client; 163 - struct class_device *class_dev; 164 + struct device *hwmon_dev; 164 165 165 166 struct mutex update_lock; 166 167 int valid; /* !=0 if following fields are valid */ ··· 476 465 477 466 /* --------------------------------------------------------------------- 478 467 * Device I/O access 468 + * 469 + * ISA access is performed through an index/data register pair and needs to 470 + * be protected by a mutex during runtime (not required for initialization). 471 + * We use data->update_lock for this and need to ensure that we acquire it 472 + * before calling dme1737_read or dme1737_write. 479 473 * --------------------------------------------------------------------- */ 480 474 481 475 static u8 dme1737_read(struct i2c_client *client, u8 reg) 482 476 { 483 - s32 val = i2c_smbus_read_byte_data(client, reg); 477 + s32 val; 484 478 485 - if (val < 0) { 486 - dev_warn(&client->dev, "Read from register 0x%02x failed! " 487 - "Please report to the driver maintainer.\n", reg); 479 + if (client->driver) { /* I2C device */ 480 + val = i2c_smbus_read_byte_data(client, reg); 481 + 482 + if (val < 0) { 483 + dev_warn(&client->dev, "Read from register " 484 + "0x%02x failed! Please report to the driver " 485 + "maintainer.\n", reg); 486 + } 487 + } else { /* ISA device */ 488 + outb(reg, client->addr); 489 + val = inb(client->addr + 1); 488 490 } 489 491 490 492 return val; 491 493 } 492 494 493 - static s32 dme1737_write(struct i2c_client *client, u8 reg, u8 value) 495 + static s32 dme1737_write(struct i2c_client *client, u8 reg, u8 val) 494 496 { 495 - s32 res = i2c_smbus_write_byte_data(client, reg, value); 497 + s32 res = 0; 496 498 497 - if (res < 0) { 498 - dev_warn(&client->dev, "Write to register 0x%02x failed! " 499 - "Please report to the driver maintainer.\n", reg); 499 + if (client->driver) { /* I2C device */ 500 + res = i2c_smbus_write_byte_data(client, reg, val); 501 + 502 + if (res < 0) { 503 + dev_warn(&client->dev, "Write to register " 504 + "0x%02x failed! Please report to the driver " 505 + "maintainer.\n", reg); 506 + } 507 + } else { /* ISA device */ 508 + outb(reg, client->addr); 509 + outb(val, client->addr + 1); 500 510 } 501 511 502 512 return res; ··· 525 493 526 494 static struct dme1737_data *dme1737_update_device(struct device *dev) 527 495 { 528 - struct i2c_client *client = to_i2c_client(dev); 529 - struct dme1737_data *data = i2c_get_clientdata(client); 496 + struct dme1737_data *data = dev_get_drvdata(dev); 497 + struct i2c_client *client = &data->client; 530 498 int ix; 531 499 u8 lsb[5]; 532 500 ··· 662 630 DME1737_REG_ALARM3) << 16; 663 631 } 664 632 633 + /* The ISA chips require explicit clearing of alarm bits. 634 + * Don't worry, an alarm will come back if the condition 635 + * that causes it still exists */ 636 + if (!client->driver) { 637 + if (data->alarms & 0xff0000) { 638 + dme1737_write(client, DME1737_REG_ALARM3, 639 + 0xff); 640 + } 641 + if (data->alarms & 0xff00) { 642 + dme1737_write(client, DME1737_REG_ALARM2, 643 + 0xff); 644 + } 645 + if (data->alarms & 0xff) { 646 + dme1737_write(client, DME1737_REG_ALARM1, 647 + 0xff); 648 + } 649 + } 650 + 665 651 data->last_update = jiffies; 666 652 data->valid = 1; 667 653 } ··· 724 674 break; 725 675 default: 726 676 res = 0; 727 - dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); 677 + dev_dbg(dev, "Unknown function %d.\n", fn); 728 678 } 729 679 730 680 return sprintf(buf, "%d\n", res); ··· 733 683 static ssize_t set_in(struct device *dev, struct device_attribute *attr, 734 684 const char *buf, size_t count) 735 685 { 736 - struct i2c_client *client = to_i2c_client(dev); 737 - struct dme1737_data *data = i2c_get_clientdata(client); 686 + struct dme1737_data *data = dev_get_drvdata(dev); 687 + struct i2c_client *client = &data->client; 738 688 struct sensor_device_attribute_2 739 689 *sensor_attr_2 = to_sensor_dev_attr_2(attr); 740 690 int ix = sensor_attr_2->index; ··· 754 704 data->in_max[ix]); 755 705 break; 756 706 default: 757 - dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); 707 + dev_dbg(dev, "Unknown function %d.\n", fn); 758 708 } 759 709 mutex_unlock(&data->update_lock); 760 710 ··· 804 754 break; 805 755 default: 806 756 res = 0; 807 - dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); 757 + dev_dbg(dev, "Unknown function %d.\n", fn); 808 758 } 809 759 810 760 return sprintf(buf, "%d\n", res); ··· 813 763 static ssize_t set_temp(struct device *dev, struct device_attribute *attr, 814 764 const char *buf, size_t count) 815 765 { 816 - struct i2c_client *client = to_i2c_client(dev); 817 - struct dme1737_data *data = i2c_get_clientdata(client); 766 + struct dme1737_data *data = dev_get_drvdata(dev); 767 + struct i2c_client *client = &data->client; 818 768 struct sensor_device_attribute_2 819 769 *sensor_attr_2 = to_sensor_dev_attr_2(attr); 820 770 int ix = sensor_attr_2->index; ··· 839 789 data->temp_offset[ix]); 840 790 break; 841 791 default: 842 - dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); 792 + dev_dbg(dev, "Unknown function %d.\n", fn); 843 793 } 844 794 mutex_unlock(&data->update_lock); 845 795 ··· 893 843 break; 894 844 default: 895 845 res = 0; 896 - dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); 846 + dev_dbg(dev, "Unknown function %d.\n", fn); 897 847 } 898 848 899 849 return sprintf(buf, "%d\n", res); ··· 902 852 static ssize_t set_zone(struct device *dev, struct device_attribute *attr, 903 853 const char *buf, size_t count) 904 854 { 905 - struct i2c_client *client = to_i2c_client(dev); 906 - struct dme1737_data *data = i2c_get_clientdata(client); 855 + struct dme1737_data *data = dev_get_drvdata(dev); 856 + struct i2c_client *client = &data->client; 907 857 struct sensor_device_attribute_2 908 858 *sensor_attr_2 = to_sensor_dev_attr_2(attr); 909 859 int ix = sensor_attr_2->index; ··· 948 898 data->zone_abs[ix]); 949 899 break; 950 900 default: 951 - dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); 901 + dev_dbg(dev, "Unknown function %d.\n", fn); 952 902 } 953 903 mutex_unlock(&data->update_lock); 954 904 ··· 1000 950 break; 1001 951 default: 1002 952 res = 0; 1003 - dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); 953 + dev_dbg(dev, "Unknown function %d.\n", fn); 1004 954 } 1005 955 1006 956 return sprintf(buf, "%d\n", res); ··· 1009 959 static ssize_t set_fan(struct device *dev, struct device_attribute *attr, 1010 960 const char *buf, size_t count) 1011 961 { 1012 - struct i2c_client *client = to_i2c_client(dev); 1013 - struct dme1737_data *data = i2c_get_clientdata(client); 962 + struct dme1737_data *data = dev_get_drvdata(dev); 963 + struct i2c_client *client = &data->client; 1014 964 struct sensor_device_attribute_2 1015 965 *sensor_attr_2 = to_sensor_dev_attr_2(attr); 1016 966 int ix = sensor_attr_2->index; ··· 1045 995 /* Only valid for fan[1-4] */ 1046 996 if (!(val == 1 || val == 2 || val == 4)) { 1047 997 count = -EINVAL; 1048 - dev_warn(&client->dev, "Fan type value %ld not " 998 + dev_warn(dev, "Fan type value %ld not " 1049 999 "supported. Choose one of 1, 2, or 4.\n", 1050 1000 val); 1051 1001 goto exit; ··· 1056 1006 data->fan_opt[ix]); 1057 1007 break; 1058 1008 default: 1059 - dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); 1009 + dev_dbg(dev, "Unknown function %d.\n", fn); 1060 1010 } 1061 1011 exit: 1062 1012 mutex_unlock(&data->update_lock); ··· 1136 1086 break; 1137 1087 default: 1138 1088 res = 0; 1139 - dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); 1089 + dev_dbg(dev, "Unknown function %d.\n", fn); 1140 1090 } 1141 1091 1142 1092 return sprintf(buf, "%d\n", res); 1143 1093 } 1144 1094 1145 1095 static struct attribute *dme1737_attr_pwm[]; 1146 - static void dme1737_chmod_file(struct i2c_client*, struct attribute*, mode_t); 1096 + static void dme1737_chmod_file(struct device*, struct attribute*, mode_t); 1147 1097 1148 1098 static ssize_t set_pwm(struct device *dev, struct device_attribute *attr, 1149 1099 const char *buf, size_t count) 1150 1100 { 1151 - struct i2c_client *client = to_i2c_client(dev); 1152 - struct dme1737_data *data = i2c_get_clientdata(client); 1101 + struct dme1737_data *data = dev_get_drvdata(dev); 1102 + struct i2c_client *client = &data->client; 1153 1103 struct sensor_device_attribute_2 1154 1104 *sensor_attr_2 = to_sensor_dev_attr_2(attr); 1155 1105 int ix = sensor_attr_2->index; ··· 1172 1122 /* Only valid for pwm[1-3] */ 1173 1123 if (val < 0 || val > 2) { 1174 1124 count = -EINVAL; 1175 - dev_warn(&client->dev, "PWM enable %ld not " 1125 + dev_warn(dev, "PWM enable %ld not " 1176 1126 "supported. Choose one of 0, 1, or 2.\n", 1177 1127 val); 1178 1128 goto exit; ··· 1206 1156 switch (val) { 1207 1157 case 0: 1208 1158 /* Change permissions of pwm[ix] to read-only */ 1209 - dme1737_chmod_file(client, dme1737_attr_pwm[ix], 1159 + dme1737_chmod_file(dev, dme1737_attr_pwm[ix], 1210 1160 S_IRUGO); 1211 1161 /* Turn fan fully on */ 1212 1162 data->pwm_config[ix] = PWM_EN_TO_REG(0, ··· 1221 1171 dme1737_write(client, DME1737_REG_PWM_CONFIG(ix), 1222 1172 data->pwm_config[ix]); 1223 1173 /* Change permissions of pwm[ix] to read-writeable */ 1224 - dme1737_chmod_file(client, dme1737_attr_pwm[ix], 1174 + dme1737_chmod_file(dev, dme1737_attr_pwm[ix], 1225 1175 S_IRUGO | S_IWUSR); 1226 1176 break; 1227 1177 case 2: 1228 1178 /* Change permissions of pwm[ix] to read-only */ 1229 - dme1737_chmod_file(client, dme1737_attr_pwm[ix], 1179 + dme1737_chmod_file(dev, dme1737_attr_pwm[ix], 1230 1180 S_IRUGO); 1231 1181 /* Turn on auto mode using the saved zone channel 1232 1182 * assignment */ ··· 1273 1223 if (!(val == 1 || val == 2 || val == 4 || 1274 1224 val == 6 || val == 7)) { 1275 1225 count = -EINVAL; 1276 - dev_warn(&client->dev, "PWM auto channels zone %ld " 1226 + dev_warn(dev, "PWM auto channels zone %ld " 1277 1227 "not supported. Choose one of 1, 2, 4, 6, " 1278 1228 "or 7.\n", val); 1279 1229 goto exit; ··· 1307 1257 data->pwm_rr[0] = PWM_OFF_TO_REG(1, ix, 1308 1258 dme1737_read(client, 1309 1259 DME1737_REG_PWM_RR(0))); 1310 - 1311 1260 } else { 1312 1261 data->pwm_rr[0] = PWM_OFF_TO_REG(0, ix, 1313 1262 dme1737_read(client, 1314 1263 DME1737_REG_PWM_RR(0))); 1315 - 1316 1264 } 1317 1265 dme1737_write(client, DME1737_REG_PWM_RR(0), 1318 1266 data->pwm_rr[0]); ··· 1322 1274 data->pwm_min[ix]); 1323 1275 break; 1324 1276 default: 1325 - dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); 1277 + dev_dbg(dev, "Unknown function %d.\n", fn); 1326 1278 } 1327 1279 exit: 1328 1280 mutex_unlock(&data->update_lock); ··· 1346 1298 static ssize_t set_vrm(struct device *dev, struct device_attribute *attr, 1347 1299 const char *buf, size_t count) 1348 1300 { 1349 - struct i2c_client *client = to_i2c_client(dev); 1350 - struct dme1737_data *data = i2c_get_clientdata(client); 1301 + struct dme1737_data *data = dev_get_drvdata(dev); 1351 1302 long val = simple_strtol(buf, NULL, 10); 1352 1303 1353 1304 data->vrm = val; ··· 1361 1314 return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm)); 1362 1315 } 1363 1316 1317 + static ssize_t show_name(struct device *dev, struct device_attribute *attr, 1318 + char *buf) 1319 + { 1320 + struct dme1737_data *data = dev_get_drvdata(dev); 1321 + 1322 + return sprintf(buf, "%s\n", data->client.name); 1323 + } 1324 + 1364 1325 /* --------------------------------------------------------------------- 1365 1326 * Sysfs device attribute defines and structs 1366 1327 * --------------------------------------------------------------------- */ ··· 1377 1322 1378 1323 #define SENSOR_DEVICE_ATTR_IN(ix) \ 1379 1324 static SENSOR_DEVICE_ATTR_2(in##ix##_input, S_IRUGO, \ 1380 - show_in, NULL, SYS_IN_INPUT, ix); \ 1325 + show_in, NULL, SYS_IN_INPUT, ix); \ 1381 1326 static SENSOR_DEVICE_ATTR_2(in##ix##_min, S_IRUGO | S_IWUSR, \ 1382 - show_in, set_in, SYS_IN_MIN, ix); \ 1327 + show_in, set_in, SYS_IN_MIN, ix); \ 1383 1328 static SENSOR_DEVICE_ATTR_2(in##ix##_max, S_IRUGO | S_IWUSR, \ 1384 - show_in, set_in, SYS_IN_MAX, ix); \ 1329 + show_in, set_in, SYS_IN_MAX, ix); \ 1385 1330 static SENSOR_DEVICE_ATTR_2(in##ix##_alarm, S_IRUGO, \ 1386 - show_in, NULL, SYS_IN_ALARM, ix) 1331 + show_in, NULL, SYS_IN_ALARM, ix) 1387 1332 1388 1333 SENSOR_DEVICE_ATTR_IN(0); 1389 1334 SENSOR_DEVICE_ATTR_IN(1); ··· 1397 1342 1398 1343 #define SENSOR_DEVICE_ATTR_TEMP(ix) \ 1399 1344 static SENSOR_DEVICE_ATTR_2(temp##ix##_input, S_IRUGO, \ 1400 - show_temp, NULL, SYS_TEMP_INPUT, ix-1); \ 1345 + show_temp, NULL, SYS_TEMP_INPUT, ix-1); \ 1401 1346 static SENSOR_DEVICE_ATTR_2(temp##ix##_min, S_IRUGO | S_IWUSR, \ 1402 - show_temp, set_temp, SYS_TEMP_MIN, ix-1); \ 1347 + show_temp, set_temp, SYS_TEMP_MIN, ix-1); \ 1403 1348 static SENSOR_DEVICE_ATTR_2(temp##ix##_max, S_IRUGO | S_IWUSR, \ 1404 - show_temp, set_temp, SYS_TEMP_MAX, ix-1); \ 1349 + show_temp, set_temp, SYS_TEMP_MAX, ix-1); \ 1405 1350 static SENSOR_DEVICE_ATTR_2(temp##ix##_offset, S_IRUGO, \ 1406 - show_temp, set_temp, SYS_TEMP_OFFSET, ix-1); \ 1351 + show_temp, set_temp, SYS_TEMP_OFFSET, ix-1); \ 1407 1352 static SENSOR_DEVICE_ATTR_2(temp##ix##_alarm, S_IRUGO, \ 1408 - show_temp, NULL, SYS_TEMP_ALARM, ix-1); \ 1353 + show_temp, NULL, SYS_TEMP_ALARM, ix-1); \ 1409 1354 static SENSOR_DEVICE_ATTR_2(temp##ix##_fault, S_IRUGO, \ 1410 - show_temp, NULL, SYS_TEMP_FAULT, ix-1) 1355 + show_temp, NULL, SYS_TEMP_FAULT, ix-1) 1411 1356 1412 1357 SENSOR_DEVICE_ATTR_TEMP(1); 1413 1358 SENSOR_DEVICE_ATTR_TEMP(2); ··· 1417 1362 1418 1363 #define SENSOR_DEVICE_ATTR_ZONE(ix) \ 1419 1364 static SENSOR_DEVICE_ATTR_2(zone##ix##_auto_channels_temp, S_IRUGO, \ 1420 - show_zone, NULL, SYS_ZONE_AUTO_CHANNELS_TEMP, ix-1); \ 1365 + show_zone, NULL, SYS_ZONE_AUTO_CHANNELS_TEMP, ix-1); \ 1421 1366 static SENSOR_DEVICE_ATTR_2(zone##ix##_auto_point1_temp_hyst, S_IRUGO, \ 1422 - show_zone, set_zone, SYS_ZONE_AUTO_POINT1_TEMP_HYST, ix-1); \ 1367 + show_zone, set_zone, SYS_ZONE_AUTO_POINT1_TEMP_HYST, ix-1); \ 1423 1368 static SENSOR_DEVICE_ATTR_2(zone##ix##_auto_point1_temp, S_IRUGO, \ 1424 - show_zone, set_zone, SYS_ZONE_AUTO_POINT1_TEMP, ix-1); \ 1369 + show_zone, set_zone, SYS_ZONE_AUTO_POINT1_TEMP, ix-1); \ 1425 1370 static SENSOR_DEVICE_ATTR_2(zone##ix##_auto_point2_temp, S_IRUGO, \ 1426 - show_zone, set_zone, SYS_ZONE_AUTO_POINT2_TEMP, ix-1); \ 1371 + show_zone, set_zone, SYS_ZONE_AUTO_POINT2_TEMP, ix-1); \ 1427 1372 static SENSOR_DEVICE_ATTR_2(zone##ix##_auto_point3_temp, S_IRUGO, \ 1428 - show_zone, set_zone, SYS_ZONE_AUTO_POINT3_TEMP, ix-1) 1373 + show_zone, set_zone, SYS_ZONE_AUTO_POINT3_TEMP, ix-1) 1429 1374 1430 1375 SENSOR_DEVICE_ATTR_ZONE(1); 1431 1376 SENSOR_DEVICE_ATTR_ZONE(2); ··· 1435 1380 1436 1381 #define SENSOR_DEVICE_ATTR_FAN_1TO4(ix) \ 1437 1382 static SENSOR_DEVICE_ATTR_2(fan##ix##_input, S_IRUGO, \ 1438 - show_fan, NULL, SYS_FAN_INPUT, ix-1); \ 1383 + show_fan, NULL, SYS_FAN_INPUT, ix-1); \ 1439 1384 static SENSOR_DEVICE_ATTR_2(fan##ix##_min, S_IRUGO | S_IWUSR, \ 1440 - show_fan, set_fan, SYS_FAN_MIN, ix-1); \ 1385 + show_fan, set_fan, SYS_FAN_MIN, ix-1); \ 1441 1386 static SENSOR_DEVICE_ATTR_2(fan##ix##_alarm, S_IRUGO, \ 1442 - show_fan, NULL, SYS_FAN_ALARM, ix-1); \ 1387 + show_fan, NULL, SYS_FAN_ALARM, ix-1); \ 1443 1388 static SENSOR_DEVICE_ATTR_2(fan##ix##_type, S_IRUGO | S_IWUSR, \ 1444 - show_fan, set_fan, SYS_FAN_TYPE, ix-1) 1389 + show_fan, set_fan, SYS_FAN_TYPE, ix-1) 1445 1390 1446 1391 SENSOR_DEVICE_ATTR_FAN_1TO4(1); 1447 1392 SENSOR_DEVICE_ATTR_FAN_1TO4(2); ··· 1452 1397 1453 1398 #define SENSOR_DEVICE_ATTR_FAN_5TO6(ix) \ 1454 1399 static SENSOR_DEVICE_ATTR_2(fan##ix##_input, S_IRUGO, \ 1455 - show_fan, NULL, SYS_FAN_INPUT, ix-1); \ 1400 + show_fan, NULL, SYS_FAN_INPUT, ix-1); \ 1456 1401 static SENSOR_DEVICE_ATTR_2(fan##ix##_min, S_IRUGO | S_IWUSR, \ 1457 - show_fan, set_fan, SYS_FAN_MIN, ix-1); \ 1402 + show_fan, set_fan, SYS_FAN_MIN, ix-1); \ 1458 1403 static SENSOR_DEVICE_ATTR_2(fan##ix##_alarm, S_IRUGO, \ 1459 - show_fan, NULL, SYS_FAN_ALARM, ix-1); \ 1404 + show_fan, NULL, SYS_FAN_ALARM, ix-1); \ 1460 1405 static SENSOR_DEVICE_ATTR_2(fan##ix##_max, S_IRUGO | S_IWUSR, \ 1461 - show_fan, set_fan, SYS_FAN_MAX, ix-1) 1406 + show_fan, set_fan, SYS_FAN_MAX, ix-1) 1462 1407 1463 1408 SENSOR_DEVICE_ATTR_FAN_5TO6(5); 1464 1409 SENSOR_DEVICE_ATTR_FAN_5TO6(6); ··· 1467 1412 1468 1413 #define SENSOR_DEVICE_ATTR_PWM_1TO3(ix) \ 1469 1414 static SENSOR_DEVICE_ATTR_2(pwm##ix, S_IRUGO, \ 1470 - show_pwm, set_pwm, SYS_PWM, ix-1); \ 1415 + show_pwm, set_pwm, SYS_PWM, ix-1); \ 1471 1416 static SENSOR_DEVICE_ATTR_2(pwm##ix##_freq, S_IRUGO, \ 1472 - show_pwm, set_pwm, SYS_PWM_FREQ, ix-1); \ 1417 + show_pwm, set_pwm, SYS_PWM_FREQ, ix-1); \ 1473 1418 static SENSOR_DEVICE_ATTR_2(pwm##ix##_enable, S_IRUGO, \ 1474 - show_pwm, set_pwm, SYS_PWM_ENABLE, ix-1); \ 1419 + show_pwm, set_pwm, SYS_PWM_ENABLE, ix-1); \ 1475 1420 static SENSOR_DEVICE_ATTR_2(pwm##ix##_ramp_rate, S_IRUGO, \ 1476 - show_pwm, set_pwm, SYS_PWM_RAMP_RATE, ix-1); \ 1421 + show_pwm, set_pwm, SYS_PWM_RAMP_RATE, ix-1); \ 1477 1422 static SENSOR_DEVICE_ATTR_2(pwm##ix##_auto_channels_zone, S_IRUGO, \ 1478 - show_pwm, set_pwm, SYS_PWM_AUTO_CHANNELS_ZONE, ix-1); \ 1423 + show_pwm, set_pwm, SYS_PWM_AUTO_CHANNELS_ZONE, ix-1); \ 1479 1424 static SENSOR_DEVICE_ATTR_2(pwm##ix##_auto_pwm_min, S_IRUGO, \ 1480 - show_pwm, set_pwm, SYS_PWM_AUTO_PWM_MIN, ix-1); \ 1425 + show_pwm, set_pwm, SYS_PWM_AUTO_PWM_MIN, ix-1); \ 1481 1426 static SENSOR_DEVICE_ATTR_2(pwm##ix##_auto_point1_pwm, S_IRUGO, \ 1482 - show_pwm, set_pwm, SYS_PWM_AUTO_POINT1_PWM, ix-1); \ 1427 + show_pwm, set_pwm, SYS_PWM_AUTO_POINT1_PWM, ix-1); \ 1483 1428 static SENSOR_DEVICE_ATTR_2(pwm##ix##_auto_point2_pwm, S_IRUGO, \ 1484 - show_pwm, NULL, SYS_PWM_AUTO_POINT2_PWM, ix-1) 1429 + show_pwm, NULL, SYS_PWM_AUTO_POINT2_PWM, ix-1) 1485 1430 1486 1431 SENSOR_DEVICE_ATTR_PWM_1TO3(1); 1487 1432 SENSOR_DEVICE_ATTR_PWM_1TO3(2); ··· 1491 1436 1492 1437 #define SENSOR_DEVICE_ATTR_PWM_5TO6(ix) \ 1493 1438 static SENSOR_DEVICE_ATTR_2(pwm##ix, S_IRUGO | S_IWUSR, \ 1494 - show_pwm, set_pwm, SYS_PWM, ix-1); \ 1439 + show_pwm, set_pwm, SYS_PWM, ix-1); \ 1495 1440 static SENSOR_DEVICE_ATTR_2(pwm##ix##_freq, S_IRUGO | S_IWUSR, \ 1496 - show_pwm, set_pwm, SYS_PWM_FREQ, ix-1); \ 1441 + show_pwm, set_pwm, SYS_PWM_FREQ, ix-1); \ 1497 1442 static SENSOR_DEVICE_ATTR_2(pwm##ix##_enable, S_IRUGO, \ 1498 - show_pwm, NULL, SYS_PWM_ENABLE, ix-1) 1443 + show_pwm, NULL, SYS_PWM_ENABLE, ix-1) 1499 1444 1500 1445 SENSOR_DEVICE_ATTR_PWM_5TO6(5); 1501 1446 SENSOR_DEVICE_ATTR_PWM_5TO6(6); ··· 1504 1449 1505 1450 static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm); 1506 1451 static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL); 1452 + static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); /* for ISA devices */ 1507 1453 1508 1454 #define SENSOR_DEV_ATTR_IN(ix) \ 1509 1455 &sensor_dev_attr_in##ix##_input.dev_attr.attr, \ ··· 1575 1519 * permissions are created read-only and write permissions are added or removed 1576 1520 * on the fly when required */ 1577 1521 static struct attribute *dme1737_attr[] ={ 1578 - /* Voltages */ 1579 - SENSOR_DEV_ATTR_IN(0), 1580 - SENSOR_DEV_ATTR_IN(1), 1581 - SENSOR_DEV_ATTR_IN(2), 1582 - SENSOR_DEV_ATTR_IN(3), 1583 - SENSOR_DEV_ATTR_IN(4), 1584 - SENSOR_DEV_ATTR_IN(5), 1585 - SENSOR_DEV_ATTR_IN(6), 1586 - /* Temperatures */ 1587 - SENSOR_DEV_ATTR_TEMP(1), 1588 - SENSOR_DEV_ATTR_TEMP(2), 1589 - SENSOR_DEV_ATTR_TEMP(3), 1590 - /* Zones */ 1591 - SENSOR_DEV_ATTR_ZONE(1), 1592 - SENSOR_DEV_ATTR_ZONE(2), 1593 - SENSOR_DEV_ATTR_ZONE(3), 1594 - /* Misc */ 1595 - &dev_attr_vrm.attr, 1596 - &dev_attr_cpu0_vid.attr, 1522 + /* Voltages */ 1523 + SENSOR_DEV_ATTR_IN(0), 1524 + SENSOR_DEV_ATTR_IN(1), 1525 + SENSOR_DEV_ATTR_IN(2), 1526 + SENSOR_DEV_ATTR_IN(3), 1527 + SENSOR_DEV_ATTR_IN(4), 1528 + SENSOR_DEV_ATTR_IN(5), 1529 + SENSOR_DEV_ATTR_IN(6), 1530 + /* Temperatures */ 1531 + SENSOR_DEV_ATTR_TEMP(1), 1532 + SENSOR_DEV_ATTR_TEMP(2), 1533 + SENSOR_DEV_ATTR_TEMP(3), 1534 + /* Zones */ 1535 + SENSOR_DEV_ATTR_ZONE(1), 1536 + SENSOR_DEV_ATTR_ZONE(2), 1537 + SENSOR_DEV_ATTR_ZONE(3), 1538 + /* Misc */ 1539 + &dev_attr_vrm.attr, 1540 + &dev_attr_cpu0_vid.attr, 1597 1541 NULL 1598 1542 }; 1599 1543 1600 1544 static const struct attribute_group dme1737_group = { 1601 - .attrs = dme1737_attr, 1545 + .attrs = dme1737_attr, 1602 1546 }; 1603 1547 1604 1548 /* The following structs hold the PWM attributes, some of which are optional. 1605 1549 * Their creation depends on the chip configuration which is determined during 1606 1550 * module load. */ 1607 1551 static struct attribute *dme1737_attr_pwm1[] = { 1608 - SENSOR_DEV_ATTR_PWM_1TO3(1), 1552 + SENSOR_DEV_ATTR_PWM_1TO3(1), 1609 1553 NULL 1610 1554 }; 1611 1555 static struct attribute *dme1737_attr_pwm2[] = { 1612 - SENSOR_DEV_ATTR_PWM_1TO3(2), 1556 + SENSOR_DEV_ATTR_PWM_1TO3(2), 1613 1557 NULL 1614 1558 }; 1615 1559 static struct attribute *dme1737_attr_pwm3[] = { 1616 - SENSOR_DEV_ATTR_PWM_1TO3(3), 1560 + SENSOR_DEV_ATTR_PWM_1TO3(3), 1617 1561 NULL 1618 1562 }; 1619 1563 static struct attribute *dme1737_attr_pwm5[] = { 1620 - SENSOR_DEV_ATTR_PWM_5TO6(5), 1564 + SENSOR_DEV_ATTR_PWM_5TO6(5), 1621 1565 NULL 1622 1566 }; 1623 1567 static struct attribute *dme1737_attr_pwm6[] = { 1624 - SENSOR_DEV_ATTR_PWM_5TO6(6), 1568 + SENSOR_DEV_ATTR_PWM_5TO6(6), 1625 1569 NULL 1626 1570 }; 1627 1571 ··· 1638 1582 * Their creation depends on the chip configuration which is determined during 1639 1583 * module load. */ 1640 1584 static struct attribute *dme1737_attr_fan1[] = { 1641 - SENSOR_DEV_ATTR_FAN_1TO4(1), 1585 + SENSOR_DEV_ATTR_FAN_1TO4(1), 1642 1586 NULL 1643 1587 }; 1644 1588 static struct attribute *dme1737_attr_fan2[] = { 1645 - SENSOR_DEV_ATTR_FAN_1TO4(2), 1589 + SENSOR_DEV_ATTR_FAN_1TO4(2), 1646 1590 NULL 1647 1591 }; 1648 1592 static struct attribute *dme1737_attr_fan3[] = { 1649 - SENSOR_DEV_ATTR_FAN_1TO4(3), 1593 + SENSOR_DEV_ATTR_FAN_1TO4(3), 1650 1594 NULL 1651 1595 }; 1652 1596 static struct attribute *dme1737_attr_fan4[] = { 1653 - SENSOR_DEV_ATTR_FAN_1TO4(4), 1597 + SENSOR_DEV_ATTR_FAN_1TO4(4), 1654 1598 NULL 1655 1599 }; 1656 1600 static struct attribute *dme1737_attr_fan5[] = { 1657 - SENSOR_DEV_ATTR_FAN_5TO6(5), 1601 + SENSOR_DEV_ATTR_FAN_5TO6(5), 1658 1602 NULL 1659 1603 }; 1660 1604 static struct attribute *dme1737_attr_fan6[] = { 1661 - SENSOR_DEV_ATTR_FAN_5TO6(6), 1605 + SENSOR_DEV_ATTR_FAN_5TO6(6), 1662 1606 NULL 1663 1607 }; 1664 1608 ··· 1693 1637 * writeable if the chip is *not* locked and the respective PWM is available. 1694 1638 * Otherwise they stay read-only. */ 1695 1639 static struct attribute *dme1737_attr_pwm1_lock[] = { 1696 - SENSOR_DEV_ATTR_PWM_1TO3_LOCK(1), 1640 + SENSOR_DEV_ATTR_PWM_1TO3_LOCK(1), 1697 1641 NULL 1698 1642 }; 1699 1643 static struct attribute *dme1737_attr_pwm2_lock[] = { 1700 - SENSOR_DEV_ATTR_PWM_1TO3_LOCK(2), 1644 + SENSOR_DEV_ATTR_PWM_1TO3_LOCK(2), 1701 1645 NULL 1702 1646 }; 1703 1647 static struct attribute *dme1737_attr_pwm3_lock[] = { 1704 - SENSOR_DEV_ATTR_PWM_1TO3_LOCK(3), 1648 + SENSOR_DEV_ATTR_PWM_1TO3_LOCK(3), 1705 1649 NULL 1706 1650 }; 1707 1651 static struct attribute *dme1737_attr_pwm5_lock[] = { 1708 - SENSOR_DEV_ATTR_PWM_5TO6_LOCK(5), 1652 + SENSOR_DEV_ATTR_PWM_5TO6_LOCK(5), 1709 1653 NULL 1710 1654 }; 1711 1655 static struct attribute *dme1737_attr_pwm6_lock[] = { 1712 - SENSOR_DEV_ATTR_PWM_5TO6_LOCK(6), 1656 + SENSOR_DEV_ATTR_PWM_5TO6_LOCK(6), 1713 1657 NULL 1714 1658 }; 1715 1659 ··· 1734 1678 * Super-IO functions 1735 1679 * --------------------------------------------------------------------- */ 1736 1680 1681 + static inline void dme1737_sio_enter(int sio_cip) 1682 + { 1683 + outb(0x55, sio_cip); 1684 + } 1685 + 1686 + static inline void dme1737_sio_exit(int sio_cip) 1687 + { 1688 + outb(0xaa, sio_cip); 1689 + } 1690 + 1737 1691 static inline int dme1737_sio_inb(int sio_cip, int reg) 1738 1692 { 1739 1693 outb(reg, sio_cip); ··· 1756 1690 outb(val, sio_cip + 1); 1757 1691 } 1758 1692 1759 - static int dme1737_sio_get_features(int sio_cip, struct i2c_client *client) 1693 + /* --------------------------------------------------------------------- 1694 + * Device initialization 1695 + * --------------------------------------------------------------------- */ 1696 + 1697 + static int dme1737_i2c_get_features(int, struct dme1737_data*); 1698 + 1699 + static void dme1737_chmod_file(struct device *dev, 1700 + struct attribute *attr, mode_t mode) 1760 1701 { 1761 - struct dme1737_data *data = i2c_get_clientdata(client); 1702 + if (sysfs_chmod_file(&dev->kobj, attr, mode)) { 1703 + dev_warn(dev, "Failed to change permissions of %s.\n", 1704 + attr->name); 1705 + } 1706 + } 1707 + 1708 + static void dme1737_chmod_group(struct device *dev, 1709 + const struct attribute_group *group, 1710 + mode_t mode) 1711 + { 1712 + struct attribute **attr; 1713 + 1714 + for (attr = group->attrs; *attr; attr++) { 1715 + dme1737_chmod_file(dev, *attr, mode); 1716 + } 1717 + } 1718 + 1719 + static void dme1737_remove_files(struct device *dev) 1720 + { 1721 + struct dme1737_data *data = dev_get_drvdata(dev); 1722 + int ix; 1723 + 1724 + for (ix = 0; ix < ARRAY_SIZE(dme1737_fan_group); ix++) { 1725 + if (data->has_fan & (1 << ix)) { 1726 + sysfs_remove_group(&dev->kobj, 1727 + &dme1737_fan_group[ix]); 1728 + } 1729 + } 1730 + 1731 + for (ix = 0; ix < ARRAY_SIZE(dme1737_pwm_group); ix++) { 1732 + if (data->has_pwm & (1 << ix)) { 1733 + sysfs_remove_group(&dev->kobj, 1734 + &dme1737_pwm_group[ix]); 1735 + } 1736 + } 1737 + 1738 + sysfs_remove_group(&dev->kobj, &dme1737_group); 1739 + 1740 + if (!data->client.driver) { 1741 + sysfs_remove_file(&dev->kobj, &dev_attr_name.attr); 1742 + } 1743 + } 1744 + 1745 + static int dme1737_create_files(struct device *dev) 1746 + { 1747 + struct dme1737_data *data = dev_get_drvdata(dev); 1748 + int err, ix; 1749 + 1750 + /* Create a name attribute for ISA devices */ 1751 + if (!data->client.driver && 1752 + (err = sysfs_create_file(&dev->kobj, &dev_attr_name.attr))) { 1753 + goto exit; 1754 + } 1755 + 1756 + /* Create standard sysfs attributes */ 1757 + if ((err = sysfs_create_group(&dev->kobj, &dme1737_group))) { 1758 + goto exit_remove; 1759 + } 1760 + 1761 + /* Create fan sysfs attributes */ 1762 + for (ix = 0; ix < ARRAY_SIZE(dme1737_fan_group); ix++) { 1763 + if (data->has_fan & (1 << ix)) { 1764 + if ((err = sysfs_create_group(&dev->kobj, 1765 + &dme1737_fan_group[ix]))) { 1766 + goto exit_remove; 1767 + } 1768 + } 1769 + } 1770 + 1771 + /* Create PWM sysfs attributes */ 1772 + for (ix = 0; ix < ARRAY_SIZE(dme1737_pwm_group); ix++) { 1773 + if (data->has_pwm & (1 << ix)) { 1774 + if ((err = sysfs_create_group(&dev->kobj, 1775 + &dme1737_pwm_group[ix]))) { 1776 + goto exit_remove; 1777 + } 1778 + } 1779 + } 1780 + 1781 + /* Inform if the device is locked. Otherwise change the permissions of 1782 + * selected attributes from read-only to read-writeable. */ 1783 + if (data->config & 0x02) { 1784 + dev_info(dev, "Device is locked. Some attributes " 1785 + "will be read-only.\n"); 1786 + } else { 1787 + /* Change permissions of standard attributes */ 1788 + dme1737_chmod_group(dev, &dme1737_lock_group, 1789 + S_IRUGO | S_IWUSR); 1790 + 1791 + /* Change permissions of PWM attributes */ 1792 + for (ix = 0; ix < ARRAY_SIZE(dme1737_pwm_lock_group); ix++) { 1793 + if (data->has_pwm & (1 << ix)) { 1794 + dme1737_chmod_group(dev, 1795 + &dme1737_pwm_lock_group[ix], 1796 + S_IRUGO | S_IWUSR); 1797 + } 1798 + } 1799 + 1800 + /* Change permissions of pwm[1-3] if in manual mode */ 1801 + for (ix = 0; ix < 3; ix++) { 1802 + if ((data->has_pwm & (1 << ix)) && 1803 + (PWM_EN_FROM_REG(data->pwm_config[ix]) == 1)) { 1804 + dme1737_chmod_file(dev, 1805 + dme1737_attr_pwm[ix], 1806 + S_IRUGO | S_IWUSR); 1807 + } 1808 + } 1809 + } 1810 + 1811 + return 0; 1812 + 1813 + exit_remove: 1814 + dme1737_remove_files(dev); 1815 + exit: 1816 + return err; 1817 + } 1818 + 1819 + static int dme1737_init_device(struct device *dev) 1820 + { 1821 + struct dme1737_data *data = dev_get_drvdata(dev); 1822 + struct i2c_client *client = &data->client; 1823 + int ix; 1824 + u8 reg; 1825 + 1826 + data->config = dme1737_read(client, DME1737_REG_CONFIG); 1827 + /* Inform if part is not monitoring/started */ 1828 + if (!(data->config & 0x01)) { 1829 + if (!force_start) { 1830 + dev_err(dev, "Device is not monitoring. " 1831 + "Use the force_start load parameter to " 1832 + "override.\n"); 1833 + return -EFAULT; 1834 + } 1835 + 1836 + /* Force monitoring */ 1837 + data->config |= 0x01; 1838 + dme1737_write(client, DME1737_REG_CONFIG, data->config); 1839 + } 1840 + /* Inform if part is not ready */ 1841 + if (!(data->config & 0x04)) { 1842 + dev_err(dev, "Device is not ready.\n"); 1843 + return -EFAULT; 1844 + } 1845 + 1846 + /* Determine which optional fan and pwm features are enabled/present */ 1847 + if (client->driver) { /* I2C chip */ 1848 + data->config2 = dme1737_read(client, DME1737_REG_CONFIG2); 1849 + /* Check if optional fan3 input is enabled */ 1850 + if (data->config2 & 0x04) { 1851 + data->has_fan |= (1 << 2); 1852 + } 1853 + 1854 + /* Fan4 and pwm3 are only available if the client's I2C address 1855 + * is the default 0x2e. Otherwise the I/Os associated with 1856 + * these functions are used for addr enable/select. */ 1857 + if (data->client.addr == 0x2e) { 1858 + data->has_fan |= (1 << 3); 1859 + data->has_pwm |= (1 << 2); 1860 + } 1861 + 1862 + /* Determine which of the optional fan[5-6] and pwm[5-6] 1863 + * features are enabled. For this, we need to query the runtime 1864 + * registers through the Super-IO LPC interface. Try both 1865 + * config ports 0x2e and 0x4e. */ 1866 + if (dme1737_i2c_get_features(0x2e, data) && 1867 + dme1737_i2c_get_features(0x4e, data)) { 1868 + dev_warn(dev, "Failed to query Super-IO for optional " 1869 + "features.\n"); 1870 + } 1871 + } else { /* ISA chip */ 1872 + /* Fan3 and pwm3 are always available. Fan[4-5] and pwm[5-6] 1873 + * don't exist in the ISA chip. */ 1874 + data->has_fan |= (1 << 2); 1875 + data->has_pwm |= (1 << 2); 1876 + } 1877 + 1878 + /* Fan1, fan2, pwm1, and pwm2 are always present */ 1879 + data->has_fan |= 0x03; 1880 + data->has_pwm |= 0x03; 1881 + 1882 + dev_info(dev, "Optional features: pwm3=%s, pwm5=%s, pwm6=%s, " 1883 + "fan3=%s, fan4=%s, fan5=%s, fan6=%s.\n", 1884 + (data->has_pwm & (1 << 2)) ? "yes" : "no", 1885 + (data->has_pwm & (1 << 4)) ? "yes" : "no", 1886 + (data->has_pwm & (1 << 5)) ? "yes" : "no", 1887 + (data->has_fan & (1 << 2)) ? "yes" : "no", 1888 + (data->has_fan & (1 << 3)) ? "yes" : "no", 1889 + (data->has_fan & (1 << 4)) ? "yes" : "no", 1890 + (data->has_fan & (1 << 5)) ? "yes" : "no"); 1891 + 1892 + reg = dme1737_read(client, DME1737_REG_TACH_PWM); 1893 + /* Inform if fan-to-pwm mapping differs from the default */ 1894 + if (client->driver && reg != 0xa4) { /* I2C chip */ 1895 + dev_warn(dev, "Non-standard fan to pwm mapping: " 1896 + "fan1->pwm%d, fan2->pwm%d, fan3->pwm%d, " 1897 + "fan4->pwm%d. Please report to the driver " 1898 + "maintainer.\n", 1899 + (reg & 0x03) + 1, ((reg >> 2) & 0x03) + 1, 1900 + ((reg >> 4) & 0x03) + 1, ((reg >> 6) & 0x03) + 1); 1901 + } else if (!client->driver && reg != 0x24) { /* ISA chip */ 1902 + dev_warn(dev, "Non-standard fan to pwm mapping: " 1903 + "fan1->pwm%d, fan2->pwm%d, fan3->pwm%d. " 1904 + "Please report to the driver maintainer.\n", 1905 + (reg & 0x03) + 1, ((reg >> 2) & 0x03) + 1, 1906 + ((reg >> 4) & 0x03) + 1); 1907 + } 1908 + 1909 + /* Switch pwm[1-3] to manual mode if they are currently disabled and 1910 + * set the duty-cycles to 0% (which is identical to the PWMs being 1911 + * disabled). */ 1912 + if (!(data->config & 0x02)) { 1913 + for (ix = 0; ix < 3; ix++) { 1914 + data->pwm_config[ix] = dme1737_read(client, 1915 + DME1737_REG_PWM_CONFIG(ix)); 1916 + if ((data->has_pwm & (1 << ix)) && 1917 + (PWM_EN_FROM_REG(data->pwm_config[ix]) == -1)) { 1918 + dev_info(dev, "Switching pwm%d to " 1919 + "manual mode.\n", ix + 1); 1920 + data->pwm_config[ix] = PWM_EN_TO_REG(1, 1921 + data->pwm_config[ix]); 1922 + dme1737_write(client, DME1737_REG_PWM(ix), 0); 1923 + dme1737_write(client, 1924 + DME1737_REG_PWM_CONFIG(ix), 1925 + data->pwm_config[ix]); 1926 + } 1927 + } 1928 + } 1929 + 1930 + /* Initialize the default PWM auto channels zone (acz) assignments */ 1931 + data->pwm_acz[0] = 1; /* pwm1 -> zone1 */ 1932 + data->pwm_acz[1] = 2; /* pwm2 -> zone2 */ 1933 + data->pwm_acz[2] = 4; /* pwm3 -> zone3 */ 1934 + 1935 + /* Set VRM */ 1936 + data->vrm = vid_which_vrm(); 1937 + 1938 + return 0; 1939 + } 1940 + 1941 + /* --------------------------------------------------------------------- 1942 + * I2C device detection and registration 1943 + * --------------------------------------------------------------------- */ 1944 + 1945 + static struct i2c_driver dme1737_i2c_driver; 1946 + 1947 + static int dme1737_i2c_get_features(int sio_cip, struct dme1737_data *data) 1948 + { 1762 1949 int err = 0, reg; 1763 1950 u16 addr; 1764 1951 1765 - /* Enter configuration mode */ 1766 - outb(0x55, sio_cip); 1952 + dme1737_sio_enter(sio_cip); 1767 1953 1768 1954 /* Check device ID 1769 1955 * The DME1737 can return either 0x78 or 0x77 as its device ID. */ ··· 2052 1734 } 2053 1735 2054 1736 exit: 2055 - /* Exit configuration mode */ 2056 - outb(0xaa, sio_cip); 1737 + dme1737_sio_exit(sio_cip); 2057 1738 2058 1739 return err; 2059 1740 } 2060 1741 2061 - /* --------------------------------------------------------------------- 2062 - * Device detection, registration and initialization 2063 - * --------------------------------------------------------------------- */ 2064 - 2065 - static struct i2c_driver dme1737_driver; 2066 - 2067 - static void dme1737_chmod_file(struct i2c_client *client, 2068 - struct attribute *attr, mode_t mode) 2069 - { 2070 - if (sysfs_chmod_file(&client->dev.kobj, attr, mode)) { 2071 - dev_warn(&client->dev, "Failed to change permissions of %s.\n", 2072 - attr->name); 2073 - } 2074 - } 2075 - 2076 - static void dme1737_chmod_group(struct i2c_client *client, 2077 - const struct attribute_group *group, 2078 - mode_t mode) 2079 - { 2080 - struct attribute **attr; 2081 - 2082 - for (attr = group->attrs; *attr; attr++) { 2083 - dme1737_chmod_file(client, *attr, mode); 2084 - } 2085 - } 2086 - 2087 - static int dme1737_init_client(struct i2c_client *client) 2088 - { 2089 - struct dme1737_data *data = i2c_get_clientdata(client); 2090 - int ix; 2091 - u8 reg; 2092 - 2093 - data->config = dme1737_read(client, DME1737_REG_CONFIG); 2094 - /* Inform if part is not monitoring/started */ 2095 - if (!(data->config & 0x01)) { 2096 - if (!force_start) { 2097 - dev_err(&client->dev, "Device is not monitoring. " 2098 - "Use the force_start load parameter to " 2099 - "override.\n"); 2100 - return -EFAULT; 2101 - } 2102 - 2103 - /* Force monitoring */ 2104 - data->config |= 0x01; 2105 - dme1737_write(client, DME1737_REG_CONFIG, data->config); 2106 - } 2107 - /* Inform if part is not ready */ 2108 - if (!(data->config & 0x04)) { 2109 - dev_err(&client->dev, "Device is not ready.\n"); 2110 - return -EFAULT; 2111 - } 2112 - 2113 - data->config2 = dme1737_read(client, DME1737_REG_CONFIG2); 2114 - /* Check if optional fan3 input is enabled */ 2115 - if (data->config2 & 0x04) { 2116 - data->has_fan |= (1 << 2); 2117 - } 2118 - 2119 - /* Fan4 and pwm3 are only available if the client's I2C address 2120 - * is the default 0x2e. Otherwise the I/Os associated with these 2121 - * functions are used for addr enable/select. */ 2122 - if (client->addr == 0x2e) { 2123 - data->has_fan |= (1 << 3); 2124 - data->has_pwm |= (1 << 2); 2125 - } 2126 - 2127 - /* Determine if the optional fan[5-6] and/or pwm[5-6] are enabled. 2128 - * For this, we need to query the runtime registers through the 2129 - * Super-IO LPC interface. Try both config ports 0x2e and 0x4e. */ 2130 - if (dme1737_sio_get_features(0x2e, client) && 2131 - dme1737_sio_get_features(0x4e, client)) { 2132 - dev_warn(&client->dev, "Failed to query Super-IO for optional " 2133 - "features.\n"); 2134 - } 2135 - 2136 - /* Fan1, fan2, pwm1, and pwm2 are always present */ 2137 - data->has_fan |= 0x03; 2138 - data->has_pwm |= 0x03; 2139 - 2140 - dev_info(&client->dev, "Optional features: pwm3=%s, pwm5=%s, pwm6=%s, " 2141 - "fan3=%s, fan4=%s, fan5=%s, fan6=%s.\n", 2142 - (data->has_pwm & (1 << 2)) ? "yes" : "no", 2143 - (data->has_pwm & (1 << 4)) ? "yes" : "no", 2144 - (data->has_pwm & (1 << 5)) ? "yes" : "no", 2145 - (data->has_fan & (1 << 2)) ? "yes" : "no", 2146 - (data->has_fan & (1 << 3)) ? "yes" : "no", 2147 - (data->has_fan & (1 << 4)) ? "yes" : "no", 2148 - (data->has_fan & (1 << 5)) ? "yes" : "no"); 2149 - 2150 - reg = dme1737_read(client, DME1737_REG_TACH_PWM); 2151 - /* Inform if fan-to-pwm mapping differs from the default */ 2152 - if (reg != 0xa4) { 2153 - dev_warn(&client->dev, "Non-standard fan to pwm mapping: " 2154 - "fan1->pwm%d, fan2->pwm%d, fan3->pwm%d, " 2155 - "fan4->pwm%d. Please report to the driver " 2156 - "maintainer.\n", 2157 - (reg & 0x03) + 1, ((reg >> 2) & 0x03) + 1, 2158 - ((reg >> 4) & 0x03) + 1, ((reg >> 6) & 0x03) + 1); 2159 - } 2160 - 2161 - /* Switch pwm[1-3] to manual mode if they are currently disabled and 2162 - * set the duty-cycles to 0% (which is identical to the PWMs being 2163 - * disabled). */ 2164 - if (!(data->config & 0x02)) { 2165 - for (ix = 0; ix < 3; ix++) { 2166 - data->pwm_config[ix] = dme1737_read(client, 2167 - DME1737_REG_PWM_CONFIG(ix)); 2168 - if ((data->has_pwm & (1 << ix)) && 2169 - (PWM_EN_FROM_REG(data->pwm_config[ix]) == -1)) { 2170 - dev_info(&client->dev, "Switching pwm%d to " 2171 - "manual mode.\n", ix + 1); 2172 - data->pwm_config[ix] = PWM_EN_TO_REG(1, 2173 - data->pwm_config[ix]); 2174 - dme1737_write(client, DME1737_REG_PWM(ix), 0); 2175 - dme1737_write(client, 2176 - DME1737_REG_PWM_CONFIG(ix), 2177 - data->pwm_config[ix]); 2178 - } 2179 - } 2180 - } 2181 - 2182 - /* Initialize the default PWM auto channels zone (acz) assignments */ 2183 - data->pwm_acz[0] = 1; /* pwm1 -> zone1 */ 2184 - data->pwm_acz[1] = 2; /* pwm2 -> zone2 */ 2185 - data->pwm_acz[2] = 4; /* pwm3 -> zone3 */ 2186 - 2187 - /* Set VRM */ 2188 - data->vrm = vid_which_vrm(); 2189 - 2190 - return 0; 2191 - } 2192 - 2193 - static int dme1737_detect(struct i2c_adapter *adapter, int address, 2194 - int kind) 1742 + static int dme1737_i2c_detect(struct i2c_adapter *adapter, int address, 1743 + int kind) 2195 1744 { 2196 1745 u8 company, verstep = 0; 2197 1746 struct i2c_client *client; 2198 1747 struct dme1737_data *data; 2199 - int ix, err = 0; 1748 + struct device *dev; 1749 + int err = 0; 2200 1750 const char *name; 2201 1751 2202 1752 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { ··· 2080 1894 i2c_set_clientdata(client, data); 2081 1895 client->addr = address; 2082 1896 client->adapter = adapter; 2083 - client->driver = &dme1737_driver; 1897 + client->driver = &dme1737_i2c_driver; 1898 + dev = &client->dev; 2084 1899 2085 1900 /* A negative kind means that the driver was loaded with no force 2086 1901 * parameter (default), so we must identify the chip. */ ··· 2109 1922 goto exit_kfree; 2110 1923 } 2111 1924 1925 + dev_info(dev, "Found a DME1737 chip at 0x%02x (rev 0x%02x).\n", 1926 + client->addr, verstep); 1927 + 2112 1928 /* Initialize the DME1737 chip */ 2113 - if ((err = dme1737_init_client(client))) { 1929 + if ((err = dme1737_init_device(dev))) { 1930 + dev_err(dev, "Failed to initialize device.\n"); 2114 1931 goto exit_detach; 2115 1932 } 2116 1933 2117 - /* Create standard sysfs attributes */ 2118 - if ((err = sysfs_create_group(&client->dev.kobj, &dme1737_group))) { 2119 - goto exit_detach; 2120 - } 2121 - 2122 - /* Create fan sysfs attributes */ 2123 - for (ix = 0; ix < ARRAY_SIZE(dme1737_fan_group); ix++) { 2124 - if (data->has_fan & (1 << ix)) { 2125 - if ((err = sysfs_create_group(&client->dev.kobj, 2126 - &dme1737_fan_group[ix]))) { 2127 - goto exit_remove; 2128 - } 2129 - } 2130 - } 2131 - 2132 - /* Create PWM sysfs attributes */ 2133 - for (ix = 0; ix < ARRAY_SIZE(dme1737_pwm_group); ix++) { 2134 - if (data->has_pwm & (1 << ix)) { 2135 - if ((err = sysfs_create_group(&client->dev.kobj, 2136 - &dme1737_pwm_group[ix]))) { 2137 - goto exit_remove; 2138 - } 2139 - } 2140 - } 2141 - 2142 - /* Inform if the device is locked. Otherwise change the permissions of 2143 - * selected attributes from read-only to read-writeable. */ 2144 - if (data->config & 0x02) { 2145 - dev_info(&client->dev, "Device is locked. Some attributes " 2146 - "will be read-only.\n"); 2147 - } else { 2148 - /* Change permissions of standard attributes */ 2149 - dme1737_chmod_group(client, &dme1737_lock_group, 2150 - S_IRUGO | S_IWUSR); 2151 - 2152 - /* Change permissions of PWM attributes */ 2153 - for (ix = 0; ix < ARRAY_SIZE(dme1737_pwm_lock_group); ix++) { 2154 - if (data->has_pwm & (1 << ix)) { 2155 - dme1737_chmod_group(client, 2156 - &dme1737_pwm_lock_group[ix], 2157 - S_IRUGO | S_IWUSR); 2158 - } 2159 - } 2160 - 2161 - /* Change permissions of pwm[1-3] if in manual mode */ 2162 - for (ix = 0; ix < 3; ix++) { 2163 - if ((data->has_pwm & (1 << ix)) && 2164 - (PWM_EN_FROM_REG(data->pwm_config[ix]) == 1)) { 2165 - dme1737_chmod_file(client, 2166 - dme1737_attr_pwm[ix], 2167 - S_IRUGO | S_IWUSR); 2168 - } 2169 - } 1934 + /* Create sysfs files */ 1935 + if ((err = dme1737_create_files(dev))) { 1936 + dev_err(dev, "Failed to create sysfs files.\n"); 1937 + goto exit_detach; 2170 1938 } 2171 1939 2172 1940 /* Register device */ 2173 - data->class_dev = hwmon_device_register(&client->dev); 2174 - if (IS_ERR(data->class_dev)) { 2175 - err = PTR_ERR(data->class_dev); 1941 + data->hwmon_dev = hwmon_device_register(dev); 1942 + if (IS_ERR(data->hwmon_dev)) { 1943 + dev_err(dev, "Failed to register device.\n"); 1944 + err = PTR_ERR(data->hwmon_dev); 2176 1945 goto exit_remove; 2177 1946 } 2178 - 2179 - dev_info(&adapter->dev, "Found a DME1737 chip at 0x%02x " 2180 - "(rev 0x%02x)\n", client->addr, verstep); 2181 1947 2182 1948 return 0; 2183 1949 2184 1950 exit_remove: 2185 - for (ix = 0; ix < ARRAY_SIZE(dme1737_fan_group); ix++) { 2186 - if (data->has_fan & (1 << ix)) { 2187 - sysfs_remove_group(&client->dev.kobj, 2188 - &dme1737_fan_group[ix]); 2189 - } 2190 - } 2191 - for (ix = 0; ix < ARRAY_SIZE(dme1737_pwm_group); ix++) { 2192 - if (data->has_pwm & (1 << ix)) { 2193 - sysfs_remove_group(&client->dev.kobj, 2194 - &dme1737_pwm_group[ix]); 2195 - } 2196 - } 2197 - sysfs_remove_group(&client->dev.kobj, &dme1737_group); 1951 + dme1737_remove_files(dev); 2198 1952 exit_detach: 2199 1953 i2c_detach_client(client); 2200 1954 exit_kfree: ··· 2144 2016 return err; 2145 2017 } 2146 2018 2147 - static int dme1737_attach_adapter(struct i2c_adapter *adapter) 2019 + static int dme1737_i2c_attach_adapter(struct i2c_adapter *adapter) 2148 2020 { 2149 2021 if (!(adapter->class & I2C_CLASS_HWMON)) { 2150 2022 return 0; 2151 2023 } 2152 2024 2153 - return i2c_probe(adapter, &addr_data, dme1737_detect); 2025 + return i2c_probe(adapter, &addr_data, dme1737_i2c_detect); 2154 2026 } 2155 2027 2156 - static int dme1737_detach_client(struct i2c_client *client) 2028 + static int dme1737_i2c_detach_client(struct i2c_client *client) 2157 2029 { 2158 2030 struct dme1737_data *data = i2c_get_clientdata(client); 2159 - int ix, err; 2031 + int err; 2160 2032 2161 - hwmon_device_unregister(data->class_dev); 2162 - 2163 - for (ix = 0; ix < ARRAY_SIZE(dme1737_fan_group); ix++) { 2164 - if (data->has_fan & (1 << ix)) { 2165 - sysfs_remove_group(&client->dev.kobj, 2166 - &dme1737_fan_group[ix]); 2167 - } 2168 - } 2169 - for (ix = 0; ix < ARRAY_SIZE(dme1737_pwm_group); ix++) { 2170 - if (data->has_pwm & (1 << ix)) { 2171 - sysfs_remove_group(&client->dev.kobj, 2172 - &dme1737_pwm_group[ix]); 2173 - } 2174 - } 2175 - sysfs_remove_group(&client->dev.kobj, &dme1737_group); 2033 + hwmon_device_unregister(data->hwmon_dev); 2034 + dme1737_remove_files(&client->dev); 2176 2035 2177 2036 if ((err = i2c_detach_client(client))) { 2178 2037 return err; ··· 2169 2054 return 0; 2170 2055 } 2171 2056 2172 - static struct i2c_driver dme1737_driver = { 2057 + static struct i2c_driver dme1737_i2c_driver = { 2173 2058 .driver = { 2174 2059 .name = "dme1737", 2175 2060 }, 2176 - .attach_adapter = dme1737_attach_adapter, 2177 - .detach_client = dme1737_detach_client, 2061 + .attach_adapter = dme1737_i2c_attach_adapter, 2062 + .detach_client = dme1737_i2c_detach_client, 2178 2063 }; 2064 + 2065 + /* --------------------------------------------------------------------- 2066 + * ISA device detection and registration 2067 + * --------------------------------------------------------------------- */ 2068 + 2069 + static int __init dme1737_isa_detect(int sio_cip, unsigned short *addr) 2070 + { 2071 + int err = 0, reg; 2072 + unsigned short base_addr; 2073 + 2074 + dme1737_sio_enter(sio_cip); 2075 + 2076 + /* Check device ID 2077 + * We currently know about SCH3112 (0x7c), SCH3114 (0x7d), and 2078 + * SCH3116 (0x7f). */ 2079 + reg = dme1737_sio_inb(sio_cip, 0x20); 2080 + if (!(reg == 0x7c || reg == 0x7d || reg == 0x7f)) { 2081 + err = -ENODEV; 2082 + goto exit; 2083 + } 2084 + 2085 + /* Select logical device A (runtime registers) */ 2086 + dme1737_sio_outb(sio_cip, 0x07, 0x0a); 2087 + 2088 + /* Get the base address of the runtime registers */ 2089 + if (!(base_addr = (dme1737_sio_inb(sio_cip, 0x60) << 8) | 2090 + dme1737_sio_inb(sio_cip, 0x61))) { 2091 + printk(KERN_ERR "dme1737: Base address not set.\n"); 2092 + err = -ENODEV; 2093 + goto exit; 2094 + } 2095 + 2096 + /* Access to the hwmon registers is through an index/data register 2097 + * pair located at offset 0x70/0x71. */ 2098 + *addr = base_addr + 0x70; 2099 + 2100 + exit: 2101 + dme1737_sio_exit(sio_cip); 2102 + return err; 2103 + } 2104 + 2105 + static int __init dme1737_isa_device_add(unsigned short addr) 2106 + { 2107 + struct resource res = { 2108 + .start = addr, 2109 + .end = addr + DME1737_EXTENT - 1, 2110 + .name = "dme1737", 2111 + .flags = IORESOURCE_IO, 2112 + }; 2113 + int err; 2114 + 2115 + if (!(pdev = platform_device_alloc("dme1737", addr))) { 2116 + printk(KERN_ERR "dme1737: Failed to allocate device.\n"); 2117 + err = -ENOMEM; 2118 + goto exit; 2119 + } 2120 + 2121 + if ((err = platform_device_add_resources(pdev, &res, 1))) { 2122 + printk(KERN_ERR "dme1737: Failed to add device resource " 2123 + "(err = %d).\n", err); 2124 + goto exit_device_put; 2125 + } 2126 + 2127 + if ((err = platform_device_add(pdev))) { 2128 + printk(KERN_ERR "dme1737: Failed to add device (err = %d).\n", 2129 + err); 2130 + goto exit_device_put; 2131 + } 2132 + 2133 + return 0; 2134 + 2135 + exit_device_put: 2136 + platform_device_put(pdev); 2137 + pdev = NULL; 2138 + exit: 2139 + return err; 2140 + } 2141 + 2142 + static int __devinit dme1737_isa_probe(struct platform_device *pdev) 2143 + { 2144 + u8 company, device; 2145 + struct resource *res; 2146 + struct i2c_client *client; 2147 + struct dme1737_data *data; 2148 + struct device *dev = &pdev->dev; 2149 + int err; 2150 + 2151 + res = platform_get_resource(pdev, IORESOURCE_IO, 0); 2152 + if (!request_region(res->start, DME1737_EXTENT, "dme1737")) { 2153 + dev_err(dev, "Failed to request region 0x%04x-0x%04x.\n", 2154 + (unsigned short)res->start, 2155 + (unsigned short)res->start + DME1737_EXTENT - 1); 2156 + err = -EBUSY; 2157 + goto exit; 2158 + } 2159 + 2160 + if (!(data = kzalloc(sizeof(struct dme1737_data), GFP_KERNEL))) { 2161 + err = -ENOMEM; 2162 + goto exit_release_region; 2163 + } 2164 + 2165 + client = &data->client; 2166 + i2c_set_clientdata(client, data); 2167 + client->addr = res->start; 2168 + platform_set_drvdata(pdev, data); 2169 + 2170 + company = dme1737_read(client, DME1737_REG_COMPANY); 2171 + device = dme1737_read(client, DME1737_REG_DEVICE); 2172 + 2173 + if (!((company == DME1737_COMPANY_SMSC) && 2174 + (device == SCH311X_DEVICE))) { 2175 + err = -ENODEV; 2176 + goto exit_kfree; 2177 + } 2178 + 2179 + /* Fill in the remaining client fields and initialize the mutex */ 2180 + strlcpy(client->name, "sch311x", I2C_NAME_SIZE); 2181 + mutex_init(&data->update_lock); 2182 + 2183 + dev_info(dev, "Found a SCH311x chip at 0x%04x\n", client->addr); 2184 + 2185 + /* Initialize the chip */ 2186 + if ((err = dme1737_init_device(dev))) { 2187 + dev_err(dev, "Failed to initialize device.\n"); 2188 + goto exit_kfree; 2189 + } 2190 + 2191 + /* Create sysfs files */ 2192 + if ((err = dme1737_create_files(dev))) { 2193 + dev_err(dev, "Failed to create sysfs files.\n"); 2194 + goto exit_kfree; 2195 + } 2196 + 2197 + /* Register device */ 2198 + data->hwmon_dev = hwmon_device_register(dev); 2199 + if (IS_ERR(data->hwmon_dev)) { 2200 + dev_err(dev, "Failed to register device.\n"); 2201 + err = PTR_ERR(data->hwmon_dev); 2202 + goto exit_remove_files; 2203 + } 2204 + 2205 + return 0; 2206 + 2207 + exit_remove_files: 2208 + dme1737_remove_files(dev); 2209 + exit_kfree: 2210 + platform_set_drvdata(pdev, NULL); 2211 + kfree(data); 2212 + exit_release_region: 2213 + release_region(res->start, DME1737_EXTENT); 2214 + exit: 2215 + return err; 2216 + } 2217 + 2218 + static int __devexit dme1737_isa_remove(struct platform_device *pdev) 2219 + { 2220 + struct dme1737_data *data = platform_get_drvdata(pdev); 2221 + 2222 + hwmon_device_unregister(data->hwmon_dev); 2223 + dme1737_remove_files(&pdev->dev); 2224 + release_region(data->client.addr, DME1737_EXTENT); 2225 + platform_set_drvdata(pdev, NULL); 2226 + kfree(data); 2227 + 2228 + return 0; 2229 + } 2230 + 2231 + static struct platform_driver dme1737_isa_driver = { 2232 + .driver = { 2233 + .owner = THIS_MODULE, 2234 + .name = "dme1737", 2235 + }, 2236 + .probe = dme1737_isa_probe, 2237 + .remove = __devexit_p(dme1737_isa_remove), 2238 + }; 2239 + 2240 + /* --------------------------------------------------------------------- 2241 + * Module initialization and cleanup 2242 + * --------------------------------------------------------------------- */ 2179 2243 2180 2244 static int __init dme1737_init(void) 2181 2245 { 2182 - return i2c_add_driver(&dme1737_driver); 2246 + int err; 2247 + unsigned short addr; 2248 + 2249 + if ((err = i2c_add_driver(&dme1737_i2c_driver))) { 2250 + goto exit; 2251 + } 2252 + 2253 + if (dme1737_isa_detect(0x2e, &addr) && 2254 + dme1737_isa_detect(0x4e, &addr)) { 2255 + /* Return 0 if we didn't find an ISA device */ 2256 + return 0; 2257 + } 2258 + 2259 + if ((err = platform_driver_register(&dme1737_isa_driver))) { 2260 + goto exit_del_i2c_driver; 2261 + } 2262 + 2263 + /* Sets global pdev as a side effect */ 2264 + if ((err = dme1737_isa_device_add(addr))) { 2265 + goto exit_del_isa_driver; 2266 + } 2267 + 2268 + return 0; 2269 + 2270 + exit_del_isa_driver: 2271 + platform_driver_unregister(&dme1737_isa_driver); 2272 + exit_del_i2c_driver: 2273 + i2c_del_driver(&dme1737_i2c_driver); 2274 + exit: 2275 + return err; 2183 2276 } 2184 2277 2185 2278 static void __exit dme1737_exit(void) 2186 2279 { 2187 - i2c_del_driver(&dme1737_driver); 2280 + if (pdev) { 2281 + platform_device_unregister(pdev); 2282 + platform_driver_unregister(&dme1737_isa_driver); 2283 + } 2284 + 2285 + i2c_del_driver(&dme1737_i2c_driver); 2188 2286 } 2189 2287 2190 2288 MODULE_AUTHOR("Juerg Haefliger <juergh@gmail.com>");
+6 -6
drivers/hwmon/ds1621.c
··· 73 73 /* Each client has this additional data */ 74 74 struct ds1621_data { 75 75 struct i2c_client client; 76 - struct class_device *class_dev; 76 + struct device *hwmon_dev; 77 77 struct mutex update_lock; 78 78 char valid; /* !=0 if following fields are valid */ 79 79 unsigned long last_updated; /* In jiffies */ ··· 151 151 struct sensor_device_attribute *attr = to_sensor_dev_attr(da); 152 152 struct i2c_client *client = to_i2c_client(dev); 153 153 struct ds1621_data *data = ds1621_update_client(dev); 154 - u16 val = LM75_TEMP_TO_REG(simple_strtoul(buf, NULL, 10)); 154 + u16 val = LM75_TEMP_TO_REG(simple_strtol(buf, NULL, 10)); 155 155 156 156 mutex_lock(&data->update_lock); 157 157 data->temp[attr->index] = val; ··· 266 266 if ((err = sysfs_create_group(&client->dev.kobj, &ds1621_group))) 267 267 goto exit_detach; 268 268 269 - data->class_dev = hwmon_device_register(&client->dev); 270 - if (IS_ERR(data->class_dev)) { 271 - err = PTR_ERR(data->class_dev); 269 + data->hwmon_dev = hwmon_device_register(&client->dev); 270 + if (IS_ERR(data->hwmon_dev)) { 271 + err = PTR_ERR(data->hwmon_dev); 272 272 goto exit_remove_files; 273 273 } 274 274 ··· 289 289 struct ds1621_data *data = i2c_get_clientdata(client); 290 290 int err; 291 291 292 - hwmon_device_unregister(data->class_dev); 292 + hwmon_device_unregister(data->hwmon_dev); 293 293 sysfs_remove_group(&client->dev.kobj, &ds1621_group); 294 294 295 295 if ((err = i2c_detach_client(client)))
+9 -6
drivers/hwmon/f71805f.c
··· 10 10 * The F71872F/FG is almost the same, with two more voltages monitored, 11 11 * and 6 VID inputs. 12 12 * 13 + * The F71806F/FG is essentially the same as the F71872F/FG. It even has 14 + * the same chip ID, so the driver can't differentiate between. 15 + * 13 16 * This program is free software; you can redistribute it and/or modify 14 17 * it under the terms of the GNU General Public License as published by 15 18 * the Free Software Foundation; either version 2 of the License, or ··· 162 159 struct f71805f_data { 163 160 unsigned short addr; 164 161 const char *name; 165 - struct class_device *class_dev; 162 + struct device *hwmon_dev; 166 163 167 164 struct mutex update_lock; 168 165 char valid; /* !=0 if following fields are valid */ ··· 1381 1378 } 1382 1379 } 1383 1380 1384 - data->class_dev = hwmon_device_register(&pdev->dev); 1385 - if (IS_ERR(data->class_dev)) { 1386 - err = PTR_ERR(data->class_dev); 1381 + data->hwmon_dev = hwmon_device_register(&pdev->dev); 1382 + if (IS_ERR(data->hwmon_dev)) { 1383 + err = PTR_ERR(data->hwmon_dev); 1387 1384 dev_err(&pdev->dev, "Class registration failed (%d)\n", err); 1388 1385 goto exit_remove_files; 1389 1386 } ··· 1410 1407 struct resource *res; 1411 1408 int i; 1412 1409 1413 - hwmon_device_unregister(data->class_dev); 1410 + hwmon_device_unregister(data->hwmon_dev); 1414 1411 sysfs_remove_group(&pdev->dev.kobj, &f71805f_group); 1415 1412 for (i = 0; i < 4; i++) 1416 1413 sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_optin[i]); ··· 1488 1485 1489 1486 static const char *names[] = { 1490 1487 "F71805F/FG", 1491 - "F71872F/FG", 1488 + "F71872F/FG or F71806F/FG", 1492 1489 }; 1493 1490 1494 1491 superio_enter(sioaddr);
+950
drivers/hwmon/f71882fg.c
··· 1 + /*************************************************************************** 2 + * Copyright (C) 2006 by Hans Edgington <hans@edgington.nl> * 3 + * Copyright (C) 2007 by Hans de Goede <j.w.r.degoede@hhs.nl> * 4 + * * 5 + * This program is free software; you can redistribute it and/or modify * 6 + * it under the terms of the GNU General Public License as published by * 7 + * the Free Software Foundation; either version 2 of the License, or * 8 + * (at your option) any later version. * 9 + * * 10 + * This program is distributed in the hope that it will be useful, * 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of * 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 13 + * GNU General Public License for more details. * 14 + * * 15 + * You should have received a copy of the GNU General Public License * 16 + * along with this program; if not, write to the * 17 + * Free Software Foundation, Inc., * 18 + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * 19 + ***************************************************************************/ 20 + 21 + #include <linux/module.h> 22 + #include <linux/init.h> 23 + #include <linux/slab.h> 24 + #include <linux/jiffies.h> 25 + #include <linux/platform_device.h> 26 + #include <linux/hwmon.h> 27 + #include <linux/hwmon-sysfs.h> 28 + #include <linux/err.h> 29 + #include <linux/mutex.h> 30 + #include <asm/io.h> 31 + 32 + #define DRVNAME "f71882fg" 33 + 34 + #define SIO_F71882FG_LD_HWM 0x04 /* Hardware monitor logical device*/ 35 + #define SIO_UNLOCK_KEY 0x87 /* Key to enable Super-I/O */ 36 + #define SIO_LOCK_KEY 0xAA /* Key to diasble Super-I/O */ 37 + 38 + #define SIO_REG_LDSEL 0x07 /* Logical device select */ 39 + #define SIO_REG_DEVID 0x20 /* Device ID (2 bytes) */ 40 + #define SIO_REG_DEVREV 0x22 /* Device revision */ 41 + #define SIO_REG_MANID 0x23 /* Fintek ID (2 bytes) */ 42 + #define SIO_REG_ENABLE 0x30 /* Logical device enable */ 43 + #define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */ 44 + 45 + #define SIO_FINTEK_ID 0x1934 /* Manufacturers ID */ 46 + #define SIO_F71882_ID 0x0541 /* Chipset ID */ 47 + 48 + #define REGION_LENGTH 8 49 + #define ADDR_REG_OFFSET 5 50 + #define DATA_REG_OFFSET 6 51 + 52 + #define F71882FG_REG_PECI 0x0A 53 + 54 + #define F71882FG_REG_IN_STATUS 0x12 55 + #define F71882FG_REG_IN_BEEP 0x13 56 + #define F71882FG_REG_IN(nr) (0x20 + (nr)) 57 + #define F71882FG_REG_IN1_HIGH 0x32 58 + 59 + #define F71882FG_REG_FAN(nr) (0xA0 + (16 * (nr))) 60 + #define F71882FG_REG_FAN_STATUS 0x92 61 + #define F71882FG_REG_FAN_BEEP 0x93 62 + 63 + #define F71882FG_REG_TEMP(nr) (0x72 + 2 * (nr)) 64 + #define F71882FG_REG_TEMP_OVT(nr) (0x82 + 2 * (nr)) 65 + #define F71882FG_REG_TEMP_HIGH(nr) (0x83 + 2 * (nr)) 66 + #define F71882FG_REG_TEMP_STATUS 0x62 67 + #define F71882FG_REG_TEMP_BEEP 0x63 68 + #define F71882FG_REG_TEMP_HYST1 0x6C 69 + #define F71882FG_REG_TEMP_HYST23 0x6D 70 + #define F71882FG_REG_TEMP_TYPE 0x6B 71 + #define F71882FG_REG_TEMP_DIODE_OPEN 0x6F 72 + 73 + #define F71882FG_REG_START 0x01 74 + 75 + #define FAN_MIN_DETECT 366 /* Lowest detectable fanspeed */ 76 + 77 + static struct platform_device *f71882fg_pdev = NULL; 78 + 79 + /* Super-I/O Function prototypes */ 80 + static inline int superio_inb(int base, int reg); 81 + static inline int superio_inw(int base, int reg); 82 + static inline void superio_enter(int base); 83 + static inline void superio_select(int base, int ld); 84 + static inline void superio_exit(int base); 85 + 86 + static inline u16 fan_from_reg ( u16 reg ); 87 + 88 + struct f71882fg_data { 89 + unsigned short addr; 90 + struct device *hwmon_dev; 91 + 92 + struct mutex update_lock; 93 + char valid; /* !=0 if following fields are valid */ 94 + unsigned long last_updated; /* In jiffies */ 95 + unsigned long last_limits; /* In jiffies */ 96 + 97 + /* Register Values */ 98 + u8 in[9]; 99 + u8 in1_max; 100 + u8 in_status; 101 + u8 in_beep; 102 + u16 fan[4]; 103 + u8 fan_status; 104 + u8 fan_beep; 105 + u8 temp[3]; 106 + u8 temp_ovt[3]; 107 + u8 temp_high[3]; 108 + u8 temp_hyst[3]; 109 + u8 temp_type[3]; 110 + u8 temp_status; 111 + u8 temp_beep; 112 + u8 temp_diode_open; 113 + }; 114 + 115 + static u8 f71882fg_read8(struct f71882fg_data *data, u8 reg); 116 + static u16 f71882fg_read16(struct f71882fg_data *data, u8 reg); 117 + static void f71882fg_write8(struct f71882fg_data *data, u8 reg, u8 val); 118 + 119 + /* Sysfs in*/ 120 + static ssize_t show_in(struct device *dev, struct device_attribute *devattr, 121 + char *buf); 122 + static ssize_t show_in_max(struct device *dev, struct device_attribute 123 + *devattr, char *buf); 124 + static ssize_t store_in_max(struct device *dev, struct device_attribute 125 + *devattr, const char *buf, size_t count); 126 + static ssize_t show_in_beep(struct device *dev, struct device_attribute 127 + *devattr, char *buf); 128 + static ssize_t store_in_beep(struct device *dev, struct device_attribute 129 + *devattr, const char *buf, size_t count); 130 + static ssize_t show_in_alarm(struct device *dev, struct device_attribute 131 + *devattr, char *buf); 132 + /* Sysfs Fan */ 133 + static ssize_t show_fan(struct device *dev, struct device_attribute *devattr, 134 + char *buf); 135 + static ssize_t show_fan_beep(struct device *dev, struct device_attribute 136 + *devattr, char *buf); 137 + static ssize_t store_fan_beep(struct device *dev, struct device_attribute 138 + *devattr, const char *buf, size_t count); 139 + static ssize_t show_fan_alarm(struct device *dev, struct device_attribute 140 + *devattr, char *buf); 141 + /* Sysfs Temp */ 142 + static ssize_t show_temp(struct device *dev, struct device_attribute 143 + *devattr, char *buf); 144 + static ssize_t show_temp_max(struct device *dev, struct device_attribute 145 + *devattr, char *buf); 146 + static ssize_t store_temp_max(struct device *dev, struct device_attribute 147 + *devattr, const char *buf, size_t count); 148 + static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute 149 + *devattr, char *buf); 150 + static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute 151 + *devattr, const char *buf, size_t count); 152 + static ssize_t show_temp_crit(struct device *dev, struct device_attribute 153 + *devattr, char *buf); 154 + static ssize_t store_temp_crit(struct device *dev, struct device_attribute 155 + *devattr, const char *buf, size_t count); 156 + static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute 157 + *devattr, char *buf); 158 + static ssize_t show_temp_type(struct device *dev, struct device_attribute 159 + *devattr, char *buf); 160 + static ssize_t show_temp_beep(struct device *dev, struct device_attribute 161 + *devattr, char *buf); 162 + static ssize_t store_temp_beep(struct device *dev, struct device_attribute 163 + *devattr, const char *buf, size_t count); 164 + static ssize_t show_temp_alarm(struct device *dev, struct device_attribute 165 + *devattr, char *buf); 166 + static ssize_t show_temp_fault(struct device *dev, struct device_attribute 167 + *devattr, char *buf); 168 + /* Sysfs misc */ 169 + static ssize_t show_name(struct device *dev, struct device_attribute *devattr, 170 + char *buf); 171 + 172 + static int __devinit f71882fg_probe(struct platform_device * pdev); 173 + static int __devexit f71882fg_remove(struct platform_device *pdev); 174 + static int __init f71882fg_init(void); 175 + static int __init f71882fg_find(int sioaddr, unsigned short *address); 176 + static int __init f71882fg_device_add(unsigned short address); 177 + static void __exit f71882fg_exit(void); 178 + 179 + static struct platform_driver f71882fg_driver = { 180 + .driver = { 181 + .owner = THIS_MODULE, 182 + .name = DRVNAME, 183 + }, 184 + .probe = f71882fg_probe, 185 + .remove = __devexit_p(f71882fg_remove), 186 + }; 187 + 188 + static struct device_attribute f71882fg_dev_attr[] = 189 + { 190 + __ATTR( name, S_IRUGO, show_name, NULL ), 191 + }; 192 + 193 + static struct sensor_device_attribute f71882fg_in_temp_attr[] = 194 + { 195 + SENSOR_ATTR(in0_input, S_IRUGO, show_in, NULL, 0), 196 + SENSOR_ATTR(in1_input, S_IRUGO, show_in, NULL, 1), 197 + SENSOR_ATTR(in1_max, S_IRUGO|S_IWUSR, show_in_max, store_in_max, 1), 198 + SENSOR_ATTR(in1_beep, S_IRUGO|S_IWUSR, show_in_beep, store_in_beep, 1), 199 + SENSOR_ATTR(in1_alarm, S_IRUGO, show_in_alarm, NULL, 1), 200 + SENSOR_ATTR(in2_input, S_IRUGO, show_in, NULL, 2), 201 + SENSOR_ATTR(in3_input, S_IRUGO, show_in, NULL, 3), 202 + SENSOR_ATTR(in4_input, S_IRUGO, show_in, NULL, 4), 203 + SENSOR_ATTR(in5_input, S_IRUGO, show_in, NULL, 5), 204 + SENSOR_ATTR(in6_input, S_IRUGO, show_in, NULL, 6), 205 + SENSOR_ATTR(in7_input, S_IRUGO, show_in, NULL, 7), 206 + SENSOR_ATTR(in8_input, S_IRUGO, show_in, NULL, 8), 207 + SENSOR_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0), 208 + SENSOR_ATTR(temp1_max, S_IRUGO|S_IWUSR, show_temp_max, 209 + store_temp_max, 0), 210 + SENSOR_ATTR(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst, 211 + store_temp_max_hyst, 0), 212 + SENSOR_ATTR(temp1_crit, S_IRUGO|S_IWUSR, show_temp_crit, 213 + store_temp_crit, 0), 214 + SENSOR_ATTR(temp1_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL, 0), 215 + SENSOR_ATTR(temp1_type, S_IRUGO, show_temp_type, NULL, 0), 216 + SENSOR_ATTR(temp1_beep, S_IRUGO|S_IWUSR, show_temp_beep, 217 + store_temp_beep, 0), 218 + SENSOR_ATTR(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0), 219 + SENSOR_ATTR(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0), 220 + SENSOR_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1), 221 + SENSOR_ATTR(temp2_max, S_IRUGO|S_IWUSR, show_temp_max, 222 + store_temp_max, 1), 223 + SENSOR_ATTR(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst, 224 + store_temp_max_hyst, 1), 225 + SENSOR_ATTR(temp2_crit, S_IRUGO|S_IWUSR, show_temp_crit, 226 + store_temp_crit, 1), 227 + SENSOR_ATTR(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL, 1), 228 + SENSOR_ATTR(temp2_type, S_IRUGO, show_temp_type, NULL, 1), 229 + SENSOR_ATTR(temp2_beep, S_IRUGO|S_IWUSR, show_temp_beep, 230 + store_temp_beep, 1), 231 + SENSOR_ATTR(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 1), 232 + SENSOR_ATTR(temp2_fault, S_IRUGO, show_temp_fault, NULL, 1), 233 + SENSOR_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2), 234 + SENSOR_ATTR(temp3_max, S_IRUGO|S_IWUSR, show_temp_max, 235 + store_temp_max, 2), 236 + SENSOR_ATTR(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst, 237 + store_temp_max_hyst, 2), 238 + SENSOR_ATTR(temp3_crit, S_IRUGO|S_IWUSR, show_temp_crit, 239 + store_temp_crit, 2), 240 + SENSOR_ATTR(temp3_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL, 2), 241 + SENSOR_ATTR(temp3_type, S_IRUGO, show_temp_type, NULL, 2), 242 + SENSOR_ATTR(temp3_beep, S_IRUGO|S_IWUSR, show_temp_beep, 243 + store_temp_beep, 2), 244 + SENSOR_ATTR(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 2), 245 + SENSOR_ATTR(temp3_fault, S_IRUGO, show_temp_fault, NULL, 2) 246 + }; 247 + 248 + static struct sensor_device_attribute f71882fg_fan_attr[] = 249 + { 250 + SENSOR_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0), 251 + SENSOR_ATTR(fan1_beep, S_IRUGO|S_IWUSR, show_fan_beep, 252 + store_fan_beep, 0), 253 + SENSOR_ATTR(fan1_alarm, S_IRUGO, show_fan_alarm, NULL, 0), 254 + SENSOR_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1), 255 + SENSOR_ATTR(fan2_beep, S_IRUGO|S_IWUSR, show_fan_beep, 256 + store_fan_beep, 1), 257 + SENSOR_ATTR(fan2_alarm, S_IRUGO, show_fan_alarm, NULL, 1), 258 + SENSOR_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2), 259 + SENSOR_ATTR(fan3_beep, S_IRUGO|S_IWUSR, show_fan_beep, 260 + store_fan_beep, 2), 261 + SENSOR_ATTR(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 2), 262 + SENSOR_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 3), 263 + SENSOR_ATTR(fan4_beep, S_IRUGO|S_IWUSR, show_fan_beep, 264 + store_fan_beep, 3), 265 + SENSOR_ATTR(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 3) 266 + }; 267 + 268 + 269 + /* Super I/O functions */ 270 + static inline int superio_inb(int base, int reg) 271 + { 272 + outb(reg, base); 273 + return inb(base + 1); 274 + } 275 + 276 + static int superio_inw(int base, int reg) 277 + { 278 + int val; 279 + outb(reg++, base); 280 + val = inb(base + 1) << 8; 281 + outb(reg, base); 282 + val |= inb(base + 1); 283 + return val; 284 + } 285 + 286 + static inline void superio_enter(int base) 287 + { 288 + /* according to the datasheet the key must be send twice! */ 289 + outb( SIO_UNLOCK_KEY, base); 290 + outb( SIO_UNLOCK_KEY, base); 291 + } 292 + 293 + static inline void superio_select( int base, int ld) 294 + { 295 + outb(SIO_REG_LDSEL, base); 296 + outb(ld, base + 1); 297 + } 298 + 299 + static inline void superio_exit(int base) 300 + { 301 + outb(SIO_LOCK_KEY, base); 302 + } 303 + 304 + static inline u16 fan_from_reg(u16 reg) 305 + { 306 + return reg ? (1500000 / reg) : 0; 307 + } 308 + 309 + static u8 f71882fg_read8(struct f71882fg_data *data, u8 reg) 310 + { 311 + u8 val; 312 + 313 + outb(reg, data->addr + ADDR_REG_OFFSET); 314 + val = inb(data->addr + DATA_REG_OFFSET); 315 + 316 + return val; 317 + } 318 + 319 + static u16 f71882fg_read16(struct f71882fg_data *data, u8 reg) 320 + { 321 + u16 val; 322 + 323 + outb(reg++, data->addr + ADDR_REG_OFFSET); 324 + val = inb(data->addr + DATA_REG_OFFSET) << 8; 325 + outb(reg, data->addr + ADDR_REG_OFFSET); 326 + val |= inb(data->addr + DATA_REG_OFFSET); 327 + 328 + return val; 329 + } 330 + 331 + static void f71882fg_write8(struct f71882fg_data *data, u8 reg, u8 val) 332 + { 333 + outb(reg, data->addr + ADDR_REG_OFFSET); 334 + outb(val, data->addr + DATA_REG_OFFSET); 335 + } 336 + 337 + static struct f71882fg_data *f71882fg_update_device(struct device * dev) 338 + { 339 + struct f71882fg_data *data = dev_get_drvdata(dev); 340 + int nr, reg, reg2; 341 + 342 + mutex_lock(&data->update_lock); 343 + 344 + /* Update once every 60 seconds */ 345 + if ( time_after(jiffies, data->last_limits + 60 * HZ ) || 346 + !data->valid) { 347 + data->in1_max = f71882fg_read8(data, F71882FG_REG_IN1_HIGH); 348 + data->in_beep = f71882fg_read8(data, F71882FG_REG_IN_BEEP); 349 + 350 + /* Get High & boundary temps*/ 351 + for (nr = 0; nr < 3; nr++) { 352 + data->temp_ovt[nr] = f71882fg_read8(data, 353 + F71882FG_REG_TEMP_OVT(nr)); 354 + data->temp_high[nr] = f71882fg_read8(data, 355 + F71882FG_REG_TEMP_HIGH(nr)); 356 + } 357 + 358 + /* Have to hardcode hyst*/ 359 + data->temp_hyst[0] = f71882fg_read8(data, 360 + F71882FG_REG_TEMP_HYST1) >> 4; 361 + /* Hyst temps 2 & 3 stored in same register */ 362 + reg = f71882fg_read8(data, F71882FG_REG_TEMP_HYST23); 363 + data->temp_hyst[1] = reg & 0x0F; 364 + data->temp_hyst[2] = reg >> 4; 365 + 366 + /* Have to hardcode type, because temp1 is special */ 367 + reg = f71882fg_read8(data, F71882FG_REG_TEMP_TYPE); 368 + reg2 = f71882fg_read8(data, F71882FG_REG_PECI); 369 + if ((reg2 & 0x03) == 0x01) 370 + data->temp_type[0] = 6 /* PECI */; 371 + else if ((reg2 & 0x03) == 0x02) 372 + data->temp_type[0] = 5 /* AMDSI */; 373 + else 374 + data->temp_type[0] = (reg & 0x02) ? 2 : 4; 375 + 376 + data->temp_type[1] = (reg & 0x04) ? 2 : 4; 377 + data->temp_type[2] = (reg & 0x08) ? 2 : 4; 378 + 379 + data->temp_beep = f71882fg_read8(data, F71882FG_REG_TEMP_BEEP); 380 + 381 + data->fan_beep = f71882fg_read8(data, F71882FG_REG_FAN_BEEP); 382 + 383 + data->last_limits = jiffies; 384 + } 385 + 386 + /* Update every second */ 387 + if (time_after(jiffies, data->last_updated + HZ) || !data->valid) { 388 + data->temp_status = f71882fg_read8(data, 389 + F71882FG_REG_TEMP_STATUS); 390 + data->temp_diode_open = f71882fg_read8(data, 391 + F71882FG_REG_TEMP_DIODE_OPEN); 392 + for (nr = 0; nr < 3; nr++) 393 + data->temp[nr] = f71882fg_read8(data, 394 + F71882FG_REG_TEMP(nr)); 395 + 396 + data->fan_status = f71882fg_read8(data, 397 + F71882FG_REG_FAN_STATUS); 398 + for (nr = 0; nr < 4; nr++) 399 + data->fan[nr] = f71882fg_read16(data, 400 + F71882FG_REG_FAN(nr)); 401 + 402 + data->in_status = f71882fg_read8(data, 403 + F71882FG_REG_IN_STATUS); 404 + for (nr = 0; nr < 9; nr++) 405 + data->in[nr] = f71882fg_read8(data, 406 + F71882FG_REG_IN(nr)); 407 + 408 + data->last_updated = jiffies; 409 + data->valid = 1; 410 + } 411 + 412 + mutex_unlock(&data->update_lock); 413 + 414 + return data; 415 + } 416 + 417 + /* Sysfs Interface */ 418 + static ssize_t show_fan(struct device *dev, struct device_attribute *devattr, 419 + char *buf) 420 + { 421 + struct f71882fg_data *data = f71882fg_update_device(dev); 422 + int nr = to_sensor_dev_attr(devattr)->index; 423 + int speed = fan_from_reg(data->fan[nr]); 424 + 425 + if (speed == FAN_MIN_DETECT) 426 + speed = 0; 427 + 428 + return sprintf(buf, "%d\n", speed); 429 + } 430 + 431 + static ssize_t show_fan_beep(struct device *dev, struct device_attribute 432 + *devattr, char *buf) 433 + { 434 + struct f71882fg_data *data = f71882fg_update_device(dev); 435 + int nr = to_sensor_dev_attr(devattr)->index; 436 + 437 + if (data->fan_beep & (1 << nr)) 438 + return sprintf(buf, "1\n"); 439 + else 440 + return sprintf(buf, "0\n"); 441 + } 442 + 443 + static ssize_t store_fan_beep(struct device *dev, struct device_attribute 444 + *devattr, const char *buf, size_t count) 445 + { 446 + struct f71882fg_data *data = dev_get_drvdata(dev); 447 + int nr = to_sensor_dev_attr(devattr)->index; 448 + int val = simple_strtoul(buf, NULL, 10); 449 + 450 + mutex_lock(&data->update_lock); 451 + if (val) 452 + data->fan_beep |= 1 << nr; 453 + else 454 + data->fan_beep &= ~(1 << nr); 455 + 456 + f71882fg_write8(data, F71882FG_REG_FAN_BEEP, data->fan_beep); 457 + mutex_unlock(&data->update_lock); 458 + 459 + return count; 460 + } 461 + 462 + static ssize_t show_fan_alarm(struct device *dev, struct device_attribute 463 + *devattr, char *buf) 464 + { 465 + struct f71882fg_data *data = f71882fg_update_device(dev); 466 + int nr = to_sensor_dev_attr(devattr)->index; 467 + 468 + if (data->fan_status & (1 << nr)) 469 + return sprintf(buf, "1\n"); 470 + else 471 + return sprintf(buf, "0\n"); 472 + } 473 + 474 + static ssize_t show_in(struct device *dev, struct device_attribute *devattr, 475 + char *buf) 476 + { 477 + struct f71882fg_data *data = f71882fg_update_device(dev); 478 + int nr = to_sensor_dev_attr(devattr)->index; 479 + 480 + return sprintf(buf, "%d\n", data->in[nr] * 8); 481 + } 482 + 483 + static ssize_t show_in_max(struct device *dev, struct device_attribute 484 + *devattr, char *buf) 485 + { 486 + struct f71882fg_data *data = f71882fg_update_device(dev); 487 + 488 + return sprintf(buf, "%d\n", data->in1_max * 8); 489 + } 490 + 491 + static ssize_t store_in_max(struct device *dev, struct device_attribute 492 + *devattr, const char *buf, size_t count) 493 + { 494 + struct f71882fg_data *data = dev_get_drvdata(dev); 495 + int val = simple_strtoul(buf, NULL, 10) / 8; 496 + 497 + if (val > 255) 498 + val = 255; 499 + 500 + mutex_lock(&data->update_lock); 501 + f71882fg_write8(data, F71882FG_REG_IN1_HIGH, val); 502 + data->in1_max = val; 503 + mutex_unlock(&data->update_lock); 504 + 505 + return count; 506 + } 507 + 508 + static ssize_t show_in_beep(struct device *dev, struct device_attribute 509 + *devattr, char *buf) 510 + { 511 + struct f71882fg_data *data = f71882fg_update_device(dev); 512 + int nr = to_sensor_dev_attr(devattr)->index; 513 + 514 + if (data->in_beep & (1 << nr)) 515 + return sprintf(buf, "1\n"); 516 + else 517 + return sprintf(buf, "0\n"); 518 + } 519 + 520 + static ssize_t store_in_beep(struct device *dev, struct device_attribute 521 + *devattr, const char *buf, size_t count) 522 + { 523 + struct f71882fg_data *data = dev_get_drvdata(dev); 524 + int nr = to_sensor_dev_attr(devattr)->index; 525 + int val = simple_strtoul(buf, NULL, 10); 526 + 527 + mutex_lock(&data->update_lock); 528 + if (val) 529 + data->in_beep |= 1 << nr; 530 + else 531 + data->in_beep &= ~(1 << nr); 532 + 533 + f71882fg_write8(data, F71882FG_REG_IN_BEEP, data->in_beep); 534 + mutex_unlock(&data->update_lock); 535 + 536 + return count; 537 + } 538 + 539 + static ssize_t show_in_alarm(struct device *dev, struct device_attribute 540 + *devattr, char *buf) 541 + { 542 + struct f71882fg_data *data = f71882fg_update_device(dev); 543 + int nr = to_sensor_dev_attr(devattr)->index; 544 + 545 + if (data->in_status & (1 << nr)) 546 + return sprintf(buf, "1\n"); 547 + else 548 + return sprintf(buf, "0\n"); 549 + } 550 + 551 + static ssize_t show_temp(struct device *dev, struct device_attribute *devattr, 552 + char *buf) 553 + { 554 + struct f71882fg_data *data = f71882fg_update_device(dev); 555 + int nr = to_sensor_dev_attr(devattr)->index; 556 + 557 + return sprintf(buf, "%d\n", data->temp[nr] * 1000); 558 + } 559 + 560 + static ssize_t show_temp_max(struct device *dev, struct device_attribute 561 + *devattr, char *buf) 562 + { 563 + struct f71882fg_data *data = f71882fg_update_device(dev); 564 + int nr = to_sensor_dev_attr(devattr)->index; 565 + 566 + return sprintf(buf, "%d\n", data->temp_high[nr] * 1000); 567 + } 568 + 569 + static ssize_t store_temp_max(struct device *dev, struct device_attribute 570 + *devattr, const char *buf, size_t count) 571 + { 572 + struct f71882fg_data *data = dev_get_drvdata(dev); 573 + int nr = to_sensor_dev_attr(devattr)->index; 574 + int val = simple_strtoul(buf, NULL, 10) / 1000; 575 + 576 + if (val > 255) 577 + val = 255; 578 + 579 + mutex_lock(&data->update_lock); 580 + f71882fg_write8(data, F71882FG_REG_TEMP_HIGH(nr), val); 581 + data->temp_high[nr] = val; 582 + mutex_unlock(&data->update_lock); 583 + 584 + return count; 585 + } 586 + 587 + static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute 588 + *devattr, char *buf) 589 + { 590 + struct f71882fg_data *data = f71882fg_update_device(dev); 591 + int nr = to_sensor_dev_attr(devattr)->index; 592 + 593 + return sprintf(buf, "%d\n", 594 + (data->temp_high[nr] - data->temp_hyst[nr]) * 1000); 595 + } 596 + 597 + static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute 598 + *devattr, const char *buf, size_t count) 599 + { 600 + struct f71882fg_data *data = dev_get_drvdata(dev); 601 + int nr = to_sensor_dev_attr(devattr)->index; 602 + int val = simple_strtoul(buf, NULL, 10) / 1000; 603 + ssize_t ret = count; 604 + 605 + mutex_lock(&data->update_lock); 606 + 607 + /* convert abs to relative and check */ 608 + val = data->temp_high[nr] - val; 609 + if (val < 0 || val > 15) { 610 + ret = -EINVAL; 611 + goto store_temp_max_hyst_exit; 612 + } 613 + 614 + data->temp_hyst[nr] = val; 615 + 616 + /* convert value to register contents */ 617 + switch (nr) { 618 + case 0: 619 + val = val << 4; 620 + break; 621 + case 1: 622 + val = val | (data->temp_hyst[2] << 4); 623 + break; 624 + case 2: 625 + val = data->temp_hyst[1] | (val << 4); 626 + break; 627 + } 628 + 629 + f71882fg_write8(data, nr ? F71882FG_REG_TEMP_HYST23 : 630 + F71882FG_REG_TEMP_HYST1, val); 631 + 632 + store_temp_max_hyst_exit: 633 + mutex_unlock(&data->update_lock); 634 + return ret; 635 + } 636 + 637 + static ssize_t show_temp_crit(struct device *dev, struct device_attribute 638 + *devattr, char *buf) 639 + { 640 + struct f71882fg_data *data = f71882fg_update_device(dev); 641 + int nr = to_sensor_dev_attr(devattr)->index; 642 + 643 + return sprintf(buf, "%d\n", data->temp_ovt[nr] * 1000); 644 + } 645 + 646 + static ssize_t store_temp_crit(struct device *dev, struct device_attribute 647 + *devattr, const char *buf, size_t count) 648 + { 649 + struct f71882fg_data *data = dev_get_drvdata(dev); 650 + int nr = to_sensor_dev_attr(devattr)->index; 651 + int val = simple_strtoul(buf, NULL, 10) / 1000; 652 + 653 + if (val > 255) 654 + val = 255; 655 + 656 + mutex_lock(&data->update_lock); 657 + f71882fg_write8(data, F71882FG_REG_TEMP_OVT(nr), val); 658 + data->temp_ovt[nr] = val; 659 + mutex_unlock(&data->update_lock); 660 + 661 + return count; 662 + } 663 + 664 + static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute 665 + *devattr, char *buf) 666 + { 667 + struct f71882fg_data *data = f71882fg_update_device(dev); 668 + int nr = to_sensor_dev_attr(devattr)->index; 669 + 670 + return sprintf(buf, "%d\n", 671 + (data->temp_ovt[nr] - data->temp_hyst[nr]) * 1000); 672 + } 673 + 674 + static ssize_t show_temp_type(struct device *dev, struct device_attribute 675 + *devattr, char *buf) 676 + { 677 + struct f71882fg_data *data = f71882fg_update_device(dev); 678 + int nr = to_sensor_dev_attr(devattr)->index; 679 + 680 + return sprintf(buf, "%d\n", data->temp_type[nr]); 681 + } 682 + 683 + static ssize_t show_temp_beep(struct device *dev, struct device_attribute 684 + *devattr, char *buf) 685 + { 686 + struct f71882fg_data *data = f71882fg_update_device(dev); 687 + int nr = to_sensor_dev_attr(devattr)->index; 688 + 689 + if (data->temp_beep & (1 << (nr + 1))) 690 + return sprintf(buf, "1\n"); 691 + else 692 + return sprintf(buf, "0\n"); 693 + } 694 + 695 + static ssize_t store_temp_beep(struct device *dev, struct device_attribute 696 + *devattr, const char *buf, size_t count) 697 + { 698 + struct f71882fg_data *data = dev_get_drvdata(dev); 699 + int nr = to_sensor_dev_attr(devattr)->index; 700 + int val = simple_strtoul(buf, NULL, 10); 701 + 702 + mutex_lock(&data->update_lock); 703 + if (val) 704 + data->temp_beep |= 1 << (nr + 1); 705 + else 706 + data->temp_beep &= ~(1 << (nr + 1)); 707 + 708 + f71882fg_write8(data, F71882FG_REG_TEMP_BEEP, data->temp_beep); 709 + mutex_unlock(&data->update_lock); 710 + 711 + return count; 712 + } 713 + 714 + static ssize_t show_temp_alarm(struct device *dev, struct device_attribute 715 + *devattr, char *buf) 716 + { 717 + struct f71882fg_data *data = f71882fg_update_device(dev); 718 + int nr = to_sensor_dev_attr(devattr)->index; 719 + 720 + if (data->temp_status & (1 << (nr + 1))) 721 + return sprintf(buf, "1\n"); 722 + else 723 + return sprintf(buf, "0\n"); 724 + } 725 + 726 + static ssize_t show_temp_fault(struct device *dev, struct device_attribute 727 + *devattr, char *buf) 728 + { 729 + struct f71882fg_data *data = f71882fg_update_device(dev); 730 + int nr = to_sensor_dev_attr(devattr)->index; 731 + 732 + if (data->temp_diode_open & (1 << (nr + 1))) 733 + return sprintf(buf, "1\n"); 734 + else 735 + return sprintf(buf, "0\n"); 736 + } 737 + 738 + static ssize_t show_name(struct device *dev, struct device_attribute *devattr, 739 + char *buf) 740 + { 741 + return sprintf(buf, DRVNAME "\n"); 742 + } 743 + 744 + 745 + static int __devinit f71882fg_probe(struct platform_device * pdev) 746 + { 747 + struct f71882fg_data *data; 748 + int err, i; 749 + u8 start_reg; 750 + 751 + if (!(data = kzalloc(sizeof(struct f71882fg_data), GFP_KERNEL))) 752 + return -ENOMEM; 753 + 754 + data->addr = platform_get_resource(pdev, IORESOURCE_IO, 0)->start; 755 + mutex_init(&data->update_lock); 756 + platform_set_drvdata(pdev, data); 757 + 758 + /* Register sysfs interface files */ 759 + for (i = 0; i < ARRAY_SIZE(f71882fg_dev_attr); i++) { 760 + err = device_create_file(&pdev->dev, &f71882fg_dev_attr[i]); 761 + if (err) 762 + goto exit_unregister_sysfs; 763 + } 764 + 765 + start_reg = f71882fg_read8(data, F71882FG_REG_START); 766 + if (start_reg & 0x01) { 767 + for (i = 0; i < ARRAY_SIZE(f71882fg_in_temp_attr); i++) { 768 + err = device_create_file(&pdev->dev, 769 + &f71882fg_in_temp_attr[i].dev_attr); 770 + if (err) 771 + goto exit_unregister_sysfs; 772 + } 773 + } 774 + 775 + if (start_reg & 0x02) { 776 + for (i = 0; i < ARRAY_SIZE(f71882fg_fan_attr); i++) { 777 + err = device_create_file(&pdev->dev, 778 + &f71882fg_fan_attr[i].dev_attr); 779 + if (err) 780 + goto exit_unregister_sysfs; 781 + } 782 + } 783 + 784 + data->hwmon_dev = hwmon_device_register(&pdev->dev); 785 + if (IS_ERR(data->hwmon_dev)) { 786 + err = PTR_ERR(data->hwmon_dev); 787 + goto exit_unregister_sysfs; 788 + } 789 + 790 + return 0; 791 + 792 + exit_unregister_sysfs: 793 + for (i = 0; i < ARRAY_SIZE(f71882fg_dev_attr); i++) 794 + device_remove_file(&pdev->dev, &f71882fg_dev_attr[i]); 795 + 796 + for (i = 0; i < ARRAY_SIZE(f71882fg_in_temp_attr); i++) 797 + device_remove_file(&pdev->dev, 798 + &f71882fg_in_temp_attr[i].dev_attr); 799 + 800 + for (i = 0; i < ARRAY_SIZE(f71882fg_fan_attr); i++) 801 + device_remove_file(&pdev->dev, &f71882fg_fan_attr[i].dev_attr); 802 + 803 + kfree(data); 804 + 805 + return err; 806 + } 807 + 808 + static int __devexit f71882fg_remove(struct platform_device *pdev) 809 + { 810 + int i; 811 + struct f71882fg_data *data = platform_get_drvdata(pdev); 812 + 813 + platform_set_drvdata(pdev, NULL); 814 + hwmon_device_unregister(data->hwmon_dev); 815 + 816 + for (i = 0; i < ARRAY_SIZE(f71882fg_dev_attr); i++) 817 + device_remove_file(&pdev->dev, &f71882fg_dev_attr[i]); 818 + 819 + for (i = 0; i < ARRAY_SIZE(f71882fg_in_temp_attr); i++) 820 + device_remove_file(&pdev->dev, 821 + &f71882fg_in_temp_attr[i].dev_attr); 822 + 823 + for (i = 0; i < ARRAY_SIZE(f71882fg_fan_attr); i++) 824 + device_remove_file(&pdev->dev, &f71882fg_fan_attr[i].dev_attr); 825 + 826 + kfree(data); 827 + 828 + return 0; 829 + } 830 + 831 + static int __init f71882fg_find(int sioaddr, unsigned short *address) 832 + { 833 + int err = -ENODEV; 834 + u16 devid; 835 + u8 start_reg; 836 + struct f71882fg_data data; 837 + 838 + superio_enter(sioaddr); 839 + 840 + devid = superio_inw(sioaddr, SIO_REG_MANID); 841 + if (devid != SIO_FINTEK_ID) { 842 + printk(KERN_INFO DRVNAME ": Not a Fintek device\n"); 843 + goto exit; 844 + } 845 + 846 + devid = superio_inw(sioaddr, SIO_REG_DEVID); 847 + if (devid != SIO_F71882_ID) { 848 + printk(KERN_INFO DRVNAME ": Unsupported Fintek device\n"); 849 + goto exit; 850 + } 851 + 852 + superio_select(sioaddr, SIO_F71882FG_LD_HWM); 853 + if (!(superio_inb(sioaddr, SIO_REG_ENABLE) & 0x01)) { 854 + printk(KERN_WARNING DRVNAME ": Device not activated\n"); 855 + goto exit; 856 + } 857 + 858 + *address = superio_inw(sioaddr, SIO_REG_ADDR); 859 + if (*address == 0) 860 + { 861 + printk(KERN_WARNING DRVNAME ": Base address not set\n"); 862 + goto exit; 863 + } 864 + *address &= ~(REGION_LENGTH - 1); /* Ignore 3 LSB */ 865 + 866 + data.addr = *address; 867 + start_reg = f71882fg_read8(&data, F71882FG_REG_START); 868 + if (!(start_reg & 0x03)) { 869 + printk(KERN_WARNING DRVNAME 870 + ": Hardware monitoring not activated\n"); 871 + goto exit; 872 + } 873 + 874 + err = 0; 875 + printk(KERN_INFO DRVNAME ": Found F71882FG chip at %#x, revision %d\n", 876 + (unsigned int)*address, 877 + (int)superio_inb(sioaddr, SIO_REG_DEVREV)); 878 + exit: 879 + superio_exit(sioaddr); 880 + return err; 881 + } 882 + 883 + static int __init f71882fg_device_add(unsigned short address) 884 + { 885 + struct resource res = { 886 + .start = address, 887 + .end = address + REGION_LENGTH - 1, 888 + .flags = IORESOURCE_IO, 889 + }; 890 + int err; 891 + 892 + f71882fg_pdev = platform_device_alloc(DRVNAME, address); 893 + if (!f71882fg_pdev) 894 + return -ENOMEM; 895 + 896 + res.name = f71882fg_pdev->name; 897 + err = platform_device_add_resources(f71882fg_pdev, &res, 1); 898 + if (err) { 899 + printk(KERN_ERR DRVNAME ": Device resource addition failed\n"); 900 + goto exit_device_put; 901 + } 902 + 903 + err = platform_device_add(f71882fg_pdev); 904 + if (err) { 905 + printk(KERN_ERR DRVNAME ": Device addition failed\n"); 906 + goto exit_device_put; 907 + } 908 + 909 + return 0; 910 + 911 + exit_device_put: 912 + platform_device_put(f71882fg_pdev); 913 + 914 + return err; 915 + } 916 + 917 + static int __init f71882fg_init(void) 918 + { 919 + int err = -ENODEV; 920 + unsigned short address; 921 + 922 + if (f71882fg_find(0x2e, &address) && f71882fg_find(0x4e, &address)) 923 + goto exit; 924 + 925 + if ((err = platform_driver_register(&f71882fg_driver))) 926 + goto exit; 927 + 928 + if ((err = f71882fg_device_add(address))) 929 + goto exit_driver; 930 + 931 + return 0; 932 + 933 + exit_driver: 934 + platform_driver_unregister(&f71882fg_driver); 935 + exit: 936 + return err; 937 + } 938 + 939 + static void __exit f71882fg_exit(void) 940 + { 941 + platform_device_unregister(f71882fg_pdev); 942 + platform_driver_unregister(&f71882fg_driver); 943 + } 944 + 945 + MODULE_DESCRIPTION("F71882FG Hardware Monitoring Driver"); 946 + MODULE_AUTHOR("Hans Edgington (hans@edgington.nl)"); 947 + MODULE_LICENSE("GPL"); 948 + 949 + module_init(f71882fg_init); 950 + module_exit(f71882fg_exit);
+691
drivers/hwmon/f75375s.c
··· 1 + /* 2 + * f75375s.c - driver for the Fintek F75375/SP and F75373 3 + * hardware monitoring features 4 + * Copyright (C) 2006-2007 Riku Voipio <riku.voipio@movial.fi> 5 + * 6 + * Datasheets available at: 7 + * 8 + * f75375: 9 + * http://www.fintek.com.tw/files/productfiles/2005111152950.pdf 10 + * 11 + * f75373: 12 + * http://www.fintek.com.tw/files/productfiles/2005111153128.pdf 13 + * 14 + * This program is free software; you can redistribute it and/or modify 15 + * it under the terms of the GNU General Public License as published by 16 + * the Free Software Foundation; either version 2 of the License, or 17 + * (at your option) any later version. 18 + * 19 + * This program is distributed in the hope that it will be useful, 20 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 21 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22 + * GNU General Public License for more details. 23 + * 24 + * You should have received a copy of the GNU General Public License 25 + * along with this program; if not, write to the Free Software 26 + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 27 + * 28 + */ 29 + 30 + #include <linux/module.h> 31 + #include <linux/jiffies.h> 32 + #include <linux/hwmon.h> 33 + #include <linux/hwmon-sysfs.h> 34 + #include <linux/i2c.h> 35 + #include <linux/err.h> 36 + #include <linux/mutex.h> 37 + 38 + /* Addresses to scan */ 39 + static unsigned short normal_i2c[] = { 0x2d, 0x2e, I2C_CLIENT_END }; 40 + 41 + /* Insmod parameters */ 42 + I2C_CLIENT_INSMOD_2(f75373, f75375); 43 + 44 + /* Fintek F75375 registers */ 45 + #define F75375_REG_CONFIG0 0x0 46 + #define F75375_REG_CONFIG1 0x1 47 + #define F75375_REG_CONFIG2 0x2 48 + #define F75375_REG_CONFIG3 0x3 49 + #define F75375_REG_ADDR 0x4 50 + #define F75375_REG_INTR 0x31 51 + #define F75375_CHIP_ID 0x5A 52 + #define F75375_REG_VERSION 0x5C 53 + #define F75375_REG_VENDOR 0x5D 54 + #define F75375_REG_FAN_TIMER 0x60 55 + 56 + #define F75375_REG_VOLT(nr) (0x10 + (nr)) 57 + #define F75375_REG_VOLT_HIGH(nr) (0x20 + (nr) * 2) 58 + #define F75375_REG_VOLT_LOW(nr) (0x21 + (nr) * 2) 59 + 60 + #define F75375_REG_TEMP(nr) (0x14 + (nr)) 61 + #define F75375_REG_TEMP_HIGH(nr) (0x28 + (nr) * 2) 62 + #define F75375_REG_TEMP_HYST(nr) (0x29 + (nr) * 2) 63 + 64 + #define F75375_REG_FAN(nr) (0x16 + (nr) * 2) 65 + #define F75375_REG_FAN_MIN(nr) (0x2C + (nr) * 2) 66 + #define F75375_REG_FAN_FULL(nr) (0x70 + (nr) * 0x10) 67 + #define F75375_REG_FAN_PWM_DUTY(nr) (0x76 + (nr) * 0x10) 68 + #define F75375_REG_FAN_PWM_CLOCK(nr) (0x7D + (nr) * 0x10) 69 + 70 + #define F75375_REG_FAN_EXP(nr) (0x74 + (nr) * 0x10) 71 + #define F75375_REG_FAN_B_TEMP(nr, step) ((0xA0 + (nr) * 0x10) + (step)) 72 + #define F75375_REG_FAN_B_SPEED(nr, step) \ 73 + ((0xA5 + (nr) * 0x10) + (step) * 2) 74 + 75 + #define F75375_REG_PWM1_RAISE_DUTY 0x69 76 + #define F75375_REG_PWM2_RAISE_DUTY 0x6A 77 + #define F75375_REG_PWM1_DROP_DUTY 0x6B 78 + #define F75375_REG_PWM2_DROP_DUTY 0x6C 79 + 80 + #define FAN_CTRL_LINEAR(nr) (4 + nr) 81 + #define FAN_CTRL_MODE(nr) (5 + ((nr) * 2)) 82 + 83 + /* 84 + * Data structures and manipulation thereof 85 + */ 86 + 87 + struct f75375_data { 88 + unsigned short addr; 89 + struct i2c_client client; 90 + struct device *hwmon_dev; 91 + 92 + const char *name; 93 + int kind; 94 + struct mutex update_lock; /* protect register access */ 95 + char valid; 96 + unsigned long last_updated; /* In jiffies */ 97 + unsigned long last_limits; /* In jiffies */ 98 + 99 + /* Register values */ 100 + u8 in[4]; 101 + u8 in_max[4]; 102 + u8 in_min[4]; 103 + u16 fan[2]; 104 + u16 fan_min[2]; 105 + u16 fan_full[2]; 106 + u16 fan_exp[2]; 107 + u8 fan_timer; 108 + u8 pwm[2]; 109 + u8 pwm_mode[2]; 110 + u8 pwm_enable[2]; 111 + s8 temp[2]; 112 + s8 temp_high[2]; 113 + s8 temp_max_hyst[2]; 114 + }; 115 + 116 + static int f75375_attach_adapter(struct i2c_adapter *adapter); 117 + static int f75375_detect(struct i2c_adapter *adapter, int address, int kind); 118 + static int f75375_detach_client(struct i2c_client *client); 119 + 120 + static struct i2c_driver f75375_driver = { 121 + .driver = { 122 + .name = "f75375", 123 + }, 124 + .attach_adapter = f75375_attach_adapter, 125 + .detach_client = f75375_detach_client, 126 + }; 127 + 128 + static inline int f75375_read8(struct i2c_client *client, u8 reg) 129 + { 130 + return i2c_smbus_read_byte_data(client, reg); 131 + } 132 + 133 + /* in most cases, should be called while holding update_lock */ 134 + static inline u16 f75375_read16(struct i2c_client *client, u8 reg) 135 + { 136 + return ((i2c_smbus_read_byte_data(client, reg) << 8) 137 + | i2c_smbus_read_byte_data(client, reg + 1)); 138 + } 139 + 140 + static inline void f75375_write8(struct i2c_client *client, u8 reg, 141 + u8 value) 142 + { 143 + i2c_smbus_write_byte_data(client, reg, value); 144 + } 145 + 146 + static inline void f75375_write16(struct i2c_client *client, u8 reg, 147 + u16 value) 148 + { 149 + int err = i2c_smbus_write_byte_data(client, reg, (value << 8)); 150 + if (err) 151 + return; 152 + i2c_smbus_write_byte_data(client, reg + 1, (value & 0xFF)); 153 + } 154 + 155 + static struct f75375_data *f75375_update_device(struct device *dev) 156 + { 157 + struct i2c_client *client = to_i2c_client(dev); 158 + struct f75375_data *data = i2c_get_clientdata(client); 159 + int nr; 160 + 161 + mutex_lock(&data->update_lock); 162 + 163 + /* Limit registers cache is refreshed after 60 seconds */ 164 + if (time_after(jiffies, data->last_limits + 60 * HZ) 165 + || !data->valid) { 166 + for (nr = 0; nr < 2; nr++) { 167 + data->temp_high[nr] = 168 + f75375_read8(client, F75375_REG_TEMP_HIGH(nr)); 169 + data->temp_max_hyst[nr] = 170 + f75375_read8(client, F75375_REG_TEMP_HYST(nr)); 171 + data->fan_full[nr] = 172 + f75375_read16(client, F75375_REG_FAN_FULL(nr)); 173 + data->fan_min[nr] = 174 + f75375_read16(client, F75375_REG_FAN_MIN(nr)); 175 + data->fan_exp[nr] = 176 + f75375_read16(client, F75375_REG_FAN_EXP(nr)); 177 + data->pwm[nr] = f75375_read8(client, 178 + F75375_REG_FAN_PWM_DUTY(nr)); 179 + 180 + } 181 + for (nr = 0; nr < 4; nr++) { 182 + data->in_max[nr] = 183 + f75375_read8(client, F75375_REG_VOLT_HIGH(nr)); 184 + data->in_min[nr] = 185 + f75375_read8(client, F75375_REG_VOLT_LOW(nr)); 186 + } 187 + data->fan_timer = f75375_read8(client, F75375_REG_FAN_TIMER); 188 + data->last_limits = jiffies; 189 + } 190 + 191 + /* Measurement registers cache is refreshed after 2 second */ 192 + if (time_after(jiffies, data->last_updated + 2 * HZ) 193 + || !data->valid) { 194 + for (nr = 0; nr < 2; nr++) { 195 + data->temp[nr] = 196 + f75375_read8(client, F75375_REG_TEMP(nr)); 197 + data->fan[nr] = 198 + f75375_read16(client, F75375_REG_FAN(nr)); 199 + } 200 + for (nr = 0; nr < 4; nr++) 201 + data->in[nr] = 202 + f75375_read8(client, F75375_REG_VOLT(nr)); 203 + 204 + data->last_updated = jiffies; 205 + data->valid = 1; 206 + } 207 + 208 + mutex_unlock(&data->update_lock); 209 + return data; 210 + } 211 + 212 + static inline u16 rpm_from_reg(u16 reg) 213 + { 214 + if (reg == 0 || reg == 0xffff) 215 + return 0; 216 + return (1500000 / reg); 217 + } 218 + 219 + static inline u16 rpm_to_reg(int rpm) 220 + { 221 + if (rpm < 367 || rpm > 0xffff) 222 + return 0xffff; 223 + return (1500000 / rpm); 224 + } 225 + 226 + static ssize_t set_fan_min(struct device *dev, struct device_attribute *attr, 227 + const char *buf, size_t count) 228 + { 229 + int nr = to_sensor_dev_attr(attr)->index; 230 + struct i2c_client *client = to_i2c_client(dev); 231 + struct f75375_data *data = i2c_get_clientdata(client); 232 + int val = simple_strtoul(buf, NULL, 10); 233 + 234 + mutex_lock(&data->update_lock); 235 + data->fan_min[nr] = rpm_to_reg(val); 236 + f75375_write16(client, F75375_REG_FAN_MIN(nr), data->fan_min[nr]); 237 + mutex_unlock(&data->update_lock); 238 + return count; 239 + } 240 + 241 + static ssize_t set_fan_exp(struct device *dev, struct device_attribute *attr, 242 + const char *buf, size_t count) 243 + { 244 + int nr = to_sensor_dev_attr(attr)->index; 245 + struct i2c_client *client = to_i2c_client(dev); 246 + struct f75375_data *data = i2c_get_clientdata(client); 247 + int val = simple_strtoul(buf, NULL, 10); 248 + 249 + mutex_lock(&data->update_lock); 250 + data->fan_exp[nr] = rpm_to_reg(val); 251 + f75375_write16(client, F75375_REG_FAN_EXP(nr), data->fan_exp[nr]); 252 + mutex_unlock(&data->update_lock); 253 + return count; 254 + } 255 + 256 + static ssize_t set_pwm(struct device *dev, struct device_attribute *attr, 257 + const char *buf, size_t count) 258 + { 259 + int nr = to_sensor_dev_attr(attr)->index; 260 + struct i2c_client *client = to_i2c_client(dev); 261 + struct f75375_data *data = i2c_get_clientdata(client); 262 + int val = simple_strtoul(buf, NULL, 10); 263 + 264 + mutex_lock(&data->update_lock); 265 + data->pwm[nr] = SENSORS_LIMIT(val, 0, 255); 266 + f75375_write8(client, F75375_REG_FAN_PWM_DUTY(nr), data->pwm[nr]); 267 + mutex_unlock(&data->update_lock); 268 + return count; 269 + } 270 + 271 + static ssize_t show_pwm_enable(struct device *dev, struct device_attribute 272 + *attr, char *buf) 273 + { 274 + int nr = to_sensor_dev_attr(attr)->index; 275 + struct f75375_data *data = f75375_update_device(dev); 276 + return sprintf(buf, "%d\n", data->pwm_enable[nr]); 277 + } 278 + 279 + static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr, 280 + const char *buf, size_t count) 281 + { 282 + int nr = to_sensor_dev_attr(attr)->index; 283 + struct i2c_client *client = to_i2c_client(dev); 284 + struct f75375_data *data = i2c_get_clientdata(client); 285 + int val = simple_strtoul(buf, NULL, 10); 286 + u8 fanmode; 287 + 288 + if (val < 0 || val > 4) 289 + return -EINVAL; 290 + 291 + mutex_lock(&data->update_lock); 292 + fanmode = f75375_read8(client, F75375_REG_FAN_TIMER); 293 + fanmode = ~(3 << FAN_CTRL_MODE(nr)); 294 + 295 + switch (val) { 296 + case 0: /* Full speed */ 297 + fanmode |= (3 << FAN_CTRL_MODE(nr)); 298 + data->pwm[nr] = 255; 299 + f75375_write8(client, F75375_REG_FAN_PWM_DUTY(nr), 300 + data->pwm[nr]); 301 + break; 302 + case 1: /* PWM */ 303 + fanmode |= (3 << FAN_CTRL_MODE(nr)); 304 + break; 305 + case 2: /* AUTOMATIC*/ 306 + fanmode |= (2 << FAN_CTRL_MODE(nr)); 307 + break; 308 + case 3: /* fan speed */ 309 + break; 310 + } 311 + f75375_write8(client, F75375_REG_FAN_TIMER, fanmode); 312 + data->pwm_enable[nr] = val; 313 + mutex_unlock(&data->update_lock); 314 + return count; 315 + } 316 + 317 + static ssize_t set_pwm_mode(struct device *dev, struct device_attribute *attr, 318 + const char *buf, size_t count) 319 + { 320 + int nr = to_sensor_dev_attr(attr)->index; 321 + struct i2c_client *client = to_i2c_client(dev); 322 + struct f75375_data *data = i2c_get_clientdata(client); 323 + int val = simple_strtoul(buf, NULL, 10); 324 + u8 conf = 0; 325 + 326 + if (val != 0 || val != 1 || data->kind == f75373) 327 + return -EINVAL; 328 + 329 + mutex_lock(&data->update_lock); 330 + conf = f75375_read8(client, F75375_REG_CONFIG1); 331 + conf = ~(1 << FAN_CTRL_LINEAR(nr)); 332 + 333 + if (val == 0) 334 + conf |= (1 << FAN_CTRL_LINEAR(nr)) ; 335 + 336 + f75375_write8(client, F75375_REG_CONFIG1, conf); 337 + data->pwm_mode[nr] = val; 338 + mutex_unlock(&data->update_lock); 339 + return count; 340 + } 341 + 342 + static ssize_t show_pwm(struct device *dev, struct device_attribute 343 + *attr, char *buf) 344 + { 345 + int nr = to_sensor_dev_attr(attr)->index; 346 + struct f75375_data *data = f75375_update_device(dev); 347 + return sprintf(buf, "%d\n", data->pwm[nr]); 348 + } 349 + 350 + static ssize_t show_pwm_mode(struct device *dev, struct device_attribute 351 + *attr, char *buf) 352 + { 353 + int nr = to_sensor_dev_attr(attr)->index; 354 + struct f75375_data *data = f75375_update_device(dev); 355 + return sprintf(buf, "%d\n", data->pwm_mode[nr]); 356 + } 357 + 358 + #define VOLT_FROM_REG(val) ((val) * 8) 359 + #define VOLT_TO_REG(val) ((val) / 8) 360 + 361 + static ssize_t show_in(struct device *dev, struct device_attribute *attr, 362 + char *buf) 363 + { 364 + int nr = to_sensor_dev_attr(attr)->index; 365 + struct f75375_data *data = f75375_update_device(dev); 366 + return sprintf(buf, "%d\n", VOLT_FROM_REG(data->in[nr])); 367 + } 368 + 369 + static ssize_t show_in_max(struct device *dev, struct device_attribute *attr, 370 + char *buf) 371 + { 372 + int nr = to_sensor_dev_attr(attr)->index; 373 + struct f75375_data *data = f75375_update_device(dev); 374 + return sprintf(buf, "%d\n", VOLT_FROM_REG(data->in_max[nr])); 375 + } 376 + 377 + static ssize_t show_in_min(struct device *dev, struct device_attribute *attr, 378 + char *buf) 379 + { 380 + int nr = to_sensor_dev_attr(attr)->index; 381 + struct f75375_data *data = f75375_update_device(dev); 382 + return sprintf(buf, "%d\n", VOLT_FROM_REG(data->in_min[nr])); 383 + } 384 + 385 + static ssize_t set_in_max(struct device *dev, struct device_attribute *attr, 386 + const char *buf, size_t count) 387 + { 388 + int nr = to_sensor_dev_attr(attr)->index; 389 + struct i2c_client *client = to_i2c_client(dev); 390 + struct f75375_data *data = i2c_get_clientdata(client); 391 + int val = simple_strtoul(buf, NULL, 10); 392 + val = SENSORS_LIMIT(VOLT_TO_REG(val), 0, 0xff); 393 + mutex_lock(&data->update_lock); 394 + data->in_max[nr] = val; 395 + f75375_write8(client, F75375_REG_VOLT_HIGH(nr), data->in_max[nr]); 396 + mutex_unlock(&data->update_lock); 397 + return count; 398 + } 399 + 400 + static ssize_t set_in_min(struct device *dev, struct device_attribute *attr, 401 + const char *buf, size_t count) 402 + { 403 + int nr = to_sensor_dev_attr(attr)->index; 404 + struct i2c_client *client = to_i2c_client(dev); 405 + struct f75375_data *data = i2c_get_clientdata(client); 406 + int val = simple_strtoul(buf, NULL, 10); 407 + val = SENSORS_LIMIT(VOLT_TO_REG(val), 0, 0xff); 408 + mutex_lock(&data->update_lock); 409 + data->in_min[nr] = val; 410 + f75375_write8(client, F75375_REG_VOLT_LOW(nr), data->in_min[nr]); 411 + mutex_unlock(&data->update_lock); 412 + return count; 413 + } 414 + #define TEMP_FROM_REG(val) ((val) * 1000) 415 + #define TEMP_TO_REG(val) ((val) / 1000) 416 + 417 + static ssize_t show_temp(struct device *dev, struct device_attribute *attr, 418 + char *buf) 419 + { 420 + int nr = to_sensor_dev_attr(attr)->index; 421 + struct f75375_data *data = f75375_update_device(dev); 422 + return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[nr])); 423 + } 424 + 425 + static ssize_t show_temp_max(struct device *dev, struct device_attribute *attr, 426 + char *buf) 427 + { 428 + int nr = to_sensor_dev_attr(attr)->index; 429 + struct f75375_data *data = f75375_update_device(dev); 430 + return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_high[nr])); 431 + } 432 + 433 + static ssize_t show_temp_max_hyst(struct device *dev, 434 + struct device_attribute *attr, char *buf) 435 + { 436 + int nr = to_sensor_dev_attr(attr)->index; 437 + struct f75375_data *data = f75375_update_device(dev); 438 + return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max_hyst[nr])); 439 + } 440 + 441 + static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr, 442 + const char *buf, size_t count) 443 + { 444 + int nr = to_sensor_dev_attr(attr)->index; 445 + struct i2c_client *client = to_i2c_client(dev); 446 + struct f75375_data *data = i2c_get_clientdata(client); 447 + int val = simple_strtol(buf, NULL, 10); 448 + val = SENSORS_LIMIT(TEMP_TO_REG(val), 0, 127); 449 + mutex_lock(&data->update_lock); 450 + data->temp_high[nr] = val; 451 + f75375_write8(client, F75375_REG_TEMP_HIGH(nr), data->temp_high[nr]); 452 + mutex_unlock(&data->update_lock); 453 + return count; 454 + } 455 + 456 + static ssize_t set_temp_max_hyst(struct device *dev, 457 + struct device_attribute *attr, const char *buf, size_t count) 458 + { 459 + int nr = to_sensor_dev_attr(attr)->index; 460 + struct i2c_client *client = to_i2c_client(dev); 461 + struct f75375_data *data = i2c_get_clientdata(client); 462 + int val = simple_strtol(buf, NULL, 10); 463 + val = SENSORS_LIMIT(TEMP_TO_REG(val), 0, 127); 464 + mutex_lock(&data->update_lock); 465 + data->temp_max_hyst[nr] = val; 466 + f75375_write8(client, F75375_REG_TEMP_HYST(nr), 467 + data->temp_max_hyst[nr]); 468 + mutex_unlock(&data->update_lock); 469 + return count; 470 + } 471 + 472 + #define show_fan(thing) \ 473 + static ssize_t show_##thing(struct device *dev, struct device_attribute *attr, \ 474 + char *buf)\ 475 + {\ 476 + int nr = to_sensor_dev_attr(attr)->index;\ 477 + struct f75375_data *data = f75375_update_device(dev); \ 478 + return sprintf(buf, "%d\n", rpm_from_reg(data->thing[nr])); \ 479 + } 480 + 481 + show_fan(fan); 482 + show_fan(fan_min); 483 + show_fan(fan_full); 484 + show_fan(fan_exp); 485 + 486 + static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_in, NULL, 0); 487 + static SENSOR_DEVICE_ATTR(in0_max, S_IRUGO|S_IWUSR, 488 + show_in_max, set_in_max, 0); 489 + static SENSOR_DEVICE_ATTR(in0_min, S_IRUGO|S_IWUSR, 490 + show_in_min, set_in_min, 0); 491 + static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_in, NULL, 1); 492 + static SENSOR_DEVICE_ATTR(in1_max, S_IRUGO|S_IWUSR, 493 + show_in_max, set_in_max, 1); 494 + static SENSOR_DEVICE_ATTR(in1_min, S_IRUGO|S_IWUSR, 495 + show_in_min, set_in_min, 1); 496 + static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_in, NULL, 2); 497 + static SENSOR_DEVICE_ATTR(in2_max, S_IRUGO|S_IWUSR, 498 + show_in_max, set_in_max, 2); 499 + static SENSOR_DEVICE_ATTR(in2_min, S_IRUGO|S_IWUSR, 500 + show_in_min, set_in_min, 2); 501 + static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, show_in, NULL, 3); 502 + static SENSOR_DEVICE_ATTR(in3_max, S_IRUGO|S_IWUSR, 503 + show_in_max, set_in_max, 3); 504 + static SENSOR_DEVICE_ATTR(in3_min, S_IRUGO|S_IWUSR, 505 + show_in_min, set_in_min, 3); 506 + static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0); 507 + static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO|S_IWUSR, 508 + show_temp_max_hyst, set_temp_max_hyst, 0); 509 + static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO|S_IWUSR, 510 + show_temp_max, set_temp_max, 0); 511 + static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1); 512 + static SENSOR_DEVICE_ATTR(temp2_max_hyst, S_IRUGO|S_IWUSR, 513 + show_temp_max_hyst, set_temp_max_hyst, 1); 514 + static SENSOR_DEVICE_ATTR(temp2_max, S_IRUGO|S_IWUSR, 515 + show_temp_max, set_temp_max, 1); 516 + static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0); 517 + static SENSOR_DEVICE_ATTR(fan1_full, S_IRUGO, show_fan_full, NULL, 0); 518 + static SENSOR_DEVICE_ATTR(fan1_min, S_IRUGO|S_IWUSR, 519 + show_fan_min, set_fan_min, 0); 520 + static SENSOR_DEVICE_ATTR(fan1_exp, S_IRUGO|S_IWUSR, 521 + show_fan_exp, set_fan_exp, 0); 522 + static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1); 523 + static SENSOR_DEVICE_ATTR(fan2_full, S_IRUGO, show_fan_full, NULL, 1); 524 + static SENSOR_DEVICE_ATTR(fan2_min, S_IRUGO|S_IWUSR, 525 + show_fan_min, set_fan_min, 1); 526 + static SENSOR_DEVICE_ATTR(fan2_exp, S_IRUGO|S_IWUSR, 527 + show_fan_exp, set_fan_exp, 1); 528 + static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO|S_IWUSR, 529 + show_pwm, set_pwm, 0); 530 + static SENSOR_DEVICE_ATTR(pwm1_enable, S_IRUGO|S_IWUSR, 531 + show_pwm_enable, set_pwm_enable, 0); 532 + static SENSOR_DEVICE_ATTR(pwm1_mode, S_IRUGO|S_IWUSR, 533 + show_pwm_mode, set_pwm_mode, 0); 534 + static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, 535 + show_pwm, set_pwm, 1); 536 + static SENSOR_DEVICE_ATTR(pwm2_enable, S_IRUGO|S_IWUSR, 537 + show_pwm_enable, set_pwm_enable, 1); 538 + static SENSOR_DEVICE_ATTR(pwm2_mode, S_IRUGO|S_IWUSR, 539 + show_pwm_mode, set_pwm_mode, 1); 540 + 541 + static struct attribute *f75375_attributes[] = { 542 + &sensor_dev_attr_temp1_input.dev_attr.attr, 543 + &sensor_dev_attr_temp1_max.dev_attr.attr, 544 + &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, 545 + &sensor_dev_attr_temp2_input.dev_attr.attr, 546 + &sensor_dev_attr_temp2_max.dev_attr.attr, 547 + &sensor_dev_attr_temp2_max_hyst.dev_attr.attr, 548 + &sensor_dev_attr_fan1_input.dev_attr.attr, 549 + &sensor_dev_attr_fan1_full.dev_attr.attr, 550 + &sensor_dev_attr_fan1_min.dev_attr.attr, 551 + &sensor_dev_attr_fan1_exp.dev_attr.attr, 552 + &sensor_dev_attr_fan2_input.dev_attr.attr, 553 + &sensor_dev_attr_fan2_full.dev_attr.attr, 554 + &sensor_dev_attr_fan2_min.dev_attr.attr, 555 + &sensor_dev_attr_fan2_exp.dev_attr.attr, 556 + &sensor_dev_attr_pwm1.dev_attr.attr, 557 + &sensor_dev_attr_pwm1_enable.dev_attr.attr, 558 + &sensor_dev_attr_pwm1_mode.dev_attr.attr, 559 + &sensor_dev_attr_pwm2.dev_attr.attr, 560 + &sensor_dev_attr_pwm2_enable.dev_attr.attr, 561 + &sensor_dev_attr_pwm2_mode.dev_attr.attr, 562 + &sensor_dev_attr_in0_input.dev_attr.attr, 563 + &sensor_dev_attr_in0_max.dev_attr.attr, 564 + &sensor_dev_attr_in0_min.dev_attr.attr, 565 + &sensor_dev_attr_in1_input.dev_attr.attr, 566 + &sensor_dev_attr_in1_max.dev_attr.attr, 567 + &sensor_dev_attr_in1_min.dev_attr.attr, 568 + &sensor_dev_attr_in2_input.dev_attr.attr, 569 + &sensor_dev_attr_in2_max.dev_attr.attr, 570 + &sensor_dev_attr_in2_min.dev_attr.attr, 571 + &sensor_dev_attr_in3_input.dev_attr.attr, 572 + &sensor_dev_attr_in3_max.dev_attr.attr, 573 + &sensor_dev_attr_in3_min.dev_attr.attr, 574 + NULL 575 + }; 576 + 577 + static const struct attribute_group f75375_group = { 578 + .attrs = f75375_attributes, 579 + }; 580 + 581 + static int f75375_detach_client(struct i2c_client *client) 582 + { 583 + struct f75375_data *data = i2c_get_clientdata(client); 584 + int err; 585 + 586 + hwmon_device_unregister(data->hwmon_dev); 587 + sysfs_remove_group(&client->dev.kobj, &f75375_group); 588 + 589 + err = i2c_detach_client(client); 590 + if (err) { 591 + dev_err(&client->dev, 592 + "Client deregistration failed, " 593 + "client not detached.\n"); 594 + return err; 595 + } 596 + kfree(data); 597 + return 0; 598 + } 599 + 600 + static int f75375_attach_adapter(struct i2c_adapter *adapter) 601 + { 602 + if (!(adapter->class & I2C_CLASS_HWMON)) 603 + return 0; 604 + return i2c_probe(adapter, &addr_data, f75375_detect); 605 + } 606 + 607 + /* This function is called by i2c_probe */ 608 + static int f75375_detect(struct i2c_adapter *adapter, int address, int kind) 609 + { 610 + struct i2c_client *client; 611 + struct f75375_data *data; 612 + u8 version = 0; 613 + int err = 0; 614 + const char *name = ""; 615 + 616 + if (!(data = kzalloc(sizeof(struct f75375_data), GFP_KERNEL))) { 617 + err = -ENOMEM; 618 + goto exit; 619 + } 620 + client = &data->client; 621 + i2c_set_clientdata(client, data); 622 + client->addr = address; 623 + client->adapter = adapter; 624 + client->driver = &f75375_driver; 625 + 626 + if (kind < 0) { 627 + u16 vendid = f75375_read16(client, F75375_REG_VENDOR); 628 + u16 chipid = f75375_read16(client, F75375_CHIP_ID); 629 + version = f75375_read8(client, F75375_REG_VERSION); 630 + if (chipid == 0x0306 && vendid == 0x1934) { 631 + kind = f75375; 632 + } else if (chipid == 0x0204 && vendid == 0x1934) { 633 + kind = f75373; 634 + } else { 635 + dev_err(&adapter->dev, 636 + "failed,%02X,%02X,%02X\n", 637 + chipid, version, vendid); 638 + goto exit_free; 639 + } 640 + } 641 + 642 + if (kind == f75375) { 643 + name = "f75375"; 644 + } else if (kind == f75373) { 645 + name = "f75373"; 646 + } 647 + 648 + dev_info(&adapter->dev, "found %s version: %02X\n", name, version); 649 + strlcpy(client->name, name, I2C_NAME_SIZE); 650 + data->kind = kind; 651 + mutex_init(&data->update_lock); 652 + if ((err = i2c_attach_client(client))) 653 + goto exit_free; 654 + 655 + if ((err = sysfs_create_group(&client->dev.kobj, &f75375_group))) 656 + goto exit_detach; 657 + 658 + data->hwmon_dev = hwmon_device_register(&client->dev); 659 + if (IS_ERR(data->hwmon_dev)) { 660 + err = PTR_ERR(data->hwmon_dev); 661 + goto exit_remove; 662 + } 663 + 664 + return 0; 665 + 666 + exit_remove: 667 + sysfs_remove_group(&client->dev.kobj, &f75375_group); 668 + exit_detach: 669 + i2c_detach_client(client); 670 + exit_free: 671 + kfree(data); 672 + exit: 673 + return err; 674 + } 675 + 676 + static int __init sensors_f75375_init(void) 677 + { 678 + return i2c_add_driver(&f75375_driver); 679 + } 680 + 681 + static void __exit sensors_f75375_exit(void) 682 + { 683 + i2c_del_driver(&f75375_driver); 684 + } 685 + 686 + MODULE_AUTHOR("Riku Voipio <riku.voipio@movial.fi>"); 687 + MODULE_LICENSE("GPL"); 688 + MODULE_DESCRIPTION("F75373/F75375 hardware monitoring driver"); 689 + 690 + module_init(sensors_f75375_init); 691 + module_exit(sensors_f75375_exit);
+5 -5
drivers/hwmon/fscher.c
··· 134 134 135 135 struct fscher_data { 136 136 struct i2c_client client; 137 - struct class_device *class_dev; 137 + struct device *hwmon_dev; 138 138 struct mutex update_lock; 139 139 char valid; /* zero until following fields are valid */ 140 140 unsigned long last_updated; /* in jiffies */ ··· 344 344 if ((err = sysfs_create_group(&new_client->dev.kobj, &fscher_group))) 345 345 goto exit_detach; 346 346 347 - data->class_dev = hwmon_device_register(&new_client->dev); 348 - if (IS_ERR(data->class_dev)) { 349 - err = PTR_ERR(data->class_dev); 347 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 348 + if (IS_ERR(data->hwmon_dev)) { 349 + err = PTR_ERR(data->hwmon_dev); 350 350 goto exit_remove_files; 351 351 } 352 352 ··· 367 367 struct fscher_data *data = i2c_get_clientdata(client); 368 368 int err; 369 369 370 - hwmon_device_unregister(data->class_dev); 370 + hwmon_device_unregister(data->hwmon_dev); 371 371 sysfs_remove_group(&client->dev.kobj, &fscher_group); 372 372 373 373 if ((err = i2c_detach_client(client)))
+778
drivers/hwmon/fschmd.c
··· 1 + /* fschmd.c 2 + * 3 + * Copyright (C) 2007 Hans de Goede <j.w.r.degoede@hhs.nl> 4 + * 5 + * This program is free software; you can redistribute it and/or modify 6 + * it under the terms of the GNU General Public License as published by 7 + * the Free Software Foundation; either version 2 of the License, or 8 + * (at your option) any later version. 9 + * 10 + * This program is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + * 15 + * You should have received a copy of the GNU General Public License 16 + * along with this program; if not, write to the Free Software 17 + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 18 + */ 19 + 20 + /* 21 + * Merged Fujitsu Siemens hwmon driver, supporting the Poseidon, Hermes, 22 + * Scylla, Heracles and Heimdall chips 23 + * 24 + * Based on the original 2.4 fscscy, 2.6 fscpos, 2.6 fscher and 2.6 25 + * (candidate) fschmd drivers: 26 + * Copyright (C) 2006 Thilo Cestonaro 27 + * <thilo.cestonaro.external@fujitsu-siemens.com> 28 + * Copyright (C) 2004, 2005 Stefan Ott <stefan@desire.ch> 29 + * Copyright (C) 2003, 2004 Reinhard Nissl <rnissl@gmx.de> 30 + * Copyright (c) 2001 Martin Knoblauch <mkn@teraport.de, knobi@knobisoft.de> 31 + * Copyright (C) 2000 Hermann Jung <hej@odn.de> 32 + */ 33 + 34 + #include <linux/module.h> 35 + #include <linux/init.h> 36 + #include <linux/slab.h> 37 + #include <linux/jiffies.h> 38 + #include <linux/i2c.h> 39 + #include <linux/hwmon.h> 40 + #include <linux/hwmon-sysfs.h> 41 + #include <linux/err.h> 42 + #include <linux/mutex.h> 43 + #include <linux/sysfs.h> 44 + 45 + /* Addresses to scan */ 46 + static unsigned short normal_i2c[] = { 0x73, I2C_CLIENT_END }; 47 + 48 + /* Insmod parameters */ 49 + I2C_CLIENT_INSMOD_5(fscpos, fscher, fscscy, fschrc, fschmd); 50 + 51 + /* 52 + * The FSCHMD registers and other defines 53 + */ 54 + 55 + /* chip identification */ 56 + #define FSCHMD_REG_IDENT_0 0x00 57 + #define FSCHMD_REG_IDENT_1 0x01 58 + #define FSCHMD_REG_IDENT_2 0x02 59 + #define FSCHMD_REG_REVISION 0x03 60 + 61 + /* global control and status */ 62 + #define FSCHMD_REG_EVENT_STATE 0x04 63 + #define FSCHMD_REG_CONTROL 0x05 64 + 65 + #define FSCHMD_CONTROL_ALERT_LED_MASK 0x01 66 + 67 + /* watchdog (support to be implemented) */ 68 + #define FSCHMD_REG_WDOG_PRESET 0x28 69 + #define FSCHMD_REG_WDOG_STATE 0x23 70 + #define FSCHMD_REG_WDOG_CONTROL 0x21 71 + 72 + /* voltages, weird order is to keep the same order as the old drivers */ 73 + static const u8 FSCHMD_REG_VOLT[3] = { 0x45, 0x42, 0x48 }; 74 + 75 + /* minimum pwm at which the fan is driven (pwm can by increased depending on 76 + the temp. Notice that for the scy some fans share there minimum speed. 77 + Also notice that with the scy the sensor order is different then with the 78 + other chips, this order was in the 2.4 driver and kept for consistency. */ 79 + static const u8 FSCHMD_REG_FAN_MIN[5][6] = { 80 + { 0x55, 0x65 }, /* pos */ 81 + { 0x55, 0x65, 0xb5 }, /* her */ 82 + { 0x65, 0x65, 0x55, 0xa5, 0x55, 0xa5 }, /* scy */ 83 + { 0x55, 0x65, 0xa5, 0xb5 }, /* hrc */ 84 + { 0x55, 0x65, 0xa5, 0xb5, 0xc5 }, /* hmd */ 85 + }; 86 + 87 + /* actual fan speed */ 88 + static const u8 FSCHMD_REG_FAN_ACT[5][6] = { 89 + { 0x0e, 0x6b, 0xab }, /* pos */ 90 + { 0x0e, 0x6b, 0xbb }, /* her */ 91 + { 0x6b, 0x6c, 0x0e, 0xab, 0x5c, 0xbb }, /* scy */ 92 + { 0x0e, 0x6b, 0xab, 0xbb }, /* hrc */ 93 + { 0x5b, 0x6b, 0xab, 0xbb, 0xcb }, /* hmd */ 94 + }; 95 + 96 + /* fan status registers */ 97 + static const u8 FSCHMD_REG_FAN_STATE[5][6] = { 98 + { 0x0d, 0x62, 0xa2 }, /* pos */ 99 + { 0x0d, 0x62, 0xb2 }, /* her */ 100 + { 0x62, 0x61, 0x0d, 0xa2, 0x52, 0xb2 }, /* scy */ 101 + { 0x0d, 0x62, 0xa2, 0xb2 }, /* hrc */ 102 + { 0x52, 0x62, 0xa2, 0xb2, 0xc2 }, /* hmd */ 103 + }; 104 + 105 + /* fan ripple / divider registers */ 106 + static const u8 FSCHMD_REG_FAN_RIPPLE[5][6] = { 107 + { 0x0f, 0x6f, 0xaf }, /* pos */ 108 + { 0x0f, 0x6f, 0xbf }, /* her */ 109 + { 0x6f, 0x6f, 0x0f, 0xaf, 0x0f, 0xbf }, /* scy */ 110 + { 0x0f, 0x6f, 0xaf, 0xbf }, /* hrc */ 111 + { 0x5f, 0x6f, 0xaf, 0xbf, 0xcf }, /* hmd */ 112 + }; 113 + 114 + static const int FSCHMD_NO_FAN_SENSORS[5] = { 3, 3, 6, 4, 5 }; 115 + 116 + /* Fan status register bitmasks */ 117 + #define FSCHMD_FAN_ALARM_MASK 0x04 /* called fault by FSC! */ 118 + #define FSCHMD_FAN_NOT_PRESENT_MASK 0x08 /* not documented */ 119 + 120 + 121 + /* actual temperature registers */ 122 + static const u8 FSCHMD_REG_TEMP_ACT[5][5] = { 123 + { 0x64, 0x32, 0x35 }, /* pos */ 124 + { 0x64, 0x32, 0x35 }, /* her */ 125 + { 0x64, 0xD0, 0x32, 0x35 }, /* scy */ 126 + { 0x64, 0x32, 0x35 }, /* hrc */ 127 + { 0x70, 0x80, 0x90, 0xd0, 0xe0 }, /* hmd */ 128 + }; 129 + 130 + /* temperature state registers */ 131 + static const u8 FSCHMD_REG_TEMP_STATE[5][5] = { 132 + { 0x71, 0x81, 0x91 }, /* pos */ 133 + { 0x71, 0x81, 0x91 }, /* her */ 134 + { 0x71, 0xd1, 0x81, 0x91 }, /* scy */ 135 + { 0x71, 0x81, 0x91 }, /* hrc */ 136 + { 0x71, 0x81, 0x91, 0xd1, 0xe1 }, /* hmd */ 137 + }; 138 + 139 + /* temperature high limit registers, FSC does not document these. Proven to be 140 + there with field testing on the fscher and fschrc, already supported / used 141 + in the fscscy 2.4 driver. FSC has confirmed that the fschmd has registers 142 + at these addresses, but doesn't want to confirm they are the same as with 143 + the fscher?? */ 144 + static const u8 FSCHMD_REG_TEMP_LIMIT[5][5] = { 145 + { 0, 0, 0 }, /* pos */ 146 + { 0x76, 0x86, 0x96 }, /* her */ 147 + { 0x76, 0xd6, 0x86, 0x96 }, /* scy */ 148 + { 0x76, 0x86, 0x96 }, /* hrc */ 149 + { 0x76, 0x86, 0x96, 0xd6, 0xe6 }, /* hmd */ 150 + }; 151 + 152 + /* These were found through experimenting with an fscher, currently they are 153 + not used, but we keep them around for future reference. 154 + static const u8 FSCHER_REG_TEMP_AUTOP1[] = { 0x73, 0x83, 0x93 }; 155 + static const u8 FSCHER_REG_TEMP_AUTOP2[] = { 0x75, 0x85, 0x95 }; */ 156 + 157 + static const int FSCHMD_NO_TEMP_SENSORS[5] = { 3, 3, 4, 3, 5 }; 158 + 159 + /* temp status register bitmasks */ 160 + #define FSCHMD_TEMP_WORKING_MASK 0x01 161 + #define FSCHMD_TEMP_ALERT_MASK 0x02 162 + /* there only really is an alarm if the sensor is working and alert == 1 */ 163 + #define FSCHMD_TEMP_ALARM_MASK \ 164 + (FSCHMD_TEMP_WORKING_MASK | FSCHMD_TEMP_ALERT_MASK) 165 + 166 + /* our driver name */ 167 + #define FSCHMD_NAME "fschmd" 168 + 169 + /* 170 + * Functions declarations 171 + */ 172 + 173 + static int fschmd_attach_adapter(struct i2c_adapter *adapter); 174 + static int fschmd_detach_client(struct i2c_client *client); 175 + static struct fschmd_data *fschmd_update_device(struct device *dev); 176 + 177 + /* 178 + * Driver data (common to all clients) 179 + */ 180 + 181 + static struct i2c_driver fschmd_driver = { 182 + .driver = { 183 + .name = FSCHMD_NAME, 184 + }, 185 + .attach_adapter = fschmd_attach_adapter, 186 + .detach_client = fschmd_detach_client, 187 + }; 188 + 189 + /* 190 + * Client data (each client gets its own) 191 + */ 192 + 193 + struct fschmd_data { 194 + struct i2c_client client; 195 + struct device *hwmon_dev; 196 + struct mutex update_lock; 197 + int kind; 198 + char valid; /* zero until following fields are valid */ 199 + unsigned long last_updated; /* in jiffies */ 200 + 201 + /* register values */ 202 + u8 global_control; /* global control register */ 203 + u8 volt[3]; /* 12, 5, battery voltage */ 204 + u8 temp_act[5]; /* temperature */ 205 + u8 temp_status[5]; /* status of sensor */ 206 + u8 temp_max[5]; /* high temp limit, notice: undocumented! */ 207 + u8 fan_act[6]; /* fans revolutions per second */ 208 + u8 fan_status[6]; /* fan status */ 209 + u8 fan_min[6]; /* fan min value for rps */ 210 + u8 fan_ripple[6]; /* divider for rps */ 211 + }; 212 + 213 + /* 214 + * Sysfs attr show / store functions 215 + */ 216 + 217 + static ssize_t show_in_value(struct device *dev, 218 + struct device_attribute *devattr, char *buf) 219 + { 220 + const int max_reading[3] = { 14200, 6600, 3300 }; 221 + int index = to_sensor_dev_attr(devattr)->index; 222 + struct fschmd_data *data = fschmd_update_device(dev); 223 + 224 + return sprintf(buf, "%d\n", (data->volt[index] * 225 + max_reading[index] + 128) / 255); 226 + } 227 + 228 + 229 + #define TEMP_FROM_REG(val) (((val) - 128) * 1000) 230 + 231 + static ssize_t show_temp_value(struct device *dev, 232 + struct device_attribute *devattr, char *buf) 233 + { 234 + int index = to_sensor_dev_attr(devattr)->index; 235 + struct fschmd_data *data = fschmd_update_device(dev); 236 + 237 + return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_act[index])); 238 + } 239 + 240 + static ssize_t show_temp_max(struct device *dev, 241 + struct device_attribute *devattr, char *buf) 242 + { 243 + int index = to_sensor_dev_attr(devattr)->index; 244 + struct fschmd_data *data = fschmd_update_device(dev); 245 + 246 + return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[index])); 247 + } 248 + 249 + static ssize_t store_temp_max(struct device *dev, struct device_attribute 250 + *devattr, const char *buf, size_t count) 251 + { 252 + int index = to_sensor_dev_attr(devattr)->index; 253 + struct fschmd_data *data = dev_get_drvdata(dev); 254 + long v = simple_strtol(buf, NULL, 10) / 1000; 255 + 256 + v = SENSORS_LIMIT(v, -128, 127) + 128; 257 + 258 + mutex_lock(&data->update_lock); 259 + i2c_smbus_write_byte_data(&data->client, 260 + FSCHMD_REG_TEMP_LIMIT[data->kind][index], v); 261 + data->temp_max[index] = v; 262 + mutex_unlock(&data->update_lock); 263 + 264 + return count; 265 + } 266 + 267 + static ssize_t show_temp_fault(struct device *dev, 268 + struct device_attribute *devattr, char *buf) 269 + { 270 + int index = to_sensor_dev_attr(devattr)->index; 271 + struct fschmd_data *data = fschmd_update_device(dev); 272 + 273 + /* bit 0 set means sensor working ok, so no fault! */ 274 + if (data->temp_status[index] & FSCHMD_TEMP_WORKING_MASK) 275 + return sprintf(buf, "0\n"); 276 + else 277 + return sprintf(buf, "1\n"); 278 + } 279 + 280 + static ssize_t show_temp_alarm(struct device *dev, 281 + struct device_attribute *devattr, char *buf) 282 + { 283 + int index = to_sensor_dev_attr(devattr)->index; 284 + struct fschmd_data *data = fschmd_update_device(dev); 285 + 286 + if ((data->temp_status[index] & FSCHMD_TEMP_ALARM_MASK) == 287 + FSCHMD_TEMP_ALARM_MASK) 288 + return sprintf(buf, "1\n"); 289 + else 290 + return sprintf(buf, "0\n"); 291 + } 292 + 293 + 294 + #define RPM_FROM_REG(val) ((val) * 60) 295 + 296 + static ssize_t show_fan_value(struct device *dev, 297 + struct device_attribute *devattr, char *buf) 298 + { 299 + int index = to_sensor_dev_attr(devattr)->index; 300 + struct fschmd_data *data = fschmd_update_device(dev); 301 + 302 + return sprintf(buf, "%u\n", RPM_FROM_REG(data->fan_act[index])); 303 + } 304 + 305 + static ssize_t show_fan_div(struct device *dev, 306 + struct device_attribute *devattr, char *buf) 307 + { 308 + int index = to_sensor_dev_attr(devattr)->index; 309 + struct fschmd_data *data = fschmd_update_device(dev); 310 + 311 + /* bits 2..7 reserved => mask with 3 */ 312 + return sprintf(buf, "%d\n", 1 << (data->fan_ripple[index] & 3)); 313 + } 314 + 315 + static ssize_t store_fan_div(struct device *dev, struct device_attribute 316 + *devattr, const char *buf, size_t count) 317 + { 318 + u8 reg; 319 + int index = to_sensor_dev_attr(devattr)->index; 320 + struct fschmd_data *data = dev_get_drvdata(dev); 321 + /* supported values: 2, 4, 8 */ 322 + unsigned long v = simple_strtoul(buf, NULL, 10); 323 + 324 + switch (v) { 325 + case 2: v = 1; break; 326 + case 4: v = 2; break; 327 + case 8: v = 3; break; 328 + default: 329 + dev_err(dev, "fan_div value %lu not supported. " 330 + "Choose one of 2, 4 or 8!\n", v); 331 + return -EINVAL; 332 + } 333 + 334 + mutex_lock(&data->update_lock); 335 + 336 + reg = i2c_smbus_read_byte_data(&data->client, 337 + FSCHMD_REG_FAN_RIPPLE[data->kind][index]); 338 + 339 + /* bits 2..7 reserved => mask with 0x03 */ 340 + reg &= ~0x03; 341 + reg |= v; 342 + 343 + i2c_smbus_write_byte_data(&data->client, 344 + FSCHMD_REG_FAN_RIPPLE[data->kind][index], reg); 345 + 346 + data->fan_ripple[index] = reg; 347 + 348 + mutex_unlock(&data->update_lock); 349 + 350 + return count; 351 + } 352 + 353 + static ssize_t show_fan_alarm(struct device *dev, 354 + struct device_attribute *devattr, char *buf) 355 + { 356 + int index = to_sensor_dev_attr(devattr)->index; 357 + struct fschmd_data *data = fschmd_update_device(dev); 358 + 359 + if (data->fan_status[index] & FSCHMD_FAN_ALARM_MASK) 360 + return sprintf(buf, "1\n"); 361 + else 362 + return sprintf(buf, "0\n"); 363 + } 364 + 365 + static ssize_t show_fan_fault(struct device *dev, 366 + struct device_attribute *devattr, char *buf) 367 + { 368 + int index = to_sensor_dev_attr(devattr)->index; 369 + struct fschmd_data *data = fschmd_update_device(dev); 370 + 371 + if (data->fan_status[index] & FSCHMD_FAN_NOT_PRESENT_MASK) 372 + return sprintf(buf, "1\n"); 373 + else 374 + return sprintf(buf, "0\n"); 375 + } 376 + 377 + 378 + static ssize_t show_pwm_auto_point1_pwm(struct device *dev, 379 + struct device_attribute *devattr, char *buf) 380 + { 381 + int index = to_sensor_dev_attr(devattr)->index; 382 + int val = fschmd_update_device(dev)->fan_min[index]; 383 + 384 + /* 0 = allow turning off, 1-255 = 50-100% */ 385 + if (val) 386 + val = val / 2 + 128; 387 + 388 + return sprintf(buf, "%d\n", val); 389 + } 390 + 391 + static ssize_t store_pwm_auto_point1_pwm(struct device *dev, 392 + struct device_attribute *devattr, const char *buf, size_t count) 393 + { 394 + int index = to_sensor_dev_attr(devattr)->index; 395 + struct fschmd_data *data = dev_get_drvdata(dev); 396 + unsigned long v = simple_strtoul(buf, NULL, 10); 397 + 398 + /* register: 0 = allow turning off, 1-255 = 50-100% */ 399 + if (v) { 400 + v = SENSORS_LIMIT(v, 128, 255); 401 + v = (v - 128) * 2 + 1; 402 + } 403 + 404 + mutex_lock(&data->update_lock); 405 + 406 + i2c_smbus_write_byte_data(&data->client, 407 + FSCHMD_REG_FAN_MIN[data->kind][index], v); 408 + data->fan_min[index] = v; 409 + 410 + mutex_unlock(&data->update_lock); 411 + 412 + return count; 413 + } 414 + 415 + 416 + /* The FSC hwmon family has the ability to force an attached alert led to flash 417 + from software, we export this as an alert_led sysfs attr */ 418 + static ssize_t show_alert_led(struct device *dev, 419 + struct device_attribute *devattr, char *buf) 420 + { 421 + struct fschmd_data *data = fschmd_update_device(dev); 422 + 423 + if (data->global_control & FSCHMD_CONTROL_ALERT_LED_MASK) 424 + return sprintf(buf, "1\n"); 425 + else 426 + return sprintf(buf, "0\n"); 427 + } 428 + 429 + static ssize_t store_alert_led(struct device *dev, 430 + struct device_attribute *devattr, const char *buf, size_t count) 431 + { 432 + u8 reg; 433 + struct fschmd_data *data = dev_get_drvdata(dev); 434 + unsigned long v = simple_strtoul(buf, NULL, 10); 435 + 436 + mutex_lock(&data->update_lock); 437 + 438 + reg = i2c_smbus_read_byte_data(&data->client, FSCHMD_REG_CONTROL); 439 + 440 + if (v) 441 + reg |= FSCHMD_CONTROL_ALERT_LED_MASK; 442 + else 443 + reg &= ~FSCHMD_CONTROL_ALERT_LED_MASK; 444 + 445 + i2c_smbus_write_byte_data(&data->client, FSCHMD_REG_CONTROL, reg); 446 + 447 + data->global_control = reg; 448 + 449 + mutex_unlock(&data->update_lock); 450 + 451 + return count; 452 + } 453 + 454 + static struct sensor_device_attribute fschmd_attr[] = { 455 + SENSOR_ATTR(in0_input, 0444, show_in_value, NULL, 0), 456 + SENSOR_ATTR(in1_input, 0444, show_in_value, NULL, 1), 457 + SENSOR_ATTR(in2_input, 0444, show_in_value, NULL, 2), 458 + SENSOR_ATTR(alert_led, 0644, show_alert_led, store_alert_led, 0), 459 + }; 460 + 461 + static struct sensor_device_attribute fschmd_temp_attr[] = { 462 + SENSOR_ATTR(temp1_input, 0444, show_temp_value, NULL, 0), 463 + SENSOR_ATTR(temp1_max, 0644, show_temp_max, store_temp_max, 0), 464 + SENSOR_ATTR(temp1_fault, 0444, show_temp_fault, NULL, 0), 465 + SENSOR_ATTR(temp1_alarm, 0444, show_temp_alarm, NULL, 0), 466 + SENSOR_ATTR(temp2_input, 0444, show_temp_value, NULL, 1), 467 + SENSOR_ATTR(temp2_max, 0644, show_temp_max, store_temp_max, 1), 468 + SENSOR_ATTR(temp2_fault, 0444, show_temp_fault, NULL, 1), 469 + SENSOR_ATTR(temp2_alarm, 0444, show_temp_alarm, NULL, 1), 470 + SENSOR_ATTR(temp3_input, 0444, show_temp_value, NULL, 2), 471 + SENSOR_ATTR(temp3_max, 0644, show_temp_max, store_temp_max, 2), 472 + SENSOR_ATTR(temp3_fault, 0444, show_temp_fault, NULL, 2), 473 + SENSOR_ATTR(temp3_alarm, 0444, show_temp_alarm, NULL, 2), 474 + SENSOR_ATTR(temp4_input, 0444, show_temp_value, NULL, 3), 475 + SENSOR_ATTR(temp4_max, 0644, show_temp_max, store_temp_max, 3), 476 + SENSOR_ATTR(temp4_fault, 0444, show_temp_fault, NULL, 3), 477 + SENSOR_ATTR(temp4_alarm, 0444, show_temp_alarm, NULL, 3), 478 + SENSOR_ATTR(temp5_input, 0444, show_temp_value, NULL, 4), 479 + SENSOR_ATTR(temp5_max, 0644, show_temp_max, store_temp_max, 4), 480 + SENSOR_ATTR(temp5_fault, 0444, show_temp_fault, NULL, 4), 481 + SENSOR_ATTR(temp5_alarm, 0444, show_temp_alarm, NULL, 4), 482 + }; 483 + 484 + static struct sensor_device_attribute fschmd_fan_attr[] = { 485 + SENSOR_ATTR(fan1_input, 0444, show_fan_value, NULL, 0), 486 + SENSOR_ATTR(fan1_div, 0644, show_fan_div, store_fan_div, 0), 487 + SENSOR_ATTR(fan1_alarm, 0444, show_fan_alarm, NULL, 0), 488 + SENSOR_ATTR(fan1_fault, 0444, show_fan_fault, NULL, 0), 489 + SENSOR_ATTR(pwm1_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm, 490 + store_pwm_auto_point1_pwm, 0), 491 + SENSOR_ATTR(fan2_input, 0444, show_fan_value, NULL, 1), 492 + SENSOR_ATTR(fan2_div, 0644, show_fan_div, store_fan_div, 1), 493 + SENSOR_ATTR(fan2_alarm, 0444, show_fan_alarm, NULL, 1), 494 + SENSOR_ATTR(fan2_fault, 0444, show_fan_fault, NULL, 1), 495 + SENSOR_ATTR(pwm2_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm, 496 + store_pwm_auto_point1_pwm, 1), 497 + SENSOR_ATTR(fan3_input, 0444, show_fan_value, NULL, 2), 498 + SENSOR_ATTR(fan3_div, 0644, show_fan_div, store_fan_div, 2), 499 + SENSOR_ATTR(fan3_alarm, 0444, show_fan_alarm, NULL, 2), 500 + SENSOR_ATTR(fan3_fault, 0444, show_fan_fault, NULL, 2), 501 + SENSOR_ATTR(pwm3_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm, 502 + store_pwm_auto_point1_pwm, 2), 503 + SENSOR_ATTR(fan4_input, 0444, show_fan_value, NULL, 3), 504 + SENSOR_ATTR(fan4_div, 0644, show_fan_div, store_fan_div, 3), 505 + SENSOR_ATTR(fan4_alarm, 0444, show_fan_alarm, NULL, 3), 506 + SENSOR_ATTR(fan4_fault, 0444, show_fan_fault, NULL, 3), 507 + SENSOR_ATTR(pwm4_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm, 508 + store_pwm_auto_point1_pwm, 3), 509 + SENSOR_ATTR(fan5_input, 0444, show_fan_value, NULL, 4), 510 + SENSOR_ATTR(fan5_div, 0644, show_fan_div, store_fan_div, 4), 511 + SENSOR_ATTR(fan5_alarm, 0444, show_fan_alarm, NULL, 4), 512 + SENSOR_ATTR(fan5_fault, 0444, show_fan_fault, NULL, 4), 513 + SENSOR_ATTR(pwm5_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm, 514 + store_pwm_auto_point1_pwm, 4), 515 + SENSOR_ATTR(fan6_input, 0444, show_fan_value, NULL, 5), 516 + SENSOR_ATTR(fan6_div, 0644, show_fan_div, store_fan_div, 5), 517 + SENSOR_ATTR(fan6_alarm, 0444, show_fan_alarm, NULL, 5), 518 + SENSOR_ATTR(fan6_fault, 0444, show_fan_fault, NULL, 5), 519 + SENSOR_ATTR(pwm6_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm, 520 + store_pwm_auto_point1_pwm, 5), 521 + }; 522 + 523 + 524 + /* 525 + * Real code 526 + */ 527 + 528 + static int fschmd_detect(struct i2c_adapter *adapter, int address, int kind) 529 + { 530 + struct i2c_client *client; 531 + struct fschmd_data *data; 532 + u8 revision; 533 + const char * const names[5] = { "Poseidon", "Hermes", "Scylla", 534 + "Heracles", "Heimdall" }; 535 + const char * const client_names[5] = { "fscpos", "fscher", "fscscy", 536 + "fschrc", "fschmd" }; 537 + int i, err = 0; 538 + 539 + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) 540 + return 0; 541 + 542 + /* OK. For now, we presume we have a valid client. We now create the 543 + * client structure, even though we cannot fill it completely yet. 544 + * But it allows us to access i2c_smbus_read_byte_data. */ 545 + if (!(data = kzalloc(sizeof(struct fschmd_data), GFP_KERNEL))) 546 + return -ENOMEM; 547 + 548 + client = &data->client; 549 + i2c_set_clientdata(client, data); 550 + client->addr = address; 551 + client->adapter = adapter; 552 + client->driver = &fschmd_driver; 553 + mutex_init(&data->update_lock); 554 + 555 + /* Detect & Identify the chip */ 556 + if (kind <= 0) { 557 + char id[4]; 558 + 559 + id[0] = i2c_smbus_read_byte_data(client, 560 + FSCHMD_REG_IDENT_0); 561 + id[1] = i2c_smbus_read_byte_data(client, 562 + FSCHMD_REG_IDENT_1); 563 + id[2] = i2c_smbus_read_byte_data(client, 564 + FSCHMD_REG_IDENT_2); 565 + id[3] = '\0'; 566 + 567 + if (!strcmp(id, "PEG")) 568 + kind = fscpos; 569 + else if (!strcmp(id, "HER")) 570 + kind = fscher; 571 + else if (!strcmp(id, "SCY")) 572 + kind = fscscy; 573 + else if (!strcmp(id, "HRC")) 574 + kind = fschrc; 575 + else if (!strcmp(id, "HMD")) 576 + kind = fschmd; 577 + else 578 + goto exit_free; 579 + } 580 + 581 + if (kind == fscpos) { 582 + /* The Poseidon has hardwired temp limits, fill these 583 + in for the alarm resetting code */ 584 + data->temp_max[0] = 70 + 128; 585 + data->temp_max[1] = 50 + 128; 586 + data->temp_max[2] = 50 + 128; 587 + } 588 + 589 + /* i2c kind goes from 1-5, we want from 0-4 to address arrays */ 590 + data->kind = kind - 1; 591 + strlcpy(client->name, client_names[data->kind], I2C_NAME_SIZE); 592 + 593 + /* Tell the I2C layer a new client has arrived */ 594 + if ((err = i2c_attach_client(client))) 595 + goto exit_free; 596 + 597 + for (i = 0; i < ARRAY_SIZE(fschmd_attr); i++) { 598 + err = device_create_file(&client->dev, 599 + &fschmd_attr[i].dev_attr); 600 + if (err) 601 + goto exit_detach; 602 + } 603 + 604 + for (i = 0; i < (FSCHMD_NO_TEMP_SENSORS[data->kind] * 4); i++) { 605 + /* Poseidon doesn't have TEMP_LIMIT registers */ 606 + if (kind == fscpos && fschmd_temp_attr[i].dev_attr.show == 607 + show_temp_max) 608 + continue; 609 + 610 + err = device_create_file(&client->dev, 611 + &fschmd_temp_attr[i].dev_attr); 612 + if (err) 613 + goto exit_detach; 614 + } 615 + 616 + for (i = 0; i < (FSCHMD_NO_FAN_SENSORS[data->kind] * 5); i++) { 617 + /* Poseidon doesn't have a FAN_MIN register for its 3rd fan */ 618 + if (kind == fscpos && 619 + !strcmp(fschmd_fan_attr[i].dev_attr.attr.name, 620 + "pwm3_auto_point1_pwm")) 621 + continue; 622 + 623 + err = device_create_file(&client->dev, 624 + &fschmd_fan_attr[i].dev_attr); 625 + if (err) 626 + goto exit_detach; 627 + } 628 + 629 + data->hwmon_dev = hwmon_device_register(&client->dev); 630 + if (IS_ERR(data->hwmon_dev)) { 631 + err = PTR_ERR(data->hwmon_dev); 632 + data->hwmon_dev = NULL; 633 + goto exit_detach; 634 + } 635 + 636 + revision = i2c_smbus_read_byte_data(client, FSCHMD_REG_REVISION); 637 + printk(KERN_INFO FSCHMD_NAME ": Detected FSC %s chip, revision: %d\n", 638 + names[data->kind], (int) revision); 639 + 640 + return 0; 641 + 642 + exit_detach: 643 + fschmd_detach_client(client); /* will also free data for us */ 644 + return err; 645 + 646 + exit_free: 647 + kfree(data); 648 + return err; 649 + } 650 + 651 + static int fschmd_attach_adapter(struct i2c_adapter *adapter) 652 + { 653 + if (!(adapter->class & I2C_CLASS_HWMON)) 654 + return 0; 655 + return i2c_probe(adapter, &addr_data, fschmd_detect); 656 + } 657 + 658 + static int fschmd_detach_client(struct i2c_client *client) 659 + { 660 + struct fschmd_data *data = i2c_get_clientdata(client); 661 + int i, err; 662 + 663 + /* Check if registered in case we're called from fschmd_detect 664 + to cleanup after an error */ 665 + if (data->hwmon_dev) 666 + hwmon_device_unregister(data->hwmon_dev); 667 + 668 + for (i = 0; i < ARRAY_SIZE(fschmd_attr); i++) 669 + device_remove_file(&client->dev, &fschmd_attr[i].dev_attr); 670 + for (i = 0; i < (FSCHMD_NO_TEMP_SENSORS[data->kind] * 4); i++) 671 + device_remove_file(&client->dev, 672 + &fschmd_temp_attr[i].dev_attr); 673 + for (i = 0; i < (FSCHMD_NO_FAN_SENSORS[data->kind] * 5); i++) 674 + device_remove_file(&client->dev, 675 + &fschmd_fan_attr[i].dev_attr); 676 + 677 + if ((err = i2c_detach_client(client))) 678 + return err; 679 + 680 + kfree(data); 681 + return 0; 682 + } 683 + 684 + static struct fschmd_data *fschmd_update_device(struct device *dev) 685 + { 686 + struct i2c_client *client = to_i2c_client(dev); 687 + struct fschmd_data *data = i2c_get_clientdata(client); 688 + int i; 689 + 690 + mutex_lock(&data->update_lock); 691 + 692 + if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) { 693 + 694 + for (i = 0; i < FSCHMD_NO_TEMP_SENSORS[data->kind]; i++) { 695 + data->temp_act[i] = i2c_smbus_read_byte_data(client, 696 + FSCHMD_REG_TEMP_ACT[data->kind][i]); 697 + data->temp_status[i] = i2c_smbus_read_byte_data(client, 698 + FSCHMD_REG_TEMP_STATE[data->kind][i]); 699 + 700 + /* The fscpos doesn't have TEMP_LIMIT registers */ 701 + if (FSCHMD_REG_TEMP_LIMIT[data->kind][i]) 702 + data->temp_max[i] = i2c_smbus_read_byte_data( 703 + client, 704 + FSCHMD_REG_TEMP_LIMIT[data->kind][i]); 705 + 706 + /* reset alarm if the alarm condition is gone, 707 + the chip doesn't do this itself */ 708 + if ((data->temp_status[i] & FSCHMD_TEMP_ALARM_MASK) == 709 + FSCHMD_TEMP_ALARM_MASK && 710 + data->temp_act[i] < data->temp_max[i]) 711 + i2c_smbus_write_byte_data(client, 712 + FSCHMD_REG_TEMP_STATE[data->kind][i], 713 + FSCHMD_TEMP_ALERT_MASK); 714 + } 715 + 716 + for (i = 0; i < FSCHMD_NO_FAN_SENSORS[data->kind]; i++) { 717 + data->fan_act[i] = i2c_smbus_read_byte_data(client, 718 + FSCHMD_REG_FAN_ACT[data->kind][i]); 719 + data->fan_status[i] = i2c_smbus_read_byte_data(client, 720 + FSCHMD_REG_FAN_STATE[data->kind][i]); 721 + data->fan_ripple[i] = i2c_smbus_read_byte_data(client, 722 + FSCHMD_REG_FAN_RIPPLE[data->kind][i]); 723 + 724 + /* The fscpos third fan doesn't have a fan_min */ 725 + if (FSCHMD_REG_FAN_MIN[data->kind][i]) 726 + data->fan_min[i] = i2c_smbus_read_byte_data( 727 + client, 728 + FSCHMD_REG_FAN_MIN[data->kind][i]); 729 + 730 + /* reset fan status if speed is back to > 0 */ 731 + if ((data->fan_status[i] & FSCHMD_FAN_ALARM_MASK) && 732 + data->fan_act[i]) 733 + i2c_smbus_write_byte_data(client, 734 + FSCHMD_REG_FAN_STATE[data->kind][i], 735 + FSCHMD_FAN_ALARM_MASK); 736 + } 737 + 738 + for (i = 0; i < 3; i++) 739 + data->volt[i] = i2c_smbus_read_byte_data(client, 740 + FSCHMD_REG_VOLT[i]); 741 + 742 + data->global_control = i2c_smbus_read_byte_data(client, 743 + FSCHMD_REG_CONTROL); 744 + 745 + /* To be implemented in the future 746 + data->watchdog[0] = i2c_smbus_read_byte_data(client, 747 + FSCHMD_REG_WDOG_PRESET); 748 + data->watchdog[1] = i2c_smbus_read_byte_data(client, 749 + FSCHMD_REG_WDOG_STATE); 750 + data->watchdog[2] = i2c_smbus_read_byte_data(client, 751 + FSCHMD_REG_WDOG_CONTROL); */ 752 + 753 + data->last_updated = jiffies; 754 + data->valid = 1; 755 + } 756 + 757 + mutex_unlock(&data->update_lock); 758 + 759 + return data; 760 + } 761 + 762 + static int __init fschmd_init(void) 763 + { 764 + return i2c_add_driver(&fschmd_driver); 765 + } 766 + 767 + static void __exit fschmd_exit(void) 768 + { 769 + i2c_del_driver(&fschmd_driver); 770 + } 771 + 772 + MODULE_AUTHOR("Hans de Goede <j.w.r.degoede@hhs.nl>"); 773 + MODULE_DESCRIPTION("FSC Poseidon, Hermes, Scylla, Heracles and " 774 + "Heimdall driver"); 775 + MODULE_LICENSE("GPL"); 776 + 777 + module_init(fschmd_init); 778 + module_exit(fschmd_exit);
+5 -5
drivers/hwmon/fscpos.c
··· 115 115 */ 116 116 struct fscpos_data { 117 117 struct i2c_client client; 118 - struct class_device *class_dev; 118 + struct device *hwmon_dev; 119 119 struct mutex update_lock; 120 120 char valid; /* 0 until following fields are valid */ 121 121 unsigned long last_updated; /* In jiffies */ ··· 539 539 if ((err = sysfs_create_group(&new_client->dev.kobj, &fscpos_group))) 540 540 goto exit_detach; 541 541 542 - data->class_dev = hwmon_device_register(&new_client->dev); 543 - if (IS_ERR(data->class_dev)) { 544 - err = PTR_ERR(data->class_dev); 542 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 543 + if (IS_ERR(data->hwmon_dev)) { 544 + err = PTR_ERR(data->hwmon_dev); 545 545 goto exit_remove_files; 546 546 } 547 547 ··· 562 562 struct fscpos_data *data = i2c_get_clientdata(client); 563 563 int err; 564 564 565 - hwmon_device_unregister(data->class_dev); 565 + hwmon_device_unregister(data->hwmon_dev); 566 566 sysfs_remove_group(&client->dev.kobj, &fscpos_group); 567 567 568 568 if ((err = i2c_detach_client(client)))
+5 -5
drivers/hwmon/gl518sm.c
··· 119 119 /* Each client has this additional data */ 120 120 struct gl518_data { 121 121 struct i2c_client client; 122 - struct class_device *class_dev; 122 + struct device *hwmon_dev; 123 123 enum chips type; 124 124 125 125 struct mutex update_lock; ··· 460 460 if ((err = sysfs_create_group(&new_client->dev.kobj, &gl518_group))) 461 461 goto exit_detach; 462 462 463 - data->class_dev = hwmon_device_register(&new_client->dev); 464 - if (IS_ERR(data->class_dev)) { 465 - err = PTR_ERR(data->class_dev); 463 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 464 + if (IS_ERR(data->hwmon_dev)) { 465 + err = PTR_ERR(data->hwmon_dev); 466 466 goto exit_remove_files; 467 467 } 468 468 ··· 502 502 struct gl518_data *data = i2c_get_clientdata(client); 503 503 int err; 504 504 505 - hwmon_device_unregister(data->class_dev); 505 + hwmon_device_unregister(data->hwmon_dev); 506 506 sysfs_remove_group(&client->dev.kobj, &gl518_group); 507 507 508 508 if ((err = i2c_detach_client(client)))
+5 -5
drivers/hwmon/gl520sm.c
··· 122 122 /* Client data */ 123 123 struct gl520_data { 124 124 struct i2c_client client; 125 - struct class_device *class_dev; 125 + struct device *hwmon_dev; 126 126 struct mutex update_lock; 127 127 char valid; /* zero until the following fields are valid */ 128 128 unsigned long last_updated; /* in jiffies */ ··· 622 622 } 623 623 624 624 625 - data->class_dev = hwmon_device_register(&new_client->dev); 626 - if (IS_ERR(data->class_dev)) { 627 - err = PTR_ERR(data->class_dev); 625 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 626 + if (IS_ERR(data->hwmon_dev)) { 627 + err = PTR_ERR(data->hwmon_dev); 628 628 goto exit_remove_files; 629 629 } 630 630 ··· 685 685 struct gl520_data *data = i2c_get_clientdata(client); 686 686 int err; 687 687 688 - hwmon_device_unregister(data->class_dev); 688 + hwmon_device_unregister(data->hwmon_dev); 689 689 sysfs_remove_group(&client->dev.kobj, &gl520_group); 690 690 sysfs_remove_group(&client->dev.kobj, &gl520_group_opt); 691 691
+13 -14
drivers/hwmon/hwmon.c
··· 28 28 static DEFINE_SPINLOCK(idr_lock); 29 29 30 30 /** 31 - * hwmon_device_register - register w/ hwmon sysfs class 31 + * hwmon_device_register - register w/ hwmon 32 32 * @dev: the device to register 33 33 * 34 - * hwmon_device_unregister() must be called when the class device is no 34 + * hwmon_device_unregister() must be called when the device is no 35 35 * longer needed. 36 36 * 37 - * Returns the pointer to the new struct class device. 37 + * Returns the pointer to the new device. 38 38 */ 39 - struct class_device *hwmon_device_register(struct device *dev) 39 + struct device *hwmon_device_register(struct device *dev) 40 40 { 41 - struct class_device *cdev; 41 + struct device *hwdev; 42 42 int id, err; 43 43 44 44 again: ··· 55 55 return ERR_PTR(err); 56 56 57 57 id = id & MAX_ID_MASK; 58 - cdev = class_device_create(hwmon_class, NULL, MKDEV(0,0), dev, 59 - HWMON_ID_FORMAT, id); 58 + hwdev = device_create(hwmon_class, dev, MKDEV(0,0), HWMON_ID_FORMAT, id); 60 59 61 - if (IS_ERR(cdev)) { 60 + if (IS_ERR(hwdev)) { 62 61 spin_lock(&idr_lock); 63 62 idr_remove(&hwmon_idr, id); 64 63 spin_unlock(&idr_lock); 65 64 } 66 65 67 - return cdev; 66 + return hwdev; 68 67 } 69 68 70 69 /** 71 70 * hwmon_device_unregister - removes the previously registered class device 72 71 * 73 - * @cdev: the class device to destroy 72 + * @dev: the class device to destroy 74 73 */ 75 - void hwmon_device_unregister(struct class_device *cdev) 74 + void hwmon_device_unregister(struct device *dev) 76 75 { 77 76 int id; 78 77 79 - if (likely(sscanf(cdev->class_id, HWMON_ID_FORMAT, &id) == 1)) { 80 - class_device_unregister(cdev); 78 + if (likely(sscanf(dev->bus_id, HWMON_ID_FORMAT, &id) == 1)) { 79 + device_unregister(dev); 81 80 spin_lock(&idr_lock); 82 81 idr_remove(&hwmon_idr, id); 83 82 spin_unlock(&idr_lock); 84 83 } else 85 - dev_dbg(cdev->dev, 84 + dev_dbg(dev->parent, 86 85 "hwmon_device_unregister() failed: bad class ID!\n"); 87 86 } 88 87
+607
drivers/hwmon/ibmpex.c
··· 1 + /* 2 + * A hwmon driver for the IBM PowerExecutive temperature/power sensors 3 + * Copyright (C) 2007 IBM 4 + * 5 + * Author: Darrick J. Wong <djwong@us.ibm.com> 6 + * 7 + * This program is free software; you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License as published by 9 + * the Free Software Foundation; either version 2 of the License, or 10 + * (at your option) any later version. 11 + * 12 + * This program is distributed in the hope that it will be useful, 13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 + * GNU General Public License for more details. 16 + * 17 + * You should have received a copy of the GNU General Public License 18 + * along with this program; if not, write to the Free Software 19 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 + */ 21 + 22 + #include <linux/ipmi.h> 23 + #include <linux/module.h> 24 + #include <linux/hwmon.h> 25 + #include <linux/hwmon-sysfs.h> 26 + #include <linux/jiffies.h> 27 + #include <linux/mutex.h> 28 + 29 + #define REFRESH_INTERVAL (2 * HZ) 30 + #define DRVNAME "ibmpex" 31 + 32 + #define PEX_GET_VERSION 1 33 + #define PEX_GET_SENSOR_COUNT 2 34 + #define PEX_GET_SENSOR_NAME 3 35 + #define PEX_RESET_HIGH_LOW 4 36 + #define PEX_GET_SENSOR_DATA 6 37 + 38 + #define PEX_NET_FUNCTION 0x3A 39 + #define PEX_COMMAND 0x3C 40 + 41 + static inline u16 extract_value(const char *data, int offset) 42 + { 43 + return be16_to_cpup((u16 *)&data[offset]); 44 + } 45 + 46 + #define TEMP_SENSOR 1 47 + #define POWER_SENSOR 2 48 + 49 + #define PEX_SENSOR_TYPE_LEN 3 50 + static u8 const power_sensor_sig[] = {0x70, 0x77, 0x72}; 51 + static u8 const temp_sensor_sig[] = {0x74, 0x65, 0x6D}; 52 + 53 + #define PEX_MULT_LEN 2 54 + static u8 const watt_sensor_sig[] = {0x41, 0x43}; 55 + 56 + #define PEX_NUM_SENSOR_FUNCS 3 57 + static char const * const power_sensor_name_templates[] = { 58 + "%s%d_average", 59 + "%s%d_average_lowest", 60 + "%s%d_average_highest" 61 + }; 62 + static char const * const temp_sensor_name_templates[] = { 63 + "%s%d_input", 64 + "%s%d_input_lowest", 65 + "%s%d_input_highest" 66 + }; 67 + 68 + static void ibmpex_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data); 69 + static void ibmpex_register_bmc(int iface, struct device *dev); 70 + static void ibmpex_bmc_gone(int iface); 71 + 72 + struct ibmpex_sensor_data { 73 + int in_use; 74 + s16 values[PEX_NUM_SENSOR_FUNCS]; 75 + int multiplier; 76 + 77 + struct sensor_device_attribute_2 attr[PEX_NUM_SENSOR_FUNCS]; 78 + }; 79 + 80 + struct ibmpex_bmc_data { 81 + struct list_head list; 82 + struct device *hwmon_dev; 83 + struct device *bmc_device; 84 + struct mutex lock; 85 + char valid; 86 + unsigned long last_updated; /* In jiffies */ 87 + 88 + struct ipmi_addr address; 89 + struct completion read_complete; 90 + ipmi_user_t user; 91 + int interface; 92 + 93 + struct kernel_ipmi_msg tx_message; 94 + unsigned char tx_msg_data[IPMI_MAX_MSG_LENGTH]; 95 + long tx_msgid; 96 + 97 + unsigned char rx_msg_data[IPMI_MAX_MSG_LENGTH]; 98 + unsigned long rx_msg_len; 99 + unsigned char rx_result; 100 + int rx_recv_type; 101 + 102 + unsigned char sensor_major; 103 + unsigned char sensor_minor; 104 + 105 + unsigned char num_sensors; 106 + struct ibmpex_sensor_data *sensors; 107 + }; 108 + 109 + struct ibmpex_driver_data { 110 + struct list_head bmc_data; 111 + struct ipmi_smi_watcher bmc_events; 112 + struct ipmi_user_hndl ipmi_hndlrs; 113 + }; 114 + 115 + static struct ibmpex_driver_data driver_data = { 116 + .bmc_data = LIST_HEAD_INIT(driver_data.bmc_data), 117 + .bmc_events = { 118 + .owner = THIS_MODULE, 119 + .new_smi = ibmpex_register_bmc, 120 + .smi_gone = ibmpex_bmc_gone, 121 + }, 122 + .ipmi_hndlrs = { 123 + .ipmi_recv_hndl = ibmpex_msg_handler, 124 + }, 125 + }; 126 + 127 + static int ibmpex_send_message(struct ibmpex_bmc_data *data) 128 + { 129 + int err; 130 + 131 + err = ipmi_validate_addr(&data->address, sizeof(data->address)); 132 + if (err) 133 + goto out; 134 + 135 + data->tx_msgid++; 136 + err = ipmi_request_settime(data->user, &data->address, data->tx_msgid, 137 + &data->tx_message, data, 0, 0, 0); 138 + if (err) 139 + goto out1; 140 + 141 + return 0; 142 + out1: 143 + printk(KERN_ERR "%s: request_settime=%x\n", __FUNCTION__, err); 144 + return err; 145 + out: 146 + printk(KERN_ERR "%s: validate_addr=%x\n", __FUNCTION__, err); 147 + return err; 148 + } 149 + 150 + static int ibmpex_ver_check(struct ibmpex_bmc_data *data) 151 + { 152 + data->tx_msg_data[0] = PEX_GET_VERSION; 153 + data->tx_message.data_len = 1; 154 + ibmpex_send_message(data); 155 + 156 + wait_for_completion(&data->read_complete); 157 + 158 + if (data->rx_result || data->rx_msg_len != 6) 159 + return -ENOENT; 160 + 161 + data->sensor_major = data->rx_msg_data[0]; 162 + data->sensor_minor = data->rx_msg_data[1]; 163 + 164 + printk(KERN_INFO DRVNAME ": Found BMC with sensor interface " 165 + "v%d.%d %d-%02d-%02d on interface %d\n", 166 + data->sensor_major, 167 + data->sensor_minor, 168 + extract_value(data->rx_msg_data, 2), 169 + data->rx_msg_data[4], 170 + data->rx_msg_data[5], 171 + data->interface); 172 + 173 + return 0; 174 + } 175 + 176 + static int ibmpex_query_sensor_count(struct ibmpex_bmc_data *data) 177 + { 178 + data->tx_msg_data[0] = PEX_GET_SENSOR_COUNT; 179 + data->tx_message.data_len = 1; 180 + ibmpex_send_message(data); 181 + 182 + wait_for_completion(&data->read_complete); 183 + 184 + if (data->rx_result || data->rx_msg_len != 1) 185 + return -ENOENT; 186 + 187 + return data->rx_msg_data[0]; 188 + } 189 + 190 + static int ibmpex_query_sensor_name(struct ibmpex_bmc_data *data, int sensor) 191 + { 192 + data->tx_msg_data[0] = PEX_GET_SENSOR_NAME; 193 + data->tx_msg_data[1] = sensor; 194 + data->tx_message.data_len = 2; 195 + ibmpex_send_message(data); 196 + 197 + wait_for_completion(&data->read_complete); 198 + 199 + if (data->rx_result || data->rx_msg_len < 1) 200 + return -ENOENT; 201 + 202 + return 0; 203 + } 204 + 205 + static int ibmpex_query_sensor_data(struct ibmpex_bmc_data *data, int sensor) 206 + { 207 + data->tx_msg_data[0] = PEX_GET_SENSOR_DATA; 208 + data->tx_msg_data[1] = sensor; 209 + data->tx_message.data_len = 2; 210 + ibmpex_send_message(data); 211 + 212 + wait_for_completion(&data->read_complete); 213 + 214 + if (data->rx_result || data->rx_msg_len < 26) { 215 + printk(KERN_ERR "Error reading sensor %d, please check.\n", 216 + sensor); 217 + return -ENOENT; 218 + } 219 + 220 + return 0; 221 + } 222 + 223 + static int ibmpex_reset_high_low_data(struct ibmpex_bmc_data *data) 224 + { 225 + data->tx_msg_data[0] = PEX_RESET_HIGH_LOW; 226 + data->tx_message.data_len = 1; 227 + ibmpex_send_message(data); 228 + 229 + wait_for_completion(&data->read_complete); 230 + 231 + return 0; 232 + } 233 + 234 + static void ibmpex_update_device(struct ibmpex_bmc_data *data) 235 + { 236 + int i, err; 237 + 238 + mutex_lock(&data->lock); 239 + if (time_before(jiffies, data->last_updated + REFRESH_INTERVAL) && 240 + data->valid) 241 + goto out; 242 + 243 + for (i = 0; i < data->num_sensors; i++) { 244 + if (!data->sensors[i].in_use) 245 + continue; 246 + err = ibmpex_query_sensor_data(data, i); 247 + if (err) 248 + continue; 249 + data->sensors[i].values[0] = 250 + extract_value(data->rx_msg_data, 16); 251 + data->sensors[i].values[1] = 252 + extract_value(data->rx_msg_data, 18); 253 + data->sensors[i].values[2] = 254 + extract_value(data->rx_msg_data, 20); 255 + } 256 + 257 + data->last_updated = jiffies; 258 + data->valid = 1; 259 + 260 + out: 261 + mutex_unlock(&data->lock); 262 + } 263 + 264 + static struct ibmpex_bmc_data *get_bmc_data(int iface) 265 + { 266 + struct ibmpex_bmc_data *p, *next; 267 + 268 + list_for_each_entry_safe(p, next, &driver_data.bmc_data, list) 269 + if (p->interface == iface) 270 + return p; 271 + 272 + return NULL; 273 + } 274 + 275 + static ssize_t show_name(struct device *dev, struct device_attribute *devattr, 276 + char *buf) 277 + { 278 + return sprintf(buf, "%s\n", DRVNAME); 279 + } 280 + static SENSOR_DEVICE_ATTR(name, S_IRUGO, show_name, NULL, 0); 281 + 282 + static ssize_t ibmpex_show_sensor(struct device *dev, 283 + struct device_attribute *devattr, 284 + char *buf) 285 + { 286 + struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr); 287 + struct ibmpex_bmc_data *data = dev_get_drvdata(dev); 288 + int mult = data->sensors[attr->index].multiplier; 289 + ibmpex_update_device(data); 290 + 291 + return sprintf(buf, "%d\n", 292 + data->sensors[attr->index].values[attr->nr] * mult); 293 + } 294 + 295 + static ssize_t ibmpex_reset_high_low(struct device *dev, 296 + struct device_attribute *devattr, 297 + const char *buf, 298 + size_t count) 299 + { 300 + struct ibmpex_bmc_data *data = dev_get_drvdata(dev); 301 + 302 + ibmpex_reset_high_low_data(data); 303 + 304 + return count; 305 + } 306 + 307 + static SENSOR_DEVICE_ATTR(reset_high_low, S_IWUSR, NULL, 308 + ibmpex_reset_high_low, 0); 309 + 310 + static int is_power_sensor(const char *sensor_id, int len) 311 + { 312 + if (len < PEX_SENSOR_TYPE_LEN) 313 + return 0; 314 + 315 + if (!memcmp(sensor_id, power_sensor_sig, PEX_SENSOR_TYPE_LEN)) 316 + return 1; 317 + return 0; 318 + } 319 + 320 + static int is_temp_sensor(const char *sensor_id, int len) 321 + { 322 + if (len < PEX_SENSOR_TYPE_LEN) 323 + return 0; 324 + 325 + if (!memcmp(sensor_id, temp_sensor_sig, PEX_SENSOR_TYPE_LEN)) 326 + return 1; 327 + return 0; 328 + } 329 + 330 + static int power_sensor_multiplier(const char *sensor_id, int len) 331 + { 332 + int i; 333 + 334 + for (i = PEX_SENSOR_TYPE_LEN; i < len - 1; i++) 335 + if (!memcmp(&sensor_id[i], watt_sensor_sig, PEX_MULT_LEN)) 336 + return 1000000; 337 + 338 + return 100000; 339 + } 340 + 341 + static int create_sensor(struct ibmpex_bmc_data *data, int type, 342 + int counter, int sensor, int func) 343 + { 344 + int err; 345 + char *n; 346 + 347 + n = kmalloc(32, GFP_KERNEL); 348 + if (!n) 349 + return -ENOMEM; 350 + 351 + if (type == TEMP_SENSOR) 352 + sprintf(n, temp_sensor_name_templates[func], "temp", counter); 353 + else if (type == POWER_SENSOR) 354 + sprintf(n, power_sensor_name_templates[func], "power", counter); 355 + 356 + data->sensors[sensor].attr[func].dev_attr.attr.name = n; 357 + data->sensors[sensor].attr[func].dev_attr.attr.mode = S_IRUGO; 358 + data->sensors[sensor].attr[func].dev_attr.show = ibmpex_show_sensor; 359 + data->sensors[sensor].attr[func].index = sensor; 360 + data->sensors[sensor].attr[func].nr = func; 361 + 362 + err = device_create_file(data->bmc_device, 363 + &data->sensors[sensor].attr[func].dev_attr); 364 + if (err) { 365 + data->sensors[sensor].attr[func].dev_attr.attr.name = NULL; 366 + kfree(n); 367 + return err; 368 + } 369 + 370 + return 0; 371 + } 372 + 373 + static int ibmpex_find_sensors(struct ibmpex_bmc_data *data) 374 + { 375 + int i, j, err; 376 + int sensor_type; 377 + int sensor_counter; 378 + int num_power = 0; 379 + int num_temp = 0; 380 + 381 + err = ibmpex_query_sensor_count(data); 382 + if (err <= 0) 383 + return -ENOENT; 384 + data->num_sensors = err; 385 + 386 + data->sensors = kzalloc(data->num_sensors * sizeof(*data->sensors), 387 + GFP_KERNEL); 388 + if (!data->sensors) 389 + return -ENOMEM; 390 + 391 + for (i = 0; i < data->num_sensors; i++) { 392 + err = ibmpex_query_sensor_name(data, i); 393 + if (err) 394 + continue; 395 + 396 + if (is_power_sensor(data->rx_msg_data, data->rx_msg_len)) { 397 + sensor_type = POWER_SENSOR; 398 + num_power++; 399 + sensor_counter = num_power; 400 + data->sensors[i].multiplier = 401 + power_sensor_multiplier(data->rx_msg_data, 402 + data->rx_msg_len); 403 + } else if (is_temp_sensor(data->rx_msg_data, 404 + data->rx_msg_len)) { 405 + sensor_type = TEMP_SENSOR; 406 + num_temp++; 407 + sensor_counter = num_temp; 408 + data->sensors[i].multiplier = 1; 409 + } else 410 + continue; 411 + 412 + data->sensors[i].in_use = 1; 413 + 414 + /* Create attributes */ 415 + for (j = 0; j < PEX_NUM_SENSOR_FUNCS; j++) { 416 + err = create_sensor(data, sensor_type, sensor_counter, 417 + i, j); 418 + if (err) 419 + goto exit_remove; 420 + } 421 + } 422 + 423 + err = device_create_file(data->bmc_device, 424 + &sensor_dev_attr_reset_high_low.dev_attr); 425 + if (err) 426 + goto exit_remove; 427 + 428 + err = device_create_file(data->bmc_device, 429 + &sensor_dev_attr_name.dev_attr); 430 + if (err) 431 + goto exit_remove; 432 + 433 + return 0; 434 + 435 + exit_remove: 436 + device_remove_file(data->bmc_device, 437 + &sensor_dev_attr_reset_high_low.dev_attr); 438 + device_remove_file(data->bmc_device, &sensor_dev_attr_name.dev_attr); 439 + for (i = 0; i < data->num_sensors; i++) 440 + for (j = 0; j < PEX_NUM_SENSOR_FUNCS; j++) { 441 + if (!data->sensors[i].attr[j].dev_attr.attr.name) 442 + continue; 443 + device_remove_file(data->bmc_device, 444 + &data->sensors[i].attr[j].dev_attr); 445 + kfree(data->sensors[i].attr[j].dev_attr.attr.name); 446 + } 447 + 448 + kfree(data->sensors); 449 + return err; 450 + } 451 + 452 + static void ibmpex_register_bmc(int iface, struct device *dev) 453 + { 454 + struct ibmpex_bmc_data *data; 455 + int err; 456 + 457 + data = kzalloc(sizeof(*data), GFP_KERNEL); 458 + if (!data) { 459 + printk(KERN_ERR DRVNAME ": Insufficient memory for BMC " 460 + "interface %d.\n", data->interface); 461 + return; 462 + } 463 + 464 + data->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; 465 + data->address.channel = IPMI_BMC_CHANNEL; 466 + data->address.data[0] = 0; 467 + data->interface = iface; 468 + data->bmc_device = dev; 469 + 470 + /* Create IPMI messaging interface user */ 471 + err = ipmi_create_user(data->interface, &driver_data.ipmi_hndlrs, 472 + data, &data->user); 473 + if (err < 0) { 474 + printk(KERN_ERR DRVNAME ": Error, unable to register user with " 475 + "ipmi interface %d\n", 476 + data->interface); 477 + goto out; 478 + } 479 + 480 + mutex_init(&data->lock); 481 + 482 + /* Initialize message */ 483 + data->tx_msgid = 0; 484 + init_completion(&data->read_complete); 485 + data->tx_message.netfn = PEX_NET_FUNCTION; 486 + data->tx_message.cmd = PEX_COMMAND; 487 + data->tx_message.data = data->tx_msg_data; 488 + 489 + /* Does this BMC support PowerExecutive? */ 490 + err = ibmpex_ver_check(data); 491 + if (err) 492 + goto out_user; 493 + 494 + /* Register the BMC as a HWMON class device */ 495 + data->hwmon_dev = hwmon_device_register(data->bmc_device); 496 + 497 + if (IS_ERR(data->hwmon_dev)) { 498 + printk(KERN_ERR DRVNAME ": Error, unable to register hwmon " 499 + "class device for interface %d\n", 500 + data->interface); 501 + goto out_user; 502 + } 503 + 504 + /* finally add the new bmc data to the bmc data list */ 505 + dev_set_drvdata(dev, data); 506 + list_add_tail(&data->list, &driver_data.bmc_data); 507 + 508 + /* Now go find all the sensors */ 509 + err = ibmpex_find_sensors(data); 510 + if (err) { 511 + printk(KERN_ERR "Error %d allocating memory\n", err); 512 + goto out_register; 513 + } 514 + 515 + return; 516 + 517 + out_register: 518 + hwmon_device_unregister(data->hwmon_dev); 519 + out_user: 520 + ipmi_destroy_user(data->user); 521 + out: 522 + kfree(data); 523 + } 524 + 525 + static void ibmpex_bmc_delete(struct ibmpex_bmc_data *data) 526 + { 527 + int i, j; 528 + 529 + device_remove_file(data->bmc_device, 530 + &sensor_dev_attr_reset_high_low.dev_attr); 531 + device_remove_file(data->bmc_device, &sensor_dev_attr_name.dev_attr); 532 + for (i = 0; i < data->num_sensors; i++) 533 + for (j = 0; j < PEX_NUM_SENSOR_FUNCS; j++) { 534 + if (!data->sensors[i].attr[j].dev_attr.attr.name) 535 + continue; 536 + device_remove_file(data->bmc_device, 537 + &data->sensors[i].attr[j].dev_attr); 538 + kfree(data->sensors[i].attr[j].dev_attr.attr.name); 539 + } 540 + 541 + list_del(&data->list); 542 + dev_set_drvdata(data->bmc_device, NULL); 543 + hwmon_device_unregister(data->hwmon_dev); 544 + ipmi_destroy_user(data->user); 545 + kfree(data->sensors); 546 + kfree(data); 547 + } 548 + 549 + static void ibmpex_bmc_gone(int iface) 550 + { 551 + struct ibmpex_bmc_data *data = get_bmc_data(iface); 552 + 553 + if (!data) 554 + return; 555 + 556 + ibmpex_bmc_delete(data); 557 + } 558 + 559 + static void ibmpex_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data) 560 + { 561 + struct ibmpex_bmc_data *data = (struct ibmpex_bmc_data *)user_msg_data; 562 + 563 + if (msg->msgid != data->tx_msgid) { 564 + printk(KERN_ERR "Received msgid (%02x) and transmitted " 565 + "msgid (%02x) mismatch!\n", 566 + (int)msg->msgid, 567 + (int)data->tx_msgid); 568 + ipmi_free_recv_msg(msg); 569 + return; 570 + } 571 + 572 + data->rx_recv_type = msg->recv_type; 573 + if (msg->msg.data_len > 0) 574 + data->rx_result = msg->msg.data[0]; 575 + else 576 + data->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE; 577 + 578 + if (msg->msg.data_len > 1) { 579 + data->rx_msg_len = msg->msg.data_len - 1; 580 + memcpy(data->rx_msg_data, msg->msg.data + 1, data->rx_msg_len); 581 + } else 582 + data->rx_msg_len = 0; 583 + 584 + ipmi_free_recv_msg(msg); 585 + complete(&data->read_complete); 586 + } 587 + 588 + static int __init ibmpex_init(void) 589 + { 590 + return ipmi_smi_watcher_register(&driver_data.bmc_events); 591 + } 592 + 593 + static void __exit ibmpex_exit(void) 594 + { 595 + struct ibmpex_bmc_data *p, *next; 596 + 597 + ipmi_smi_watcher_unregister(&driver_data.bmc_events); 598 + list_for_each_entry_safe(p, next, &driver_data.bmc_data, list) 599 + ibmpex_bmc_delete(p); 600 + } 601 + 602 + MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); 603 + MODULE_DESCRIPTION("IBM PowerExecutive power/temperature sensor driver"); 604 + MODULE_LICENSE("GPL"); 605 + 606 + module_init(ibmpex_init); 607 + module_exit(ibmpex_exit);
+45 -21
drivers/hwmon/it87.c
··· 141 141 142 142 /* Monitors: 9 voltage (0 to 7, battery), 3 temp (1 to 3), 3 fan (1 to 3) */ 143 143 144 - #define IT87_REG_FAN(nr) (0x0d + (nr)) 145 - #define IT87_REG_FAN_MIN(nr) (0x10 + (nr)) 146 - #define IT87_REG_FANX(nr) (0x18 + (nr)) 147 - #define IT87_REG_FANX_MIN(nr) (0x1b + (nr)) 144 + static const u8 IT87_REG_FAN[] = { 0x0d, 0x0e, 0x0f, 0x80, 0x82 }; 145 + static const u8 IT87_REG_FAN_MIN[] = { 0x10, 0x11, 0x12, 0x84, 0x86 }; 146 + static const u8 IT87_REG_FANX[] = { 0x18, 0x19, 0x1a, 0x81, 0x83 }; 147 + static const u8 IT87_REG_FANX_MIN[] = { 0x1b, 0x1c, 0x1d, 0x85, 0x87 }; 148 148 #define IT87_REG_FAN_MAIN_CTRL 0x13 149 149 #define IT87_REG_FAN_CTL 0x14 150 150 #define IT87_REG_PWM(nr) (0x15 + (nr)) ··· 222 222 /* For each registered chip, we need to keep some data in memory. 223 223 The structure is dynamically allocated. */ 224 224 struct it87_data { 225 - struct class_device *class_dev; 225 + struct device *hwmon_dev; 226 226 enum chips type; 227 227 228 228 unsigned short addr; ··· 235 235 u8 in_max[8]; /* Register value */ 236 236 u8 in_min[8]; /* Register value */ 237 237 u8 has_fan; /* Bitfield, fans enabled */ 238 - u16 fan[3]; /* Register values, possibly combined */ 239 - u16 fan_min[3]; /* Register values, possibly combined */ 238 + u16 fan[5]; /* Register values, possibly combined */ 239 + u16 fan_min[5]; /* Register values, possibly combined */ 240 240 u8 temp[3]; /* Register value */ 241 241 u8 temp_high[3]; /* Register value */ 242 242 u8 temp_low[3]; /* Register value */ ··· 555 555 } 556 556 557 557 data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr])); 558 - it87_write_value(data, IT87_REG_FAN_MIN(nr), data->fan_min[nr]); 558 + it87_write_value(data, IT87_REG_FAN_MIN[nr], data->fan_min[nr]); 559 559 mutex_unlock(&data->update_lock); 560 560 return count; 561 561 } ··· 596 596 597 597 /* Restore fan min limit */ 598 598 data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); 599 - it87_write_value(data, IT87_REG_FAN_MIN(nr), data->fan_min[nr]); 599 + it87_write_value(data, IT87_REG_FAN_MIN[nr], data->fan_min[nr]); 600 600 601 601 mutex_unlock(&data->update_lock); 602 602 return count; ··· 729 729 730 730 mutex_lock(&data->update_lock); 731 731 data->fan_min[nr] = FAN16_TO_REG(val); 732 - it87_write_value(data, IT87_REG_FAN_MIN(nr), 732 + it87_write_value(data, IT87_REG_FAN_MIN[nr], 733 733 data->fan_min[nr] & 0xff); 734 - it87_write_value(data, IT87_REG_FANX_MIN(nr), 734 + it87_write_value(data, IT87_REG_FANX_MIN[nr], 735 735 data->fan_min[nr] >> 8); 736 736 mutex_unlock(&data->update_lock); 737 737 return count; ··· 751 751 show_fan16_offset(1); 752 752 show_fan16_offset(2); 753 753 show_fan16_offset(3); 754 + show_fan16_offset(4); 755 + show_fan16_offset(5); 754 756 755 757 /* Alarms */ 756 758 static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf) ··· 765 763 static ssize_t 766 764 show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf) 767 765 { 768 - struct it87_data *data = it87_update_device(dev); 766 + struct it87_data *data = dev_get_drvdata(dev); 769 767 return sprintf(buf, "%u\n", data->vrm); 770 768 } 771 769 static ssize_t ··· 853 851 &sensor_dev_attr_fan2_min16.dev_attr.attr, 854 852 &sensor_dev_attr_fan3_input16.dev_attr.attr, 855 853 &sensor_dev_attr_fan3_min16.dev_attr.attr, 854 + &sensor_dev_attr_fan4_input16.dev_attr.attr, 855 + &sensor_dev_attr_fan4_min16.dev_attr.attr, 856 + &sensor_dev_attr_fan5_input16.dev_attr.attr, 857 + &sensor_dev_attr_fan5_min16.dev_attr.attr, 856 858 857 859 &sensor_dev_attr_fan1_input.dev_attr.attr, 858 860 &sensor_dev_attr_fan1_min.dev_attr.attr, ··· 1030 1024 &sensor_dev_attr_fan3_min16.dev_attr))) 1031 1025 goto ERROR4; 1032 1026 } 1027 + if (data->has_fan & (1 << 3)) { 1028 + if ((err = device_create_file(dev, 1029 + &sensor_dev_attr_fan4_input16.dev_attr)) 1030 + || (err = device_create_file(dev, 1031 + &sensor_dev_attr_fan4_min16.dev_attr))) 1032 + goto ERROR4; 1033 + } 1034 + if (data->has_fan & (1 << 4)) { 1035 + if ((err = device_create_file(dev, 1036 + &sensor_dev_attr_fan5_input16.dev_attr)) 1037 + || (err = device_create_file(dev, 1038 + &sensor_dev_attr_fan5_min16.dev_attr))) 1039 + goto ERROR4; 1040 + } 1033 1041 } else { 1034 1042 /* 8-bit tachometers with clock divider */ 1035 1043 if (data->has_fan & (1 << 0)) { ··· 1109 1089 goto ERROR4; 1110 1090 } 1111 1091 1112 - data->class_dev = hwmon_device_register(dev); 1113 - if (IS_ERR(data->class_dev)) { 1114 - err = PTR_ERR(data->class_dev); 1092 + data->hwmon_dev = hwmon_device_register(dev); 1093 + if (IS_ERR(data->hwmon_dev)) { 1094 + err = PTR_ERR(data->hwmon_dev); 1115 1095 goto ERROR4; 1116 1096 } 1117 1097 ··· 1133 1113 { 1134 1114 struct it87_data *data = platform_get_drvdata(pdev); 1135 1115 1136 - hwmon_device_unregister(data->class_dev); 1116 + hwmon_device_unregister(data->hwmon_dev); 1137 1117 sysfs_remove_group(&pdev->dev.kobj, &it87_group); 1138 1118 sysfs_remove_group(&pdev->dev.kobj, &it87_group_opt); 1139 1119 ··· 1280 1260 it87_write_value(data, IT87_REG_FAN_16BIT, 1281 1261 tmp | 0x07); 1282 1262 } 1263 + if (tmp & (1 << 4)) 1264 + data->has_fan |= (1 << 3); /* fan4 enabled */ 1265 + if (tmp & (1 << 5)) 1266 + data->has_fan |= (1 << 4); /* fan5 enabled */ 1283 1267 } 1284 1268 1285 1269 /* Set current fan mode registers and the default settings for the ··· 1338 1314 data->in[8] = 1339 1315 it87_read_value(data, IT87_REG_VIN(8)); 1340 1316 1341 - for (i = 0; i < 3; i++) { 1317 + for (i = 0; i < 5; i++) { 1342 1318 /* Skip disabled fans */ 1343 1319 if (!(data->has_fan & (1 << i))) 1344 1320 continue; 1345 1321 1346 1322 data->fan_min[i] = 1347 - it87_read_value(data, IT87_REG_FAN_MIN(i)); 1323 + it87_read_value(data, IT87_REG_FAN_MIN[i]); 1348 1324 data->fan[i] = it87_read_value(data, 1349 - IT87_REG_FAN(i)); 1325 + IT87_REG_FAN[i]); 1350 1326 /* Add high byte if in 16-bit mode */ 1351 1327 if (data->type == it8716 || data->type == it8718) { 1352 1328 data->fan[i] |= it87_read_value(data, 1353 - IT87_REG_FANX(i)) << 8; 1329 + IT87_REG_FANX[i]) << 8; 1354 1330 data->fan_min[i] |= it87_read_value(data, 1355 - IT87_REG_FANX_MIN(i)) << 8; 1331 + IT87_REG_FANX_MIN[i]) << 8; 1356 1332 } 1357 1333 } 1358 1334 for (i = 0; i < 3; i++) {
+5 -5
drivers/hwmon/k8temp.c
··· 38 38 #define SEL_CORE 0x04 39 39 40 40 struct k8temp_data { 41 - struct class_device *class_dev; 41 + struct device *hwmon_dev; 42 42 struct mutex update_lock; 43 43 const char *name; 44 44 char valid; /* zero until following fields are valid */ ··· 225 225 if (err) 226 226 goto exit_remove; 227 227 228 - data->class_dev = hwmon_device_register(&pdev->dev); 228 + data->hwmon_dev = hwmon_device_register(&pdev->dev); 229 229 230 - if (IS_ERR(data->class_dev)) { 231 - err = PTR_ERR(data->class_dev); 230 + if (IS_ERR(data->hwmon_dev)) { 231 + err = PTR_ERR(data->hwmon_dev); 232 232 goto exit_remove; 233 233 } 234 234 ··· 255 255 { 256 256 struct k8temp_data *data = dev_get_drvdata(&pdev->dev); 257 257 258 - hwmon_device_unregister(data->class_dev); 258 + hwmon_device_unregister(data->hwmon_dev); 259 259 device_remove_file(&pdev->dev, 260 260 &sensor_dev_attr_temp1_input.dev_attr); 261 261 device_remove_file(&pdev->dev,
+5 -5
drivers/hwmon/lm63.c
··· 154 154 155 155 struct lm63_data { 156 156 struct i2c_client client; 157 - struct class_device *class_dev; 157 + struct device *hwmon_dev; 158 158 struct mutex update_lock; 159 159 char valid; /* zero until following fields are valid */ 160 160 unsigned long last_updated; /* in jiffies */ ··· 502 502 goto exit_remove_files; 503 503 } 504 504 505 - data->class_dev = hwmon_device_register(&new_client->dev); 506 - if (IS_ERR(data->class_dev)) { 507 - err = PTR_ERR(data->class_dev); 505 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 506 + if (IS_ERR(data->hwmon_dev)) { 507 + err = PTR_ERR(data->hwmon_dev); 508 508 goto exit_remove_files; 509 509 } 510 510 ··· 561 561 struct lm63_data *data = i2c_get_clientdata(client); 562 562 int err; 563 563 564 - hwmon_device_unregister(data->class_dev); 564 + hwmon_device_unregister(data->hwmon_dev); 565 565 sysfs_remove_group(&client->dev.kobj, &lm63_group); 566 566 sysfs_remove_group(&client->dev.kobj, &lm63_group_fan1); 567 567
+19 -8
drivers/hwmon/lm70.c
··· 37 37 #define DRVNAME "lm70" 38 38 39 39 struct lm70 { 40 - struct class_device *cdev; 40 + struct device *hwmon_dev; 41 41 struct semaphore sem; 42 42 }; 43 43 ··· 81 81 * So it's equivalent to multiplying by 0.25 * 1000 = 250. 82 82 */ 83 83 val = ((int)raw/32) * 250; 84 - status = sprintf(buf, "%+d\n", val); /* millidegrees Celsius */ 84 + status = sprintf(buf, "%d\n", val); /* millidegrees Celsius */ 85 85 out: 86 86 up(&p_lm70->sem); 87 87 return status; 88 88 } 89 89 90 90 static DEVICE_ATTR(temp1_input, S_IRUGO, lm70_sense_temp, NULL); 91 + 92 + static ssize_t lm70_show_name(struct device *dev, struct device_attribute 93 + *devattr, char *buf) 94 + { 95 + return sprintf(buf, "lm70\n"); 96 + } 97 + 98 + static DEVICE_ATTR(name, S_IRUGO, lm70_show_name, NULL); 91 99 92 100 /*----------------------------------------------------------------------*/ 93 101 ··· 115 107 init_MUTEX(&p_lm70->sem); 116 108 117 109 /* sysfs hook */ 118 - p_lm70->cdev = hwmon_device_register(&spi->dev); 119 - if (IS_ERR(p_lm70->cdev)) { 110 + p_lm70->hwmon_dev = hwmon_device_register(&spi->dev); 111 + if (IS_ERR(p_lm70->hwmon_dev)) { 120 112 dev_dbg(&spi->dev, "hwmon_device_register failed.\n"); 121 - status = PTR_ERR(p_lm70->cdev); 113 + status = PTR_ERR(p_lm70->hwmon_dev); 122 114 goto out_dev_reg_failed; 123 115 } 124 116 dev_set_drvdata(&spi->dev, p_lm70); 125 117 126 - if ((status = device_create_file(&spi->dev, &dev_attr_temp1_input))) { 118 + if ((status = device_create_file(&spi->dev, &dev_attr_temp1_input)) 119 + || (status = device_create_file(&spi->dev, &dev_attr_name))) { 127 120 dev_dbg(&spi->dev, "device_create_file failure.\n"); 128 121 goto out_dev_create_file_failed; 129 122 } ··· 132 123 return 0; 133 124 134 125 out_dev_create_file_failed: 135 - hwmon_device_unregister(p_lm70->cdev); 126 + device_remove_file(&spi->dev, &dev_attr_temp1_input); 127 + hwmon_device_unregister(p_lm70->hwmon_dev); 136 128 out_dev_reg_failed: 137 129 dev_set_drvdata(&spi->dev, NULL); 138 130 kfree(p_lm70); ··· 145 135 struct lm70 *p_lm70 = dev_get_drvdata(&spi->dev); 146 136 147 137 device_remove_file(&spi->dev, &dev_attr_temp1_input); 148 - hwmon_device_unregister(p_lm70->cdev); 138 + device_remove_file(&spi->dev, &dev_attr_name); 139 + hwmon_device_unregister(p_lm70->hwmon_dev); 149 140 dev_set_drvdata(&spi->dev, NULL); 150 141 kfree(p_lm70); 151 142
+6 -6
drivers/hwmon/lm75.c
··· 50 50 /* Each client has this additional data */ 51 51 struct lm75_data { 52 52 struct i2c_client client; 53 - struct class_device *class_dev; 53 + struct device *hwmon_dev; 54 54 struct mutex update_lock; 55 55 char valid; /* !=0 if following fields are valid */ 56 56 unsigned long last_updated; /* In jiffies */ ··· 95 95 struct i2c_client *client = to_i2c_client(dev); 96 96 struct lm75_data *data = i2c_get_clientdata(client); 97 97 int nr = attr->index; 98 - unsigned long temp = simple_strtoul(buf, NULL, 10); 98 + long temp = simple_strtol(buf, NULL, 10); 99 99 100 100 mutex_lock(&data->update_lock); 101 101 data->temp[nr] = LM75_TEMP_TO_REG(temp); ··· 219 219 if ((err = sysfs_create_group(&new_client->dev.kobj, &lm75_group))) 220 220 goto exit_detach; 221 221 222 - data->class_dev = hwmon_device_register(&new_client->dev); 223 - if (IS_ERR(data->class_dev)) { 224 - err = PTR_ERR(data->class_dev); 222 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 223 + if (IS_ERR(data->hwmon_dev)) { 224 + err = PTR_ERR(data->hwmon_dev); 225 225 goto exit_remove; 226 226 } 227 227 ··· 240 240 static int lm75_detach_client(struct i2c_client *client) 241 241 { 242 242 struct lm75_data *data = i2c_get_clientdata(client); 243 - hwmon_device_unregister(data->class_dev); 243 + hwmon_device_unregister(data->hwmon_dev); 244 244 sysfs_remove_group(&client->dev.kobj, &lm75_group); 245 245 i2c_detach_client(client); 246 246 kfree(data);
+1 -1
drivers/hwmon/lm75.h
··· 33 33 34 34 /* TEMP: 0.001C/bit (-55C to +125C) 35 35 REG: (0.5C/bit, two's complement) << 7 */ 36 - static inline u16 LM75_TEMP_TO_REG(int temp) 36 + static inline u16 LM75_TEMP_TO_REG(long temp) 37 37 { 38 38 int ntemp = SENSORS_LIMIT(temp, LM75_TEMP_MIN, LM75_TEMP_MAX); 39 39 ntemp += (ntemp<0 ? -250 : 250);
+6 -6
drivers/hwmon/lm77.c
··· 51 51 /* Each client has this additional data */ 52 52 struct lm77_data { 53 53 struct i2c_client client; 54 - struct class_device *class_dev; 54 + struct device *hwmon_dev; 55 55 struct mutex update_lock; 56 56 char valid; 57 57 unsigned long last_updated; /* In jiffies */ ··· 138 138 { \ 139 139 struct i2c_client *client = to_i2c_client(dev); \ 140 140 struct lm77_data *data = i2c_get_clientdata(client); \ 141 - long val = simple_strtoul(buf, NULL, 10); \ 141 + long val = simple_strtol(buf, NULL, 10); \ 142 142 \ 143 143 mutex_lock(&data->update_lock); \ 144 144 data->value = val; \ ··· 337 337 if ((err = sysfs_create_group(&new_client->dev.kobj, &lm77_group))) 338 338 goto exit_detach; 339 339 340 - data->class_dev = hwmon_device_register(&new_client->dev); 341 - if (IS_ERR(data->class_dev)) { 342 - err = PTR_ERR(data->class_dev); 340 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 341 + if (IS_ERR(data->hwmon_dev)) { 342 + err = PTR_ERR(data->hwmon_dev); 343 343 goto exit_remove; 344 344 } 345 345 ··· 358 358 static int lm77_detach_client(struct i2c_client *client) 359 359 { 360 360 struct lm77_data *data = i2c_get_clientdata(client); 361 - hwmon_device_unregister(data->class_dev); 361 + hwmon_device_unregister(data->hwmon_dev); 362 362 sysfs_remove_group(&client->dev.kobj, &lm77_group); 363 363 i2c_detach_client(client); 364 364 kfree(data);
+39 -9
drivers/hwmon/lm78.c
··· 131 131 the driver field to differentiate between I2C and ISA chips. */ 132 132 struct lm78_data { 133 133 struct i2c_client client; 134 - struct class_device *class_dev; 134 + struct device *hwmon_dev; 135 135 struct mutex lock; 136 136 enum chips type; 137 137 ··· 438 438 } 439 439 static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); 440 440 441 + static ssize_t show_alarm(struct device *dev, struct device_attribute *da, 442 + char *buf) 443 + { 444 + struct lm78_data *data = lm78_update_device(dev); 445 + int nr = to_sensor_dev_attr(da)->index; 446 + return sprintf(buf, "%u\n", (data->alarms >> nr) & 1); 447 + } 448 + static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0); 449 + static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1); 450 + static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2); 451 + static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3); 452 + static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8); 453 + static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9); 454 + static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 10); 455 + static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6); 456 + static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7); 457 + static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 11); 458 + static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4); 459 + 441 460 /* This function is called when: 442 461 * lm78_driver is inserted (when this module is loaded), for each 443 462 available adapter ··· 472 453 &sensor_dev_attr_in0_input.dev_attr.attr, 473 454 &sensor_dev_attr_in0_min.dev_attr.attr, 474 455 &sensor_dev_attr_in0_max.dev_attr.attr, 456 + &sensor_dev_attr_in0_alarm.dev_attr.attr, 475 457 &sensor_dev_attr_in1_input.dev_attr.attr, 476 458 &sensor_dev_attr_in1_min.dev_attr.attr, 477 459 &sensor_dev_attr_in1_max.dev_attr.attr, 460 + &sensor_dev_attr_in1_alarm.dev_attr.attr, 478 461 &sensor_dev_attr_in2_input.dev_attr.attr, 479 462 &sensor_dev_attr_in2_min.dev_attr.attr, 480 463 &sensor_dev_attr_in2_max.dev_attr.attr, 464 + &sensor_dev_attr_in2_alarm.dev_attr.attr, 481 465 &sensor_dev_attr_in3_input.dev_attr.attr, 482 466 &sensor_dev_attr_in3_min.dev_attr.attr, 483 467 &sensor_dev_attr_in3_max.dev_attr.attr, 468 + &sensor_dev_attr_in3_alarm.dev_attr.attr, 484 469 &sensor_dev_attr_in4_input.dev_attr.attr, 485 470 &sensor_dev_attr_in4_min.dev_attr.attr, 486 471 &sensor_dev_attr_in4_max.dev_attr.attr, 472 + &sensor_dev_attr_in4_alarm.dev_attr.attr, 487 473 &sensor_dev_attr_in5_input.dev_attr.attr, 488 474 &sensor_dev_attr_in5_min.dev_attr.attr, 489 475 &sensor_dev_attr_in5_max.dev_attr.attr, 476 + &sensor_dev_attr_in5_alarm.dev_attr.attr, 490 477 &sensor_dev_attr_in6_input.dev_attr.attr, 491 478 &sensor_dev_attr_in6_min.dev_attr.attr, 492 479 &sensor_dev_attr_in6_max.dev_attr.attr, 480 + &sensor_dev_attr_in6_alarm.dev_attr.attr, 493 481 &dev_attr_temp1_input.attr, 494 482 &dev_attr_temp1_max.attr, 495 483 &dev_attr_temp1_max_hyst.attr, 484 + &sensor_dev_attr_temp1_alarm.dev_attr.attr, 496 485 &sensor_dev_attr_fan1_input.dev_attr.attr, 497 486 &sensor_dev_attr_fan1_min.dev_attr.attr, 498 487 &sensor_dev_attr_fan1_div.dev_attr.attr, 488 + &sensor_dev_attr_fan1_alarm.dev_attr.attr, 499 489 &sensor_dev_attr_fan2_input.dev_attr.attr, 500 490 &sensor_dev_attr_fan2_min.dev_attr.attr, 501 491 &sensor_dev_attr_fan2_div.dev_attr.attr, 492 + &sensor_dev_attr_fan2_alarm.dev_attr.attr, 502 493 &sensor_dev_attr_fan3_input.dev_attr.attr, 503 494 &sensor_dev_attr_fan3_min.dev_attr.attr, 504 495 &sensor_dev_attr_fan3_div.dev_attr.attr, 496 + &sensor_dev_attr_fan3_alarm.dev_attr.attr, 505 497 &dev_attr_alarms.attr, 506 498 &dev_attr_cpu0_vid.attr, 507 499 ··· 615 585 if ((err = sysfs_create_group(&new_client->dev.kobj, &lm78_group))) 616 586 goto ERROR3; 617 587 618 - data->class_dev = hwmon_device_register(&new_client->dev); 619 - if (IS_ERR(data->class_dev)) { 620 - err = PTR_ERR(data->class_dev); 588 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 589 + if (IS_ERR(data->hwmon_dev)) { 590 + err = PTR_ERR(data->hwmon_dev); 621 591 goto ERROR4; 622 592 } 623 593 ··· 638 608 struct lm78_data *data = i2c_get_clientdata(client); 639 609 int err; 640 610 641 - hwmon_device_unregister(data->class_dev); 611 + hwmon_device_unregister(data->hwmon_dev); 642 612 sysfs_remove_group(&client->dev.kobj, &lm78_group); 643 613 644 614 if ((err = i2c_detach_client(client))) ··· 689 659 || (err = device_create_file(&pdev->dev, &dev_attr_name))) 690 660 goto exit_remove_files; 691 661 692 - data->class_dev = hwmon_device_register(&pdev->dev); 693 - if (IS_ERR(data->class_dev)) { 694 - err = PTR_ERR(data->class_dev); 662 + data->hwmon_dev = hwmon_device_register(&pdev->dev); 663 + if (IS_ERR(data->hwmon_dev)) { 664 + err = PTR_ERR(data->hwmon_dev); 695 665 goto exit_remove_files; 696 666 } 697 667 ··· 711 681 { 712 682 struct lm78_data *data = platform_get_drvdata(pdev); 713 683 714 - hwmon_device_unregister(data->class_dev); 684 + hwmon_device_unregister(data->hwmon_dev); 715 685 sysfs_remove_group(&pdev->dev.kobj, &lm78_group); 716 686 device_remove_file(&pdev->dev, &dev_attr_name); 717 687 release_region(data->client.addr, LM78_EXTENT);
+5 -5
drivers/hwmon/lm80.c
··· 108 108 109 109 struct lm80_data { 110 110 struct i2c_client client; 111 - struct class_device *class_dev; 111 + struct device *hwmon_dev; 112 112 struct mutex update_lock; 113 113 char valid; /* !=0 if following fields are valid */ 114 114 unsigned long last_updated; /* In jiffies */ ··· 497 497 if ((err = sysfs_create_group(&new_client->dev.kobj, &lm80_group))) 498 498 goto error_detach; 499 499 500 - data->class_dev = hwmon_device_register(&new_client->dev); 501 - if (IS_ERR(data->class_dev)) { 502 - err = PTR_ERR(data->class_dev); 500 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 501 + if (IS_ERR(data->hwmon_dev)) { 502 + err = PTR_ERR(data->hwmon_dev); 503 503 goto error_remove; 504 504 } 505 505 ··· 520 520 struct lm80_data *data = i2c_get_clientdata(client); 521 521 int err; 522 522 523 - hwmon_device_unregister(data->class_dev); 523 + hwmon_device_unregister(data->hwmon_dev); 524 524 sysfs_remove_group(&client->dev.kobj, &lm80_group); 525 525 if ((err = i2c_detach_client(client))) 526 526 return err;
+5 -5
drivers/hwmon/lm83.c
··· 144 144 145 145 struct lm83_data { 146 146 struct i2c_client client; 147 - struct class_device *class_dev; 147 + struct device *hwmon_dev; 148 148 struct mutex update_lock; 149 149 char valid; /* zero until following fields are valid */ 150 150 unsigned long last_updated; /* in jiffies */ ··· 400 400 goto exit_remove_files; 401 401 } 402 402 403 - data->class_dev = hwmon_device_register(&new_client->dev); 404 - if (IS_ERR(data->class_dev)) { 405 - err = PTR_ERR(data->class_dev); 403 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 404 + if (IS_ERR(data->hwmon_dev)) { 405 + err = PTR_ERR(data->hwmon_dev); 406 406 goto exit_remove_files; 407 407 } 408 408 ··· 424 424 struct lm83_data *data = i2c_get_clientdata(client); 425 425 int err; 426 426 427 - hwmon_device_unregister(data->class_dev); 427 + hwmon_device_unregister(data->hwmon_dev); 428 428 sysfs_remove_group(&client->dev.kobj, &lm83_group); 429 429 sysfs_remove_group(&client->dev.kobj, &lm83_group_opt); 430 430
+346 -360
drivers/hwmon/lm85.c
··· 30 30 #include <linux/i2c.h> 31 31 #include <linux/hwmon.h> 32 32 #include <linux/hwmon-vid.h> 33 + #include <linux/hwmon-sysfs.h> 33 34 #include <linux/err.h> 34 35 #include <linux/mutex.h> 35 36 ··· 123 122 #define EMC6D102_REG_EXTEND_ADC3 0x87 124 123 #define EMC6D102_REG_EXTEND_ADC4 0x88 125 124 126 - #define LM85_ALARM_IN0 0x0001 127 - #define LM85_ALARM_IN1 0x0002 128 - #define LM85_ALARM_IN2 0x0004 129 - #define LM85_ALARM_IN3 0x0008 130 - #define LM85_ALARM_TEMP1 0x0010 131 - #define LM85_ALARM_TEMP2 0x0020 132 - #define LM85_ALARM_TEMP3 0x0040 133 - #define LM85_ALARM_ALARM2 0x0080 134 - #define LM85_ALARM_IN4 0x0100 135 - #define LM85_ALARM_RESERVED 0x0200 136 - #define LM85_ALARM_FAN1 0x0400 137 - #define LM85_ALARM_FAN2 0x0800 138 - #define LM85_ALARM_FAN3 0x1000 139 - #define LM85_ALARM_FAN4 0x2000 140 - #define LM85_ALARM_TEMP1_FAULT 0x4000 141 - #define LM85_ALARM_TEMP3_FAULT 0x8000 142 - 143 125 144 126 /* Conversions. Rounding and limit checking is only done on the TO_REG 145 127 variants. Note that you should be a bit careful with which arguments ··· 139 155 #define INS_TO_REG(n,val) \ 140 156 SENSORS_LIMIT(SCALE(val,lm85_scaling[n],192),0,255) 141 157 142 - #define INSEXT_FROM_REG(n,val,ext,scale) \ 143 - SCALE((val)*(scale) + (ext),192*(scale),lm85_scaling[n]) 158 + #define INSEXT_FROM_REG(n,val,ext) \ 159 + SCALE(((val) << 4) + (ext), 192 << 4, lm85_scaling[n]) 144 160 145 - #define INS_FROM_REG(n,val) INSEXT_FROM_REG(n,val,0,1) 161 + #define INS_FROM_REG(n,val) SCALE((val), 192, lm85_scaling[n]) 146 162 147 163 /* FAN speed is measured using 90kHz clock */ 148 - #define FAN_TO_REG(val) (SENSORS_LIMIT( (val)<=0?0: 5400000/(val),0,65534)) 164 + static inline u16 FAN_TO_REG(unsigned long val) 165 + { 166 + if (!val) 167 + return 0xffff; 168 + return SENSORS_LIMIT(5400000 / val, 1, 0xfffe); 169 + } 149 170 #define FAN_FROM_REG(val) ((val)==0?-1:(val)==0xffff?0:5400000/(val)) 150 171 151 172 /* Temperature is reported in .001 degC increments */ 152 173 #define TEMP_TO_REG(val) \ 153 174 SENSORS_LIMIT(SCALE(val,1000,1),-127,127) 154 - #define TEMPEXT_FROM_REG(val,ext,scale) \ 155 - SCALE((val)*scale + (ext),scale,1000) 156 - #define TEMP_FROM_REG(val) \ 157 - TEMPEXT_FROM_REG(val,0,1) 175 + #define TEMPEXT_FROM_REG(val,ext) \ 176 + SCALE(((val) << 4) + (ext), 16, 1000) 177 + #define TEMP_FROM_REG(val) ((val) * 1000) 158 178 159 179 #define PWM_TO_REG(val) (SENSORS_LIMIT(val,0,255)) 160 180 #define PWM_FROM_REG(val) (val) ··· 316 328 The structure is dynamically allocated. */ 317 329 struct lm85_data { 318 330 struct i2c_client client; 319 - struct class_device *class_dev; 331 + struct device *hwmon_dev; 320 332 enum chips type; 321 333 322 334 struct mutex update_lock; ··· 338 350 u8 tach_mode; /* Register encoding, combined */ 339 351 u8 temp_ext[3]; /* Decoded values */ 340 352 u8 in_ext[8]; /* Decoded values */ 341 - u8 adc_scale; /* ADC Extended bits scaling factor */ 342 353 u8 fan_ppr; /* Register value */ 343 354 u8 smooth[3]; /* Register encoding */ 344 355 u8 vid; /* Register value */ ··· 374 387 375 388 376 389 /* 4 Fans */ 377 - static ssize_t show_fan(struct device *dev, char *buf, int nr) 390 + static ssize_t show_fan(struct device *dev, struct device_attribute *attr, 391 + char *buf) 378 392 { 393 + int nr = to_sensor_dev_attr(attr)->index; 379 394 struct lm85_data *data = lm85_update_device(dev); 380 395 return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan[nr]) ); 381 396 } 382 - static ssize_t show_fan_min(struct device *dev, char *buf, int nr) 397 + 398 + static ssize_t show_fan_min(struct device *dev, struct device_attribute *attr, 399 + char *buf) 383 400 { 401 + int nr = to_sensor_dev_attr(attr)->index; 384 402 struct lm85_data *data = lm85_update_device(dev); 385 403 return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan_min[nr]) ); 386 404 } 387 - static ssize_t set_fan_min(struct device *dev, const char *buf, 388 - size_t count, int nr) 405 + 406 + static ssize_t set_fan_min(struct device *dev, struct device_attribute *attr, 407 + const char *buf, size_t count) 389 408 { 409 + int nr = to_sensor_dev_attr(attr)->index; 390 410 struct i2c_client *client = to_i2c_client(dev); 391 411 struct lm85_data *data = i2c_get_clientdata(client); 392 - long val = simple_strtol(buf, NULL, 10); 412 + unsigned long val = simple_strtoul(buf, NULL, 10); 393 413 394 414 mutex_lock(&data->update_lock); 395 415 data->fan_min[nr] = FAN_TO_REG(val); ··· 406 412 } 407 413 408 414 #define show_fan_offset(offset) \ 409 - static ssize_t show_fan_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ 410 - { \ 411 - return show_fan(dev, buf, offset - 1); \ 412 - } \ 413 - static ssize_t show_fan_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf) \ 414 - { \ 415 - return show_fan_min(dev, buf, offset - 1); \ 416 - } \ 417 - static ssize_t set_fan_##offset##_min (struct device *dev, struct device_attribute *attr, \ 418 - const char *buf, size_t count) \ 419 - { \ 420 - return set_fan_min(dev, buf, count, offset - 1); \ 421 - } \ 422 - static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan_##offset, \ 423 - NULL); \ 424 - static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ 425 - show_fan_##offset##_min, set_fan_##offset##_min); 415 + static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, \ 416 + show_fan, NULL, offset - 1); \ 417 + static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ 418 + show_fan_min, set_fan_min, offset - 1) 426 419 427 420 show_fan_offset(1); 428 421 show_fan_offset(2); ··· 438 457 439 458 static ssize_t show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf) 440 459 { 441 - struct lm85_data *data = lm85_update_device(dev); 460 + struct lm85_data *data = dev_get_drvdata(dev); 442 461 return sprintf(buf, "%ld\n", (long) data->vrm); 443 462 } 444 463 ··· 463 482 464 483 static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL); 465 484 485 + static ssize_t show_alarm(struct device *dev, struct device_attribute *attr, 486 + char *buf) 487 + { 488 + int nr = to_sensor_dev_attr(attr)->index; 489 + struct lm85_data *data = lm85_update_device(dev); 490 + return sprintf(buf, "%u\n", (data->alarms >> nr) & 1); 491 + } 492 + 493 + static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0); 494 + static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1); 495 + static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2); 496 + static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3); 497 + static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8); 498 + static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 18); 499 + static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 16); 500 + static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 17); 501 + static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4); 502 + static SENSOR_DEVICE_ATTR(temp1_fault, S_IRUGO, show_alarm, NULL, 14); 503 + static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5); 504 + static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 6); 505 + static SENSOR_DEVICE_ATTR(temp3_fault, S_IRUGO, show_alarm, NULL, 15); 506 + static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 10); 507 + static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 11); 508 + static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 12); 509 + static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 13); 510 + 466 511 /* pwm */ 467 512 468 - static ssize_t show_pwm(struct device *dev, char *buf, int nr) 513 + static ssize_t show_pwm(struct device *dev, struct device_attribute *attr, 514 + char *buf) 469 515 { 516 + int nr = to_sensor_dev_attr(attr)->index; 470 517 struct lm85_data *data = lm85_update_device(dev); 471 518 return sprintf(buf,"%d\n", PWM_FROM_REG(data->pwm[nr]) ); 472 519 } 473 - static ssize_t set_pwm(struct device *dev, const char *buf, 474 - size_t count, int nr) 520 + 521 + static ssize_t set_pwm(struct device *dev, struct device_attribute *attr, 522 + const char *buf, size_t count) 475 523 { 524 + int nr = to_sensor_dev_attr(attr)->index; 476 525 struct i2c_client *client = to_i2c_client(dev); 477 526 struct lm85_data *data = i2c_get_clientdata(client); 478 527 long val = simple_strtol(buf, NULL, 10); ··· 513 502 mutex_unlock(&data->update_lock); 514 503 return count; 515 504 } 516 - static ssize_t show_pwm_enable(struct device *dev, char *buf, int nr) 505 + 506 + static ssize_t show_pwm_enable(struct device *dev, struct device_attribute 507 + *attr, char *buf) 517 508 { 509 + int nr = to_sensor_dev_attr(attr)->index; 518 510 struct lm85_data *data = lm85_update_device(dev); 519 511 int pwm_zone; 520 512 ··· 526 512 } 527 513 528 514 #define show_pwm_reg(offset) \ 529 - static ssize_t show_pwm_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ 530 - { \ 531 - return show_pwm(dev, buf, offset - 1); \ 532 - } \ 533 - static ssize_t set_pwm_##offset (struct device *dev, struct device_attribute *attr, \ 534 - const char *buf, size_t count) \ 535 - { \ 536 - return set_pwm(dev, buf, count, offset - 1); \ 537 - } \ 538 - static ssize_t show_pwm_enable##offset (struct device *dev, struct device_attribute *attr, char *buf) \ 539 - { \ 540 - return show_pwm_enable(dev, buf, offset - 1); \ 541 - } \ 542 - static DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \ 543 - show_pwm_##offset, set_pwm_##offset); \ 544 - static DEVICE_ATTR(pwm##offset##_enable, S_IRUGO, \ 545 - show_pwm_enable##offset, NULL); 515 + static SENSOR_DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \ 516 + show_pwm, set_pwm, offset - 1); \ 517 + static SENSOR_DEVICE_ATTR(pwm##offset##_enable, S_IRUGO, \ 518 + show_pwm_enable, NULL, offset - 1) 546 519 547 520 show_pwm_reg(1); 548 521 show_pwm_reg(2); ··· 537 536 538 537 /* Voltages */ 539 538 540 - static ssize_t show_in(struct device *dev, char *buf, int nr) 539 + static ssize_t show_in(struct device *dev, struct device_attribute *attr, 540 + char *buf) 541 541 { 542 + int nr = to_sensor_dev_attr(attr)->index; 542 543 struct lm85_data *data = lm85_update_device(dev); 543 544 return sprintf( buf, "%d\n", INSEXT_FROM_REG(nr, 544 545 data->in[nr], 545 - data->in_ext[nr], 546 - data->adc_scale) ); 546 + data->in_ext[nr])); 547 547 } 548 - static ssize_t show_in_min(struct device *dev, char *buf, int nr) 548 + 549 + static ssize_t show_in_min(struct device *dev, struct device_attribute *attr, 550 + char *buf) 549 551 { 552 + int nr = to_sensor_dev_attr(attr)->index; 550 553 struct lm85_data *data = lm85_update_device(dev); 551 554 return sprintf(buf,"%d\n", INS_FROM_REG(nr, data->in_min[nr]) ); 552 555 } 553 - static ssize_t set_in_min(struct device *dev, const char *buf, 554 - size_t count, int nr) 556 + 557 + static ssize_t set_in_min(struct device *dev, struct device_attribute *attr, 558 + const char *buf, size_t count) 555 559 { 560 + int nr = to_sensor_dev_attr(attr)->index; 556 561 struct i2c_client *client = to_i2c_client(dev); 557 562 struct lm85_data *data = i2c_get_clientdata(client); 558 563 long val = simple_strtol(buf, NULL, 10); ··· 569 562 mutex_unlock(&data->update_lock); 570 563 return count; 571 564 } 572 - static ssize_t show_in_max(struct device *dev, char *buf, int nr) 565 + 566 + static ssize_t show_in_max(struct device *dev, struct device_attribute *attr, 567 + char *buf) 573 568 { 569 + int nr = to_sensor_dev_attr(attr)->index; 574 570 struct lm85_data *data = lm85_update_device(dev); 575 571 return sprintf(buf,"%d\n", INS_FROM_REG(nr, data->in_max[nr]) ); 576 572 } 577 - static ssize_t set_in_max(struct device *dev, const char *buf, 578 - size_t count, int nr) 573 + 574 + static ssize_t set_in_max(struct device *dev, struct device_attribute *attr, 575 + const char *buf, size_t count) 579 576 { 577 + int nr = to_sensor_dev_attr(attr)->index; 580 578 struct i2c_client *client = to_i2c_client(dev); 581 579 struct lm85_data *data = i2c_get_clientdata(client); 582 580 long val = simple_strtol(buf, NULL, 10); ··· 592 580 mutex_unlock(&data->update_lock); 593 581 return count; 594 582 } 583 + 595 584 #define show_in_reg(offset) \ 596 - static ssize_t show_in_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ 597 - { \ 598 - return show_in(dev, buf, offset); \ 599 - } \ 600 - static ssize_t show_in_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf) \ 601 - { \ 602 - return show_in_min(dev, buf, offset); \ 603 - } \ 604 - static ssize_t show_in_##offset##_max (struct device *dev, struct device_attribute *attr, char *buf) \ 605 - { \ 606 - return show_in_max(dev, buf, offset); \ 607 - } \ 608 - static ssize_t set_in_##offset##_min (struct device *dev, struct device_attribute *attr, \ 609 - const char *buf, size_t count) \ 610 - { \ 611 - return set_in_min(dev, buf, count, offset); \ 612 - } \ 613 - static ssize_t set_in_##offset##_max (struct device *dev, struct device_attribute *attr, \ 614 - const char *buf, size_t count) \ 615 - { \ 616 - return set_in_max(dev, buf, count, offset); \ 617 - } \ 618 - static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in_##offset, \ 619 - NULL); \ 620 - static DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \ 621 - show_in_##offset##_min, set_in_##offset##_min); \ 622 - static DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \ 623 - show_in_##offset##_max, set_in_##offset##_max); 585 + static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \ 586 + show_in, NULL, offset); \ 587 + static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \ 588 + show_in_min, set_in_min, offset); \ 589 + static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \ 590 + show_in_max, set_in_max, offset) 624 591 625 592 show_in_reg(0); 626 593 show_in_reg(1); 627 594 show_in_reg(2); 628 595 show_in_reg(3); 629 596 show_in_reg(4); 597 + show_in_reg(5); 598 + show_in_reg(6); 599 + show_in_reg(7); 630 600 631 601 /* Temps */ 632 602 633 - static ssize_t show_temp(struct device *dev, char *buf, int nr) 603 + static ssize_t show_temp(struct device *dev, struct device_attribute *attr, 604 + char *buf) 634 605 { 606 + int nr = to_sensor_dev_attr(attr)->index; 635 607 struct lm85_data *data = lm85_update_device(dev); 636 608 return sprintf(buf,"%d\n", TEMPEXT_FROM_REG(data->temp[nr], 637 - data->temp_ext[nr], 638 - data->adc_scale) ); 609 + data->temp_ext[nr])); 639 610 } 640 - static ssize_t show_temp_min(struct device *dev, char *buf, int nr) 611 + 612 + static ssize_t show_temp_min(struct device *dev, struct device_attribute *attr, 613 + char *buf) 641 614 { 615 + int nr = to_sensor_dev_attr(attr)->index; 642 616 struct lm85_data *data = lm85_update_device(dev); 643 617 return sprintf(buf,"%d\n", TEMP_FROM_REG(data->temp_min[nr]) ); 644 618 } 645 - static ssize_t set_temp_min(struct device *dev, const char *buf, 646 - size_t count, int nr) 619 + 620 + static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr, 621 + const char *buf, size_t count) 647 622 { 623 + int nr = to_sensor_dev_attr(attr)->index; 648 624 struct i2c_client *client = to_i2c_client(dev); 649 625 struct lm85_data *data = i2c_get_clientdata(client); 650 626 long val = simple_strtol(buf, NULL, 10); ··· 643 643 mutex_unlock(&data->update_lock); 644 644 return count; 645 645 } 646 - static ssize_t show_temp_max(struct device *dev, char *buf, int nr) 646 + 647 + static ssize_t show_temp_max(struct device *dev, struct device_attribute *attr, 648 + char *buf) 647 649 { 650 + int nr = to_sensor_dev_attr(attr)->index; 648 651 struct lm85_data *data = lm85_update_device(dev); 649 652 return sprintf(buf,"%d\n", TEMP_FROM_REG(data->temp_max[nr]) ); 650 653 } 651 - static ssize_t set_temp_max(struct device *dev, const char *buf, 652 - size_t count, int nr) 654 + 655 + static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr, 656 + const char *buf, size_t count) 653 657 { 658 + int nr = to_sensor_dev_attr(attr)->index; 654 659 struct i2c_client *client = to_i2c_client(dev); 655 660 struct lm85_data *data = i2c_get_clientdata(client); 656 661 long val = simple_strtol(buf, NULL, 10); ··· 666 661 mutex_unlock(&data->update_lock); 667 662 return count; 668 663 } 664 + 669 665 #define show_temp_reg(offset) \ 670 - static ssize_t show_temp_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ 671 - { \ 672 - return show_temp(dev, buf, offset - 1); \ 673 - } \ 674 - static ssize_t show_temp_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf) \ 675 - { \ 676 - return show_temp_min(dev, buf, offset - 1); \ 677 - } \ 678 - static ssize_t show_temp_##offset##_max (struct device *dev, struct device_attribute *attr, char *buf) \ 679 - { \ 680 - return show_temp_max(dev, buf, offset - 1); \ 681 - } \ 682 - static ssize_t set_temp_##offset##_min (struct device *dev, struct device_attribute *attr, \ 683 - const char *buf, size_t count) \ 684 - { \ 685 - return set_temp_min(dev, buf, count, offset - 1); \ 686 - } \ 687 - static ssize_t set_temp_##offset##_max (struct device *dev, struct device_attribute *attr, \ 688 - const char *buf, size_t count) \ 689 - { \ 690 - return set_temp_max(dev, buf, count, offset - 1); \ 691 - } \ 692 - static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_temp_##offset, \ 693 - NULL); \ 694 - static DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR, \ 695 - show_temp_##offset##_min, set_temp_##offset##_min); \ 696 - static DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \ 697 - show_temp_##offset##_max, set_temp_##offset##_max); 666 + static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, \ 667 + show_temp, NULL, offset - 1); \ 668 + static SENSOR_DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR, \ 669 + show_temp_min, set_temp_min, offset - 1); \ 670 + static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \ 671 + show_temp_max, set_temp_max, offset - 1); 698 672 699 673 show_temp_reg(1); 700 674 show_temp_reg(2); ··· 682 698 683 699 /* Automatic PWM control */ 684 700 685 - static ssize_t show_pwm_auto_channels(struct device *dev, char *buf, int nr) 701 + static ssize_t show_pwm_auto_channels(struct device *dev, 702 + struct device_attribute *attr, char *buf) 686 703 { 704 + int nr = to_sensor_dev_attr(attr)->index; 687 705 struct lm85_data *data = lm85_update_device(dev); 688 706 return sprintf(buf,"%d\n", ZONE_FROM_REG(data->autofan[nr].config)); 689 707 } 690 - static ssize_t set_pwm_auto_channels(struct device *dev, const char *buf, 691 - size_t count, int nr) 708 + 709 + static ssize_t set_pwm_auto_channels(struct device *dev, 710 + struct device_attribute *attr, const char *buf, size_t count) 692 711 { 712 + int nr = to_sensor_dev_attr(attr)->index; 693 713 struct i2c_client *client = to_i2c_client(dev); 694 714 struct lm85_data *data = i2c_get_clientdata(client); 695 715 long val = simple_strtol(buf, NULL, 10); ··· 706 718 mutex_unlock(&data->update_lock); 707 719 return count; 708 720 } 709 - static ssize_t show_pwm_auto_pwm_min(struct device *dev, char *buf, int nr) 721 + 722 + static ssize_t show_pwm_auto_pwm_min(struct device *dev, 723 + struct device_attribute *attr, char *buf) 710 724 { 725 + int nr = to_sensor_dev_attr(attr)->index; 711 726 struct lm85_data *data = lm85_update_device(dev); 712 727 return sprintf(buf,"%d\n", PWM_FROM_REG(data->autofan[nr].min_pwm)); 713 728 } 714 - static ssize_t set_pwm_auto_pwm_min(struct device *dev, const char *buf, 715 - size_t count, int nr) 729 + 730 + static ssize_t set_pwm_auto_pwm_min(struct device *dev, 731 + struct device_attribute *attr, const char *buf, size_t count) 716 732 { 733 + int nr = to_sensor_dev_attr(attr)->index; 717 734 struct i2c_client *client = to_i2c_client(dev); 718 735 struct lm85_data *data = i2c_get_clientdata(client); 719 736 long val = simple_strtol(buf, NULL, 10); ··· 730 737 mutex_unlock(&data->update_lock); 731 738 return count; 732 739 } 733 - static ssize_t show_pwm_auto_pwm_minctl(struct device *dev, char *buf, int nr) 740 + 741 + static ssize_t show_pwm_auto_pwm_minctl(struct device *dev, 742 + struct device_attribute *attr, char *buf) 734 743 { 744 + int nr = to_sensor_dev_attr(attr)->index; 735 745 struct lm85_data *data = lm85_update_device(dev); 736 746 return sprintf(buf,"%d\n", data->autofan[nr].min_off); 737 747 } 738 - static ssize_t set_pwm_auto_pwm_minctl(struct device *dev, const char *buf, 739 - size_t count, int nr) 748 + 749 + static ssize_t set_pwm_auto_pwm_minctl(struct device *dev, 750 + struct device_attribute *attr, const char *buf, size_t count) 740 751 { 752 + int nr = to_sensor_dev_attr(attr)->index; 741 753 struct i2c_client *client = to_i2c_client(dev); 742 754 struct lm85_data *data = i2c_get_clientdata(client); 743 755 long val = simple_strtol(buf, NULL, 10); ··· 758 760 mutex_unlock(&data->update_lock); 759 761 return count; 760 762 } 761 - static ssize_t show_pwm_auto_pwm_freq(struct device *dev, char *buf, int nr) 763 + 764 + static ssize_t show_pwm_auto_pwm_freq(struct device *dev, 765 + struct device_attribute *attr, char *buf) 762 766 { 767 + int nr = to_sensor_dev_attr(attr)->index; 763 768 struct lm85_data *data = lm85_update_device(dev); 764 769 return sprintf(buf,"%d\n", FREQ_FROM_REG(data->autofan[nr].freq)); 765 770 } 766 - static ssize_t set_pwm_auto_pwm_freq(struct device *dev, const char *buf, 767 - size_t count, int nr) 771 + 772 + static ssize_t set_pwm_auto_pwm_freq(struct device *dev, 773 + struct device_attribute *attr, const char *buf, size_t count) 768 774 { 775 + int nr = to_sensor_dev_attr(attr)->index; 769 776 struct i2c_client *client = to_i2c_client(dev); 770 777 struct lm85_data *data = i2c_get_clientdata(client); 771 778 long val = simple_strtol(buf, NULL, 10); ··· 784 781 mutex_unlock(&data->update_lock); 785 782 return count; 786 783 } 784 + 787 785 #define pwm_auto(offset) \ 788 - static ssize_t show_pwm##offset##_auto_channels (struct device *dev, struct device_attribute *attr, \ 789 - char *buf) \ 790 - { \ 791 - return show_pwm_auto_channels(dev, buf, offset - 1); \ 792 - } \ 793 - static ssize_t set_pwm##offset##_auto_channels (struct device *dev, struct device_attribute *attr, \ 794 - const char *buf, size_t count) \ 795 - { \ 796 - return set_pwm_auto_channels(dev, buf, count, offset - 1); \ 797 - } \ 798 - static ssize_t show_pwm##offset##_auto_pwm_min (struct device *dev, struct device_attribute *attr, \ 799 - char *buf) \ 800 - { \ 801 - return show_pwm_auto_pwm_min(dev, buf, offset - 1); \ 802 - } \ 803 - static ssize_t set_pwm##offset##_auto_pwm_min (struct device *dev, struct device_attribute *attr, \ 804 - const char *buf, size_t count) \ 805 - { \ 806 - return set_pwm_auto_pwm_min(dev, buf, count, offset - 1); \ 807 - } \ 808 - static ssize_t show_pwm##offset##_auto_pwm_minctl (struct device *dev, struct device_attribute *attr, \ 809 - char *buf) \ 810 - { \ 811 - return show_pwm_auto_pwm_minctl(dev, buf, offset - 1); \ 812 - } \ 813 - static ssize_t set_pwm##offset##_auto_pwm_minctl (struct device *dev, struct device_attribute *attr, \ 814 - const char *buf, size_t count) \ 815 - { \ 816 - return set_pwm_auto_pwm_minctl(dev, buf, count, offset - 1); \ 817 - } \ 818 - static ssize_t show_pwm##offset##_auto_pwm_freq (struct device *dev, struct device_attribute *attr, \ 819 - char *buf) \ 820 - { \ 821 - return show_pwm_auto_pwm_freq(dev, buf, offset - 1); \ 822 - } \ 823 - static ssize_t set_pwm##offset##_auto_pwm_freq(struct device *dev, struct device_attribute *attr, \ 824 - const char *buf, size_t count) \ 825 - { \ 826 - return set_pwm_auto_pwm_freq(dev, buf, count, offset - 1); \ 827 - } \ 828 - static DEVICE_ATTR(pwm##offset##_auto_channels, S_IRUGO | S_IWUSR, \ 829 - show_pwm##offset##_auto_channels, \ 830 - set_pwm##offset##_auto_channels); \ 831 - static DEVICE_ATTR(pwm##offset##_auto_pwm_min, S_IRUGO | S_IWUSR, \ 832 - show_pwm##offset##_auto_pwm_min, \ 833 - set_pwm##offset##_auto_pwm_min); \ 834 - static DEVICE_ATTR(pwm##offset##_auto_pwm_minctl, S_IRUGO | S_IWUSR, \ 835 - show_pwm##offset##_auto_pwm_minctl, \ 836 - set_pwm##offset##_auto_pwm_minctl); \ 837 - static DEVICE_ATTR(pwm##offset##_auto_pwm_freq, S_IRUGO | S_IWUSR, \ 838 - show_pwm##offset##_auto_pwm_freq, \ 839 - set_pwm##offset##_auto_pwm_freq); 786 + static SENSOR_DEVICE_ATTR(pwm##offset##_auto_channels, \ 787 + S_IRUGO | S_IWUSR, show_pwm_auto_channels, \ 788 + set_pwm_auto_channels, offset - 1); \ 789 + static SENSOR_DEVICE_ATTR(pwm##offset##_auto_pwm_min, \ 790 + S_IRUGO | S_IWUSR, show_pwm_auto_pwm_min, \ 791 + set_pwm_auto_pwm_min, offset - 1); \ 792 + static SENSOR_DEVICE_ATTR(pwm##offset##_auto_pwm_minctl, \ 793 + S_IRUGO | S_IWUSR, show_pwm_auto_pwm_minctl, \ 794 + set_pwm_auto_pwm_minctl, offset - 1); \ 795 + static SENSOR_DEVICE_ATTR(pwm##offset##_auto_pwm_freq, \ 796 + S_IRUGO | S_IWUSR, show_pwm_auto_pwm_freq, \ 797 + set_pwm_auto_pwm_freq, offset - 1); 798 + 840 799 pwm_auto(1); 841 800 pwm_auto(2); 842 801 pwm_auto(3); 843 802 844 803 /* Temperature settings for automatic PWM control */ 845 804 846 - static ssize_t show_temp_auto_temp_off(struct device *dev, char *buf, int nr) 805 + static ssize_t show_temp_auto_temp_off(struct device *dev, 806 + struct device_attribute *attr, char *buf) 847 807 { 808 + int nr = to_sensor_dev_attr(attr)->index; 848 809 struct lm85_data *data = lm85_update_device(dev); 849 810 return sprintf(buf,"%d\n", TEMP_FROM_REG(data->zone[nr].limit) - 850 811 HYST_FROM_REG(data->zone[nr].hyst)); 851 812 } 852 - static ssize_t set_temp_auto_temp_off(struct device *dev, const char *buf, 853 - size_t count, int nr) 813 + 814 + static ssize_t set_temp_auto_temp_off(struct device *dev, 815 + struct device_attribute *attr, const char *buf, size_t count) 854 816 { 817 + int nr = to_sensor_dev_attr(attr)->index; 855 818 struct i2c_client *client = to_i2c_client(dev); 856 819 struct lm85_data *data = i2c_get_clientdata(client); 857 820 int min; ··· 840 871 mutex_unlock(&data->update_lock); 841 872 return count; 842 873 } 843 - static ssize_t show_temp_auto_temp_min(struct device *dev, char *buf, int nr) 874 + 875 + static ssize_t show_temp_auto_temp_min(struct device *dev, 876 + struct device_attribute *attr, char *buf) 844 877 { 878 + int nr = to_sensor_dev_attr(attr)->index; 845 879 struct lm85_data *data = lm85_update_device(dev); 846 880 return sprintf(buf,"%d\n", TEMP_FROM_REG(data->zone[nr].limit) ); 847 881 } 848 - static ssize_t set_temp_auto_temp_min(struct device *dev, const char *buf, 849 - size_t count, int nr) 882 + 883 + static ssize_t set_temp_auto_temp_min(struct device *dev, 884 + struct device_attribute *attr, const char *buf, size_t count) 850 885 { 886 + int nr = to_sensor_dev_attr(attr)->index; 851 887 struct i2c_client *client = to_i2c_client(dev); 852 888 struct lm85_data *data = i2c_get_clientdata(client); 853 889 long val = simple_strtol(buf, NULL, 10); ··· 887 913 mutex_unlock(&data->update_lock); 888 914 return count; 889 915 } 890 - static ssize_t show_temp_auto_temp_max(struct device *dev, char *buf, int nr) 916 + 917 + static ssize_t show_temp_auto_temp_max(struct device *dev, 918 + struct device_attribute *attr, char *buf) 891 919 { 920 + int nr = to_sensor_dev_attr(attr)->index; 892 921 struct lm85_data *data = lm85_update_device(dev); 893 922 return sprintf(buf,"%d\n", TEMP_FROM_REG(data->zone[nr].limit) + 894 923 RANGE_FROM_REG(data->zone[nr].range)); 895 924 } 896 - static ssize_t set_temp_auto_temp_max(struct device *dev, const char *buf, 897 - size_t count, int nr) 925 + 926 + static ssize_t set_temp_auto_temp_max(struct device *dev, 927 + struct device_attribute *attr, const char *buf, size_t count) 898 928 { 929 + int nr = to_sensor_dev_attr(attr)->index; 899 930 struct i2c_client *client = to_i2c_client(dev); 900 931 struct lm85_data *data = i2c_get_clientdata(client); 901 932 int min; ··· 917 938 mutex_unlock(&data->update_lock); 918 939 return count; 919 940 } 920 - static ssize_t show_temp_auto_temp_crit(struct device *dev, char *buf, int nr) 941 + 942 + static ssize_t show_temp_auto_temp_crit(struct device *dev, 943 + struct device_attribute *attr, char *buf) 921 944 { 945 + int nr = to_sensor_dev_attr(attr)->index; 922 946 struct lm85_data *data = lm85_update_device(dev); 923 947 return sprintf(buf,"%d\n", TEMP_FROM_REG(data->zone[nr].critical)); 924 948 } 925 - static ssize_t set_temp_auto_temp_crit(struct device *dev, const char *buf, 926 - size_t count, int nr) 949 + 950 + static ssize_t set_temp_auto_temp_crit(struct device *dev, 951 + struct device_attribute *attr,const char *buf, size_t count) 927 952 { 953 + int nr = to_sensor_dev_attr(attr)->index; 928 954 struct i2c_client *client = to_i2c_client(dev); 929 955 struct lm85_data *data = i2c_get_clientdata(client); 930 956 long val = simple_strtol(buf, NULL, 10); ··· 941 957 mutex_unlock(&data->update_lock); 942 958 return count; 943 959 } 960 + 944 961 #define temp_auto(offset) \ 945 - static ssize_t show_temp##offset##_auto_temp_off (struct device *dev, struct device_attribute *attr, \ 946 - char *buf) \ 947 - { \ 948 - return show_temp_auto_temp_off(dev, buf, offset - 1); \ 949 - } \ 950 - static ssize_t set_temp##offset##_auto_temp_off (struct device *dev, struct device_attribute *attr, \ 951 - const char *buf, size_t count) \ 952 - { \ 953 - return set_temp_auto_temp_off(dev, buf, count, offset - 1); \ 954 - } \ 955 - static ssize_t show_temp##offset##_auto_temp_min (struct device *dev, struct device_attribute *attr, \ 956 - char *buf) \ 957 - { \ 958 - return show_temp_auto_temp_min(dev, buf, offset - 1); \ 959 - } \ 960 - static ssize_t set_temp##offset##_auto_temp_min (struct device *dev, struct device_attribute *attr, \ 961 - const char *buf, size_t count) \ 962 - { \ 963 - return set_temp_auto_temp_min(dev, buf, count, offset - 1); \ 964 - } \ 965 - static ssize_t show_temp##offset##_auto_temp_max (struct device *dev, struct device_attribute *attr, \ 966 - char *buf) \ 967 - { \ 968 - return show_temp_auto_temp_max(dev, buf, offset - 1); \ 969 - } \ 970 - static ssize_t set_temp##offset##_auto_temp_max (struct device *dev, struct device_attribute *attr, \ 971 - const char *buf, size_t count) \ 972 - { \ 973 - return set_temp_auto_temp_max(dev, buf, count, offset - 1); \ 974 - } \ 975 - static ssize_t show_temp##offset##_auto_temp_crit (struct device *dev, struct device_attribute *attr, \ 976 - char *buf) \ 977 - { \ 978 - return show_temp_auto_temp_crit(dev, buf, offset - 1); \ 979 - } \ 980 - static ssize_t set_temp##offset##_auto_temp_crit (struct device *dev, struct device_attribute *attr, \ 981 - const char *buf, size_t count) \ 982 - { \ 983 - return set_temp_auto_temp_crit(dev, buf, count, offset - 1); \ 984 - } \ 985 - static DEVICE_ATTR(temp##offset##_auto_temp_off, S_IRUGO | S_IWUSR, \ 986 - show_temp##offset##_auto_temp_off, \ 987 - set_temp##offset##_auto_temp_off); \ 988 - static DEVICE_ATTR(temp##offset##_auto_temp_min, S_IRUGO | S_IWUSR, \ 989 - show_temp##offset##_auto_temp_min, \ 990 - set_temp##offset##_auto_temp_min); \ 991 - static DEVICE_ATTR(temp##offset##_auto_temp_max, S_IRUGO | S_IWUSR, \ 992 - show_temp##offset##_auto_temp_max, \ 993 - set_temp##offset##_auto_temp_max); \ 994 - static DEVICE_ATTR(temp##offset##_auto_temp_crit, S_IRUGO | S_IWUSR, \ 995 - show_temp##offset##_auto_temp_crit, \ 996 - set_temp##offset##_auto_temp_crit); 962 + static SENSOR_DEVICE_ATTR(temp##offset##_auto_temp_off, \ 963 + S_IRUGO | S_IWUSR, show_temp_auto_temp_off, \ 964 + set_temp_auto_temp_off, offset - 1); \ 965 + static SENSOR_DEVICE_ATTR(temp##offset##_auto_temp_min, \ 966 + S_IRUGO | S_IWUSR, show_temp_auto_temp_min, \ 967 + set_temp_auto_temp_min, offset - 1); \ 968 + static SENSOR_DEVICE_ATTR(temp##offset##_auto_temp_max, \ 969 + S_IRUGO | S_IWUSR, show_temp_auto_temp_max, \ 970 + set_temp_auto_temp_max, offset - 1); \ 971 + static SENSOR_DEVICE_ATTR(temp##offset##_auto_temp_crit, \ 972 + S_IRUGO | S_IWUSR, show_temp_auto_temp_crit, \ 973 + set_temp_auto_temp_crit, offset - 1); 974 + 997 975 temp_auto(1); 998 976 temp_auto(2); 999 977 temp_auto(3); ··· 968 1022 } 969 1023 970 1024 static struct attribute *lm85_attributes[] = { 971 - &dev_attr_fan1_input.attr, 972 - &dev_attr_fan2_input.attr, 973 - &dev_attr_fan3_input.attr, 974 - &dev_attr_fan4_input.attr, 975 - &dev_attr_fan1_min.attr, 976 - &dev_attr_fan2_min.attr, 977 - &dev_attr_fan3_min.attr, 978 - &dev_attr_fan4_min.attr, 979 - &dev_attr_pwm1.attr, 980 - &dev_attr_pwm2.attr, 981 - &dev_attr_pwm3.attr, 982 - &dev_attr_pwm1_enable.attr, 983 - &dev_attr_pwm2_enable.attr, 984 - &dev_attr_pwm3_enable.attr, 985 - &dev_attr_in0_input.attr, 986 - &dev_attr_in1_input.attr, 987 - &dev_attr_in2_input.attr, 988 - &dev_attr_in3_input.attr, 989 - &dev_attr_in0_min.attr, 990 - &dev_attr_in1_min.attr, 991 - &dev_attr_in2_min.attr, 992 - &dev_attr_in3_min.attr, 993 - &dev_attr_in0_max.attr, 994 - &dev_attr_in1_max.attr, 995 - &dev_attr_in2_max.attr, 996 - &dev_attr_in3_max.attr, 997 - &dev_attr_temp1_input.attr, 998 - &dev_attr_temp2_input.attr, 999 - &dev_attr_temp3_input.attr, 1000 - &dev_attr_temp1_min.attr, 1001 - &dev_attr_temp2_min.attr, 1002 - &dev_attr_temp3_min.attr, 1003 - &dev_attr_temp1_max.attr, 1004 - &dev_attr_temp2_max.attr, 1005 - &dev_attr_temp3_max.attr, 1025 + &sensor_dev_attr_fan1_input.dev_attr.attr, 1026 + &sensor_dev_attr_fan2_input.dev_attr.attr, 1027 + &sensor_dev_attr_fan3_input.dev_attr.attr, 1028 + &sensor_dev_attr_fan4_input.dev_attr.attr, 1029 + &sensor_dev_attr_fan1_min.dev_attr.attr, 1030 + &sensor_dev_attr_fan2_min.dev_attr.attr, 1031 + &sensor_dev_attr_fan3_min.dev_attr.attr, 1032 + &sensor_dev_attr_fan4_min.dev_attr.attr, 1033 + &sensor_dev_attr_fan1_alarm.dev_attr.attr, 1034 + &sensor_dev_attr_fan2_alarm.dev_attr.attr, 1035 + &sensor_dev_attr_fan3_alarm.dev_attr.attr, 1036 + &sensor_dev_attr_fan4_alarm.dev_attr.attr, 1037 + 1038 + &sensor_dev_attr_pwm1.dev_attr.attr, 1039 + &sensor_dev_attr_pwm2.dev_attr.attr, 1040 + &sensor_dev_attr_pwm3.dev_attr.attr, 1041 + &sensor_dev_attr_pwm1_enable.dev_attr.attr, 1042 + &sensor_dev_attr_pwm2_enable.dev_attr.attr, 1043 + &sensor_dev_attr_pwm3_enable.dev_attr.attr, 1044 + 1045 + &sensor_dev_attr_in0_input.dev_attr.attr, 1046 + &sensor_dev_attr_in1_input.dev_attr.attr, 1047 + &sensor_dev_attr_in2_input.dev_attr.attr, 1048 + &sensor_dev_attr_in3_input.dev_attr.attr, 1049 + &sensor_dev_attr_in0_min.dev_attr.attr, 1050 + &sensor_dev_attr_in1_min.dev_attr.attr, 1051 + &sensor_dev_attr_in2_min.dev_attr.attr, 1052 + &sensor_dev_attr_in3_min.dev_attr.attr, 1053 + &sensor_dev_attr_in0_max.dev_attr.attr, 1054 + &sensor_dev_attr_in1_max.dev_attr.attr, 1055 + &sensor_dev_attr_in2_max.dev_attr.attr, 1056 + &sensor_dev_attr_in3_max.dev_attr.attr, 1057 + &sensor_dev_attr_in0_alarm.dev_attr.attr, 1058 + &sensor_dev_attr_in1_alarm.dev_attr.attr, 1059 + &sensor_dev_attr_in2_alarm.dev_attr.attr, 1060 + &sensor_dev_attr_in3_alarm.dev_attr.attr, 1061 + 1062 + &sensor_dev_attr_temp1_input.dev_attr.attr, 1063 + &sensor_dev_attr_temp2_input.dev_attr.attr, 1064 + &sensor_dev_attr_temp3_input.dev_attr.attr, 1065 + &sensor_dev_attr_temp1_min.dev_attr.attr, 1066 + &sensor_dev_attr_temp2_min.dev_attr.attr, 1067 + &sensor_dev_attr_temp3_min.dev_attr.attr, 1068 + &sensor_dev_attr_temp1_max.dev_attr.attr, 1069 + &sensor_dev_attr_temp2_max.dev_attr.attr, 1070 + &sensor_dev_attr_temp3_max.dev_attr.attr, 1071 + &sensor_dev_attr_temp1_alarm.dev_attr.attr, 1072 + &sensor_dev_attr_temp2_alarm.dev_attr.attr, 1073 + &sensor_dev_attr_temp3_alarm.dev_attr.attr, 1074 + &sensor_dev_attr_temp1_fault.dev_attr.attr, 1075 + &sensor_dev_attr_temp3_fault.dev_attr.attr, 1076 + 1077 + &sensor_dev_attr_pwm1_auto_channels.dev_attr.attr, 1078 + &sensor_dev_attr_pwm2_auto_channels.dev_attr.attr, 1079 + &sensor_dev_attr_pwm3_auto_channels.dev_attr.attr, 1080 + &sensor_dev_attr_pwm1_auto_pwm_min.dev_attr.attr, 1081 + &sensor_dev_attr_pwm2_auto_pwm_min.dev_attr.attr, 1082 + &sensor_dev_attr_pwm3_auto_pwm_min.dev_attr.attr, 1083 + &sensor_dev_attr_pwm1_auto_pwm_minctl.dev_attr.attr, 1084 + &sensor_dev_attr_pwm2_auto_pwm_minctl.dev_attr.attr, 1085 + &sensor_dev_attr_pwm3_auto_pwm_minctl.dev_attr.attr, 1086 + &sensor_dev_attr_pwm1_auto_pwm_freq.dev_attr.attr, 1087 + &sensor_dev_attr_pwm2_auto_pwm_freq.dev_attr.attr, 1088 + &sensor_dev_attr_pwm3_auto_pwm_freq.dev_attr.attr, 1089 + 1090 + &sensor_dev_attr_temp1_auto_temp_off.dev_attr.attr, 1091 + &sensor_dev_attr_temp2_auto_temp_off.dev_attr.attr, 1092 + &sensor_dev_attr_temp3_auto_temp_off.dev_attr.attr, 1093 + &sensor_dev_attr_temp1_auto_temp_min.dev_attr.attr, 1094 + &sensor_dev_attr_temp2_auto_temp_min.dev_attr.attr, 1095 + &sensor_dev_attr_temp3_auto_temp_min.dev_attr.attr, 1096 + &sensor_dev_attr_temp1_auto_temp_max.dev_attr.attr, 1097 + &sensor_dev_attr_temp2_auto_temp_max.dev_attr.attr, 1098 + &sensor_dev_attr_temp3_auto_temp_max.dev_attr.attr, 1099 + &sensor_dev_attr_temp1_auto_temp_crit.dev_attr.attr, 1100 + &sensor_dev_attr_temp2_auto_temp_crit.dev_attr.attr, 1101 + &sensor_dev_attr_temp3_auto_temp_crit.dev_attr.attr, 1102 + 1006 1103 &dev_attr_vrm.attr, 1007 1104 &dev_attr_cpu0_vid.attr, 1008 1105 &dev_attr_alarms.attr, 1009 - &dev_attr_pwm1_auto_channels.attr, 1010 - &dev_attr_pwm2_auto_channels.attr, 1011 - &dev_attr_pwm3_auto_channels.attr, 1012 - &dev_attr_pwm1_auto_pwm_min.attr, 1013 - &dev_attr_pwm2_auto_pwm_min.attr, 1014 - &dev_attr_pwm3_auto_pwm_min.attr, 1015 - &dev_attr_pwm1_auto_pwm_minctl.attr, 1016 - &dev_attr_pwm2_auto_pwm_minctl.attr, 1017 - &dev_attr_pwm3_auto_pwm_minctl.attr, 1018 - &dev_attr_pwm1_auto_pwm_freq.attr, 1019 - &dev_attr_pwm2_auto_pwm_freq.attr, 1020 - &dev_attr_pwm3_auto_pwm_freq.attr, 1021 - &dev_attr_temp1_auto_temp_off.attr, 1022 - &dev_attr_temp2_auto_temp_off.attr, 1023 - &dev_attr_temp3_auto_temp_off.attr, 1024 - &dev_attr_temp1_auto_temp_min.attr, 1025 - &dev_attr_temp2_auto_temp_min.attr, 1026 - &dev_attr_temp3_auto_temp_min.attr, 1027 - &dev_attr_temp1_auto_temp_max.attr, 1028 - &dev_attr_temp2_auto_temp_max.attr, 1029 - &dev_attr_temp3_auto_temp_max.attr, 1030 - &dev_attr_temp1_auto_temp_crit.attr, 1031 - &dev_attr_temp2_auto_temp_crit.attr, 1032 - &dev_attr_temp3_auto_temp_crit.attr, 1033 - 1034 1106 NULL 1035 1107 }; 1036 1108 ··· 1056 1092 .attrs = lm85_attributes, 1057 1093 }; 1058 1094 1059 - static struct attribute *lm85_attributes_opt[] = { 1060 - &dev_attr_in4_input.attr, 1061 - &dev_attr_in4_min.attr, 1062 - &dev_attr_in4_max.attr, 1063 - 1095 + static struct attribute *lm85_attributes_in4[] = { 1096 + &sensor_dev_attr_in4_input.dev_attr.attr, 1097 + &sensor_dev_attr_in4_min.dev_attr.attr, 1098 + &sensor_dev_attr_in4_max.dev_attr.attr, 1099 + &sensor_dev_attr_in4_alarm.dev_attr.attr, 1064 1100 NULL 1065 1101 }; 1066 1102 1067 - static const struct attribute_group lm85_group_opt = { 1068 - .attrs = lm85_attributes_opt, 1103 + static const struct attribute_group lm85_group_in4 = { 1104 + .attrs = lm85_attributes_in4, 1105 + }; 1106 + 1107 + static struct attribute *lm85_attributes_in567[] = { 1108 + &sensor_dev_attr_in5_input.dev_attr.attr, 1109 + &sensor_dev_attr_in6_input.dev_attr.attr, 1110 + &sensor_dev_attr_in7_input.dev_attr.attr, 1111 + &sensor_dev_attr_in5_min.dev_attr.attr, 1112 + &sensor_dev_attr_in6_min.dev_attr.attr, 1113 + &sensor_dev_attr_in7_min.dev_attr.attr, 1114 + &sensor_dev_attr_in5_max.dev_attr.attr, 1115 + &sensor_dev_attr_in6_max.dev_attr.attr, 1116 + &sensor_dev_attr_in7_max.dev_attr.attr, 1117 + &sensor_dev_attr_in5_alarm.dev_attr.attr, 1118 + &sensor_dev_attr_in6_alarm.dev_attr.attr, 1119 + &sensor_dev_attr_in7_alarm.dev_attr.attr, 1120 + NULL 1121 + }; 1122 + 1123 + static const struct attribute_group lm85_group_in567 = { 1124 + .attrs = lm85_attributes_in567, 1069 1125 }; 1070 1126 1071 1127 static int lm85_detect(struct i2c_adapter *adapter, int address, ··· 1233 1249 as a sixth digital VID input rather than an analog input. */ 1234 1250 data->vid = lm85_read_value(new_client, LM85_REG_VID); 1235 1251 if (!(kind == adt7463 && (data->vid & 0x80))) 1236 - if ((err = device_create_file(&new_client->dev, 1237 - &dev_attr_in4_input)) 1238 - || (err = device_create_file(&new_client->dev, 1239 - &dev_attr_in4_min)) 1240 - || (err = device_create_file(&new_client->dev, 1241 - &dev_attr_in4_max))) 1252 + if ((err = sysfs_create_group(&new_client->dev.kobj, 1253 + &lm85_group_in4))) 1242 1254 goto ERROR3; 1243 1255 1244 - data->class_dev = hwmon_device_register(&new_client->dev); 1245 - if (IS_ERR(data->class_dev)) { 1246 - err = PTR_ERR(data->class_dev); 1256 + /* The EMC6D100 has 3 additional voltage inputs */ 1257 + if (kind == emc6d100) 1258 + if ((err = sysfs_create_group(&new_client->dev.kobj, 1259 + &lm85_group_in567))) 1260 + goto ERROR3; 1261 + 1262 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 1263 + if (IS_ERR(data->hwmon_dev)) { 1264 + err = PTR_ERR(data->hwmon_dev); 1247 1265 goto ERROR3; 1248 1266 } 1249 1267 ··· 1254 1268 /* Error out and cleanup code */ 1255 1269 ERROR3: 1256 1270 sysfs_remove_group(&new_client->dev.kobj, &lm85_group); 1257 - sysfs_remove_group(&new_client->dev.kobj, &lm85_group_opt); 1271 + sysfs_remove_group(&new_client->dev.kobj, &lm85_group_in4); 1272 + if (kind == emc6d100) 1273 + sysfs_remove_group(&new_client->dev.kobj, &lm85_group_in567); 1258 1274 ERROR2: 1259 1275 i2c_detach_client(new_client); 1260 1276 ERROR1: ··· 1268 1280 static int lm85_detach_client(struct i2c_client *client) 1269 1281 { 1270 1282 struct lm85_data *data = i2c_get_clientdata(client); 1271 - hwmon_device_unregister(data->class_dev); 1283 + hwmon_device_unregister(data->hwmon_dev); 1272 1284 sysfs_remove_group(&client->dev.kobj, &lm85_group); 1273 - sysfs_remove_group(&client->dev.kobj, &lm85_group_opt); 1285 + sysfs_remove_group(&client->dev.kobj, &lm85_group_in4); 1286 + if (data->type == emc6d100) 1287 + sysfs_remove_group(&client->dev.kobj, &lm85_group_in567); 1274 1288 i2c_detach_client(client); 1275 1289 kfree(data); 1276 1290 return 0; ··· 1395 1405 1396 1406 /* Have to read extended bits first to "freeze" the 1397 1407 * more significant bits that are read later. 1408 + * There are 2 additional resolution bits per channel and we 1409 + * have room for 4, so we shift them to the left. 1398 1410 */ 1399 1411 if ( (data->type == adm1027) || (data->type == adt7463) ) { 1400 1412 int ext1 = lm85_read_value(client, ··· 1406 1414 int val = (ext1 << 8) + ext2; 1407 1415 1408 1416 for(i = 0; i <= 4; i++) 1409 - data->in_ext[i] = (val>>(i * 2))&0x03; 1417 + data->in_ext[i] = ((val>>(i * 2))&0x03) << 2; 1410 1418 1411 1419 for(i = 0; i <= 2; i++) 1412 - data->temp_ext[i] = (val>>((i + 5) * 2))&0x03; 1420 + data->temp_ext[i] = (val>>((i + 4) * 2))&0x0c; 1413 1421 } 1414 - 1415 - /* adc_scale is 2^(number of LSBs). There are 4 extra bits in 1416 - the emc6d102 and 2 in the adt7463 and adm1027. In all 1417 - other chips ext is always 0 and the value of scale is 1418 - irrelevant. So it is left in 4*/ 1419 - data->adc_scale = (data->type == emc6d102 ) ? 16 : 4; 1420 1422 1421 1423 data->vid = lm85_read_value(client, LM85_REG_VID); 1422 1424
+69 -14
drivers/hwmon/lm87.c
··· 58 58 #include <linux/jiffies.h> 59 59 #include <linux/i2c.h> 60 60 #include <linux/hwmon.h> 61 + #include <linux/hwmon-sysfs.h> 61 62 #include <linux/hwmon-vid.h> 62 63 #include <linux/err.h> 63 64 #include <linux/mutex.h> ··· 130 129 (((val) < 0 ? (val)-500 : (val)+500) / 1000)) 131 130 132 131 #define FAN_FROM_REG(reg,div) ((reg) == 255 || (reg) == 0 ? 0 : \ 133 - 1350000 + (reg)*(div) / 2) / ((reg)*(div)) 132 + (1350000 + (reg)*(div) / 2) / ((reg)*(div))) 134 133 #define FAN_TO_REG(val,div) ((val)*(div) * 255 <= 1350000 ? 255 : \ 135 134 (1350000 + (val)*(div) / 2) / ((val)*(div))) 136 135 ··· 146 145 #define CHAN_NO_FAN(nr) (1 << (nr)) 147 146 #define CHAN_TEMP3 (1 << 2) 148 147 #define CHAN_VCC_5V (1 << 3) 149 - #define CHAN_NO_VID (1 << 8) 148 + #define CHAN_NO_VID (1 << 7) 150 149 151 150 /* 152 151 * Functions declaration ··· 177 176 178 177 struct lm87_data { 179 178 struct i2c_client client; 180 - struct class_device *class_dev; 179 + struct device *hwmon_dev; 181 180 struct mutex update_lock; 182 181 char valid; /* zero until following fields are valid */ 183 182 unsigned long last_updated; /* In jiffies */ ··· 501 500 502 501 static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf) 503 502 { 504 - struct lm87_data *data = lm87_update_device(dev); 503 + struct lm87_data *data = dev_get_drvdata(dev); 505 504 return sprintf(buf, "%d\n", data->vrm); 506 505 } 507 506 static ssize_t set_vrm(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) ··· 532 531 } 533 532 static DEVICE_ATTR(aout_output, S_IRUGO | S_IWUSR, show_aout, set_aout); 534 533 534 + static ssize_t show_alarm(struct device *dev, struct device_attribute *attr, 535 + char *buf) 536 + { 537 + struct lm87_data *data = lm87_update_device(dev); 538 + int bitnr = to_sensor_dev_attr(attr)->index; 539 + return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1); 540 + } 541 + static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0); 542 + static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1); 543 + static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2); 544 + static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3); 545 + static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8); 546 + static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9); 547 + static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 6); 548 + static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 7); 549 + static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4); 550 + static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5); 551 + static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 5); 552 + static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6); 553 + static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7); 554 + static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_alarm, NULL, 14); 555 + static SENSOR_DEVICE_ATTR(temp3_fault, S_IRUGO, show_alarm, NULL, 15); 556 + 535 557 /* 536 558 * Real code 537 559 */ ··· 570 546 &dev_attr_in1_input.attr, 571 547 &dev_attr_in1_min.attr, 572 548 &dev_attr_in1_max.attr, 549 + &sensor_dev_attr_in1_alarm.dev_attr.attr, 573 550 &dev_attr_in2_input.attr, 574 551 &dev_attr_in2_min.attr, 575 552 &dev_attr_in2_max.attr, 553 + &sensor_dev_attr_in2_alarm.dev_attr.attr, 576 554 &dev_attr_in3_input.attr, 577 555 &dev_attr_in3_min.attr, 578 556 &dev_attr_in3_max.attr, 557 + &sensor_dev_attr_in3_alarm.dev_attr.attr, 579 558 &dev_attr_in4_input.attr, 580 559 &dev_attr_in4_min.attr, 581 560 &dev_attr_in4_max.attr, 561 + &sensor_dev_attr_in4_alarm.dev_attr.attr, 582 562 583 563 &dev_attr_temp1_input.attr, 584 564 &dev_attr_temp1_max.attr, 585 565 &dev_attr_temp1_min.attr, 586 566 &dev_attr_temp1_crit.attr, 567 + &sensor_dev_attr_temp1_alarm.dev_attr.attr, 587 568 &dev_attr_temp2_input.attr, 588 569 &dev_attr_temp2_max.attr, 589 570 &dev_attr_temp2_min.attr, 590 571 &dev_attr_temp2_crit.attr, 572 + &sensor_dev_attr_temp2_alarm.dev_attr.attr, 573 + &sensor_dev_attr_temp2_fault.dev_attr.attr, 591 574 592 575 &dev_attr_alarms.attr, 593 576 &dev_attr_aout_output.attr, ··· 610 579 &dev_attr_in6_input.attr, 611 580 &dev_attr_in6_min.attr, 612 581 &dev_attr_in6_max.attr, 582 + &sensor_dev_attr_in6_alarm.dev_attr.attr, 613 583 614 584 &dev_attr_fan1_input.attr, 615 585 &dev_attr_fan1_min.attr, 616 586 &dev_attr_fan1_div.attr, 587 + &sensor_dev_attr_fan1_alarm.dev_attr.attr, 617 588 618 589 &dev_attr_in7_input.attr, 619 590 &dev_attr_in7_min.attr, 620 591 &dev_attr_in7_max.attr, 592 + &sensor_dev_attr_in7_alarm.dev_attr.attr, 621 593 622 594 &dev_attr_fan2_input.attr, 623 595 &dev_attr_fan2_min.attr, 624 596 &dev_attr_fan2_div.attr, 597 + &sensor_dev_attr_fan2_alarm.dev_attr.attr, 625 598 626 599 &dev_attr_temp3_input.attr, 627 600 &dev_attr_temp3_max.attr, 628 601 &dev_attr_temp3_min.attr, 629 602 &dev_attr_temp3_crit.attr, 603 + &sensor_dev_attr_temp3_alarm.dev_attr.attr, 604 + &sensor_dev_attr_temp3_fault.dev_attr.attr, 630 605 631 606 &dev_attr_in0_input.attr, 632 607 &dev_attr_in0_min.attr, 633 608 &dev_attr_in0_max.attr, 609 + &sensor_dev_attr_in0_alarm.dev_attr.attr, 634 610 &dev_attr_in5_input.attr, 635 611 &dev_attr_in5_min.attr, 636 612 &dev_attr_in5_max.attr, 613 + &sensor_dev_attr_in5_alarm.dev_attr.attr, 637 614 638 615 &dev_attr_cpu0_vid.attr, 639 616 &dev_attr_vrm.attr, ··· 729 690 || (err = device_create_file(&new_client->dev, 730 691 &dev_attr_in6_min)) 731 692 || (err = device_create_file(&new_client->dev, 732 - &dev_attr_in6_max))) 693 + &dev_attr_in6_max)) 694 + || (err = device_create_file(&new_client->dev, 695 + &sensor_dev_attr_in6_alarm.dev_attr))) 733 696 goto exit_remove; 734 697 } else { 735 698 if ((err = device_create_file(&new_client->dev, ··· 739 698 || (err = device_create_file(&new_client->dev, 740 699 &dev_attr_fan1_min)) 741 700 || (err = device_create_file(&new_client->dev, 742 - &dev_attr_fan1_div))) 701 + &dev_attr_fan1_div)) 702 + || (err = device_create_file(&new_client->dev, 703 + &sensor_dev_attr_fan1_alarm.dev_attr))) 743 704 goto exit_remove; 744 705 } 745 706 ··· 751 708 || (err = device_create_file(&new_client->dev, 752 709 &dev_attr_in7_min)) 753 710 || (err = device_create_file(&new_client->dev, 754 - &dev_attr_in7_max))) 711 + &dev_attr_in7_max)) 712 + || (err = device_create_file(&new_client->dev, 713 + &sensor_dev_attr_in7_alarm.dev_attr))) 755 714 goto exit_remove; 756 715 } else { 757 716 if ((err = device_create_file(&new_client->dev, ··· 761 716 || (err = device_create_file(&new_client->dev, 762 717 &dev_attr_fan2_min)) 763 718 || (err = device_create_file(&new_client->dev, 764 - &dev_attr_fan2_div))) 719 + &dev_attr_fan2_div)) 720 + || (err = device_create_file(&new_client->dev, 721 + &sensor_dev_attr_fan2_alarm.dev_attr))) 765 722 goto exit_remove; 766 723 } 767 724 ··· 775 728 || (err = device_create_file(&new_client->dev, 776 729 &dev_attr_temp3_min)) 777 730 || (err = device_create_file(&new_client->dev, 778 - &dev_attr_temp3_crit))) 731 + &dev_attr_temp3_crit)) 732 + || (err = device_create_file(&new_client->dev, 733 + &sensor_dev_attr_temp3_alarm.dev_attr)) 734 + || (err = device_create_file(&new_client->dev, 735 + &sensor_dev_attr_temp3_fault.dev_attr))) 779 736 goto exit_remove; 780 737 } else { 781 738 if ((err = device_create_file(&new_client->dev, ··· 789 738 || (err = device_create_file(&new_client->dev, 790 739 &dev_attr_in0_max)) 791 740 || (err = device_create_file(&new_client->dev, 741 + &sensor_dev_attr_in0_alarm.dev_attr)) 742 + || (err = device_create_file(&new_client->dev, 792 743 &dev_attr_in5_input)) 793 744 || (err = device_create_file(&new_client->dev, 794 745 &dev_attr_in5_min)) 795 746 || (err = device_create_file(&new_client->dev, 796 - &dev_attr_in5_max))) 747 + &dev_attr_in5_max)) 748 + || (err = device_create_file(&new_client->dev, 749 + &sensor_dev_attr_in5_alarm.dev_attr))) 797 750 goto exit_remove; 798 751 } 799 752 ··· 810 755 goto exit_remove; 811 756 } 812 757 813 - data->class_dev = hwmon_device_register(&new_client->dev); 814 - if (IS_ERR(data->class_dev)) { 815 - err = PTR_ERR(data->class_dev); 758 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 759 + if (IS_ERR(data->hwmon_dev)) { 760 + err = PTR_ERR(data->hwmon_dev); 816 761 goto exit_remove; 817 762 } 818 763 ··· 871 816 struct lm87_data *data = i2c_get_clientdata(client); 872 817 int err; 873 818 874 - hwmon_device_unregister(data->class_dev); 819 + hwmon_device_unregister(data->hwmon_dev); 875 820 sysfs_remove_group(&client->dev.kobj, &lm87_group); 876 821 sysfs_remove_group(&client->dev.kobj, &lm87_group_opt); 877 822
+30 -9
drivers/hwmon/lm90.c
··· 41 41 * http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2578 42 42 * Note that there is no easy way to differentiate between the three 43 43 * variants. The extra address and features of the MAX6659 are not 44 - * supported by this driver. 44 + * supported by this driver. These chips lack the remote temperature 45 + * offset feature. 45 46 * 46 47 * This driver also supports the MAX6680 and MAX6681, two other sensor 47 48 * chips made by Maxim. These are quite similar to the other Maxim ··· 215 214 216 215 struct lm90_data { 217 216 struct i2c_client client; 218 - struct class_device *class_dev; 217 + struct device *hwmon_dev; 219 218 struct mutex update_lock; 220 219 char valid; /* zero until following fields are valid */ 221 220 unsigned long last_updated; /* in jiffies */ ··· 227 226 2: local high limit 228 227 3: local critical limit 229 228 4: remote critical limit */ 230 - s16 temp11[3]; /* 0: remote input 229 + s16 temp11[4]; /* 0: remote input 231 230 1: remote low limit 232 - 2: remote high limit */ 231 + 2: remote high limit 232 + 3: remote offset (except max6657) */ 233 233 u8 temp_hyst; 234 234 u8 alarms; /* bitvector */ 235 235 }; ··· 284 282 static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr, 285 283 const char *buf, size_t count) 286 284 { 287 - static const u8 reg[4] = { 285 + static const u8 reg[6] = { 288 286 LM90_REG_W_REMOTE_LOWH, 289 287 LM90_REG_W_REMOTE_LOWL, 290 288 LM90_REG_W_REMOTE_HIGHH, 291 289 LM90_REG_W_REMOTE_HIGHL, 290 + LM90_REG_W_REMOTE_OFFSH, 291 + LM90_REG_W_REMOTE_OFFSL, 292 292 }; 293 293 294 294 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); ··· 371 367 static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO, show_temphyst, 372 368 set_temphyst, 3); 373 369 static SENSOR_DEVICE_ATTR(temp2_crit_hyst, S_IRUGO, show_temphyst, NULL, 4); 370 + static SENSOR_DEVICE_ATTR(temp2_offset, S_IWUSR | S_IRUGO, show_temp11, 371 + set_temp11, 3); 374 372 375 373 /* Individual alarm files */ 376 374 static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, show_alarm, NULL, 0); ··· 658 652 &dev_attr_pec))) 659 653 goto exit_remove_files; 660 654 } 655 + if (data->kind != max6657) { 656 + if ((err = device_create_file(&new_client->dev, 657 + &sensor_dev_attr_temp2_offset.dev_attr))) 658 + goto exit_remove_files; 659 + } 661 660 662 - data->class_dev = hwmon_device_register(&new_client->dev); 663 - if (IS_ERR(data->class_dev)) { 664 - err = PTR_ERR(data->class_dev); 661 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 662 + if (IS_ERR(data->hwmon_dev)) { 663 + err = PTR_ERR(data->hwmon_dev); 665 664 goto exit_remove_files; 666 665 } 667 666 ··· 718 707 struct lm90_data *data = i2c_get_clientdata(client); 719 708 int err; 720 709 721 - hwmon_device_unregister(data->class_dev); 710 + hwmon_device_unregister(data->hwmon_dev); 722 711 sysfs_remove_group(&client->dev.kobj, &lm90_group); 723 712 device_remove_file(&client->dev, &dev_attr_pec); 713 + if (data->kind != max6657) 714 + device_remove_file(&client->dev, 715 + &sensor_dev_attr_temp2_offset.dev_attr); 724 716 725 717 if ((err = i2c_detach_client(client))) 726 718 return err; ··· 777 763 if (lm90_read_reg(client, LM90_REG_R_REMOTE_HIGHH, &newh) == 0 778 764 && lm90_read_reg(client, LM90_REG_R_REMOTE_HIGHL, &l) == 0) 779 765 data->temp11[2] = (newh << 8) | l; 766 + if (data->kind != max6657) { 767 + if (lm90_read_reg(client, LM90_REG_R_REMOTE_OFFSH, 768 + &newh) == 0 769 + && lm90_read_reg(client, LM90_REG_R_REMOTE_OFFSL, 770 + &l) == 0) 771 + data->temp11[3] = (newh << 8) | l; 772 + } 780 773 lm90_read_reg(client, LM90_REG_R_STATUS, &data->alarms); 781 774 782 775 data->last_updated = jiffies;
+5 -5
drivers/hwmon/lm92.c
··· 96 96 /* Client data (each client gets its own) */ 97 97 struct lm92_data { 98 98 struct i2c_client client; 99 - struct class_device *class_dev; 99 + struct device *hwmon_dev; 100 100 struct mutex update_lock; 101 101 char valid; /* zero until following fields are valid */ 102 102 unsigned long last_updated; /* in jiffies */ ··· 379 379 if ((err = sysfs_create_group(&new_client->dev.kobj, &lm92_group))) 380 380 goto exit_detach; 381 381 382 - data->class_dev = hwmon_device_register(&new_client->dev); 383 - if (IS_ERR(data->class_dev)) { 384 - err = PTR_ERR(data->class_dev); 382 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 383 + if (IS_ERR(data->hwmon_dev)) { 384 + err = PTR_ERR(data->hwmon_dev); 385 385 goto exit_remove; 386 386 } 387 387 ··· 409 409 struct lm92_data *data = i2c_get_clientdata(client); 410 410 int err; 411 411 412 - hwmon_device_unregister(data->class_dev); 412 + hwmon_device_unregister(data->hwmon_dev); 413 413 sysfs_remove_group(&client->dev.kobj, &lm92_group); 414 414 415 415 if ((err = i2c_detach_client(client)))
+14 -14
drivers/hwmon/lm93.c
··· 201 201 */ 202 202 struct lm93_data { 203 203 struct i2c_client client; 204 - struct class_device *class_dev; 204 + struct device *hwmon_dev; 205 205 206 206 struct mutex update_lock; 207 207 unsigned long last_updated; /* In jiffies */ ··· 413 413 414 414 /* TEMP: 1/1000 degrees C (-128C to +127C) 415 415 REG: 1C/bit, two's complement */ 416 - static u8 LM93_TEMP_TO_REG(int temp) 416 + static u8 LM93_TEMP_TO_REG(long temp) 417 417 { 418 418 int ntemp = SENSORS_LIMIT(temp, LM93_TEMP_MIN, LM93_TEMP_MAX); 419 419 ntemp += (ntemp<0 ? -500 : 500); ··· 1268 1268 int nr = (to_sensor_dev_attr(attr))->index; 1269 1269 struct i2c_client *client = to_i2c_client(dev); 1270 1270 struct lm93_data *data = i2c_get_clientdata(client); 1271 - u32 val = simple_strtoul(buf, NULL, 10); 1271 + long val = simple_strtol(buf, NULL, 10); 1272 1272 1273 1273 mutex_lock(&data->update_lock); 1274 1274 data->temp_lim[nr].min = LM93_TEMP_TO_REG(val); ··· 1298 1298 int nr = (to_sensor_dev_attr(attr))->index; 1299 1299 struct i2c_client *client = to_i2c_client(dev); 1300 1300 struct lm93_data *data = i2c_get_clientdata(client); 1301 - u32 val = simple_strtoul(buf, NULL, 10); 1301 + long val = simple_strtol(buf, NULL, 10); 1302 1302 1303 1303 mutex_lock(&data->update_lock); 1304 1304 data->temp_lim[nr].max = LM93_TEMP_TO_REG(val); ··· 1329 1329 int nr = (to_sensor_dev_attr(attr))->index; 1330 1330 struct i2c_client *client = to_i2c_client(dev); 1331 1331 struct lm93_data *data = i2c_get_clientdata(client); 1332 - u32 val = simple_strtoul(buf, NULL, 10); 1332 + long val = simple_strtol(buf, NULL, 10); 1333 1333 1334 1334 mutex_lock(&data->update_lock); 1335 1335 data->block10.base[nr] = LM93_TEMP_TO_REG(val); ··· 1360 1360 int nr = (to_sensor_dev_attr(attr))->index; 1361 1361 struct i2c_client *client = to_i2c_client(dev); 1362 1362 struct lm93_data *data = i2c_get_clientdata(client); 1363 - u32 val = simple_strtoul(buf, NULL, 10); 1363 + long val = simple_strtol(buf, NULL, 10); 1364 1364 1365 1365 mutex_lock(&data->update_lock); 1366 1366 data->boost[nr] = LM93_TEMP_TO_REG(val); ··· 2078 2078 return sprintf(buf,"%d\n",LM93_VID_FROM_REG(data->vid[nr])); 2079 2079 } 2080 2080 2081 - static SENSOR_DEVICE_ATTR(vid1, S_IRUGO, show_vid, NULL, 0); 2082 - static SENSOR_DEVICE_ATTR(vid2, S_IRUGO, show_vid, NULL, 1); 2081 + static SENSOR_DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL, 0); 2082 + static SENSOR_DEVICE_ATTR(cpu1_vid, S_IRUGO, show_vid, NULL, 1); 2083 2083 2084 2084 static ssize_t show_prochot(struct device *dev, struct device_attribute *attr, 2085 2085 char *buf) ··· 2431 2431 &sensor_dev_attr_pwm2_auto_spinup_time.dev_attr.attr, 2432 2432 &dev_attr_pwm_auto_prochot_ramp.attr, 2433 2433 &dev_attr_pwm_auto_vrdhot_ramp.attr, 2434 - &sensor_dev_attr_vid1.dev_attr.attr, 2435 - &sensor_dev_attr_vid2.dev_attr.attr, 2434 + &sensor_dev_attr_cpu0_vid.dev_attr.attr, 2435 + &sensor_dev_attr_cpu1_vid.dev_attr.attr, 2436 2436 &sensor_dev_attr_prochot1.dev_attr.attr, 2437 2437 &sensor_dev_attr_prochot2.dev_attr.attr, 2438 2438 &sensor_dev_attr_prochot1_avg.dev_attr.attr, ··· 2590 2590 goto err_detach; 2591 2591 2592 2592 /* Register hwmon driver class */ 2593 - data->class_dev = hwmon_device_register(&client->dev); 2594 - if ( !IS_ERR(data->class_dev)) 2593 + data->hwmon_dev = hwmon_device_register(&client->dev); 2594 + if ( !IS_ERR(data->hwmon_dev)) 2595 2595 return 0; 2596 2596 2597 - err = PTR_ERR(data->class_dev); 2597 + err = PTR_ERR(data->hwmon_dev); 2598 2598 dev_err(&client->dev, "error registering hwmon device.\n"); 2599 2599 sysfs_remove_group(&client->dev.kobj, &lm93_attr_grp); 2600 2600 err_detach: ··· 2619 2619 struct lm93_data *data = i2c_get_clientdata(client); 2620 2620 int err = 0; 2621 2621 2622 - hwmon_device_unregister(data->class_dev); 2622 + hwmon_device_unregister(data->hwmon_dev); 2623 2623 sysfs_remove_group(&client->dev.kobj, &lm93_attr_grp); 2624 2624 2625 2625 err = i2c_detach_client(client);
+5 -5
drivers/hwmon/max1619.c
··· 105 105 106 106 struct max1619_data { 107 107 struct i2c_client client; 108 - struct class_device *class_dev; 108 + struct device *hwmon_dev; 109 109 struct mutex update_lock; 110 110 char valid; /* zero until following fields are valid */ 111 111 unsigned long last_updated; /* in jiffies */ ··· 293 293 if ((err = sysfs_create_group(&new_client->dev.kobj, &max1619_group))) 294 294 goto exit_detach; 295 295 296 - data->class_dev = hwmon_device_register(&new_client->dev); 297 - if (IS_ERR(data->class_dev)) { 298 - err = PTR_ERR(data->class_dev); 296 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 297 + if (IS_ERR(data->hwmon_dev)) { 298 + err = PTR_ERR(data->hwmon_dev); 299 299 goto exit_remove_files; 300 300 } 301 301 ··· 331 331 struct max1619_data *data = i2c_get_clientdata(client); 332 332 int err; 333 333 334 - hwmon_device_unregister(data->class_dev); 334 + hwmon_device_unregister(data->hwmon_dev); 335 335 sysfs_remove_group(&client->dev.kobj, &max1619_group); 336 336 337 337 if ((err = i2c_detach_client(client)))
+5 -5
drivers/hwmon/max6650.c
··· 128 128 struct max6650_data 129 129 { 130 130 struct i2c_client client; 131 - struct class_device *class_dev; 131 + struct device *hwmon_dev; 132 132 struct mutex update_lock; 133 133 char valid; /* zero until following fields are valid */ 134 134 unsigned long last_updated; /* in jiffies */ ··· 523 523 if (err) 524 524 goto err_detach; 525 525 526 - data->class_dev = hwmon_device_register(&client->dev); 527 - if (!IS_ERR(data->class_dev)) 526 + data->hwmon_dev = hwmon_device_register(&client->dev); 527 + if (!IS_ERR(data->hwmon_dev)) 528 528 return 0; 529 529 530 - err = PTR_ERR(data->class_dev); 530 + err = PTR_ERR(data->hwmon_dev); 531 531 dev_err(&client->dev, "error registering hwmon device.\n"); 532 532 sysfs_remove_group(&client->dev.kobj, &max6650_attr_grp); 533 533 err_detach: ··· 543 543 int err; 544 544 545 545 sysfs_remove_group(&client->dev.kobj, &max6650_attr_grp); 546 - hwmon_device_unregister(data->class_dev); 546 + hwmon_device_unregister(data->hwmon_dev); 547 547 err = i2c_detach_client(client); 548 548 if (!err) 549 549 kfree(data);
+6 -6
drivers/hwmon/pc87360.c
··· 180 180 181 181 struct pc87360_data { 182 182 const char *name; 183 - struct class_device *class_dev; 183 + struct device *hwmon_dev; 184 184 struct mutex lock; 185 185 struct mutex update_lock; 186 186 char valid; /* !=0 if following fields are valid */ ··· 500 500 501 501 static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf) 502 502 { 503 - struct pc87360_data *data = pc87360_update_device(dev); 503 + struct pc87360_data *data = dev_get_drvdata(dev); 504 504 return sprintf(buf, "%u\n", data->vrm); 505 505 } 506 506 static ssize_t set_vrm(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) ··· 1054 1054 if ((err = device_create_file(dev, &dev_attr_name))) 1055 1055 goto ERROR3; 1056 1056 1057 - data->class_dev = hwmon_device_register(dev); 1058 - if (IS_ERR(data->class_dev)) { 1059 - err = PTR_ERR(data->class_dev); 1057 + data->hwmon_dev = hwmon_device_register(dev); 1058 + if (IS_ERR(data->hwmon_dev)) { 1059 + err = PTR_ERR(data->hwmon_dev); 1060 1060 goto ERROR3; 1061 1061 } 1062 1062 return 0; ··· 1083 1083 struct pc87360_data *data = platform_get_drvdata(pdev); 1084 1084 int i; 1085 1085 1086 - hwmon_device_unregister(data->class_dev); 1086 + hwmon_device_unregister(data->hwmon_dev); 1087 1087 1088 1088 device_remove_file(&pdev->dev, &dev_attr_name); 1089 1089 sysfs_remove_group(&pdev->dev.kobj, &pc8736x_temp_group);
+5 -5
drivers/hwmon/pc87427.c
··· 42 42 device is using banked registers) and the register cache (needed to keep 43 43 the data in the registers and the cache in sync at any time). */ 44 44 struct pc87427_data { 45 - struct class_device *class_dev; 45 + struct device *hwmon_dev; 46 46 struct mutex lock; 47 47 int address[2]; 48 48 const char *name; ··· 454 454 goto exit_remove_files; 455 455 } 456 456 457 - data->class_dev = hwmon_device_register(&pdev->dev); 458 - if (IS_ERR(data->class_dev)) { 459 - err = PTR_ERR(data->class_dev); 457 + data->hwmon_dev = hwmon_device_register(&pdev->dev); 458 + if (IS_ERR(data->hwmon_dev)) { 459 + err = PTR_ERR(data->hwmon_dev); 460 460 dev_err(&pdev->dev, "Class registration failed (%d)\n", err); 461 461 goto exit_remove_files; 462 462 } ··· 484 484 struct resource *res; 485 485 int i; 486 486 487 - hwmon_device_unregister(data->class_dev); 487 + hwmon_device_unregister(data->hwmon_dev); 488 488 device_remove_file(&pdev->dev, &dev_attr_name); 489 489 for (i = 0; i < 8; i++) { 490 490 if (!(data->fan_enabled & (1 << i)))
+10 -11
drivers/hwmon/sis5595.c
··· 163 163 struct sis5595_data { 164 164 unsigned short addr; 165 165 const char *name; 166 - struct class_device *class_dev; 166 + struct device *hwmon_dev; 167 167 struct mutex lock; 168 168 169 169 struct mutex update_lock; ··· 517 517 platform_set_drvdata(pdev, data); 518 518 519 519 /* Check revision and pin registers to determine whether 4 or 5 voltages */ 520 - pci_read_config_byte(s_bridge, PCI_REVISION_ID, &data->revision); 520 + data->revision = s_bridge->revision; 521 521 /* 4 voltages, 1 temp */ 522 522 data->maxins = 3; 523 523 if (data->revision >= REV2MIN) { ··· 557 557 goto exit_remove_files; 558 558 } 559 559 560 - data->class_dev = hwmon_device_register(&pdev->dev); 561 - if (IS_ERR(data->class_dev)) { 562 - err = PTR_ERR(data->class_dev); 560 + data->hwmon_dev = hwmon_device_register(&pdev->dev); 561 + if (IS_ERR(data->hwmon_dev)) { 562 + err = PTR_ERR(data->hwmon_dev); 563 563 goto exit_remove_files; 564 564 } 565 565 ··· 580 580 { 581 581 struct sis5595_data *data = platform_get_drvdata(pdev); 582 582 583 - hwmon_device_unregister(data->class_dev); 583 + hwmon_device_unregister(data->hwmon_dev); 584 584 sysfs_remove_group(&pdev->dev.kobj, &sis5595_group); 585 585 sysfs_remove_group(&pdev->dev.kobj, &sis5595_group_opt); 586 586 ··· 739 739 int *i; 740 740 741 741 for (i = blacklist; *i != 0; i++) { 742 - struct pci_dev *dev; 743 - dev = pci_get_device(PCI_VENDOR_ID_SI, *i, NULL); 744 - if (dev) { 745 - dev_err(&dev->dev, "Looked for SIS5595 but found unsupported device %.4x\n", *i); 746 - pci_dev_put(dev); 742 + struct pci_dev *d; 743 + if ((d = pci_get_device(PCI_VENDOR_ID_SI, *i, NULL))) { 744 + dev_err(&d->dev, "Looked for SIS5595 but found unsupported device %.4x\n", *i); 745 + pci_dev_put(d); 747 746 return -ENODEV; 748 747 } 749 748 }
+5 -5
drivers/hwmon/smsc47b397.c
··· 94 94 struct smsc47b397_data { 95 95 unsigned short addr; 96 96 const char *name; 97 - struct class_device *class_dev; 97 + struct device *hwmon_dev; 98 98 struct mutex lock; 99 99 100 100 struct mutex update_lock; ··· 222 222 struct smsc47b397_data *data = platform_get_drvdata(pdev); 223 223 struct resource *res; 224 224 225 - hwmon_device_unregister(data->class_dev); 225 + hwmon_device_unregister(data->hwmon_dev); 226 226 sysfs_remove_group(&pdev->dev.kobj, &smsc47b397_group); 227 227 res = platform_get_resource(pdev, IORESOURCE_IO, 0); 228 228 release_region(res->start, SMSC_EXTENT); ··· 272 272 if ((err = sysfs_create_group(&dev->kobj, &smsc47b397_group))) 273 273 goto error_free; 274 274 275 - data->class_dev = hwmon_device_register(dev); 276 - if (IS_ERR(data->class_dev)) { 277 - err = PTR_ERR(data->class_dev); 275 + data->hwmon_dev = hwmon_device_register(dev); 276 + if (IS_ERR(data->hwmon_dev)) { 277 + err = PTR_ERR(data->hwmon_dev); 278 278 goto error_remove; 279 279 } 280 280
+7 -7
drivers/hwmon/smsc47m1.c
··· 116 116 unsigned short addr; 117 117 const char *name; 118 118 enum chips type; 119 - struct class_device *class_dev; 119 + struct device *hwmon_dev; 120 120 121 121 struct mutex update_lock; 122 122 unsigned long last_updated; /* In jiffies */ ··· 553 553 || (err = device_create_file(dev, 554 554 &sensor_dev_attr_fan3_div.dev_attr))) 555 555 goto error_remove_files; 556 - } else 556 + } else if (data->type == smsc47m2) 557 557 dev_dbg(dev, "Fan 3 not enabled by hardware, skipping\n"); 558 558 559 559 if (pwm1) { ··· 580 580 || (err = device_create_file(dev, 581 581 &sensor_dev_attr_pwm3_enable.dev_attr))) 582 582 goto error_remove_files; 583 - } else 583 + } else if (data->type == smsc47m2) 584 584 dev_dbg(dev, "PWM 3 not enabled by hardware, skipping\n"); 585 585 586 586 if ((err = device_create_file(dev, &dev_attr_alarms))) ··· 588 588 if ((err = device_create_file(dev, &dev_attr_name))) 589 589 goto error_remove_files; 590 590 591 - data->class_dev = hwmon_device_register(dev); 592 - if (IS_ERR(data->class_dev)) { 593 - err = PTR_ERR(data->class_dev); 591 + data->hwmon_dev = hwmon_device_register(dev); 592 + if (IS_ERR(data->hwmon_dev)) { 593 + err = PTR_ERR(data->hwmon_dev); 594 594 goto error_remove_files; 595 595 } 596 596 ··· 611 611 struct smsc47m1_data *data = platform_get_drvdata(pdev); 612 612 struct resource *res; 613 613 614 - hwmon_device_unregister(data->class_dev); 614 + hwmon_device_unregister(data->hwmon_dev); 615 615 sysfs_remove_group(&pdev->dev.kobj, &smsc47m1_group); 616 616 617 617 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
+6 -6
drivers/hwmon/smsc47m192.c
··· 97 97 98 98 struct smsc47m192_data { 99 99 struct i2c_client client; 100 - struct class_device *class_dev; 100 + struct device *hwmon_dev; 101 101 struct mutex update_lock; 102 102 char valid; /* !=0 if following fields are valid */ 103 103 unsigned long last_updated; /* In jiffies */ ··· 334 334 static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, 335 335 char *buf) 336 336 { 337 - struct smsc47m192_data *data = smsc47m192_update_device(dev); 337 + struct smsc47m192_data *data = dev_get_drvdata(dev); 338 338 return sprintf(buf, "%d\n", data->vrm); 339 339 } 340 340 ··· 553 553 goto exit_remove_files; 554 554 } 555 555 556 - data->class_dev = hwmon_device_register(&client->dev); 557 - if (IS_ERR(data->class_dev)) { 558 - err = PTR_ERR(data->class_dev); 556 + data->hwmon_dev = hwmon_device_register(&client->dev); 557 + if (IS_ERR(data->hwmon_dev)) { 558 + err = PTR_ERR(data->hwmon_dev); 559 559 goto exit_remove_files; 560 560 } 561 561 ··· 577 577 struct smsc47m192_data *data = i2c_get_clientdata(client); 578 578 int err; 579 579 580 - hwmon_device_unregister(data->class_dev); 580 + hwmon_device_unregister(data->hwmon_dev); 581 581 sysfs_remove_group(&client->dev.kobj, &smsc47m192_group); 582 582 sysfs_remove_group(&client->dev.kobj, &smsc47m192_group_in4); 583 583
+48 -20
drivers/hwmon/thmc50.c
··· 46 46 #define THMC50_REG_COMPANY_ID 0x3E 47 47 #define THMC50_REG_DIE_CODE 0x3F 48 48 #define THMC50_REG_ANALOG_OUT 0x19 49 + /* 50 + * The mirror status register cannot be used as 51 + * reading it does not clear alarms. 52 + */ 53 + #define THMC50_REG_INTR 0x41 49 54 50 55 const static u8 THMC50_REG_TEMP[] = { 0x27, 0x26, 0x20 }; 51 56 const static u8 THMC50_REG_TEMP_MIN[] = { 0x3A, 0x38, 0x2C }; ··· 61 56 /* Each client has this additional data */ 62 57 struct thmc50_data { 63 58 struct i2c_client client; 64 - struct class_device *class_dev; 59 + struct device *hwmon_dev; 65 60 66 61 struct mutex update_lock; 67 62 enum chips type; ··· 74 69 s8 temp_max[3]; 75 70 s8 temp_min[3]; 76 71 u8 analog_out; 72 + u8 alarms; 77 73 }; 78 74 79 75 static int thmc50_attach_adapter(struct i2c_adapter *adapter); ··· 186 180 return count; 187 181 } 188 182 183 + static ssize_t show_alarm(struct device *dev, struct device_attribute *attr, 184 + char *buf) 185 + { 186 + int index = to_sensor_dev_attr(attr)->index; 187 + struct thmc50_data *data = thmc50_update_device(dev); 188 + 189 + return sprintf(buf, "%u\n", (data->alarms >> index) & 1); 190 + } 191 + 189 192 #define temp_reg(offset) \ 190 193 static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_temp, \ 191 194 NULL, offset - 1); \ ··· 207 192 temp_reg(2); 208 193 temp_reg(3); 209 194 195 + static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 0); 196 + static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5); 197 + static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 1); 198 + static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_alarm, NULL, 7); 199 + static SENSOR_DEVICE_ATTR(temp3_fault, S_IRUGO, show_alarm, NULL, 2); 200 + 210 201 static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_analog_out, 211 202 set_analog_out, 0); 212 203 static SENSOR_DEVICE_ATTR(pwm1_mode, S_IRUGO, show_pwm_mode, NULL, 0); ··· 221 200 &sensor_dev_attr_temp1_max.dev_attr.attr, 222 201 &sensor_dev_attr_temp1_min.dev_attr.attr, 223 202 &sensor_dev_attr_temp1_input.dev_attr.attr, 203 + &sensor_dev_attr_temp1_alarm.dev_attr.attr, 224 204 &sensor_dev_attr_temp2_max.dev_attr.attr, 225 205 &sensor_dev_attr_temp2_min.dev_attr.attr, 226 206 &sensor_dev_attr_temp2_input.dev_attr.attr, 207 + &sensor_dev_attr_temp2_alarm.dev_attr.attr, 208 + &sensor_dev_attr_temp2_fault.dev_attr.attr, 227 209 &sensor_dev_attr_pwm1.dev_attr.attr, 228 210 &sensor_dev_attr_pwm1_mode.dev_attr.attr, 229 211 NULL ··· 237 213 }; 238 214 239 215 /* for ADM1022 3rd temperature mode */ 240 - static struct attribute *adm1022_attributes[] = { 216 + static struct attribute *temp3_attributes[] = { 241 217 &sensor_dev_attr_temp3_max.dev_attr.attr, 242 218 &sensor_dev_attr_temp3_min.dev_attr.attr, 243 219 &sensor_dev_attr_temp3_input.dev_attr.attr, 220 + &sensor_dev_attr_temp3_alarm.dev_attr.attr, 221 + &sensor_dev_attr_temp3_fault.dev_attr.attr, 244 222 NULL 245 223 }; 246 224 247 - static const struct attribute_group adm1022_group = { 248 - .attrs = adm1022_attributes, 225 + static const struct attribute_group temp3_group = { 226 + .attrs = temp3_attributes, 249 227 }; 250 228 251 229 static int thmc50_detect(struct i2c_adapter *adapter, int address, int kind) ··· 259 233 struct thmc50_data *data; 260 234 struct device *dev; 261 235 int err = 0; 262 - const char *type_name = ""; 236 + const char *type_name; 263 237 264 238 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { 265 239 pr_debug("thmc50: detect failed, " ··· 309 283 pr_debug("thmc50: Detection of THMC50/ADM1022 failed\n"); 310 284 goto exit_free; 311 285 } 312 - pr_debug("thmc50: Detected %s (version %x, revision %x)\n", 313 - type_name, (revision >> 4) - 0xc, revision & 0xf); 314 286 data->type = kind; 315 287 316 - if (kind == thmc50) 317 - type_name = "thmc50"; 318 - else if (kind == adm1022) { 288 + if (kind == adm1022) { 319 289 int id = i2c_adapter_id(client->adapter); 320 290 int i; 321 291 ··· 324 302 data->has_temp3 = 1; 325 303 break; 326 304 } 305 + } else { 306 + type_name = "thmc50"; 327 307 } 308 + pr_debug("thmc50: Detected %s (version %x, revision %x)\n", 309 + type_name, (revision >> 4) - 0xc, revision & 0xf); 328 310 329 311 /* Fill in the remaining client fields & put it into the global list */ 330 312 strlcpy(client->name, type_name, I2C_NAME_SIZE); ··· 345 319 goto exit_detach; 346 320 347 321 /* Register ADM1022 sysfs hooks */ 348 - if (data->type == adm1022) 322 + if (data->has_temp3) 349 323 if ((err = sysfs_create_group(&client->dev.kobj, 350 - &adm1022_group))) 324 + &temp3_group))) 351 325 goto exit_remove_sysfs_thmc50; 352 326 353 327 /* Register a new directory entry with module sensors */ 354 - data->class_dev = hwmon_device_register(&client->dev); 355 - if (IS_ERR(data->class_dev)) { 356 - err = PTR_ERR(data->class_dev); 328 + data->hwmon_dev = hwmon_device_register(&client->dev); 329 + if (IS_ERR(data->hwmon_dev)) { 330 + err = PTR_ERR(data->hwmon_dev); 357 331 goto exit_remove_sysfs; 358 332 } 359 333 360 334 return 0; 361 335 362 336 exit_remove_sysfs: 363 - if (data->type == adm1022) 364 - sysfs_remove_group(&client->dev.kobj, &adm1022_group); 337 + if (data->has_temp3) 338 + sysfs_remove_group(&client->dev.kobj, &temp3_group); 365 339 exit_remove_sysfs_thmc50: 366 340 sysfs_remove_group(&client->dev.kobj, &thmc50_group); 367 341 exit_detach: ··· 384 358 struct thmc50_data *data = i2c_get_clientdata(client); 385 359 int err; 386 360 387 - hwmon_device_unregister(data->class_dev); 361 + hwmon_device_unregister(data->hwmon_dev); 388 362 sysfs_remove_group(&client->dev.kobj, &thmc50_group); 389 - if (data->type == adm1022) 390 - sysfs_remove_group(&client->dev.kobj, &adm1022_group); 363 + if (data->has_temp3) 364 + sysfs_remove_group(&client->dev.kobj, &temp3_group); 391 365 392 366 if ((err = i2c_detach_client(client))) 393 367 return err; ··· 440 414 } 441 415 data->analog_out = 442 416 i2c_smbus_read_byte_data(client, THMC50_REG_ANALOG_OUT); 417 + data->alarms = 418 + i2c_smbus_read_byte_data(client, THMC50_REG_INTR); 443 419 data->last_updated = jiffies; 444 420 data->valid = 1; 445 421 }
+5 -5
drivers/hwmon/via686a.c
··· 294 294 struct via686a_data { 295 295 unsigned short addr; 296 296 const char *name; 297 - struct class_device *class_dev; 297 + struct device *hwmon_dev; 298 298 struct mutex update_lock; 299 299 char valid; /* !=0 if following fields are valid */ 300 300 unsigned long last_updated; /* In jiffies */ ··· 627 627 if ((err = sysfs_create_group(&pdev->dev.kobj, &via686a_group))) 628 628 goto exit_free; 629 629 630 - data->class_dev = hwmon_device_register(&pdev->dev); 631 - if (IS_ERR(data->class_dev)) { 632 - err = PTR_ERR(data->class_dev); 630 + data->hwmon_dev = hwmon_device_register(&pdev->dev); 631 + if (IS_ERR(data->hwmon_dev)) { 632 + err = PTR_ERR(data->hwmon_dev); 633 633 goto exit_remove_files; 634 634 } 635 635 ··· 648 648 { 649 649 struct via686a_data *data = platform_get_drvdata(pdev); 650 650 651 - hwmon_device_unregister(data->class_dev); 651 + hwmon_device_unregister(data->hwmon_dev); 652 652 sysfs_remove_group(&pdev->dev.kobj, &via686a_group); 653 653 654 654 release_region(data->addr, VIA686A_EXTENT);
+5 -5
drivers/hwmon/vt1211.c
··· 108 108 struct vt1211_data { 109 109 unsigned short addr; 110 110 const char *name; 111 - struct class_device *class_dev; 111 + struct device *hwmon_dev; 112 112 113 113 struct mutex update_lock; 114 114 char valid; /* !=0 if following fields are valid */ ··· 1191 1191 } 1192 1192 1193 1193 /* Register device */ 1194 - data->class_dev = hwmon_device_register(dev); 1195 - if (IS_ERR(data->class_dev)) { 1196 - err = PTR_ERR(data->class_dev); 1194 + data->hwmon_dev = hwmon_device_register(dev); 1195 + if (IS_ERR(data->hwmon_dev)) { 1196 + err = PTR_ERR(data->hwmon_dev); 1197 1197 dev_err(dev, "Class registration failed (%d)\n", err); 1198 1198 goto EXIT_DEV_REMOVE_SILENT; 1199 1199 } ··· 1217 1217 struct vt1211_data *data = platform_get_drvdata(pdev); 1218 1218 struct resource *res; 1219 1219 1220 - hwmon_device_unregister(data->class_dev); 1220 + hwmon_device_unregister(data->hwmon_dev); 1221 1221 vt1211_remove_sysfs(pdev); 1222 1222 platform_set_drvdata(pdev, NULL); 1223 1223 kfree(data);
+6 -6
drivers/hwmon/vt8231.c
··· 148 148 const char *name; 149 149 150 150 struct mutex update_lock; 151 - struct class_device *class_dev; 151 + struct device *hwmon_dev; 152 152 char valid; /* !=0 if following fields are valid */ 153 153 unsigned long last_updated; /* In jiffies */ 154 154 ··· 676 676 .probe = vt8231_pci_probe, 677 677 }; 678 678 679 - int vt8231_probe(struct platform_device *pdev) 679 + static int vt8231_probe(struct platform_device *pdev) 680 680 { 681 681 struct resource *res; 682 682 struct vt8231_data *data; ··· 726 726 } 727 727 } 728 728 729 - data->class_dev = hwmon_device_register(&pdev->dev); 730 - if (IS_ERR(data->class_dev)) { 731 - err = PTR_ERR(data->class_dev); 729 + data->hwmon_dev = hwmon_device_register(&pdev->dev); 730 + if (IS_ERR(data->hwmon_dev)) { 731 + err = PTR_ERR(data->hwmon_dev); 732 732 goto exit_remove_files; 733 733 } 734 734 return 0; ··· 756 756 struct vt8231_data *data = platform_get_drvdata(pdev); 757 757 int i; 758 758 759 - hwmon_device_unregister(data->class_dev); 759 + hwmon_device_unregister(data->hwmon_dev); 760 760 761 761 for (i = 0; i < ARRAY_SIZE(vt8231_group_volts); i++) 762 762 sysfs_remove_group(&pdev->dev.kobj, &vt8231_group_volts[i]);
+8 -8
drivers/hwmon/w83627ehf.c
··· 223 223 } 224 224 225 225 static inline s8 226 - temp1_to_reg(int temp, int min, int max) 226 + temp1_to_reg(long temp, int min, int max) 227 227 { 228 228 if (temp <= min) 229 229 return min / 1000; ··· 256 256 int addr; /* IO base of hw monitor block */ 257 257 const char *name; 258 258 259 - struct class_device *class_dev; 259 + struct device *hwmon_dev; 260 260 struct mutex lock; 261 261 262 262 struct mutex update_lock; ··· 805 805 const char *buf, size_t count) \ 806 806 { \ 807 807 struct w83627ehf_data *data = dev_get_drvdata(dev); \ 808 - u32 val = simple_strtoul(buf, NULL, 10); \ 808 + long val = simple_strtol(buf, NULL, 10); \ 809 809 \ 810 810 mutex_lock(&data->update_lock); \ 811 811 data->temp1_##reg = temp1_to_reg(val, -128000, 127000); \ ··· 840 840 struct w83627ehf_data *data = dev_get_drvdata(dev); \ 841 841 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \ 842 842 int nr = sensor_attr->index; \ 843 - u32 val = simple_strtoul(buf, NULL, 10); \ 843 + long val = simple_strtol(buf, NULL, 10); \ 844 844 \ 845 845 mutex_lock(&data->update_lock); \ 846 846 data->reg[nr] = LM75_TEMP_TO_REG(val); \ ··· 1384 1384 goto exit_remove; 1385 1385 } 1386 1386 1387 - data->class_dev = hwmon_device_register(dev); 1388 - if (IS_ERR(data->class_dev)) { 1389 - err = PTR_ERR(data->class_dev); 1387 + data->hwmon_dev = hwmon_device_register(dev); 1388 + if (IS_ERR(data->hwmon_dev)) { 1389 + err = PTR_ERR(data->hwmon_dev); 1390 1390 goto exit_remove; 1391 1391 } 1392 1392 ··· 1406 1406 { 1407 1407 struct w83627ehf_data *data = platform_get_drvdata(pdev); 1408 1408 1409 - hwmon_device_unregister(data->class_dev); 1409 + hwmon_device_unregister(data->hwmon_dev); 1410 1410 w83627ehf_device_remove_files(&pdev->dev); 1411 1411 release_region(data->addr, IOREGION_LENGTH); 1412 1412 platform_set_drvdata(pdev, NULL);
+399 -405
drivers/hwmon/w83627hf.c
··· 45 45 #include <linux/jiffies.h> 46 46 #include <linux/platform_device.h> 47 47 #include <linux/hwmon.h> 48 + #include <linux/hwmon-sysfs.h> 48 49 #include <linux/hwmon-vid.h> 49 50 #include <linux/err.h> 50 51 #include <linux/mutex.h> ··· 219 218 static const u8 regpwm[] = { W83627THF_REG_PWM1, W83627THF_REG_PWM2, 220 219 W83627THF_REG_PWM3 }; 221 220 #define W836X7HF_REG_PWM(type, nr) (((type) == w83627hf) ? \ 222 - regpwm_627hf[(nr) - 1] : regpwm[(nr) - 1]) 221 + regpwm_627hf[nr] : regpwm[nr]) 223 222 224 223 #define W83627HF_REG_PWM_FREQ 0x5C /* Only for the 627HF */ 225 224 ··· 264 263 265 264 /* TEMP: 0.001C/bit (-128C to +127C) 266 265 REG: 1C/bit, two's complement */ 267 - static u8 TEMP_TO_REG(int temp) 266 + static u8 TEMP_TO_REG(long temp) 268 267 { 269 268 int ntemp = SENSORS_LIMIT(temp, TEMP_MIN, TEMP_MAX); 270 269 ntemp += (ntemp<0 ? -500 : 500); ··· 347 346 struct w83627hf_data { 348 347 unsigned short addr; 349 348 const char *name; 350 - struct class_device *class_dev; 349 + struct device *hwmon_dev; 351 350 struct mutex lock; 352 351 enum chips type; 353 352 ··· 373 372 u8 beep_enable; /* Boolean */ 374 373 u8 pwm[3]; /* Register value */ 375 374 u8 pwm_freq[3]; /* Register value */ 376 - u16 sens[3]; /* 782D/783S only. 377 - 1 = pentium diode; 2 = 3904 diode; 378 - 3000-5000 = thermistor beta. 379 - Default = 3435. 380 - Other Betas unimplemented */ 375 + u16 sens[3]; /* 1 = pentium diode; 2 = 3904 diode; 376 + 4 = thermistor */ 381 377 u8 vrm; 382 378 u8 vrm_ovt; /* Register value, 627THF/637HF/687THF only */ 383 379 }; ··· 389 391 390 392 static int w83627hf_read_value(struct w83627hf_data *data, u16 reg); 391 393 static int w83627hf_write_value(struct w83627hf_data *data, u16 reg, u16 value); 394 + static void w83627hf_update_fan_div(struct w83627hf_data *data); 392 395 static struct w83627hf_data *w83627hf_update_device(struct device *dev); 393 396 static void w83627hf_init_device(struct platform_device *pdev); 394 397 ··· 402 403 .remove = __devexit_p(w83627hf_remove), 403 404 }; 404 405 405 - /* following are the sysfs callback functions */ 406 - #define show_in_reg(reg) \ 407 - static ssize_t show_##reg (struct device *dev, char *buf, int nr) \ 408 - { \ 409 - struct w83627hf_data *data = w83627hf_update_device(dev); \ 410 - return sprintf(buf,"%ld\n", (long)IN_FROM_REG(data->reg[nr])); \ 406 + static ssize_t 407 + show_in_input(struct device *dev, struct device_attribute *devattr, char *buf) 408 + { 409 + int nr = to_sensor_dev_attr(devattr)->index; 410 + struct w83627hf_data *data = w83627hf_update_device(dev); 411 + return sprintf(buf, "%ld\n", (long)IN_FROM_REG(data->in[nr])); 411 412 } 412 - show_in_reg(in) 413 - show_in_reg(in_min) 414 - show_in_reg(in_max) 415 - 416 - #define store_in_reg(REG, reg) \ 417 - static ssize_t \ 418 - store_in_##reg (struct device *dev, const char *buf, size_t count, int nr) \ 419 - { \ 420 - struct w83627hf_data *data = dev_get_drvdata(dev); \ 421 - u32 val; \ 422 - \ 423 - val = simple_strtoul(buf, NULL, 10); \ 424 - \ 425 - mutex_lock(&data->update_lock); \ 426 - data->in_##reg[nr] = IN_TO_REG(val); \ 427 - w83627hf_write_value(data, W83781D_REG_IN_##REG(nr), \ 428 - data->in_##reg[nr]); \ 429 - \ 430 - mutex_unlock(&data->update_lock); \ 431 - return count; \ 413 + static ssize_t 414 + show_in_min(struct device *dev, struct device_attribute *devattr, char *buf) 415 + { 416 + int nr = to_sensor_dev_attr(devattr)->index; 417 + struct w83627hf_data *data = w83627hf_update_device(dev); 418 + return sprintf(buf, "%ld\n", (long)IN_FROM_REG(data->in_min[nr])); 432 419 } 433 - store_in_reg(MIN, min) 434 - store_in_reg(MAX, max) 420 + static ssize_t 421 + show_in_max(struct device *dev, struct device_attribute *devattr, char *buf) 422 + { 423 + int nr = to_sensor_dev_attr(devattr)->index; 424 + struct w83627hf_data *data = w83627hf_update_device(dev); 425 + return sprintf(buf, "%ld\n", (long)IN_FROM_REG(data->in_max[nr])); 426 + } 427 + static ssize_t 428 + store_in_min(struct device *dev, struct device_attribute *devattr, 429 + const char *buf, size_t count) 430 + { 431 + int nr = to_sensor_dev_attr(devattr)->index; 432 + struct w83627hf_data *data = dev_get_drvdata(dev); 433 + long val = simple_strtol(buf, NULL, 10); 435 434 436 - #define sysfs_in_offset(offset) \ 437 - static ssize_t \ 438 - show_regs_in_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ 439 - { \ 440 - return show_in(dev, buf, offset); \ 441 - } \ 442 - static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_regs_in_##offset, NULL); 435 + mutex_lock(&data->update_lock); 436 + data->in_min[nr] = IN_TO_REG(val); 437 + w83627hf_write_value(data, W83781D_REG_IN_MIN(nr), data->in_min[nr]); 438 + mutex_unlock(&data->update_lock); 439 + return count; 440 + } 441 + static ssize_t 442 + store_in_max(struct device *dev, struct device_attribute *devattr, 443 + const char *buf, size_t count) 444 + { 445 + int nr = to_sensor_dev_attr(devattr)->index; 446 + struct w83627hf_data *data = dev_get_drvdata(dev); 447 + long val = simple_strtol(buf, NULL, 10); 443 448 444 - #define sysfs_in_reg_offset(reg, offset) \ 445 - static ssize_t show_regs_in_##reg##offset (struct device *dev, struct device_attribute *attr, char *buf) \ 446 - { \ 447 - return show_in_##reg (dev, buf, offset); \ 448 - } \ 449 - static ssize_t \ 450 - store_regs_in_##reg##offset (struct device *dev, struct device_attribute *attr, \ 451 - const char *buf, size_t count) \ 452 - { \ 453 - return store_in_##reg (dev, buf, count, offset); \ 454 - } \ 455 - static DEVICE_ATTR(in##offset##_##reg, S_IRUGO| S_IWUSR, \ 456 - show_regs_in_##reg##offset, store_regs_in_##reg##offset); 449 + mutex_lock(&data->update_lock); 450 + data->in_max[nr] = IN_TO_REG(val); 451 + w83627hf_write_value(data, W83781D_REG_IN_MAX(nr), data->in_max[nr]); 452 + mutex_unlock(&data->update_lock); 453 + return count; 454 + } 455 + #define sysfs_vin_decl(offset) \ 456 + static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \ 457 + show_in_input, NULL, offset); \ 458 + static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO|S_IWUSR, \ 459 + show_in_min, store_in_min, offset); \ 460 + static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO|S_IWUSR, \ 461 + show_in_max, store_in_max, offset); 457 462 458 - #define sysfs_in_offsets(offset) \ 459 - sysfs_in_offset(offset) \ 460 - sysfs_in_reg_offset(min, offset) \ 461 - sysfs_in_reg_offset(max, offset) 462 - 463 - sysfs_in_offsets(1); 464 - sysfs_in_offsets(2); 465 - sysfs_in_offsets(3); 466 - sysfs_in_offsets(4); 467 - sysfs_in_offsets(5); 468 - sysfs_in_offsets(6); 469 - sysfs_in_offsets(7); 470 - sysfs_in_offsets(8); 463 + sysfs_vin_decl(1); 464 + sysfs_vin_decl(2); 465 + sysfs_vin_decl(3); 466 + sysfs_vin_decl(4); 467 + sysfs_vin_decl(5); 468 + sysfs_vin_decl(6); 469 + sysfs_vin_decl(7); 470 + sysfs_vin_decl(8); 471 471 472 472 /* use a different set of functions for in0 */ 473 473 static ssize_t show_in_0(struct w83627hf_data *data, char *buf, u8 reg) ··· 564 566 static DEVICE_ATTR(in0_max, S_IRUGO | S_IWUSR, 565 567 show_regs_in_max0, store_regs_in_max0); 566 568 567 - #define show_fan_reg(reg) \ 568 - static ssize_t show_##reg (struct device *dev, char *buf, int nr) \ 569 - { \ 570 - struct w83627hf_data *data = w83627hf_update_device(dev); \ 571 - return sprintf(buf,"%ld\n", \ 572 - FAN_FROM_REG(data->reg[nr-1], \ 573 - (long)DIV_FROM_REG(data->fan_div[nr-1]))); \ 574 - } 575 - show_fan_reg(fan); 576 - show_fan_reg(fan_min); 577 - 578 569 static ssize_t 579 - store_fan_min(struct device *dev, const char *buf, size_t count, int nr) 570 + show_fan_input(struct device *dev, struct device_attribute *devattr, char *buf) 580 571 { 572 + int nr = to_sensor_dev_attr(devattr)->index; 573 + struct w83627hf_data *data = w83627hf_update_device(dev); 574 + return sprintf(buf, "%ld\n", FAN_FROM_REG(data->fan[nr], 575 + (long)DIV_FROM_REG(data->fan_div[nr]))); 576 + } 577 + static ssize_t 578 + show_fan_min(struct device *dev, struct device_attribute *devattr, char *buf) 579 + { 580 + int nr = to_sensor_dev_attr(devattr)->index; 581 + struct w83627hf_data *data = w83627hf_update_device(dev); 582 + return sprintf(buf, "%ld\n", FAN_FROM_REG(data->fan_min[nr], 583 + (long)DIV_FROM_REG(data->fan_div[nr]))); 584 + } 585 + static ssize_t 586 + store_fan_min(struct device *dev, struct device_attribute *devattr, 587 + const char *buf, size_t count) 588 + { 589 + int nr = to_sensor_dev_attr(devattr)->index; 581 590 struct w83627hf_data *data = dev_get_drvdata(dev); 582 - u32 val; 583 - 584 - val = simple_strtoul(buf, NULL, 10); 591 + u32 val = simple_strtoul(buf, NULL, 10); 585 592 586 593 mutex_lock(&data->update_lock); 587 - data->fan_min[nr - 1] = 588 - FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr - 1])); 589 - w83627hf_write_value(data, W83781D_REG_FAN_MIN(nr), 590 - data->fan_min[nr - 1]); 594 + data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr])); 595 + w83627hf_write_value(data, W83781D_REG_FAN_MIN(nr+1), 596 + data->fan_min[nr]); 591 597 592 598 mutex_unlock(&data->update_lock); 593 599 return count; 594 600 } 601 + #define sysfs_fan_decl(offset) \ 602 + static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, \ 603 + show_fan_input, NULL, offset - 1); \ 604 + static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ 605 + show_fan_min, store_fan_min, offset - 1); 595 606 596 - #define sysfs_fan_offset(offset) \ 597 - static ssize_t show_regs_fan_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ 598 - { \ 599 - return show_fan(dev, buf, offset); \ 600 - } \ 601 - static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_regs_fan_##offset, NULL); 607 + sysfs_fan_decl(1); 608 + sysfs_fan_decl(2); 609 + sysfs_fan_decl(3); 602 610 603 - #define sysfs_fan_min_offset(offset) \ 604 - static ssize_t show_regs_fan_min##offset (struct device *dev, struct device_attribute *attr, char *buf) \ 605 - { \ 606 - return show_fan_min(dev, buf, offset); \ 607 - } \ 608 - static ssize_t \ 609 - store_regs_fan_min##offset (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ 610 - { \ 611 - return store_fan_min(dev, buf, count, offset); \ 612 - } \ 613 - static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ 614 - show_regs_fan_min##offset, store_regs_fan_min##offset); 615 - 616 - sysfs_fan_offset(1); 617 - sysfs_fan_min_offset(1); 618 - sysfs_fan_offset(2); 619 - sysfs_fan_min_offset(2); 620 - sysfs_fan_offset(3); 621 - sysfs_fan_min_offset(3); 622 - 623 - #define show_temp_reg(reg) \ 624 - static ssize_t show_##reg (struct device *dev, char *buf, int nr) \ 625 - { \ 626 - struct w83627hf_data *data = w83627hf_update_device(dev); \ 627 - if (nr >= 2) { /* TEMP2 and TEMP3 */ \ 628 - return sprintf(buf,"%ld\n", \ 629 - (long)LM75_TEMP_FROM_REG(data->reg##_add[nr-2])); \ 630 - } else { /* TEMP1 */ \ 631 - return sprintf(buf,"%ld\n", (long)TEMP_FROM_REG(data->reg)); \ 632 - } \ 611 + static ssize_t 612 + show_temp(struct device *dev, struct device_attribute *devattr, char *buf) 613 + { 614 + int nr = to_sensor_dev_attr(devattr)->index; 615 + struct w83627hf_data *data = w83627hf_update_device(dev); 616 + if (nr >= 2) { /* TEMP2 and TEMP3 */ 617 + return sprintf(buf, "%ld\n", 618 + (long)LM75_TEMP_FROM_REG(data->temp_add[nr-2])); 619 + } else { /* TEMP1 */ 620 + return sprintf(buf, "%ld\n", (long)TEMP_FROM_REG(data->temp)); 621 + } 633 622 } 634 - show_temp_reg(temp); 635 - show_temp_reg(temp_max); 636 - show_temp_reg(temp_max_hyst); 637 623 638 - #define store_temp_reg(REG, reg) \ 639 - static ssize_t \ 640 - store_temp_##reg (struct device *dev, const char *buf, size_t count, int nr) \ 641 - { \ 642 - struct w83627hf_data *data = dev_get_drvdata(dev); \ 643 - u32 val; \ 644 - \ 645 - val = simple_strtoul(buf, NULL, 10); \ 646 - \ 647 - mutex_lock(&data->update_lock); \ 648 - \ 649 - if (nr >= 2) { /* TEMP2 and TEMP3 */ \ 650 - data->temp_##reg##_add[nr-2] = LM75_TEMP_TO_REG(val); \ 651 - w83627hf_write_value(data, W83781D_REG_TEMP_##REG(nr), \ 652 - data->temp_##reg##_add[nr-2]); \ 653 - } else { /* TEMP1 */ \ 654 - data->temp_##reg = TEMP_TO_REG(val); \ 655 - w83627hf_write_value(data, W83781D_REG_TEMP_##REG(nr), \ 656 - data->temp_##reg); \ 657 - } \ 658 - \ 659 - mutex_unlock(&data->update_lock); \ 660 - return count; \ 624 + static ssize_t 625 + show_temp_max(struct device *dev, struct device_attribute *devattr, 626 + char *buf) 627 + { 628 + int nr = to_sensor_dev_attr(devattr)->index; 629 + struct w83627hf_data *data = w83627hf_update_device(dev); 630 + if (nr >= 2) { /* TEMP2 and TEMP3 */ 631 + return sprintf(buf, "%ld\n", 632 + (long)LM75_TEMP_FROM_REG(data->temp_max_add[nr-2])); 633 + } else { /* TEMP1 */ 634 + return sprintf(buf, "%ld\n", 635 + (long)TEMP_FROM_REG(data->temp_max)); 636 + } 661 637 } 662 - store_temp_reg(OVER, max); 663 - store_temp_reg(HYST, max_hyst); 664 638 665 - #define sysfs_temp_offset(offset) \ 666 - static ssize_t \ 667 - show_regs_temp_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ 668 - { \ 669 - return show_temp(dev, buf, offset); \ 670 - } \ 671 - static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_regs_temp_##offset, NULL); 639 + static ssize_t 640 + show_temp_max_hyst(struct device *dev, struct device_attribute *devattr, 641 + char *buf) 642 + { 643 + int nr = to_sensor_dev_attr(devattr)->index; 644 + struct w83627hf_data *data = w83627hf_update_device(dev); 645 + if (nr >= 2) { /* TEMP2 and TEMP3 */ 646 + return sprintf(buf, "%ld\n", 647 + (long)LM75_TEMP_FROM_REG(data->temp_max_hyst_add[nr-2])); 648 + } else { /* TEMP1 */ 649 + return sprintf(buf, "%ld\n", 650 + (long)TEMP_FROM_REG(data->temp_max_hyst)); 651 + } 652 + } 672 653 673 - #define sysfs_temp_reg_offset(reg, offset) \ 674 - static ssize_t show_regs_temp_##reg##offset (struct device *dev, struct device_attribute *attr, char *buf) \ 675 - { \ 676 - return show_temp_##reg (dev, buf, offset); \ 677 - } \ 678 - static ssize_t \ 679 - store_regs_temp_##reg##offset (struct device *dev, struct device_attribute *attr, \ 680 - const char *buf, size_t count) \ 681 - { \ 682 - return store_temp_##reg (dev, buf, count, offset); \ 683 - } \ 684 - static DEVICE_ATTR(temp##offset##_##reg, S_IRUGO| S_IWUSR, \ 685 - show_regs_temp_##reg##offset, store_regs_temp_##reg##offset); 654 + static ssize_t 655 + store_temp_max(struct device *dev, struct device_attribute *devattr, 656 + const char *buf, size_t count) 657 + { 658 + int nr = to_sensor_dev_attr(devattr)->index; 659 + struct w83627hf_data *data = dev_get_drvdata(dev); 660 + long val = simple_strtol(buf, NULL, 10); 686 661 687 - #define sysfs_temp_offsets(offset) \ 688 - sysfs_temp_offset(offset) \ 689 - sysfs_temp_reg_offset(max, offset) \ 690 - sysfs_temp_reg_offset(max_hyst, offset) 662 + mutex_lock(&data->update_lock); 691 663 692 - sysfs_temp_offsets(1); 693 - sysfs_temp_offsets(2); 694 - sysfs_temp_offsets(3); 664 + if (nr >= 2) { /* TEMP2 and TEMP3 */ 665 + data->temp_max_add[nr-2] = LM75_TEMP_TO_REG(val); 666 + w83627hf_write_value(data, W83781D_REG_TEMP_OVER(nr), 667 + data->temp_max_add[nr-2]); 668 + } else { /* TEMP1 */ 669 + data->temp_max = TEMP_TO_REG(val); 670 + w83627hf_write_value(data, W83781D_REG_TEMP_OVER(nr), 671 + data->temp_max); 672 + } 673 + mutex_unlock(&data->update_lock); 674 + return count; 675 + } 676 + 677 + static ssize_t 678 + store_temp_max_hyst(struct device *dev, struct device_attribute *devattr, 679 + const char *buf, size_t count) 680 + { 681 + int nr = to_sensor_dev_attr(devattr)->index; 682 + struct w83627hf_data *data = dev_get_drvdata(dev); 683 + long val = simple_strtol(buf, NULL, 10); 684 + 685 + mutex_lock(&data->update_lock); 686 + 687 + if (nr >= 2) { /* TEMP2 and TEMP3 */ 688 + data->temp_max_hyst_add[nr-2] = LM75_TEMP_TO_REG(val); 689 + w83627hf_write_value(data, W83781D_REG_TEMP_HYST(nr), 690 + data->temp_max_hyst_add[nr-2]); 691 + } else { /* TEMP1 */ 692 + data->temp_max_hyst = TEMP_TO_REG(val); 693 + w83627hf_write_value(data, W83781D_REG_TEMP_HYST(nr), 694 + data->temp_max_hyst); 695 + } 696 + mutex_unlock(&data->update_lock); 697 + return count; 698 + } 699 + 700 + #define sysfs_temp_decl(offset) \ 701 + static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, \ 702 + show_temp, NULL, offset); \ 703 + static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IRUGO|S_IWUSR, \ 704 + show_temp_max, store_temp_max, offset); \ 705 + static SENSOR_DEVICE_ATTR(temp##offset##_max_hyst, S_IRUGO|S_IWUSR, \ 706 + show_temp_max_hyst, store_temp_max_hyst, offset); 707 + 708 + sysfs_temp_decl(1); 709 + sysfs_temp_decl(2); 710 + sysfs_temp_decl(3); 695 711 696 712 static ssize_t 697 713 show_vid_reg(struct device *dev, struct device_attribute *attr, char *buf) ··· 718 706 static ssize_t 719 707 show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf) 720 708 { 721 - struct w83627hf_data *data = w83627hf_update_device(dev); 709 + struct w83627hf_data *data = dev_get_drvdata(dev); 722 710 return sprintf(buf, "%ld\n", (long) data->vrm); 723 711 } 724 712 static ssize_t ··· 803 791 sysfs_beep(MASK, mask); 804 792 805 793 static ssize_t 806 - show_fan_div_reg(struct device *dev, char *buf, int nr) 794 + show_fan_div(struct device *dev, struct device_attribute *devattr, char *buf) 807 795 { 796 + int nr = to_sensor_dev_attr(devattr)->index; 808 797 struct w83627hf_data *data = w83627hf_update_device(dev); 809 798 return sprintf(buf, "%ld\n", 810 - (long) DIV_FROM_REG(data->fan_div[nr - 1])); 799 + (long) DIV_FROM_REG(data->fan_div[nr])); 811 800 } 812 - 813 801 /* Note: we save and restore the fan minimum here, because its value is 814 802 determined in part by the fan divisor. This follows the principle of 815 803 least surprise; the user doesn't expect the fan minimum to change just 816 804 because the divisor changed. */ 817 805 static ssize_t 818 - store_fan_div_reg(struct device *dev, const char *buf, size_t count, int nr) 806 + store_fan_div(struct device *dev, struct device_attribute *devattr, 807 + const char *buf, size_t count) 819 808 { 809 + int nr = to_sensor_dev_attr(devattr)->index; 820 810 struct w83627hf_data *data = dev_get_drvdata(dev); 821 811 unsigned long min; 822 812 u8 reg; ··· 850 836 return count; 851 837 } 852 838 853 - #define sysfs_fan_div(offset) \ 854 - static ssize_t show_regs_fan_div_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ 855 - { \ 856 - return show_fan_div_reg(dev, buf, offset); \ 857 - } \ 858 - static ssize_t \ 859 - store_regs_fan_div_##offset (struct device *dev, struct device_attribute *attr, \ 860 - const char *buf, size_t count) \ 861 - { \ 862 - return store_fan_div_reg(dev, buf, count, offset - 1); \ 863 - } \ 864 - static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \ 865 - show_regs_fan_div_##offset, store_regs_fan_div_##offset); 866 - 867 - sysfs_fan_div(1); 868 - sysfs_fan_div(2); 869 - sysfs_fan_div(3); 839 + static SENSOR_DEVICE_ATTR(fan1_div, S_IRUGO|S_IWUSR, 840 + show_fan_div, store_fan_div, 0); 841 + static SENSOR_DEVICE_ATTR(fan2_div, S_IRUGO|S_IWUSR, 842 + show_fan_div, store_fan_div, 1); 843 + static SENSOR_DEVICE_ATTR(fan3_div, S_IRUGO|S_IWUSR, 844 + show_fan_div, store_fan_div, 2); 870 845 871 846 static ssize_t 872 - show_pwm_reg(struct device *dev, char *buf, int nr) 847 + show_pwm(struct device *dev, struct device_attribute *devattr, char *buf) 873 848 { 849 + int nr = to_sensor_dev_attr(devattr)->index; 874 850 struct w83627hf_data *data = w83627hf_update_device(dev); 875 - return sprintf(buf, "%ld\n", (long) data->pwm[nr - 1]); 851 + return sprintf(buf, "%ld\n", (long) data->pwm[nr]); 876 852 } 877 853 878 854 static ssize_t 879 - store_pwm_reg(struct device *dev, const char *buf, size_t count, int nr) 855 + store_pwm(struct device *dev, struct device_attribute *devattr, 856 + const char *buf, size_t count) 880 857 { 858 + int nr = to_sensor_dev_attr(devattr)->index; 881 859 struct w83627hf_data *data = dev_get_drvdata(dev); 882 - u32 val; 883 - 884 - val = simple_strtoul(buf, NULL, 10); 860 + u32 val = simple_strtoul(buf, NULL, 10); 885 861 886 862 mutex_lock(&data->update_lock); 887 863 888 864 if (data->type == w83627thf) { 889 865 /* bits 0-3 are reserved in 627THF */ 890 - data->pwm[nr - 1] = PWM_TO_REG(val) & 0xf0; 866 + data->pwm[nr] = PWM_TO_REG(val) & 0xf0; 891 867 w83627hf_write_value(data, 892 868 W836X7HF_REG_PWM(data->type, nr), 893 - data->pwm[nr - 1] | 869 + data->pwm[nr] | 894 870 (w83627hf_read_value(data, 895 871 W836X7HF_REG_PWM(data->type, nr)) & 0x0f)); 896 872 } else { 897 - data->pwm[nr - 1] = PWM_TO_REG(val); 873 + data->pwm[nr] = PWM_TO_REG(val); 898 874 w83627hf_write_value(data, 899 875 W836X7HF_REG_PWM(data->type, nr), 900 - data->pwm[nr - 1]); 876 + data->pwm[nr]); 901 877 } 902 878 903 879 mutex_unlock(&data->update_lock); 904 880 return count; 905 881 } 906 882 907 - #define sysfs_pwm(offset) \ 908 - static ssize_t show_regs_pwm_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ 909 - { \ 910 - return show_pwm_reg(dev, buf, offset); \ 911 - } \ 912 - static ssize_t \ 913 - store_regs_pwm_##offset (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ 914 - { \ 915 - return store_pwm_reg(dev, buf, count, offset); \ 916 - } \ 917 - static DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \ 918 - show_regs_pwm_##offset, store_regs_pwm_##offset); 919 - 920 - sysfs_pwm(1); 921 - sysfs_pwm(2); 922 - sysfs_pwm(3); 883 + static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0); 884 + static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 1); 885 + static SENSOR_DEVICE_ATTR(pwm3, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 2); 923 886 924 887 static ssize_t 925 - show_pwm_freq_reg(struct device *dev, char *buf, int nr) 888 + show_pwm_freq(struct device *dev, struct device_attribute *devattr, char *buf) 926 889 { 890 + int nr = to_sensor_dev_attr(devattr)->index; 927 891 struct w83627hf_data *data = w83627hf_update_device(dev); 928 892 if (data->type == w83627hf) 929 893 return sprintf(buf, "%ld\n", 930 - pwm_freq_from_reg_627hf(data->pwm_freq[nr - 1])); 894 + pwm_freq_from_reg_627hf(data->pwm_freq[nr])); 931 895 else 932 896 return sprintf(buf, "%ld\n", 933 - pwm_freq_from_reg(data->pwm_freq[nr - 1])); 897 + pwm_freq_from_reg(data->pwm_freq[nr])); 934 898 } 935 899 936 900 static ssize_t 937 - store_pwm_freq_reg(struct device *dev, const char *buf, size_t count, int nr) 901 + store_pwm_freq(struct device *dev, struct device_attribute *devattr, 902 + const char *buf, size_t count) 938 903 { 904 + int nr = to_sensor_dev_attr(devattr)->index; 939 905 struct w83627hf_data *data = dev_get_drvdata(dev); 940 906 static const u8 mask[]={0xF8, 0x8F}; 941 907 u32 val; ··· 925 931 mutex_lock(&data->update_lock); 926 932 927 933 if (data->type == w83627hf) { 928 - data->pwm_freq[nr - 1] = pwm_freq_to_reg_627hf(val); 934 + data->pwm_freq[nr] = pwm_freq_to_reg_627hf(val); 929 935 w83627hf_write_value(data, W83627HF_REG_PWM_FREQ, 930 - (data->pwm_freq[nr - 1] << ((nr - 1)*4)) | 936 + (data->pwm_freq[nr] << (nr*4)) | 931 937 (w83627hf_read_value(data, 932 - W83627HF_REG_PWM_FREQ) & mask[nr - 1])); 938 + W83627HF_REG_PWM_FREQ) & mask[nr])); 933 939 } else { 934 - data->pwm_freq[nr - 1] = pwm_freq_to_reg(val); 935 - w83627hf_write_value(data, W83637HF_REG_PWM_FREQ[nr - 1], 936 - data->pwm_freq[nr - 1]); 940 + data->pwm_freq[nr] = pwm_freq_to_reg(val); 941 + w83627hf_write_value(data, W83637HF_REG_PWM_FREQ[nr], 942 + data->pwm_freq[nr]); 937 943 } 938 944 939 945 mutex_unlock(&data->update_lock); 940 946 return count; 941 947 } 942 948 943 - #define sysfs_pwm_freq(offset) \ 944 - static ssize_t show_regs_pwm_freq_##offset(struct device *dev, \ 945 - struct device_attribute *attr, char *buf) \ 946 - { \ 947 - return show_pwm_freq_reg(dev, buf, offset); \ 948 - } \ 949 - static ssize_t \ 950 - store_regs_pwm_freq_##offset(struct device *dev, \ 951 - struct device_attribute *attr, const char *buf, size_t count) \ 952 - { \ 953 - return store_pwm_freq_reg(dev, buf, count, offset); \ 954 - } \ 955 - static DEVICE_ATTR(pwm##offset##_freq, S_IRUGO | S_IWUSR, \ 956 - show_regs_pwm_freq_##offset, store_regs_pwm_freq_##offset); 957 - 958 - sysfs_pwm_freq(1); 959 - sysfs_pwm_freq(2); 960 - sysfs_pwm_freq(3); 949 + static SENSOR_DEVICE_ATTR(pwm1_freq, S_IRUGO|S_IWUSR, 950 + show_pwm_freq, store_pwm_freq, 0); 951 + static SENSOR_DEVICE_ATTR(pwm2_freq, S_IRUGO|S_IWUSR, 952 + show_pwm_freq, store_pwm_freq, 1); 953 + static SENSOR_DEVICE_ATTR(pwm3_freq, S_IRUGO|S_IWUSR, 954 + show_pwm_freq, store_pwm_freq, 2); 961 955 962 956 static ssize_t 963 - show_sensor_reg(struct device *dev, char *buf, int nr) 957 + show_temp_type(struct device *dev, struct device_attribute *devattr, 958 + char *buf) 964 959 { 960 + int nr = to_sensor_dev_attr(devattr)->index; 965 961 struct w83627hf_data *data = w83627hf_update_device(dev); 966 - return sprintf(buf, "%ld\n", (long) data->sens[nr - 1]); 962 + return sprintf(buf, "%ld\n", (long) data->sens[nr]); 967 963 } 968 964 969 965 static ssize_t 970 - store_sensor_reg(struct device *dev, const char *buf, size_t count, int nr) 966 + store_temp_type(struct device *dev, struct device_attribute *devattr, 967 + const char *buf, size_t count) 971 968 { 969 + int nr = to_sensor_dev_attr(devattr)->index; 972 970 struct w83627hf_data *data = dev_get_drvdata(dev); 973 971 u32 val, tmp; 974 972 ··· 972 986 case 1: /* PII/Celeron diode */ 973 987 tmp = w83627hf_read_value(data, W83781D_REG_SCFG1); 974 988 w83627hf_write_value(data, W83781D_REG_SCFG1, 975 - tmp | BIT_SCFG1[nr - 1]); 989 + tmp | BIT_SCFG1[nr]); 976 990 tmp = w83627hf_read_value(data, W83781D_REG_SCFG2); 977 991 w83627hf_write_value(data, W83781D_REG_SCFG2, 978 - tmp | BIT_SCFG2[nr - 1]); 979 - data->sens[nr - 1] = val; 992 + tmp | BIT_SCFG2[nr]); 993 + data->sens[nr] = val; 980 994 break; 981 995 case 2: /* 3904 */ 982 996 tmp = w83627hf_read_value(data, W83781D_REG_SCFG1); 983 997 w83627hf_write_value(data, W83781D_REG_SCFG1, 984 - tmp | BIT_SCFG1[nr - 1]); 998 + tmp | BIT_SCFG1[nr]); 985 999 tmp = w83627hf_read_value(data, W83781D_REG_SCFG2); 986 1000 w83627hf_write_value(data, W83781D_REG_SCFG2, 987 - tmp & ~BIT_SCFG2[nr - 1]); 988 - data->sens[nr - 1] = val; 1001 + tmp & ~BIT_SCFG2[nr]); 1002 + data->sens[nr] = val; 989 1003 break; 990 - case W83781D_DEFAULT_BETA: /* thermistor */ 1004 + case W83781D_DEFAULT_BETA: 1005 + dev_warn(dev, "Sensor type %d is deprecated, please use 4 " 1006 + "instead\n", W83781D_DEFAULT_BETA); 1007 + /* fall through */ 1008 + case 4: /* thermistor */ 991 1009 tmp = w83627hf_read_value(data, W83781D_REG_SCFG1); 992 1010 w83627hf_write_value(data, W83781D_REG_SCFG1, 993 - tmp & ~BIT_SCFG1[nr - 1]); 994 - data->sens[nr - 1] = val; 1011 + tmp & ~BIT_SCFG1[nr]); 1012 + data->sens[nr] = val; 995 1013 break; 996 1014 default: 997 1015 dev_err(dev, 998 - "Invalid sensor type %ld; must be 1, 2, or %d\n", 999 - (long) val, W83781D_DEFAULT_BETA); 1016 + "Invalid sensor type %ld; must be 1, 2, or 4\n", 1017 + (long) val); 1000 1018 break; 1001 1019 } 1002 1020 ··· 1008 1018 return count; 1009 1019 } 1010 1020 1011 - #define sysfs_sensor(offset) \ 1012 - static ssize_t show_regs_sensor_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ 1013 - { \ 1014 - return show_sensor_reg(dev, buf, offset); \ 1015 - } \ 1016 - static ssize_t \ 1017 - store_regs_sensor_##offset (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ 1018 - { \ 1019 - return store_sensor_reg(dev, buf, count, offset); \ 1020 - } \ 1021 - static DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR, \ 1022 - show_regs_sensor_##offset, store_regs_sensor_##offset); 1021 + #define sysfs_temp_type(offset) \ 1022 + static SENSOR_DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR, \ 1023 + show_temp_type, store_temp_type, offset - 1); 1023 1024 1024 - sysfs_sensor(1); 1025 - sysfs_sensor(2); 1026 - sysfs_sensor(3); 1025 + sysfs_temp_type(1); 1026 + sysfs_temp_type(2); 1027 + sysfs_temp_type(3); 1027 1028 1028 - static ssize_t show_name(struct device *dev, struct device_attribute 1029 - *devattr, char *buf) 1029 + static ssize_t 1030 + show_name(struct device *dev, struct device_attribute *devattr, char *buf) 1030 1031 { 1031 1032 struct w83627hf_data *data = dev_get_drvdata(dev); 1032 1033 ··· 1099 1118 return err; 1100 1119 } 1101 1120 1121 + #define VIN_UNIT_ATTRS(_X_) \ 1122 + &sensor_dev_attr_in##_X_##_input.dev_attr.attr, \ 1123 + &sensor_dev_attr_in##_X_##_min.dev_attr.attr, \ 1124 + &sensor_dev_attr_in##_X_##_max.dev_attr.attr 1125 + 1126 + #define FAN_UNIT_ATTRS(_X_) \ 1127 + &sensor_dev_attr_fan##_X_##_input.dev_attr.attr, \ 1128 + &sensor_dev_attr_fan##_X_##_min.dev_attr.attr, \ 1129 + &sensor_dev_attr_fan##_X_##_div.dev_attr.attr 1130 + 1131 + #define TEMP_UNIT_ATTRS(_X_) \ 1132 + &sensor_dev_attr_temp##_X_##_input.dev_attr.attr, \ 1133 + &sensor_dev_attr_temp##_X_##_max.dev_attr.attr, \ 1134 + &sensor_dev_attr_temp##_X_##_max_hyst.dev_attr.attr, \ 1135 + &sensor_dev_attr_temp##_X_##_type.dev_attr.attr 1136 + 1102 1137 static struct attribute *w83627hf_attributes[] = { 1103 1138 &dev_attr_in0_input.attr, 1104 1139 &dev_attr_in0_min.attr, 1105 1140 &dev_attr_in0_max.attr, 1106 - &dev_attr_in2_input.attr, 1107 - &dev_attr_in2_min.attr, 1108 - &dev_attr_in2_max.attr, 1109 - &dev_attr_in3_input.attr, 1110 - &dev_attr_in3_min.attr, 1111 - &dev_attr_in3_max.attr, 1112 - &dev_attr_in4_input.attr, 1113 - &dev_attr_in4_min.attr, 1114 - &dev_attr_in4_max.attr, 1115 - &dev_attr_in7_input.attr, 1116 - &dev_attr_in7_min.attr, 1117 - &dev_attr_in7_max.attr, 1118 - &dev_attr_in8_input.attr, 1119 - &dev_attr_in8_min.attr, 1120 - &dev_attr_in8_max.attr, 1141 + VIN_UNIT_ATTRS(2), 1142 + VIN_UNIT_ATTRS(3), 1143 + VIN_UNIT_ATTRS(4), 1144 + VIN_UNIT_ATTRS(7), 1145 + VIN_UNIT_ATTRS(8), 1121 1146 1122 - &dev_attr_fan1_input.attr, 1123 - &dev_attr_fan1_min.attr, 1124 - &dev_attr_fan1_div.attr, 1125 - &dev_attr_fan2_input.attr, 1126 - &dev_attr_fan2_min.attr, 1127 - &dev_attr_fan2_div.attr, 1147 + FAN_UNIT_ATTRS(1), 1148 + FAN_UNIT_ATTRS(2), 1128 1149 1129 - &dev_attr_temp1_input.attr, 1130 - &dev_attr_temp1_max.attr, 1131 - &dev_attr_temp1_max_hyst.attr, 1132 - &dev_attr_temp1_type.attr, 1133 - &dev_attr_temp2_input.attr, 1134 - &dev_attr_temp2_max.attr, 1135 - &dev_attr_temp2_max_hyst.attr, 1136 - &dev_attr_temp2_type.attr, 1150 + TEMP_UNIT_ATTRS(1), 1151 + TEMP_UNIT_ATTRS(2), 1137 1152 1138 1153 &dev_attr_alarms.attr, 1139 1154 &dev_attr_beep_enable.attr, 1140 1155 &dev_attr_beep_mask.attr, 1141 1156 1142 - &dev_attr_pwm1.attr, 1143 - &dev_attr_pwm2.attr, 1144 - 1157 + &sensor_dev_attr_pwm1.dev_attr.attr, 1158 + &sensor_dev_attr_pwm2.dev_attr.attr, 1145 1159 &dev_attr_name.attr, 1146 1160 NULL 1147 1161 }; ··· 1146 1170 }; 1147 1171 1148 1172 static struct attribute *w83627hf_attributes_opt[] = { 1149 - &dev_attr_in1_input.attr, 1150 - &dev_attr_in1_min.attr, 1151 - &dev_attr_in1_max.attr, 1152 - &dev_attr_in5_input.attr, 1153 - &dev_attr_in5_min.attr, 1154 - &dev_attr_in5_max.attr, 1155 - &dev_attr_in6_input.attr, 1156 - &dev_attr_in6_min.attr, 1157 - &dev_attr_in6_max.attr, 1173 + VIN_UNIT_ATTRS(1), 1174 + VIN_UNIT_ATTRS(5), 1175 + VIN_UNIT_ATTRS(6), 1158 1176 1159 - &dev_attr_fan3_input.attr, 1160 - &dev_attr_fan3_min.attr, 1161 - &dev_attr_fan3_div.attr, 1177 + FAN_UNIT_ATTRS(3), 1178 + TEMP_UNIT_ATTRS(3), 1179 + &sensor_dev_attr_pwm3.dev_attr.attr, 1162 1180 1163 - &dev_attr_temp3_input.attr, 1164 - &dev_attr_temp3_max.attr, 1165 - &dev_attr_temp3_max_hyst.attr, 1166 - &dev_attr_temp3_type.attr, 1167 - 1168 - &dev_attr_pwm3.attr, 1169 - 1170 - &dev_attr_pwm1_freq.attr, 1171 - &dev_attr_pwm2_freq.attr, 1172 - &dev_attr_pwm3_freq.attr, 1181 + &sensor_dev_attr_pwm1_freq.dev_attr.attr, 1182 + &sensor_dev_attr_pwm2_freq.dev_attr.attr, 1183 + &sensor_dev_attr_pwm3_freq.dev_attr.attr, 1173 1184 NULL 1174 1185 }; 1175 1186 ··· 1207 1244 data->fan_min[0] = w83627hf_read_value(data, W83781D_REG_FAN_MIN(1)); 1208 1245 data->fan_min[1] = w83627hf_read_value(data, W83781D_REG_FAN_MIN(2)); 1209 1246 data->fan_min[2] = w83627hf_read_value(data, W83781D_REG_FAN_MIN(3)); 1247 + w83627hf_update_fan_div(data); 1210 1248 1211 1249 /* Register common device attributes */ 1212 1250 if ((err = sysfs_create_group(&dev->kobj, &w83627hf_group))) ··· 1215 1251 1216 1252 /* Register chip-specific device attributes */ 1217 1253 if (data->type == w83627hf || data->type == w83697hf) 1218 - if ((err = device_create_file(dev, &dev_attr_in5_input)) 1219 - || (err = device_create_file(dev, &dev_attr_in5_min)) 1220 - || (err = device_create_file(dev, &dev_attr_in5_max)) 1221 - || (err = device_create_file(dev, &dev_attr_in6_input)) 1222 - || (err = device_create_file(dev, &dev_attr_in6_min)) 1223 - || (err = device_create_file(dev, &dev_attr_in6_max)) 1224 - || (err = device_create_file(dev, &dev_attr_pwm1_freq)) 1225 - || (err = device_create_file(dev, &dev_attr_pwm2_freq))) 1254 + if ((err = device_create_file(dev, 1255 + &sensor_dev_attr_in5_input.dev_attr)) 1256 + || (err = device_create_file(dev, 1257 + &sensor_dev_attr_in5_min.dev_attr)) 1258 + || (err = device_create_file(dev, 1259 + &sensor_dev_attr_in5_max.dev_attr)) 1260 + || (err = device_create_file(dev, 1261 + &sensor_dev_attr_in6_input.dev_attr)) 1262 + || (err = device_create_file(dev, 1263 + &sensor_dev_attr_in6_min.dev_attr)) 1264 + || (err = device_create_file(dev, 1265 + &sensor_dev_attr_in6_max.dev_attr)) 1266 + || (err = device_create_file(dev, 1267 + &sensor_dev_attr_pwm1_freq.dev_attr)) 1268 + || (err = device_create_file(dev, 1269 + &sensor_dev_attr_pwm2_freq.dev_attr))) 1226 1270 goto ERROR4; 1227 1271 1228 1272 if (data->type != w83697hf) 1229 - if ((err = device_create_file(dev, &dev_attr_in1_input)) 1230 - || (err = device_create_file(dev, &dev_attr_in1_min)) 1231 - || (err = device_create_file(dev, &dev_attr_in1_max)) 1232 - || (err = device_create_file(dev, &dev_attr_fan3_input)) 1233 - || (err = device_create_file(dev, &dev_attr_fan3_min)) 1234 - || (err = device_create_file(dev, &dev_attr_fan3_div)) 1235 - || (err = device_create_file(dev, &dev_attr_temp3_input)) 1236 - || (err = device_create_file(dev, &dev_attr_temp3_max)) 1237 - || (err = device_create_file(dev, &dev_attr_temp3_max_hyst)) 1238 - || (err = device_create_file(dev, &dev_attr_temp3_type))) 1273 + if ((err = device_create_file(dev, 1274 + &sensor_dev_attr_in1_input.dev_attr)) 1275 + || (err = device_create_file(dev, 1276 + &sensor_dev_attr_in1_min.dev_attr)) 1277 + || (err = device_create_file(dev, 1278 + &sensor_dev_attr_in1_max.dev_attr)) 1279 + || (err = device_create_file(dev, 1280 + &sensor_dev_attr_fan3_input.dev_attr)) 1281 + || (err = device_create_file(dev, 1282 + &sensor_dev_attr_fan3_min.dev_attr)) 1283 + || (err = device_create_file(dev, 1284 + &sensor_dev_attr_fan3_div.dev_attr)) 1285 + || (err = device_create_file(dev, 1286 + &sensor_dev_attr_temp3_input.dev_attr)) 1287 + || (err = device_create_file(dev, 1288 + &sensor_dev_attr_temp3_max.dev_attr)) 1289 + || (err = device_create_file(dev, 1290 + &sensor_dev_attr_temp3_max_hyst.dev_attr)) 1291 + || (err = device_create_file(dev, 1292 + &sensor_dev_attr_temp3_type.dev_attr))) 1239 1293 goto ERROR4; 1240 1294 1241 1295 if (data->type != w83697hf && data->vid != 0xff) { ··· 1267 1285 1268 1286 if (data->type == w83627thf || data->type == w83637hf 1269 1287 || data->type == w83687thf) 1270 - if ((err = device_create_file(dev, &dev_attr_pwm3))) 1288 + if ((err = device_create_file(dev, 1289 + &sensor_dev_attr_pwm3.dev_attr))) 1271 1290 goto ERROR4; 1272 1291 1273 1292 if (data->type == w83637hf || data->type == w83687thf) 1274 - if ((err = device_create_file(dev, &dev_attr_pwm1_freq)) 1275 - || (err = device_create_file(dev, &dev_attr_pwm2_freq)) 1276 - || (err = device_create_file(dev, &dev_attr_pwm3_freq))) 1293 + if ((err = device_create_file(dev, 1294 + &sensor_dev_attr_pwm1_freq.dev_attr)) 1295 + || (err = device_create_file(dev, 1296 + &sensor_dev_attr_pwm2_freq.dev_attr)) 1297 + || (err = device_create_file(dev, 1298 + &sensor_dev_attr_pwm3_freq.dev_attr))) 1277 1299 goto ERROR4; 1278 1300 1279 - data->class_dev = hwmon_device_register(dev); 1280 - if (IS_ERR(data->class_dev)) { 1281 - err = PTR_ERR(data->class_dev); 1301 + data->hwmon_dev = hwmon_device_register(dev); 1302 + if (IS_ERR(data->hwmon_dev)) { 1303 + err = PTR_ERR(data->hwmon_dev); 1282 1304 goto ERROR4; 1283 1305 } 1284 1306 ··· 1305 1319 struct w83627hf_data *data = platform_get_drvdata(pdev); 1306 1320 struct resource *res; 1307 1321 1308 - hwmon_device_unregister(data->class_dev); 1322 + hwmon_device_unregister(data->hwmon_dev); 1309 1323 1310 1324 sysfs_remove_group(&pdev->dev.kobj, &w83627hf_group); 1311 1325 sysfs_remove_group(&pdev->dev.kobj, &w83627hf_group_opt); ··· 1319 1333 } 1320 1334 1321 1335 1336 + /* Registers 0x50-0x5f are banked */ 1337 + static inline void w83627hf_set_bank(struct w83627hf_data *data, u16 reg) 1338 + { 1339 + if ((reg & 0x00f0) == 0x50) { 1340 + outb_p(W83781D_REG_BANK, data->addr + W83781D_ADDR_REG_OFFSET); 1341 + outb_p(reg >> 8, data->addr + W83781D_DATA_REG_OFFSET); 1342 + } 1343 + } 1344 + 1345 + /* Not strictly necessary, but play it safe for now */ 1346 + static inline void w83627hf_reset_bank(struct w83627hf_data *data, u16 reg) 1347 + { 1348 + if (reg & 0xff00) { 1349 + outb_p(W83781D_REG_BANK, data->addr + W83781D_ADDR_REG_OFFSET); 1350 + outb_p(0, data->addr + W83781D_DATA_REG_OFFSET); 1351 + } 1352 + } 1353 + 1322 1354 static int w83627hf_read_value(struct w83627hf_data *data, u16 reg) 1323 1355 { 1324 1356 int res, word_sized; ··· 1347 1343 && (((reg & 0x00ff) == 0x50) 1348 1344 || ((reg & 0x00ff) == 0x53) 1349 1345 || ((reg & 0x00ff) == 0x55)); 1350 - if (reg & 0xff00) { 1351 - outb_p(W83781D_REG_BANK, 1352 - data->addr + W83781D_ADDR_REG_OFFSET); 1353 - outb_p(reg >> 8, 1354 - data->addr + W83781D_DATA_REG_OFFSET); 1355 - } 1346 + w83627hf_set_bank(data, reg); 1356 1347 outb_p(reg & 0xff, data->addr + W83781D_ADDR_REG_OFFSET); 1357 1348 res = inb_p(data->addr + W83781D_DATA_REG_OFFSET); 1358 1349 if (word_sized) { ··· 1357 1358 (res << 8) + inb_p(data->addr + 1358 1359 W83781D_DATA_REG_OFFSET); 1359 1360 } 1360 - if (reg & 0xff00) { 1361 - outb_p(W83781D_REG_BANK, 1362 - data->addr + W83781D_ADDR_REG_OFFSET); 1363 - outb_p(0, data->addr + W83781D_DATA_REG_OFFSET); 1364 - } 1361 + w83627hf_reset_bank(data, reg); 1365 1362 mutex_unlock(&data->lock); 1366 1363 return res; 1367 1364 } ··· 1428 1433 || ((reg & 0xff00) == 0x200)) 1429 1434 && (((reg & 0x00ff) == 0x53) 1430 1435 || ((reg & 0x00ff) == 0x55)); 1431 - if (reg & 0xff00) { 1432 - outb_p(W83781D_REG_BANK, 1433 - data->addr + W83781D_ADDR_REG_OFFSET); 1434 - outb_p(reg >> 8, 1435 - data->addr + W83781D_DATA_REG_OFFSET); 1436 - } 1436 + w83627hf_set_bank(data, reg); 1437 1437 outb_p(reg & 0xff, data->addr + W83781D_ADDR_REG_OFFSET); 1438 1438 if (word_sized) { 1439 1439 outb_p(value >> 8, ··· 1438 1448 } 1439 1449 outb_p(value & 0xff, 1440 1450 data->addr + W83781D_DATA_REG_OFFSET); 1441 - if (reg & 0xff00) { 1442 - outb_p(W83781D_REG_BANK, 1443 - data->addr + W83781D_ADDR_REG_OFFSET); 1444 - outb_p(0, data->addr + W83781D_DATA_REG_OFFSET); 1445 - } 1451 + w83627hf_reset_bank(data, reg); 1446 1452 mutex_unlock(&data->lock); 1447 1453 return 0; 1448 1454 } ··· 1499 1513 tmp = w83627hf_read_value(data, W83781D_REG_SCFG1); 1500 1514 for (i = 1; i <= 3; i++) { 1501 1515 if (!(tmp & BIT_SCFG1[i - 1])) { 1502 - data->sens[i - 1] = W83781D_DEFAULT_BETA; 1516 + data->sens[i - 1] = 4; 1503 1517 } else { 1504 1518 if (w83627hf_read_value 1505 1519 (data, ··· 1542 1556 | 0x01); 1543 1557 } 1544 1558 1559 + static void w83627hf_update_fan_div(struct w83627hf_data *data) 1560 + { 1561 + int reg; 1562 + 1563 + reg = w83627hf_read_value(data, W83781D_REG_VID_FANDIV); 1564 + data->fan_div[0] = (reg >> 4) & 0x03; 1565 + data->fan_div[1] = (reg >> 6) & 0x03; 1566 + if (data->type != w83697hf) { 1567 + data->fan_div[2] = (w83627hf_read_value(data, 1568 + W83781D_REG_PIN) >> 6) & 0x03; 1569 + } 1570 + reg = w83627hf_read_value(data, W83781D_REG_VBAT); 1571 + data->fan_div[0] |= (reg >> 3) & 0x04; 1572 + data->fan_div[1] |= (reg >> 4) & 0x04; 1573 + if (data->type != w83697hf) 1574 + data->fan_div[2] |= (reg >> 5) & 0x04; 1575 + } 1576 + 1545 1577 static struct w83627hf_data *w83627hf_update_device(struct device *dev) 1546 1578 { 1547 1579 struct w83627hf_data *data = dev_get_drvdata(dev); ··· 1591 1587 w83627hf_read_value(data, 1592 1588 W83781D_REG_FAN_MIN(i)); 1593 1589 } 1594 - for (i = 1; i <= 3; i++) { 1590 + for (i = 0; i <= 2; i++) { 1595 1591 u8 tmp = w83627hf_read_value(data, 1596 1592 W836X7HF_REG_PWM(data->type, i)); 1597 1593 /* bits 0-3 are reserved in 627THF */ 1598 1594 if (data->type == w83627thf) 1599 1595 tmp &= 0xf0; 1600 - data->pwm[i - 1] = tmp; 1601 - if(i == 2 && 1602 - (data->type == w83627hf || data->type == w83697hf)) 1596 + data->pwm[i] = tmp; 1597 + if (i == 1 && 1598 + (data->type == w83627hf || data->type == w83697hf)) 1603 1599 break; 1604 1600 } 1605 1601 if (data->type == w83627hf) { ··· 1637 1633 w83627hf_read_value(data, W83781D_REG_TEMP_HYST(3)); 1638 1634 } 1639 1635 1640 - i = w83627hf_read_value(data, W83781D_REG_VID_FANDIV); 1641 - data->fan_div[0] = (i >> 4) & 0x03; 1642 - data->fan_div[1] = (i >> 6) & 0x03; 1643 - if (data->type != w83697hf) { 1644 - data->fan_div[2] = (w83627hf_read_value(data, 1645 - W83781D_REG_PIN) >> 6) & 0x03; 1646 - } 1647 - i = w83627hf_read_value(data, W83781D_REG_VBAT); 1648 - data->fan_div[0] |= (i >> 3) & 0x04; 1649 - data->fan_div[1] |= (i >> 4) & 0x04; 1650 - if (data->type != w83697hf) 1651 - data->fan_div[2] |= (i >> 5) & 0x04; 1636 + w83627hf_update_fan_div(data); 1637 + 1652 1638 data->alarms = 1653 1639 w83627hf_read_value(data, W83781D_REG_ALARM1) | 1654 1640 (w83627hf_read_value(data, W83781D_REG_ALARM2) << 8) |
+182 -24
drivers/hwmon/w83781d.c
··· 220 220 the driver field to differentiate between I2C and ISA chips. */ 221 221 struct w83781d_data { 222 222 struct i2c_client client; 223 - struct class_device *class_dev; 223 + struct device *hwmon_dev; 224 224 struct mutex lock; 225 225 enum chips type; 226 226 ··· 251 251 u8 pwm2_enable; /* Boolean */ 252 252 u16 sens[3]; /* 782D/783S only. 253 253 1 = pentium diode; 2 = 3904 diode; 254 - 3000-5000 = thermistor beta. 255 - Default = 3435. 256 - Other Betas unimplemented */ 254 + 4 = thermistor */ 257 255 u8 vrm; 258 256 }; 259 257 ··· 408 410 struct sensor_device_attribute *attr = to_sensor_dev_attr(da); \ 409 411 struct w83781d_data *data = dev_get_drvdata(dev); \ 410 412 int nr = attr->index; \ 411 - s32 val; \ 413 + long val; \ 412 414 \ 413 415 val = simple_strtol(buf, NULL, 10); \ 414 416 \ ··· 454 456 static ssize_t 455 457 show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf) 456 458 { 457 - struct w83781d_data *data = w83781d_update_device(dev); 459 + struct w83781d_data *data = dev_get_drvdata(dev); 458 460 return sprintf(buf, "%ld\n", (long) data->vrm); 459 461 } 460 462 ··· 480 482 } 481 483 482 484 static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL); 485 + 486 + static ssize_t show_alarm(struct device *dev, struct device_attribute *attr, 487 + char *buf) 488 + { 489 + struct w83781d_data *data = w83781d_update_device(dev); 490 + int bitnr = to_sensor_dev_attr(attr)->index; 491 + return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1); 492 + } 493 + 494 + /* The W83781D has a single alarm bit for temp2 and temp3 */ 495 + static ssize_t show_temp3_alarm(struct device *dev, 496 + struct device_attribute *attr, char *buf) 497 + { 498 + struct w83781d_data *data = w83781d_update_device(dev); 499 + int bitnr = (data->type == w83781d) ? 5 : 13; 500 + return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1); 501 + } 502 + 503 + static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0); 504 + static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1); 505 + static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2); 506 + static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3); 507 + static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8); 508 + static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9); 509 + static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 10); 510 + static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 16); 511 + static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 17); 512 + static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6); 513 + static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7); 514 + static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 11); 515 + static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4); 516 + static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5); 517 + static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_temp3_alarm, NULL, 0); 483 518 484 519 static ssize_t show_beep_mask (struct device *dev, struct device_attribute *attr, char *buf) 485 520 { ··· 576 545 show_beep_mask, store_beep_mask); 577 546 static DEVICE_ATTR(beep_enable, S_IRUGO | S_IWUSR, 578 547 show_beep_enable, store_beep_enable); 548 + 549 + static ssize_t show_beep(struct device *dev, struct device_attribute *attr, 550 + char *buf) 551 + { 552 + struct w83781d_data *data = w83781d_update_device(dev); 553 + int bitnr = to_sensor_dev_attr(attr)->index; 554 + return sprintf(buf, "%u\n", (data->beep_mask >> bitnr) & 1); 555 + } 556 + 557 + static ssize_t 558 + store_beep(struct device *dev, struct device_attribute *attr, 559 + const char *buf, size_t count) 560 + { 561 + struct w83781d_data *data = dev_get_drvdata(dev); 562 + int bitnr = to_sensor_dev_attr(attr)->index; 563 + unsigned long bit; 564 + u8 reg; 565 + 566 + bit = simple_strtoul(buf, NULL, 10); 567 + if (bit & ~1) 568 + return -EINVAL; 569 + 570 + mutex_lock(&data->update_lock); 571 + if (bit) 572 + data->beep_mask |= (1 << bitnr); 573 + else 574 + data->beep_mask &= ~(1 << bitnr); 575 + 576 + if (bitnr < 8) { 577 + reg = w83781d_read_value(data, W83781D_REG_BEEP_INTS1); 578 + if (bit) 579 + reg |= (1 << bitnr); 580 + else 581 + reg &= ~(1 << bitnr); 582 + w83781d_write_value(data, W83781D_REG_BEEP_INTS1, reg); 583 + } else if (bitnr < 16) { 584 + reg = w83781d_read_value(data, W83781D_REG_BEEP_INTS2); 585 + if (bit) 586 + reg |= (1 << (bitnr - 8)); 587 + else 588 + reg &= ~(1 << (bitnr - 8)); 589 + w83781d_write_value(data, W83781D_REG_BEEP_INTS2, reg); 590 + } else { 591 + reg = w83781d_read_value(data, W83781D_REG_BEEP_INTS3); 592 + if (bit) 593 + reg |= (1 << (bitnr - 16)); 594 + else 595 + reg &= ~(1 << (bitnr - 16)); 596 + w83781d_write_value(data, W83781D_REG_BEEP_INTS3, reg); 597 + } 598 + mutex_unlock(&data->update_lock); 599 + 600 + return count; 601 + } 602 + 603 + /* The W83781D has a single beep bit for temp2 and temp3 */ 604 + static ssize_t show_temp3_beep(struct device *dev, 605 + struct device_attribute *attr, char *buf) 606 + { 607 + struct w83781d_data *data = w83781d_update_device(dev); 608 + int bitnr = (data->type == w83781d) ? 5 : 13; 609 + return sprintf(buf, "%u\n", (data->beep_mask >> bitnr) & 1); 610 + } 611 + 612 + static SENSOR_DEVICE_ATTR(in0_beep, S_IRUGO | S_IWUSR, 613 + show_beep, store_beep, 0); 614 + static SENSOR_DEVICE_ATTR(in1_beep, S_IRUGO | S_IWUSR, 615 + show_beep, store_beep, 1); 616 + static SENSOR_DEVICE_ATTR(in2_beep, S_IRUGO | S_IWUSR, 617 + show_beep, store_beep, 2); 618 + static SENSOR_DEVICE_ATTR(in3_beep, S_IRUGO | S_IWUSR, 619 + show_beep, store_beep, 3); 620 + static SENSOR_DEVICE_ATTR(in4_beep, S_IRUGO | S_IWUSR, 621 + show_beep, store_beep, 8); 622 + static SENSOR_DEVICE_ATTR(in5_beep, S_IRUGO | S_IWUSR, 623 + show_beep, store_beep, 9); 624 + static SENSOR_DEVICE_ATTR(in6_beep, S_IRUGO | S_IWUSR, 625 + show_beep, store_beep, 10); 626 + static SENSOR_DEVICE_ATTR(in7_beep, S_IRUGO | S_IWUSR, 627 + show_beep, store_beep, 16); 628 + static SENSOR_DEVICE_ATTR(in8_beep, S_IRUGO | S_IWUSR, 629 + show_beep, store_beep, 17); 630 + static SENSOR_DEVICE_ATTR(fan1_beep, S_IRUGO | S_IWUSR, 631 + show_beep, store_beep, 6); 632 + static SENSOR_DEVICE_ATTR(fan2_beep, S_IRUGO | S_IWUSR, 633 + show_beep, store_beep, 7); 634 + static SENSOR_DEVICE_ATTR(fan3_beep, S_IRUGO | S_IWUSR, 635 + show_beep, store_beep, 11); 636 + static SENSOR_DEVICE_ATTR(temp1_beep, S_IRUGO | S_IWUSR, 637 + show_beep, store_beep, 4); 638 + static SENSOR_DEVICE_ATTR(temp2_beep, S_IRUGO | S_IWUSR, 639 + show_beep, store_beep, 5); 640 + static SENSOR_DEVICE_ATTR(temp3_beep, S_IRUGO, 641 + show_temp3_beep, store_beep, 13); 579 642 580 643 static ssize_t 581 644 show_fan_div(struct device *dev, struct device_attribute *da, char *buf) ··· 846 721 tmp & ~BIT_SCFG2[nr]); 847 722 data->sens[nr] = val; 848 723 break; 849 - case W83781D_DEFAULT_BETA: /* thermistor */ 724 + case W83781D_DEFAULT_BETA: 725 + dev_warn(dev, "Sensor type %d is deprecated, please use 4 " 726 + "instead\n", W83781D_DEFAULT_BETA); 727 + /* fall through */ 728 + case 4: /* thermistor */ 850 729 tmp = w83781d_read_value(data, W83781D_REG_SCFG1); 851 730 w83781d_write_value(data, W83781D_REG_SCFG1, 852 731 tmp & ~BIT_SCFG1[nr]); 853 732 data->sens[nr] = val; 854 733 break; 855 734 default: 856 - dev_err(dev, "Invalid sensor type %ld; must be 1, 2, or %d\n", 857 - (long) val, W83781D_DEFAULT_BETA); 735 + dev_err(dev, "Invalid sensor type %ld; must be 1, 2, or 4\n", 736 + (long) val); 858 737 break; 859 738 } 860 739 ··· 1004 875 #define IN_UNIT_ATTRS(X) \ 1005 876 &sensor_dev_attr_in##X##_input.dev_attr.attr, \ 1006 877 &sensor_dev_attr_in##X##_min.dev_attr.attr, \ 1007 - &sensor_dev_attr_in##X##_max.dev_attr.attr 878 + &sensor_dev_attr_in##X##_max.dev_attr.attr, \ 879 + &sensor_dev_attr_in##X##_alarm.dev_attr.attr, \ 880 + &sensor_dev_attr_in##X##_beep.dev_attr.attr 1008 881 1009 882 #define FAN_UNIT_ATTRS(X) \ 1010 883 &sensor_dev_attr_fan##X##_input.dev_attr.attr, \ 1011 884 &sensor_dev_attr_fan##X##_min.dev_attr.attr, \ 1012 - &sensor_dev_attr_fan##X##_div.dev_attr.attr 885 + &sensor_dev_attr_fan##X##_div.dev_attr.attr, \ 886 + &sensor_dev_attr_fan##X##_alarm.dev_attr.attr, \ 887 + &sensor_dev_attr_fan##X##_beep.dev_attr.attr 1013 888 1014 889 #define TEMP_UNIT_ATTRS(X) \ 1015 890 &sensor_dev_attr_temp##X##_input.dev_attr.attr, \ 1016 891 &sensor_dev_attr_temp##X##_max.dev_attr.attr, \ 1017 - &sensor_dev_attr_temp##X##_max_hyst.dev_attr.attr 892 + &sensor_dev_attr_temp##X##_max_hyst.dev_attr.attr, \ 893 + &sensor_dev_attr_temp##X##_alarm.dev_attr.attr, \ 894 + &sensor_dev_attr_temp##X##_beep.dev_attr.attr 1018 895 1019 896 static struct attribute* w83781d_attributes[] = { 1020 897 IN_UNIT_ATTRS(0), ··· 1079 944 || (err = device_create_file(dev, 1080 945 &sensor_dev_attr_in1_min.dev_attr)) 1081 946 || (err = device_create_file(dev, 1082 - &sensor_dev_attr_in1_max.dev_attr))) 947 + &sensor_dev_attr_in1_max.dev_attr)) 948 + || (err = device_create_file(dev, 949 + &sensor_dev_attr_in1_alarm.dev_attr)) 950 + || (err = device_create_file(dev, 951 + &sensor_dev_attr_in1_beep.dev_attr))) 1083 952 return err; 1084 953 } 1085 954 if (kind != as99127f && kind != w83781d && kind != w83783s) { ··· 1094 955 || (err = device_create_file(dev, 1095 956 &sensor_dev_attr_in7_max.dev_attr)) 1096 957 || (err = device_create_file(dev, 958 + &sensor_dev_attr_in7_alarm.dev_attr)) 959 + || (err = device_create_file(dev, 960 + &sensor_dev_attr_in7_beep.dev_attr)) 961 + || (err = device_create_file(dev, 1097 962 &sensor_dev_attr_in8_input.dev_attr)) 1098 963 || (err = device_create_file(dev, 1099 964 &sensor_dev_attr_in8_min.dev_attr)) 1100 965 || (err = device_create_file(dev, 1101 - &sensor_dev_attr_in8_max.dev_attr))) 966 + &sensor_dev_attr_in8_max.dev_attr)) 967 + || (err = device_create_file(dev, 968 + &sensor_dev_attr_in8_alarm.dev_attr)) 969 + || (err = device_create_file(dev, 970 + &sensor_dev_attr_in8_beep.dev_attr))) 1102 971 return err; 1103 972 } 1104 973 if (kind != w83783s) { ··· 1115 968 || (err = device_create_file(dev, 1116 969 &sensor_dev_attr_temp3_max.dev_attr)) 1117 970 || (err = device_create_file(dev, 1118 - &sensor_dev_attr_temp3_max_hyst.dev_attr))) 971 + &sensor_dev_attr_temp3_max_hyst.dev_attr)) 972 + || (err = device_create_file(dev, 973 + &sensor_dev_attr_temp3_alarm.dev_attr)) 974 + || (err = device_create_file(dev, 975 + &sensor_dev_attr_temp3_beep.dev_attr))) 1119 976 return err; 977 + 978 + if (kind != w83781d) 979 + err = sysfs_chmod_file(&dev->kobj, 980 + &sensor_dev_attr_temp3_alarm.dev_attr.attr, 981 + S_IRUGO | S_IWUSR); 982 + if (err) 983 + return err; 1120 984 } 1121 985 1122 986 if (kind != w83781d && kind != as99127f) { ··· 1314 1156 if (err) 1315 1157 goto ERROR4; 1316 1158 1317 - data->class_dev = hwmon_device_register(dev); 1318 - if (IS_ERR(data->class_dev)) { 1319 - err = PTR_ERR(data->class_dev); 1159 + data->hwmon_dev = hwmon_device_register(dev); 1160 + if (IS_ERR(data->hwmon_dev)) { 1161 + err = PTR_ERR(data->hwmon_dev); 1320 1162 goto ERROR4; 1321 1163 } 1322 1164 ··· 1350 1192 1351 1193 /* main client */ 1352 1194 if (data) { 1353 - hwmon_device_unregister(data->class_dev); 1195 + hwmon_device_unregister(data->hwmon_dev); 1354 1196 sysfs_remove_group(&client->dev.kobj, &w83781d_group); 1355 1197 sysfs_remove_group(&client->dev.kobj, &w83781d_group_opt); 1356 1198 } ··· 1417 1259 if (err) 1418 1260 goto exit_remove_files; 1419 1261 1420 - data->class_dev = hwmon_device_register(&pdev->dev); 1421 - if (IS_ERR(data->class_dev)) { 1422 - err = PTR_ERR(data->class_dev); 1262 + data->hwmon_dev = hwmon_device_register(&pdev->dev); 1263 + if (IS_ERR(data->hwmon_dev)) { 1264 + err = PTR_ERR(data->hwmon_dev); 1423 1265 goto exit_remove_files; 1424 1266 } 1425 1267 ··· 1441 1283 { 1442 1284 struct w83781d_data *data = platform_get_drvdata(pdev); 1443 1285 1444 - hwmon_device_unregister(data->class_dev); 1286 + hwmon_device_unregister(data->hwmon_dev); 1445 1287 sysfs_remove_group(&pdev->dev.kobj, &w83781d_group); 1446 1288 sysfs_remove_group(&pdev->dev.kobj, &w83781d_group_opt); 1447 1289 device_remove_file(&pdev->dev, &dev_attr_name); ··· 1643 1485 tmp = w83781d_read_value(data, W83781D_REG_SCFG1); 1644 1486 for (i = 1; i <= 3; i++) { 1645 1487 if (!(tmp & BIT_SCFG1[i - 1])) { 1646 - data->sens[i - 1] = W83781D_DEFAULT_BETA; 1488 + data->sens[i - 1] = 4; 1647 1489 } else { 1648 1490 if (w83781d_read_value 1649 1491 (data,
+124 -10
drivers/hwmon/w83791d.c
··· 2 2 w83791d.c - Part of lm_sensors, Linux kernel modules for hardware 3 3 monitoring 4 4 5 - Copyright (C) 2006 Charles Spirakis <bezaur@gmail.com> 5 + Copyright (C) 2006-2007 Charles Spirakis <bezaur@gmail.com> 6 6 7 7 This program is free software; you can redistribute it and/or modify 8 8 it under the terms of the GNU General Public License as published by ··· 247 247 248 248 struct w83791d_data { 249 249 struct i2c_client client; 250 - struct class_device *class_dev; 250 + struct device *hwmon_dev; 251 251 struct mutex update_lock; 252 252 253 253 char valid; /* !=0 if following fields are valid */ ··· 382 382 SENSOR_ATTR(in7_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 7), 383 383 SENSOR_ATTR(in8_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 8), 384 384 SENSOR_ATTR(in9_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 9), 385 + }; 386 + 387 + 388 + static ssize_t show_beep(struct device *dev, struct device_attribute *attr, 389 + char *buf) 390 + { 391 + struct sensor_device_attribute *sensor_attr = 392 + to_sensor_dev_attr(attr); 393 + struct w83791d_data *data = w83791d_update_device(dev); 394 + int bitnr = sensor_attr->index; 395 + 396 + return sprintf(buf, "%d\n", (data->beep_mask >> bitnr) & 1); 397 + } 398 + 399 + static ssize_t store_beep(struct device *dev, struct device_attribute *attr, 400 + const char *buf, size_t count) 401 + { 402 + struct sensor_device_attribute *sensor_attr = 403 + to_sensor_dev_attr(attr); 404 + struct i2c_client *client = to_i2c_client(dev); 405 + struct w83791d_data *data = i2c_get_clientdata(client); 406 + int bitnr = sensor_attr->index; 407 + int bytenr = bitnr / 8; 408 + long val = simple_strtol(buf, NULL, 10) ? 1 : 0; 409 + 410 + mutex_lock(&data->update_lock); 411 + 412 + data->beep_mask &= ~(0xff << (bytenr * 8)); 413 + data->beep_mask |= w83791d_read(client, W83791D_REG_BEEP_CTRL[bytenr]) 414 + << (bytenr * 8); 415 + 416 + data->beep_mask &= ~(1 << bitnr); 417 + data->beep_mask |= val << bitnr; 418 + 419 + w83791d_write(client, W83791D_REG_BEEP_CTRL[bytenr], 420 + (data->beep_mask >> (bytenr * 8)) & 0xff); 421 + 422 + mutex_unlock(&data->update_lock); 423 + 424 + return count; 425 + } 426 + 427 + static ssize_t show_alarm(struct device *dev, struct device_attribute *attr, 428 + char *buf) 429 + { 430 + struct sensor_device_attribute *sensor_attr = 431 + to_sensor_dev_attr(attr); 432 + struct w83791d_data *data = w83791d_update_device(dev); 433 + int bitnr = sensor_attr->index; 434 + 435 + return sprintf(buf, "%d\n", (data->alarms >> bitnr) & 1); 436 + } 437 + 438 + /* Note: The bitmask for the beep enable/disable is different than 439 + the bitmask for the alarm. */ 440 + static struct sensor_device_attribute sda_in_beep[] = { 441 + SENSOR_ATTR(in0_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 0), 442 + SENSOR_ATTR(in1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 13), 443 + SENSOR_ATTR(in2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 2), 444 + SENSOR_ATTR(in3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 3), 445 + SENSOR_ATTR(in4_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 8), 446 + SENSOR_ATTR(in5_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 9), 447 + SENSOR_ATTR(in6_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 10), 448 + SENSOR_ATTR(in7_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 16), 449 + SENSOR_ATTR(in8_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 17), 450 + SENSOR_ATTR(in9_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 14), 451 + }; 452 + 453 + static struct sensor_device_attribute sda_in_alarm[] = { 454 + SENSOR_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0), 455 + SENSOR_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1), 456 + SENSOR_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2), 457 + SENSOR_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3), 458 + SENSOR_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8), 459 + SENSOR_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9), 460 + SENSOR_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 10), 461 + SENSOR_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 19), 462 + SENSOR_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 20), 463 + SENSOR_ATTR(in9_alarm, S_IRUGO, show_alarm, NULL, 14), 385 464 }; 386 465 387 466 #define show_fan_reg(reg) \ ··· 615 536 show_fan_div, store_fan_div, 4), 616 537 }; 617 538 539 + static struct sensor_device_attribute sda_fan_beep[] = { 540 + SENSOR_ATTR(fan1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 6), 541 + SENSOR_ATTR(fan2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 7), 542 + SENSOR_ATTR(fan3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 11), 543 + SENSOR_ATTR(fan4_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 21), 544 + SENSOR_ATTR(fan5_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 22), 545 + }; 546 + 547 + static struct sensor_device_attribute sda_fan_alarm[] = { 548 + SENSOR_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6), 549 + SENSOR_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7), 550 + SENSOR_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 11), 551 + SENSOR_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 21), 552 + SENSOR_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 22), 553 + }; 554 + 618 555 /* read/write the temperature1, includes measured value and limits */ 619 556 static ssize_t show_temp1(struct device *dev, struct device_attribute *devattr, 620 557 char *buf) ··· 713 618 show_temp23, store_temp23, 1, 2), 714 619 }; 715 620 621 + /* Note: The bitmask for the beep enable/disable is different than 622 + the bitmask for the alarm. */ 623 + static struct sensor_device_attribute sda_temp_beep[] = { 624 + SENSOR_ATTR(temp1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 4), 625 + SENSOR_ATTR(temp2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 5), 626 + SENSOR_ATTR(temp3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 1), 627 + }; 628 + 629 + static struct sensor_device_attribute sda_temp_alarm[] = { 630 + SENSOR_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4), 631 + SENSOR_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5), 632 + SENSOR_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13), 633 + }; 716 634 717 635 /* get reatime status of all sensors items: voltage, temp, fan */ 718 636 static ssize_t show_alarms_reg(struct device *dev, ··· 832 724 static ssize_t show_vrm_reg(struct device *dev, 833 725 struct device_attribute *attr, char *buf) 834 726 { 835 - struct w83791d_data *data = w83791d_update_device(dev); 727 + struct w83791d_data *data = dev_get_drvdata(dev); 836 728 return sprintf(buf, "%d\n", data->vrm); 837 729 } 838 730 ··· 857 749 #define IN_UNIT_ATTRS(X) \ 858 750 &sda_in_input[X].dev_attr.attr, \ 859 751 &sda_in_min[X].dev_attr.attr, \ 860 - &sda_in_max[X].dev_attr.attr 752 + &sda_in_max[X].dev_attr.attr, \ 753 + &sda_in_beep[X].dev_attr.attr, \ 754 + &sda_in_alarm[X].dev_attr.attr 861 755 862 756 #define FAN_UNIT_ATTRS(X) \ 863 757 &sda_fan_input[X].dev_attr.attr, \ 864 758 &sda_fan_min[X].dev_attr.attr, \ 865 - &sda_fan_div[X].dev_attr.attr 759 + &sda_fan_div[X].dev_attr.attr, \ 760 + &sda_fan_beep[X].dev_attr.attr, \ 761 + &sda_fan_alarm[X].dev_attr.attr 866 762 867 763 #define TEMP_UNIT_ATTRS(X) \ 868 764 &sda_temp_input[X].dev_attr.attr, \ 869 765 &sda_temp_max[X].dev_attr.attr, \ 870 - &sda_temp_max_hyst[X].dev_attr.attr 766 + &sda_temp_max_hyst[X].dev_attr.attr, \ 767 + &sda_temp_beep[X].dev_attr.attr, \ 768 + &sda_temp_alarm[X].dev_attr.attr 871 769 872 770 static struct attribute *w83791d_attributes[] = { 873 771 IN_UNIT_ATTRS(0), ··· 1131 1017 goto error3; 1132 1018 1133 1019 /* Everything is ready, now register the working device */ 1134 - data->class_dev = hwmon_device_register(dev); 1135 - if (IS_ERR(data->class_dev)) { 1136 - err = PTR_ERR(data->class_dev); 1020 + data->hwmon_dev = hwmon_device_register(dev); 1021 + if (IS_ERR(data->hwmon_dev)) { 1022 + err = PTR_ERR(data->hwmon_dev); 1137 1023 goto error4; 1138 1024 } 1139 1025 ··· 1165 1051 1166 1052 /* main client */ 1167 1053 if (data) { 1168 - hwmon_device_unregister(data->class_dev); 1054 + hwmon_device_unregister(data->hwmon_dev); 1169 1055 sysfs_remove_group(&client->dev.kobj, &w83791d_group); 1170 1056 } 1171 1057
+53 -6
drivers/hwmon/w83792d.c
··· 267 267 268 268 struct w83792d_data { 269 269 struct i2c_client client; 270 - struct class_device *class_dev; 270 + struct device *hwmon_dev; 271 271 enum chips type; 272 272 273 273 struct mutex update_lock; ··· 538 538 { 539 539 struct w83792d_data *data = w83792d_update_device(dev); 540 540 return sprintf(buf, "%d\n", data->alarms); 541 + } 542 + 543 + static ssize_t show_alarm(struct device *dev, 544 + struct device_attribute *attr, char *buf) 545 + { 546 + struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 547 + int nr = sensor_attr->index; 548 + struct w83792d_data *data = w83792d_update_device(dev); 549 + return sprintf(buf, "%d\n", (data->alarms >> nr) & 1); 541 550 } 542 551 543 552 static ssize_t ··· 1024 1015 static SENSOR_DEVICE_ATTR_2(temp3_max_hyst, S_IRUGO | S_IWUSR, 1025 1016 show_temp23, store_temp23, 1, 4); 1026 1017 static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL); 1018 + static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0); 1019 + static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1); 1020 + static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 2); 1021 + static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 3); 1022 + static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 4); 1023 + static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 5); 1024 + static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 6); 1025 + static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 7); 1026 + static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 8); 1027 + static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 9); 1028 + static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 10); 1029 + static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 11); 1030 + static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 12); 1031 + static SENSOR_DEVICE_ATTR(fan7_alarm, S_IRUGO, show_alarm, NULL, 15); 1032 + static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 19); 1033 + static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 20); 1034 + static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 21); 1035 + static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 22); 1036 + static SENSOR_DEVICE_ATTR(fan6_alarm, S_IRUGO, show_alarm, NULL, 23); 1027 1037 static DEVICE_ATTR(chassis, S_IRUGO, show_regs_chassis, NULL); 1028 1038 static DEVICE_ATTR(chassis_clear, S_IRUGO | S_IWUSR, 1029 1039 show_chassis_clear, store_chassis_clear); ··· 1151 1123 static SENSOR_DEVICE_ATTR(fan7_div, S_IWUSR | S_IRUGO, 1152 1124 show_fan_div, store_fan_div, 7); 1153 1125 1154 - static struct attribute *w83792d_attributes_fan[4][4] = { 1126 + static struct attribute *w83792d_attributes_fan[4][5] = { 1155 1127 { 1156 1128 &sensor_dev_attr_fan4_input.dev_attr.attr, 1157 1129 &sensor_dev_attr_fan4_min.dev_attr.attr, 1158 1130 &sensor_dev_attr_fan4_div.dev_attr.attr, 1131 + &sensor_dev_attr_fan4_alarm.dev_attr.attr, 1159 1132 NULL 1160 1133 }, { 1161 1134 &sensor_dev_attr_fan5_input.dev_attr.attr, 1162 1135 &sensor_dev_attr_fan5_min.dev_attr.attr, 1163 1136 &sensor_dev_attr_fan5_div.dev_attr.attr, 1137 + &sensor_dev_attr_fan5_alarm.dev_attr.attr, 1164 1138 NULL 1165 1139 }, { 1166 1140 &sensor_dev_attr_fan6_input.dev_attr.attr, 1167 1141 &sensor_dev_attr_fan6_min.dev_attr.attr, 1168 1142 &sensor_dev_attr_fan6_div.dev_attr.attr, 1143 + &sensor_dev_attr_fan6_alarm.dev_attr.attr, 1169 1144 NULL 1170 1145 }, { 1171 1146 &sensor_dev_attr_fan7_input.dev_attr.attr, 1172 1147 &sensor_dev_attr_fan7_min.dev_attr.attr, 1173 1148 &sensor_dev_attr_fan7_div.dev_attr.attr, 1149 + &sensor_dev_attr_fan7_alarm.dev_attr.attr, 1174 1150 NULL 1175 1151 } 1176 1152 }; ··· 1214 1182 &sensor_dev_attr_in8_input.dev_attr.attr, 1215 1183 &sensor_dev_attr_in8_max.dev_attr.attr, 1216 1184 &sensor_dev_attr_in8_min.dev_attr.attr, 1185 + &sensor_dev_attr_in0_alarm.dev_attr.attr, 1186 + &sensor_dev_attr_in1_alarm.dev_attr.attr, 1187 + &sensor_dev_attr_in2_alarm.dev_attr.attr, 1188 + &sensor_dev_attr_in3_alarm.dev_attr.attr, 1189 + &sensor_dev_attr_in4_alarm.dev_attr.attr, 1190 + &sensor_dev_attr_in5_alarm.dev_attr.attr, 1191 + &sensor_dev_attr_in6_alarm.dev_attr.attr, 1192 + &sensor_dev_attr_in7_alarm.dev_attr.attr, 1193 + &sensor_dev_attr_in8_alarm.dev_attr.attr, 1217 1194 &sensor_dev_attr_temp1_input.dev_attr.attr, 1218 1195 &sensor_dev_attr_temp1_max.dev_attr.attr, 1219 1196 &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, ··· 1232 1191 &sensor_dev_attr_temp3_input.dev_attr.attr, 1233 1192 &sensor_dev_attr_temp3_max.dev_attr.attr, 1234 1193 &sensor_dev_attr_temp3_max_hyst.dev_attr.attr, 1194 + &sensor_dev_attr_temp1_alarm.dev_attr.attr, 1195 + &sensor_dev_attr_temp2_alarm.dev_attr.attr, 1196 + &sensor_dev_attr_temp3_alarm.dev_attr.attr, 1235 1197 &sensor_dev_attr_pwm1.dev_attr.attr, 1236 1198 &sensor_dev_attr_pwm1_mode.dev_attr.attr, 1237 1199 &sensor_dev_attr_pwm1_enable.dev_attr.attr, ··· 1277 1233 &sensor_dev_attr_fan1_input.dev_attr.attr, 1278 1234 &sensor_dev_attr_fan1_min.dev_attr.attr, 1279 1235 &sensor_dev_attr_fan1_div.dev_attr.attr, 1236 + &sensor_dev_attr_fan1_alarm.dev_attr.attr, 1280 1237 &sensor_dev_attr_fan2_input.dev_attr.attr, 1281 1238 &sensor_dev_attr_fan2_min.dev_attr.attr, 1282 1239 &sensor_dev_attr_fan2_div.dev_attr.attr, 1240 + &sensor_dev_attr_fan2_alarm.dev_attr.attr, 1283 1241 &sensor_dev_attr_fan3_input.dev_attr.attr, 1284 1242 &sensor_dev_attr_fan3_min.dev_attr.attr, 1285 1243 &sensor_dev_attr_fan3_div.dev_attr.attr, 1244 + &sensor_dev_attr_fan3_alarm.dev_attr.attr, 1286 1245 NULL 1287 1246 }; 1288 1247 ··· 1443 1396 &w83792d_group_fan[3]))) 1444 1397 goto exit_remove_files; 1445 1398 1446 - data->class_dev = hwmon_device_register(dev); 1447 - if (IS_ERR(data->class_dev)) { 1448 - err = PTR_ERR(data->class_dev); 1399 + data->hwmon_dev = hwmon_device_register(dev); 1400 + if (IS_ERR(data->hwmon_dev)) { 1401 + err = PTR_ERR(data->hwmon_dev); 1449 1402 goto exit_remove_files; 1450 1403 } 1451 1404 ··· 1480 1433 1481 1434 /* main client */ 1482 1435 if (data) { 1483 - hwmon_device_unregister(data->class_dev); 1436 + hwmon_device_unregister(data->hwmon_dev); 1484 1437 sysfs_remove_group(&client->dev.kobj, &w83792d_group); 1485 1438 for (i = 0; i < ARRAY_SIZE(w83792d_group_fan); i++) 1486 1439 sysfs_remove_group(&client->dev.kobj,
+5 -5
drivers/hwmon/w83793.c
··· 179 179 struct w83793_data { 180 180 struct i2c_client client; 181 181 struct i2c_client *lm75[2]; 182 - struct class_device *class_dev; 182 + struct device *hwmon_dev; 183 183 struct mutex update_lock; 184 184 char valid; /* !=0 if following fields are valid */ 185 185 unsigned long last_updated; /* In jiffies */ ··· 1075 1075 1076 1076 /* main client */ 1077 1077 if (data) { 1078 - hwmon_device_unregister(data->class_dev); 1078 + hwmon_device_unregister(data->hwmon_dev); 1079 1079 1080 1080 for (i = 0; i < ARRAY_SIZE(w83793_sensor_attr_2); i++) 1081 1081 device_remove_file(dev, ··· 1434 1434 } 1435 1435 } 1436 1436 1437 - data->class_dev = hwmon_device_register(dev); 1438 - if (IS_ERR(data->class_dev)) { 1439 - err = PTR_ERR(data->class_dev); 1437 + data->hwmon_dev = hwmon_device_register(dev); 1438 + if (IS_ERR(data->hwmon_dev)) { 1439 + err = PTR_ERR(data->hwmon_dev); 1440 1440 goto exit_remove; 1441 1441 } 1442 1442
+5 -5
drivers/hwmon/w83l785ts.c
··· 107 107 108 108 struct w83l785ts_data { 109 109 struct i2c_client client; 110 - struct class_device *class_dev; 110 + struct device *hwmon_dev; 111 111 struct mutex update_lock; 112 112 char valid; /* zero until following fields are valid */ 113 113 unsigned long last_updated; /* in jiffies */ ··· 247 247 goto exit_remove; 248 248 249 249 /* Register sysfs hooks */ 250 - data->class_dev = hwmon_device_register(&new_client->dev); 251 - if (IS_ERR(data->class_dev)) { 252 - err = PTR_ERR(data->class_dev); 250 + data->hwmon_dev = hwmon_device_register(&new_client->dev); 251 + if (IS_ERR(data->hwmon_dev)) { 252 + err = PTR_ERR(data->hwmon_dev); 253 253 goto exit_remove; 254 254 } 255 255 ··· 272 272 struct w83l785ts_data *data = i2c_get_clientdata(client); 273 273 int err; 274 274 275 - hwmon_device_unregister(data->class_dev); 275 + hwmon_device_unregister(data->hwmon_dev); 276 276 device_remove_file(&client->dev, 277 277 &sensor_dev_attr_temp1_input.dev_attr); 278 278 device_remove_file(&client->dev,
+2 -2
drivers/input/touchscreen/ads7846.c
··· 83 83 84 84 #if defined(CONFIG_HWMON) || defined(CONFIG_HWMON_MODULE) 85 85 struct attribute_group *attr_group; 86 - struct class_device *hwmon; 86 + struct device *hwmon; 87 87 #endif 88 88 89 89 u16 model; ··· 369 369 370 370 static int ads784x_hwmon_register(struct spi_device *spi, struct ads7846 *ts) 371 371 { 372 - struct class_device *hwmon; 372 + struct device *hwmon; 373 373 int err; 374 374 375 375 /* hwmon sensors need a reference voltage */
+1 -1
drivers/misc/thinkpad_acpi.c
··· 517 517 ****************************************************************************/ 518 518 519 519 static struct platform_device *tpacpi_pdev; 520 - static struct class_device *tpacpi_hwmon; 520 + static struct device *tpacpi_hwmon; 521 521 static struct input_dev *tpacpi_inputdev; 522 522 523 523
+1 -1
drivers/misc/thinkpad_acpi.h
··· 171 171 172 172 /* Device model */ 173 173 static struct platform_device *tpacpi_pdev; 174 - static struct class_device *tpacpi_hwmon; 174 + static struct device *tpacpi_hwmon; 175 175 static struct platform_driver tpacpi_pdriver; 176 176 static struct input_dev *tpacpi_inputdev; 177 177 static int tpacpi_create_driver_attributes(struct device_driver *drv);
+2 -2
include/linux/hwmon.h
··· 16 16 17 17 #include <linux/device.h> 18 18 19 - struct class_device *hwmon_device_register(struct device *dev); 19 + struct device *hwmon_device_register(struct device *dev); 20 20 21 - void hwmon_device_unregister(struct class_device *cdev); 21 + void hwmon_device_unregister(struct device *dev); 22 22 23 23 /* Scale user input to sensible values */ 24 24 static inline int SENSORS_LIMIT(long value, long low, long high)