1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * f71805f.c - driver for the Fintek F71805F/FG and F71872F/FG Super-I/O
4 * chips integrated hardware monitoring features
5 * Copyright (C) 2005-2006 Jean Delvare <jdelvare@suse.de>
7 * The F71805F/FG is a LPC Super-I/O chip made by Fintek. It integrates
8 * complete hardware monitoring features: voltage, fan and temperature
9 * sensors, and manual and automatic fan speed control.
11 * The F71872F/FG is almost the same, with two more voltages monitored,
14 * The F71806F/FG is essentially the same as the F71872F/FG. It even has
15 * the same chip ID, so the driver can't differentiate between.
18 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
20 #include <linux/module.h>
21 #include <linux/init.h>
22 #include <linux/slab.h>
23 #include <linux/jiffies.h>
24 #include <linux/platform_device.h>
25 #include <linux/hwmon.h>
26 #include <linux/hwmon-sysfs.h>
27 #include <linux/err.h>
28 #include <linux/mutex.h>
29 #include <linux/sysfs.h>
30 #include <linux/ioport.h>
31 #include <linux/acpi.h>
34 static unsigned short force_id
;
35 module_param(force_id
, ushort
, 0);
36 MODULE_PARM_DESC(force_id
, "Override the detected device ID");
38 static struct platform_device
*pdev
;
40 #define DRVNAME "f71805f"
41 enum kinds
{ f71805f
, f71872f
};
44 * Super-I/O constants and functions
47 #define F71805F_LD_HWM 0x04
49 #define SIO_REG_LDSEL 0x07 /* Logical device select */
50 #define SIO_REG_DEVID 0x20 /* Device ID (2 bytes) */
51 #define SIO_REG_DEVREV 0x22 /* Device revision */
52 #define SIO_REG_MANID 0x23 /* Fintek ID (2 bytes) */
53 #define SIO_REG_FNSEL1 0x29 /* Multi Function Select 1 (F71872F) */
54 #define SIO_REG_ENABLE 0x30 /* Logical device enable */
55 #define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */
57 #define SIO_FINTEK_ID 0x1934
58 #define SIO_F71805F_ID 0x0406
59 #define SIO_F71872F_ID 0x0341
62 superio_inb(int base
, int reg
)
69 superio_inw(int base
, int reg
)
73 val
= inb(base
+ 1) << 8;
80 superio_select(int base
, int ld
)
82 outb(SIO_REG_LDSEL
, base
);
87 superio_enter(int base
)
89 if (!request_muxed_region(base
, 2, DRVNAME
))
99 superio_exit(int base
)
102 release_region(base
, 2);
109 #define REGION_LENGTH 8
110 #define ADDR_REG_OFFSET 5
111 #define DATA_REG_OFFSET 6
117 /* in nr from 0 to 10 (8-bit values) */
118 #define F71805F_REG_IN(nr) (0x10 + (nr))
119 #define F71805F_REG_IN_HIGH(nr) ((nr) < 10 ? 0x40 + 2 * (nr) : 0x2E)
120 #define F71805F_REG_IN_LOW(nr) ((nr) < 10 ? 0x41 + 2 * (nr) : 0x2F)
121 /* fan nr from 0 to 2 (12-bit values, two registers) */
122 #define F71805F_REG_FAN(nr) (0x20 + 2 * (nr))
123 #define F71805F_REG_FAN_LOW(nr) (0x28 + 2 * (nr))
124 #define F71805F_REG_FAN_TARGET(nr) (0x69 + 16 * (nr))
125 #define F71805F_REG_FAN_CTRL(nr) (0x60 + 16 * (nr))
126 #define F71805F_REG_PWM_FREQ(nr) (0x63 + 16 * (nr))
127 #define F71805F_REG_PWM_DUTY(nr) (0x6B + 16 * (nr))
128 /* temp nr from 0 to 2 (8-bit values) */
129 #define F71805F_REG_TEMP(nr) (0x1B + (nr))
130 #define F71805F_REG_TEMP_HIGH(nr) (0x54 + 2 * (nr))
131 #define F71805F_REG_TEMP_HYST(nr) (0x55 + 2 * (nr))
132 #define F71805F_REG_TEMP_MODE 0x01
133 /* pwm/fan pwmnr from 0 to 2, auto point apnr from 0 to 2 */
134 /* map Fintek numbers to our numbers as follows: 9->0, 5->1, 1->2 */
135 #define F71805F_REG_PWM_AUTO_POINT_TEMP(pwmnr, apnr) \
136 (0xA0 + 0x10 * (pwmnr) + (2 - (apnr)))
137 #define F71805F_REG_PWM_AUTO_POINT_FAN(pwmnr, apnr) \
138 (0xA4 + 0x10 * (pwmnr) + \
141 #define F71805F_REG_START 0x00
142 /* status nr from 0 to 2 */
143 #define F71805F_REG_STATUS(nr) (0x36 + (nr))
145 /* individual register bits */
146 #define FAN_CTRL_DC_MODE 0x10
147 #define FAN_CTRL_LATCH_FULL 0x08
148 #define FAN_CTRL_MODE_MASK 0x03
149 #define FAN_CTRL_MODE_SPEED 0x00
150 #define FAN_CTRL_MODE_TEMPERATURE 0x01
151 #define FAN_CTRL_MODE_MANUAL 0x02
154 * Data structures and manipulation thereof
157 struct f71805f_auto_point
{
162 struct f71805f_data
{
165 struct device
*hwmon_dev
;
167 struct mutex update_lock
;
168 char valid
; /* !=0 if following fields are valid */
169 unsigned long last_updated
; /* In jiffies */
170 unsigned long last_limits
; /* In jiffies */
172 /* Register values */
187 unsigned long alarms
;
188 struct f71805f_auto_point auto_points
[3];
191 struct f71805f_sio_data
{
196 static inline long in_from_reg(u8 reg
)
201 /* The 2 least significant bits are not used */
202 static inline u8
in_to_reg(long val
)
208 return ((val
+ 16) / 32) << 2;
211 /* in0 is downscaled by a factor 2 internally */
212 static inline long in0_from_reg(u8 reg
)
217 static inline u8
in0_to_reg(long val
)
223 return ((val
+ 32) / 64) << 2;
226 /* The 4 most significant bits are not used */
227 static inline long fan_from_reg(u16 reg
)
230 if (!reg
|| reg
== 0xfff)
232 return 1500000 / reg
;
235 static inline u16
fan_to_reg(long rpm
)
238 * If the low limit is set below what the chip can measure,
239 * store the largest possible 12-bit value in the registers,
240 * so that no alarm will ever trigger.
244 return 1500000 / rpm
;
247 static inline unsigned long pwm_freq_from_reg(u8 reg
)
249 unsigned long clock
= (reg
& 0x80) ? 48000000UL : 1000000UL;
254 return clock
/ (reg
<< 8);
257 static inline u8
pwm_freq_to_reg(unsigned long val
)
259 if (val
>= 187500) /* The highest we can do */
261 if (val
>= 1475) /* Use 48 MHz clock */
262 return 0x80 | (48000000UL / (val
<< 8));
263 if (val
< 31) /* The lowest we can do */
265 else /* Use 1 MHz clock */
266 return 1000000UL / (val
<< 8);
269 static inline int pwm_mode_from_reg(u8 reg
)
271 return !(reg
& FAN_CTRL_DC_MODE
);
274 static inline long temp_from_reg(u8 reg
)
279 static inline u8
temp_to_reg(long val
)
283 if (val
>= 1000 * 0xff)
285 return (val
+ 500) / 1000;
292 /* Must be called with data->update_lock held, except during initialization */
293 static u8
f71805f_read8(struct f71805f_data
*data
, u8 reg
)
295 outb(reg
, data
->addr
+ ADDR_REG_OFFSET
);
296 return inb(data
->addr
+ DATA_REG_OFFSET
);
299 /* Must be called with data->update_lock held, except during initialization */
300 static void f71805f_write8(struct f71805f_data
*data
, u8 reg
, u8 val
)
302 outb(reg
, data
->addr
+ ADDR_REG_OFFSET
);
303 outb(val
, data
->addr
+ DATA_REG_OFFSET
);
307 * It is important to read the MSB first, because doing so latches the
308 * value of the LSB, so we are sure both bytes belong to the same value.
309 * Must be called with data->update_lock held, except during initialization
311 static u16
f71805f_read16(struct f71805f_data
*data
, u8 reg
)
315 outb(reg
, data
->addr
+ ADDR_REG_OFFSET
);
316 val
= inb(data
->addr
+ DATA_REG_OFFSET
) << 8;
317 outb(++reg
, data
->addr
+ ADDR_REG_OFFSET
);
318 val
|= inb(data
->addr
+ DATA_REG_OFFSET
);
323 /* Must be called with data->update_lock held, except during initialization */
324 static void f71805f_write16(struct f71805f_data
*data
, u8 reg
, u16 val
)
326 outb(reg
, data
->addr
+ ADDR_REG_OFFSET
);
327 outb(val
>> 8, data
->addr
+ DATA_REG_OFFSET
);
328 outb(++reg
, data
->addr
+ ADDR_REG_OFFSET
);
329 outb(val
& 0xff, data
->addr
+ DATA_REG_OFFSET
);
332 static struct f71805f_data
*f71805f_update_device(struct device
*dev
)
334 struct f71805f_data
*data
= dev_get_drvdata(dev
);
337 mutex_lock(&data
->update_lock
);
339 /* Limit registers cache is refreshed after 60 seconds */
340 if (time_after(jiffies
, data
->last_updated
+ 60 * HZ
)
342 for (nr
= 0; nr
< 11; nr
++) {
343 if (!(data
->has_in
& (1 << nr
)))
345 data
->in_high
[nr
] = f71805f_read8(data
,
346 F71805F_REG_IN_HIGH(nr
));
347 data
->in_low
[nr
] = f71805f_read8(data
,
348 F71805F_REG_IN_LOW(nr
));
350 for (nr
= 0; nr
< 3; nr
++) {
351 data
->fan_low
[nr
] = f71805f_read16(data
,
352 F71805F_REG_FAN_LOW(nr
));
353 data
->fan_target
[nr
] = f71805f_read16(data
,
354 F71805F_REG_FAN_TARGET(nr
));
355 data
->pwm_freq
[nr
] = f71805f_read8(data
,
356 F71805F_REG_PWM_FREQ(nr
));
358 for (nr
= 0; nr
< 3; nr
++) {
359 data
->temp_high
[nr
] = f71805f_read8(data
,
360 F71805F_REG_TEMP_HIGH(nr
));
361 data
->temp_hyst
[nr
] = f71805f_read8(data
,
362 F71805F_REG_TEMP_HYST(nr
));
364 data
->temp_mode
= f71805f_read8(data
, F71805F_REG_TEMP_MODE
);
365 for (nr
= 0; nr
< 3; nr
++) {
366 for (apnr
= 0; apnr
< 3; apnr
++) {
367 data
->auto_points
[nr
].temp
[apnr
] =
369 F71805F_REG_PWM_AUTO_POINT_TEMP(nr
,
371 data
->auto_points
[nr
].fan
[apnr
] =
373 F71805F_REG_PWM_AUTO_POINT_FAN(nr
,
378 data
->last_limits
= jiffies
;
381 /* Measurement registers cache is refreshed after 1 second */
382 if (time_after(jiffies
, data
->last_updated
+ HZ
)
384 for (nr
= 0; nr
< 11; nr
++) {
385 if (!(data
->has_in
& (1 << nr
)))
387 data
->in
[nr
] = f71805f_read8(data
,
390 for (nr
= 0; nr
< 3; nr
++) {
391 data
->fan
[nr
] = f71805f_read16(data
,
392 F71805F_REG_FAN(nr
));
393 data
->fan_ctrl
[nr
] = f71805f_read8(data
,
394 F71805F_REG_FAN_CTRL(nr
));
395 data
->pwm
[nr
] = f71805f_read8(data
,
396 F71805F_REG_PWM_DUTY(nr
));
398 for (nr
= 0; nr
< 3; nr
++) {
399 data
->temp
[nr
] = f71805f_read8(data
,
400 F71805F_REG_TEMP(nr
));
402 data
->alarms
= f71805f_read8(data
, F71805F_REG_STATUS(0))
403 + (f71805f_read8(data
, F71805F_REG_STATUS(1)) << 8)
404 + (f71805f_read8(data
, F71805F_REG_STATUS(2)) << 16);
406 data
->last_updated
= jiffies
;
410 mutex_unlock(&data
->update_lock
);
419 static ssize_t
show_in0(struct device
*dev
, struct device_attribute
*devattr
,
422 struct f71805f_data
*data
= f71805f_update_device(dev
);
423 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
424 int nr
= attr
->index
;
426 return sprintf(buf
, "%ld\n", in0_from_reg(data
->in
[nr
]));
429 static ssize_t
show_in0_max(struct device
*dev
, struct device_attribute
432 struct f71805f_data
*data
= f71805f_update_device(dev
);
433 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
434 int nr
= attr
->index
;
436 return sprintf(buf
, "%ld\n", in0_from_reg(data
->in_high
[nr
]));
439 static ssize_t
show_in0_min(struct device
*dev
, struct device_attribute
442 struct f71805f_data
*data
= f71805f_update_device(dev
);
443 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
444 int nr
= attr
->index
;
446 return sprintf(buf
, "%ld\n", in0_from_reg(data
->in_low
[nr
]));
449 static ssize_t
set_in0_max(struct device
*dev
, struct device_attribute
450 *devattr
, const char *buf
, size_t count
)
452 struct f71805f_data
*data
= dev_get_drvdata(dev
);
453 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
454 int nr
= attr
->index
;
458 err
= kstrtol(buf
, 10, &val
);
462 mutex_lock(&data
->update_lock
);
463 data
->in_high
[nr
] = in0_to_reg(val
);
464 f71805f_write8(data
, F71805F_REG_IN_HIGH(nr
), data
->in_high
[nr
]);
465 mutex_unlock(&data
->update_lock
);
470 static ssize_t
set_in0_min(struct device
*dev
, struct device_attribute
471 *devattr
, const char *buf
, size_t count
)
473 struct f71805f_data
*data
= dev_get_drvdata(dev
);
474 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
475 int nr
= attr
->index
;
479 err
= kstrtol(buf
, 10, &val
);
483 mutex_lock(&data
->update_lock
);
484 data
->in_low
[nr
] = in0_to_reg(val
);
485 f71805f_write8(data
, F71805F_REG_IN_LOW(nr
), data
->in_low
[nr
]);
486 mutex_unlock(&data
->update_lock
);
491 static ssize_t
show_in(struct device
*dev
, struct device_attribute
*devattr
,
494 struct f71805f_data
*data
= f71805f_update_device(dev
);
495 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
496 int nr
= attr
->index
;
498 return sprintf(buf
, "%ld\n", in_from_reg(data
->in
[nr
]));
501 static ssize_t
show_in_max(struct device
*dev
, struct device_attribute
504 struct f71805f_data
*data
= f71805f_update_device(dev
);
505 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
506 int nr
= attr
->index
;
508 return sprintf(buf
, "%ld\n", in_from_reg(data
->in_high
[nr
]));
511 static ssize_t
show_in_min(struct device
*dev
, struct device_attribute
514 struct f71805f_data
*data
= f71805f_update_device(dev
);
515 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
516 int nr
= attr
->index
;
518 return sprintf(buf
, "%ld\n", in_from_reg(data
->in_low
[nr
]));
521 static ssize_t
set_in_max(struct device
*dev
, struct device_attribute
522 *devattr
, const char *buf
, size_t count
)
524 struct f71805f_data
*data
= dev_get_drvdata(dev
);
525 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
526 int nr
= attr
->index
;
530 err
= kstrtol(buf
, 10, &val
);
534 mutex_lock(&data
->update_lock
);
535 data
->in_high
[nr
] = in_to_reg(val
);
536 f71805f_write8(data
, F71805F_REG_IN_HIGH(nr
), data
->in_high
[nr
]);
537 mutex_unlock(&data
->update_lock
);
542 static ssize_t
set_in_min(struct device
*dev
, struct device_attribute
543 *devattr
, const char *buf
, size_t count
)
545 struct f71805f_data
*data
= dev_get_drvdata(dev
);
546 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
547 int nr
= attr
->index
;
551 err
= kstrtol(buf
, 10, &val
);
555 mutex_lock(&data
->update_lock
);
556 data
->in_low
[nr
] = in_to_reg(val
);
557 f71805f_write8(data
, F71805F_REG_IN_LOW(nr
), data
->in_low
[nr
]);
558 mutex_unlock(&data
->update_lock
);
563 static ssize_t
show_fan(struct device
*dev
, struct device_attribute
*devattr
,
566 struct f71805f_data
*data
= f71805f_update_device(dev
);
567 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
568 int nr
= attr
->index
;
570 return sprintf(buf
, "%ld\n", fan_from_reg(data
->fan
[nr
]));
573 static ssize_t
show_fan_min(struct device
*dev
, struct device_attribute
576 struct f71805f_data
*data
= f71805f_update_device(dev
);
577 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
578 int nr
= attr
->index
;
580 return sprintf(buf
, "%ld\n", fan_from_reg(data
->fan_low
[nr
]));
583 static ssize_t
show_fan_target(struct device
*dev
, struct device_attribute
586 struct f71805f_data
*data
= f71805f_update_device(dev
);
587 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
588 int nr
= attr
->index
;
590 return sprintf(buf
, "%ld\n", fan_from_reg(data
->fan_target
[nr
]));
593 static ssize_t
set_fan_min(struct device
*dev
, struct device_attribute
594 *devattr
, const char *buf
, size_t count
)
596 struct f71805f_data
*data
= dev_get_drvdata(dev
);
597 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
598 int nr
= attr
->index
;
602 err
= kstrtol(buf
, 10, &val
);
606 mutex_lock(&data
->update_lock
);
607 data
->fan_low
[nr
] = fan_to_reg(val
);
608 f71805f_write16(data
, F71805F_REG_FAN_LOW(nr
), data
->fan_low
[nr
]);
609 mutex_unlock(&data
->update_lock
);
614 static ssize_t
set_fan_target(struct device
*dev
, struct device_attribute
615 *devattr
, const char *buf
, size_t count
)
617 struct f71805f_data
*data
= dev_get_drvdata(dev
);
618 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
619 int nr
= attr
->index
;
623 err
= kstrtol(buf
, 10, &val
);
627 mutex_lock(&data
->update_lock
);
628 data
->fan_target
[nr
] = fan_to_reg(val
);
629 f71805f_write16(data
, F71805F_REG_FAN_TARGET(nr
),
630 data
->fan_target
[nr
]);
631 mutex_unlock(&data
->update_lock
);
636 static ssize_t
show_pwm(struct device
*dev
, struct device_attribute
*devattr
,
639 struct f71805f_data
*data
= f71805f_update_device(dev
);
640 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
641 int nr
= attr
->index
;
643 return sprintf(buf
, "%d\n", (int)data
->pwm
[nr
]);
646 static ssize_t
show_pwm_enable(struct device
*dev
, struct device_attribute
649 struct f71805f_data
*data
= f71805f_update_device(dev
);
650 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
651 int nr
= attr
->index
;
654 switch (data
->fan_ctrl
[nr
] & FAN_CTRL_MODE_MASK
) {
655 case FAN_CTRL_MODE_SPEED
:
658 case FAN_CTRL_MODE_TEMPERATURE
:
661 default: /* MANUAL */
665 return sprintf(buf
, "%d\n", mode
);
668 static ssize_t
show_pwm_freq(struct device
*dev
, struct device_attribute
671 struct f71805f_data
*data
= f71805f_update_device(dev
);
672 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
673 int nr
= attr
->index
;
675 return sprintf(buf
, "%lu\n", pwm_freq_from_reg(data
->pwm_freq
[nr
]));
678 static ssize_t
show_pwm_mode(struct device
*dev
, struct device_attribute
681 struct f71805f_data
*data
= f71805f_update_device(dev
);
682 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
683 int nr
= attr
->index
;
685 return sprintf(buf
, "%d\n", pwm_mode_from_reg(data
->fan_ctrl
[nr
]));
688 static ssize_t
set_pwm(struct device
*dev
, struct device_attribute
*devattr
,
689 const char *buf
, size_t count
)
691 struct f71805f_data
*data
= dev_get_drvdata(dev
);
692 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
693 int nr
= attr
->index
;
697 err
= kstrtoul(buf
, 10, &val
);
704 mutex_lock(&data
->update_lock
);
706 f71805f_write8(data
, F71805F_REG_PWM_DUTY(nr
), data
->pwm
[nr
]);
707 mutex_unlock(&data
->update_lock
);
712 static struct attribute
*f71805f_attr_pwm
[];
714 static ssize_t
set_pwm_enable(struct device
*dev
, struct device_attribute
715 *devattr
, const char *buf
, size_t count
)
717 struct f71805f_data
*data
= dev_get_drvdata(dev
);
718 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
719 int nr
= attr
->index
;
724 err
= kstrtoul(buf
, 10, &val
);
728 if (val
< 1 || val
> 3)
731 if (val
> 1) { /* Automatic mode, user can't set PWM value */
732 if (sysfs_chmod_file(&dev
->kobj
, f71805f_attr_pwm
[nr
],
734 dev_dbg(dev
, "chmod -w pwm%d failed\n", nr
+ 1);
737 mutex_lock(&data
->update_lock
);
738 reg
= f71805f_read8(data
, F71805F_REG_FAN_CTRL(nr
))
739 & ~FAN_CTRL_MODE_MASK
;
742 reg
|= FAN_CTRL_MODE_MANUAL
;
745 reg
|= FAN_CTRL_MODE_TEMPERATURE
;
748 reg
|= FAN_CTRL_MODE_SPEED
;
751 data
->fan_ctrl
[nr
] = reg
;
752 f71805f_write8(data
, F71805F_REG_FAN_CTRL(nr
), reg
);
753 mutex_unlock(&data
->update_lock
);
755 if (val
== 1) { /* Manual mode, user can set PWM value */
756 if (sysfs_chmod_file(&dev
->kobj
, f71805f_attr_pwm
[nr
],
758 dev_dbg(dev
, "chmod +w pwm%d failed\n", nr
+ 1);
764 static ssize_t
set_pwm_freq(struct device
*dev
, struct device_attribute
765 *devattr
, const char *buf
, size_t count
)
767 struct f71805f_data
*data
= dev_get_drvdata(dev
);
768 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
769 int nr
= attr
->index
;
773 err
= kstrtoul(buf
, 10, &val
);
777 mutex_lock(&data
->update_lock
);
778 data
->pwm_freq
[nr
] = pwm_freq_to_reg(val
);
779 f71805f_write8(data
, F71805F_REG_PWM_FREQ(nr
), data
->pwm_freq
[nr
]);
780 mutex_unlock(&data
->update_lock
);
785 static ssize_t
show_pwm_auto_point_temp(struct device
*dev
,
786 struct device_attribute
*devattr
,
789 struct f71805f_data
*data
= dev_get_drvdata(dev
);
790 struct sensor_device_attribute_2
*attr
= to_sensor_dev_attr_2(devattr
);
791 int pwmnr
= attr
->nr
;
792 int apnr
= attr
->index
;
794 return sprintf(buf
, "%ld\n",
795 temp_from_reg(data
->auto_points
[pwmnr
].temp
[apnr
]));
798 static ssize_t
set_pwm_auto_point_temp(struct device
*dev
,
799 struct device_attribute
*devattr
,
800 const char *buf
, size_t count
)
802 struct f71805f_data
*data
= dev_get_drvdata(dev
);
803 struct sensor_device_attribute_2
*attr
= to_sensor_dev_attr_2(devattr
);
804 int pwmnr
= attr
->nr
;
805 int apnr
= attr
->index
;
809 err
= kstrtoul(buf
, 10, &val
);
813 mutex_lock(&data
->update_lock
);
814 data
->auto_points
[pwmnr
].temp
[apnr
] = temp_to_reg(val
);
815 f71805f_write8(data
, F71805F_REG_PWM_AUTO_POINT_TEMP(pwmnr
, apnr
),
816 data
->auto_points
[pwmnr
].temp
[apnr
]);
817 mutex_unlock(&data
->update_lock
);
822 static ssize_t
show_pwm_auto_point_fan(struct device
*dev
,
823 struct device_attribute
*devattr
,
826 struct f71805f_data
*data
= dev_get_drvdata(dev
);
827 struct sensor_device_attribute_2
*attr
= to_sensor_dev_attr_2(devattr
);
828 int pwmnr
= attr
->nr
;
829 int apnr
= attr
->index
;
831 return sprintf(buf
, "%ld\n",
832 fan_from_reg(data
->auto_points
[pwmnr
].fan
[apnr
]));
835 static ssize_t
set_pwm_auto_point_fan(struct device
*dev
,
836 struct device_attribute
*devattr
,
837 const char *buf
, size_t count
)
839 struct f71805f_data
*data
= dev_get_drvdata(dev
);
840 struct sensor_device_attribute_2
*attr
= to_sensor_dev_attr_2(devattr
);
841 int pwmnr
= attr
->nr
;
842 int apnr
= attr
->index
;
846 err
= kstrtoul(buf
, 10, &val
);
850 mutex_lock(&data
->update_lock
);
851 data
->auto_points
[pwmnr
].fan
[apnr
] = fan_to_reg(val
);
852 f71805f_write16(data
, F71805F_REG_PWM_AUTO_POINT_FAN(pwmnr
, apnr
),
853 data
->auto_points
[pwmnr
].fan
[apnr
]);
854 mutex_unlock(&data
->update_lock
);
859 static ssize_t
show_temp(struct device
*dev
, struct device_attribute
*devattr
,
862 struct f71805f_data
*data
= f71805f_update_device(dev
);
863 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
864 int nr
= attr
->index
;
866 return sprintf(buf
, "%ld\n", temp_from_reg(data
->temp
[nr
]));
869 static ssize_t
show_temp_max(struct device
*dev
, struct device_attribute
872 struct f71805f_data
*data
= f71805f_update_device(dev
);
873 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
874 int nr
= attr
->index
;
876 return sprintf(buf
, "%ld\n", temp_from_reg(data
->temp_high
[nr
]));
879 static ssize_t
show_temp_hyst(struct device
*dev
, struct device_attribute
882 struct f71805f_data
*data
= f71805f_update_device(dev
);
883 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
884 int nr
= attr
->index
;
886 return sprintf(buf
, "%ld\n", temp_from_reg(data
->temp_hyst
[nr
]));
889 static ssize_t
show_temp_type(struct device
*dev
, struct device_attribute
892 struct f71805f_data
*data
= f71805f_update_device(dev
);
893 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
894 int nr
= attr
->index
;
896 /* 3 is diode, 4 is thermistor */
897 return sprintf(buf
, "%u\n", (data
->temp_mode
& (1 << nr
)) ? 3 : 4);
900 static ssize_t
set_temp_max(struct device
*dev
, struct device_attribute
901 *devattr
, const char *buf
, size_t count
)
903 struct f71805f_data
*data
= dev_get_drvdata(dev
);
904 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
905 int nr
= attr
->index
;
909 err
= kstrtol(buf
, 10, &val
);
913 mutex_lock(&data
->update_lock
);
914 data
->temp_high
[nr
] = temp_to_reg(val
);
915 f71805f_write8(data
, F71805F_REG_TEMP_HIGH(nr
), data
->temp_high
[nr
]);
916 mutex_unlock(&data
->update_lock
);
921 static ssize_t
set_temp_hyst(struct device
*dev
, struct device_attribute
922 *devattr
, const char *buf
, size_t count
)
924 struct f71805f_data
*data
= dev_get_drvdata(dev
);
925 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
926 int nr
= attr
->index
;
930 err
= kstrtol(buf
, 10, &val
);
934 mutex_lock(&data
->update_lock
);
935 data
->temp_hyst
[nr
] = temp_to_reg(val
);
936 f71805f_write8(data
, F71805F_REG_TEMP_HYST(nr
), data
->temp_hyst
[nr
]);
937 mutex_unlock(&data
->update_lock
);
942 static ssize_t
alarms_in_show(struct device
*dev
, struct device_attribute
945 struct f71805f_data
*data
= f71805f_update_device(dev
);
947 return sprintf(buf
, "%lu\n", data
->alarms
& 0x7ff);
950 static ssize_t
alarms_fan_show(struct device
*dev
, struct device_attribute
953 struct f71805f_data
*data
= f71805f_update_device(dev
);
955 return sprintf(buf
, "%lu\n", (data
->alarms
>> 16) & 0x07);
958 static ssize_t
alarms_temp_show(struct device
*dev
, struct device_attribute
961 struct f71805f_data
*data
= f71805f_update_device(dev
);
963 return sprintf(buf
, "%lu\n", (data
->alarms
>> 11) & 0x07);
966 static ssize_t
show_alarm(struct device
*dev
, struct device_attribute
969 struct f71805f_data
*data
= f71805f_update_device(dev
);
970 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
971 int bitnr
= attr
->index
;
973 return sprintf(buf
, "%lu\n", (data
->alarms
>> bitnr
) & 1);
976 static ssize_t
name_show(struct device
*dev
, struct device_attribute
979 struct f71805f_data
*data
= dev_get_drvdata(dev
);
981 return sprintf(buf
, "%s\n", data
->name
);
984 static SENSOR_DEVICE_ATTR(in0_input
, S_IRUGO
, show_in0
, NULL
, 0);
985 static SENSOR_DEVICE_ATTR(in0_max
, S_IRUGO
| S_IWUSR
,
986 show_in0_max
, set_in0_max
, 0);
987 static SENSOR_DEVICE_ATTR(in0_min
, S_IRUGO
| S_IWUSR
,
988 show_in0_min
, set_in0_min
, 0);
989 static SENSOR_DEVICE_ATTR(in1_input
, S_IRUGO
, show_in
, NULL
, 1);
990 static SENSOR_DEVICE_ATTR(in1_max
, S_IRUGO
| S_IWUSR
,
991 show_in_max
, set_in_max
, 1);
992 static SENSOR_DEVICE_ATTR(in1_min
, S_IRUGO
| S_IWUSR
,
993 show_in_min
, set_in_min
, 1);
994 static SENSOR_DEVICE_ATTR(in2_input
, S_IRUGO
, show_in
, NULL
, 2);
995 static SENSOR_DEVICE_ATTR(in2_max
, S_IRUGO
| S_IWUSR
,
996 show_in_max
, set_in_max
, 2);
997 static SENSOR_DEVICE_ATTR(in2_min
, S_IRUGO
| S_IWUSR
,
998 show_in_min
, set_in_min
, 2);
999 static SENSOR_DEVICE_ATTR(in3_input
, S_IRUGO
, show_in
, NULL
, 3);
1000 static SENSOR_DEVICE_ATTR(in3_max
, S_IRUGO
| S_IWUSR
,
1001 show_in_max
, set_in_max
, 3);
1002 static SENSOR_DEVICE_ATTR(in3_min
, S_IRUGO
| S_IWUSR
,
1003 show_in_min
, set_in_min
, 3);
1004 static SENSOR_DEVICE_ATTR(in4_input
, S_IRUGO
, show_in
, NULL
, 4);
1005 static SENSOR_DEVICE_ATTR(in4_max
, S_IRUGO
| S_IWUSR
,
1006 show_in_max
, set_in_max
, 4);
1007 static SENSOR_DEVICE_ATTR(in4_min
, S_IRUGO
| S_IWUSR
,
1008 show_in_min
, set_in_min
, 4);
1009 static SENSOR_DEVICE_ATTR(in5_input
, S_IRUGO
, show_in
, NULL
, 5);
1010 static SENSOR_DEVICE_ATTR(in5_max
, S_IRUGO
| S_IWUSR
,
1011 show_in_max
, set_in_max
, 5);
1012 static SENSOR_DEVICE_ATTR(in5_min
, S_IRUGO
| S_IWUSR
,
1013 show_in_min
, set_in_min
, 5);
1014 static SENSOR_DEVICE_ATTR(in6_input
, S_IRUGO
, show_in
, NULL
, 6);
1015 static SENSOR_DEVICE_ATTR(in6_max
, S_IRUGO
| S_IWUSR
,
1016 show_in_max
, set_in_max
, 6);
1017 static SENSOR_DEVICE_ATTR(in6_min
, S_IRUGO
| S_IWUSR
,
1018 show_in_min
, set_in_min
, 6);
1019 static SENSOR_DEVICE_ATTR(in7_input
, S_IRUGO
, show_in
, NULL
, 7);
1020 static SENSOR_DEVICE_ATTR(in7_max
, S_IRUGO
| S_IWUSR
,
1021 show_in_max
, set_in_max
, 7);
1022 static SENSOR_DEVICE_ATTR(in7_min
, S_IRUGO
| S_IWUSR
,
1023 show_in_min
, set_in_min
, 7);
1024 static SENSOR_DEVICE_ATTR(in8_input
, S_IRUGO
, show_in
, NULL
, 8);
1025 static SENSOR_DEVICE_ATTR(in8_max
, S_IRUGO
| S_IWUSR
,
1026 show_in_max
, set_in_max
, 8);
1027 static SENSOR_DEVICE_ATTR(in8_min
, S_IRUGO
| S_IWUSR
,
1028 show_in_min
, set_in_min
, 8);
1029 static SENSOR_DEVICE_ATTR(in9_input
, S_IRUGO
, show_in0
, NULL
, 9);
1030 static SENSOR_DEVICE_ATTR(in9_max
, S_IRUGO
| S_IWUSR
,
1031 show_in0_max
, set_in0_max
, 9);
1032 static SENSOR_DEVICE_ATTR(in9_min
, S_IRUGO
| S_IWUSR
,
1033 show_in0_min
, set_in0_min
, 9);
1034 static SENSOR_DEVICE_ATTR(in10_input
, S_IRUGO
, show_in0
, NULL
, 10);
1035 static SENSOR_DEVICE_ATTR(in10_max
, S_IRUGO
| S_IWUSR
,
1036 show_in0_max
, set_in0_max
, 10);
1037 static SENSOR_DEVICE_ATTR(in10_min
, S_IRUGO
| S_IWUSR
,
1038 show_in0_min
, set_in0_min
, 10);
1040 static SENSOR_DEVICE_ATTR(fan1_input
, S_IRUGO
, show_fan
, NULL
, 0);
1041 static SENSOR_DEVICE_ATTR(fan1_min
, S_IRUGO
| S_IWUSR
,
1042 show_fan_min
, set_fan_min
, 0);
1043 static SENSOR_DEVICE_ATTR(fan1_target
, S_IRUGO
| S_IWUSR
,
1044 show_fan_target
, set_fan_target
, 0);
1045 static SENSOR_DEVICE_ATTR(fan2_input
, S_IRUGO
, show_fan
, NULL
, 1);
1046 static SENSOR_DEVICE_ATTR(fan2_min
, S_IRUGO
| S_IWUSR
,
1047 show_fan_min
, set_fan_min
, 1);
1048 static SENSOR_DEVICE_ATTR(fan2_target
, S_IRUGO
| S_IWUSR
,
1049 show_fan_target
, set_fan_target
, 1);
1050 static SENSOR_DEVICE_ATTR(fan3_input
, S_IRUGO
, show_fan
, NULL
, 2);
1051 static SENSOR_DEVICE_ATTR(fan3_min
, S_IRUGO
| S_IWUSR
,
1052 show_fan_min
, set_fan_min
, 2);
1053 static SENSOR_DEVICE_ATTR(fan3_target
, S_IRUGO
| S_IWUSR
,
1054 show_fan_target
, set_fan_target
, 2);
1056 static SENSOR_DEVICE_ATTR(temp1_input
, S_IRUGO
, show_temp
, NULL
, 0);
1057 static SENSOR_DEVICE_ATTR(temp1_max
, S_IRUGO
| S_IWUSR
,
1058 show_temp_max
, set_temp_max
, 0);
1059 static SENSOR_DEVICE_ATTR(temp1_max_hyst
, S_IRUGO
| S_IWUSR
,
1060 show_temp_hyst
, set_temp_hyst
, 0);
1061 static SENSOR_DEVICE_ATTR(temp1_type
, S_IRUGO
, show_temp_type
, NULL
, 0);
1062 static SENSOR_DEVICE_ATTR(temp2_input
, S_IRUGO
, show_temp
, NULL
, 1);
1063 static SENSOR_DEVICE_ATTR(temp2_max
, S_IRUGO
| S_IWUSR
,
1064 show_temp_max
, set_temp_max
, 1);
1065 static SENSOR_DEVICE_ATTR(temp2_max_hyst
, S_IRUGO
| S_IWUSR
,
1066 show_temp_hyst
, set_temp_hyst
, 1);
1067 static SENSOR_DEVICE_ATTR(temp2_type
, S_IRUGO
, show_temp_type
, NULL
, 1);
1068 static SENSOR_DEVICE_ATTR(temp3_input
, S_IRUGO
, show_temp
, NULL
, 2);
1069 static SENSOR_DEVICE_ATTR(temp3_max
, S_IRUGO
| S_IWUSR
,
1070 show_temp_max
, set_temp_max
, 2);
1071 static SENSOR_DEVICE_ATTR(temp3_max_hyst
, S_IRUGO
| S_IWUSR
,
1072 show_temp_hyst
, set_temp_hyst
, 2);
1073 static SENSOR_DEVICE_ATTR(temp3_type
, S_IRUGO
, show_temp_type
, NULL
, 2);
1076 * pwm (value) files are created read-only, write permission is
1077 * then added or removed dynamically as needed
1079 static SENSOR_DEVICE_ATTR(pwm1
, S_IRUGO
, show_pwm
, set_pwm
, 0);
1080 static SENSOR_DEVICE_ATTR(pwm1_enable
, S_IRUGO
| S_IWUSR
,
1081 show_pwm_enable
, set_pwm_enable
, 0);
1082 static SENSOR_DEVICE_ATTR(pwm1_freq
, S_IRUGO
| S_IWUSR
,
1083 show_pwm_freq
, set_pwm_freq
, 0);
1084 static SENSOR_DEVICE_ATTR(pwm1_mode
, S_IRUGO
, show_pwm_mode
, NULL
, 0);
1085 static SENSOR_DEVICE_ATTR(pwm2
, S_IRUGO
, show_pwm
, set_pwm
, 1);
1086 static SENSOR_DEVICE_ATTR(pwm2_enable
, S_IRUGO
| S_IWUSR
,
1087 show_pwm_enable
, set_pwm_enable
, 1);
1088 static SENSOR_DEVICE_ATTR(pwm2_freq
, S_IRUGO
| S_IWUSR
,
1089 show_pwm_freq
, set_pwm_freq
, 1);
1090 static SENSOR_DEVICE_ATTR(pwm2_mode
, S_IRUGO
, show_pwm_mode
, NULL
, 1);
1091 static SENSOR_DEVICE_ATTR(pwm3
, S_IRUGO
, show_pwm
, set_pwm
, 2);
1092 static SENSOR_DEVICE_ATTR(pwm3_enable
, S_IRUGO
| S_IWUSR
,
1093 show_pwm_enable
, set_pwm_enable
, 2);
1094 static SENSOR_DEVICE_ATTR(pwm3_freq
, S_IRUGO
| S_IWUSR
,
1095 show_pwm_freq
, set_pwm_freq
, 2);
1096 static SENSOR_DEVICE_ATTR(pwm3_mode
, S_IRUGO
, show_pwm_mode
, NULL
, 2);
1098 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_temp
, S_IRUGO
| S_IWUSR
,
1099 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1101 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_fan
, S_IRUGO
| S_IWUSR
,
1102 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1104 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point2_temp
, S_IRUGO
| S_IWUSR
,
1105 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1107 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point2_fan
, S_IRUGO
| S_IWUSR
,
1108 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1110 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point3_temp
, S_IRUGO
| S_IWUSR
,
1111 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1113 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point3_fan
, S_IRUGO
| S_IWUSR
,
1114 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1117 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_temp
, S_IRUGO
| S_IWUSR
,
1118 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1120 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_fan
, S_IRUGO
| S_IWUSR
,
1121 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1123 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point2_temp
, S_IRUGO
| S_IWUSR
,
1124 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1126 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point2_fan
, S_IRUGO
| S_IWUSR
,
1127 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1129 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point3_temp
, S_IRUGO
| S_IWUSR
,
1130 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1132 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point3_fan
, S_IRUGO
| S_IWUSR
,
1133 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1136 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_temp
, S_IRUGO
| S_IWUSR
,
1137 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1139 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_fan
, S_IRUGO
| S_IWUSR
,
1140 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1142 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point2_temp
, S_IRUGO
| S_IWUSR
,
1143 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1145 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point2_fan
, S_IRUGO
| S_IWUSR
,
1146 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1148 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point3_temp
, S_IRUGO
| S_IWUSR
,
1149 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1151 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point3_fan
, S_IRUGO
| S_IWUSR
,
1152 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1155 static SENSOR_DEVICE_ATTR(in0_alarm
, S_IRUGO
, show_alarm
, NULL
, 0);
1156 static SENSOR_DEVICE_ATTR(in1_alarm
, S_IRUGO
, show_alarm
, NULL
, 1);
1157 static SENSOR_DEVICE_ATTR(in2_alarm
, S_IRUGO
, show_alarm
, NULL
, 2);
1158 static SENSOR_DEVICE_ATTR(in3_alarm
, S_IRUGO
, show_alarm
, NULL
, 3);
1159 static SENSOR_DEVICE_ATTR(in4_alarm
, S_IRUGO
, show_alarm
, NULL
, 4);
1160 static SENSOR_DEVICE_ATTR(in5_alarm
, S_IRUGO
, show_alarm
, NULL
, 5);
1161 static SENSOR_DEVICE_ATTR(in6_alarm
, S_IRUGO
, show_alarm
, NULL
, 6);
1162 static SENSOR_DEVICE_ATTR(in7_alarm
, S_IRUGO
, show_alarm
, NULL
, 7);
1163 static SENSOR_DEVICE_ATTR(in8_alarm
, S_IRUGO
, show_alarm
, NULL
, 8);
1164 static SENSOR_DEVICE_ATTR(in9_alarm
, S_IRUGO
, show_alarm
, NULL
, 9);
1165 static SENSOR_DEVICE_ATTR(in10_alarm
, S_IRUGO
, show_alarm
, NULL
, 10);
1166 static SENSOR_DEVICE_ATTR(temp1_alarm
, S_IRUGO
, show_alarm
, NULL
, 11);
1167 static SENSOR_DEVICE_ATTR(temp2_alarm
, S_IRUGO
, show_alarm
, NULL
, 12);
1168 static SENSOR_DEVICE_ATTR(temp3_alarm
, S_IRUGO
, show_alarm
, NULL
, 13);
1169 static SENSOR_DEVICE_ATTR(fan1_alarm
, S_IRUGO
, show_alarm
, NULL
, 16);
1170 static SENSOR_DEVICE_ATTR(fan2_alarm
, S_IRUGO
, show_alarm
, NULL
, 17);
1171 static SENSOR_DEVICE_ATTR(fan3_alarm
, S_IRUGO
, show_alarm
, NULL
, 18);
1172 static DEVICE_ATTR_RO(alarms_in
);
1173 static DEVICE_ATTR_RO(alarms_fan
);
1174 static DEVICE_ATTR_RO(alarms_temp
);
1176 static DEVICE_ATTR_RO(name
);
1178 static struct attribute
*f71805f_attributes
[] = {
1179 &sensor_dev_attr_in0_input
.dev_attr
.attr
,
1180 &sensor_dev_attr_in0_max
.dev_attr
.attr
,
1181 &sensor_dev_attr_in0_min
.dev_attr
.attr
,
1182 &sensor_dev_attr_in1_input
.dev_attr
.attr
,
1183 &sensor_dev_attr_in1_max
.dev_attr
.attr
,
1184 &sensor_dev_attr_in1_min
.dev_attr
.attr
,
1185 &sensor_dev_attr_in2_input
.dev_attr
.attr
,
1186 &sensor_dev_attr_in2_max
.dev_attr
.attr
,
1187 &sensor_dev_attr_in2_min
.dev_attr
.attr
,
1188 &sensor_dev_attr_in3_input
.dev_attr
.attr
,
1189 &sensor_dev_attr_in3_max
.dev_attr
.attr
,
1190 &sensor_dev_attr_in3_min
.dev_attr
.attr
,
1191 &sensor_dev_attr_in5_input
.dev_attr
.attr
,
1192 &sensor_dev_attr_in5_max
.dev_attr
.attr
,
1193 &sensor_dev_attr_in5_min
.dev_attr
.attr
,
1194 &sensor_dev_attr_in6_input
.dev_attr
.attr
,
1195 &sensor_dev_attr_in6_max
.dev_attr
.attr
,
1196 &sensor_dev_attr_in6_min
.dev_attr
.attr
,
1197 &sensor_dev_attr_in7_input
.dev_attr
.attr
,
1198 &sensor_dev_attr_in7_max
.dev_attr
.attr
,
1199 &sensor_dev_attr_in7_min
.dev_attr
.attr
,
1201 &sensor_dev_attr_fan1_input
.dev_attr
.attr
,
1202 &sensor_dev_attr_fan1_min
.dev_attr
.attr
,
1203 &sensor_dev_attr_fan1_alarm
.dev_attr
.attr
,
1204 &sensor_dev_attr_fan1_target
.dev_attr
.attr
,
1205 &sensor_dev_attr_fan2_input
.dev_attr
.attr
,
1206 &sensor_dev_attr_fan2_min
.dev_attr
.attr
,
1207 &sensor_dev_attr_fan2_alarm
.dev_attr
.attr
,
1208 &sensor_dev_attr_fan2_target
.dev_attr
.attr
,
1209 &sensor_dev_attr_fan3_input
.dev_attr
.attr
,
1210 &sensor_dev_attr_fan3_min
.dev_attr
.attr
,
1211 &sensor_dev_attr_fan3_alarm
.dev_attr
.attr
,
1212 &sensor_dev_attr_fan3_target
.dev_attr
.attr
,
1214 &sensor_dev_attr_pwm1
.dev_attr
.attr
,
1215 &sensor_dev_attr_pwm1_enable
.dev_attr
.attr
,
1216 &sensor_dev_attr_pwm1_mode
.dev_attr
.attr
,
1217 &sensor_dev_attr_pwm2
.dev_attr
.attr
,
1218 &sensor_dev_attr_pwm2_enable
.dev_attr
.attr
,
1219 &sensor_dev_attr_pwm2_mode
.dev_attr
.attr
,
1220 &sensor_dev_attr_pwm3
.dev_attr
.attr
,
1221 &sensor_dev_attr_pwm3_enable
.dev_attr
.attr
,
1222 &sensor_dev_attr_pwm3_mode
.dev_attr
.attr
,
1224 &sensor_dev_attr_temp1_input
.dev_attr
.attr
,
1225 &sensor_dev_attr_temp1_max
.dev_attr
.attr
,
1226 &sensor_dev_attr_temp1_max_hyst
.dev_attr
.attr
,
1227 &sensor_dev_attr_temp1_type
.dev_attr
.attr
,
1228 &sensor_dev_attr_temp2_input
.dev_attr
.attr
,
1229 &sensor_dev_attr_temp2_max
.dev_attr
.attr
,
1230 &sensor_dev_attr_temp2_max_hyst
.dev_attr
.attr
,
1231 &sensor_dev_attr_temp2_type
.dev_attr
.attr
,
1232 &sensor_dev_attr_temp3_input
.dev_attr
.attr
,
1233 &sensor_dev_attr_temp3_max
.dev_attr
.attr
,
1234 &sensor_dev_attr_temp3_max_hyst
.dev_attr
.attr
,
1235 &sensor_dev_attr_temp3_type
.dev_attr
.attr
,
1237 &sensor_dev_attr_pwm1_auto_point1_temp
.dev_attr
.attr
,
1238 &sensor_dev_attr_pwm1_auto_point1_fan
.dev_attr
.attr
,
1239 &sensor_dev_attr_pwm1_auto_point2_temp
.dev_attr
.attr
,
1240 &sensor_dev_attr_pwm1_auto_point2_fan
.dev_attr
.attr
,
1241 &sensor_dev_attr_pwm1_auto_point3_temp
.dev_attr
.attr
,
1242 &sensor_dev_attr_pwm1_auto_point3_fan
.dev_attr
.attr
,
1243 &sensor_dev_attr_pwm2_auto_point1_temp
.dev_attr
.attr
,
1244 &sensor_dev_attr_pwm2_auto_point1_fan
.dev_attr
.attr
,
1245 &sensor_dev_attr_pwm2_auto_point2_temp
.dev_attr
.attr
,
1246 &sensor_dev_attr_pwm2_auto_point2_fan
.dev_attr
.attr
,
1247 &sensor_dev_attr_pwm2_auto_point3_temp
.dev_attr
.attr
,
1248 &sensor_dev_attr_pwm2_auto_point3_fan
.dev_attr
.attr
,
1249 &sensor_dev_attr_pwm3_auto_point1_temp
.dev_attr
.attr
,
1250 &sensor_dev_attr_pwm3_auto_point1_fan
.dev_attr
.attr
,
1251 &sensor_dev_attr_pwm3_auto_point2_temp
.dev_attr
.attr
,
1252 &sensor_dev_attr_pwm3_auto_point2_fan
.dev_attr
.attr
,
1253 &sensor_dev_attr_pwm3_auto_point3_temp
.dev_attr
.attr
,
1254 &sensor_dev_attr_pwm3_auto_point3_fan
.dev_attr
.attr
,
1256 &sensor_dev_attr_in0_alarm
.dev_attr
.attr
,
1257 &sensor_dev_attr_in1_alarm
.dev_attr
.attr
,
1258 &sensor_dev_attr_in2_alarm
.dev_attr
.attr
,
1259 &sensor_dev_attr_in3_alarm
.dev_attr
.attr
,
1260 &sensor_dev_attr_in5_alarm
.dev_attr
.attr
,
1261 &sensor_dev_attr_in6_alarm
.dev_attr
.attr
,
1262 &sensor_dev_attr_in7_alarm
.dev_attr
.attr
,
1263 &dev_attr_alarms_in
.attr
,
1264 &sensor_dev_attr_temp1_alarm
.dev_attr
.attr
,
1265 &sensor_dev_attr_temp2_alarm
.dev_attr
.attr
,
1266 &sensor_dev_attr_temp3_alarm
.dev_attr
.attr
,
1267 &dev_attr_alarms_temp
.attr
,
1268 &dev_attr_alarms_fan
.attr
,
1270 &dev_attr_name
.attr
,
1274 static const struct attribute_group f71805f_group
= {
1275 .attrs
= f71805f_attributes
,
1278 static struct attribute
*f71805f_attributes_optin
[4][5] = {
1280 &sensor_dev_attr_in4_input
.dev_attr
.attr
,
1281 &sensor_dev_attr_in4_max
.dev_attr
.attr
,
1282 &sensor_dev_attr_in4_min
.dev_attr
.attr
,
1283 &sensor_dev_attr_in4_alarm
.dev_attr
.attr
,
1286 &sensor_dev_attr_in8_input
.dev_attr
.attr
,
1287 &sensor_dev_attr_in8_max
.dev_attr
.attr
,
1288 &sensor_dev_attr_in8_min
.dev_attr
.attr
,
1289 &sensor_dev_attr_in8_alarm
.dev_attr
.attr
,
1292 &sensor_dev_attr_in9_input
.dev_attr
.attr
,
1293 &sensor_dev_attr_in9_max
.dev_attr
.attr
,
1294 &sensor_dev_attr_in9_min
.dev_attr
.attr
,
1295 &sensor_dev_attr_in9_alarm
.dev_attr
.attr
,
1298 &sensor_dev_attr_in10_input
.dev_attr
.attr
,
1299 &sensor_dev_attr_in10_max
.dev_attr
.attr
,
1300 &sensor_dev_attr_in10_min
.dev_attr
.attr
,
1301 &sensor_dev_attr_in10_alarm
.dev_attr
.attr
,
1306 static const struct attribute_group f71805f_group_optin
[4] = {
1307 { .attrs
= f71805f_attributes_optin
[0] },
1308 { .attrs
= f71805f_attributes_optin
[1] },
1309 { .attrs
= f71805f_attributes_optin
[2] },
1310 { .attrs
= f71805f_attributes_optin
[3] },
1314 * We don't include pwm_freq files in the arrays above, because they must be
1315 * created conditionally (only if pwm_mode is 1 == PWM)
1317 static struct attribute
*f71805f_attributes_pwm_freq
[] = {
1318 &sensor_dev_attr_pwm1_freq
.dev_attr
.attr
,
1319 &sensor_dev_attr_pwm2_freq
.dev_attr
.attr
,
1320 &sensor_dev_attr_pwm3_freq
.dev_attr
.attr
,
1324 static const struct attribute_group f71805f_group_pwm_freq
= {
1325 .attrs
= f71805f_attributes_pwm_freq
,
1328 /* We also need an indexed access to pwmN files to toggle writability */
1329 static struct attribute
*f71805f_attr_pwm
[] = {
1330 &sensor_dev_attr_pwm1
.dev_attr
.attr
,
1331 &sensor_dev_attr_pwm2
.dev_attr
.attr
,
1332 &sensor_dev_attr_pwm3
.dev_attr
.attr
,
1336 * Device registration and initialization
1339 static void f71805f_init_device(struct f71805f_data
*data
)
1344 reg
= f71805f_read8(data
, F71805F_REG_START
);
1345 if ((reg
& 0x41) != 0x01) {
1346 pr_debug("Starting monitoring operations\n");
1347 f71805f_write8(data
, F71805F_REG_START
, (reg
| 0x01) & ~0x40);
1351 * Fan monitoring can be disabled. If it is, we won't be polling
1352 * the register values, and won't create the related sysfs files.
1354 for (i
= 0; i
< 3; i
++) {
1355 data
->fan_ctrl
[i
] = f71805f_read8(data
,
1356 F71805F_REG_FAN_CTRL(i
));
1358 * Clear latch full bit, else "speed mode" fan speed control
1361 if (data
->fan_ctrl
[i
] & FAN_CTRL_LATCH_FULL
) {
1362 data
->fan_ctrl
[i
] &= ~FAN_CTRL_LATCH_FULL
;
1363 f71805f_write8(data
, F71805F_REG_FAN_CTRL(i
),
1369 static int f71805f_probe(struct platform_device
*pdev
)
1371 struct f71805f_sio_data
*sio_data
= dev_get_platdata(&pdev
->dev
);
1372 struct f71805f_data
*data
;
1373 struct resource
*res
;
1376 static const char * const names
[] = {
1381 data
= devm_kzalloc(&pdev
->dev
, sizeof(struct f71805f_data
),
1386 res
= platform_get_resource(pdev
, IORESOURCE_IO
, 0);
1387 if (!devm_request_region(&pdev
->dev
, res
->start
+ ADDR_REG_OFFSET
, 2,
1389 dev_err(&pdev
->dev
, "Failed to request region 0x%lx-0x%lx\n",
1390 (unsigned long)(res
->start
+ ADDR_REG_OFFSET
),
1391 (unsigned long)(res
->start
+ ADDR_REG_OFFSET
+ 1));
1394 data
->addr
= res
->start
;
1395 data
->name
= names
[sio_data
->kind
];
1396 mutex_init(&data
->update_lock
);
1398 platform_set_drvdata(pdev
, data
);
1400 /* Some voltage inputs depend on chip model and configuration */
1401 switch (sio_data
->kind
) {
1403 data
->has_in
= 0x1ff;
1406 data
->has_in
= 0x6ef;
1407 if (sio_data
->fnsel1
& 0x01)
1408 data
->has_in
|= (1 << 4); /* in4 */
1409 if (sio_data
->fnsel1
& 0x02)
1410 data
->has_in
|= (1 << 8); /* in8 */
1414 /* Initialize the F71805F chip */
1415 f71805f_init_device(data
);
1417 /* Register sysfs interface files */
1418 err
= sysfs_create_group(&pdev
->dev
.kobj
, &f71805f_group
);
1421 if (data
->has_in
& (1 << 4)) { /* in4 */
1422 err
= sysfs_create_group(&pdev
->dev
.kobj
,
1423 &f71805f_group_optin
[0]);
1425 goto exit_remove_files
;
1427 if (data
->has_in
& (1 << 8)) { /* in8 */
1428 err
= sysfs_create_group(&pdev
->dev
.kobj
,
1429 &f71805f_group_optin
[1]);
1431 goto exit_remove_files
;
1433 if (data
->has_in
& (1 << 9)) { /* in9 (F71872F/FG only) */
1434 err
= sysfs_create_group(&pdev
->dev
.kobj
,
1435 &f71805f_group_optin
[2]);
1437 goto exit_remove_files
;
1439 if (data
->has_in
& (1 << 10)) { /* in9 (F71872F/FG only) */
1440 err
= sysfs_create_group(&pdev
->dev
.kobj
,
1441 &f71805f_group_optin
[3]);
1443 goto exit_remove_files
;
1445 for (i
= 0; i
< 3; i
++) {
1446 /* If control mode is PWM, create pwm_freq file */
1447 if (!(data
->fan_ctrl
[i
] & FAN_CTRL_DC_MODE
)) {
1448 err
= sysfs_create_file(&pdev
->dev
.kobj
,
1449 f71805f_attributes_pwm_freq
[i
]);
1451 goto exit_remove_files
;
1453 /* If PWM is in manual mode, add write permission */
1454 if (data
->fan_ctrl
[i
] & FAN_CTRL_MODE_MANUAL
) {
1455 err
= sysfs_chmod_file(&pdev
->dev
.kobj
,
1456 f71805f_attr_pwm
[i
],
1459 dev_err(&pdev
->dev
, "chmod +w pwm%d failed\n",
1461 goto exit_remove_files
;
1466 data
->hwmon_dev
= hwmon_device_register(&pdev
->dev
);
1467 if (IS_ERR(data
->hwmon_dev
)) {
1468 err
= PTR_ERR(data
->hwmon_dev
);
1469 dev_err(&pdev
->dev
, "Class registration failed (%d)\n", err
);
1470 goto exit_remove_files
;
1476 sysfs_remove_group(&pdev
->dev
.kobj
, &f71805f_group
);
1477 for (i
= 0; i
< 4; i
++)
1478 sysfs_remove_group(&pdev
->dev
.kobj
, &f71805f_group_optin
[i
]);
1479 sysfs_remove_group(&pdev
->dev
.kobj
, &f71805f_group_pwm_freq
);
1483 static int f71805f_remove(struct platform_device
*pdev
)
1485 struct f71805f_data
*data
= platform_get_drvdata(pdev
);
1488 hwmon_device_unregister(data
->hwmon_dev
);
1489 sysfs_remove_group(&pdev
->dev
.kobj
, &f71805f_group
);
1490 for (i
= 0; i
< 4; i
++)
1491 sysfs_remove_group(&pdev
->dev
.kobj
, &f71805f_group_optin
[i
]);
1492 sysfs_remove_group(&pdev
->dev
.kobj
, &f71805f_group_pwm_freq
);
1497 static struct platform_driver f71805f_driver
= {
1501 .probe
= f71805f_probe
,
1502 .remove
= f71805f_remove
,
1505 static int __init
f71805f_device_add(unsigned short address
,
1506 const struct f71805f_sio_data
*sio_data
)
1508 struct resource res
= {
1510 .end
= address
+ REGION_LENGTH
- 1,
1511 .flags
= IORESOURCE_IO
,
1515 pdev
= platform_device_alloc(DRVNAME
, address
);
1518 pr_err("Device allocation failed\n");
1522 res
.name
= pdev
->name
;
1523 err
= acpi_check_resource_conflict(&res
);
1525 goto exit_device_put
;
1527 err
= platform_device_add_resources(pdev
, &res
, 1);
1529 pr_err("Device resource addition failed (%d)\n", err
);
1530 goto exit_device_put
;
1533 err
= platform_device_add_data(pdev
, sio_data
,
1534 sizeof(struct f71805f_sio_data
));
1536 pr_err("Platform data allocation failed\n");
1537 goto exit_device_put
;
1540 err
= platform_device_add(pdev
);
1542 pr_err("Device addition failed (%d)\n", err
);
1543 goto exit_device_put
;
1549 platform_device_put(pdev
);
1554 static int __init
f71805f_find(int sioaddr
, unsigned short *address
,
1555 struct f71805f_sio_data
*sio_data
)
1560 static const char * const names
[] = {
1562 "F71872F/FG or F71806F/FG",
1565 err
= superio_enter(sioaddr
);
1570 devid
= superio_inw(sioaddr
, SIO_REG_MANID
);
1571 if (devid
!= SIO_FINTEK_ID
)
1574 devid
= force_id
? force_id
: superio_inw(sioaddr
, SIO_REG_DEVID
);
1576 case SIO_F71805F_ID
:
1577 sio_data
->kind
= f71805f
;
1579 case SIO_F71872F_ID
:
1580 sio_data
->kind
= f71872f
;
1581 sio_data
->fnsel1
= superio_inb(sioaddr
, SIO_REG_FNSEL1
);
1584 pr_info("Unsupported Fintek device, skipping\n");
1588 superio_select(sioaddr
, F71805F_LD_HWM
);
1589 if (!(superio_inb(sioaddr
, SIO_REG_ENABLE
) & 0x01)) {
1590 pr_warn("Device not activated, skipping\n");
1594 *address
= superio_inw(sioaddr
, SIO_REG_ADDR
);
1595 if (*address
== 0) {
1596 pr_warn("Base address not set, skipping\n");
1599 *address
&= ~(REGION_LENGTH
- 1); /* Ignore 3 LSB */
1602 pr_info("Found %s chip at %#x, revision %u\n",
1603 names
[sio_data
->kind
], *address
,
1604 superio_inb(sioaddr
, SIO_REG_DEVREV
));
1607 superio_exit(sioaddr
);
1611 static int __init
f71805f_init(void)
1614 unsigned short address
;
1615 struct f71805f_sio_data sio_data
;
1617 if (f71805f_find(0x2e, &address
, &sio_data
)
1618 && f71805f_find(0x4e, &address
, &sio_data
))
1621 err
= platform_driver_register(&f71805f_driver
);
1625 /* Sets global pdev as a side effect */
1626 err
= f71805f_device_add(address
, &sio_data
);
1633 platform_driver_unregister(&f71805f_driver
);
1638 static void __exit
f71805f_exit(void)
1640 platform_device_unregister(pdev
);
1641 platform_driver_unregister(&f71805f_driver
);
1644 MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>");
1645 MODULE_LICENSE("GPL");
1646 MODULE_DESCRIPTION("F71805F/F71872F hardware monitoring driver");
1648 module_init(f71805f_init
);
1649 module_exit(f71805f_exit
);