2 * f71805f.c - driver for the Fintek F71805F/FG and F71872F/FG Super-I/O
3 * chips integrated hardware monitoring features
4 * Copyright (C) 2005-2006 Jean Delvare <khali@linux-fr.org>
6 * The F71805F/FG is a LPC Super-I/O chip made by Fintek. It integrates
7 * complete hardware monitoring features: voltage, fan and temperature
8 * sensors, and manual and automatic fan speed control.
10 * The F71872F/FG is almost the same, with two more voltages monitored,
13 * The F71806F/FG is essentially the same as the F71872F/FG. It even has
14 * the same chip ID, so the driver can't differentiate between.
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License as published by
18 * the Free Software Foundation; either version 2 of the License, or
19 * (at your option) any later version.
21 * This program is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 * GNU General Public License for more details.
26 * You should have received a copy of the GNU General Public License
27 * along with this program; if not, write to the Free Software
28 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31 #include <linux/module.h>
32 #include <linux/init.h>
33 #include <linux/slab.h>
34 #include <linux/jiffies.h>
35 #include <linux/platform_device.h>
36 #include <linux/hwmon.h>
37 #include <linux/hwmon-sysfs.h>
38 #include <linux/err.h>
39 #include <linux/mutex.h>
40 #include <linux/sysfs.h>
41 #include <linux/ioport.h>
44 static unsigned short force_id
;
45 module_param(force_id
, ushort
, 0);
46 MODULE_PARM_DESC(force_id
, "Override the detected device ID");
48 static struct platform_device
*pdev
;
50 #define DRVNAME "f71805f"
51 enum kinds
{ f71805f
, f71872f
};
54 * Super-I/O constants and functions
57 #define F71805F_LD_HWM 0x04
59 #define SIO_REG_LDSEL 0x07 /* Logical device select */
60 #define SIO_REG_DEVID 0x20 /* Device ID (2 bytes) */
61 #define SIO_REG_DEVREV 0x22 /* Device revision */
62 #define SIO_REG_MANID 0x23 /* Fintek ID (2 bytes) */
63 #define SIO_REG_FNSEL1 0x29 /* Multi Function Select 1 (F71872F) */
64 #define SIO_REG_ENABLE 0x30 /* Logical device enable */
65 #define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */
67 #define SIO_FINTEK_ID 0x1934
68 #define SIO_F71805F_ID 0x0406
69 #define SIO_F71872F_ID 0x0341
72 superio_inb(int base
, int reg
)
79 superio_inw(int base
, int reg
)
83 val
= inb(base
+ 1) << 8;
90 superio_select(int base
, int ld
)
92 outb(SIO_REG_LDSEL
, base
);
97 superio_enter(int base
)
104 superio_exit(int base
)
113 #define REGION_LENGTH 8
114 #define ADDR_REG_OFFSET 5
115 #define DATA_REG_OFFSET 6
121 /* in nr from 0 to 10 (8-bit values) */
122 #define F71805F_REG_IN(nr) (0x10 + (nr))
123 #define F71805F_REG_IN_HIGH(nr) ((nr) < 10 ? 0x40 + 2 * (nr) : 0x2E)
124 #define F71805F_REG_IN_LOW(nr) ((nr) < 10 ? 0x41 + 2 * (nr) : 0x2F)
125 /* fan nr from 0 to 2 (12-bit values, two registers) */
126 #define F71805F_REG_FAN(nr) (0x20 + 2 * (nr))
127 #define F71805F_REG_FAN_LOW(nr) (0x28 + 2 * (nr))
128 #define F71805F_REG_FAN_TARGET(nr) (0x69 + 16 * (nr))
129 #define F71805F_REG_FAN_CTRL(nr) (0x60 + 16 * (nr))
130 #define F71805F_REG_PWM_FREQ(nr) (0x63 + 16 * (nr))
131 #define F71805F_REG_PWM_DUTY(nr) (0x6B + 16 * (nr))
132 /* temp nr from 0 to 2 (8-bit values) */
133 #define F71805F_REG_TEMP(nr) (0x1B + (nr))
134 #define F71805F_REG_TEMP_HIGH(nr) (0x54 + 2 * (nr))
135 #define F71805F_REG_TEMP_HYST(nr) (0x55 + 2 * (nr))
136 #define F71805F_REG_TEMP_MODE 0x01
137 /* pwm/fan pwmnr from 0 to 2, auto point apnr from 0 to 2 */
138 /* map Fintek numbers to our numbers as follows: 9->0, 5->1, 1->2 */
139 #define F71805F_REG_PWM_AUTO_POINT_TEMP(pwmnr, apnr) \
140 (0xA0 + 0x10 * (pwmnr) + (2 - (apnr)))
141 #define F71805F_REG_PWM_AUTO_POINT_FAN(pwmnr, apnr) \
142 (0xA4 + 0x10 * (pwmnr) + \
145 #define F71805F_REG_START 0x00
146 /* status nr from 0 to 2 */
147 #define F71805F_REG_STATUS(nr) (0x36 + (nr))
149 /* individual register bits */
150 #define FAN_CTRL_DC_MODE 0x10
151 #define FAN_CTRL_LATCH_FULL 0x08
152 #define FAN_CTRL_MODE_MASK 0x03
153 #define FAN_CTRL_MODE_SPEED 0x00
154 #define FAN_CTRL_MODE_TEMPERATURE 0x01
155 #define FAN_CTRL_MODE_MANUAL 0x02
158 * Data structures and manipulation thereof
161 struct f71805f_auto_point
{
166 struct f71805f_data
{
169 struct device
*hwmon_dev
;
171 struct mutex update_lock
;
172 char valid
; /* !=0 if following fields are valid */
173 unsigned long last_updated
; /* In jiffies */
174 unsigned long last_limits
; /* In jiffies */
176 /* Register values */
191 unsigned long alarms
;
192 struct f71805f_auto_point auto_points
[3];
195 struct f71805f_sio_data
{
200 static inline long in_from_reg(u8 reg
)
205 /* The 2 least significant bits are not used */
206 static inline u8
in_to_reg(long val
)
212 return (((val
+ 16) / 32) << 2);
215 /* in0 is downscaled by a factor 2 internally */
216 static inline long in0_from_reg(u8 reg
)
221 static inline u8
in0_to_reg(long val
)
227 return (((val
+ 32) / 64) << 2);
230 /* The 4 most significant bits are not used */
231 static inline long fan_from_reg(u16 reg
)
234 if (!reg
|| reg
== 0xfff)
236 return (1500000 / reg
);
239 static inline u16
fan_to_reg(long rpm
)
241 /* If the low limit is set below what the chip can measure,
242 store the largest possible 12-bit value in the registers,
243 so that no alarm will ever trigger. */
246 return (1500000 / rpm
);
249 static inline unsigned long pwm_freq_from_reg(u8 reg
)
251 unsigned long clock
= (reg
& 0x80) ? 48000000UL : 1000000UL;
256 return clock
/ (reg
<< 8);
259 static inline u8
pwm_freq_to_reg(unsigned long val
)
261 if (val
>= 187500) /* The highest we can do */
263 if (val
>= 1475) /* Use 48 MHz clock */
264 return 0x80 | (48000000UL / (val
<< 8));
265 if (val
< 31) /* The lowest we can do */
267 else /* Use 1 MHz clock */
268 return 1000000UL / (val
<< 8);
271 static inline int pwm_mode_from_reg(u8 reg
)
273 return !(reg
& FAN_CTRL_DC_MODE
);
276 static inline long temp_from_reg(u8 reg
)
281 static inline u8
temp_to_reg(long val
)
285 else if (val
> 1000 * 0xff)
287 return ((val
+ 500) / 1000);
294 /* Must be called with data->update_lock held, except during initialization */
295 static u8
f71805f_read8(struct f71805f_data
*data
, u8 reg
)
297 outb(reg
, data
->addr
+ ADDR_REG_OFFSET
);
298 return inb(data
->addr
+ DATA_REG_OFFSET
);
301 /* Must be called with data->update_lock held, except during initialization */
302 static void f71805f_write8(struct f71805f_data
*data
, u8 reg
, u8 val
)
304 outb(reg
, data
->addr
+ ADDR_REG_OFFSET
);
305 outb(val
, data
->addr
+ DATA_REG_OFFSET
);
308 /* It is important to read the MSB first, because doing so latches the
309 value of the LSB, so we are sure both bytes belong to the same value.
310 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
;
455 long val
= simple_strtol(buf
, NULL
, 10);
457 mutex_lock(&data
->update_lock
);
458 data
->in_high
[nr
] = in0_to_reg(val
);
459 f71805f_write8(data
, F71805F_REG_IN_HIGH(nr
), data
->in_high
[nr
]);
460 mutex_unlock(&data
->update_lock
);
465 static ssize_t
set_in0_min(struct device
*dev
, struct device_attribute
466 *devattr
, const char *buf
, size_t count
)
468 struct f71805f_data
*data
= dev_get_drvdata(dev
);
469 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
470 int nr
= attr
->index
;
471 long val
= simple_strtol(buf
, NULL
, 10);
473 mutex_lock(&data
->update_lock
);
474 data
->in_low
[nr
] = in0_to_reg(val
);
475 f71805f_write8(data
, F71805F_REG_IN_LOW(nr
), data
->in_low
[nr
]);
476 mutex_unlock(&data
->update_lock
);
481 static ssize_t
show_in(struct device
*dev
, struct device_attribute
*devattr
,
484 struct f71805f_data
*data
= f71805f_update_device(dev
);
485 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
486 int nr
= attr
->index
;
488 return sprintf(buf
, "%ld\n", in_from_reg(data
->in
[nr
]));
491 static ssize_t
show_in_max(struct device
*dev
, struct device_attribute
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_high
[nr
]));
501 static ssize_t
show_in_min(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_low
[nr
]));
511 static ssize_t
set_in_max(struct device
*dev
, struct device_attribute
512 *devattr
, const char *buf
, size_t count
)
514 struct f71805f_data
*data
= dev_get_drvdata(dev
);
515 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
516 int nr
= attr
->index
;
517 long val
= simple_strtol(buf
, NULL
, 10);
519 mutex_lock(&data
->update_lock
);
520 data
->in_high
[nr
] = in_to_reg(val
);
521 f71805f_write8(data
, F71805F_REG_IN_HIGH(nr
), data
->in_high
[nr
]);
522 mutex_unlock(&data
->update_lock
);
527 static ssize_t
set_in_min(struct device
*dev
, struct device_attribute
528 *devattr
, const char *buf
, size_t count
)
530 struct f71805f_data
*data
= dev_get_drvdata(dev
);
531 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
532 int nr
= attr
->index
;
533 long val
= simple_strtol(buf
, NULL
, 10);
535 mutex_lock(&data
->update_lock
);
536 data
->in_low
[nr
] = in_to_reg(val
);
537 f71805f_write8(data
, F71805F_REG_IN_LOW(nr
), data
->in_low
[nr
]);
538 mutex_unlock(&data
->update_lock
);
543 static ssize_t
show_fan(struct device
*dev
, struct device_attribute
*devattr
,
546 struct f71805f_data
*data
= f71805f_update_device(dev
);
547 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
548 int nr
= attr
->index
;
550 return sprintf(buf
, "%ld\n", fan_from_reg(data
->fan
[nr
]));
553 static ssize_t
show_fan_min(struct device
*dev
, struct device_attribute
556 struct f71805f_data
*data
= f71805f_update_device(dev
);
557 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
558 int nr
= attr
->index
;
560 return sprintf(buf
, "%ld\n", fan_from_reg(data
->fan_low
[nr
]));
563 static ssize_t
show_fan_target(struct device
*dev
, struct device_attribute
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_target
[nr
]));
573 static ssize_t
set_fan_min(struct device
*dev
, struct device_attribute
574 *devattr
, const char *buf
, size_t count
)
576 struct f71805f_data
*data
= dev_get_drvdata(dev
);
577 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
578 int nr
= attr
->index
;
579 long val
= simple_strtol(buf
, NULL
, 10);
581 mutex_lock(&data
->update_lock
);
582 data
->fan_low
[nr
] = fan_to_reg(val
);
583 f71805f_write16(data
, F71805F_REG_FAN_LOW(nr
), data
->fan_low
[nr
]);
584 mutex_unlock(&data
->update_lock
);
589 static ssize_t
set_fan_target(struct device
*dev
, struct device_attribute
590 *devattr
, const char *buf
, size_t count
)
592 struct f71805f_data
*data
= dev_get_drvdata(dev
);
593 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
594 int nr
= attr
->index
;
595 long val
= simple_strtol(buf
, NULL
, 10);
597 mutex_lock(&data
->update_lock
);
598 data
->fan_target
[nr
] = fan_to_reg(val
);
599 f71805f_write16(data
, F71805F_REG_FAN_TARGET(nr
),
600 data
->fan_target
[nr
]);
601 mutex_unlock(&data
->update_lock
);
606 static ssize_t
show_pwm(struct device
*dev
, struct device_attribute
*devattr
,
609 struct f71805f_data
*data
= f71805f_update_device(dev
);
610 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
611 int nr
= attr
->index
;
613 return sprintf(buf
, "%d\n", (int)data
->pwm
[nr
]);
616 static ssize_t
show_pwm_enable(struct device
*dev
, struct device_attribute
619 struct f71805f_data
*data
= f71805f_update_device(dev
);
620 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
621 int nr
= attr
->index
;
624 switch (data
->fan_ctrl
[nr
] & FAN_CTRL_MODE_MASK
) {
625 case FAN_CTRL_MODE_SPEED
:
628 case FAN_CTRL_MODE_TEMPERATURE
:
631 default: /* MANUAL */
635 return sprintf(buf
, "%d\n", mode
);
638 static ssize_t
show_pwm_freq(struct device
*dev
, struct device_attribute
641 struct f71805f_data
*data
= f71805f_update_device(dev
);
642 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
643 int nr
= attr
->index
;
645 return sprintf(buf
, "%lu\n", pwm_freq_from_reg(data
->pwm_freq
[nr
]));
648 static ssize_t
show_pwm_mode(struct device
*dev
, struct device_attribute
651 struct f71805f_data
*data
= f71805f_update_device(dev
);
652 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
653 int nr
= attr
->index
;
655 return sprintf(buf
, "%d\n", pwm_mode_from_reg(data
->fan_ctrl
[nr
]));
658 static ssize_t
set_pwm(struct device
*dev
, struct device_attribute
*devattr
,
659 const char *buf
, size_t count
)
661 struct f71805f_data
*data
= dev_get_drvdata(dev
);
662 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
663 int nr
= attr
->index
;
664 unsigned long val
= simple_strtoul(buf
, NULL
, 10);
669 mutex_lock(&data
->update_lock
);
671 f71805f_write8(data
, F71805F_REG_PWM_DUTY(nr
), data
->pwm
[nr
]);
672 mutex_unlock(&data
->update_lock
);
677 static struct attribute
*f71805f_attr_pwm
[];
679 static ssize_t
set_pwm_enable(struct device
*dev
, struct device_attribute
680 *devattr
, const char *buf
, size_t count
)
682 struct f71805f_data
*data
= dev_get_drvdata(dev
);
683 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
684 int nr
= attr
->index
;
685 unsigned long val
= simple_strtoul(buf
, NULL
, 10);
688 if (val
< 1 || val
> 3)
691 if (val
> 1) { /* Automatic mode, user can't set PWM value */
692 if (sysfs_chmod_file(&dev
->kobj
, f71805f_attr_pwm
[nr
],
694 dev_dbg(dev
, "chmod -w pwm%d failed\n", nr
+ 1);
697 mutex_lock(&data
->update_lock
);
698 reg
= f71805f_read8(data
, F71805F_REG_FAN_CTRL(nr
))
699 & ~FAN_CTRL_MODE_MASK
;
702 reg
|= FAN_CTRL_MODE_MANUAL
;
705 reg
|= FAN_CTRL_MODE_TEMPERATURE
;
708 reg
|= FAN_CTRL_MODE_SPEED
;
711 data
->fan_ctrl
[nr
] = reg
;
712 f71805f_write8(data
, F71805F_REG_FAN_CTRL(nr
), reg
);
713 mutex_unlock(&data
->update_lock
);
715 if (val
== 1) { /* Manual mode, user can set PWM value */
716 if (sysfs_chmod_file(&dev
->kobj
, f71805f_attr_pwm
[nr
],
718 dev_dbg(dev
, "chmod +w pwm%d failed\n", nr
+ 1);
724 static ssize_t
set_pwm_freq(struct device
*dev
, struct device_attribute
725 *devattr
, const char *buf
, size_t count
)
727 struct f71805f_data
*data
= dev_get_drvdata(dev
);
728 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
729 int nr
= attr
->index
;
730 unsigned long val
= simple_strtoul(buf
, NULL
, 10);
732 mutex_lock(&data
->update_lock
);
733 data
->pwm_freq
[nr
] = pwm_freq_to_reg(val
);
734 f71805f_write8(data
, F71805F_REG_PWM_FREQ(nr
), data
->pwm_freq
[nr
]);
735 mutex_unlock(&data
->update_lock
);
740 static ssize_t
show_pwm_auto_point_temp(struct device
*dev
,
741 struct device_attribute
*devattr
,
744 struct f71805f_data
*data
= dev_get_drvdata(dev
);
745 struct sensor_device_attribute_2
*attr
= to_sensor_dev_attr_2(devattr
);
746 int pwmnr
= attr
->nr
;
747 int apnr
= attr
->index
;
749 return sprintf(buf
, "%ld\n",
750 temp_from_reg(data
->auto_points
[pwmnr
].temp
[apnr
]));
753 static ssize_t
set_pwm_auto_point_temp(struct device
*dev
,
754 struct device_attribute
*devattr
,
755 const char* buf
, size_t count
)
757 struct f71805f_data
*data
= dev_get_drvdata(dev
);
758 struct sensor_device_attribute_2
*attr
= to_sensor_dev_attr_2(devattr
);
759 int pwmnr
= attr
->nr
;
760 int apnr
= attr
->index
;
761 unsigned long val
= simple_strtol(buf
, NULL
, 10);
763 mutex_lock(&data
->update_lock
);
764 data
->auto_points
[pwmnr
].temp
[apnr
] = temp_to_reg(val
);
765 f71805f_write8(data
, F71805F_REG_PWM_AUTO_POINT_TEMP(pwmnr
, apnr
),
766 data
->auto_points
[pwmnr
].temp
[apnr
]);
767 mutex_unlock(&data
->update_lock
);
772 static ssize_t
show_pwm_auto_point_fan(struct device
*dev
,
773 struct device_attribute
*devattr
,
776 struct f71805f_data
*data
= dev_get_drvdata(dev
);
777 struct sensor_device_attribute_2
*attr
= to_sensor_dev_attr_2(devattr
);
778 int pwmnr
= attr
->nr
;
779 int apnr
= attr
->index
;
781 return sprintf(buf
, "%ld\n",
782 fan_from_reg(data
->auto_points
[pwmnr
].fan
[apnr
]));
785 static ssize_t
set_pwm_auto_point_fan(struct device
*dev
,
786 struct device_attribute
*devattr
,
787 const char* buf
, size_t count
)
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
;
793 unsigned long val
= simple_strtoul(buf
, NULL
, 10);
795 mutex_lock(&data
->update_lock
);
796 data
->auto_points
[pwmnr
].fan
[apnr
] = fan_to_reg(val
);
797 f71805f_write16(data
, F71805F_REG_PWM_AUTO_POINT_FAN(pwmnr
, apnr
),
798 data
->auto_points
[pwmnr
].fan
[apnr
]);
799 mutex_unlock(&data
->update_lock
);
804 static ssize_t
show_temp(struct device
*dev
, struct device_attribute
*devattr
,
807 struct f71805f_data
*data
= f71805f_update_device(dev
);
808 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
809 int nr
= attr
->index
;
811 return sprintf(buf
, "%ld\n", temp_from_reg(data
->temp
[nr
]));
814 static ssize_t
show_temp_max(struct device
*dev
, struct device_attribute
817 struct f71805f_data
*data
= f71805f_update_device(dev
);
818 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
819 int nr
= attr
->index
;
821 return sprintf(buf
, "%ld\n", temp_from_reg(data
->temp_high
[nr
]));
824 static ssize_t
show_temp_hyst(struct device
*dev
, struct device_attribute
827 struct f71805f_data
*data
= f71805f_update_device(dev
);
828 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
829 int nr
= attr
->index
;
831 return sprintf(buf
, "%ld\n", temp_from_reg(data
->temp_hyst
[nr
]));
834 static ssize_t
show_temp_type(struct device
*dev
, struct device_attribute
837 struct f71805f_data
*data
= f71805f_update_device(dev
);
838 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
839 int nr
= attr
->index
;
841 /* 3 is diode, 4 is thermistor */
842 return sprintf(buf
, "%u\n", (data
->temp_mode
& (1 << nr
)) ? 3 : 4);
845 static ssize_t
set_temp_max(struct device
*dev
, struct device_attribute
846 *devattr
, const char *buf
, size_t count
)
848 struct f71805f_data
*data
= dev_get_drvdata(dev
);
849 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
850 int nr
= attr
->index
;
851 long val
= simple_strtol(buf
, NULL
, 10);
853 mutex_lock(&data
->update_lock
);
854 data
->temp_high
[nr
] = temp_to_reg(val
);
855 f71805f_write8(data
, F71805F_REG_TEMP_HIGH(nr
), data
->temp_high
[nr
]);
856 mutex_unlock(&data
->update_lock
);
861 static ssize_t
set_temp_hyst(struct device
*dev
, struct device_attribute
862 *devattr
, const char *buf
, size_t count
)
864 struct f71805f_data
*data
= dev_get_drvdata(dev
);
865 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
866 int nr
= attr
->index
;
867 long val
= simple_strtol(buf
, NULL
, 10);
869 mutex_lock(&data
->update_lock
);
870 data
->temp_hyst
[nr
] = temp_to_reg(val
);
871 f71805f_write8(data
, F71805F_REG_TEMP_HYST(nr
), data
->temp_hyst
[nr
]);
872 mutex_unlock(&data
->update_lock
);
877 static ssize_t
show_alarms_in(struct device
*dev
, struct device_attribute
880 struct f71805f_data
*data
= f71805f_update_device(dev
);
882 return sprintf(buf
, "%lu\n", data
->alarms
& 0x7ff);
885 static ssize_t
show_alarms_fan(struct device
*dev
, struct device_attribute
888 struct f71805f_data
*data
= f71805f_update_device(dev
);
890 return sprintf(buf
, "%lu\n", (data
->alarms
>> 16) & 0x07);
893 static ssize_t
show_alarms_temp(struct device
*dev
, struct device_attribute
896 struct f71805f_data
*data
= f71805f_update_device(dev
);
898 return sprintf(buf
, "%lu\n", (data
->alarms
>> 11) & 0x07);
901 static ssize_t
show_alarm(struct device
*dev
, struct device_attribute
904 struct f71805f_data
*data
= f71805f_update_device(dev
);
905 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
906 int bitnr
= attr
->index
;
908 return sprintf(buf
, "%lu\n", (data
->alarms
>> bitnr
) & 1);
911 static ssize_t
show_name(struct device
*dev
, struct device_attribute
914 struct f71805f_data
*data
= dev_get_drvdata(dev
);
916 return sprintf(buf
, "%s\n", data
->name
);
919 static SENSOR_DEVICE_ATTR(in0_input
, S_IRUGO
, show_in0
, NULL
, 0);
920 static SENSOR_DEVICE_ATTR(in0_max
, S_IRUGO
| S_IWUSR
,
921 show_in0_max
, set_in0_max
, 0);
922 static SENSOR_DEVICE_ATTR(in0_min
, S_IRUGO
| S_IWUSR
,
923 show_in0_min
, set_in0_min
, 0);
924 static SENSOR_DEVICE_ATTR(in1_input
, S_IRUGO
, show_in
, NULL
, 1);
925 static SENSOR_DEVICE_ATTR(in1_max
, S_IRUGO
| S_IWUSR
,
926 show_in_max
, set_in_max
, 1);
927 static SENSOR_DEVICE_ATTR(in1_min
, S_IRUGO
| S_IWUSR
,
928 show_in_min
, set_in_min
, 1);
929 static SENSOR_DEVICE_ATTR(in2_input
, S_IRUGO
, show_in
, NULL
, 2);
930 static SENSOR_DEVICE_ATTR(in2_max
, S_IRUGO
| S_IWUSR
,
931 show_in_max
, set_in_max
, 2);
932 static SENSOR_DEVICE_ATTR(in2_min
, S_IRUGO
| S_IWUSR
,
933 show_in_min
, set_in_min
, 2);
934 static SENSOR_DEVICE_ATTR(in3_input
, S_IRUGO
, show_in
, NULL
, 3);
935 static SENSOR_DEVICE_ATTR(in3_max
, S_IRUGO
| S_IWUSR
,
936 show_in_max
, set_in_max
, 3);
937 static SENSOR_DEVICE_ATTR(in3_min
, S_IRUGO
| S_IWUSR
,
938 show_in_min
, set_in_min
, 3);
939 static SENSOR_DEVICE_ATTR(in4_input
, S_IRUGO
, show_in
, NULL
, 4);
940 static SENSOR_DEVICE_ATTR(in4_max
, S_IRUGO
| S_IWUSR
,
941 show_in_max
, set_in_max
, 4);
942 static SENSOR_DEVICE_ATTR(in4_min
, S_IRUGO
| S_IWUSR
,
943 show_in_min
, set_in_min
, 4);
944 static SENSOR_DEVICE_ATTR(in5_input
, S_IRUGO
, show_in
, NULL
, 5);
945 static SENSOR_DEVICE_ATTR(in5_max
, S_IRUGO
| S_IWUSR
,
946 show_in_max
, set_in_max
, 5);
947 static SENSOR_DEVICE_ATTR(in5_min
, S_IRUGO
| S_IWUSR
,
948 show_in_min
, set_in_min
, 5);
949 static SENSOR_DEVICE_ATTR(in6_input
, S_IRUGO
, show_in
, NULL
, 6);
950 static SENSOR_DEVICE_ATTR(in6_max
, S_IRUGO
| S_IWUSR
,
951 show_in_max
, set_in_max
, 6);
952 static SENSOR_DEVICE_ATTR(in6_min
, S_IRUGO
| S_IWUSR
,
953 show_in_min
, set_in_min
, 6);
954 static SENSOR_DEVICE_ATTR(in7_input
, S_IRUGO
, show_in
, NULL
, 7);
955 static SENSOR_DEVICE_ATTR(in7_max
, S_IRUGO
| S_IWUSR
,
956 show_in_max
, set_in_max
, 7);
957 static SENSOR_DEVICE_ATTR(in7_min
, S_IRUGO
| S_IWUSR
,
958 show_in_min
, set_in_min
, 7);
959 static SENSOR_DEVICE_ATTR(in8_input
, S_IRUGO
, show_in
, NULL
, 8);
960 static SENSOR_DEVICE_ATTR(in8_max
, S_IRUGO
| S_IWUSR
,
961 show_in_max
, set_in_max
, 8);
962 static SENSOR_DEVICE_ATTR(in8_min
, S_IRUGO
| S_IWUSR
,
963 show_in_min
, set_in_min
, 8);
964 static SENSOR_DEVICE_ATTR(in9_input
, S_IRUGO
, show_in0
, NULL
, 9);
965 static SENSOR_DEVICE_ATTR(in9_max
, S_IRUGO
| S_IWUSR
,
966 show_in0_max
, set_in0_max
, 9);
967 static SENSOR_DEVICE_ATTR(in9_min
, S_IRUGO
| S_IWUSR
,
968 show_in0_min
, set_in0_min
, 9);
969 static SENSOR_DEVICE_ATTR(in10_input
, S_IRUGO
, show_in0
, NULL
, 10);
970 static SENSOR_DEVICE_ATTR(in10_max
, S_IRUGO
| S_IWUSR
,
971 show_in0_max
, set_in0_max
, 10);
972 static SENSOR_DEVICE_ATTR(in10_min
, S_IRUGO
| S_IWUSR
,
973 show_in0_min
, set_in0_min
, 10);
975 static SENSOR_DEVICE_ATTR(fan1_input
, S_IRUGO
, show_fan
, NULL
, 0);
976 static SENSOR_DEVICE_ATTR(fan1_min
, S_IRUGO
| S_IWUSR
,
977 show_fan_min
, set_fan_min
, 0);
978 static SENSOR_DEVICE_ATTR(fan1_target
, S_IRUGO
| S_IWUSR
,
979 show_fan_target
, set_fan_target
, 0);
980 static SENSOR_DEVICE_ATTR(fan2_input
, S_IRUGO
, show_fan
, NULL
, 1);
981 static SENSOR_DEVICE_ATTR(fan2_min
, S_IRUGO
| S_IWUSR
,
982 show_fan_min
, set_fan_min
, 1);
983 static SENSOR_DEVICE_ATTR(fan2_target
, S_IRUGO
| S_IWUSR
,
984 show_fan_target
, set_fan_target
, 1);
985 static SENSOR_DEVICE_ATTR(fan3_input
, S_IRUGO
, show_fan
, NULL
, 2);
986 static SENSOR_DEVICE_ATTR(fan3_min
, S_IRUGO
| S_IWUSR
,
987 show_fan_min
, set_fan_min
, 2);
988 static SENSOR_DEVICE_ATTR(fan3_target
, S_IRUGO
| S_IWUSR
,
989 show_fan_target
, set_fan_target
, 2);
991 static SENSOR_DEVICE_ATTR(temp1_input
, S_IRUGO
, show_temp
, NULL
, 0);
992 static SENSOR_DEVICE_ATTR(temp1_max
, S_IRUGO
| S_IWUSR
,
993 show_temp_max
, set_temp_max
, 0);
994 static SENSOR_DEVICE_ATTR(temp1_max_hyst
, S_IRUGO
| S_IWUSR
,
995 show_temp_hyst
, set_temp_hyst
, 0);
996 static SENSOR_DEVICE_ATTR(temp1_type
, S_IRUGO
, show_temp_type
, NULL
, 0);
997 static SENSOR_DEVICE_ATTR(temp2_input
, S_IRUGO
, show_temp
, NULL
, 1);
998 static SENSOR_DEVICE_ATTR(temp2_max
, S_IRUGO
| S_IWUSR
,
999 show_temp_max
, set_temp_max
, 1);
1000 static SENSOR_DEVICE_ATTR(temp2_max_hyst
, S_IRUGO
| S_IWUSR
,
1001 show_temp_hyst
, set_temp_hyst
, 1);
1002 static SENSOR_DEVICE_ATTR(temp2_type
, S_IRUGO
, show_temp_type
, NULL
, 1);
1003 static SENSOR_DEVICE_ATTR(temp3_input
, S_IRUGO
, show_temp
, NULL
, 2);
1004 static SENSOR_DEVICE_ATTR(temp3_max
, S_IRUGO
| S_IWUSR
,
1005 show_temp_max
, set_temp_max
, 2);
1006 static SENSOR_DEVICE_ATTR(temp3_max_hyst
, S_IRUGO
| S_IWUSR
,
1007 show_temp_hyst
, set_temp_hyst
, 2);
1008 static SENSOR_DEVICE_ATTR(temp3_type
, S_IRUGO
, show_temp_type
, NULL
, 2);
1010 /* pwm (value) files are created read-only, write permission is
1011 then added or removed dynamically as needed */
1012 static SENSOR_DEVICE_ATTR(pwm1
, S_IRUGO
, show_pwm
, set_pwm
, 0);
1013 static SENSOR_DEVICE_ATTR(pwm1_enable
, S_IRUGO
| S_IWUSR
,
1014 show_pwm_enable
, set_pwm_enable
, 0);
1015 static SENSOR_DEVICE_ATTR(pwm1_freq
, S_IRUGO
| S_IWUSR
,
1016 show_pwm_freq
, set_pwm_freq
, 0);
1017 static SENSOR_DEVICE_ATTR(pwm1_mode
, S_IRUGO
, show_pwm_mode
, NULL
, 0);
1018 static SENSOR_DEVICE_ATTR(pwm2
, S_IRUGO
, show_pwm
, set_pwm
, 1);
1019 static SENSOR_DEVICE_ATTR(pwm2_enable
, S_IRUGO
| S_IWUSR
,
1020 show_pwm_enable
, set_pwm_enable
, 1);
1021 static SENSOR_DEVICE_ATTR(pwm2_freq
, S_IRUGO
| S_IWUSR
,
1022 show_pwm_freq
, set_pwm_freq
, 1);
1023 static SENSOR_DEVICE_ATTR(pwm2_mode
, S_IRUGO
, show_pwm_mode
, NULL
, 1);
1024 static SENSOR_DEVICE_ATTR(pwm3
, S_IRUGO
, show_pwm
, set_pwm
, 2);
1025 static SENSOR_DEVICE_ATTR(pwm3_enable
, S_IRUGO
| S_IWUSR
,
1026 show_pwm_enable
, set_pwm_enable
, 2);
1027 static SENSOR_DEVICE_ATTR(pwm3_freq
, S_IRUGO
| S_IWUSR
,
1028 show_pwm_freq
, set_pwm_freq
, 2);
1029 static SENSOR_DEVICE_ATTR(pwm3_mode
, S_IRUGO
, show_pwm_mode
, NULL
, 2);
1031 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_temp
, S_IRUGO
| S_IWUSR
,
1032 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1034 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_fan
, S_IRUGO
| S_IWUSR
,
1035 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1037 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point2_temp
, S_IRUGO
| S_IWUSR
,
1038 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1040 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point2_fan
, S_IRUGO
| S_IWUSR
,
1041 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1043 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point3_temp
, S_IRUGO
| S_IWUSR
,
1044 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1046 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point3_fan
, S_IRUGO
| S_IWUSR
,
1047 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1050 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_temp
, S_IRUGO
| S_IWUSR
,
1051 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1053 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_fan
, S_IRUGO
| S_IWUSR
,
1054 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1056 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point2_temp
, S_IRUGO
| S_IWUSR
,
1057 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1059 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point2_fan
, S_IRUGO
| S_IWUSR
,
1060 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1062 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point3_temp
, S_IRUGO
| S_IWUSR
,
1063 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1065 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point3_fan
, S_IRUGO
| S_IWUSR
,
1066 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1069 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_temp
, S_IRUGO
| S_IWUSR
,
1070 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1072 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_fan
, S_IRUGO
| S_IWUSR
,
1073 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1075 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point2_temp
, S_IRUGO
| S_IWUSR
,
1076 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1078 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point2_fan
, S_IRUGO
| S_IWUSR
,
1079 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1081 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point3_temp
, S_IRUGO
| S_IWUSR
,
1082 show_pwm_auto_point_temp
, set_pwm_auto_point_temp
,
1084 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point3_fan
, S_IRUGO
| S_IWUSR
,
1085 show_pwm_auto_point_fan
, set_pwm_auto_point_fan
,
1088 static SENSOR_DEVICE_ATTR(in0_alarm
, S_IRUGO
, show_alarm
, NULL
, 0);
1089 static SENSOR_DEVICE_ATTR(in1_alarm
, S_IRUGO
, show_alarm
, NULL
, 1);
1090 static SENSOR_DEVICE_ATTR(in2_alarm
, S_IRUGO
, show_alarm
, NULL
, 2);
1091 static SENSOR_DEVICE_ATTR(in3_alarm
, S_IRUGO
, show_alarm
, NULL
, 3);
1092 static SENSOR_DEVICE_ATTR(in4_alarm
, S_IRUGO
, show_alarm
, NULL
, 4);
1093 static SENSOR_DEVICE_ATTR(in5_alarm
, S_IRUGO
, show_alarm
, NULL
, 5);
1094 static SENSOR_DEVICE_ATTR(in6_alarm
, S_IRUGO
, show_alarm
, NULL
, 6);
1095 static SENSOR_DEVICE_ATTR(in7_alarm
, S_IRUGO
, show_alarm
, NULL
, 7);
1096 static SENSOR_DEVICE_ATTR(in8_alarm
, S_IRUGO
, show_alarm
, NULL
, 8);
1097 static SENSOR_DEVICE_ATTR(in9_alarm
, S_IRUGO
, show_alarm
, NULL
, 9);
1098 static SENSOR_DEVICE_ATTR(in10_alarm
, S_IRUGO
, show_alarm
, NULL
, 10);
1099 static SENSOR_DEVICE_ATTR(temp1_alarm
, S_IRUGO
, show_alarm
, NULL
, 11);
1100 static SENSOR_DEVICE_ATTR(temp2_alarm
, S_IRUGO
, show_alarm
, NULL
, 12);
1101 static SENSOR_DEVICE_ATTR(temp3_alarm
, S_IRUGO
, show_alarm
, NULL
, 13);
1102 static SENSOR_DEVICE_ATTR(fan1_alarm
, S_IRUGO
, show_alarm
, NULL
, 16);
1103 static SENSOR_DEVICE_ATTR(fan2_alarm
, S_IRUGO
, show_alarm
, NULL
, 17);
1104 static SENSOR_DEVICE_ATTR(fan3_alarm
, S_IRUGO
, show_alarm
, NULL
, 18);
1105 static DEVICE_ATTR(alarms_in
, S_IRUGO
, show_alarms_in
, NULL
);
1106 static DEVICE_ATTR(alarms_fan
, S_IRUGO
, show_alarms_fan
, NULL
);
1107 static DEVICE_ATTR(alarms_temp
, S_IRUGO
, show_alarms_temp
, NULL
);
1109 static DEVICE_ATTR(name
, S_IRUGO
, show_name
, NULL
);
1111 static struct attribute
*f71805f_attributes
[] = {
1112 &sensor_dev_attr_in0_input
.dev_attr
.attr
,
1113 &sensor_dev_attr_in0_max
.dev_attr
.attr
,
1114 &sensor_dev_attr_in0_min
.dev_attr
.attr
,
1115 &sensor_dev_attr_in1_input
.dev_attr
.attr
,
1116 &sensor_dev_attr_in1_max
.dev_attr
.attr
,
1117 &sensor_dev_attr_in1_min
.dev_attr
.attr
,
1118 &sensor_dev_attr_in2_input
.dev_attr
.attr
,
1119 &sensor_dev_attr_in2_max
.dev_attr
.attr
,
1120 &sensor_dev_attr_in2_min
.dev_attr
.attr
,
1121 &sensor_dev_attr_in3_input
.dev_attr
.attr
,
1122 &sensor_dev_attr_in3_max
.dev_attr
.attr
,
1123 &sensor_dev_attr_in3_min
.dev_attr
.attr
,
1124 &sensor_dev_attr_in5_input
.dev_attr
.attr
,
1125 &sensor_dev_attr_in5_max
.dev_attr
.attr
,
1126 &sensor_dev_attr_in5_min
.dev_attr
.attr
,
1127 &sensor_dev_attr_in6_input
.dev_attr
.attr
,
1128 &sensor_dev_attr_in6_max
.dev_attr
.attr
,
1129 &sensor_dev_attr_in6_min
.dev_attr
.attr
,
1130 &sensor_dev_attr_in7_input
.dev_attr
.attr
,
1131 &sensor_dev_attr_in7_max
.dev_attr
.attr
,
1132 &sensor_dev_attr_in7_min
.dev_attr
.attr
,
1134 &sensor_dev_attr_fan1_input
.dev_attr
.attr
,
1135 &sensor_dev_attr_fan1_min
.dev_attr
.attr
,
1136 &sensor_dev_attr_fan1_alarm
.dev_attr
.attr
,
1137 &sensor_dev_attr_fan1_target
.dev_attr
.attr
,
1138 &sensor_dev_attr_fan2_input
.dev_attr
.attr
,
1139 &sensor_dev_attr_fan2_min
.dev_attr
.attr
,
1140 &sensor_dev_attr_fan2_alarm
.dev_attr
.attr
,
1141 &sensor_dev_attr_fan2_target
.dev_attr
.attr
,
1142 &sensor_dev_attr_fan3_input
.dev_attr
.attr
,
1143 &sensor_dev_attr_fan3_min
.dev_attr
.attr
,
1144 &sensor_dev_attr_fan3_alarm
.dev_attr
.attr
,
1145 &sensor_dev_attr_fan3_target
.dev_attr
.attr
,
1147 &sensor_dev_attr_pwm1
.dev_attr
.attr
,
1148 &sensor_dev_attr_pwm1_enable
.dev_attr
.attr
,
1149 &sensor_dev_attr_pwm1_mode
.dev_attr
.attr
,
1150 &sensor_dev_attr_pwm2
.dev_attr
.attr
,
1151 &sensor_dev_attr_pwm2_enable
.dev_attr
.attr
,
1152 &sensor_dev_attr_pwm2_mode
.dev_attr
.attr
,
1153 &sensor_dev_attr_pwm3
.dev_attr
.attr
,
1154 &sensor_dev_attr_pwm3_enable
.dev_attr
.attr
,
1155 &sensor_dev_attr_pwm3_mode
.dev_attr
.attr
,
1157 &sensor_dev_attr_temp1_input
.dev_attr
.attr
,
1158 &sensor_dev_attr_temp1_max
.dev_attr
.attr
,
1159 &sensor_dev_attr_temp1_max_hyst
.dev_attr
.attr
,
1160 &sensor_dev_attr_temp1_type
.dev_attr
.attr
,
1161 &sensor_dev_attr_temp2_input
.dev_attr
.attr
,
1162 &sensor_dev_attr_temp2_max
.dev_attr
.attr
,
1163 &sensor_dev_attr_temp2_max_hyst
.dev_attr
.attr
,
1164 &sensor_dev_attr_temp2_type
.dev_attr
.attr
,
1165 &sensor_dev_attr_temp3_input
.dev_attr
.attr
,
1166 &sensor_dev_attr_temp3_max
.dev_attr
.attr
,
1167 &sensor_dev_attr_temp3_max_hyst
.dev_attr
.attr
,
1168 &sensor_dev_attr_temp3_type
.dev_attr
.attr
,
1170 &sensor_dev_attr_pwm1_auto_point1_temp
.dev_attr
.attr
,
1171 &sensor_dev_attr_pwm1_auto_point1_fan
.dev_attr
.attr
,
1172 &sensor_dev_attr_pwm1_auto_point2_temp
.dev_attr
.attr
,
1173 &sensor_dev_attr_pwm1_auto_point2_fan
.dev_attr
.attr
,
1174 &sensor_dev_attr_pwm1_auto_point3_temp
.dev_attr
.attr
,
1175 &sensor_dev_attr_pwm1_auto_point3_fan
.dev_attr
.attr
,
1176 &sensor_dev_attr_pwm2_auto_point1_temp
.dev_attr
.attr
,
1177 &sensor_dev_attr_pwm2_auto_point1_fan
.dev_attr
.attr
,
1178 &sensor_dev_attr_pwm2_auto_point2_temp
.dev_attr
.attr
,
1179 &sensor_dev_attr_pwm2_auto_point2_fan
.dev_attr
.attr
,
1180 &sensor_dev_attr_pwm2_auto_point3_temp
.dev_attr
.attr
,
1181 &sensor_dev_attr_pwm2_auto_point3_fan
.dev_attr
.attr
,
1182 &sensor_dev_attr_pwm3_auto_point1_temp
.dev_attr
.attr
,
1183 &sensor_dev_attr_pwm3_auto_point1_fan
.dev_attr
.attr
,
1184 &sensor_dev_attr_pwm3_auto_point2_temp
.dev_attr
.attr
,
1185 &sensor_dev_attr_pwm3_auto_point2_fan
.dev_attr
.attr
,
1186 &sensor_dev_attr_pwm3_auto_point3_temp
.dev_attr
.attr
,
1187 &sensor_dev_attr_pwm3_auto_point3_fan
.dev_attr
.attr
,
1189 &sensor_dev_attr_in0_alarm
.dev_attr
.attr
,
1190 &sensor_dev_attr_in1_alarm
.dev_attr
.attr
,
1191 &sensor_dev_attr_in2_alarm
.dev_attr
.attr
,
1192 &sensor_dev_attr_in3_alarm
.dev_attr
.attr
,
1193 &sensor_dev_attr_in5_alarm
.dev_attr
.attr
,
1194 &sensor_dev_attr_in6_alarm
.dev_attr
.attr
,
1195 &sensor_dev_attr_in7_alarm
.dev_attr
.attr
,
1196 &dev_attr_alarms_in
.attr
,
1197 &sensor_dev_attr_temp1_alarm
.dev_attr
.attr
,
1198 &sensor_dev_attr_temp2_alarm
.dev_attr
.attr
,
1199 &sensor_dev_attr_temp3_alarm
.dev_attr
.attr
,
1200 &dev_attr_alarms_temp
.attr
,
1201 &dev_attr_alarms_fan
.attr
,
1203 &dev_attr_name
.attr
,
1207 static const struct attribute_group f71805f_group
= {
1208 .attrs
= f71805f_attributes
,
1211 static struct attribute
*f71805f_attributes_optin
[4][5] = {
1213 &sensor_dev_attr_in4_input
.dev_attr
.attr
,
1214 &sensor_dev_attr_in4_max
.dev_attr
.attr
,
1215 &sensor_dev_attr_in4_min
.dev_attr
.attr
,
1216 &sensor_dev_attr_in4_alarm
.dev_attr
.attr
,
1219 &sensor_dev_attr_in8_input
.dev_attr
.attr
,
1220 &sensor_dev_attr_in8_max
.dev_attr
.attr
,
1221 &sensor_dev_attr_in8_min
.dev_attr
.attr
,
1222 &sensor_dev_attr_in8_alarm
.dev_attr
.attr
,
1225 &sensor_dev_attr_in9_input
.dev_attr
.attr
,
1226 &sensor_dev_attr_in9_max
.dev_attr
.attr
,
1227 &sensor_dev_attr_in9_min
.dev_attr
.attr
,
1228 &sensor_dev_attr_in9_alarm
.dev_attr
.attr
,
1231 &sensor_dev_attr_in10_input
.dev_attr
.attr
,
1232 &sensor_dev_attr_in10_max
.dev_attr
.attr
,
1233 &sensor_dev_attr_in10_min
.dev_attr
.attr
,
1234 &sensor_dev_attr_in10_alarm
.dev_attr
.attr
,
1239 static const struct attribute_group f71805f_group_optin
[4] = {
1240 { .attrs
= f71805f_attributes_optin
[0] },
1241 { .attrs
= f71805f_attributes_optin
[1] },
1242 { .attrs
= f71805f_attributes_optin
[2] },
1243 { .attrs
= f71805f_attributes_optin
[3] },
1246 /* We don't include pwm_freq files in the arrays above, because they must be
1247 created conditionally (only if pwm_mode is 1 == PWM) */
1248 static struct attribute
*f71805f_attributes_pwm_freq
[] = {
1249 &sensor_dev_attr_pwm1_freq
.dev_attr
.attr
,
1250 &sensor_dev_attr_pwm2_freq
.dev_attr
.attr
,
1251 &sensor_dev_attr_pwm3_freq
.dev_attr
.attr
,
1255 static const struct attribute_group f71805f_group_pwm_freq
= {
1256 .attrs
= f71805f_attributes_pwm_freq
,
1259 /* We also need an indexed access to pwmN files to toggle writability */
1260 static struct attribute
*f71805f_attr_pwm
[] = {
1261 &sensor_dev_attr_pwm1
.dev_attr
.attr
,
1262 &sensor_dev_attr_pwm2
.dev_attr
.attr
,
1263 &sensor_dev_attr_pwm3
.dev_attr
.attr
,
1267 * Device registration and initialization
1270 static void __devinit
f71805f_init_device(struct f71805f_data
*data
)
1275 reg
= f71805f_read8(data
, F71805F_REG_START
);
1276 if ((reg
& 0x41) != 0x01) {
1277 printk(KERN_DEBUG DRVNAME
": Starting monitoring "
1279 f71805f_write8(data
, F71805F_REG_START
, (reg
| 0x01) & ~0x40);
1282 /* Fan monitoring can be disabled. If it is, we won't be polling
1283 the register values, and won't create the related sysfs files. */
1284 for (i
= 0; i
< 3; i
++) {
1285 data
->fan_ctrl
[i
] = f71805f_read8(data
,
1286 F71805F_REG_FAN_CTRL(i
));
1287 /* Clear latch full bit, else "speed mode" fan speed control
1289 if (data
->fan_ctrl
[i
] & FAN_CTRL_LATCH_FULL
) {
1290 data
->fan_ctrl
[i
] &= ~FAN_CTRL_LATCH_FULL
;
1291 f71805f_write8(data
, F71805F_REG_FAN_CTRL(i
),
1297 static int __devinit
f71805f_probe(struct platform_device
*pdev
)
1299 struct f71805f_sio_data
*sio_data
= pdev
->dev
.platform_data
;
1300 struct f71805f_data
*data
;
1301 struct resource
*res
;
1304 static const char *names
[] = {
1309 if (!(data
= kzalloc(sizeof(struct f71805f_data
), GFP_KERNEL
))) {
1311 printk(KERN_ERR DRVNAME
": Out of memory\n");
1315 res
= platform_get_resource(pdev
, IORESOURCE_IO
, 0);
1316 if (!request_region(res
->start
+ ADDR_REG_OFFSET
, 2, DRVNAME
)) {
1318 dev_err(&pdev
->dev
, "Failed to request region 0x%lx-0x%lx\n",
1319 (unsigned long)(res
->start
+ ADDR_REG_OFFSET
),
1320 (unsigned long)(res
->start
+ ADDR_REG_OFFSET
+ 1));
1323 data
->addr
= res
->start
;
1324 data
->name
= names
[sio_data
->kind
];
1325 mutex_init(&data
->update_lock
);
1327 platform_set_drvdata(pdev
, data
);
1329 /* Some voltage inputs depend on chip model and configuration */
1330 switch (sio_data
->kind
) {
1332 data
->has_in
= 0x1ff;
1335 data
->has_in
= 0x6ef;
1336 if (sio_data
->fnsel1
& 0x01)
1337 data
->has_in
|= (1 << 4); /* in4 */
1338 if (sio_data
->fnsel1
& 0x02)
1339 data
->has_in
|= (1 << 8); /* in8 */
1343 /* Initialize the F71805F chip */
1344 f71805f_init_device(data
);
1346 /* Register sysfs interface files */
1347 if ((err
= sysfs_create_group(&pdev
->dev
.kobj
, &f71805f_group
)))
1348 goto exit_release_region
;
1349 if (data
->has_in
& (1 << 4)) { /* in4 */
1350 if ((err
= sysfs_create_group(&pdev
->dev
.kobj
,
1351 &f71805f_group_optin
[0])))
1352 goto exit_remove_files
;
1354 if (data
->has_in
& (1 << 8)) { /* in8 */
1355 if ((err
= sysfs_create_group(&pdev
->dev
.kobj
,
1356 &f71805f_group_optin
[1])))
1357 goto exit_remove_files
;
1359 if (data
->has_in
& (1 << 9)) { /* in9 (F71872F/FG only) */
1360 if ((err
= sysfs_create_group(&pdev
->dev
.kobj
,
1361 &f71805f_group_optin
[2])))
1362 goto exit_remove_files
;
1364 if (data
->has_in
& (1 << 10)) { /* in9 (F71872F/FG only) */
1365 if ((err
= sysfs_create_group(&pdev
->dev
.kobj
,
1366 &f71805f_group_optin
[3])))
1367 goto exit_remove_files
;
1369 for (i
= 0; i
< 3; i
++) {
1370 /* If control mode is PWM, create pwm_freq file */
1371 if (!(data
->fan_ctrl
[i
] & FAN_CTRL_DC_MODE
)) {
1372 if ((err
= sysfs_create_file(&pdev
->dev
.kobj
,
1373 f71805f_attributes_pwm_freq
[i
])))
1374 goto exit_remove_files
;
1376 /* If PWM is in manual mode, add write permission */
1377 if (data
->fan_ctrl
[i
] & FAN_CTRL_MODE_MANUAL
) {
1378 if ((err
= sysfs_chmod_file(&pdev
->dev
.kobj
,
1379 f71805f_attr_pwm
[i
],
1380 S_IRUGO
| S_IWUSR
))) {
1381 dev_err(&pdev
->dev
, "chmod +w pwm%d failed\n",
1383 goto exit_remove_files
;
1388 data
->hwmon_dev
= hwmon_device_register(&pdev
->dev
);
1389 if (IS_ERR(data
->hwmon_dev
)) {
1390 err
= PTR_ERR(data
->hwmon_dev
);
1391 dev_err(&pdev
->dev
, "Class registration failed (%d)\n", err
);
1392 goto exit_remove_files
;
1398 sysfs_remove_group(&pdev
->dev
.kobj
, &f71805f_group
);
1399 for (i
= 0; i
< 4; i
++)
1400 sysfs_remove_group(&pdev
->dev
.kobj
, &f71805f_group_optin
[i
]);
1401 sysfs_remove_group(&pdev
->dev
.kobj
, &f71805f_group_pwm_freq
);
1402 exit_release_region
:
1403 release_region(res
->start
+ ADDR_REG_OFFSET
, 2);
1405 platform_set_drvdata(pdev
, NULL
);
1411 static int __devexit
f71805f_remove(struct platform_device
*pdev
)
1413 struct f71805f_data
*data
= platform_get_drvdata(pdev
);
1414 struct resource
*res
;
1417 hwmon_device_unregister(data
->hwmon_dev
);
1418 sysfs_remove_group(&pdev
->dev
.kobj
, &f71805f_group
);
1419 for (i
= 0; i
< 4; i
++)
1420 sysfs_remove_group(&pdev
->dev
.kobj
, &f71805f_group_optin
[i
]);
1421 sysfs_remove_group(&pdev
->dev
.kobj
, &f71805f_group_pwm_freq
);
1422 platform_set_drvdata(pdev
, NULL
);
1425 res
= platform_get_resource(pdev
, IORESOURCE_IO
, 0);
1426 release_region(res
->start
+ ADDR_REG_OFFSET
, 2);
1431 static struct platform_driver f71805f_driver
= {
1433 .owner
= THIS_MODULE
,
1436 .probe
= f71805f_probe
,
1437 .remove
= __devexit_p(f71805f_remove
),
1440 static int __init
f71805f_device_add(unsigned short address
,
1441 const struct f71805f_sio_data
*sio_data
)
1443 struct resource res
= {
1445 .end
= address
+ REGION_LENGTH
- 1,
1446 .flags
= IORESOURCE_IO
,
1450 pdev
= platform_device_alloc(DRVNAME
, address
);
1453 printk(KERN_ERR DRVNAME
": Device allocation failed\n");
1457 res
.name
= pdev
->name
;
1458 err
= platform_device_add_resources(pdev
, &res
, 1);
1460 printk(KERN_ERR DRVNAME
": Device resource addition failed "
1462 goto exit_device_put
;
1465 err
= platform_device_add_data(pdev
, sio_data
,
1466 sizeof(struct f71805f_sio_data
));
1468 printk(KERN_ERR DRVNAME
": Platform data allocation failed\n");
1469 goto exit_device_put
;
1472 err
= platform_device_add(pdev
);
1474 printk(KERN_ERR DRVNAME
": Device addition failed (%d)\n",
1476 goto exit_device_put
;
1482 platform_device_put(pdev
);
1487 static int __init
f71805f_find(int sioaddr
, unsigned short *address
,
1488 struct f71805f_sio_data
*sio_data
)
1493 static const char *names
[] = {
1495 "F71872F/FG or F71806F/FG",
1498 superio_enter(sioaddr
);
1500 devid
= superio_inw(sioaddr
, SIO_REG_MANID
);
1501 if (devid
!= SIO_FINTEK_ID
)
1504 devid
= force_id
? force_id
: superio_inw(sioaddr
, SIO_REG_DEVID
);
1506 case SIO_F71805F_ID
:
1507 sio_data
->kind
= f71805f
;
1509 case SIO_F71872F_ID
:
1510 sio_data
->kind
= f71872f
;
1511 sio_data
->fnsel1
= superio_inb(sioaddr
, SIO_REG_FNSEL1
);
1514 printk(KERN_INFO DRVNAME
": Unsupported Fintek device, "
1519 superio_select(sioaddr
, F71805F_LD_HWM
);
1520 if (!(superio_inb(sioaddr
, SIO_REG_ENABLE
) & 0x01)) {
1521 printk(KERN_WARNING DRVNAME
": Device not activated, "
1526 *address
= superio_inw(sioaddr
, SIO_REG_ADDR
);
1527 if (*address
== 0) {
1528 printk(KERN_WARNING DRVNAME
": Base address not set, "
1532 *address
&= ~(REGION_LENGTH
- 1); /* Ignore 3 LSB */
1535 printk(KERN_INFO DRVNAME
": Found %s chip at %#x, revision %u\n",
1536 names
[sio_data
->kind
], *address
,
1537 superio_inb(sioaddr
, SIO_REG_DEVREV
));
1540 superio_exit(sioaddr
);
1544 static int __init
f71805f_init(void)
1547 unsigned short address
;
1548 struct f71805f_sio_data sio_data
;
1550 if (f71805f_find(0x2e, &address
, &sio_data
)
1551 && f71805f_find(0x4e, &address
, &sio_data
))
1554 err
= platform_driver_register(&f71805f_driver
);
1558 /* Sets global pdev as a side effect */
1559 err
= f71805f_device_add(address
, &sio_data
);
1566 platform_driver_unregister(&f71805f_driver
);
1571 static void __exit
f71805f_exit(void)
1573 platform_device_unregister(pdev
);
1574 platform_driver_unregister(&f71805f_driver
);
1577 MODULE_AUTHOR("Jean Delvare <khali@linux-fr>");
1578 MODULE_LICENSE("GPL");
1579 MODULE_DESCRIPTION("F71805F/F71872F hardware monitoring driver");
1581 module_init(f71805f_init
);
1582 module_exit(f71805f_exit
);