aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGiel van Schijndel <me@mortis.eu>2010-08-09 20:21:13 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2010-08-09 23:45:10 -0400
commit7721fea3d0fd93fb4d000eb737b444369358d6d3 (patch)
tree82584339f492a2d771a67924209871c81e3ec9c7
parent6b8e8282611ea35845dcff0cb321a7d735fc3155 (diff)
hwmon: f71882fg: add support for the Fintek F71808E
Allow device probing to recognise the Fintek F71808E. Sysfs interface: * Fan/pwm control is the same as for F71889FG * Temperature and voltage sensor handling is largely the same as for the F71889FG - Has one temperature sensor less (doesn't have temp3) - Misses one voltage sensor (doesn't have V6, thus in6_input refers to what in7_input refers for F71889FG) For the purpose of the sysfs interface fxxxx_in_temp_attr[] is split up such that it can largely be reused. Signed-off-by: Giel van Schijndel <me@mortis.eu> Cc: Jean Delvare <khali@linux-fr.org> Cc: Hans de Goede <hdegoede@redhat.com> Cc: Jonathan Cameron <jic23@cam.ac.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--Documentation/hwmon/f71882fg4
-rw-r--r--drivers/hwmon/Kconfig6
-rw-r--r--drivers/hwmon/f71882fg.c83
3 files changed, 82 insertions, 11 deletions
diff --git a/Documentation/hwmon/f71882fg b/Documentation/hwmon/f71882fg
index a7952c2bd959..1a07fd674cd0 100644
--- a/Documentation/hwmon/f71882fg
+++ b/Documentation/hwmon/f71882fg
@@ -2,6 +2,10 @@ Kernel driver f71882fg
2====================== 2======================
3 3
4Supported chips: 4Supported chips:
5 * Fintek F71808E
6 Prefix: 'f71808fg'
7 Addresses scanned: none, address read from Super I/O config space
8 Datasheet: Not public
5 * Fintek F71858FG 9 * Fintek F71858FG
6 Prefix: 'f71858fg' 10 Prefix: 'f71858fg'
7 Addresses scanned: none, address read from Super I/O config space 11 Addresses scanned: none, address read from Super I/O config space
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
index c9e2aad34c8b..f3adf18bfa05 100644
--- a/drivers/hwmon/Kconfig
+++ b/drivers/hwmon/Kconfig
@@ -332,11 +332,11 @@ config SENSORS_F71805F
332 will be called f71805f. 332 will be called f71805f.
333 333
334config SENSORS_F71882FG 334config SENSORS_F71882FG
335 tristate "Fintek F71858FG, F71862FG, F71882FG, F71889FG and F8000" 335 tristate "Fintek F71808E, F71858FG, F71862FG, F71882FG, F71889FG and F8000"
336 depends on EXPERIMENTAL 336 depends on EXPERIMENTAL
337 help 337 help
338 If you say yes here you get support for hardware monitoring 338 If you say yes here you get support for hardware monitoring features
339 features of the Fintek F71858FG, F71862FG/71863FG, F71882FG/F71883FG, 339 of the Fintek F71808E, F71858FG, F71862FG/71863FG, F71882FG/F71883FG,
340 F71889FG and F8000 Super-I/O chips. 340 F71889FG and F8000 Super-I/O chips.
341 341
342 This driver can also be built as a module. If so, the module 342 This driver can also be built as a module. If so, the module
diff --git a/drivers/hwmon/f71882fg.c b/drivers/hwmon/f71882fg.c
index 537841ef44b9..6207120dcd4d 100644
--- a/drivers/hwmon/f71882fg.c
+++ b/drivers/hwmon/f71882fg.c
@@ -45,6 +45,7 @@
45#define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */ 45#define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */
46 46
47#define SIO_FINTEK_ID 0x1934 /* Manufacturers ID */ 47#define SIO_FINTEK_ID 0x1934 /* Manufacturers ID */
48#define SIO_F71808_ID 0x0901 /* Chipset ID */
48#define SIO_F71858_ID 0x0507 /* Chipset ID */ 49#define SIO_F71858_ID 0x0507 /* Chipset ID */
49#define SIO_F71862_ID 0x0601 /* Chipset ID */ 50#define SIO_F71862_ID 0x0601 /* Chipset ID */
50#define SIO_F71882_ID 0x0541 /* Chipset ID */ 51#define SIO_F71882_ID 0x0541 /* Chipset ID */
@@ -96,9 +97,10 @@ static unsigned short force_id;
96module_param(force_id, ushort, 0); 97module_param(force_id, ushort, 0);
97MODULE_PARM_DESC(force_id, "Override the detected device ID"); 98MODULE_PARM_DESC(force_id, "Override the detected device ID");
98 99
99enum chips { f71858fg, f71862fg, f71882fg, f71889fg, f8000 }; 100enum chips { f71808fg, f71858fg, f71862fg, f71882fg, f71889fg, f8000 };
100 101
101static const char *f71882fg_names[] = { 102static const char *f71882fg_names[] = {
103 "f71808fg",
102 "f71858fg", 104 "f71858fg",
103 "f71862fg", 105 "f71862fg",
104 "f71882fg", 106 "f71882fg",
@@ -306,8 +308,8 @@ static struct sensor_device_attribute_2 f71858fg_in_temp_attr[] = {
306 SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 2), 308 SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
307}; 309};
308 310
309/* Temp and in attr common to the f71862fg, f71882fg and f71889fg */ 311/* In attr common to the f71862fg, f71882fg and f71889fg */
310static struct sensor_device_attribute_2 fxxxx_in_temp_attr[] = { 312static struct sensor_device_attribute_2 fxxxx_in_attr[] = {
311 SENSOR_ATTR_2(in0_input, S_IRUGO, show_in, NULL, 0, 0), 313 SENSOR_ATTR_2(in0_input, S_IRUGO, show_in, NULL, 0, 0),
312 SENSOR_ATTR_2(in1_input, S_IRUGO, show_in, NULL, 0, 1), 314 SENSOR_ATTR_2(in1_input, S_IRUGO, show_in, NULL, 0, 1),
313 SENSOR_ATTR_2(in2_input, S_IRUGO, show_in, NULL, 0, 2), 315 SENSOR_ATTR_2(in2_input, S_IRUGO, show_in, NULL, 0, 2),
@@ -317,6 +319,22 @@ static struct sensor_device_attribute_2 fxxxx_in_temp_attr[] = {
317 SENSOR_ATTR_2(in6_input, S_IRUGO, show_in, NULL, 0, 6), 319 SENSOR_ATTR_2(in6_input, S_IRUGO, show_in, NULL, 0, 6),
318 SENSOR_ATTR_2(in7_input, S_IRUGO, show_in, NULL, 0, 7), 320 SENSOR_ATTR_2(in7_input, S_IRUGO, show_in, NULL, 0, 7),
319 SENSOR_ATTR_2(in8_input, S_IRUGO, show_in, NULL, 0, 8), 321 SENSOR_ATTR_2(in8_input, S_IRUGO, show_in, NULL, 0, 8),
322};
323
324/* In attr for the f71808fg */
325static struct sensor_device_attribute_2 f71808_in_attr[] = {
326 SENSOR_ATTR_2(in0_input, S_IRUGO, show_in, NULL, 0, 0),
327 SENSOR_ATTR_2(in1_input, S_IRUGO, show_in, NULL, 0, 1),
328 SENSOR_ATTR_2(in2_input, S_IRUGO, show_in, NULL, 0, 2),
329 SENSOR_ATTR_2(in3_input, S_IRUGO, show_in, NULL, 0, 3),
330 SENSOR_ATTR_2(in4_input, S_IRUGO, show_in, NULL, 0, 4),
331 SENSOR_ATTR_2(in5_input, S_IRUGO, show_in, NULL, 0, 5),
332 SENSOR_ATTR_2(in6_input, S_IRUGO, show_in, NULL, 0, 7),
333 SENSOR_ATTR_2(in7_input, S_IRUGO, show_in, NULL, 0, 8),
334};
335
336/* Temp attr common to the f71808fg, f71862fg, f71882fg and f71889fg */
337static struct sensor_device_attribute_2 fxxxx_temp_attr[] = {
320 SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 1), 338 SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 1),
321 SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_max, 339 SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_max,
322 store_temp_max, 0, 1), 340 store_temp_max, 0, 1),
@@ -355,6 +373,10 @@ static struct sensor_device_attribute_2 fxxxx_in_temp_attr[] = {
355 store_temp_beep, 0, 6), 373 store_temp_beep, 0, 6),
356 SENSOR_ATTR_2(temp2_type, S_IRUGO, show_temp_type, NULL, 0, 2), 374 SENSOR_ATTR_2(temp2_type, S_IRUGO, show_temp_type, NULL, 0, 2),
357 SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 2), 375 SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
376};
377
378/* Temp and in attr common to the f71862fg, f71882fg and f71889fg */
379static struct sensor_device_attribute_2 f71862_temp_attr[] = {
358 SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 3), 380 SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 3),
359 SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_max, 381 SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_max,
360 store_temp_max, 0, 3), 382 store_temp_max, 0, 3),
@@ -989,6 +1011,11 @@ static struct f71882fg_data *f71882fg_update_device(struct device *dev)
989 data->temp_type[1] = 6; 1011 data->temp_type[1] = 6;
990 break; 1012 break;
991 } 1013 }
1014 } else if (data->type == f71808fg) {
1015 reg = f71882fg_read8(data, F71882FG_REG_TEMP_TYPE);
1016 data->temp_type[1] = (reg & 0x02) ? 2 : 4;
1017 data->temp_type[2] = (reg & 0x04) ? 2 : 4;
1018
992 } else { 1019 } else {
993 reg2 = f71882fg_read8(data, F71882FG_REG_PECI); 1020 reg2 = f71882fg_read8(data, F71882FG_REG_PECI);
994 if ((reg2 & 0x03) == 0x01) 1021 if ((reg2 & 0x03) == 0x01)
@@ -1871,7 +1898,8 @@ static ssize_t store_pwm_auto_point_temp(struct device *dev,
1871 1898
1872 val /= 1000; 1899 val /= 1000;
1873 1900
1874 if (data->type == f71889fg) 1901 if (data->type == f71889fg
1902 || data->type == f71808fg)
1875 val = SENSORS_LIMIT(val, -128, 127); 1903 val = SENSORS_LIMIT(val, -128, 127);
1876 else 1904 else
1877 val = SENSORS_LIMIT(val, 0, 127); 1905 val = SENSORS_LIMIT(val, 0, 127);
@@ -1974,8 +2002,28 @@ static int __devinit f71882fg_probe(struct platform_device *pdev)
1974 /* fall through! */ 2002 /* fall through! */
1975 case f71862fg: 2003 case f71862fg:
1976 err = f71882fg_create_sysfs_files(pdev, 2004 err = f71882fg_create_sysfs_files(pdev,
1977 fxxxx_in_temp_attr, 2005 f71862_temp_attr,
1978 ARRAY_SIZE(fxxxx_in_temp_attr)); 2006 ARRAY_SIZE(f71862_temp_attr));
2007 if (err)
2008 goto exit_unregister_sysfs;
2009 err = f71882fg_create_sysfs_files(pdev,
2010 fxxxx_in_attr,
2011 ARRAY_SIZE(fxxxx_in_attr));
2012 if (err)
2013 goto exit_unregister_sysfs;
2014 err = f71882fg_create_sysfs_files(pdev,
2015 fxxxx_temp_attr,
2016 ARRAY_SIZE(fxxxx_temp_attr));
2017 break;
2018 case f71808fg:
2019 err = f71882fg_create_sysfs_files(pdev,
2020 f71808_in_attr,
2021 ARRAY_SIZE(f71808_in_attr));
2022 if (err)
2023 goto exit_unregister_sysfs;
2024 err = f71882fg_create_sysfs_files(pdev,
2025 fxxxx_temp_attr,
2026 ARRAY_SIZE(fxxxx_temp_attr));
1979 break; 2027 break;
1980 case f8000: 2028 case f8000:
1981 err = f71882fg_create_sysfs_files(pdev, 2029 err = f71882fg_create_sysfs_files(pdev,
@@ -2002,6 +2050,7 @@ static int __devinit f71882fg_probe(struct platform_device *pdev)
2002 case f71862fg: 2050 case f71862fg:
2003 err = (data->pwm_enable & 0x15) != 0x15; 2051 err = (data->pwm_enable & 0x15) != 0x15;
2004 break; 2052 break;
2053 case f71808fg:
2005 case f71882fg: 2054 case f71882fg:
2006 case f71889fg: 2055 case f71889fg:
2007 err = 0; 2056 err = 0;
@@ -2047,6 +2096,7 @@ static int __devinit f71882fg_probe(struct platform_device *pdev)
2047 f8000_auto_pwm_attr, 2096 f8000_auto_pwm_attr,
2048 ARRAY_SIZE(f8000_auto_pwm_attr)); 2097 ARRAY_SIZE(f8000_auto_pwm_attr));
2049 break; 2098 break;
2099 case f71808fg:
2050 case f71889fg: 2100 case f71889fg:
2051 for (i = 0; i < nr_fans; i++) { 2101 for (i = 0; i < nr_fans; i++) {
2052 data->pwm_auto_point_mapping[i] = 2102 data->pwm_auto_point_mapping[i] =
@@ -2126,8 +2176,22 @@ static int f71882fg_remove(struct platform_device *pdev)
2126 /* fall through! */ 2176 /* fall through! */
2127 case f71862fg: 2177 case f71862fg:
2128 f71882fg_remove_sysfs_files(pdev, 2178 f71882fg_remove_sysfs_files(pdev,
2129 fxxxx_in_temp_attr, 2179 f71862_temp_attr,
2130 ARRAY_SIZE(fxxxx_in_temp_attr)); 2180 ARRAY_SIZE(f71862_temp_attr));
2181 f71882fg_remove_sysfs_files(pdev,
2182 fxxxx_in_attr,
2183 ARRAY_SIZE(fxxxx_in_attr));
2184 f71882fg_remove_sysfs_files(pdev,
2185 fxxxx_temp_attr,
2186 ARRAY_SIZE(fxxxx_temp_attr));
2187 break;
2188 case f71808fg:
2189 f71882fg_remove_sysfs_files(pdev,
2190 f71808_in_attr,
2191 ARRAY_SIZE(f71808_in_attr));
2192 f71882fg_remove_sysfs_files(pdev,
2193 fxxxx_temp_attr,
2194 ARRAY_SIZE(fxxxx_temp_attr));
2131 break; 2195 break;
2132 case f8000: 2196 case f8000:
2133 f71882fg_remove_sysfs_files(pdev, 2197 f71882fg_remove_sysfs_files(pdev,
@@ -2195,6 +2259,9 @@ static int __init f71882fg_find(int sioaddr, unsigned short *address,
2195 2259
2196 devid = force_id ? force_id : superio_inw(sioaddr, SIO_REG_DEVID); 2260 devid = force_id ? force_id : superio_inw(sioaddr, SIO_REG_DEVID);
2197 switch (devid) { 2261 switch (devid) {
2262 case SIO_F71808_ID:
2263 sio_data->type = f71808fg;
2264 break;
2198 case SIO_F71858_ID: 2265 case SIO_F71858_ID:
2199 sio_data->type = f71858fg; 2266 sio_data->type = f71858fg;
2200 break; 2267 break;