1 /***************************************************************************
2 * Copyright (C) 2006 by Hans Edgington <hans@edgington.nl> *
3 * Copyright (C) 2007-2011 Hans de Goede <hdegoede@redhat.com> *
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. *
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. *
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 ***************************************************************************/
21 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
23 #include <linux/module.h>
24 #include <linux/init.h>
25 #include <linux/slab.h>
26 #include <linux/jiffies.h>
27 #include <linux/platform_device.h>
28 #include <linux/hwmon.h>
29 #include <linux/hwmon-sysfs.h>
30 #include <linux/err.h>
31 #include <linux/mutex.h>
33 #include <linux/acpi.h>
35 #define DRVNAME "f71882fg"
37 #define SIO_F71858FG_LD_HWM 0x02 /* Hardware monitor logical device */
38 #define SIO_F71882FG_LD_HWM 0x04 /* Hardware monitor logical device */
39 #define SIO_UNLOCK_KEY 0x87 /* Key to enable Super-I/O */
40 #define SIO_LOCK_KEY 0xAA /* Key to disable Super-I/O */
42 #define SIO_REG_LDSEL 0x07 /* Logical device select */
43 #define SIO_REG_DEVID 0x20 /* Device ID (2 bytes) */
44 #define SIO_REG_DEVREV 0x22 /* Device revision */
45 #define SIO_REG_MANID 0x23 /* Fintek ID (2 bytes) */
46 #define SIO_REG_ENABLE 0x30 /* Logical device enable */
47 #define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */
49 #define SIO_FINTEK_ID 0x1934 /* Manufacturers ID */
50 #define SIO_F71808E_ID 0x0901 /* Chipset ID */
51 #define SIO_F71808A_ID 0x1001 /* Chipset ID */
52 #define SIO_F71858_ID 0x0507 /* Chipset ID */
53 #define SIO_F71862_ID 0x0601 /* Chipset ID */
54 #define SIO_F71869_ID 0x0814 /* Chipset ID */
55 #define SIO_F71869A_ID 0x1007 /* Chipset ID */
56 #define SIO_F71882_ID 0x0541 /* Chipset ID */
57 #define SIO_F71889_ID 0x0723 /* Chipset ID */
58 #define SIO_F71889E_ID 0x0909 /* Chipset ID */
59 #define SIO_F71889A_ID 0x1005 /* Chipset ID */
60 #define SIO_F8000_ID 0x0581 /* Chipset ID */
61 #define SIO_F81865_ID 0x0704 /* Chipset ID */
63 #define REGION_LENGTH 8
64 #define ADDR_REG_OFFSET 5
65 #define DATA_REG_OFFSET 6
67 #define F71882FG_REG_IN_STATUS 0x12 /* f7188x only */
68 #define F71882FG_REG_IN_BEEP 0x13 /* f7188x only */
69 #define F71882FG_REG_IN(nr) (0x20 + (nr))
70 #define F71882FG_REG_IN1_HIGH 0x32 /* f7188x only */
72 #define F71882FG_REG_FAN(nr) (0xA0 + (16 * (nr)))
73 #define F71882FG_REG_FAN_TARGET(nr) (0xA2 + (16 * (nr)))
74 #define F71882FG_REG_FAN_FULL_SPEED(nr) (0xA4 + (16 * (nr)))
75 #define F71882FG_REG_FAN_STATUS 0x92
76 #define F71882FG_REG_FAN_BEEP 0x93
78 #define F71882FG_REG_TEMP(nr) (0x70 + 2 * (nr))
79 #define F71882FG_REG_TEMP_OVT(nr) (0x80 + 2 * (nr))
80 #define F71882FG_REG_TEMP_HIGH(nr) (0x81 + 2 * (nr))
81 #define F71882FG_REG_TEMP_STATUS 0x62
82 #define F71882FG_REG_TEMP_BEEP 0x63
83 #define F71882FG_REG_TEMP_CONFIG 0x69
84 #define F71882FG_REG_TEMP_HYST(nr) (0x6C + (nr))
85 #define F71882FG_REG_TEMP_TYPE 0x6B
86 #define F71882FG_REG_TEMP_DIODE_OPEN 0x6F
88 #define F71882FG_REG_PWM(nr) (0xA3 + (16 * (nr)))
89 #define F71882FG_REG_PWM_TYPE 0x94
90 #define F71882FG_REG_PWM_ENABLE 0x96
92 #define F71882FG_REG_FAN_HYST(nr) (0x98 + (nr))
94 #define F71882FG_REG_FAN_FAULT_T 0x9F
95 #define F71882FG_FAN_NEG_TEMP_EN 0x20
96 #define F71882FG_FAN_PROG_SEL 0x80
98 #define F71882FG_REG_POINT_PWM(pwm, point) (0xAA + (point) + (16 * (pwm)))
99 #define F71882FG_REG_POINT_TEMP(pwm, point) (0xA6 + (point) + (16 * (pwm)))
100 #define F71882FG_REG_POINT_MAPPING(nr) (0xAF + 16 * (nr))
102 #define F71882FG_REG_START 0x01
104 #define F71882FG_MAX_INS 9
106 #define FAN_MIN_DETECT 366 /* Lowest detectable fanspeed */
108 static unsigned short force_id
;
109 module_param(force_id
, ushort
, 0);
110 MODULE_PARM_DESC(force_id
, "Override the detected device ID");
112 enum chips
{ f71808e
, f71808a
, f71858fg
, f71862fg
, f71869
, f71869a
, f71882fg
,
113 f71889fg
, f71889ed
, f71889a
, f8000
, f81865f
};
115 static const char *const f71882fg_names
[] = {
120 "f71869", /* Both f71869f and f71869e, reg. compatible and same id */
123 "f71889fg", /* f81801u too, same id */
130 static const char f71882fg_has_in
[][F71882FG_MAX_INS
] = {
131 [f71808e
] = { 1, 1, 1, 1, 1, 1, 0, 1, 1 },
132 [f71808a
] = { 1, 1, 1, 1, 0, 0, 0, 1, 1 },
133 [f71858fg
] = { 1, 1, 1, 0, 0, 0, 0, 0, 0 },
134 [f71862fg
] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
135 [f71869
] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
136 [f71869a
] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
137 [f71882fg
] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
138 [f71889fg
] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
139 [f71889ed
] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
140 [f71889a
] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
141 [f8000
] = { 1, 1, 1, 0, 0, 0, 0, 0, 0 },
142 [f81865f
] = { 1, 1, 1, 1, 1, 1, 1, 0, 0 },
145 static const char f71882fg_has_in1_alarm
[] = {
160 static const char f71882fg_fan_has_beep
[] = {
175 static const char f71882fg_nr_fans
[] = {
177 [f71808a
] = 2, /* +1 fan which is monitor + simple pwm only */
186 [f8000
] = 3, /* +1 fan which is monitor only */
190 static const char f71882fg_temp_has_beep
[] = {
205 static const char f71882fg_nr_temps
[] = {
220 static struct platform_device
*f71882fg_pdev
;
222 /* Super-I/O Function prototypes */
223 static inline int superio_inb(int base
, int reg
);
224 static inline int superio_inw(int base
, int reg
);
225 static inline int superio_enter(int base
);
226 static inline void superio_select(int base
, int ld
);
227 static inline void superio_exit(int base
);
229 struct f71882fg_sio_data
{
233 struct f71882fg_data
{
236 struct device
*hwmon_dev
;
238 struct mutex update_lock
;
239 int temp_start
; /* temp numbering start (0 or 1) */
240 char valid
; /* !=0 if following fields are valid */
241 char auto_point_temp_signed
;
242 unsigned long last_updated
; /* In jiffies */
243 unsigned long last_limits
; /* In jiffies */
245 /* Register Values */
246 u8 in
[F71882FG_MAX_INS
];
252 u16 fan_full_speed
[4];
256 * Note: all models have max 3 temperature channels, but on some
257 * they are addressed as 0-2 and on others as 1-3, so for coding
258 * convenience we reserve space for 4 channels
263 u8 temp_hyst
[2]; /* 2 hysts stored per reg */
271 u8 pwm_auto_point_hyst
[2];
272 u8 pwm_auto_point_mapping
[4];
273 u8 pwm_auto_point_pwm
[4][5];
274 s8 pwm_auto_point_temp
[4][4];
278 static ssize_t
show_in(struct device
*dev
, struct device_attribute
*devattr
,
280 static ssize_t
show_in_max(struct device
*dev
, struct device_attribute
281 *devattr
, char *buf
);
282 static ssize_t
store_in_max(struct device
*dev
, struct device_attribute
283 *devattr
, const char *buf
, size_t count
);
284 static ssize_t
show_in_beep(struct device
*dev
, struct device_attribute
285 *devattr
, char *buf
);
286 static ssize_t
store_in_beep(struct device
*dev
, struct device_attribute
287 *devattr
, const char *buf
, size_t count
);
288 static ssize_t
show_in_alarm(struct device
*dev
, struct device_attribute
289 *devattr
, char *buf
);
291 static ssize_t
show_fan(struct device
*dev
, struct device_attribute
*devattr
,
293 static ssize_t
show_fan_full_speed(struct device
*dev
,
294 struct device_attribute
*devattr
, char *buf
);
295 static ssize_t
store_fan_full_speed(struct device
*dev
,
296 struct device_attribute
*devattr
, const char *buf
, size_t count
);
297 static ssize_t
show_fan_beep(struct device
*dev
, struct device_attribute
298 *devattr
, char *buf
);
299 static ssize_t
store_fan_beep(struct device
*dev
, struct device_attribute
300 *devattr
, const char *buf
, size_t count
);
301 static ssize_t
show_fan_alarm(struct device
*dev
, struct device_attribute
302 *devattr
, char *buf
);
304 static ssize_t
show_temp(struct device
*dev
, struct device_attribute
305 *devattr
, char *buf
);
306 static ssize_t
show_temp_max(struct device
*dev
, struct device_attribute
307 *devattr
, char *buf
);
308 static ssize_t
store_temp_max(struct device
*dev
, struct device_attribute
309 *devattr
, const char *buf
, size_t count
);
310 static ssize_t
show_temp_max_hyst(struct device
*dev
, struct device_attribute
311 *devattr
, char *buf
);
312 static ssize_t
store_temp_max_hyst(struct device
*dev
, struct device_attribute
313 *devattr
, const char *buf
, size_t count
);
314 static ssize_t
show_temp_crit(struct device
*dev
, struct device_attribute
315 *devattr
, char *buf
);
316 static ssize_t
store_temp_crit(struct device
*dev
, struct device_attribute
317 *devattr
, const char *buf
, size_t count
);
318 static ssize_t
show_temp_crit_hyst(struct device
*dev
, struct device_attribute
319 *devattr
, char *buf
);
320 static ssize_t
show_temp_type(struct device
*dev
, struct device_attribute
321 *devattr
, char *buf
);
322 static ssize_t
show_temp_beep(struct device
*dev
, struct device_attribute
323 *devattr
, char *buf
);
324 static ssize_t
store_temp_beep(struct device
*dev
, struct device_attribute
325 *devattr
, const char *buf
, size_t count
);
326 static ssize_t
show_temp_alarm(struct device
*dev
, struct device_attribute
327 *devattr
, char *buf
);
328 static ssize_t
show_temp_fault(struct device
*dev
, struct device_attribute
329 *devattr
, char *buf
);
330 /* PWM and Auto point control */
331 static ssize_t
show_pwm(struct device
*dev
, struct device_attribute
*devattr
,
333 static ssize_t
store_pwm(struct device
*dev
, struct device_attribute
*devattr
,
334 const char *buf
, size_t count
);
335 static ssize_t
show_simple_pwm(struct device
*dev
,
336 struct device_attribute
*devattr
, char *buf
);
337 static ssize_t
store_simple_pwm(struct device
*dev
,
338 struct device_attribute
*devattr
, const char *buf
, size_t count
);
339 static ssize_t
show_pwm_enable(struct device
*dev
,
340 struct device_attribute
*devattr
, char *buf
);
341 static ssize_t
store_pwm_enable(struct device
*dev
,
342 struct device_attribute
*devattr
, const char *buf
, size_t count
);
343 static ssize_t
show_pwm_interpolate(struct device
*dev
,
344 struct device_attribute
*devattr
, char *buf
);
345 static ssize_t
store_pwm_interpolate(struct device
*dev
,
346 struct device_attribute
*devattr
, const char *buf
, size_t count
);
347 static ssize_t
show_pwm_auto_point_channel(struct device
*dev
,
348 struct device_attribute
*devattr
, char *buf
);
349 static ssize_t
store_pwm_auto_point_channel(struct device
*dev
,
350 struct device_attribute
*devattr
, const char *buf
, size_t count
);
351 static ssize_t
show_pwm_auto_point_temp_hyst(struct device
*dev
,
352 struct device_attribute
*devattr
, char *buf
);
353 static ssize_t
store_pwm_auto_point_temp_hyst(struct device
*dev
,
354 struct device_attribute
*devattr
, const char *buf
, size_t count
);
355 static ssize_t
show_pwm_auto_point_pwm(struct device
*dev
,
356 struct device_attribute
*devattr
, char *buf
);
357 static ssize_t
store_pwm_auto_point_pwm(struct device
*dev
,
358 struct device_attribute
*devattr
, const char *buf
, size_t count
);
359 static ssize_t
show_pwm_auto_point_temp(struct device
*dev
,
360 struct device_attribute
*devattr
, char *buf
);
361 static ssize_t
store_pwm_auto_point_temp(struct device
*dev
,
362 struct device_attribute
*devattr
, const char *buf
, size_t count
);
364 static ssize_t
show_name(struct device
*dev
, struct device_attribute
*devattr
,
367 static int f71882fg_probe(struct platform_device
*pdev
);
368 static int f71882fg_remove(struct platform_device
*pdev
);
370 static struct platform_driver f71882fg_driver
= {
372 .owner
= THIS_MODULE
,
375 .probe
= f71882fg_probe
,
376 .remove
= f71882fg_remove
,
379 static DEVICE_ATTR(name
, S_IRUGO
, show_name
, NULL
);
382 * Temp attr for the f71858fg, the f71858fg is special as it has its
383 * temperature indexes start at 0 (the others start at 1)
385 static struct sensor_device_attribute_2 f71858fg_temp_attr
[] = {
386 SENSOR_ATTR_2(temp1_input
, S_IRUGO
, show_temp
, NULL
, 0, 0),
387 SENSOR_ATTR_2(temp1_max
, S_IRUGO
|S_IWUSR
, show_temp_max
,
388 store_temp_max
, 0, 0),
389 SENSOR_ATTR_2(temp1_max_hyst
, S_IRUGO
|S_IWUSR
, show_temp_max_hyst
,
390 store_temp_max_hyst
, 0, 0),
391 SENSOR_ATTR_2(temp1_max_alarm
, S_IRUGO
, show_temp_alarm
, NULL
, 0, 0),
392 SENSOR_ATTR_2(temp1_crit
, S_IRUGO
|S_IWUSR
, show_temp_crit
,
393 store_temp_crit
, 0, 0),
394 SENSOR_ATTR_2(temp1_crit_hyst
, S_IRUGO
, show_temp_crit_hyst
, NULL
,
396 SENSOR_ATTR_2(temp1_crit_alarm
, S_IRUGO
, show_temp_alarm
, NULL
, 0, 4),
397 SENSOR_ATTR_2(temp1_fault
, S_IRUGO
, show_temp_fault
, NULL
, 0, 0),
398 SENSOR_ATTR_2(temp2_input
, S_IRUGO
, show_temp
, NULL
, 0, 1),
399 SENSOR_ATTR_2(temp2_max
, S_IRUGO
|S_IWUSR
, show_temp_max
,
400 store_temp_max
, 0, 1),
401 SENSOR_ATTR_2(temp2_max_hyst
, S_IRUGO
|S_IWUSR
, show_temp_max_hyst
,
402 store_temp_max_hyst
, 0, 1),
403 SENSOR_ATTR_2(temp2_max_alarm
, S_IRUGO
, show_temp_alarm
, NULL
, 0, 1),
404 SENSOR_ATTR_2(temp2_crit
, S_IRUGO
|S_IWUSR
, show_temp_crit
,
405 store_temp_crit
, 0, 1),
406 SENSOR_ATTR_2(temp2_crit_hyst
, S_IRUGO
, show_temp_crit_hyst
, NULL
,
408 SENSOR_ATTR_2(temp2_crit_alarm
, S_IRUGO
, show_temp_alarm
, NULL
, 0, 5),
409 SENSOR_ATTR_2(temp2_fault
, S_IRUGO
, show_temp_fault
, NULL
, 0, 1),
410 SENSOR_ATTR_2(temp3_input
, S_IRUGO
, show_temp
, NULL
, 0, 2),
411 SENSOR_ATTR_2(temp3_max
, S_IRUGO
|S_IWUSR
, show_temp_max
,
412 store_temp_max
, 0, 2),
413 SENSOR_ATTR_2(temp3_max_hyst
, S_IRUGO
|S_IWUSR
, show_temp_max_hyst
,
414 store_temp_max_hyst
, 0, 2),
415 SENSOR_ATTR_2(temp3_max_alarm
, S_IRUGO
, show_temp_alarm
, NULL
, 0, 2),
416 SENSOR_ATTR_2(temp3_crit
, S_IRUGO
|S_IWUSR
, show_temp_crit
,
417 store_temp_crit
, 0, 2),
418 SENSOR_ATTR_2(temp3_crit_hyst
, S_IRUGO
, show_temp_crit_hyst
, NULL
,
420 SENSOR_ATTR_2(temp3_crit_alarm
, S_IRUGO
, show_temp_alarm
, NULL
, 0, 6),
421 SENSOR_ATTR_2(temp3_fault
, S_IRUGO
, show_temp_fault
, NULL
, 0, 2),
424 /* Temp attr for the standard models */
425 static struct sensor_device_attribute_2 fxxxx_temp_attr
[3][9] = { {
426 SENSOR_ATTR_2(temp1_input
, S_IRUGO
, show_temp
, NULL
, 0, 1),
427 SENSOR_ATTR_2(temp1_max
, S_IRUGO
|S_IWUSR
, show_temp_max
,
428 store_temp_max
, 0, 1),
429 SENSOR_ATTR_2(temp1_max_hyst
, S_IRUGO
|S_IWUSR
, show_temp_max_hyst
,
430 store_temp_max_hyst
, 0, 1),
432 * Should really be temp1_max_alarm, but older versions did not handle
433 * the max and crit alarms separately and lm_sensors v2 depends on the
434 * presence of temp#_alarm files. The same goes for temp2/3 _alarm.
436 SENSOR_ATTR_2(temp1_alarm
, S_IRUGO
, show_temp_alarm
, NULL
, 0, 1),
437 SENSOR_ATTR_2(temp1_crit
, S_IRUGO
|S_IWUSR
, show_temp_crit
,
438 store_temp_crit
, 0, 1),
439 SENSOR_ATTR_2(temp1_crit_hyst
, S_IRUGO
, show_temp_crit_hyst
, NULL
,
441 SENSOR_ATTR_2(temp1_crit_alarm
, S_IRUGO
, show_temp_alarm
, NULL
, 0, 5),
442 SENSOR_ATTR_2(temp1_type
, S_IRUGO
, show_temp_type
, NULL
, 0, 1),
443 SENSOR_ATTR_2(temp1_fault
, S_IRUGO
, show_temp_fault
, NULL
, 0, 1),
445 SENSOR_ATTR_2(temp2_input
, S_IRUGO
, show_temp
, NULL
, 0, 2),
446 SENSOR_ATTR_2(temp2_max
, S_IRUGO
|S_IWUSR
, show_temp_max
,
447 store_temp_max
, 0, 2),
448 SENSOR_ATTR_2(temp2_max_hyst
, S_IRUGO
|S_IWUSR
, show_temp_max_hyst
,
449 store_temp_max_hyst
, 0, 2),
450 /* Should be temp2_max_alarm, see temp1_alarm note */
451 SENSOR_ATTR_2(temp2_alarm
, S_IRUGO
, show_temp_alarm
, NULL
, 0, 2),
452 SENSOR_ATTR_2(temp2_crit
, S_IRUGO
|S_IWUSR
, show_temp_crit
,
453 store_temp_crit
, 0, 2),
454 SENSOR_ATTR_2(temp2_crit_hyst
, S_IRUGO
, show_temp_crit_hyst
, NULL
,
456 SENSOR_ATTR_2(temp2_crit_alarm
, S_IRUGO
, show_temp_alarm
, NULL
, 0, 6),
457 SENSOR_ATTR_2(temp2_type
, S_IRUGO
, show_temp_type
, NULL
, 0, 2),
458 SENSOR_ATTR_2(temp2_fault
, S_IRUGO
, show_temp_fault
, NULL
, 0, 2),
460 SENSOR_ATTR_2(temp3_input
, S_IRUGO
, show_temp
, NULL
, 0, 3),
461 SENSOR_ATTR_2(temp3_max
, S_IRUGO
|S_IWUSR
, show_temp_max
,
462 store_temp_max
, 0, 3),
463 SENSOR_ATTR_2(temp3_max_hyst
, S_IRUGO
|S_IWUSR
, show_temp_max_hyst
,
464 store_temp_max_hyst
, 0, 3),
465 /* Should be temp3_max_alarm, see temp1_alarm note */
466 SENSOR_ATTR_2(temp3_alarm
, S_IRUGO
, show_temp_alarm
, NULL
, 0, 3),
467 SENSOR_ATTR_2(temp3_crit
, S_IRUGO
|S_IWUSR
, show_temp_crit
,
468 store_temp_crit
, 0, 3),
469 SENSOR_ATTR_2(temp3_crit_hyst
, S_IRUGO
, show_temp_crit_hyst
, NULL
,
471 SENSOR_ATTR_2(temp3_crit_alarm
, S_IRUGO
, show_temp_alarm
, NULL
, 0, 7),
472 SENSOR_ATTR_2(temp3_type
, S_IRUGO
, show_temp_type
, NULL
, 0, 3),
473 SENSOR_ATTR_2(temp3_fault
, S_IRUGO
, show_temp_fault
, NULL
, 0, 3),
476 /* Temp attr for models which can beep on temp alarm */
477 static struct sensor_device_attribute_2 fxxxx_temp_beep_attr
[3][2] = { {
478 SENSOR_ATTR_2(temp1_max_beep
, S_IRUGO
|S_IWUSR
, show_temp_beep
,
479 store_temp_beep
, 0, 1),
480 SENSOR_ATTR_2(temp1_crit_beep
, S_IRUGO
|S_IWUSR
, show_temp_beep
,
481 store_temp_beep
, 0, 5),
483 SENSOR_ATTR_2(temp2_max_beep
, S_IRUGO
|S_IWUSR
, show_temp_beep
,
484 store_temp_beep
, 0, 2),
485 SENSOR_ATTR_2(temp2_crit_beep
, S_IRUGO
|S_IWUSR
, show_temp_beep
,
486 store_temp_beep
, 0, 6),
488 SENSOR_ATTR_2(temp3_max_beep
, S_IRUGO
|S_IWUSR
, show_temp_beep
,
489 store_temp_beep
, 0, 3),
490 SENSOR_ATTR_2(temp3_crit_beep
, S_IRUGO
|S_IWUSR
, show_temp_beep
,
491 store_temp_beep
, 0, 7),
495 * Temp attr for the f8000
496 * Note on the f8000 temp_ovt (crit) is used as max, and temp_high (max)
497 * is used as hysteresis value to clear alarms
498 * Also like the f71858fg its temperature indexes start at 0
500 static struct sensor_device_attribute_2 f8000_temp_attr
[] = {
501 SENSOR_ATTR_2(temp1_input
, S_IRUGO
, show_temp
, NULL
, 0, 0),
502 SENSOR_ATTR_2(temp1_max
, S_IRUGO
|S_IWUSR
, show_temp_crit
,
503 store_temp_crit
, 0, 0),
504 SENSOR_ATTR_2(temp1_max_hyst
, S_IRUGO
|S_IWUSR
, show_temp_max
,
505 store_temp_max
, 0, 0),
506 SENSOR_ATTR_2(temp1_alarm
, S_IRUGO
, show_temp_alarm
, NULL
, 0, 4),
507 SENSOR_ATTR_2(temp1_fault
, S_IRUGO
, show_temp_fault
, NULL
, 0, 0),
508 SENSOR_ATTR_2(temp2_input
, S_IRUGO
, show_temp
, NULL
, 0, 1),
509 SENSOR_ATTR_2(temp2_max
, S_IRUGO
|S_IWUSR
, show_temp_crit
,
510 store_temp_crit
, 0, 1),
511 SENSOR_ATTR_2(temp2_max_hyst
, S_IRUGO
|S_IWUSR
, show_temp_max
,
512 store_temp_max
, 0, 1),
513 SENSOR_ATTR_2(temp2_alarm
, S_IRUGO
, show_temp_alarm
, NULL
, 0, 5),
514 SENSOR_ATTR_2(temp2_fault
, S_IRUGO
, show_temp_fault
, NULL
, 0, 1),
515 SENSOR_ATTR_2(temp3_input
, S_IRUGO
, show_temp
, NULL
, 0, 2),
516 SENSOR_ATTR_2(temp3_max
, S_IRUGO
|S_IWUSR
, show_temp_crit
,
517 store_temp_crit
, 0, 2),
518 SENSOR_ATTR_2(temp3_max_hyst
, S_IRUGO
|S_IWUSR
, show_temp_max
,
519 store_temp_max
, 0, 2),
520 SENSOR_ATTR_2(temp3_alarm
, S_IRUGO
, show_temp_alarm
, NULL
, 0, 6),
521 SENSOR_ATTR_2(temp3_fault
, S_IRUGO
, show_temp_fault
, NULL
, 0, 2),
524 /* in attr for all models */
525 static struct sensor_device_attribute_2 fxxxx_in_attr
[] = {
526 SENSOR_ATTR_2(in0_input
, S_IRUGO
, show_in
, NULL
, 0, 0),
527 SENSOR_ATTR_2(in1_input
, S_IRUGO
, show_in
, NULL
, 0, 1),
528 SENSOR_ATTR_2(in2_input
, S_IRUGO
, show_in
, NULL
, 0, 2),
529 SENSOR_ATTR_2(in3_input
, S_IRUGO
, show_in
, NULL
, 0, 3),
530 SENSOR_ATTR_2(in4_input
, S_IRUGO
, show_in
, NULL
, 0, 4),
531 SENSOR_ATTR_2(in5_input
, S_IRUGO
, show_in
, NULL
, 0, 5),
532 SENSOR_ATTR_2(in6_input
, S_IRUGO
, show_in
, NULL
, 0, 6),
533 SENSOR_ATTR_2(in7_input
, S_IRUGO
, show_in
, NULL
, 0, 7),
534 SENSOR_ATTR_2(in8_input
, S_IRUGO
, show_in
, NULL
, 0, 8),
537 /* For models with in1 alarm capability */
538 static struct sensor_device_attribute_2 fxxxx_in1_alarm_attr
[] = {
539 SENSOR_ATTR_2(in1_max
, S_IRUGO
|S_IWUSR
, show_in_max
, store_in_max
,
541 SENSOR_ATTR_2(in1_beep
, S_IRUGO
|S_IWUSR
, show_in_beep
, store_in_beep
,
543 SENSOR_ATTR_2(in1_alarm
, S_IRUGO
, show_in_alarm
, NULL
, 0, 1),
546 /* Fan / PWM attr common to all models */
547 static struct sensor_device_attribute_2 fxxxx_fan_attr
[4][6] = { {
548 SENSOR_ATTR_2(fan1_input
, S_IRUGO
, show_fan
, NULL
, 0, 0),
549 SENSOR_ATTR_2(fan1_full_speed
, S_IRUGO
|S_IWUSR
,
551 store_fan_full_speed
, 0, 0),
552 SENSOR_ATTR_2(fan1_alarm
, S_IRUGO
, show_fan_alarm
, NULL
, 0, 0),
553 SENSOR_ATTR_2(pwm1
, S_IRUGO
|S_IWUSR
, show_pwm
, store_pwm
, 0, 0),
554 SENSOR_ATTR_2(pwm1_enable
, S_IRUGO
|S_IWUSR
, show_pwm_enable
,
555 store_pwm_enable
, 0, 0),
556 SENSOR_ATTR_2(pwm1_interpolate
, S_IRUGO
|S_IWUSR
,
557 show_pwm_interpolate
, store_pwm_interpolate
, 0, 0),
559 SENSOR_ATTR_2(fan2_input
, S_IRUGO
, show_fan
, NULL
, 0, 1),
560 SENSOR_ATTR_2(fan2_full_speed
, S_IRUGO
|S_IWUSR
,
562 store_fan_full_speed
, 0, 1),
563 SENSOR_ATTR_2(fan2_alarm
, S_IRUGO
, show_fan_alarm
, NULL
, 0, 1),
564 SENSOR_ATTR_2(pwm2
, S_IRUGO
|S_IWUSR
, show_pwm
, store_pwm
, 0, 1),
565 SENSOR_ATTR_2(pwm2_enable
, S_IRUGO
|S_IWUSR
, show_pwm_enable
,
566 store_pwm_enable
, 0, 1),
567 SENSOR_ATTR_2(pwm2_interpolate
, S_IRUGO
|S_IWUSR
,
568 show_pwm_interpolate
, store_pwm_interpolate
, 0, 1),
570 SENSOR_ATTR_2(fan3_input
, S_IRUGO
, show_fan
, NULL
, 0, 2),
571 SENSOR_ATTR_2(fan3_full_speed
, S_IRUGO
|S_IWUSR
,
573 store_fan_full_speed
, 0, 2),
574 SENSOR_ATTR_2(fan3_alarm
, S_IRUGO
, show_fan_alarm
, NULL
, 0, 2),
575 SENSOR_ATTR_2(pwm3
, S_IRUGO
|S_IWUSR
, show_pwm
, store_pwm
, 0, 2),
576 SENSOR_ATTR_2(pwm3_enable
, S_IRUGO
|S_IWUSR
, show_pwm_enable
,
577 store_pwm_enable
, 0, 2),
578 SENSOR_ATTR_2(pwm3_interpolate
, S_IRUGO
|S_IWUSR
,
579 show_pwm_interpolate
, store_pwm_interpolate
, 0, 2),
581 SENSOR_ATTR_2(fan4_input
, S_IRUGO
, show_fan
, NULL
, 0, 3),
582 SENSOR_ATTR_2(fan4_full_speed
, S_IRUGO
|S_IWUSR
,
584 store_fan_full_speed
, 0, 3),
585 SENSOR_ATTR_2(fan4_alarm
, S_IRUGO
, show_fan_alarm
, NULL
, 0, 3),
586 SENSOR_ATTR_2(pwm4
, S_IRUGO
|S_IWUSR
, show_pwm
, store_pwm
, 0, 3),
587 SENSOR_ATTR_2(pwm4_enable
, S_IRUGO
|S_IWUSR
, show_pwm_enable
,
588 store_pwm_enable
, 0, 3),
589 SENSOR_ATTR_2(pwm4_interpolate
, S_IRUGO
|S_IWUSR
,
590 show_pwm_interpolate
, store_pwm_interpolate
, 0, 3),
593 /* Attr for the third fan of the f71808a, which only has manual pwm */
594 static struct sensor_device_attribute_2 f71808a_fan3_attr
[] = {
595 SENSOR_ATTR_2(fan3_input
, S_IRUGO
, show_fan
, NULL
, 0, 2),
596 SENSOR_ATTR_2(fan3_alarm
, S_IRUGO
, show_fan_alarm
, NULL
, 0, 2),
597 SENSOR_ATTR_2(pwm3
, S_IRUGO
|S_IWUSR
,
598 show_simple_pwm
, store_simple_pwm
, 0, 2),
601 /* Attr for models which can beep on Fan alarm */
602 static struct sensor_device_attribute_2 fxxxx_fan_beep_attr
[] = {
603 SENSOR_ATTR_2(fan1_beep
, S_IRUGO
|S_IWUSR
, show_fan_beep
,
604 store_fan_beep
, 0, 0),
605 SENSOR_ATTR_2(fan2_beep
, S_IRUGO
|S_IWUSR
, show_fan_beep
,
606 store_fan_beep
, 0, 1),
607 SENSOR_ATTR_2(fan3_beep
, S_IRUGO
|S_IWUSR
, show_fan_beep
,
608 store_fan_beep
, 0, 2),
609 SENSOR_ATTR_2(fan4_beep
, S_IRUGO
|S_IWUSR
, show_fan_beep
,
610 store_fan_beep
, 0, 3),
614 * PWM attr for the f71862fg, fewer pwms and fewer zones per pwm than the
617 static struct sensor_device_attribute_2 f71862fg_auto_pwm_attr
[3][7] = { {
618 SENSOR_ATTR_2(pwm1_auto_channels_temp
, S_IRUGO
|S_IWUSR
,
619 show_pwm_auto_point_channel
,
620 store_pwm_auto_point_channel
, 0, 0),
621 SENSOR_ATTR_2(pwm1_auto_point1_pwm
, S_IRUGO
|S_IWUSR
,
622 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
624 SENSOR_ATTR_2(pwm1_auto_point2_pwm
, S_IRUGO
|S_IWUSR
,
625 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
627 SENSOR_ATTR_2(pwm1_auto_point1_temp
, S_IRUGO
|S_IWUSR
,
628 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
630 SENSOR_ATTR_2(pwm1_auto_point2_temp
, S_IRUGO
|S_IWUSR
,
631 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
633 SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst
, S_IRUGO
|S_IWUSR
,
634 show_pwm_auto_point_temp_hyst
,
635 store_pwm_auto_point_temp_hyst
,
637 SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst
, S_IRUGO
,
638 show_pwm_auto_point_temp_hyst
, NULL
, 3, 0),
640 SENSOR_ATTR_2(pwm2_auto_channels_temp
, S_IRUGO
|S_IWUSR
,
641 show_pwm_auto_point_channel
,
642 store_pwm_auto_point_channel
, 0, 1),
643 SENSOR_ATTR_2(pwm2_auto_point1_pwm
, S_IRUGO
|S_IWUSR
,
644 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
646 SENSOR_ATTR_2(pwm2_auto_point2_pwm
, S_IRUGO
|S_IWUSR
,
647 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
649 SENSOR_ATTR_2(pwm2_auto_point1_temp
, S_IRUGO
|S_IWUSR
,
650 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
652 SENSOR_ATTR_2(pwm2_auto_point2_temp
, S_IRUGO
|S_IWUSR
,
653 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
655 SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst
, S_IRUGO
|S_IWUSR
,
656 show_pwm_auto_point_temp_hyst
,
657 store_pwm_auto_point_temp_hyst
,
659 SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst
, S_IRUGO
,
660 show_pwm_auto_point_temp_hyst
, NULL
, 3, 1),
662 SENSOR_ATTR_2(pwm3_auto_channels_temp
, S_IRUGO
|S_IWUSR
,
663 show_pwm_auto_point_channel
,
664 store_pwm_auto_point_channel
, 0, 2),
665 SENSOR_ATTR_2(pwm3_auto_point1_pwm
, S_IRUGO
|S_IWUSR
,
666 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
668 SENSOR_ATTR_2(pwm3_auto_point2_pwm
, S_IRUGO
|S_IWUSR
,
669 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
671 SENSOR_ATTR_2(pwm3_auto_point1_temp
, S_IRUGO
|S_IWUSR
,
672 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
674 SENSOR_ATTR_2(pwm3_auto_point2_temp
, S_IRUGO
|S_IWUSR
,
675 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
677 SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst
, S_IRUGO
|S_IWUSR
,
678 show_pwm_auto_point_temp_hyst
,
679 store_pwm_auto_point_temp_hyst
,
681 SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst
, S_IRUGO
,
682 show_pwm_auto_point_temp_hyst
, NULL
, 3, 2),
686 * PWM attr for the f71808e/f71869, almost identical to the f71862fg, but the
687 * pwm setting when the temperature is above the pwmX_auto_point1_temp can be
688 * programmed instead of being hardcoded to 0xff
690 static struct sensor_device_attribute_2 f71869_auto_pwm_attr
[3][8] = { {
691 SENSOR_ATTR_2(pwm1_auto_channels_temp
, S_IRUGO
|S_IWUSR
,
692 show_pwm_auto_point_channel
,
693 store_pwm_auto_point_channel
, 0, 0),
694 SENSOR_ATTR_2(pwm1_auto_point1_pwm
, S_IRUGO
|S_IWUSR
,
695 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
697 SENSOR_ATTR_2(pwm1_auto_point2_pwm
, S_IRUGO
|S_IWUSR
,
698 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
700 SENSOR_ATTR_2(pwm1_auto_point3_pwm
, S_IRUGO
|S_IWUSR
,
701 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
703 SENSOR_ATTR_2(pwm1_auto_point1_temp
, S_IRUGO
|S_IWUSR
,
704 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
706 SENSOR_ATTR_2(pwm1_auto_point2_temp
, S_IRUGO
|S_IWUSR
,
707 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
709 SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst
, S_IRUGO
|S_IWUSR
,
710 show_pwm_auto_point_temp_hyst
,
711 store_pwm_auto_point_temp_hyst
,
713 SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst
, S_IRUGO
,
714 show_pwm_auto_point_temp_hyst
, NULL
, 3, 0),
716 SENSOR_ATTR_2(pwm2_auto_channels_temp
, S_IRUGO
|S_IWUSR
,
717 show_pwm_auto_point_channel
,
718 store_pwm_auto_point_channel
, 0, 1),
719 SENSOR_ATTR_2(pwm2_auto_point1_pwm
, S_IRUGO
|S_IWUSR
,
720 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
722 SENSOR_ATTR_2(pwm2_auto_point2_pwm
, S_IRUGO
|S_IWUSR
,
723 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
725 SENSOR_ATTR_2(pwm2_auto_point3_pwm
, S_IRUGO
|S_IWUSR
,
726 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
728 SENSOR_ATTR_2(pwm2_auto_point1_temp
, S_IRUGO
|S_IWUSR
,
729 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
731 SENSOR_ATTR_2(pwm2_auto_point2_temp
, S_IRUGO
|S_IWUSR
,
732 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
734 SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst
, S_IRUGO
|S_IWUSR
,
735 show_pwm_auto_point_temp_hyst
,
736 store_pwm_auto_point_temp_hyst
,
738 SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst
, S_IRUGO
,
739 show_pwm_auto_point_temp_hyst
, NULL
, 3, 1),
741 SENSOR_ATTR_2(pwm3_auto_channels_temp
, S_IRUGO
|S_IWUSR
,
742 show_pwm_auto_point_channel
,
743 store_pwm_auto_point_channel
, 0, 2),
744 SENSOR_ATTR_2(pwm3_auto_point1_pwm
, S_IRUGO
|S_IWUSR
,
745 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
747 SENSOR_ATTR_2(pwm3_auto_point2_pwm
, S_IRUGO
|S_IWUSR
,
748 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
750 SENSOR_ATTR_2(pwm3_auto_point3_pwm
, S_IRUGO
|S_IWUSR
,
751 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
753 SENSOR_ATTR_2(pwm3_auto_point1_temp
, S_IRUGO
|S_IWUSR
,
754 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
756 SENSOR_ATTR_2(pwm3_auto_point2_temp
, S_IRUGO
|S_IWUSR
,
757 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
759 SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst
, S_IRUGO
|S_IWUSR
,
760 show_pwm_auto_point_temp_hyst
,
761 store_pwm_auto_point_temp_hyst
,
763 SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst
, S_IRUGO
,
764 show_pwm_auto_point_temp_hyst
, NULL
, 3, 2),
767 /* PWM attr for the standard models */
768 static struct sensor_device_attribute_2 fxxxx_auto_pwm_attr
[4][14] = { {
769 SENSOR_ATTR_2(pwm1_auto_channels_temp
, S_IRUGO
|S_IWUSR
,
770 show_pwm_auto_point_channel
,
771 store_pwm_auto_point_channel
, 0, 0),
772 SENSOR_ATTR_2(pwm1_auto_point1_pwm
, S_IRUGO
|S_IWUSR
,
773 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
775 SENSOR_ATTR_2(pwm1_auto_point2_pwm
, S_IRUGO
|S_IWUSR
,
776 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
778 SENSOR_ATTR_2(pwm1_auto_point3_pwm
, S_IRUGO
|S_IWUSR
,
779 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
781 SENSOR_ATTR_2(pwm1_auto_point4_pwm
, S_IRUGO
|S_IWUSR
,
782 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
784 SENSOR_ATTR_2(pwm1_auto_point5_pwm
, S_IRUGO
|S_IWUSR
,
785 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
787 SENSOR_ATTR_2(pwm1_auto_point1_temp
, S_IRUGO
|S_IWUSR
,
788 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
790 SENSOR_ATTR_2(pwm1_auto_point2_temp
, S_IRUGO
|S_IWUSR
,
791 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
793 SENSOR_ATTR_2(pwm1_auto_point3_temp
, S_IRUGO
|S_IWUSR
,
794 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
796 SENSOR_ATTR_2(pwm1_auto_point4_temp
, S_IRUGO
|S_IWUSR
,
797 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
799 SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst
, S_IRUGO
|S_IWUSR
,
800 show_pwm_auto_point_temp_hyst
,
801 store_pwm_auto_point_temp_hyst
,
803 SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst
, S_IRUGO
,
804 show_pwm_auto_point_temp_hyst
, NULL
, 1, 0),
805 SENSOR_ATTR_2(pwm1_auto_point3_temp_hyst
, S_IRUGO
,
806 show_pwm_auto_point_temp_hyst
, NULL
, 2, 0),
807 SENSOR_ATTR_2(pwm1_auto_point4_temp_hyst
, S_IRUGO
,
808 show_pwm_auto_point_temp_hyst
, NULL
, 3, 0),
810 SENSOR_ATTR_2(pwm2_auto_channels_temp
, S_IRUGO
|S_IWUSR
,
811 show_pwm_auto_point_channel
,
812 store_pwm_auto_point_channel
, 0, 1),
813 SENSOR_ATTR_2(pwm2_auto_point1_pwm
, S_IRUGO
|S_IWUSR
,
814 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
816 SENSOR_ATTR_2(pwm2_auto_point2_pwm
, S_IRUGO
|S_IWUSR
,
817 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
819 SENSOR_ATTR_2(pwm2_auto_point3_pwm
, S_IRUGO
|S_IWUSR
,
820 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
822 SENSOR_ATTR_2(pwm2_auto_point4_pwm
, S_IRUGO
|S_IWUSR
,
823 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
825 SENSOR_ATTR_2(pwm2_auto_point5_pwm
, S_IRUGO
|S_IWUSR
,
826 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
828 SENSOR_ATTR_2(pwm2_auto_point1_temp
, S_IRUGO
|S_IWUSR
,
829 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
831 SENSOR_ATTR_2(pwm2_auto_point2_temp
, S_IRUGO
|S_IWUSR
,
832 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
834 SENSOR_ATTR_2(pwm2_auto_point3_temp
, S_IRUGO
|S_IWUSR
,
835 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
837 SENSOR_ATTR_2(pwm2_auto_point4_temp
, S_IRUGO
|S_IWUSR
,
838 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
840 SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst
, S_IRUGO
|S_IWUSR
,
841 show_pwm_auto_point_temp_hyst
,
842 store_pwm_auto_point_temp_hyst
,
844 SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst
, S_IRUGO
,
845 show_pwm_auto_point_temp_hyst
, NULL
, 1, 1),
846 SENSOR_ATTR_2(pwm2_auto_point3_temp_hyst
, S_IRUGO
,
847 show_pwm_auto_point_temp_hyst
, NULL
, 2, 1),
848 SENSOR_ATTR_2(pwm2_auto_point4_temp_hyst
, S_IRUGO
,
849 show_pwm_auto_point_temp_hyst
, NULL
, 3, 1),
851 SENSOR_ATTR_2(pwm3_auto_channels_temp
, S_IRUGO
|S_IWUSR
,
852 show_pwm_auto_point_channel
,
853 store_pwm_auto_point_channel
, 0, 2),
854 SENSOR_ATTR_2(pwm3_auto_point1_pwm
, S_IRUGO
|S_IWUSR
,
855 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
857 SENSOR_ATTR_2(pwm3_auto_point2_pwm
, S_IRUGO
|S_IWUSR
,
858 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
860 SENSOR_ATTR_2(pwm3_auto_point3_pwm
, S_IRUGO
|S_IWUSR
,
861 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
863 SENSOR_ATTR_2(pwm3_auto_point4_pwm
, S_IRUGO
|S_IWUSR
,
864 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
866 SENSOR_ATTR_2(pwm3_auto_point5_pwm
, S_IRUGO
|S_IWUSR
,
867 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
869 SENSOR_ATTR_2(pwm3_auto_point1_temp
, S_IRUGO
|S_IWUSR
,
870 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
872 SENSOR_ATTR_2(pwm3_auto_point2_temp
, S_IRUGO
|S_IWUSR
,
873 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
875 SENSOR_ATTR_2(pwm3_auto_point3_temp
, S_IRUGO
|S_IWUSR
,
876 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
878 SENSOR_ATTR_2(pwm3_auto_point4_temp
, S_IRUGO
|S_IWUSR
,
879 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
881 SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst
, S_IRUGO
|S_IWUSR
,
882 show_pwm_auto_point_temp_hyst
,
883 store_pwm_auto_point_temp_hyst
,
885 SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst
, S_IRUGO
,
886 show_pwm_auto_point_temp_hyst
, NULL
, 1, 2),
887 SENSOR_ATTR_2(pwm3_auto_point3_temp_hyst
, S_IRUGO
,
888 show_pwm_auto_point_temp_hyst
, NULL
, 2, 2),
889 SENSOR_ATTR_2(pwm3_auto_point4_temp_hyst
, S_IRUGO
,
890 show_pwm_auto_point_temp_hyst
, NULL
, 3, 2),
892 SENSOR_ATTR_2(pwm4_auto_channels_temp
, S_IRUGO
|S_IWUSR
,
893 show_pwm_auto_point_channel
,
894 store_pwm_auto_point_channel
, 0, 3),
895 SENSOR_ATTR_2(pwm4_auto_point1_pwm
, S_IRUGO
|S_IWUSR
,
896 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
898 SENSOR_ATTR_2(pwm4_auto_point2_pwm
, S_IRUGO
|S_IWUSR
,
899 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
901 SENSOR_ATTR_2(pwm4_auto_point3_pwm
, S_IRUGO
|S_IWUSR
,
902 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
904 SENSOR_ATTR_2(pwm4_auto_point4_pwm
, S_IRUGO
|S_IWUSR
,
905 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
907 SENSOR_ATTR_2(pwm4_auto_point5_pwm
, S_IRUGO
|S_IWUSR
,
908 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
910 SENSOR_ATTR_2(pwm4_auto_point1_temp
, S_IRUGO
|S_IWUSR
,
911 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
913 SENSOR_ATTR_2(pwm4_auto_point2_temp
, S_IRUGO
|S_IWUSR
,
914 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
916 SENSOR_ATTR_2(pwm4_auto_point3_temp
, S_IRUGO
|S_IWUSR
,
917 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
919 SENSOR_ATTR_2(pwm4_auto_point4_temp
, S_IRUGO
|S_IWUSR
,
920 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
922 SENSOR_ATTR_2(pwm4_auto_point1_temp_hyst
, S_IRUGO
|S_IWUSR
,
923 show_pwm_auto_point_temp_hyst
,
924 store_pwm_auto_point_temp_hyst
,
926 SENSOR_ATTR_2(pwm4_auto_point2_temp_hyst
, S_IRUGO
,
927 show_pwm_auto_point_temp_hyst
, NULL
, 1, 3),
928 SENSOR_ATTR_2(pwm4_auto_point3_temp_hyst
, S_IRUGO
,
929 show_pwm_auto_point_temp_hyst
, NULL
, 2, 3),
930 SENSOR_ATTR_2(pwm4_auto_point4_temp_hyst
, S_IRUGO
,
931 show_pwm_auto_point_temp_hyst
, NULL
, 3, 3),
934 /* Fan attr specific to the f8000 (4th fan input can only measure speed) */
935 static struct sensor_device_attribute_2 f8000_fan_attr
[] = {
936 SENSOR_ATTR_2(fan4_input
, S_IRUGO
, show_fan
, NULL
, 0, 3),
940 * PWM attr for the f8000, zones mapped to temp instead of to pwm!
941 * Also the register block at offset A0 maps to TEMP1 (so our temp2, as the
942 * F8000 starts counting temps at 0), B0 maps the TEMP2 and C0 maps to TEMP0
944 static struct sensor_device_attribute_2 f8000_auto_pwm_attr
[3][14] = { {
945 SENSOR_ATTR_2(pwm1_auto_channels_temp
, S_IRUGO
|S_IWUSR
,
946 show_pwm_auto_point_channel
,
947 store_pwm_auto_point_channel
, 0, 0),
948 SENSOR_ATTR_2(temp1_auto_point1_pwm
, S_IRUGO
|S_IWUSR
,
949 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
951 SENSOR_ATTR_2(temp1_auto_point2_pwm
, S_IRUGO
|S_IWUSR
,
952 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
954 SENSOR_ATTR_2(temp1_auto_point3_pwm
, S_IRUGO
|S_IWUSR
,
955 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
957 SENSOR_ATTR_2(temp1_auto_point4_pwm
, S_IRUGO
|S_IWUSR
,
958 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
960 SENSOR_ATTR_2(temp1_auto_point5_pwm
, S_IRUGO
|S_IWUSR
,
961 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
963 SENSOR_ATTR_2(temp1_auto_point1_temp
, S_IRUGO
|S_IWUSR
,
964 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
966 SENSOR_ATTR_2(temp1_auto_point2_temp
, S_IRUGO
|S_IWUSR
,
967 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
969 SENSOR_ATTR_2(temp1_auto_point3_temp
, S_IRUGO
|S_IWUSR
,
970 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
972 SENSOR_ATTR_2(temp1_auto_point4_temp
, S_IRUGO
|S_IWUSR
,
973 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
975 SENSOR_ATTR_2(temp1_auto_point1_temp_hyst
, S_IRUGO
|S_IWUSR
,
976 show_pwm_auto_point_temp_hyst
,
977 store_pwm_auto_point_temp_hyst
,
979 SENSOR_ATTR_2(temp1_auto_point2_temp_hyst
, S_IRUGO
,
980 show_pwm_auto_point_temp_hyst
, NULL
, 1, 2),
981 SENSOR_ATTR_2(temp1_auto_point3_temp_hyst
, S_IRUGO
,
982 show_pwm_auto_point_temp_hyst
, NULL
, 2, 2),
983 SENSOR_ATTR_2(temp1_auto_point4_temp_hyst
, S_IRUGO
,
984 show_pwm_auto_point_temp_hyst
, NULL
, 3, 2),
986 SENSOR_ATTR_2(pwm2_auto_channels_temp
, S_IRUGO
|S_IWUSR
,
987 show_pwm_auto_point_channel
,
988 store_pwm_auto_point_channel
, 0, 1),
989 SENSOR_ATTR_2(temp2_auto_point1_pwm
, S_IRUGO
|S_IWUSR
,
990 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
992 SENSOR_ATTR_2(temp2_auto_point2_pwm
, S_IRUGO
|S_IWUSR
,
993 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
995 SENSOR_ATTR_2(temp2_auto_point3_pwm
, S_IRUGO
|S_IWUSR
,
996 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
998 SENSOR_ATTR_2(temp2_auto_point4_pwm
, S_IRUGO
|S_IWUSR
,
999 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
1001 SENSOR_ATTR_2(temp2_auto_point5_pwm
, S_IRUGO
|S_IWUSR
,
1002 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
1004 SENSOR_ATTR_2(temp2_auto_point1_temp
, S_IRUGO
|S_IWUSR
,
1005 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
1007 SENSOR_ATTR_2(temp2_auto_point2_temp
, S_IRUGO
|S_IWUSR
,
1008 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
1010 SENSOR_ATTR_2(temp2_auto_point3_temp
, S_IRUGO
|S_IWUSR
,
1011 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
1013 SENSOR_ATTR_2(temp2_auto_point4_temp
, S_IRUGO
|S_IWUSR
,
1014 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
1016 SENSOR_ATTR_2(temp2_auto_point1_temp_hyst
, S_IRUGO
|S_IWUSR
,
1017 show_pwm_auto_point_temp_hyst
,
1018 store_pwm_auto_point_temp_hyst
,
1020 SENSOR_ATTR_2(temp2_auto_point2_temp_hyst
, S_IRUGO
,
1021 show_pwm_auto_point_temp_hyst
, NULL
, 1, 0),
1022 SENSOR_ATTR_2(temp2_auto_point3_temp_hyst
, S_IRUGO
,
1023 show_pwm_auto_point_temp_hyst
, NULL
, 2, 0),
1024 SENSOR_ATTR_2(temp2_auto_point4_temp_hyst
, S_IRUGO
,
1025 show_pwm_auto_point_temp_hyst
, NULL
, 3, 0),
1027 SENSOR_ATTR_2(pwm3_auto_channels_temp
, S_IRUGO
|S_IWUSR
,
1028 show_pwm_auto_point_channel
,
1029 store_pwm_auto_point_channel
, 0, 2),
1030 SENSOR_ATTR_2(temp3_auto_point1_pwm
, S_IRUGO
|S_IWUSR
,
1031 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
1033 SENSOR_ATTR_2(temp3_auto_point2_pwm
, S_IRUGO
|S_IWUSR
,
1034 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
1036 SENSOR_ATTR_2(temp3_auto_point3_pwm
, S_IRUGO
|S_IWUSR
,
1037 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
1039 SENSOR_ATTR_2(temp3_auto_point4_pwm
, S_IRUGO
|S_IWUSR
,
1040 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
1042 SENSOR_ATTR_2(temp3_auto_point5_pwm
, S_IRUGO
|S_IWUSR
,
1043 show_pwm_auto_point_pwm
, store_pwm_auto_point_pwm
,
1045 SENSOR_ATTR_2(temp3_auto_point1_temp
, S_IRUGO
|S_IWUSR
,
1046 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
1048 SENSOR_ATTR_2(temp3_auto_point2_temp
, S_IRUGO
|S_IWUSR
,
1049 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
1051 SENSOR_ATTR_2(temp3_auto_point3_temp
, S_IRUGO
|S_IWUSR
,
1052 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
1054 SENSOR_ATTR_2(temp3_auto_point4_temp
, S_IRUGO
|S_IWUSR
,
1055 show_pwm_auto_point_temp
, store_pwm_auto_point_temp
,
1057 SENSOR_ATTR_2(temp3_auto_point1_temp_hyst
, S_IRUGO
|S_IWUSR
,
1058 show_pwm_auto_point_temp_hyst
,
1059 store_pwm_auto_point_temp_hyst
,
1061 SENSOR_ATTR_2(temp3_auto_point2_temp_hyst
, S_IRUGO
,
1062 show_pwm_auto_point_temp_hyst
, NULL
, 1, 1),
1063 SENSOR_ATTR_2(temp3_auto_point3_temp_hyst
, S_IRUGO
,
1064 show_pwm_auto_point_temp_hyst
, NULL
, 2, 1),
1065 SENSOR_ATTR_2(temp3_auto_point4_temp_hyst
, S_IRUGO
,
1066 show_pwm_auto_point_temp_hyst
, NULL
, 3, 1),
1069 /* Super I/O functions */
1070 static inline int superio_inb(int base
, int reg
)
1073 return inb(base
+ 1);
1076 static int superio_inw(int base
, int reg
)
1079 val
= superio_inb(base
, reg
) << 8;
1080 val
|= superio_inb(base
, reg
+ 1);
1084 static inline int superio_enter(int base
)
1086 /* Don't step on other drivers' I/O space by accident */
1087 if (!request_muxed_region(base
, 2, DRVNAME
)) {
1088 pr_err("I/O address 0x%04x already in use\n", base
);
1092 /* according to the datasheet the key must be send twice! */
1093 outb(SIO_UNLOCK_KEY
, base
);
1094 outb(SIO_UNLOCK_KEY
, base
);
1099 static inline void superio_select(int base
, int ld
)
1101 outb(SIO_REG_LDSEL
, base
);
1105 static inline void superio_exit(int base
)
1107 outb(SIO_LOCK_KEY
, base
);
1108 release_region(base
, 2);
1111 static inline int fan_from_reg(u16 reg
)
1113 return reg
? (1500000 / reg
) : 0;
1116 static inline u16
fan_to_reg(int fan
)
1118 return fan
? (1500000 / fan
) : 0;
1121 static u8
f71882fg_read8(struct f71882fg_data
*data
, u8 reg
)
1125 outb(reg
, data
->addr
+ ADDR_REG_OFFSET
);
1126 val
= inb(data
->addr
+ DATA_REG_OFFSET
);
1131 static u16
f71882fg_read16(struct f71882fg_data
*data
, u8 reg
)
1135 val
= f71882fg_read8(data
, reg
) << 8;
1136 val
|= f71882fg_read8(data
, reg
+ 1);
1141 static void f71882fg_write8(struct f71882fg_data
*data
, u8 reg
, u8 val
)
1143 outb(reg
, data
->addr
+ ADDR_REG_OFFSET
);
1144 outb(val
, data
->addr
+ DATA_REG_OFFSET
);
1147 static void f71882fg_write16(struct f71882fg_data
*data
, u8 reg
, u16 val
)
1149 f71882fg_write8(data
, reg
, val
>> 8);
1150 f71882fg_write8(data
, reg
+ 1, val
& 0xff);
1153 static u16
f71882fg_read_temp(struct f71882fg_data
*data
, int nr
)
1155 if (data
->type
== f71858fg
)
1156 return f71882fg_read16(data
, F71882FG_REG_TEMP(nr
));
1158 return f71882fg_read8(data
, F71882FG_REG_TEMP(nr
));
1161 static struct f71882fg_data
*f71882fg_update_device(struct device
*dev
)
1163 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
1164 int nr_fans
= f71882fg_nr_fans
[data
->type
];
1165 int nr_temps
= f71882fg_nr_temps
[data
->type
];
1168 mutex_lock(&data
->update_lock
);
1170 /* Update once every 60 seconds */
1171 if (time_after(jiffies
, data
->last_limits
+ 60 * HZ
) ||
1173 if (f71882fg_has_in1_alarm
[data
->type
]) {
1175 f71882fg_read8(data
, F71882FG_REG_IN1_HIGH
);
1177 f71882fg_read8(data
, F71882FG_REG_IN_BEEP
);
1180 /* Get High & boundary temps*/
1181 for (nr
= data
->temp_start
; nr
< nr_temps
+ data
->temp_start
;
1183 data
->temp_ovt
[nr
] = f71882fg_read8(data
,
1184 F71882FG_REG_TEMP_OVT(nr
));
1185 data
->temp_high
[nr
] = f71882fg_read8(data
,
1186 F71882FG_REG_TEMP_HIGH(nr
));
1189 if (data
->type
!= f8000
) {
1190 data
->temp_hyst
[0] = f71882fg_read8(data
,
1191 F71882FG_REG_TEMP_HYST(0));
1192 data
->temp_hyst
[1] = f71882fg_read8(data
,
1193 F71882FG_REG_TEMP_HYST(1));
1195 /* All but the f71858fg / f8000 have this register */
1196 if ((data
->type
!= f71858fg
) && (data
->type
!= f8000
)) {
1197 reg
= f71882fg_read8(data
, F71882FG_REG_TEMP_TYPE
);
1198 data
->temp_type
[1] = (reg
& 0x02) ? 2 : 4;
1199 data
->temp_type
[2] = (reg
& 0x04) ? 2 : 4;
1200 data
->temp_type
[3] = (reg
& 0x08) ? 2 : 4;
1203 if (f71882fg_fan_has_beep
[data
->type
])
1204 data
->fan_beep
= f71882fg_read8(data
,
1205 F71882FG_REG_FAN_BEEP
);
1207 if (f71882fg_temp_has_beep
[data
->type
])
1208 data
->temp_beep
= f71882fg_read8(data
,
1209 F71882FG_REG_TEMP_BEEP
);
1211 data
->pwm_enable
= f71882fg_read8(data
,
1212 F71882FG_REG_PWM_ENABLE
);
1213 data
->pwm_auto_point_hyst
[0] =
1214 f71882fg_read8(data
, F71882FG_REG_FAN_HYST(0));
1215 data
->pwm_auto_point_hyst
[1] =
1216 f71882fg_read8(data
, F71882FG_REG_FAN_HYST(1));
1218 for (nr
= 0; nr
< nr_fans
; nr
++) {
1219 data
->pwm_auto_point_mapping
[nr
] =
1220 f71882fg_read8(data
,
1221 F71882FG_REG_POINT_MAPPING(nr
));
1223 switch (data
->type
) {
1225 for (point
= 0; point
< 5; point
++) {
1226 data
->pwm_auto_point_pwm
[nr
][point
] =
1227 f71882fg_read8(data
,
1228 F71882FG_REG_POINT_PWM
1231 for (point
= 0; point
< 4; point
++) {
1232 data
->pwm_auto_point_temp
[nr
][point
] =
1233 f71882fg_read8(data
,
1234 F71882FG_REG_POINT_TEMP
1240 data
->pwm_auto_point_pwm
[nr
][0] =
1241 f71882fg_read8(data
,
1242 F71882FG_REG_POINT_PWM(nr
, 0));
1245 data
->pwm_auto_point_pwm
[nr
][1] =
1246 f71882fg_read8(data
,
1247 F71882FG_REG_POINT_PWM
1249 data
->pwm_auto_point_pwm
[nr
][4] =
1250 f71882fg_read8(data
,
1251 F71882FG_REG_POINT_PWM
1253 data
->pwm_auto_point_temp
[nr
][0] =
1254 f71882fg_read8(data
,
1255 F71882FG_REG_POINT_TEMP
1257 data
->pwm_auto_point_temp
[nr
][3] =
1258 f71882fg_read8(data
,
1259 F71882FG_REG_POINT_TEMP
1264 data
->last_limits
= jiffies
;
1267 /* Update every second */
1268 if (time_after(jiffies
, data
->last_updated
+ HZ
) || !data
->valid
) {
1269 data
->temp_status
= f71882fg_read8(data
,
1270 F71882FG_REG_TEMP_STATUS
);
1271 data
->temp_diode_open
= f71882fg_read8(data
,
1272 F71882FG_REG_TEMP_DIODE_OPEN
);
1273 for (nr
= data
->temp_start
; nr
< nr_temps
+ data
->temp_start
;
1275 data
->temp
[nr
] = f71882fg_read_temp(data
, nr
);
1277 data
->fan_status
= f71882fg_read8(data
,
1278 F71882FG_REG_FAN_STATUS
);
1279 for (nr
= 0; nr
< nr_fans
; nr
++) {
1280 data
->fan
[nr
] = f71882fg_read16(data
,
1281 F71882FG_REG_FAN(nr
));
1282 data
->fan_target
[nr
] =
1283 f71882fg_read16(data
, F71882FG_REG_FAN_TARGET(nr
));
1284 data
->fan_full_speed
[nr
] =
1285 f71882fg_read16(data
,
1286 F71882FG_REG_FAN_FULL_SPEED(nr
));
1288 f71882fg_read8(data
, F71882FG_REG_PWM(nr
));
1290 /* Some models have 1 more fan with limited capabilities */
1291 if (data
->type
== f71808a
) {
1292 data
->fan
[2] = f71882fg_read16(data
,
1293 F71882FG_REG_FAN(2));
1294 data
->pwm
[2] = f71882fg_read8(data
,
1295 F71882FG_REG_PWM(2));
1297 if (data
->type
== f8000
)
1298 data
->fan
[3] = f71882fg_read16(data
,
1299 F71882FG_REG_FAN(3));
1301 if (f71882fg_has_in1_alarm
[data
->type
])
1302 data
->in_status
= f71882fg_read8(data
,
1303 F71882FG_REG_IN_STATUS
);
1304 for (nr
= 0; nr
< F71882FG_MAX_INS
; nr
++)
1305 if (f71882fg_has_in
[data
->type
][nr
])
1306 data
->in
[nr
] = f71882fg_read8(data
,
1307 F71882FG_REG_IN(nr
));
1309 data
->last_updated
= jiffies
;
1313 mutex_unlock(&data
->update_lock
);
1318 /* Sysfs Interface */
1319 static ssize_t
show_fan(struct device
*dev
, struct device_attribute
*devattr
,
1322 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1323 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1324 int speed
= fan_from_reg(data
->fan
[nr
]);
1326 if (speed
== FAN_MIN_DETECT
)
1329 return sprintf(buf
, "%d\n", speed
);
1332 static ssize_t
show_fan_full_speed(struct device
*dev
,
1333 struct device_attribute
*devattr
, char *buf
)
1335 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1336 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1337 int speed
= fan_from_reg(data
->fan_full_speed
[nr
]);
1338 return sprintf(buf
, "%d\n", speed
);
1341 static ssize_t
store_fan_full_speed(struct device
*dev
,
1342 struct device_attribute
*devattr
,
1343 const char *buf
, size_t count
)
1345 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
1346 int err
, nr
= to_sensor_dev_attr_2(devattr
)->index
;
1349 err
= kstrtol(buf
, 10, &val
);
1353 val
= clamp_val(val
, 23, 1500000);
1354 val
= fan_to_reg(val
);
1356 mutex_lock(&data
->update_lock
);
1357 f71882fg_write16(data
, F71882FG_REG_FAN_FULL_SPEED(nr
), val
);
1358 data
->fan_full_speed
[nr
] = val
;
1359 mutex_unlock(&data
->update_lock
);
1364 static ssize_t
show_fan_beep(struct device
*dev
, struct device_attribute
1365 *devattr
, char *buf
)
1367 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1368 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1370 if (data
->fan_beep
& (1 << nr
))
1371 return sprintf(buf
, "1\n");
1373 return sprintf(buf
, "0\n");
1376 static ssize_t
store_fan_beep(struct device
*dev
, struct device_attribute
1377 *devattr
, const char *buf
, size_t count
)
1379 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
1380 int err
, nr
= to_sensor_dev_attr_2(devattr
)->index
;
1383 err
= kstrtoul(buf
, 10, &val
);
1387 mutex_lock(&data
->update_lock
);
1388 data
->fan_beep
= f71882fg_read8(data
, F71882FG_REG_FAN_BEEP
);
1390 data
->fan_beep
|= 1 << nr
;
1392 data
->fan_beep
&= ~(1 << nr
);
1394 f71882fg_write8(data
, F71882FG_REG_FAN_BEEP
, data
->fan_beep
);
1395 mutex_unlock(&data
->update_lock
);
1400 static ssize_t
show_fan_alarm(struct device
*dev
, struct device_attribute
1401 *devattr
, char *buf
)
1403 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1404 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1406 if (data
->fan_status
& (1 << nr
))
1407 return sprintf(buf
, "1\n");
1409 return sprintf(buf
, "0\n");
1412 static ssize_t
show_in(struct device
*dev
, struct device_attribute
*devattr
,
1415 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1416 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1418 return sprintf(buf
, "%d\n", data
->in
[nr
] * 8);
1421 static ssize_t
show_in_max(struct device
*dev
, struct device_attribute
1422 *devattr
, char *buf
)
1424 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1426 return sprintf(buf
, "%d\n", data
->in1_max
* 8);
1429 static ssize_t
store_in_max(struct device
*dev
, struct device_attribute
1430 *devattr
, const char *buf
, size_t count
)
1432 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
1436 err
= kstrtol(buf
, 10, &val
);
1441 val
= clamp_val(val
, 0, 255);
1443 mutex_lock(&data
->update_lock
);
1444 f71882fg_write8(data
, F71882FG_REG_IN1_HIGH
, val
);
1445 data
->in1_max
= val
;
1446 mutex_unlock(&data
->update_lock
);
1451 static ssize_t
show_in_beep(struct device
*dev
, struct device_attribute
1452 *devattr
, char *buf
)
1454 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1455 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1457 if (data
->in_beep
& (1 << nr
))
1458 return sprintf(buf
, "1\n");
1460 return sprintf(buf
, "0\n");
1463 static ssize_t
store_in_beep(struct device
*dev
, struct device_attribute
1464 *devattr
, const char *buf
, size_t count
)
1466 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
1467 int err
, nr
= to_sensor_dev_attr_2(devattr
)->index
;
1470 err
= kstrtoul(buf
, 10, &val
);
1474 mutex_lock(&data
->update_lock
);
1475 data
->in_beep
= f71882fg_read8(data
, F71882FG_REG_IN_BEEP
);
1477 data
->in_beep
|= 1 << nr
;
1479 data
->in_beep
&= ~(1 << nr
);
1481 f71882fg_write8(data
, F71882FG_REG_IN_BEEP
, data
->in_beep
);
1482 mutex_unlock(&data
->update_lock
);
1487 static ssize_t
show_in_alarm(struct device
*dev
, struct device_attribute
1488 *devattr
, char *buf
)
1490 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1491 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1493 if (data
->in_status
& (1 << nr
))
1494 return sprintf(buf
, "1\n");
1496 return sprintf(buf
, "0\n");
1499 static ssize_t
show_temp(struct device
*dev
, struct device_attribute
*devattr
,
1502 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1503 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1506 if (data
->type
== f71858fg
) {
1507 /* TEMP_TABLE_SEL 1 or 3 ? */
1508 if (data
->temp_config
& 1) {
1509 sign
= data
->temp
[nr
] & 0x0001;
1510 temp
= (data
->temp
[nr
] >> 5) & 0x7ff;
1512 sign
= data
->temp
[nr
] & 0x8000;
1513 temp
= (data
->temp
[nr
] >> 5) & 0x3ff;
1519 temp
= data
->temp
[nr
] * 1000;
1521 return sprintf(buf
, "%d\n", temp
);
1524 static ssize_t
show_temp_max(struct device
*dev
, struct device_attribute
1525 *devattr
, char *buf
)
1527 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1528 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1530 return sprintf(buf
, "%d\n", data
->temp_high
[nr
] * 1000);
1533 static ssize_t
store_temp_max(struct device
*dev
, struct device_attribute
1534 *devattr
, const char *buf
, size_t count
)
1536 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
1537 int err
, nr
= to_sensor_dev_attr_2(devattr
)->index
;
1540 err
= kstrtol(buf
, 10, &val
);
1545 val
= clamp_val(val
, 0, 255);
1547 mutex_lock(&data
->update_lock
);
1548 f71882fg_write8(data
, F71882FG_REG_TEMP_HIGH(nr
), val
);
1549 data
->temp_high
[nr
] = val
;
1550 mutex_unlock(&data
->update_lock
);
1555 static ssize_t
show_temp_max_hyst(struct device
*dev
, struct device_attribute
1556 *devattr
, char *buf
)
1558 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1559 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1562 mutex_lock(&data
->update_lock
);
1564 temp_max_hyst
= data
->temp_hyst
[nr
/ 2] >> 4;
1566 temp_max_hyst
= data
->temp_hyst
[nr
/ 2] & 0x0f;
1567 temp_max_hyst
= (data
->temp_high
[nr
] - temp_max_hyst
) * 1000;
1568 mutex_unlock(&data
->update_lock
);
1570 return sprintf(buf
, "%d\n", temp_max_hyst
);
1573 static ssize_t
store_temp_max_hyst(struct device
*dev
, struct device_attribute
1574 *devattr
, const char *buf
, size_t count
)
1576 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
1577 int err
, nr
= to_sensor_dev_attr_2(devattr
)->index
;
1578 ssize_t ret
= count
;
1582 err
= kstrtol(buf
, 10, &val
);
1588 mutex_lock(&data
->update_lock
);
1590 /* convert abs to relative and check */
1591 data
->temp_high
[nr
] = f71882fg_read8(data
, F71882FG_REG_TEMP_HIGH(nr
));
1592 val
= clamp_val(val
, data
->temp_high
[nr
] - 15, data
->temp_high
[nr
]);
1593 val
= data
->temp_high
[nr
] - val
;
1595 /* convert value to register contents */
1596 reg
= f71882fg_read8(data
, F71882FG_REG_TEMP_HYST(nr
/ 2));
1598 reg
= (reg
& 0x0f) | (val
<< 4);
1600 reg
= (reg
& 0xf0) | val
;
1601 f71882fg_write8(data
, F71882FG_REG_TEMP_HYST(nr
/ 2), reg
);
1602 data
->temp_hyst
[nr
/ 2] = reg
;
1604 mutex_unlock(&data
->update_lock
);
1608 static ssize_t
show_temp_crit(struct device
*dev
, struct device_attribute
1609 *devattr
, char *buf
)
1611 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1612 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1614 return sprintf(buf
, "%d\n", data
->temp_ovt
[nr
] * 1000);
1617 static ssize_t
store_temp_crit(struct device
*dev
, struct device_attribute
1618 *devattr
, const char *buf
, size_t count
)
1620 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
1621 int err
, nr
= to_sensor_dev_attr_2(devattr
)->index
;
1624 err
= kstrtol(buf
, 10, &val
);
1629 val
= clamp_val(val
, 0, 255);
1631 mutex_lock(&data
->update_lock
);
1632 f71882fg_write8(data
, F71882FG_REG_TEMP_OVT(nr
), val
);
1633 data
->temp_ovt
[nr
] = val
;
1634 mutex_unlock(&data
->update_lock
);
1639 static ssize_t
show_temp_crit_hyst(struct device
*dev
, struct device_attribute
1640 *devattr
, char *buf
)
1642 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1643 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1646 mutex_lock(&data
->update_lock
);
1648 temp_crit_hyst
= data
->temp_hyst
[nr
/ 2] >> 4;
1650 temp_crit_hyst
= data
->temp_hyst
[nr
/ 2] & 0x0f;
1651 temp_crit_hyst
= (data
->temp_ovt
[nr
] - temp_crit_hyst
) * 1000;
1652 mutex_unlock(&data
->update_lock
);
1654 return sprintf(buf
, "%d\n", temp_crit_hyst
);
1657 static ssize_t
show_temp_type(struct device
*dev
, struct device_attribute
1658 *devattr
, char *buf
)
1660 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1661 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1663 return sprintf(buf
, "%d\n", data
->temp_type
[nr
]);
1666 static ssize_t
show_temp_beep(struct device
*dev
, struct device_attribute
1667 *devattr
, char *buf
)
1669 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1670 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1672 if (data
->temp_beep
& (1 << nr
))
1673 return sprintf(buf
, "1\n");
1675 return sprintf(buf
, "0\n");
1678 static ssize_t
store_temp_beep(struct device
*dev
, struct device_attribute
1679 *devattr
, const char *buf
, size_t count
)
1681 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
1682 int err
, nr
= to_sensor_dev_attr_2(devattr
)->index
;
1685 err
= kstrtoul(buf
, 10, &val
);
1689 mutex_lock(&data
->update_lock
);
1690 data
->temp_beep
= f71882fg_read8(data
, F71882FG_REG_TEMP_BEEP
);
1692 data
->temp_beep
|= 1 << nr
;
1694 data
->temp_beep
&= ~(1 << nr
);
1696 f71882fg_write8(data
, F71882FG_REG_TEMP_BEEP
, data
->temp_beep
);
1697 mutex_unlock(&data
->update_lock
);
1702 static ssize_t
show_temp_alarm(struct device
*dev
, struct device_attribute
1703 *devattr
, char *buf
)
1705 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1706 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1708 if (data
->temp_status
& (1 << nr
))
1709 return sprintf(buf
, "1\n");
1711 return sprintf(buf
, "0\n");
1714 static ssize_t
show_temp_fault(struct device
*dev
, struct device_attribute
1715 *devattr
, char *buf
)
1717 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1718 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1720 if (data
->temp_diode_open
& (1 << nr
))
1721 return sprintf(buf
, "1\n");
1723 return sprintf(buf
, "0\n");
1726 static ssize_t
show_pwm(struct device
*dev
,
1727 struct device_attribute
*devattr
, char *buf
)
1729 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1730 int val
, nr
= to_sensor_dev_attr_2(devattr
)->index
;
1731 mutex_lock(&data
->update_lock
);
1732 if (data
->pwm_enable
& (1 << (2 * nr
)))
1734 val
= data
->pwm
[nr
];
1737 val
= 255 * fan_from_reg(data
->fan_target
[nr
])
1738 / fan_from_reg(data
->fan_full_speed
[nr
]);
1740 mutex_unlock(&data
->update_lock
);
1741 return sprintf(buf
, "%d\n", val
);
1744 static ssize_t
store_pwm(struct device
*dev
,
1745 struct device_attribute
*devattr
, const char *buf
,
1748 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
1749 int err
, nr
= to_sensor_dev_attr_2(devattr
)->index
;
1752 err
= kstrtol(buf
, 10, &val
);
1756 val
= clamp_val(val
, 0, 255);
1758 mutex_lock(&data
->update_lock
);
1759 data
->pwm_enable
= f71882fg_read8(data
, F71882FG_REG_PWM_ENABLE
);
1760 if ((data
->type
== f8000
&& ((data
->pwm_enable
>> 2 * nr
) & 3) != 2) ||
1761 (data
->type
!= f8000
&& !((data
->pwm_enable
>> 2 * nr
) & 2))) {
1765 if (data
->pwm_enable
& (1 << (2 * nr
))) {
1767 f71882fg_write8(data
, F71882FG_REG_PWM(nr
), val
);
1768 data
->pwm
[nr
] = val
;
1771 int target
, full_speed
;
1772 full_speed
= f71882fg_read16(data
,
1773 F71882FG_REG_FAN_FULL_SPEED(nr
));
1774 target
= fan_to_reg(val
* fan_from_reg(full_speed
) / 255);
1775 f71882fg_write16(data
, F71882FG_REG_FAN_TARGET(nr
), target
);
1776 data
->fan_target
[nr
] = target
;
1777 data
->fan_full_speed
[nr
] = full_speed
;
1780 mutex_unlock(&data
->update_lock
);
1785 static ssize_t
show_simple_pwm(struct device
*dev
,
1786 struct device_attribute
*devattr
, char *buf
)
1788 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1789 int val
, nr
= to_sensor_dev_attr_2(devattr
)->index
;
1791 val
= data
->pwm
[nr
];
1792 return sprintf(buf
, "%d\n", val
);
1795 static ssize_t
store_simple_pwm(struct device
*dev
,
1796 struct device_attribute
*devattr
,
1797 const char *buf
, size_t count
)
1799 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
1800 int err
, nr
= to_sensor_dev_attr_2(devattr
)->index
;
1803 err
= kstrtol(buf
, 10, &val
);
1807 val
= clamp_val(val
, 0, 255);
1809 mutex_lock(&data
->update_lock
);
1810 f71882fg_write8(data
, F71882FG_REG_PWM(nr
), val
);
1811 data
->pwm
[nr
] = val
;
1812 mutex_unlock(&data
->update_lock
);
1817 static ssize_t
show_pwm_enable(struct device
*dev
,
1818 struct device_attribute
*devattr
, char *buf
)
1821 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1822 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1824 switch ((data
->pwm_enable
>> 2 * nr
) & 3) {
1827 result
= 2; /* Normal auto mode */
1830 result
= 1; /* Manual mode */
1833 if (data
->type
== f8000
)
1834 result
= 3; /* Thermostat mode */
1836 result
= 1; /* Manual mode */
1840 return sprintf(buf
, "%d\n", result
);
1843 static ssize_t
store_pwm_enable(struct device
*dev
, struct device_attribute
1844 *devattr
, const char *buf
, size_t count
)
1846 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
1847 int err
, nr
= to_sensor_dev_attr_2(devattr
)->index
;
1850 err
= kstrtol(buf
, 10, &val
);
1854 /* Special case for F8000 pwm channel 3 which only does auto mode */
1855 if (data
->type
== f8000
&& nr
== 2 && val
!= 2)
1858 mutex_lock(&data
->update_lock
);
1859 data
->pwm_enable
= f71882fg_read8(data
, F71882FG_REG_PWM_ENABLE
);
1860 /* Special case for F8000 auto PWM mode / Thermostat mode */
1861 if (data
->type
== f8000
&& ((data
->pwm_enable
>> 2 * nr
) & 1)) {
1864 data
->pwm_enable
&= ~(2 << (2 * nr
));
1865 break; /* Normal auto mode */
1867 data
->pwm_enable
|= 2 << (2 * nr
);
1868 break; /* Thermostat mode */
1876 /* The f71858fg does not support manual RPM mode */
1877 if (data
->type
== f71858fg
&&
1878 ((data
->pwm_enable
>> (2 * nr
)) & 1)) {
1882 data
->pwm_enable
|= 2 << (2 * nr
);
1885 data
->pwm_enable
&= ~(2 << (2 * nr
));
1886 break; /* Normal auto mode */
1892 f71882fg_write8(data
, F71882FG_REG_PWM_ENABLE
, data
->pwm_enable
);
1894 mutex_unlock(&data
->update_lock
);
1899 static ssize_t
show_pwm_auto_point_pwm(struct device
*dev
,
1900 struct device_attribute
*devattr
,
1904 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1905 int pwm
= to_sensor_dev_attr_2(devattr
)->index
;
1906 int point
= to_sensor_dev_attr_2(devattr
)->nr
;
1908 mutex_lock(&data
->update_lock
);
1909 if (data
->pwm_enable
& (1 << (2 * pwm
))) {
1911 result
= data
->pwm_auto_point_pwm
[pwm
][point
];
1914 result
= 32 * 255 / (32 + data
->pwm_auto_point_pwm
[pwm
][point
]);
1916 mutex_unlock(&data
->update_lock
);
1918 return sprintf(buf
, "%d\n", result
);
1921 static ssize_t
store_pwm_auto_point_pwm(struct device
*dev
,
1922 struct device_attribute
*devattr
,
1923 const char *buf
, size_t count
)
1925 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
1926 int err
, pwm
= to_sensor_dev_attr_2(devattr
)->index
;
1927 int point
= to_sensor_dev_attr_2(devattr
)->nr
;
1930 err
= kstrtol(buf
, 10, &val
);
1934 val
= clamp_val(val
, 0, 255);
1936 mutex_lock(&data
->update_lock
);
1937 data
->pwm_enable
= f71882fg_read8(data
, F71882FG_REG_PWM_ENABLE
);
1938 if (data
->pwm_enable
& (1 << (2 * pwm
))) {
1942 if (val
< 29) /* Prevent negative numbers */
1945 val
= (255 - val
) * 32 / val
;
1947 f71882fg_write8(data
, F71882FG_REG_POINT_PWM(pwm
, point
), val
);
1948 data
->pwm_auto_point_pwm
[pwm
][point
] = val
;
1949 mutex_unlock(&data
->update_lock
);
1954 static ssize_t
show_pwm_auto_point_temp_hyst(struct device
*dev
,
1955 struct device_attribute
*devattr
,
1959 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
1960 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
1961 int point
= to_sensor_dev_attr_2(devattr
)->nr
;
1963 mutex_lock(&data
->update_lock
);
1965 result
= data
->pwm_auto_point_hyst
[nr
/ 2] >> 4;
1967 result
= data
->pwm_auto_point_hyst
[nr
/ 2] & 0x0f;
1968 result
= 1000 * (data
->pwm_auto_point_temp
[nr
][point
] - result
);
1969 mutex_unlock(&data
->update_lock
);
1971 return sprintf(buf
, "%d\n", result
);
1974 static ssize_t
store_pwm_auto_point_temp_hyst(struct device
*dev
,
1975 struct device_attribute
*devattr
,
1976 const char *buf
, size_t count
)
1978 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
1979 int err
, nr
= to_sensor_dev_attr_2(devattr
)->index
;
1980 int point
= to_sensor_dev_attr_2(devattr
)->nr
;
1984 err
= kstrtol(buf
, 10, &val
);
1990 mutex_lock(&data
->update_lock
);
1991 data
->pwm_auto_point_temp
[nr
][point
] =
1992 f71882fg_read8(data
, F71882FG_REG_POINT_TEMP(nr
, point
));
1993 val
= clamp_val(val
, data
->pwm_auto_point_temp
[nr
][point
] - 15,
1994 data
->pwm_auto_point_temp
[nr
][point
]);
1995 val
= data
->pwm_auto_point_temp
[nr
][point
] - val
;
1997 reg
= f71882fg_read8(data
, F71882FG_REG_FAN_HYST(nr
/ 2));
1999 reg
= (reg
& 0x0f) | (val
<< 4);
2001 reg
= (reg
& 0xf0) | val
;
2003 f71882fg_write8(data
, F71882FG_REG_FAN_HYST(nr
/ 2), reg
);
2004 data
->pwm_auto_point_hyst
[nr
/ 2] = reg
;
2005 mutex_unlock(&data
->update_lock
);
2010 static ssize_t
show_pwm_interpolate(struct device
*dev
,
2011 struct device_attribute
*devattr
, char *buf
)
2014 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
2015 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
2017 result
= (data
->pwm_auto_point_mapping
[nr
] >> 4) & 1;
2019 return sprintf(buf
, "%d\n", result
);
2022 static ssize_t
store_pwm_interpolate(struct device
*dev
,
2023 struct device_attribute
*devattr
,
2024 const char *buf
, size_t count
)
2026 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
2027 int err
, nr
= to_sensor_dev_attr_2(devattr
)->index
;
2030 err
= kstrtoul(buf
, 10, &val
);
2034 mutex_lock(&data
->update_lock
);
2035 data
->pwm_auto_point_mapping
[nr
] =
2036 f71882fg_read8(data
, F71882FG_REG_POINT_MAPPING(nr
));
2038 val
= data
->pwm_auto_point_mapping
[nr
] | (1 << 4);
2040 val
= data
->pwm_auto_point_mapping
[nr
] & (~(1 << 4));
2041 f71882fg_write8(data
, F71882FG_REG_POINT_MAPPING(nr
), val
);
2042 data
->pwm_auto_point_mapping
[nr
] = val
;
2043 mutex_unlock(&data
->update_lock
);
2048 static ssize_t
show_pwm_auto_point_channel(struct device
*dev
,
2049 struct device_attribute
*devattr
,
2053 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
2054 int nr
= to_sensor_dev_attr_2(devattr
)->index
;
2056 result
= 1 << ((data
->pwm_auto_point_mapping
[nr
] & 3) -
2059 return sprintf(buf
, "%d\n", result
);
2062 static ssize_t
store_pwm_auto_point_channel(struct device
*dev
,
2063 struct device_attribute
*devattr
,
2064 const char *buf
, size_t count
)
2066 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
2067 int err
, nr
= to_sensor_dev_attr_2(devattr
)->index
;
2070 err
= kstrtol(buf
, 10, &val
);
2087 val
+= data
->temp_start
;
2088 mutex_lock(&data
->update_lock
);
2089 data
->pwm_auto_point_mapping
[nr
] =
2090 f71882fg_read8(data
, F71882FG_REG_POINT_MAPPING(nr
));
2091 val
= (data
->pwm_auto_point_mapping
[nr
] & 0xfc) | val
;
2092 f71882fg_write8(data
, F71882FG_REG_POINT_MAPPING(nr
), val
);
2093 data
->pwm_auto_point_mapping
[nr
] = val
;
2094 mutex_unlock(&data
->update_lock
);
2099 static ssize_t
show_pwm_auto_point_temp(struct device
*dev
,
2100 struct device_attribute
*devattr
,
2104 struct f71882fg_data
*data
= f71882fg_update_device(dev
);
2105 int pwm
= to_sensor_dev_attr_2(devattr
)->index
;
2106 int point
= to_sensor_dev_attr_2(devattr
)->nr
;
2108 result
= data
->pwm_auto_point_temp
[pwm
][point
];
2109 return sprintf(buf
, "%d\n", 1000 * result
);
2112 static ssize_t
store_pwm_auto_point_temp(struct device
*dev
,
2113 struct device_attribute
*devattr
,
2114 const char *buf
, size_t count
)
2116 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
2117 int err
, pwm
= to_sensor_dev_attr_2(devattr
)->index
;
2118 int point
= to_sensor_dev_attr_2(devattr
)->nr
;
2121 err
= kstrtol(buf
, 10, &val
);
2127 if (data
->auto_point_temp_signed
)
2128 val
= clamp_val(val
, -128, 127);
2130 val
= clamp_val(val
, 0, 127);
2132 mutex_lock(&data
->update_lock
);
2133 f71882fg_write8(data
, F71882FG_REG_POINT_TEMP(pwm
, point
), val
);
2134 data
->pwm_auto_point_temp
[pwm
][point
] = val
;
2135 mutex_unlock(&data
->update_lock
);
2140 static ssize_t
show_name(struct device
*dev
, struct device_attribute
*devattr
,
2143 struct f71882fg_data
*data
= dev_get_drvdata(dev
);
2144 return sprintf(buf
, "%s\n", f71882fg_names
[data
->type
]);
2147 static int f71882fg_create_sysfs_files(struct platform_device
*pdev
,
2148 struct sensor_device_attribute_2
*attr
, int count
)
2152 for (i
= 0; i
< count
; i
++) {
2153 err
= device_create_file(&pdev
->dev
, &attr
[i
].dev_attr
);
2160 static void f71882fg_remove_sysfs_files(struct platform_device
*pdev
,
2161 struct sensor_device_attribute_2
*attr
, int count
)
2165 for (i
= 0; i
< count
; i
++)
2166 device_remove_file(&pdev
->dev
, &attr
[i
].dev_attr
);
2169 static int f71882fg_create_fan_sysfs_files(
2170 struct platform_device
*pdev
, int idx
)
2172 struct f71882fg_data
*data
= platform_get_drvdata(pdev
);
2175 /* Sanity check the pwm setting */
2177 switch (data
->type
) {
2179 if (((data
->pwm_enable
>> (idx
* 2)) & 3) == 3)
2183 if (((data
->pwm_enable
>> (idx
* 2)) & 1) != 1)
2188 err
= data
->pwm_enable
& 0x20;
2195 "Invalid (reserved) pwm settings: 0x%02x, "
2196 "skipping fan %d\n",
2197 (data
->pwm_enable
>> (idx
* 2)) & 3, idx
+ 1);
2198 return 0; /* This is a non fatal condition */
2201 err
= f71882fg_create_sysfs_files(pdev
, &fxxxx_fan_attr
[idx
][0],
2202 ARRAY_SIZE(fxxxx_fan_attr
[0]));
2206 if (f71882fg_fan_has_beep
[data
->type
]) {
2207 err
= f71882fg_create_sysfs_files(pdev
,
2208 &fxxxx_fan_beep_attr
[idx
],
2214 dev_info(&pdev
->dev
, "Fan: %d is in %s mode\n", idx
+ 1,
2215 (data
->pwm_enable
& (1 << (2 * idx
))) ? "duty-cycle" : "RPM");
2217 /* Check for unsupported auto pwm settings */
2218 switch (data
->type
) {
2226 data
->pwm_auto_point_mapping
[idx
] =
2227 f71882fg_read8(data
, F71882FG_REG_POINT_MAPPING(idx
));
2228 if ((data
->pwm_auto_point_mapping
[idx
] & 0x80) ||
2229 (data
->pwm_auto_point_mapping
[idx
] & 3) == 0) {
2230 dev_warn(&pdev
->dev
,
2231 "Auto pwm controlled by raw digital "
2232 "data, disabling pwm auto_point "
2233 "sysfs attributes for fan %d\n", idx
+ 1);
2234 return 0; /* This is a non fatal condition */
2241 switch (data
->type
) {
2243 err
= f71882fg_create_sysfs_files(pdev
,
2244 &f71862fg_auto_pwm_attr
[idx
][0],
2245 ARRAY_SIZE(f71862fg_auto_pwm_attr
[0]));
2249 err
= f71882fg_create_sysfs_files(pdev
,
2250 &f71869_auto_pwm_attr
[idx
][0],
2251 ARRAY_SIZE(f71869_auto_pwm_attr
[0]));
2254 err
= f71882fg_create_sysfs_files(pdev
,
2255 &f8000_auto_pwm_attr
[idx
][0],
2256 ARRAY_SIZE(f8000_auto_pwm_attr
[0]));
2259 err
= f71882fg_create_sysfs_files(pdev
,
2260 &fxxxx_auto_pwm_attr
[idx
][0],
2261 ARRAY_SIZE(fxxxx_auto_pwm_attr
[0]));
2267 static int f71882fg_probe(struct platform_device
*pdev
)
2269 struct f71882fg_data
*data
;
2270 struct f71882fg_sio_data
*sio_data
= dev_get_platdata(&pdev
->dev
);
2271 int nr_fans
= f71882fg_nr_fans
[sio_data
->type
];
2272 int nr_temps
= f71882fg_nr_temps
[sio_data
->type
];
2276 data
= devm_kzalloc(&pdev
->dev
, sizeof(struct f71882fg_data
),
2281 data
->addr
= platform_get_resource(pdev
, IORESOURCE_IO
, 0)->start
;
2282 data
->type
= sio_data
->type
;
2284 (data
->type
== f71858fg
|| data
->type
== f8000
) ? 0 : 1;
2285 mutex_init(&data
->update_lock
);
2286 platform_set_drvdata(pdev
, data
);
2288 start_reg
= f71882fg_read8(data
, F71882FG_REG_START
);
2289 if (start_reg
& 0x04) {
2290 dev_warn(&pdev
->dev
, "Hardware monitor is powered down\n");
2293 if (!(start_reg
& 0x03)) {
2294 dev_warn(&pdev
->dev
, "Hardware monitoring not activated\n");
2298 /* Register sysfs interface files */
2299 err
= device_create_file(&pdev
->dev
, &dev_attr_name
);
2301 goto exit_unregister_sysfs
;
2303 if (start_reg
& 0x01) {
2304 switch (data
->type
) {
2307 f71882fg_read8(data
, F71882FG_REG_TEMP_CONFIG
);
2308 if (data
->temp_config
& 0x10)
2310 * The f71858fg temperature alarms behave as
2311 * the f8000 alarms in this mode
2313 err
= f71882fg_create_sysfs_files(pdev
,
2315 ARRAY_SIZE(f8000_temp_attr
));
2317 err
= f71882fg_create_sysfs_files(pdev
,
2319 ARRAY_SIZE(f71858fg_temp_attr
));
2322 err
= f71882fg_create_sysfs_files(pdev
,
2324 ARRAY_SIZE(f8000_temp_attr
));
2327 err
= f71882fg_create_sysfs_files(pdev
,
2328 &fxxxx_temp_attr
[0][0],
2329 ARRAY_SIZE(fxxxx_temp_attr
[0]) * nr_temps
);
2332 goto exit_unregister_sysfs
;
2334 if (f71882fg_temp_has_beep
[data
->type
]) {
2335 err
= f71882fg_create_sysfs_files(pdev
,
2336 &fxxxx_temp_beep_attr
[0][0],
2337 ARRAY_SIZE(fxxxx_temp_beep_attr
[0])
2340 goto exit_unregister_sysfs
;
2343 for (i
= 0; i
< F71882FG_MAX_INS
; i
++) {
2344 if (f71882fg_has_in
[data
->type
][i
]) {
2345 err
= device_create_file(&pdev
->dev
,
2346 &fxxxx_in_attr
[i
].dev_attr
);
2348 goto exit_unregister_sysfs
;
2351 if (f71882fg_has_in1_alarm
[data
->type
]) {
2352 err
= f71882fg_create_sysfs_files(pdev
,
2353 fxxxx_in1_alarm_attr
,
2354 ARRAY_SIZE(fxxxx_in1_alarm_attr
));
2356 goto exit_unregister_sysfs
;
2360 if (start_reg
& 0x02) {
2361 switch (data
->type
) {
2366 /* These always have signed auto point temps */
2367 data
->auto_point_temp_signed
= 1;
2368 /* Fall through to select correct fan/pwm reg bank! */
2372 reg
= f71882fg_read8(data
, F71882FG_REG_FAN_FAULT_T
);
2373 if (reg
& F71882FG_FAN_NEG_TEMP_EN
)
2374 data
->auto_point_temp_signed
= 1;
2375 /* Ensure banked pwm registers point to right bank */
2376 reg
&= ~F71882FG_FAN_PROG_SEL
;
2377 f71882fg_write8(data
, F71882FG_REG_FAN_FAULT_T
, reg
);
2384 f71882fg_read8(data
, F71882FG_REG_PWM_ENABLE
);
2386 for (i
= 0; i
< nr_fans
; i
++) {
2387 err
= f71882fg_create_fan_sysfs_files(pdev
, i
);
2389 goto exit_unregister_sysfs
;
2392 /* Some types have 1 extra fan with limited functionality */
2393 switch (data
->type
) {
2395 err
= f71882fg_create_sysfs_files(pdev
,
2397 ARRAY_SIZE(f71808a_fan3_attr
));
2400 err
= f71882fg_create_sysfs_files(pdev
,
2402 ARRAY_SIZE(f8000_fan_attr
));
2408 goto exit_unregister_sysfs
;
2411 data
->hwmon_dev
= hwmon_device_register(&pdev
->dev
);
2412 if (IS_ERR(data
->hwmon_dev
)) {
2413 err
= PTR_ERR(data
->hwmon_dev
);
2414 data
->hwmon_dev
= NULL
;
2415 goto exit_unregister_sysfs
;
2420 exit_unregister_sysfs
:
2421 f71882fg_remove(pdev
); /* Will unregister the sysfs files for us */
2422 return err
; /* f71882fg_remove() also frees our data */
2425 static int f71882fg_remove(struct platform_device
*pdev
)
2427 struct f71882fg_data
*data
= platform_get_drvdata(pdev
);
2428 int nr_fans
= f71882fg_nr_fans
[data
->type
];
2429 int nr_temps
= f71882fg_nr_temps
[data
->type
];
2431 u8 start_reg
= f71882fg_read8(data
, F71882FG_REG_START
);
2433 if (data
->hwmon_dev
)
2434 hwmon_device_unregister(data
->hwmon_dev
);
2436 device_remove_file(&pdev
->dev
, &dev_attr_name
);
2438 if (start_reg
& 0x01) {
2439 switch (data
->type
) {
2441 if (data
->temp_config
& 0x10)
2442 f71882fg_remove_sysfs_files(pdev
,
2444 ARRAY_SIZE(f8000_temp_attr
));
2446 f71882fg_remove_sysfs_files(pdev
,
2448 ARRAY_SIZE(f71858fg_temp_attr
));
2451 f71882fg_remove_sysfs_files(pdev
,
2453 ARRAY_SIZE(f8000_temp_attr
));
2456 f71882fg_remove_sysfs_files(pdev
,
2457 &fxxxx_temp_attr
[0][0],
2458 ARRAY_SIZE(fxxxx_temp_attr
[0]) * nr_temps
);
2460 if (f71882fg_temp_has_beep
[data
->type
]) {
2461 f71882fg_remove_sysfs_files(pdev
,
2462 &fxxxx_temp_beep_attr
[0][0],
2463 ARRAY_SIZE(fxxxx_temp_beep_attr
[0]) * nr_temps
);
2466 for (i
= 0; i
< F71882FG_MAX_INS
; i
++) {
2467 if (f71882fg_has_in
[data
->type
][i
]) {
2468 device_remove_file(&pdev
->dev
,
2469 &fxxxx_in_attr
[i
].dev_attr
);
2472 if (f71882fg_has_in1_alarm
[data
->type
]) {
2473 f71882fg_remove_sysfs_files(pdev
,
2474 fxxxx_in1_alarm_attr
,
2475 ARRAY_SIZE(fxxxx_in1_alarm_attr
));
2479 if (start_reg
& 0x02) {
2480 f71882fg_remove_sysfs_files(pdev
, &fxxxx_fan_attr
[0][0],
2481 ARRAY_SIZE(fxxxx_fan_attr
[0]) * nr_fans
);
2483 if (f71882fg_fan_has_beep
[data
->type
]) {
2484 f71882fg_remove_sysfs_files(pdev
,
2485 fxxxx_fan_beep_attr
, nr_fans
);
2488 switch (data
->type
) {
2490 f71882fg_remove_sysfs_files(pdev
,
2491 &fxxxx_auto_pwm_attr
[0][0],
2492 ARRAY_SIZE(fxxxx_auto_pwm_attr
[0]) * nr_fans
);
2493 f71882fg_remove_sysfs_files(pdev
,
2495 ARRAY_SIZE(f71808a_fan3_attr
));
2498 f71882fg_remove_sysfs_files(pdev
,
2499 &f71862fg_auto_pwm_attr
[0][0],
2500 ARRAY_SIZE(f71862fg_auto_pwm_attr
[0]) *
2505 f71882fg_remove_sysfs_files(pdev
,
2506 &f71869_auto_pwm_attr
[0][0],
2507 ARRAY_SIZE(f71869_auto_pwm_attr
[0]) * nr_fans
);
2510 f71882fg_remove_sysfs_files(pdev
,
2512 ARRAY_SIZE(f8000_fan_attr
));
2513 f71882fg_remove_sysfs_files(pdev
,
2514 &f8000_auto_pwm_attr
[0][0],
2515 ARRAY_SIZE(f8000_auto_pwm_attr
[0]) * nr_fans
);
2518 f71882fg_remove_sysfs_files(pdev
,
2519 &fxxxx_auto_pwm_attr
[0][0],
2520 ARRAY_SIZE(fxxxx_auto_pwm_attr
[0]) * nr_fans
);
2526 static int __init
f71882fg_find(int sioaddr
, struct f71882fg_sio_data
*sio_data
)
2529 unsigned short address
;
2530 int err
= superio_enter(sioaddr
);
2534 devid
= superio_inw(sioaddr
, SIO_REG_MANID
);
2535 if (devid
!= SIO_FINTEK_ID
) {
2536 pr_debug("Not a Fintek device\n");
2541 devid
= force_id
? force_id
: superio_inw(sioaddr
, SIO_REG_DEVID
);
2543 case SIO_F71808E_ID
:
2544 sio_data
->type
= f71808e
;
2546 case SIO_F71808A_ID
:
2547 sio_data
->type
= f71808a
;
2550 sio_data
->type
= f71858fg
;
2553 sio_data
->type
= f71862fg
;
2556 sio_data
->type
= f71869
;
2558 case SIO_F71869A_ID
:
2559 sio_data
->type
= f71869a
;
2562 sio_data
->type
= f71882fg
;
2565 sio_data
->type
= f71889fg
;
2567 case SIO_F71889E_ID
:
2568 sio_data
->type
= f71889ed
;
2570 case SIO_F71889A_ID
:
2571 sio_data
->type
= f71889a
;
2574 sio_data
->type
= f8000
;
2577 sio_data
->type
= f81865f
;
2580 pr_info("Unsupported Fintek device: %04x\n",
2581 (unsigned int)devid
);
2586 if (sio_data
->type
== f71858fg
)
2587 superio_select(sioaddr
, SIO_F71858FG_LD_HWM
);
2589 superio_select(sioaddr
, SIO_F71882FG_LD_HWM
);
2591 if (!(superio_inb(sioaddr
, SIO_REG_ENABLE
) & 0x01)) {
2592 pr_warn("Device not activated\n");
2597 address
= superio_inw(sioaddr
, SIO_REG_ADDR
);
2599 pr_warn("Base address not set\n");
2603 address
&= ~(REGION_LENGTH
- 1); /* Ignore 3 LSB */
2606 pr_info("Found %s chip at %#x, revision %d\n",
2607 f71882fg_names
[sio_data
->type
], (unsigned int)address
,
2608 (int)superio_inb(sioaddr
, SIO_REG_DEVREV
));
2610 superio_exit(sioaddr
);
2614 static int __init
f71882fg_device_add(int address
,
2615 const struct f71882fg_sio_data
*sio_data
)
2617 struct resource res
= {
2619 .end
= address
+ REGION_LENGTH
- 1,
2620 .flags
= IORESOURCE_IO
,
2624 f71882fg_pdev
= platform_device_alloc(DRVNAME
, address
);
2628 res
.name
= f71882fg_pdev
->name
;
2629 err
= acpi_check_resource_conflict(&res
);
2631 goto exit_device_put
;
2633 err
= platform_device_add_resources(f71882fg_pdev
, &res
, 1);
2635 pr_err("Device resource addition failed\n");
2636 goto exit_device_put
;
2639 err
= platform_device_add_data(f71882fg_pdev
, sio_data
,
2640 sizeof(struct f71882fg_sio_data
));
2642 pr_err("Platform data allocation failed\n");
2643 goto exit_device_put
;
2646 err
= platform_device_add(f71882fg_pdev
);
2648 pr_err("Device addition failed\n");
2649 goto exit_device_put
;
2655 platform_device_put(f71882fg_pdev
);
2660 static int __init
f71882fg_init(void)
2664 struct f71882fg_sio_data sio_data
;
2666 memset(&sio_data
, 0, sizeof(sio_data
));
2668 address
= f71882fg_find(0x2e, &sio_data
);
2670 address
= f71882fg_find(0x4e, &sio_data
);
2674 err
= platform_driver_register(&f71882fg_driver
);
2678 err
= f71882fg_device_add(address
, &sio_data
);
2685 platform_driver_unregister(&f71882fg_driver
);
2689 static void __exit
f71882fg_exit(void)
2691 platform_device_unregister(f71882fg_pdev
);
2692 platform_driver_unregister(&f71882fg_driver
);
2695 MODULE_DESCRIPTION("F71882FG Hardware Monitoring Driver");
2696 MODULE_AUTHOR("Hans Edgington, Hans de Goede <hdegoede@redhat.com>");
2697 MODULE_LICENSE("GPL");
2699 module_init(f71882fg_init
);
2700 module_exit(f71882fg_exit
);