aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon
diff options
context:
space:
mode:
authorJean Delvare <khali@linux-fr.org>2011-10-13 15:49:08 -0400
committerGuenter Roeck <guenter.roeck@ericsson.com>2011-10-13 19:51:29 -0400
commitbf164c58e58328c40ebc597a8ac00cc6840f9703 (patch)
tree73c100e882514b5281b300a18137363f3310f824 /drivers/hwmon
parent976d167615b64e14bc1491ca51d424e2ba9a5e84 (diff)
hwmon: (w83627ehf) Properly report thermal diode sensors
The w83627ehf driver is improperly reporting thermal diode sensors as type 2, instead of 3. This caused "sensors" and possibly other monitoring tools to report these sensors as "transistor" instead of "thermal diode". Furthermore, diode subtype selection (CPU vs. external) is only supported by the original W83627EHF/EHG. All later models only support CPU diode type, and some (NCT6776F) don't even have the register in question so we should avoid reading from it. Signed-off-by: Jean Delvare <khali@linux-fr.org> Cc: stable@kernel.org Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Diffstat (limited to 'drivers/hwmon')
-rw-r--r--drivers/hwmon/w83627ehf.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/hwmon/w83627ehf.c b/drivers/hwmon/w83627ehf.c
index f2b377c56a3a..7b0260dc76fb 100644
--- a/drivers/hwmon/w83627ehf.c
+++ b/drivers/hwmon/w83627ehf.c
@@ -1715,7 +1715,8 @@ static void w83627ehf_device_remove_files(struct device *dev)
1715} 1715}
1716 1716
1717/* Get the monitoring functions started */ 1717/* Get the monitoring functions started */
1718static inline void __devinit w83627ehf_init_device(struct w83627ehf_data *data) 1718static inline void __devinit w83627ehf_init_device(struct w83627ehf_data *data,
1719 enum kinds kind)
1719{ 1720{
1720 int i; 1721 int i;
1721 u8 tmp, diode; 1722 u8 tmp, diode;
@@ -1746,10 +1747,16 @@ static inline void __devinit w83627ehf_init_device(struct w83627ehf_data *data)
1746 w83627ehf_write_value(data, W83627EHF_REG_VBAT, tmp | 0x01); 1747 w83627ehf_write_value(data, W83627EHF_REG_VBAT, tmp | 0x01);
1747 1748
1748 /* Get thermal sensor types */ 1749 /* Get thermal sensor types */
1749 diode = w83627ehf_read_value(data, W83627EHF_REG_DIODE); 1750 switch (kind) {
1751 case w83627ehf:
1752 diode = w83627ehf_read_value(data, W83627EHF_REG_DIODE);
1753 break;
1754 default:
1755 diode = 0x70;
1756 }
1750 for (i = 0; i < 3; i++) { 1757 for (i = 0; i < 3; i++) {
1751 if ((tmp & (0x02 << i))) 1758 if ((tmp & (0x02 << i)))
1752 data->temp_type[i] = (diode & (0x10 << i)) ? 1 : 2; 1759 data->temp_type[i] = (diode & (0x10 << i)) ? 1 : 3;
1753 else 1760 else
1754 data->temp_type[i] = 4; /* thermistor */ 1761 data->temp_type[i] = 4; /* thermistor */
1755 } 1762 }
@@ -2016,7 +2023,7 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev)
2016 } 2023 }
2017 2024
2018 /* Initialize the chip */ 2025 /* Initialize the chip */
2019 w83627ehf_init_device(data); 2026 w83627ehf_init_device(data, sio_data->kind);
2020 2027
2021 data->vrm = vid_which_vrm(); 2028 data->vrm = vid_which_vrm();
2022 superio_enter(sio_data->sioreg); 2029 superio_enter(sio_data->sioreg);