Commit 4fa43501 authored by Linus Torvalds's avatar Linus Torvalds

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
  ...
parents 7441dd12 a022fef5
...@@ -4,7 +4,7 @@ Kernel driver coretemp ...@@ -4,7 +4,7 @@ Kernel driver coretemp
Supported chips: Supported chips:
* All Intel Core family * All Intel Core family
Prefix: 'coretemp' Prefix: 'coretemp'
CPUID: family 0x6, models 0xe, 0xf CPUID: family 0x6, models 0xe, 0xf, 0x16
Datasheet: Intel 64 and IA-32 Architectures Software Developer's Manual Datasheet: Intel 64 and IA-32 Architectures Software Developer's Manual
Volume 3A: System Programming Guide Volume 3A: System Programming Guide
......
...@@ -6,6 +6,10 @@ Supported chips: ...@@ -6,6 +6,10 @@ Supported chips:
Prefix: 'dme1737' Prefix: 'dme1737'
Addresses scanned: I2C 0x2c, 0x2d, 0x2e Addresses scanned: I2C 0x2c, 0x2d, 0x2e
Datasheet: Provided by SMSC upon request and under NDA Datasheet: Provided by SMSC upon request and under NDA
* SMSC SCH3112, SCH3114, SCH3116
Prefix: 'sch311x'
Addresses scanned: none, address read from Super-I/O config space
Datasheet: http://www.nuhorizons.com/FeaturedProducts/Volume1/SMSC/311x.pdf
Authors: Authors:
Juerg Haefliger <juergh@gmail.com> Juerg Haefliger <juergh@gmail.com>
...@@ -27,16 +31,25 @@ Description ...@@ -27,16 +31,25 @@ Description
----------- -----------
This driver implements support for the hardware monitoring capabilities of the This driver implements support for the hardware monitoring capabilities of the
SMSC DME1737 and Asus A8000 (which are the same) Super-I/O chips. This chip SMSC DME1737 and Asus A8000 (which are the same) and SMSC SCH311x Super-I/O
features monitoring of 3 temp sensors temp[1-3] (2 remote diodes and 1 chips. These chips feature monitoring of 3 temp sensors temp[1-3] (2 remote
internal), 7 voltages in[0-6] (6 external and 1 internal) and 6 fan speeds diodes and 1 internal), 7 voltages in[0-6] (6 external and 1 internal) and up
fan[1-6]. Additionally, the chip implements 5 PWM outputs pwm[1-3,5-6] for to 6 fan speeds fan[1-6]. Additionally, the chips implement up to 5 PWM
controlling fan speeds both manually and automatically. outputs pwm[1-3,5-6] for controlling fan speeds both manually and
automatically.
Fan[3-6] and pwm[3,5-6] are optional features and their availability is
dependent on the configuration of the chip. The driver will detect which For the DME1737 and A8000, fan[1-2] and pwm[1-2] are always present. Fan[3-6]
features are present during initialization and create the sysfs attributes and pwm[3,5-6] are optional features and their availability depends on the
accordingly. configuration of the chip. The driver will detect which features are present
during initialization and create the sysfs attributes accordingly.
For the SCH311x, fan[1-3] and pwm[1-3] are always present and fan[4-6] and
pwm[5-6] don't exist.
The hardware monitoring features of the DME1737 and A8000 are only accessible
via SMBus, while the SCH311x only provides access via the ISA bus. The driver
will therefore register itself as an I2C client driver if it detects a DME1737
or A8000 and as a platform driver if it detects a SCH311x chip.
Voltage Monitoring Voltage Monitoring
......
...@@ -6,6 +6,10 @@ Supported chips: ...@@ -6,6 +6,10 @@ Supported chips:
Prefix: 'f71805f' Prefix: 'f71805f'
Addresses scanned: none, address read from Super I/O config space Addresses scanned: none, address read from Super I/O config space
Datasheet: Available from the Fintek website Datasheet: Available from the Fintek website
* Fintek F71806F/FG
Prefix: 'f71872f'
Addresses scanned: none, address read from Super I/O config space
Datasheet: Available from the Fintek website
* Fintek F71872F/FG * Fintek F71872F/FG
Prefix: 'f71872f' Prefix: 'f71872f'
Addresses scanned: none, address read from Super I/O config space Addresses scanned: none, address read from Super I/O config space
...@@ -38,6 +42,9 @@ The Fintek F71872F/FG Super I/O chip is almost the same, with two ...@@ -38,6 +42,9 @@ The Fintek F71872F/FG Super I/O chip is almost the same, with two
additional internal voltages monitored (VSB and battery). It also features additional internal voltages monitored (VSB and battery). It also features
6 VID inputs. The VID inputs are not yet supported by this driver. 6 VID inputs. The VID inputs are not yet supported by this driver.
The Fintek F71806F/FG Super-I/O chip is essentially the same as the
F71872F/FG, and is undistinguishable therefrom.
The driver assumes that no more than one chip is present, which seems The driver assumes that no more than one chip is present, which seems
reasonable. reasonable.
......
...@@ -90,7 +90,8 @@ upper VID bits share their pins with voltage inputs (in5 and in6) so you ...@@ -90,7 +90,8 @@ upper VID bits share their pins with voltage inputs (in5 and in6) so you
can't have both on a given board. can't have both on a given board.
The IT8716F, IT8718F and later IT8712F revisions have support for The IT8716F, IT8718F and later IT8712F revisions have support for
2 additional fans. They are not yet supported by the driver. 2 additional fans. They are supported by the driver for the IT8716F and
IT8718F but not for the IT8712F
The IT8716F and IT8718F, and late IT8712F and IT8705F also have optional The IT8716F and IT8718F, and late IT8712F and IT8705F also have optional
16-bit tachometer counters for fans 1 to 3. This is better (no more fan 16-bit tachometer counters for fans 1 to 3. This is better (no more fan
......
...@@ -56,16 +56,6 @@ should work with. This is hardcoded by the mainboard and/or processor itself. ...@@ -56,16 +56,6 @@ should work with. This is hardcoded by the mainboard and/or processor itself.
It is a value in volts. When it is unconnected, you will often find the It is a value in volts. When it is unconnected, you will often find the
value 3.50 V here. value 3.50 V here.
In addition to the alarms described above, there are a couple of additional
ones. There is a BTI alarm, which gets triggered when an external chip has
crossed its limits. Usually, this is connected to all LM75 chips; if at
least one crosses its limits, this bit gets set. The CHAS alarm triggers
if your computer case is open. The FIFO alarms should never trigger; it
indicates an internal error. The SMI_IN alarm indicates some other chip
has triggered an SMI interrupt. As we do not use SMI interrupts at all,
this condition usually indicates there is a problem with some other
device.
If an alarm triggers, it will remain triggered until the hardware register If an alarm triggers, it will remain triggered until the hardware register
is read at least once. This means that the cause for the alarm may is read at least once. This means that the cause for the alarm may
already have disappeared! Note that in the current implementation, all already have disappeared! Note that in the current implementation, all
......
...@@ -7,7 +7,7 @@ Supported chips: ...@@ -7,7 +7,7 @@ Supported chips:
Addresses scanned: I2C 0x2c-0x2e Addresses scanned: I2C 0x2c-0x2e
Datasheet: http://www.national.com/ds.cgi/LM/LM93.pdf Datasheet: http://www.national.com/ds.cgi/LM/LM93.pdf
Author: Authors:
Mark M. Hoffman <mhoffman@lightlink.com> Mark M. Hoffman <mhoffman@lightlink.com>
Ported to 2.6 by Eric J. Bowersox <ericb@aspsys.com> Ported to 2.6 by Eric J. Bowersox <ericb@aspsys.com>
Adapted to 2.6.20 by Carsten Emde <ce@osadl.org> Adapted to 2.6.20 by Carsten Emde <ce@osadl.org>
...@@ -16,7 +16,6 @@ Author: ...@@ -16,7 +16,6 @@ Author:
Module Parameters Module Parameters
----------------- -----------------
(specific to LM93)
* init: integer * init: integer
Set to non-zero to force some initializations (default is 0). Set to non-zero to force some initializations (default is 0).
* disable_block: integer * disable_block: integer
...@@ -37,30 +36,13 @@ Module Parameters ...@@ -37,30 +36,13 @@ Module Parameters
I.e. this parameter controls the VID pin input thresholds; if your VID I.e. this parameter controls the VID pin input thresholds; if your VID
inputs are not working, try changing this. The default value is "0". inputs are not working, try changing this. The default value is "0".
(common among sensor drivers)
* force: short array (min = 1, max = 48)
List of adapter,address pairs to assume to be present. Autodetection
of the target device will still be attempted. Use one of the more
specific force directives below if this doesn't detect the device.
* force_lm93: short array (min = 1, max = 48)
List of adapter,address pairs which are unquestionably assumed to contain
a 'lm93' chip
* ignore: short array (min = 1, max = 48)
List of adapter,address pairs not to scan
* ignore_range: short array (min = 1, max = 48)
List of adapter,start-addr,end-addr triples not to scan
* probe: short array (min = 1, max = 48)
List of adapter,address pairs to scan additionally
* probe_range: short array (min = 1, max = 48)
List of adapter,start-addr,end-addr triples to scan additionally
Hardware Description Hardware Description
-------------------- --------------------
(from the datasheet) (from the datasheet)
The LM93, hardware monitor, has a two wire digital interface compatible with The LM93 hardware monitor has a two wire digital interface compatible with
SMBus 2.0. Using an 8-bit ADC, the LM93 measures the temperature of two remote SMBus 2.0. Using an 8-bit ADC, the LM93 measures the temperature of two remote
diode connected transistors as well as its own die and 16 power supply diode connected transistors as well as its own die and 16 power supply
voltages. To set fan speed, the LM93 has two PWM outputs that are each voltages. To set fan speed, the LM93 has two PWM outputs that are each
...@@ -69,18 +51,12 @@ table based. The LM93 includes a digital filter that can be invoked to smooth ...@@ -69,18 +51,12 @@ table based. The LM93 includes a digital filter that can be invoked to smooth
temperature readings for better control of fan speed. The LM93 has four temperature readings for better control of fan speed. The LM93 has four
tachometer inputs to measure fan speed. Limit and status registers for all tachometer inputs to measure fan speed. Limit and status registers for all
measured values are included. The LM93 builds upon the functionality of measured values are included. The LM93 builds upon the functionality of
previous motherboard management ASICs and uses some of the LM85 s features previous motherboard management ASICs and uses some of the LM85's features
(i.e. smart tachometer mode). It also adds measurement and control support (i.e. smart tachometer mode). It also adds measurement and control support
for dynamic Vccp monitoring and PROCHOT. It is designed to monitor a dual for dynamic Vccp monitoring and PROCHOT. It is designed to monitor a dual
processor Xeon class motherboard with a minimum of external components. processor Xeon class motherboard with a minimum of external components.
Driver Description
------------------
This driver implements support for the National Semiconductor LM93.
User Interface User Interface
-------------- --------------
...@@ -101,7 +77,7 @@ These intervals can be found in the sysfs files prochot1_interval and ...@@ -101,7 +77,7 @@ These intervals can be found in the sysfs files prochot1_interval and
prochot2_interval. The values in these files specify the intervals for prochot2_interval. The values in these files specify the intervals for
#P1_PROCHOT and #P2_PROCHOT, respectively. Selecting a value not in this #P1_PROCHOT and #P2_PROCHOT, respectively. Selecting a value not in this
list will cause the driver to use the next largest interval. The available list will cause the driver to use the next largest interval. The available
intervals are: intervals are (in seconds):
#PROCHOT intervals: 0.73, 1.46, 2.9, 5.8, 11.7, 23.3, 46.6, 93.2, 186, 372 #PROCHOT intervals: 0.73, 1.46, 2.9, 5.8, 11.7, 23.3, 46.6, 93.2, 186, 372
...@@ -111,12 +87,12 @@ assert #P2_PROCHOT, and vice-versa. This mode is enabled by writing a ...@@ -111,12 +87,12 @@ assert #P2_PROCHOT, and vice-versa. This mode is enabled by writing a
non-zero integer to the sysfs file prochot_short. non-zero integer to the sysfs file prochot_short.
The LM93 can also override the #PROCHOT pins by driving a PWM signal onto The LM93 can also override the #PROCHOT pins by driving a PWM signal onto
one or both of them. When overridden, the signal has a period of 3.56 mS, one or both of them. When overridden, the signal has a period of 3.56 ms,
a minimum pulse width of 5 clocks (at 22.5kHz => 6.25% duty cycle), and a minimum pulse width of 5 clocks (at 22.5kHz => 6.25% duty cycle), and
a maximum pulse width of 80 clocks (at 22.5kHz => 99.88% duty cycle). a maximum pulse width of 80 clocks (at 22.5kHz => 99.88% duty cycle).
The sysfs files prochot1_override and prochot2_override contain boolean The sysfs files prochot1_override and prochot2_override contain boolean
intgers which enable or disable the override function for #P1_PROCHOT and integers which enable or disable the override function for #P1_PROCHOT and
#P2_PROCHOT, respectively. The sysfs file prochot_override_duty_cycle #P2_PROCHOT, respectively. The sysfs file prochot_override_duty_cycle
contains a value controlling the duty cycle for the PWM signal used when contains a value controlling the duty cycle for the PWM signal used when
the override function is enabled. This value ranges from 0 to 15, with 0 the override function is enabled. This value ranges from 0 to 15, with 0
...@@ -166,7 +142,7 @@ frequency values are constrained by the hardware. Selecting a value which is ...@@ -166,7 +142,7 @@ frequency values are constrained by the hardware. Selecting a value which is
not available will cause the driver to use the next largest value. Also note not available will cause the driver to use the next largest value. Also note
that this parameter has implications for the Smart Tach Mode (see above). that this parameter has implications for the Smart Tach Mode (see above).
PWM Output Frequencies: 12, 36, 48, 60, 72, 84, 96, 22500 (h/w default) PWM Output Frequencies (in Hz): 12, 36, 48, 60, 72, 84, 96, 22500 (default)
Automatic PWM: Automatic PWM:
...@@ -178,7 +154,7 @@ individual control sources to which the PWM output is bound. ...@@ -178,7 +154,7 @@ individual control sources to which the PWM output is bound.
The eight control sources are: temp1-temp4 (aka "zones" in the datasheet), The eight control sources are: temp1-temp4 (aka "zones" in the datasheet),
#PROCHOT 1 & 2, and #VRDHOT 1 & 2. The bindings are expressed as a bitmask #PROCHOT 1 & 2, and #VRDHOT 1 & 2. The bindings are expressed as a bitmask
in the sysfs files pwm<n>_auto_channels, where a "1" enables the binding, and in the sysfs files pwm<n>_auto_channels, where a "1" enables the binding, and
a "0" disables it. The h/w default is 0x0f (all temperatures bound). a "0" disables it. The h/w default is 0x0f (all temperatures bound).
0x01 - Temp 1 0x01 - Temp 1
0x02 - Temp 2 0x02 - Temp 2
...@@ -324,89 +300,3 @@ LM93 Unique sysfs Files ...@@ -324,89 +300,3 @@ LM93 Unique sysfs Files
gpio input state of 8 GPIO pins; read-only gpio input state of 8 GPIO pins; read-only
Sample Configuration File
-------------------------
Here is a sample LM93 chip config for sensors.conf:
---------- cut here ----------
chip "lm93-*"
# VOLTAGE INPUTS
# labels and scaling based on datasheet recommendations
label in1 "+12V1"
compute in1 @ * 12.945, @ / 12.945
set in1_min 12 * 0.90
set in1_max 12 * 1.10
label in2 "+12V2"
compute in2 @ * 12.945, @ / 12.945
set in2_min 12 * 0.90
set in2_max 12 * 1.10
label in3 "+12V3"
compute in3 @ * 12.945, @ / 12.945
set in3_min 12 * 0.90
set in3_max 12 * 1.10
label in4 "FSB_Vtt"
label in5 "3GIO"
label in6 "ICH_Core"
label in7 "Vccp1"
label in8 "Vccp2"
label in9 "+3.3V"
set in9_min 3.3 * 0.90
set in9_max 3.3 * 1.10
label in10 "+5V"
set in10_min 5.0 * 0.90
set in10_max 5.0 * 1.10
label in11 "SCSI_Core"
label in12 "Mem_Core"
label in13 "Mem_Vtt"
label in14 "Gbit_Core"
# Assuming R1/R2 = 4.1143, and 3.3V reference
# -12V = (4.1143 + 1) * (@ - 3.3) + 3.3
label in15 "-12V"
compute in15 @ * 5.1143 - 13.57719, (@ + 13.57719) / 5.1143
set in15_min -12 * 0.90
set in15_max -12 * 1.10
label in16 "+3.3VSB"
set in16_min 3.3 * 0.90
set in16_max 3.3 * 1.10
# TEMPERATURE INPUTS
label temp1 "CPU1"
label temp2 "CPU2"
label temp3 "LM93"
# TACHOMETER INPUTS
label fan1 "Fan1"
set fan1_min 3000
label fan2 "Fan2"
set fan2_min 3000
label fan3 "Fan3"
set fan3_min 3000
label fan4 "Fan4"
set fan4_min 3000
# PWM OUTPUTS
label pwm1 "CPU1"
label pwm2 "CPU2"
...@@ -67,6 +67,10 @@ between readings to be caught and alarmed. The exact definition of an ...@@ -67,6 +67,10 @@ between readings to be caught and alarmed. The exact definition of an
alarm (for example, whether a threshold must be met or must be exceeded alarm (for example, whether a threshold must be met or must be exceeded
to cause an alarm) is chip-dependent. to cause an alarm) is chip-dependent.
When setting values of hwmon sysfs attributes, the string representation of
the desired value must be written, note that strings which are not a number
are interpreted as 0! For more on how written strings are interpreted see the
"sysfs attribute writes interpretation" section at the end of this file.
------------------------------------------------------------------------- -------------------------------------------------------------------------
...@@ -78,8 +82,21 @@ RW read/write value ...@@ -78,8 +82,21 @@ RW read/write value
Read/write values may be read-only for some chips, depending on the Read/write values may be read-only for some chips, depending on the
hardware implementation. hardware implementation.
All entries are optional, and should only be created in a given driver All entries (except name) are optional, and should only be created in a
if the chip has the feature. given driver if the chip has the feature.
********
* Name *
********
name The chip name.
This should be a short, lowercase string, not containing
spaces nor dashes, representing the chip name. This is
the only mandatory attribute.
I2C devices get this attribute created automatically.
RO
************ ************
* Voltages * * Voltages *
...@@ -104,18 +121,17 @@ in[0-*]_input Voltage input value. ...@@ -104,18 +121,17 @@ in[0-*]_input Voltage input value.
by the chip driver, and must be done by the application. by the chip driver, and must be done by the application.
However, some drivers (notably lm87 and via686a) However, some drivers (notably lm87 and via686a)
do scale, because of internal resistors built into a chip. do scale, because of internal resistors built into a chip.
These drivers will output the actual voltage. These drivers will output the actual voltage. Rule of
thumb: drivers should report the voltage values at the
Typical usage: "pins" of the chip.
in0_* CPU #1 voltage (not scaled)
in1_* CPU #2 voltage (not scaled) in[0-*]_label Suggested voltage channel label.
in2_* 3.3V nominal (not scaled) Text string
in3_* 5.0V nominal (scaled) Should only be created if the driver has hints about what
in4_* 12.0V nominal (scaled) this voltage channel is being used for, and user-space
in5_* -12.0V nominal (scaled) doesn't. In all other cases, the label is provided by
in6_* -5.0V nominal (scaled) user-space.
in7_* varies RO
in8_* varies
cpu[0-*]_vid CPU core reference voltage. cpu[0-*]_vid CPU core reference voltage.
Unit: millivolt Unit: millivolt
...@@ -159,6 +175,13 @@ fan[1-*]_target ...@@ -159,6 +175,13 @@ fan[1-*]_target
Only makes sense if the chip supports closed-loop fan speed Only makes sense if the chip supports closed-loop fan speed
control based on the measured fan speed. control based on the measured fan speed.
fan[1-*]_label Suggested fan channel label.
Text string
Should only be created if the driver has hints about what
this fan channel is being used for, and user-space doesn't.
In all other cases, the label is provided by user-space.
RO
Also see the Alarms section for status flags associated with fans. Also see the Alarms section for status flags associated with fans.
...@@ -219,12 +242,12 @@ temp[1-*]_auto_point[1-*]_temp_hyst ...@@ -219,12 +242,12 @@ temp[1-*]_auto_point[1-*]_temp_hyst
**************** ****************
temp[1-*]_type Sensor type selection. temp[1-*]_type Sensor type selection.
Integers 1 to 6 or thermistor Beta value (typically 3435) Integers 1 to 6
RW RW
1: PII/Celeron Diode 1: PII/Celeron Diode
2: 3904 transistor 2: 3904 transistor
3: thermal diode 3: thermal diode
4: thermistor (default/unknown Beta) 4: thermistor
5: AMD AMDSI 5: AMD AMDSI
6: Intel PECI 6: Intel PECI
Not all types are supported by all chips Not all types are supported by all chips
...@@ -260,18 +283,19 @@ temp[1-*]_crit_hyst ...@@ -260,18 +283,19 @@ temp[1-*]_crit_hyst
from the critical value. from the critical value.
RW RW
temp[1-4]_offset temp[1-*]_offset
Temperature offset which is added to the temperature reading Temperature offset which is added to the temperature reading
by the chip. by the chip.
Unit: millidegree Celsius Unit: millidegree Celsius
Read/Write value. Read/Write value.
If there are multiple temperature sensors, temp1_* is temp[1-*]_label Suggested temperature channel label.
generally the sensor inside the chip itself, Text string
reported as "motherboard temperature". temp2_* to Should only be created if the driver has hints about what
temp4_* are generally sensors external to the chip this temperature channel is being used for, and user-space
itself, for example the thermal diode inside the CPU or doesn't. In all other cases, the label is provided by
a thermistor nearby. user-space.
RO
Some chips measure temperature using external thermistors and an ADC, and Some chips measure temperature using external thermistors and an ADC, and
report the temperature measurement as a voltage. Converting this voltage report the temperature measurement as a voltage. Converting this voltage
...@@ -393,14 +417,53 @@ beep_mask Bitmask for beep. ...@@ -393,14 +417,53 @@ beep_mask Bitmask for beep.
RW RW
********* sysfs attribute writes interpretation
* Other * -------------------------------------
*********
hwmon sysfs attributes always contain numbers, so the first thing to do is to
eeprom Raw EEPROM data in binary form. convert the input to a number, there are 2 ways todo this depending whether
RO the number can be negative or not:
unsigned long u = simple_strtoul(buf, NULL, 10);
pec Enable or disable PEC (SMBus only) long s = simple_strtol(buf, NULL, 10);
0: disable
1: enable With buf being the buffer with the user input being passed by the kernel.
RW Notice that we do not use the second argument of strto[u]l, and thus cannot
tell when 0 is returned, if this was really 0 or is caused by invalid input.
This is done deliberately as checking this everywhere would add a lot of
code to the kernel.
Notice that it is important to always store the converted value in an
unsigned long or long, so that no wrap around can happen before any further
checking.
After the input string is converted to an (unsigned) long, the value should be
checked if its acceptable. Be careful with further conversions on the value
before checking it for validity, as these conversions could still cause a wrap
around before the check. For example do not multiply the result, and only
add/subtract if it has been divided before the add/subtract.
What to do if a value is found to be invalid, depends on the type of the
sysfs attribute that is being set. If it is a continuous setting like a
tempX_max or inX_max attribute, then the value should be clamped to its
limits using SENSORS_LIMIT(value, min_limit, max_limit). If it is not
continuous like for example a tempX_type, then when an invalid value is
written, -EINVAL should be returned.
Example1, temp1_max, register is a signed 8 bit value (-128 - 127 degrees):
long v = simple_strtol(buf, NULL, 10) / 1000;
v = SENSORS_LIMIT(v, -128, 127);
/* write v to register */
Example2, fan divider setting, valid values 2, 4 and 8:
unsigned long v = simple_strtoul(buf, NULL, 10);
switch (v) {
case 2: v = 1; break;
case 4: v = 2; break;
case 8: v = 3; break;
default:
return -EINVAL;
}
/* write v to register */
...@@ -75,46 +75,64 @@ Voltage sensors (also known as IN sensors) report their values in millivolts. ...@@ -75,46 +75,64 @@ Voltage sensors (also known as IN sensors) report their values in millivolts.
An alarm is triggered if the voltage has crossed a programmable minimum An alarm is triggered if the voltage has crossed a programmable minimum
or maximum limit. or maximum limit.
The bit ordering for the alarm "realtime status register" and the The w83791d has a global bit used to enable beeping from the speaker when an
"beep enable registers" are different. alarm is triggered as well as a bitmask to enable or disable the beep for
specific alarms. You need both the global beep enable bit and the
in0 (VCORE) : alarms: 0x000001 beep_enable: 0x000001 corresponding beep bit to be on for a triggered alarm to sound a beep.
in1 (VINR0) : alarms: 0x000002 beep_enable: 0x002000 <== mismatch
in2 (+3.3VIN): alarms: 0x000004 beep_enable: 0x000004 The sysfs interface to the gloabal enable is via the sysfs beep_enable file.
in3 (5VDD) : alarms: 0x000008 beep_enable: 0x000008 This file is used for both legacy and new code.
in4 (+12VIN) : alarms: 0x000100 beep_enable: 0x000100
in5 (-12VIN) : alarms: 0x000200 beep_enable: 0x000200 The sysfs interface to the beep bitmask has migrated from the original legacy
in6 (-5VIN) : alarms: 0x000400 beep_enable: 0x000400 method of a single sysfs beep_mask file to a newer method using multiple
in7 (VSB) : alarms: 0x080000 beep_enable: 0x010000 <== mismatch *_beep files as described in .../Documentation/hwmon/sysfs-interface.
in8 (VBAT) : alarms: 0x100000 beep_enable: 0x020000 <== mismatch
in9 (VINR1) : alarms: 0x004000 beep_enable: 0x004000 A similar change has occured for the bitmap corresponding to the alarms. The
temp1 : alarms: 0x000010 beep_enable: 0x000010 original legacy method used a single sysfs alarms file containing a bitmap
temp2 : alarms: 0x000020 beep_enable: 0x000020 of triggered alarms. The newer method uses multiple sysfs *_alarm files
temp3 : alarms: 0x002000 beep_enable: 0x000002 <== mismatch (again following the pattern described in sysfs-interface).
fan1 : alarms: 0x000040 beep_enable: 0x000040
fan2 : alarms: 0x000080 beep_enable: 0x000080 Since both methods read and write the underlying hardware, they can be used
fan3 : alarms: 0x000800 beep_enable: 0x000800 interchangeably and changes in one will automatically be reflected by
fan4 : alarms: 0x200000 beep_enable: 0x200000 the other. If you use the legacy bitmask method, your user-space code is
fan5 : alarms: 0x400000 beep_enable: 0x400000 responsible for handling the fact that the alarms and beep_mask bitmaps
tart1 : alarms: 0x010000 beep_enable: 0x040000 <== mismatch are not the same (see the table below).
tart2 : alarms: 0x020000 beep_enable: 0x080000 <== mismatch
tart3 : alarms: 0x040000 beep_enable: 0x100000 <== mismatch NOTE: All new code should be written to use the newer sysfs-interface
case_open : alarms: 0x001000 beep_enable: 0x001000 specification as that avoids bitmap problems and is the preferred interface
user_enable : alarms: -------- beep_enable: 0x800000 going forward.
*** NOTE: It is the responsibility of user-space code to handle the fact The driver reads the hardware chip values at most once every three seconds.
that the beep enable and alarm bits are in different positions when using that User mode code requesting values more often will receive cached values.
feature of the chip.
Alarms bitmap vs. beep_mask bitmask
When an alarm goes off, you can be warned by a beeping signal through your ------------------------------------
computer speaker. It is possible to enable all beeping globally, or only For legacy code using the alarms and beep_mask files:
the beeping for some alarms.
in0 (VCORE) : alarms: 0x000001 beep_mask: 0x000001
The driver only reads the chip values each 3 seconds; reading them more in1 (VINR0) : alarms: 0x000002 beep_mask: 0x002000 <== mismatch
often will do no harm, but will return 'old' values. in2 (+3.3VIN): alarms: 0x000004 beep_mask: 0x000004
in3 (5VDD) : alarms: 0x000008 beep_mask: 0x000008
in4 (+12VIN) : alarms: 0x000100 beep_mask: 0x000100
in5 (-12VIN) : alarms: 0x000200 beep_mask: 0x000200
in6 (-5VIN) : alarms: 0x000400 beep_mask: 0x000400
in7 (VSB) : alarms: 0x080000 beep_mask: 0x010000 <== mismatch
in8 (VBAT) : alarms: 0x100000 beep_mask: 0x020000 <== mismatch
in9 (VINR1) : alarms: 0x004000 beep_mask: 0x004000
temp1 : alarms: 0x000010 beep_mask: 0x000010
temp2 : alarms: 0x000020 beep_mask: 0x000020
temp3 : alarms: 0x002000 beep_mask: 0x000002 <== mismatch
fan1 : alarms: 0x000040 beep_mask: 0x000040
fan2 : alarms: 0x000080 beep_mask: 0x000080
fan3 : alarms: 0x000800 beep_mask: 0x000800
fan4 : alarms: 0x200000 beep_mask: 0x200000
fan5 : alarms: 0x400000 beep_mask: 0x400000
tart1 : alarms: 0x010000 beep_mask: 0x040000 <== mismatch
tart2 : alarms: 0x020000 beep_mask: 0x080000 <== mismatch
tart3 : alarms: 0x040000 beep_mask: 0x100000 <== mismatch
case_open : alarms: 0x001000 beep_mask: 0x001000
global_enable: alarms: -------- beep_mask: 0x800000 (modified via beep_enable)
W83791D TODO: W83791D TODO:
--------------- ---------------
Provide a patch for per-file alarms and beep enables as defined in the hwmon
documentation (Documentation/hwmon/sysfs-interface)
Provide a patch for smart-fan control (still need appropriate motherboard/fans) Provide a patch for smart-fan control (still need appropriate motherboard/fans)
...@@ -1660,7 +1660,8 @@ P: Mark M. Hoffman ...@@ -1660,7 +1660,8 @@ P: Mark M. Hoffman
M: mhoffman@lightlink.com M: mhoffman@lightlink.com
L: lm-sensors@lm-sensors.org L: lm-sensors@lm-sensors.org
W: http://www.lm-sensors.org/ W: http://www.lm-sensors.org/
T: git lm-sensors.org:/kernel/mhoffman/hwmon-2.6.git T: git lm-sensors.org:/kernel/mhoffman/hwmon-2.6.git testing
T: git lm-sensors.org:/kernel/mhoffman/hwmon-2.6.git release
S: Maintained S: Maintained
HARDWARE RANDOM NUMBER GENERATOR CORE HARDWARE RANDOM NUMBER GENERATOR CORE
...@@ -4177,7 +4178,7 @@ W83791D HARDWARE MONITORING DRIVER ...@@ -4177,7 +4178,7 @@ W83791D HARDWARE MONITORING DRIVER
P: Charles Spirakis P: Charles Spirakis
M: bezaur@gmail.com M: bezaur@gmail.com
L: lm-sensors@lm-sensors.org L: lm-sensors@lm-sensors.org
S: Maintained S: Odd Fixes
W83793 HARDWARE MONITORING DRIVER W83793 HARDWARE MONITORING DRIVER
P: Rudolf Marek P: Rudolf Marek
......
...@@ -30,7 +30,7 @@ config HWMON_VID ...@@ -30,7 +30,7 @@ config HWMON_VID
config SENSORS_ABITUGURU config SENSORS_ABITUGURU
tristate "Abit uGuru (rev 1 & 2)" tristate "Abit uGuru (rev 1 & 2)"
depends on EXPERIMENTAL depends on X86 && EXPERIMENTAL
help help
If you say yes here you get support for the sensor part of the first If you say yes here you get support for the sensor part of the first
and second revision of the Abit uGuru chip. The voltage and frequency and second revision of the Abit uGuru chip. The voltage and frequency
...@@ -45,7 +45,7 @@ config SENSORS_ABITUGURU ...@@ -45,7 +45,7 @@ config SENSORS_ABITUGURU
config SENSORS_ABITUGURU3 config SENSORS_ABITUGURU3
tristate "Abit uGuru (rev 3)" tristate "Abit uGuru (rev 3)"
depends on HWMON && EXPERIMENTAL depends on X86 && EXPERIMENTAL
help help
If you say yes here you get support for the sensor part of the If you say yes here you get support for the sensor part of the
third revision of the Abit uGuru chip. Only reading the sensors third revision of the Abit uGuru chip. Only reading the sensors
...@@ -133,6 +133,16 @@ config SENSORS_ADM9240 ...@@ -133,6 +133,16 @@ config SENSORS_ADM9240
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called adm9240. will be called adm9240.
config SENSORS_ADT7470
tristate "Analog Devices ADT7470"
depends on I2C && EXPERIMENTAL
help
If you say yes here you get support for the Analog Devices
ADT7470 temperature monitoring chips.
This driver can also be built as a module. If so, the module
will be called adt7470.
config SENSORS_K8TEMP config SENSORS_K8TEMP
tristate "AMD Athlon64/FX or Opteron temperature sensor" tristate "AMD Athlon64/FX or Opteron temperature sensor"
depends on X86 && PCI && EXPERIMENTAL depends on X86 && PCI && EXPERIMENTAL
...@@ -172,7 +182,7 @@ config SENSORS_AMS_I2C ...@@ -172,7 +182,7 @@ config SENSORS_AMS_I2C
config SENSORS_ASB100 config SENSORS_ASB100
tristate "Asus ASB100 Bach" tristate "Asus ASB100 Bach"
depends on I2C && EXPERIMENTAL depends on X86 && I2C && EXPERIMENTAL
select HWMON_VID select HWMON_VID
help help
If you say yes here you get support for the ASB100 Bach sensor If you say yes here you get support for the ASB100 Bach sensor
...@@ -206,19 +216,39 @@ config SENSORS_DS1621 ...@@ -206,19 +216,39 @@ config SENSORS_DS1621
will be called ds1621. will be called ds1621.
config SENSORS_F71805F config SENSORS_F71805F
tristate "Fintek F71805F/FG and F71872F/FG" tristate "Fintek F71805F/FG, F71806F/FG and F71872F/FG"
depends on EXPERIMENTAL depends on EXPERIMENTAL
help help
If you say yes here you get support for hardware monitoring If you say yes here you get support for hardware monitoring
features of the Fintek F71805F/FG and F71872F/FG Super-I/O features of the Fintek F71805F/FG, F71806F/FG and F71872F/FG
chips. Super-I/O chips.
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called f71805f. will be called f71805f.
config SENSORS_F71882FG
tristate "Fintek F71882FG and F71883FG"
depends on EXPERIMENTAL
help
If you say yes here you get support for hardware monitoring
features of the Fintek F71882FG and F71883FG Super-I/O chips.
This driver can also be built as a module. If so, the module
will be called f71882fg.
config SENSORS_F75375S
tristate "Fintek F75375S/SP and F75373";
depends on I2C && EXPERIMENTAL
help
If you say yes here you get support for hardware monitoring
features of the Fintek F75375S/SP and F75373
This driver can also be built as a module. If so, the module
will be called f75375s.
config SENSORS_FSCHER config SENSORS_FSCHER
tristate "FSC Hermes" tristate "FSC Hermes"
depends on I2C depends on X86 && I2C
help help
If you say yes here you get support for Fujitsu Siemens If you say yes here you get support for Fujitsu Siemens
Computers Hermes sensor chips. Computers Hermes sensor chips.
...@@ -228,7 +258,7 @@ config SENSORS_FSCHER ...@@ -228,7 +258,7 @@ config SENSORS_FSCHER
config SENSORS_FSCPOS config SENSORS_FSCPOS
tristate "FSC Poseidon" tristate "FSC Poseidon"
depends on I2C depends on X86 && I2C
help help
If you say yes here you get support for Fujitsu Siemens If you say yes here you get support for Fujitsu Siemens
Computers Poseidon sensor chips. Computers Poseidon sensor chips.
...@@ -236,6 +266,20 @@ config SENSORS_FSCPOS ...@@ -236,6 +266,20 @@ config SENSORS_FSCPOS
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called fscpos. will be called fscpos.
config SENSORS_FSCHMD
tristate "FSC Poseidon, Scylla, Hermes, Heimdall and Heracles"
depends on X86 && I2C && EXPERIMENTAL
help
If you say yes here you get support for various Fujitsu Siemens
Computers sensor chips.
This is a new merged driver for FSC sensor chips which is intended
as a replacment for the fscpos, fscscy and fscher drivers and adds
support for several other FCS sensor chips.
This driver can also be built as a module. If so, the module
will be called fschmd.
config SENSORS_GL518SM config SENSORS_GL518SM
tristate "Genesys Logic GL518SM" tristate "Genesys Logic GL518SM"
depends on I2C depends on I2C
...@@ -265,6 +309,19 @@ config SENSORS_CORETEMP ...@@ -265,6 +309,19 @@ config SENSORS_CORETEMP
sensor inside your CPU. Supported all are all known variants sensor inside your CPU. Supported all are all known variants
of Intel Core family. of Intel Core family.
config SENSORS_IBMPEX
tristate "IBM PowerExecutive temperature/power sensors"
select IPMI_SI
depends on IPMI_HANDLER
help
If you say yes here you get support for the temperature and
power sensors in various IBM System X servers that support
PowerExecutive. So far this includes the x3550, x3650, x3655,
x3755, and certain HS20 blades.
This driver can also be built as a module. If so, the module
will be called ibmpex.
config SENSORS_IT87 config SENSORS_IT87
tristate "ITE IT87xx and compatibles" tristate "ITE IT87xx and compatibles"
select HWMON_VID select HWMON_VID
...@@ -401,7 +458,7 @@ config SENSORS_LM92 ...@@ -401,7 +458,7 @@ config SENSORS_LM92
config SENSORS_LM93 config SENSORS_LM93
tristate "National Semiconductor LM93 and compatibles" tristate "National Semiconductor LM93 and compatibles"
depends on HWMON && I2C depends on I2C
select HWMON_VID select HWMON_VID
help help
If you say yes here you get support for National Semiconductor LM93 If you say yes here you get support for National Semiconductor LM93
...@@ -466,13 +523,13 @@ config SENSORS_SIS5595 ...@@ -466,13 +523,13 @@ config SENSORS_SIS5595
will be called sis5595. will be called sis5595.
config SENSORS_DME1737 config SENSORS_DME1737
tristate "SMSC DME1737 and compatibles" tristate "SMSC DME1737, SCH311x and compatibles"
depends on I2C && EXPERIMENTAL depends on I2C && EXPERIMENTAL
select HWMON_VID select HWMON_VID
help help
If you say yes here you get support for the hardware monitoring If you say yes here you get support for the hardware monitoring
and fan control features of the SMSC DME1737 (and compatibles and fan control features of the SMSC DME1737 (and compatibles
like the Asus A8000) Super-I/O chip. like the Asus A8000) and SCH311x Super-I/O chips.
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called dme1737. will be called dme1737.
......
...@@ -22,6 +22,7 @@ obj-$(CONFIG_SENSORS_ADM1026) += adm1026.o ...@@ -22,6 +22,7 @@ obj-$(CONFIG_SENSORS_ADM1026) += adm1026.o
obj-$(CONFIG_SENSORS_ADM1029) += adm1029.o obj-$(CONFIG_SENSORS_ADM1029) += adm1029.o
obj-$(CONFIG_SENSORS_ADM1031) += adm1031.o obj-$(CONFIG_SENSORS_ADM1031) += adm1031.o
obj-$(CONFIG_SENSORS_ADM9240) += adm9240.o obj-$(CONFIG_SENSORS_ADM9240) += adm9240.o
obj-$(CONFIG_SENSORS_ADT7470) += adt7470.o
obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o
obj-$(CONFIG_SENSORS_AMS) += ams/ obj-$(CONFIG_SENSORS_AMS) += ams/
obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o
...@@ -29,11 +30,15 @@ obj-$(CONFIG_SENSORS_CORETEMP) += coretemp.o ...@@ -29,11 +30,15 @@ obj-$(CONFIG_SENSORS_CORETEMP) += coretemp.o
obj-$(CONFIG_SENSORS_DME1737) += dme1737.o obj-$(CONFIG_SENSORS_DME1737) += dme1737.o
obj-$(CONFIG_SENSORS_DS1621) += ds1621.o obj-$(CONFIG_SENSORS_DS1621) += ds1621.o
obj-$(CONFIG_SENSORS_F71805F) += f71805f.o obj-$(CONFIG_SENSORS_F71805F) += f71805f.o
obj-$(CONFIG_SENSORS_F71882FG) += f71882fg.o
obj-$(CONFIG_SENSORS_F75375S) += f75375s.o
obj-$(CONFIG_SENSORS_FSCHER) += fscher.o obj-$(CONFIG_SENSORS_FSCHER) += fscher.o
obj-$(CONFIG_SENSORS_FSCHMD) += fschmd.o
obj-$(CONFIG_SENSORS_FSCPOS) += fscpos.o obj-$(CONFIG_SENSORS_FSCPOS) += fscpos.o
obj-$(CONFIG_SENSORS_GL518SM) += gl518sm.o obj-$(CONFIG_SENSORS_GL518SM) += gl518sm.o
obj-$(CONFIG_SENSORS_GL520SM) += gl520sm.o obj-$(CONFIG_SENSORS_GL520SM) += gl520sm.o
obj-$(CONFIG_SENSORS_HDAPS) += hdaps.o obj-$(CONFIG_SENSORS_HDAPS) += hdaps.o
obj-$(CONFIG_SENSORS_IBMPEX) += ibmpex.o
obj-$(CONFIG_SENSORS_IT87) += it87.o obj-$(CONFIG_SENSORS_IT87) += it87.o
obj-$(CONFIG_SENSORS_K8TEMP) += k8temp.o obj-$(CONFIG_SENSORS_K8TEMP) += k8temp.o
obj-$(CONFIG_SENSORS_LM63) += lm63.o obj-$(CONFIG_SENSORS_LM63) += lm63.o
......
...@@ -176,7 +176,7 @@ MODULE_PARM_DESC(verbose, "How verbose should the driver be? (0-3):\n" ...@@ -176,7 +176,7 @@ MODULE_PARM_DESC(verbose, "How verbose should the driver be? (0-3):\n"
The structure is dynamically allocated, at the same time when a new The structure is dynamically allocated, at the same time when a new
abituguru device is allocated. */ abituguru device is allocated. */
struct abituguru_data { struct abituguru_data {
struct class_device *class_dev; /* hwmon registered device */ struct device *hwmon_dev; /* hwmon registered device */
struct mutex update_lock; /* protect access to data and uGuru */ struct mutex update_lock; /* protect access to data and uGuru */
unsigned long last_updated; /* In jiffies */ unsigned long last_updated; /* In jiffies */
unsigned short addr; /* uguru base address */ unsigned short addr; /* uguru base address */
...@@ -1287,11 +1287,11 @@ static int __devinit abituguru_probe(struct platform_device *pdev) ...@@ -1287,11 +1287,11 @@ static int __devinit abituguru_probe(struct platform_device *pdev)
&abituguru_sysfs_attr[i].dev_attr)) &abituguru_sysfs_attr[i].dev_attr))
goto abituguru_probe_error; goto abituguru_probe_error;
data->class_dev = hwmon_device_register(&pdev->dev); data->hwmon_dev = hwmon_device_register(&pdev->dev);
if (!IS_ERR(data->class_dev)) if (!IS_ERR(data->hwmon_dev))
return 0; /* success */ return 0; /* success */
res = PTR_ERR(data->class_dev); res = PTR_ERR(data->hwmon_dev);
abituguru_probe_error: abituguru_probe_error:
for (i = 0; data->sysfs_attr[i].dev_attr.attr.name; i++) for (i = 0; data->sysfs_attr[i].dev_attr.attr.name; i++)
device_remove_file(&pdev->dev, &data->sysfs_attr[i].dev_attr); device_remove_file(&pdev->dev, &data->sysfs_attr[i].dev_attr);
...@@ -1308,7 +1308,7 @@ static int __devexit abituguru_remove(struct platform_device *pdev) ...@@ -1308,7 +1308,7 @@ static int __devexit abituguru_remove(struct platform_device *pdev)
int i; int i;
struct abituguru_data *data = platform_get_drvdata(pdev); struct abituguru_data *data = platform_get_drvdata(pdev);
hwmon_device_unregister(data->class_dev); hwmon_device_unregister(data->hwmon_dev);
for (i = 0; data->sysfs_attr[i].dev_attr.attr.name; i++) for (i = 0; data->sysfs_attr[i].dev_attr.attr.name; i++)
device_remove_file(&pdev->dev, &data->sysfs_attr[i].dev_attr); device_remove_file(&pdev->dev, &data->sysfs_attr[i].dev_attr);
for (i = 0; i < ARRAY_SIZE(abituguru_sysfs_attr); i++) for (i = 0; i < ARRAY_SIZE(abituguru_sysfs_attr); i++)
......
...@@ -124,7 +124,7 @@ struct abituguru3_motherboard_info { ...@@ -124,7 +124,7 @@ struct abituguru3_motherboard_info {
The structure is dynamically allocated, at the same time when a new The structure is dynamically allocated, at the same time when a new
abituguru3 device is allocated. */ abituguru3 device is allocated. */
struct abituguru3_data { struct abituguru3_data {
struct class_device *class_dev; /* hwmon registered device */ struct device *hwmon_dev; /* hwmon registered device */
struct mutex update_lock; /* protect access to data and uGuru */ struct mutex update_lock; /* protect access to data and uGuru */
unsigned short addr; /* uguru base address */ unsigned short addr; /* uguru base address */
char valid; /* !=0 if following fields are valid */ char valid; /* !=0 if following fields are valid */
...@@ -933,9 +933,9 @@ static int __devinit abituguru3_probe(struct platform_device *pdev) ...@@ -933,9 +933,9 @@ static int __devinit abituguru3_probe(struct platform_device *pdev)
&abituguru3_sysfs_attr[i].dev_attr)) &abituguru3_sysfs_attr[i].dev_attr))
goto abituguru3_probe_error; goto abituguru3_probe_error;
data->class_dev = hwmon_device_register(&pdev->dev); data->hwmon_dev = hwmon_device_register(&pdev->dev);
if (IS_ERR(data->class_dev)) { if (IS_ERR(data->hwmon_dev)) {
res = PTR_ERR(data->class_dev); res = PTR_ERR(data->hwmon_dev);
goto abituguru3_probe_error; goto abituguru3_probe_error;
} }
...@@ -957,7 +957,7 @@ static int __devexit abituguru3_remove(struct platform_device *pdev) ...@@ -957,7 +957,7 @@ static int __devexit abituguru3_remove(struct platform_device *pdev)
struct abituguru3_data *data = platform_get_drvdata(pdev); struct abituguru3_data *data = platform_get_drvdata(pdev);
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
hwmon_device_unregister(data->class_dev); hwmon_device_unregister(data->hwmon_dev);
for (i = 0; data->sysfs_attr[i].dev_attr.attr.name; i++) for (i = 0; data->sysfs_attr[i].dev_attr.attr.name; i++)
device_remove_file(&pdev->dev, &data->sysfs_attr[i].dev_attr); device_remove_file(&pdev->dev, &data->sysfs_attr[i].dev_attr);
for (i = 0; i < ARRAY_SIZE(abituguru3_sysfs_attr); i++) for (i = 0; i < ARRAY_SIZE(abituguru3_sysfs_attr); i++)
......
...@@ -47,7 +47,7 @@ static const u8 AD7418_REG_TEMP[] = { AD7418_REG_TEMP_IN, ...@@ -47,7 +47,7 @@ static const u8 AD7418_REG_TEMP[] = { AD7418_REG_TEMP_IN,
struct ad7418_data { struct ad7418_data {
struct i2c_client client; struct i2c_client client;
struct class_device *class_dev; struct device *hwmon_dev;
struct attribute_group attrs; struct attribute_group attrs;
enum chips type; enum chips type;
struct mutex lock; struct mutex lock;
...@@ -172,7 +172,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *devattr, ...@@ -172,7 +172,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *devattr,
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
struct ad7418_data *data = i2c_get_clientdata(client); struct ad7418_data *data = i2c_get_clientdata(client);
int temp = simple_strtol(buf, NULL, 10); long temp = simple_strtol(buf, NULL, 10);
mutex_lock(&data->lock); mutex_lock(&data->lock);
data->temp[attr->index] = LM75_TEMP_TO_REG(temp); data->temp[attr->index] = LM75_TEMP_TO_REG(temp);
...@@ -326,9 +326,9 @@ static int ad7418_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -326,9 +326,9 @@ static int ad7418_detect(struct i2c_adapter *adapter, int address, int kind)
if ((err = sysfs_create_group(&client->dev.kobj, &data->attrs))) if ((err = sysfs_create_group(&client->dev.kobj, &data->attrs)))
goto exit_detach; goto exit_detach;
data->class_dev = hwmon_device_register(&client->dev); data->hwmon_dev = hwmon_device_register(&client->dev);
if (IS_ERR(data->class_dev)) { if (IS_ERR(data->hwmon_dev)) {
err = PTR_ERR(data->class_dev); err = PTR_ERR(data->hwmon_dev);
goto exit_remove; goto exit_remove;
} }
...@@ -347,7 +347,7 @@ static int ad7418_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -347,7 +347,7 @@ static int ad7418_detect(struct i2c_adapter *adapter, int address, int kind)
static int ad7418_detach_client(struct i2c_client *client) static int ad7418_detach_client(struct i2c_client *client)
{ {
struct ad7418_data *data = i2c_get_clientdata(client); struct ad7418_data *data = i2c_get_clientdata(client);
hwmon_device_unregister(data->class_dev); hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&client->dev.kobj, &data->attrs); sysfs_remove_group(&client->dev.kobj, &data->attrs);
i2c_detach_client(client); i2c_detach_client(client);
kfree(data); kfree(data);
......
This diff is collapsed.
...@@ -133,7 +133,7 @@ static struct i2c_driver adm1025_driver = { ...@@ -133,7 +133,7 @@ static struct i2c_driver adm1025_driver = {
struct adm1025_data { struct adm1025_data {
struct i2c_client client; struct i2c_client client;
struct class_device *class_dev; struct device *hwmon_dev;
struct mutex update_lock; struct mutex update_lock;
char valid; /* zero until following fields are valid */ char valid; /* zero until following fields are valid */
unsigned long last_updated; /* in jiffies */ unsigned long last_updated; /* in jiffies */
...@@ -292,7 +292,7 @@ static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL); ...@@ -292,7 +292,7 @@ static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct adm1025_data *data = adm1025_update_device(dev); struct adm1025_data *data = dev_get_drvdata(dev);
return sprintf(buf, "%u\n", data->vrm); return sprintf(buf, "%u\n", data->vrm);
} }
static ssize_t set_vrm(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) static ssize_t set_vrm(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
...@@ -472,9 +472,9 @@ static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -472,9 +472,9 @@ static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind)
goto exit_remove; goto exit_remove;
} }
data->class_dev = hwmon_device_register(&new_client->dev); data->hwmon_dev = hwmon_device_register(&new_client->dev);
if (IS_ERR(data->class_dev)) { if (IS_ERR(data->hwmon_dev)) {
err = PTR_ERR(data->class_dev); err = PTR_ERR(data->hwmon_dev);
goto exit_remove; goto exit_remove;
} }
...@@ -538,7 +538,7 @@ static int adm1025_detach_client(struct i2c_client *client) ...@@ -538,7 +538,7 @@ static int adm1025_detach_client(struct i2c_client *client)
struct adm1025_data *data = i2c_get_clientdata(client); struct adm1025_data *data = i2c_get_clientdata(client);
int err; int err;
hwmon_device_unregister(data->class_dev); hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&client->dev.kobj, &adm1025_group); sysfs_remove_group(&client->dev.kobj, &adm1025_group);
sysfs_remove_group(&client->dev.kobj, &adm1025_group_opt); sysfs_remove_group(&client->dev.kobj, &adm1025_group_opt);
......
...@@ -260,7 +260,7 @@ struct pwm_data { ...@@ -260,7 +260,7 @@ struct pwm_data {
struct adm1026_data { struct adm1026_data {
struct i2c_client client; struct i2c_client client;
struct class_device *class_dev; struct device *hwmon_dev;
enum chips type; enum chips type;
struct mutex update_lock; struct mutex update_lock;
...@@ -1221,7 +1221,7 @@ static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL); ...@@ -1221,7 +1221,7 @@ static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
static ssize_t show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct adm1026_data *data = adm1026_update_device(dev); struct adm1026_data *data = dev_get_drvdata(dev);
return sprintf(buf,"%d\n", data->vrm); return sprintf(buf,"%d\n", data->vrm);
} }
static ssize_t store_vrm_reg(struct device *dev, struct device_attribute *attr, const char *buf, static ssize_t store_vrm_reg(struct device *dev, struct device_attribute *attr, const char *buf,
...@@ -1676,9 +1676,9 @@ static int adm1026_detect(struct i2c_adapter *adapter, int address, ...@@ -1676,9 +1676,9 @@ static int adm1026_detect(struct i2c_adapter *adapter, int address,
if ((err = sysfs_create_group(&new_client->dev.kobj, &adm1026_group))) if ((err = sysfs_create_group(&new_client->dev.kobj, &adm1026_group)))
goto exitdetach; goto exitdetach;
data->class_dev = hwmon_device_register(&new_client->dev); data->hwmon_dev = hwmon_device_register(&new_client->dev);
if (IS_ERR(data->class_dev)) { if (IS_ERR(data->hwmon_dev)) {
err = PTR_ERR(data->class_dev); err = PTR_ERR(data->hwmon_dev);
goto exitremove; goto exitremove;
} }
...@@ -1698,7 +1698,7 @@ static int adm1026_detect(struct i2c_adapter *adapter, int address, ...@@ -1698,7 +1698,7 @@ static int adm1026_detect(struct i2c_adapter *adapter, int address,
static int adm1026_detach_client(struct i2c_client *client) static int adm1026_detach_client(struct i2c_client *client)
{ {
struct adm1026_data *data = i2c_get_clientdata(client); struct adm1026_data *data = i2c_get_clientdata(client);
hwmon_device_unregister(data->class_dev); hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&client->dev.kobj, &adm1026_group); sysfs_remove_group(&client->dev.kobj, &adm1026_group);
i2c_detach_client(client); i2c_detach_client(client);
kfree(data); kfree(data);
......
...@@ -141,7 +141,7 @@ static struct i2c_driver adm1029_driver = { ...@@ -141,7 +141,7 @@ static struct i2c_driver adm1029_driver = {
struct adm1029_data { struct adm1029_data {
struct i2c_client client; struct i2c_client client;
struct class_device *class_dev; struct device *hwmon_dev;
struct mutex update_lock; struct mutex update_lock;
char valid; /* zero until following fields are valid */ char valid; /* zero until following fields are valid */
unsigned long last_updated; /* in jiffies */ unsigned long last_updated; /* in jiffies */
...@@ -391,9 +391,9 @@ static int adm1029_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -391,9 +391,9 @@ static int adm1029_detect(struct i2c_adapter *adapter, int address, int kind)
if ((err = sysfs_create_group(&client->dev.kobj, &adm1029_group))) if ((err = sysfs_create_group(&client->dev.kobj, &adm1029_group)))
goto exit_detach; goto exit_detach;
data->class_dev = hwmon_device_register(&client->dev); data->hwmon_dev = hwmon_device_register(&client->dev);
if (IS_ERR(data->class_dev)) { if (IS_ERR(data->hwmon_dev)) {
err = PTR_ERR(data->class_dev); err = PTR_ERR(data->hwmon_dev);
goto exit_remove_files; goto exit_remove_files;
} }
...@@ -431,7 +431,7 @@ static int adm1029_detach_client(struct i2c_client *client) ...@@ -431,7 +431,7 @@ static int adm1029_detach_client(struct i2c_client *client)
struct adm1029_data *data = i2c_get_clientdata(client); struct adm1029_data *data = i2c_get_clientdata(client);
int err; int err;
hwmon_device_unregister(data->class_dev); hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&client->dev.kobj, &adm1029_group); sysfs_remove_group(&client->dev.kobj, &adm1029_group);
if ((err = i2c_detach_client(client))) if ((err = i2c_detach_client(client)))
......
...@@ -70,7 +70,7 @@ typedef u8 auto_chan_table_t[8][2]; ...@@ -70,7 +70,7 @@ typedef u8 auto_chan_table_t[8][2];
/* Each client has this additional data */ /* Each client has this additional data */
struct adm1031_data { struct adm1031_data {
struct i2c_client client; struct i2c_client client;
struct class_device *class_dev; struct device *hwmon_dev;
struct mutex update_lock; struct mutex update_lock;
int chip_type; int chip_type;
char valid; /* !=0 if following fields are valid */ char valid; /* !=0 if following fields are valid */
...@@ -853,9 +853,9 @@ static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -853,9 +853,9 @@ static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind)
goto exit_remove; goto exit_remove;
} }
data->class_dev = hwmon_device_register(&new_client->dev); data->hwmon_dev = hwmon_device_register(&new_client->dev);
if (IS_ERR(data->class_dev)) { if (IS_ERR(data->hwmon_dev)) {
err = PTR_ERR(data->class_dev); err = PTR_ERR(data->hwmon_dev);
goto exit_remove; goto exit_remove;
} }
...@@ -877,7 +877,7 @@ static int adm1031_detach_client(struct i2c_client *client) ...@@ -877,7 +877,7 @@ static int adm1031_detach_client(struct i2c_client *client)
struct adm1031_data *data = i2c_get_clientdata(client); struct adm1031_data *data = i2c_get_clientdata(client);
int ret; int ret;
hwmon_device_unregister(data->class_dev); hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&client->dev.kobj, &adm1031_group); sysfs_remove_group(&client->dev.kobj, &adm1031_group);
sysfs_remove_group(&client->dev.kobj, &adm1031_group_opt); sysfs_remove_group(&client->dev.kobj, &adm1031_group_opt);
if ((ret = i2c_detach_client(client)) != 0) { if ((ret = i2c_detach_client(client)) != 0) {
......
...@@ -150,7 +150,7 @@ static struct i2c_driver adm9240_driver = { ...@@ -150,7 +150,7 @@ static struct i2c_driver adm9240_driver = {
struct adm9240_data { struct adm9240_data {
enum chips type; enum chips type;
struct i2c_client client; struct i2c_client client;
struct class_device *class_dev; struct device *hwmon_dev;
struct mutex update_lock; struct mutex update_lock;
char valid; char valid;
unsigned long last_updated_measure; unsigned long last_updated_measure;
...@@ -590,9 +590,9 @@ static int adm9240_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -590,9 +590,9 @@ static int adm9240_detect(struct i2c_adapter *adapter, int address, int kind)
if ((err = sysfs_create_group(&new_client->dev.kobj, &adm9240_group))) if ((err = sysfs_create_group(&new_client->dev.kobj, &adm9240_group)))
goto exit_detach; goto exit_detach;
data->class_dev = hwmon_device_register(&new_client->dev); data->hwmon_dev = hwmon_device_register(&new_client->dev);
if (IS_ERR(data->class_dev)) { if (IS_ERR(data->hwmon_dev)) {
err = PTR_ERR(data->class_dev); err = PTR_ERR(data->hwmon_dev);
goto exit_remove; goto exit_remove;
} }
...@@ -620,7 +620,7 @@ static int adm9240_detach_client(struct i2c_client *client) ...@@ -620,7 +620,7 @@ static int adm9240_detach_client(struct i2c_client *client)
struct adm9240_data *data = i2c_get_clientdata(client); struct adm9240_data *data = i2c_get_clientdata(client);
int err; int err;
hwmon_device_unregister(data->class_dev); hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&client->dev.kobj, &adm9240_group); sysfs_remove_group(&client->dev.kobj, &adm9240_group);
if ((err = i2c_detach_client(client))) if ((err = i2c_detach_client(client)))
......
This diff is collapsed.
...@@ -127,7 +127,7 @@ static s16 rest_x; ...@@ -127,7 +127,7 @@ static s16 rest_x;
static s16 rest_y; static s16 rest_y;
static struct timer_list applesmc_timer; static struct timer_list applesmc_timer;
static struct input_dev *applesmc_idev; static struct input_dev *applesmc_idev;
static struct class_device *hwmon_class_dev; static struct device *hwmon_dev;
/* Indicates whether this computer has an accelerometer. */ /* Indicates whether this computer has an accelerometer. */
static unsigned int applesmc_accelerometer; static unsigned int applesmc_accelerometer;
...@@ -1287,9 +1287,9 @@ static int __init applesmc_init(void) ...@@ -1287,9 +1287,9 @@ static int __init applesmc_init(void)
goto out_light_wq; goto out_light_wq;
} }
hwmon_class_dev = hwmon_device_register(&pdev->dev); hwmon_dev = hwmon_device_register(&pdev->dev);
if (IS_ERR(hwmon_class_dev)) { if (IS_ERR(hwmon_dev)) {
ret = PTR_ERR(hwmon_class_dev); ret = PTR_ERR(hwmon_dev);
goto out_light_ledclass; goto out_light_ledclass;
} }
...@@ -1331,7 +1331,7 @@ static int __init applesmc_init(void) ...@@ -1331,7 +1331,7 @@ static int __init applesmc_init(void)
static void __exit applesmc_exit(void) static void __exit applesmc_exit(void)
{ {
hwmon_device_unregister(hwmon_class_dev); hwmon_device_unregister(hwmon_dev);
if (applesmc_light) { if (applesmc_light) {
led_classdev_unregister(&applesmc_backlight); led_classdev_unregister(&applesmc_backlight);
destroy_workqueue(applesmc_led_wq); destroy_workqueue(applesmc_led_wq);
......
...@@ -143,7 +143,7 @@ static int FAN_FROM_REG(u8 val, int div) ...@@ -143,7 +143,7 @@ static int FAN_FROM_REG(u8 val, int div)
/* TEMP: 0.001C/bit (-128C to +127C) /* TEMP: 0.001C/bit (-128C to +127C)
REG: 1C/bit, two's complement */ REG: 1C/bit, two's complement */
static u8 TEMP_TO_REG(int temp) static u8 TEMP_TO_REG(long temp)
{ {
int ntemp = SENSORS_LIMIT(temp, ASB100_TEMP_MIN, ASB100_TEMP_MAX); int ntemp = SENSORS_LIMIT(temp, ASB100_TEMP_MIN, ASB100_TEMP_MAX);
ntemp += (ntemp<0 ? -500 : 500); ntemp += (ntemp<0 ? -500 : 500);
...@@ -182,7 +182,7 @@ static u8 DIV_TO_REG(long val) ...@@ -182,7 +182,7 @@ static u8 DIV_TO_REG(long val)
dynamically allocated, at the same time the client itself is allocated. */ dynamically allocated, at the same time the client itself is allocated. */
struct asb100_data { struct asb100_data {
struct i2c_client client; struct i2c_client client;
struct class_device *class_dev; struct device *hwmon_dev;
struct mutex lock; struct mutex lock;
enum chips type; enum chips type;
...@@ -448,7 +448,7 @@ static ssize_t set_##reg(struct device *dev, const char *buf, \ ...@@ -448,7 +448,7 @@ static ssize_t set_##reg(struct device *dev, const char *buf, \
{ \ { \
struct i2c_client *client = to_i2c_client(dev); \ struct i2c_client *client = to_i2c_client(dev); \
struct asb100_data *data = i2c_get_clientdata(client); \ struct asb100_data *data = i2c_get_clientdata(client); \
unsigned long val = simple_strtoul(buf, NULL, 10); \ long val = simple_strtol(buf, NULL, 10); \
\ \
mutex_lock(&data->update_lock); \ mutex_lock(&data->update_lock); \
switch (nr) { \ switch (nr) { \
...@@ -514,7 +514,7 @@ static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL); ...@@ -514,7 +514,7 @@ static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
/* VRM */ /* VRM */
static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct asb100_data *data = asb100_update_device(dev); struct asb100_data *data = dev_get_drvdata(dev);
return sprintf(buf, "%d\n", data->vrm); return sprintf(buf, "%d\n", data->vrm);
} }
...@@ -844,9 +844,9 @@ static int asb100_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -844,9 +844,9 @@ static int asb100_detect(struct i2c_adapter *adapter, int address, int kind)
if ((err = sysfs_create_group(&new_client->dev.kobj, &asb100_group))) if ((err = sysfs_create_group(&new_client->dev.kobj, &asb100_group)))
goto ERROR3; goto ERROR3;
data->class_dev = hwmon_device_register(&new_client->dev); data->hwmon_dev = hwmon_device_register(&new_client->dev);
if (IS_ERR(data->class_dev)) { if (IS_ERR(data->hwmon_dev)) {
err = PTR_ERR(data->class_dev); err = PTR_ERR(data->hwmon_dev);
goto ERROR4; goto ERROR4;
} }
...@@ -874,7 +874,7 @@ static int asb100_detach_client(struct i2c_client *client) ...@@ -874,7 +874,7 @@ static int asb100_detach_client(struct i2c_client *client)
/* main client */ /* main client */
if (data) { if (data) {
hwmon_device_unregister(data->class_dev); hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&client->dev.kobj, &asb100_group); sysfs_remove_group(&client->dev.kobj, &asb100_group);
} }
......
...@@ -61,7 +61,7 @@ static struct i2c_driver atxp1_driver = { ...@@ -61,7 +61,7 @@ static struct i2c_driver atxp1_driver = {
struct atxp1_data { struct atxp1_data {
struct i2c_client client; struct i2c_client client;
struct class_device *class_dev; struct device *hwmon_dev;
struct mutex update_lock; struct mutex update_lock;
unsigned long last_updated; unsigned long last_updated;
u8 valid; u8 valid;
...@@ -335,9 +335,9 @@ static int atxp1_detect(struct i2c_adapter *adapter, int address, int kind) ...@@ -335,9 +335,9 @@ static int atxp1_detect(struct i2c_adapter *adapter, int address, int kind)
if ((err = sysfs_create_group(&new_client->dev.kobj, &atxp1_group))) if ((err = sysfs_create_group(&new_client->dev.kobj, &atxp1_group)))
goto exit_detach; goto exit_detach;
data->class_dev = hwmon_device_register(&new_client->dev); data->hwmon_dev = hwmon_device_register(&new_client->dev);
if (IS_ERR(data->class_dev)) { if (IS_ERR(data->hwmon_dev)) {
err = PTR_ERR(data->class_dev); err = PTR_ERR(data->hwmon_dev);
goto exit_remove_files; goto exit_remove_files;
} }
...@@ -361,7 +361,7 @@ static int atxp1_detach_client(struct i2c_client * client) ...@@ -361,7 +361,7 @@ static int atxp1_detach_client(struct i2c_client * client)
struct atxp1_data * data = i2c_get_clientdata(client); struct atxp1_data * data = i2c_get_clientdata(client);
int err; int err;
hwmon_device_unregister(data->class_dev); hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&client->dev.kobj, &atxp1_group); sysfs_remove_group(&client->dev.kobj, &atxp1_group);
err = i2c_detach_client(client); err = i2c_detach_client(client);
......
...@@ -47,7 +47,7 @@ typedef enum { SHOW_TEMP, SHOW_TJMAX, SHOW_LABEL, SHOW_NAME } SHOW; ...@@ -47,7 +47,7 @@ typedef enum { SHOW_TEMP, SHOW_TJMAX, SHOW_LABEL, SHOW_NAME } SHOW;
static struct coretemp_data *coretemp_update_device(struct device *dev); static struct coretemp_data *coretemp_update_device(struct device *dev);
struct coretemp_data { struct coretemp_data {
struct class_device *class_dev; struct device *hwmon_dev;
struct mutex update_lock; struct mutex update_lock;
const char *name; const char *name;
u32 id; u32 id;
...@@ -58,8 +58,6 @@ struct coretemp_data { ...@@ -58,8 +58,6 @@ struct coretemp_data {
u8 alarm; u8 alarm;
}; };
static struct coretemp_data *coretemp_update_device(struct device *dev);
/* /*
* Sysfs stuff * Sysfs stuff
*/ */
...@@ -228,9 +226,9 @@ static int __devinit coretemp_probe(struct platform_device *pdev) ...@@ -228,9 +226,9 @@ static int __devinit coretemp_probe(struct platform_device *pdev)
if ((err = sysfs_create_group(&pdev->dev.kobj, &coretemp_group))) if ((err = sysfs_create_group(&pdev->dev.kobj, &coretemp_group)))
goto exit_free; goto exit_free;
data->class_dev = hwmon_device_register(&pdev->dev); data->hwmon_dev = hwmon_device_register(&pdev->dev);
if (IS_ERR(data->class_dev)) { if (IS_ERR(data->hwmon_dev)) {
err = PTR_ERR(data->class_dev); err = PTR_ERR(data->hwmon_dev);
dev_err(&pdev->dev, "Class registration failed (%d)\n", dev_err(&pdev->dev, "Class registration failed (%d)\n",
err); err);
goto exit_class; goto exit_class;
...@@ -250,7 +248,7 @@ static int __devexit coretemp_remove(struct platform_device *pdev) ...@@ -250,7 +248,7 @@ static int __devexit coretemp_remove(struct platform_device *pdev)
{ {
struct coretemp_data *data = platform_get_drvdata(pdev); struct coretemp_data *data = platform_get_drvdata(pdev);
hwmon_device_unregister(data->class_dev); hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&pdev->dev.kobj, &coretemp_group); sysfs_remove_group(&pdev->dev.kobj, &coretemp_group);
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
kfree(data); kfree(data);
...@@ -350,7 +348,7 @@ static int coretemp_cpu_callback(struct notifier_block *nfb, ...@@ -350,7 +348,7 @@ static int coretemp_cpu_callback(struct notifier_block *nfb,
return NOTIFY_OK; return NOTIFY_OK;
} }
static struct notifier_block __cpuinitdata coretemp_cpu_notifier = { static struct notifier_block coretemp_cpu_notifier = {
.notifier_call = coretemp_cpu_callback, .notifier_call = coretemp_cpu_callback,
}; };
#endif /* !CONFIG_HOTPLUG_CPU */ #endif /* !CONFIG_HOTPLUG_CPU */
...@@ -371,9 +369,10 @@ static int __init coretemp_init(void) ...@@ -371,9 +369,10 @@ static int __init coretemp_init(void)
for_each_online_cpu(i) { for_each_online_cpu(i) {
struct cpuinfo_x86 *c = &(cpu_data)[i]; struct cpuinfo_x86 *c = &(cpu_data)[i];
/* check if family 6, models e, f */ /* check if family 6, models e, f, 16 */
if ((c->cpuid_level < 0) || (c->x86 != 0x6) || if ((c->cpuid_level < 0) || (c->x86 != 0x6) ||
!((c->x86_model == 0xe) || (c->x86_model == 0xf))) { !((c->x86_model == 0xe) || (c->x86_model == 0xf) ||
(c->x86_model == 0x16))) {
/* supported CPU not found, but report the unknown /* supported CPU not found, but report the unknown
family 6 CPU */ family 6 CPU */
......
This diff is collapsed.
...@@ -73,7 +73,7 @@ static const u8 DS1621_REG_TEMP[3] = { ...@@ -73,7 +73,7 @@ static const u8 DS1621_REG_TEMP[3] = {
/* Each client has this additional data */ /* Each client has this additional data */
struct ds1621_data { struct ds1621_data {
struct i2c_client client; struct i2c_client client;
struct class_device *class_dev; struct device *hwmon_dev;
struct mutex update_lock; struct mutex update_lock;
char valid; /* !=0 if following fields are valid */ char valid; /* !=0 if following fields are valid */
unsigned long last_updated; /* In jiffies */ unsigned long last_updated; /* In jiffies */
...@@ -151,7 +151,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da, ...@@ -151,7 +151,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da,
struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
struct ds1621_data *data = ds1621_update_client(dev); struct ds1621_data *data = ds1621_update_client(dev);
u16 val = LM75_TEMP_TO_REG(simple_strtoul(buf, NULL, 10)); u16 val = LM75_TEMP_TO_REG(simple_strtol(buf, NULL, 10));
mutex_lock(&data->update_lock); mutex_lock(&data->update_lock);
data->temp[attr->index] = val; data->temp[attr->index] = val;
...@@ -266,9 +266,9 @@ static int ds1621_detect(struct i2c_adapter *adapter, int address, ...@@ -266,9 +266,9 @@ static int ds1621_detect(struct i2c_adapter *adapter, int address,
if ((err = sysfs_create_group(&client->dev.kobj, &ds1621_group))) if ((err = sysfs_create_group(&client->dev.kobj, &ds1621_group)))
goto exit_detach; goto exit_detach;
data->class_dev = hwmon_device_register(&client->dev); data->hwmon_dev = hwmon_device_register(&client->dev);
if (IS_ERR(data->class_dev)) { if (IS_ERR(data->hwmon_dev)) {
err = PTR_ERR(data->class_dev); err = PTR_ERR(data->hwmon_dev);
goto exit_remove_files; goto exit_remove_files;
} }
...@@ -289,7 +289,7 @@ static int ds1621_detach_client(struct i2c_client *client) ...@@ -289,7 +289,7 @@ static int ds1621_detach_client(struct i2c_client *client)
struct ds1621_data *data = i2c_get_clientdata(client); struct ds1621_data *data = i2c_get_clientdata(client);
int err; int err;
hwmon_device_unregister(data->class_dev); hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&client->dev.kobj, &ds1621_group); sysfs_remove_group(&client->dev.kobj, &ds1621_group);
if ((err = i2c_detach_client(client))) if ((err = i2c_detach_client(client)))
......
...@@ -10,6 +10,9 @@ ...@@ -10,6 +10,9 @@
* The F71872F/FG is almost the same, with two more voltages monitored, * The F71872F/FG is almost the same, with two more voltages monitored,
* and 6 VID inputs. * and 6 VID inputs.
* *
* The F71806F/FG is essentially the same as the F71872F/FG. It even has
* the same chip ID, so the driver can't differentiate between.
*
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
...@@ -159,7 +162,7 @@ struct f71805f_auto_point { ...@@ -159,7 +162,7 @@ struct f71805f_auto_point {
struct f71805f_data { struct f71805f_data {
unsigned short addr; unsigned short addr;
const char *name; const char *name;
struct class_device *class_dev; struct device *hwmon_dev;
struct mutex update_lock; struct mutex update_lock;
char valid; /* !=0 if following fields are valid */ char valid; /* !=0 if following fields are valid */
...@@ -1378,9 +1381,9 @@ static int __devinit f71805f_probe(struct platform_device *pdev) ...@@ -1378,9 +1381,9 @@ static int __devinit f71805f_probe(struct platform_device *pdev)
} }
} }
data->class_dev = hwmon_device_register(&pdev->dev); data->hwmon_dev = hwmon_device_register(&pdev->dev);
if (IS_ERR(data->class_dev)) { if (IS_ERR(data->hwmon_dev)) {
err = PTR_ERR(data->class_dev); err = PTR_ERR(data->hwmon_dev);
dev_err(&pdev->dev, "Class registration failed (%d)\n", err); dev_err(&pdev->dev, "Class registration failed (%d)\n", err);
goto exit_remove_files; goto exit_remove_files;
} }
...@@ -1407,7 +1410,7 @@ static int __devexit f71805f_remove(struct platform_device *pdev) ...@@ -1407,7 +1410,7 @@ static int __devexit f71805f_remove(struct platform_device *pdev)
struct resource *res; struct resource *res;
int i; int i;
hwmon_device_unregister(data->class_dev); hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&pdev->dev.kobj, &f71805f_group); sysfs_remove_group(&pdev->dev.kobj, &f71805f_group);
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_optin[i]); sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_optin[i]);
...@@ -1485,7 +1488,7 @@ static int __init f71805f_find(int sioaddr, unsigned short *address, ...@@ -1485,7 +1488,7 @@ static int __init f71805f_find(int sioaddr, unsigned short *address,
static const char *names[] = { static const char *names[] = {
"F71805F/FG", "F71805F/FG",
"F71872F/FG", "F71872F/FG or F71806F/FG",
}; };
superio_enter(sioaddr); superio_enter(sioaddr);
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
/* TEMP: 0.001C/bit (-55C to +125C) /* TEMP: 0.001C/bit (-55C to +125C)
REG: (0.5C/bit, two's complement) << 7 */ REG: (0.5C/bit, two's complement) << 7 */
static inline u16 LM75_TEMP_TO_REG(int temp) static inline u16 LM75_TEMP_TO_REG(long temp)
{ {
int ntemp = SENSORS_LIMIT(temp, LM75_TEMP_MIN, LM75_TEMP_MAX); int ntemp = SENSORS_LIMIT(temp, LM75_TEMP_MIN, LM75_TEMP_MAX);
ntemp += (ntemp<0 ? -250 : 250); ntemp += (ntemp<0 ? -250 : 250);
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment