2 it87.c - Part of lm_sensors, Linux kernel modules for hardware
5 The IT8705F is an LPC-based Super I/O part that contains UARTs, a
6 parallel port, an IR port, a MIDI port, a floppy controller, etc., in
7 addition to an Environment Controller (Enhanced Hardware Monitor and
10 This driver supports only the Environment Controller in the IT8705F and
11 similar parts. The other devices are supported by different drivers.
13 Supports: IT8705F Super I/O chip w/LPC interface
14 IT8712F Super I/O chip w/LPC interface
15 IT8716F Super I/O chip w/LPC interface
16 IT8718F Super I/O chip w/LPC interface
17 IT8720F Super I/O chip w/LPC interface
18 IT8726F Super I/O chip w/LPC interface
19 Sis950 A clone of the IT8705F
21 Copyright (C) 2001 Chris Gauthron
22 Copyright (C) 2005-2007 Jean Delvare <khali@linux-fr.org>
24 This program is free software; you can redistribute it and/or modify
25 it under the terms of the GNU General Public License as published by
26 the Free Software Foundation; either version 2 of the License, or
27 (at your option) any later version.
29 This program is distributed in the hope that it will be useful,
30 but WITHOUT ANY WARRANTY; without even the implied warranty of
31 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
32 GNU General Public License for more details.
34 You should have received a copy of the GNU General Public License
35 along with this program; if not, write to the Free Software
36 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
39 #include <linux/module.h>
40 #include <linux/init.h>
41 #include <linux/slab.h>
42 #include <linux/jiffies.h>
43 #include <linux/platform_device.h>
44 #include <linux/hwmon.h>
45 #include <linux/hwmon-sysfs.h>
46 #include <linux/hwmon-vid.h>
47 #include <linux/err.h>
48 #include <linux/mutex.h>
49 #include <linux/sysfs.h>
50 #include <linux/string.h>
51 #include <linux/dmi.h>
52 #include <linux/acpi.h>
55 #define DRVNAME "it87"
57 enum chips
{ it87
, it8712
, it8716
, it8718
, it8720
};
59 static unsigned short force_id
;
60 module_param(force_id
, ushort
, 0);
61 MODULE_PARM_DESC(force_id
, "Override the detected device ID");
63 static struct platform_device
*pdev
;
65 #define REG 0x2e /* The register to read/write */
66 #define DEV 0x07 /* Register: Logical device select */
67 #define VAL 0x2f /* The value to read/write */
68 #define PME 0x04 /* The device with the fan registers in it */
70 /* The device with the IT8718F/IT8720F VID value in it */
73 #define DEVID 0x20 /* Register: Device ID */
74 #define DEVREV 0x22 /* Register: Device Revision */
83 static int superio_inw(int reg
)
94 superio_select(int ldn
)
116 /* Logical device 4 registers */
117 #define IT8712F_DEVID 0x8712
118 #define IT8705F_DEVID 0x8705
119 #define IT8716F_DEVID 0x8716
120 #define IT8718F_DEVID 0x8718
121 #define IT8720F_DEVID 0x8720
122 #define IT8726F_DEVID 0x8726
123 #define IT87_ACT_REG 0x30
124 #define IT87_BASE_REG 0x60
126 /* Logical device 7 registers (IT8712F and later) */
127 #define IT87_SIO_PINX2_REG 0x2c /* Pin selection */
128 #define IT87_SIO_VID_REG 0xfc /* VID value */
130 /* Update battery voltage after every reading if true */
131 static int update_vbat
;
133 /* Not all BIOSes properly configure the PWM registers */
134 static int fix_pwm_polarity
;
136 /* Many IT87 constants specified below */
138 /* Length of ISA address segment */
139 #define IT87_EXTENT 8
141 /* Length of ISA address segment for Environmental Controller */
142 #define IT87_EC_EXTENT 2
144 /* Offset of EC registers from ISA base address */
145 #define IT87_EC_OFFSET 5
147 /* Where are the ISA address/data registers relative to the EC base address */
148 #define IT87_ADDR_REG_OFFSET 0
149 #define IT87_DATA_REG_OFFSET 1
151 /*----- The IT87 registers -----*/
153 #define IT87_REG_CONFIG 0x00
155 #define IT87_REG_ALARM1 0x01
156 #define IT87_REG_ALARM2 0x02
157 #define IT87_REG_ALARM3 0x03
159 /* The IT8718F and IT8720F have the VID value in a different register, in
160 Super-I/O configuration space. */
161 #define IT87_REG_VID 0x0a
162 /* The IT8705F and IT8712F earlier than revision 0x08 use register 0x0b
163 for fan divisors. Later IT8712F revisions must use 16-bit tachometer
165 #define IT87_REG_FAN_DIV 0x0b
166 #define IT87_REG_FAN_16BIT 0x0c
168 /* Monitors: 9 voltage (0 to 7, battery), 3 temp (1 to 3), 3 fan (1 to 3) */
170 static const u8 IT87_REG_FAN
[] = { 0x0d, 0x0e, 0x0f, 0x80, 0x82 };
171 static const u8 IT87_REG_FAN_MIN
[] = { 0x10, 0x11, 0x12, 0x84, 0x86 };
172 static const u8 IT87_REG_FANX
[] = { 0x18, 0x19, 0x1a, 0x81, 0x83 };
173 static const u8 IT87_REG_FANX_MIN
[] = { 0x1b, 0x1c, 0x1d, 0x85, 0x87 };
174 #define IT87_REG_FAN_MAIN_CTRL 0x13
175 #define IT87_REG_FAN_CTL 0x14
176 #define IT87_REG_PWM(nr) (0x15 + (nr))
178 #define IT87_REG_VIN(nr) (0x20 + (nr))
179 #define IT87_REG_TEMP(nr) (0x29 + (nr))
181 #define IT87_REG_VIN_MAX(nr) (0x30 + (nr) * 2)
182 #define IT87_REG_VIN_MIN(nr) (0x31 + (nr) * 2)
183 #define IT87_REG_TEMP_HIGH(nr) (0x40 + (nr) * 2)
184 #define IT87_REG_TEMP_LOW(nr) (0x41 + (nr) * 2)
186 #define IT87_REG_VIN_ENABLE 0x50
187 #define IT87_REG_TEMP_ENABLE 0x51
189 #define IT87_REG_CHIPID 0x58
191 #define IN_TO_REG(val) (SENSORS_LIMIT((((val) + 8)/16),0,255))
192 #define IN_FROM_REG(val) ((val) * 16)
194 static inline u8
FAN_TO_REG(long rpm
, int div
)
198 rpm
= SENSORS_LIMIT(rpm
, 1, 1000000);
199 return SENSORS_LIMIT((1350000 + rpm
* div
/ 2) / (rpm
* div
), 1,
203 static inline u16
FAN16_TO_REG(long rpm
)
207 return SENSORS_LIMIT((1350000 + rpm
) / (rpm
* 2), 1, 0xfffe);
210 #define FAN_FROM_REG(val,div) ((val)==0?-1:(val)==255?0:1350000/((val)*(div)))
211 /* The divider is fixed to 2 in 16-bit mode */
212 #define FAN16_FROM_REG(val) ((val)==0?-1:(val)==0xffff?0:1350000/((val)*2))
214 #define TEMP_TO_REG(val) (SENSORS_LIMIT(((val)<0?(((val)-500)/1000):\
215 ((val)+500)/1000),-128,127))
216 #define TEMP_FROM_REG(val) ((val) * 1000)
218 #define PWM_TO_REG(val) ((val) >> 1)
219 #define PWM_FROM_REG(val) (((val)&0x7f) << 1)
221 static int DIV_TO_REG(int val
)
224 while (answer
< 7 && (val
>>= 1))
228 #define DIV_FROM_REG(val) (1 << (val))
230 static const unsigned int pwm_freq
[8] = {
242 struct it87_sio_data
{
244 /* Values read from Super-I/O config space */
247 /* Values set based on DMI strings */
251 /* For each registered chip, we need to keep some data in memory.
252 The structure is dynamically allocated. */
254 struct device
*hwmon_dev
;
260 struct mutex update_lock
;
261 char valid
; /* !=0 if following fields are valid */
262 unsigned long last_updated
; /* In jiffies */
264 u8 in
[9]; /* Register value */
265 u8 in_max
[8]; /* Register value */
266 u8 in_min
[8]; /* Register value */
267 u8 has_fan
; /* Bitfield, fans enabled */
268 u16 fan
[5]; /* Register values, possibly combined */
269 u16 fan_min
[5]; /* Register values, possibly combined */
270 s8 temp
[3]; /* Register value */
271 s8 temp_high
[3]; /* Register value */
272 s8 temp_low
[3]; /* Register value */
273 u8 sensor
; /* Register value */
274 u8 fan_div
[3]; /* Register encoding, shifted right */
275 u8 vid
; /* Register encoding, combined */
277 u32 alarms
; /* Register encoding, combined */
278 u8 fan_main_ctrl
; /* Register value */
279 u8 fan_ctl
; /* Register value */
280 u8 manual_pwm_ctl
[3]; /* manual PWM value set by user */
283 static inline int has_16bit_fans(const struct it87_data
*data
)
285 /* IT8705F Datasheet 0.4.1, 3h == Version G.
286 IT8712F Datasheet 0.9.1, section 8.3.5 indicates 8h == Version J.
287 These are the first revisions with 16bit tachometer support. */
288 return (data
->type
== it87
&& data
->revision
>= 0x03)
289 || (data
->type
== it8712
&& data
->revision
>= 0x08)
290 || data
->type
== it8716
291 || data
->type
== it8718
292 || data
->type
== it8720
;
295 static int it87_probe(struct platform_device
*pdev
);
296 static int __devexit
it87_remove(struct platform_device
*pdev
);
298 static int it87_read_value(struct it87_data
*data
, u8 reg
);
299 static void it87_write_value(struct it87_data
*data
, u8 reg
, u8 value
);
300 static struct it87_data
*it87_update_device(struct device
*dev
);
301 static int it87_check_pwm(struct device
*dev
);
302 static void it87_init_device(struct platform_device
*pdev
);
305 static struct platform_driver it87_driver
= {
307 .owner
= THIS_MODULE
,
311 .remove
= __devexit_p(it87_remove
),
314 static ssize_t
show_in(struct device
*dev
, struct device_attribute
*attr
,
317 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
318 int nr
= sensor_attr
->index
;
320 struct it87_data
*data
= it87_update_device(dev
);
321 return sprintf(buf
, "%d\n", IN_FROM_REG(data
->in
[nr
]));
324 static ssize_t
show_in_min(struct device
*dev
, struct device_attribute
*attr
,
327 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
328 int nr
= sensor_attr
->index
;
330 struct it87_data
*data
= it87_update_device(dev
);
331 return sprintf(buf
, "%d\n", IN_FROM_REG(data
->in_min
[nr
]));
334 static ssize_t
show_in_max(struct device
*dev
, struct device_attribute
*attr
,
337 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
338 int nr
= sensor_attr
->index
;
340 struct it87_data
*data
= it87_update_device(dev
);
341 return sprintf(buf
, "%d\n", IN_FROM_REG(data
->in_max
[nr
]));
344 static ssize_t
set_in_min(struct device
*dev
, struct device_attribute
*attr
,
345 const char *buf
, size_t count
)
347 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
348 int nr
= sensor_attr
->index
;
350 struct it87_data
*data
= dev_get_drvdata(dev
);
351 unsigned long val
= simple_strtoul(buf
, NULL
, 10);
353 mutex_lock(&data
->update_lock
);
354 data
->in_min
[nr
] = IN_TO_REG(val
);
355 it87_write_value(data
, IT87_REG_VIN_MIN(nr
),
357 mutex_unlock(&data
->update_lock
);
360 static ssize_t
set_in_max(struct device
*dev
, struct device_attribute
*attr
,
361 const char *buf
, size_t count
)
363 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
364 int nr
= sensor_attr
->index
;
366 struct it87_data
*data
= dev_get_drvdata(dev
);
367 unsigned long val
= simple_strtoul(buf
, NULL
, 10);
369 mutex_lock(&data
->update_lock
);
370 data
->in_max
[nr
] = IN_TO_REG(val
);
371 it87_write_value(data
, IT87_REG_VIN_MAX(nr
),
373 mutex_unlock(&data
->update_lock
);
377 #define show_in_offset(offset) \
378 static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \
379 show_in, NULL, offset);
381 #define limit_in_offset(offset) \
382 static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
383 show_in_min, set_in_min, offset); \
384 static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
385 show_in_max, set_in_max, offset);
406 static ssize_t
show_temp(struct device
*dev
, struct device_attribute
*attr
,
409 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
410 int nr
= sensor_attr
->index
;
412 struct it87_data
*data
= it87_update_device(dev
);
413 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp
[nr
]));
415 static ssize_t
show_temp_max(struct device
*dev
, struct device_attribute
*attr
,
418 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
419 int nr
= sensor_attr
->index
;
421 struct it87_data
*data
= it87_update_device(dev
);
422 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp_high
[nr
]));
424 static ssize_t
show_temp_min(struct device
*dev
, struct device_attribute
*attr
,
427 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
428 int nr
= sensor_attr
->index
;
430 struct it87_data
*data
= it87_update_device(dev
);
431 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp_low
[nr
]));
433 static ssize_t
set_temp_max(struct device
*dev
, struct device_attribute
*attr
,
434 const char *buf
, size_t count
)
436 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
437 int nr
= sensor_attr
->index
;
439 struct it87_data
*data
= dev_get_drvdata(dev
);
440 int val
= simple_strtol(buf
, NULL
, 10);
442 mutex_lock(&data
->update_lock
);
443 data
->temp_high
[nr
] = TEMP_TO_REG(val
);
444 it87_write_value(data
, IT87_REG_TEMP_HIGH(nr
), data
->temp_high
[nr
]);
445 mutex_unlock(&data
->update_lock
);
448 static ssize_t
set_temp_min(struct device
*dev
, struct device_attribute
*attr
,
449 const char *buf
, size_t count
)
451 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
452 int nr
= sensor_attr
->index
;
454 struct it87_data
*data
= dev_get_drvdata(dev
);
455 int val
= simple_strtol(buf
, NULL
, 10);
457 mutex_lock(&data
->update_lock
);
458 data
->temp_low
[nr
] = TEMP_TO_REG(val
);
459 it87_write_value(data
, IT87_REG_TEMP_LOW(nr
), data
->temp_low
[nr
]);
460 mutex_unlock(&data
->update_lock
);
463 #define show_temp_offset(offset) \
464 static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, \
465 show_temp, NULL, offset - 1); \
466 static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \
467 show_temp_max, set_temp_max, offset - 1); \
468 static SENSOR_DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR, \
469 show_temp_min, set_temp_min, offset - 1);
475 static ssize_t
show_sensor(struct device
*dev
, struct device_attribute
*attr
,
478 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
479 int nr
= sensor_attr
->index
;
481 struct it87_data
*data
= it87_update_device(dev
);
482 u8 reg
= data
->sensor
; /* In case the value is updated while we use it */
485 return sprintf(buf
, "3\n"); /* thermal diode */
487 return sprintf(buf
, "4\n"); /* thermistor */
488 return sprintf(buf
, "0\n"); /* disabled */
490 static ssize_t
set_sensor(struct device
*dev
, struct device_attribute
*attr
,
491 const char *buf
, size_t count
)
493 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
494 int nr
= sensor_attr
->index
;
496 struct it87_data
*data
= dev_get_drvdata(dev
);
497 int val
= simple_strtol(buf
, NULL
, 10);
499 mutex_lock(&data
->update_lock
);
501 data
->sensor
&= ~(1 << nr
);
502 data
->sensor
&= ~(8 << nr
);
503 if (val
== 2) { /* backwards compatibility */
504 dev_warn(dev
, "Sensor type 2 is deprecated, please use 4 "
508 /* 3 = thermal diode; 4 = thermistor; 0 = disabled */
510 data
->sensor
|= 1 << nr
;
512 data
->sensor
|= 8 << nr
;
514 mutex_unlock(&data
->update_lock
);
517 it87_write_value(data
, IT87_REG_TEMP_ENABLE
, data
->sensor
);
518 mutex_unlock(&data
->update_lock
);
521 #define show_sensor_offset(offset) \
522 static SENSOR_DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR, \
523 show_sensor, set_sensor, offset - 1);
525 show_sensor_offset(1);
526 show_sensor_offset(2);
527 show_sensor_offset(3);
530 static ssize_t
show_fan(struct device
*dev
, struct device_attribute
*attr
,
533 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
534 int nr
= sensor_attr
->index
;
536 struct it87_data
*data
= it87_update_device(dev
);
537 return sprintf(buf
,"%d\n", FAN_FROM_REG(data
->fan
[nr
],
538 DIV_FROM_REG(data
->fan_div
[nr
])));
540 static ssize_t
show_fan_min(struct device
*dev
, struct device_attribute
*attr
,
543 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
544 int nr
= sensor_attr
->index
;
546 struct it87_data
*data
= it87_update_device(dev
);
547 return sprintf(buf
,"%d\n",
548 FAN_FROM_REG(data
->fan_min
[nr
], DIV_FROM_REG(data
->fan_div
[nr
])));
550 static ssize_t
show_fan_div(struct device
*dev
, struct device_attribute
*attr
,
553 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
554 int nr
= sensor_attr
->index
;
556 struct it87_data
*data
= it87_update_device(dev
);
557 return sprintf(buf
, "%d\n", DIV_FROM_REG(data
->fan_div
[nr
]));
559 static ssize_t
show_pwm_enable(struct device
*dev
, struct device_attribute
*attr
,
562 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
563 int nr
= sensor_attr
->index
;
565 struct it87_data
*data
= it87_update_device(dev
);
566 return sprintf(buf
,"%d\n", (data
->fan_main_ctrl
& (1 << nr
)) ? 1 : 0);
568 static ssize_t
show_pwm(struct device
*dev
, struct device_attribute
*attr
,
571 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
572 int nr
= sensor_attr
->index
;
574 struct it87_data
*data
= it87_update_device(dev
);
575 return sprintf(buf
,"%d\n", data
->manual_pwm_ctl
[nr
]);
577 static ssize_t
show_pwm_freq(struct device
*dev
, struct device_attribute
*attr
,
580 struct it87_data
*data
= it87_update_device(dev
);
581 int index
= (data
->fan_ctl
>> 4) & 0x07;
583 return sprintf(buf
, "%u\n", pwm_freq
[index
]);
585 static ssize_t
set_fan_min(struct device
*dev
, struct device_attribute
*attr
,
586 const char *buf
, size_t count
)
588 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
589 int nr
= sensor_attr
->index
;
591 struct it87_data
*data
= dev_get_drvdata(dev
);
592 int val
= simple_strtol(buf
, NULL
, 10);
595 mutex_lock(&data
->update_lock
);
596 reg
= it87_read_value(data
, IT87_REG_FAN_DIV
);
598 case 0: data
->fan_div
[nr
] = reg
& 0x07; break;
599 case 1: data
->fan_div
[nr
] = (reg
>> 3) & 0x07; break;
600 case 2: data
->fan_div
[nr
] = (reg
& 0x40) ? 3 : 1; break;
603 data
->fan_min
[nr
] = FAN_TO_REG(val
, DIV_FROM_REG(data
->fan_div
[nr
]));
604 it87_write_value(data
, IT87_REG_FAN_MIN
[nr
], data
->fan_min
[nr
]);
605 mutex_unlock(&data
->update_lock
);
608 static ssize_t
set_fan_div(struct device
*dev
, struct device_attribute
*attr
,
609 const char *buf
, size_t count
)
611 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
612 int nr
= sensor_attr
->index
;
614 struct it87_data
*data
= dev_get_drvdata(dev
);
615 unsigned long val
= simple_strtoul(buf
, NULL
, 10);
619 mutex_lock(&data
->update_lock
);
620 old
= it87_read_value(data
, IT87_REG_FAN_DIV
);
622 /* Save fan min limit */
623 min
= FAN_FROM_REG(data
->fan_min
[nr
], DIV_FROM_REG(data
->fan_div
[nr
]));
628 data
->fan_div
[nr
] = DIV_TO_REG(val
);
632 data
->fan_div
[nr
] = 1;
634 data
->fan_div
[nr
] = 3;
637 val
|= (data
->fan_div
[0] & 0x07);
638 val
|= (data
->fan_div
[1] & 0x07) << 3;
639 if (data
->fan_div
[2] == 3)
641 it87_write_value(data
, IT87_REG_FAN_DIV
, val
);
643 /* Restore fan min limit */
644 data
->fan_min
[nr
] = FAN_TO_REG(min
, DIV_FROM_REG(data
->fan_div
[nr
]));
645 it87_write_value(data
, IT87_REG_FAN_MIN
[nr
], data
->fan_min
[nr
]);
647 mutex_unlock(&data
->update_lock
);
650 static ssize_t
set_pwm_enable(struct device
*dev
,
651 struct device_attribute
*attr
, const char *buf
, size_t count
)
653 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
654 int nr
= sensor_attr
->index
;
656 struct it87_data
*data
= dev_get_drvdata(dev
);
657 int val
= simple_strtol(buf
, NULL
, 10);
659 mutex_lock(&data
->update_lock
);
663 /* make sure the fan is on when in on/off mode */
664 tmp
= it87_read_value(data
, IT87_REG_FAN_CTL
);
665 it87_write_value(data
, IT87_REG_FAN_CTL
, tmp
| (1 << nr
));
666 /* set on/off mode */
667 data
->fan_main_ctrl
&= ~(1 << nr
);
668 it87_write_value(data
, IT87_REG_FAN_MAIN_CTRL
, data
->fan_main_ctrl
);
669 } else if (val
== 1) {
670 /* set SmartGuardian mode */
671 data
->fan_main_ctrl
|= (1 << nr
);
672 it87_write_value(data
, IT87_REG_FAN_MAIN_CTRL
, data
->fan_main_ctrl
);
673 /* set saved pwm value, clear FAN_CTLX PWM mode bit */
674 it87_write_value(data
, IT87_REG_PWM(nr
), PWM_TO_REG(data
->manual_pwm_ctl
[nr
]));
676 mutex_unlock(&data
->update_lock
);
680 mutex_unlock(&data
->update_lock
);
683 static ssize_t
set_pwm(struct device
*dev
, struct device_attribute
*attr
,
684 const char *buf
, size_t count
)
686 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
687 int nr
= sensor_attr
->index
;
689 struct it87_data
*data
= dev_get_drvdata(dev
);
690 int val
= simple_strtol(buf
, NULL
, 10);
692 if (val
< 0 || val
> 255)
695 mutex_lock(&data
->update_lock
);
696 data
->manual_pwm_ctl
[nr
] = val
;
697 if (data
->fan_main_ctrl
& (1 << nr
))
698 it87_write_value(data
, IT87_REG_PWM(nr
), PWM_TO_REG(data
->manual_pwm_ctl
[nr
]));
699 mutex_unlock(&data
->update_lock
);
702 static ssize_t
set_pwm_freq(struct device
*dev
,
703 struct device_attribute
*attr
, const char *buf
, size_t count
)
705 struct it87_data
*data
= dev_get_drvdata(dev
);
706 unsigned long val
= simple_strtoul(buf
, NULL
, 10);
709 /* Search for the nearest available frequency */
710 for (i
= 0; i
< 7; i
++) {
711 if (val
> (pwm_freq
[i
] + pwm_freq
[i
+1]) / 2)
715 mutex_lock(&data
->update_lock
);
716 data
->fan_ctl
= it87_read_value(data
, IT87_REG_FAN_CTL
) & 0x8f;
717 data
->fan_ctl
|= i
<< 4;
718 it87_write_value(data
, IT87_REG_FAN_CTL
, data
->fan_ctl
);
719 mutex_unlock(&data
->update_lock
);
724 #define show_fan_offset(offset) \
725 static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, \
726 show_fan, NULL, offset - 1); \
727 static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
728 show_fan_min, set_fan_min, offset - 1); \
729 static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
730 show_fan_div, set_fan_div, offset - 1);
736 #define show_pwm_offset(offset) \
737 static SENSOR_DEVICE_ATTR(pwm##offset##_enable, S_IRUGO | S_IWUSR, \
738 show_pwm_enable, set_pwm_enable, offset - 1); \
739 static SENSOR_DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \
740 show_pwm, set_pwm, offset - 1); \
741 static DEVICE_ATTR(pwm##offset##_freq, \
742 (offset == 1 ? S_IRUGO | S_IWUSR : S_IRUGO), \
743 show_pwm_freq, (offset == 1 ? set_pwm_freq : NULL));
749 /* A different set of callbacks for 16-bit fans */
750 static ssize_t
show_fan16(struct device
*dev
, struct device_attribute
*attr
,
753 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
754 int nr
= sensor_attr
->index
;
755 struct it87_data
*data
= it87_update_device(dev
);
756 return sprintf(buf
, "%d\n", FAN16_FROM_REG(data
->fan
[nr
]));
759 static ssize_t
show_fan16_min(struct device
*dev
, struct device_attribute
*attr
,
762 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
763 int nr
= sensor_attr
->index
;
764 struct it87_data
*data
= it87_update_device(dev
);
765 return sprintf(buf
, "%d\n", FAN16_FROM_REG(data
->fan_min
[nr
]));
768 static ssize_t
set_fan16_min(struct device
*dev
, struct device_attribute
*attr
,
769 const char *buf
, size_t count
)
771 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
772 int nr
= sensor_attr
->index
;
773 struct it87_data
*data
= dev_get_drvdata(dev
);
774 int val
= simple_strtol(buf
, NULL
, 10);
776 mutex_lock(&data
->update_lock
);
777 data
->fan_min
[nr
] = FAN16_TO_REG(val
);
778 it87_write_value(data
, IT87_REG_FAN_MIN
[nr
],
779 data
->fan_min
[nr
] & 0xff);
780 it87_write_value(data
, IT87_REG_FANX_MIN
[nr
],
781 data
->fan_min
[nr
] >> 8);
782 mutex_unlock(&data
->update_lock
);
786 /* We want to use the same sysfs file names as 8-bit fans, but we need
787 different variable names, so we have to use SENSOR_ATTR instead of
788 SENSOR_DEVICE_ATTR. */
789 #define show_fan16_offset(offset) \
790 static struct sensor_device_attribute sensor_dev_attr_fan##offset##_input16 \
791 = SENSOR_ATTR(fan##offset##_input, S_IRUGO, \
792 show_fan16, NULL, offset - 1); \
793 static struct sensor_device_attribute sensor_dev_attr_fan##offset##_min16 \
794 = SENSOR_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
795 show_fan16_min, set_fan16_min, offset - 1)
797 show_fan16_offset(1);
798 show_fan16_offset(2);
799 show_fan16_offset(3);
800 show_fan16_offset(4);
801 show_fan16_offset(5);
804 static ssize_t
show_alarms(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
806 struct it87_data
*data
= it87_update_device(dev
);
807 return sprintf(buf
, "%u\n", data
->alarms
);
809 static DEVICE_ATTR(alarms
, S_IRUGO
, show_alarms
, NULL
);
811 static ssize_t
show_alarm(struct device
*dev
, struct device_attribute
*attr
,
814 int bitnr
= to_sensor_dev_attr(attr
)->index
;
815 struct it87_data
*data
= it87_update_device(dev
);
816 return sprintf(buf
, "%u\n", (data
->alarms
>> bitnr
) & 1);
818 static SENSOR_DEVICE_ATTR(in0_alarm
, S_IRUGO
, show_alarm
, NULL
, 8);
819 static SENSOR_DEVICE_ATTR(in1_alarm
, S_IRUGO
, show_alarm
, NULL
, 9);
820 static SENSOR_DEVICE_ATTR(in2_alarm
, S_IRUGO
, show_alarm
, NULL
, 10);
821 static SENSOR_DEVICE_ATTR(in3_alarm
, S_IRUGO
, show_alarm
, NULL
, 11);
822 static SENSOR_DEVICE_ATTR(in4_alarm
, S_IRUGO
, show_alarm
, NULL
, 12);
823 static SENSOR_DEVICE_ATTR(in5_alarm
, S_IRUGO
, show_alarm
, NULL
, 13);
824 static SENSOR_DEVICE_ATTR(in6_alarm
, S_IRUGO
, show_alarm
, NULL
, 14);
825 static SENSOR_DEVICE_ATTR(in7_alarm
, S_IRUGO
, show_alarm
, NULL
, 15);
826 static SENSOR_DEVICE_ATTR(fan1_alarm
, S_IRUGO
, show_alarm
, NULL
, 0);
827 static SENSOR_DEVICE_ATTR(fan2_alarm
, S_IRUGO
, show_alarm
, NULL
, 1);
828 static SENSOR_DEVICE_ATTR(fan3_alarm
, S_IRUGO
, show_alarm
, NULL
, 2);
829 static SENSOR_DEVICE_ATTR(fan4_alarm
, S_IRUGO
, show_alarm
, NULL
, 3);
830 static SENSOR_DEVICE_ATTR(fan5_alarm
, S_IRUGO
, show_alarm
, NULL
, 6);
831 static SENSOR_DEVICE_ATTR(temp1_alarm
, S_IRUGO
, show_alarm
, NULL
, 16);
832 static SENSOR_DEVICE_ATTR(temp2_alarm
, S_IRUGO
, show_alarm
, NULL
, 17);
833 static SENSOR_DEVICE_ATTR(temp3_alarm
, S_IRUGO
, show_alarm
, NULL
, 18);
836 show_vrm_reg(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
838 struct it87_data
*data
= dev_get_drvdata(dev
);
839 return sprintf(buf
, "%u\n", data
->vrm
);
842 store_vrm_reg(struct device
*dev
, struct device_attribute
*attr
, const char *buf
, size_t count
)
844 struct it87_data
*data
= dev_get_drvdata(dev
);
847 val
= simple_strtoul(buf
, NULL
, 10);
852 static DEVICE_ATTR(vrm
, S_IRUGO
| S_IWUSR
, show_vrm_reg
, store_vrm_reg
);
855 show_vid_reg(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
857 struct it87_data
*data
= it87_update_device(dev
);
858 return sprintf(buf
, "%ld\n", (long) vid_from_reg(data
->vid
, data
->vrm
));
860 static DEVICE_ATTR(cpu0_vid
, S_IRUGO
, show_vid_reg
, NULL
);
862 static ssize_t
show_name(struct device
*dev
, struct device_attribute
865 struct it87_data
*data
= dev_get_drvdata(dev
);
866 return sprintf(buf
, "%s\n", data
->name
);
868 static DEVICE_ATTR(name
, S_IRUGO
, show_name
, NULL
);
870 static struct attribute
*it87_attributes
[] = {
871 &sensor_dev_attr_in0_input
.dev_attr
.attr
,
872 &sensor_dev_attr_in1_input
.dev_attr
.attr
,
873 &sensor_dev_attr_in2_input
.dev_attr
.attr
,
874 &sensor_dev_attr_in3_input
.dev_attr
.attr
,
875 &sensor_dev_attr_in4_input
.dev_attr
.attr
,
876 &sensor_dev_attr_in5_input
.dev_attr
.attr
,
877 &sensor_dev_attr_in6_input
.dev_attr
.attr
,
878 &sensor_dev_attr_in7_input
.dev_attr
.attr
,
879 &sensor_dev_attr_in8_input
.dev_attr
.attr
,
880 &sensor_dev_attr_in0_min
.dev_attr
.attr
,
881 &sensor_dev_attr_in1_min
.dev_attr
.attr
,
882 &sensor_dev_attr_in2_min
.dev_attr
.attr
,
883 &sensor_dev_attr_in3_min
.dev_attr
.attr
,
884 &sensor_dev_attr_in4_min
.dev_attr
.attr
,
885 &sensor_dev_attr_in5_min
.dev_attr
.attr
,
886 &sensor_dev_attr_in6_min
.dev_attr
.attr
,
887 &sensor_dev_attr_in7_min
.dev_attr
.attr
,
888 &sensor_dev_attr_in0_max
.dev_attr
.attr
,
889 &sensor_dev_attr_in1_max
.dev_attr
.attr
,
890 &sensor_dev_attr_in2_max
.dev_attr
.attr
,
891 &sensor_dev_attr_in3_max
.dev_attr
.attr
,
892 &sensor_dev_attr_in4_max
.dev_attr
.attr
,
893 &sensor_dev_attr_in5_max
.dev_attr
.attr
,
894 &sensor_dev_attr_in6_max
.dev_attr
.attr
,
895 &sensor_dev_attr_in7_max
.dev_attr
.attr
,
896 &sensor_dev_attr_in0_alarm
.dev_attr
.attr
,
897 &sensor_dev_attr_in1_alarm
.dev_attr
.attr
,
898 &sensor_dev_attr_in2_alarm
.dev_attr
.attr
,
899 &sensor_dev_attr_in3_alarm
.dev_attr
.attr
,
900 &sensor_dev_attr_in4_alarm
.dev_attr
.attr
,
901 &sensor_dev_attr_in5_alarm
.dev_attr
.attr
,
902 &sensor_dev_attr_in6_alarm
.dev_attr
.attr
,
903 &sensor_dev_attr_in7_alarm
.dev_attr
.attr
,
905 &sensor_dev_attr_temp1_input
.dev_attr
.attr
,
906 &sensor_dev_attr_temp2_input
.dev_attr
.attr
,
907 &sensor_dev_attr_temp3_input
.dev_attr
.attr
,
908 &sensor_dev_attr_temp1_max
.dev_attr
.attr
,
909 &sensor_dev_attr_temp2_max
.dev_attr
.attr
,
910 &sensor_dev_attr_temp3_max
.dev_attr
.attr
,
911 &sensor_dev_attr_temp1_min
.dev_attr
.attr
,
912 &sensor_dev_attr_temp2_min
.dev_attr
.attr
,
913 &sensor_dev_attr_temp3_min
.dev_attr
.attr
,
914 &sensor_dev_attr_temp1_type
.dev_attr
.attr
,
915 &sensor_dev_attr_temp2_type
.dev_attr
.attr
,
916 &sensor_dev_attr_temp3_type
.dev_attr
.attr
,
917 &sensor_dev_attr_temp1_alarm
.dev_attr
.attr
,
918 &sensor_dev_attr_temp2_alarm
.dev_attr
.attr
,
919 &sensor_dev_attr_temp3_alarm
.dev_attr
.attr
,
921 &dev_attr_alarms
.attr
,
926 static const struct attribute_group it87_group
= {
927 .attrs
= it87_attributes
,
930 static struct attribute
*it87_attributes_opt
[] = {
931 &sensor_dev_attr_fan1_input16
.dev_attr
.attr
,
932 &sensor_dev_attr_fan1_min16
.dev_attr
.attr
,
933 &sensor_dev_attr_fan2_input16
.dev_attr
.attr
,
934 &sensor_dev_attr_fan2_min16
.dev_attr
.attr
,
935 &sensor_dev_attr_fan3_input16
.dev_attr
.attr
,
936 &sensor_dev_attr_fan3_min16
.dev_attr
.attr
,
937 &sensor_dev_attr_fan4_input16
.dev_attr
.attr
,
938 &sensor_dev_attr_fan4_min16
.dev_attr
.attr
,
939 &sensor_dev_attr_fan5_input16
.dev_attr
.attr
,
940 &sensor_dev_attr_fan5_min16
.dev_attr
.attr
,
942 &sensor_dev_attr_fan1_input
.dev_attr
.attr
,
943 &sensor_dev_attr_fan1_min
.dev_attr
.attr
,
944 &sensor_dev_attr_fan1_div
.dev_attr
.attr
,
945 &sensor_dev_attr_fan2_input
.dev_attr
.attr
,
946 &sensor_dev_attr_fan2_min
.dev_attr
.attr
,
947 &sensor_dev_attr_fan2_div
.dev_attr
.attr
,
948 &sensor_dev_attr_fan3_input
.dev_attr
.attr
,
949 &sensor_dev_attr_fan3_min
.dev_attr
.attr
,
950 &sensor_dev_attr_fan3_div
.dev_attr
.attr
,
952 &sensor_dev_attr_fan1_alarm
.dev_attr
.attr
,
953 &sensor_dev_attr_fan2_alarm
.dev_attr
.attr
,
954 &sensor_dev_attr_fan3_alarm
.dev_attr
.attr
,
955 &sensor_dev_attr_fan4_alarm
.dev_attr
.attr
,
956 &sensor_dev_attr_fan5_alarm
.dev_attr
.attr
,
958 &sensor_dev_attr_pwm1_enable
.dev_attr
.attr
,
959 &sensor_dev_attr_pwm2_enable
.dev_attr
.attr
,
960 &sensor_dev_attr_pwm3_enable
.dev_attr
.attr
,
961 &sensor_dev_attr_pwm1
.dev_attr
.attr
,
962 &sensor_dev_attr_pwm2
.dev_attr
.attr
,
963 &sensor_dev_attr_pwm3
.dev_attr
.attr
,
964 &dev_attr_pwm1_freq
.attr
,
965 &dev_attr_pwm2_freq
.attr
,
966 &dev_attr_pwm3_freq
.attr
,
969 &dev_attr_cpu0_vid
.attr
,
973 static const struct attribute_group it87_group_opt
= {
974 .attrs
= it87_attributes_opt
,
977 /* SuperIO detection - will change isa_address if a chip is found */
978 static int __init
it87_find(unsigned short *address
,
979 struct it87_sio_data
*sio_data
)
983 const char *board_vendor
, *board_name
;
986 chip_type
= force_id
? force_id
: superio_inw(DEVID
);
990 sio_data
->type
= it87
;
993 sio_data
->type
= it8712
;
997 sio_data
->type
= it8716
;
1000 sio_data
->type
= it8718
;
1003 sio_data
->type
= it8720
;
1005 case 0xffff: /* No device at all */
1008 pr_debug(DRVNAME
": Unsupported chip (DEVID=0x%x)\n",
1013 superio_select(PME
);
1014 if (!(superio_inb(IT87_ACT_REG
) & 0x01)) {
1015 pr_info("it87: Device not activated, skipping\n");
1019 *address
= superio_inw(IT87_BASE_REG
) & ~(IT87_EXTENT
- 1);
1020 if (*address
== 0) {
1021 pr_info("it87: Base address not set, skipping\n");
1026 sio_data
->revision
= superio_inb(DEVREV
) & 0x0f;
1027 pr_info("it87: Found IT%04xF chip at 0x%x, revision %d\n",
1028 chip_type
, *address
, sio_data
->revision
);
1030 /* Read GPIO config and VID value from LDN 7 (GPIO) */
1031 if (chip_type
!= IT8705F_DEVID
) {
1034 superio_select(GPIO
);
1035 if ((chip_type
== it8718
) ||
1036 (chip_type
== it8720
))
1037 sio_data
->vid_value
= superio_inb(IT87_SIO_VID_REG
);
1039 reg
= superio_inb(IT87_SIO_PINX2_REG
);
1041 pr_info("it87: in3 is VCC (+5V)\n");
1043 pr_info("it87: in7 is VCCH (+5V Stand-By)\n");
1046 /* Disable specific features based on DMI strings */
1047 board_vendor
= dmi_get_system_info(DMI_BOARD_VENDOR
);
1048 board_name
= dmi_get_system_info(DMI_BOARD_NAME
);
1049 if (board_vendor
&& board_name
) {
1050 if (strcmp(board_vendor
, "nVIDIA") == 0
1051 && strcmp(board_name
, "FN68PT") == 0) {
1052 /* On the Shuttle SN68PT, FAN_CTL2 is apparently not
1053 connected to a fan, but to something else. One user
1054 has reported instant system power-off when changing
1055 the PWM2 duty cycle, so we disable it.
1056 I use the board name string as the trigger in case
1057 the same board is ever used in other systems. */
1058 pr_info("it87: Disabling pwm2 due to "
1059 "hardware constraints\n");
1060 sio_data
->skip_pwm
= (1 << 1);
1069 static int __devinit
it87_probe(struct platform_device
*pdev
)
1071 struct it87_data
*data
;
1072 struct resource
*res
;
1073 struct device
*dev
= &pdev
->dev
;
1074 struct it87_sio_data
*sio_data
= dev
->platform_data
;
1076 int enable_pwm_interface
;
1077 static const char *names
[] = {
1085 res
= platform_get_resource(pdev
, IORESOURCE_IO
, 0);
1086 if (!request_region(res
->start
, IT87_EC_EXTENT
, DRVNAME
)) {
1087 dev_err(dev
, "Failed to request region 0x%lx-0x%lx\n",
1088 (unsigned long)res
->start
,
1089 (unsigned long)(res
->start
+ IT87_EC_EXTENT
- 1));
1094 if (!(data
= kzalloc(sizeof(struct it87_data
), GFP_KERNEL
))) {
1099 data
->addr
= res
->start
;
1100 data
->type
= sio_data
->type
;
1101 data
->revision
= sio_data
->revision
;
1102 data
->name
= names
[sio_data
->type
];
1104 /* Now, we do the remaining detection. */
1105 if ((it87_read_value(data
, IT87_REG_CONFIG
) & 0x80)
1106 || it87_read_value(data
, IT87_REG_CHIPID
) != 0x90) {
1111 platform_set_drvdata(pdev
, data
);
1113 mutex_init(&data
->update_lock
);
1115 /* Check PWM configuration */
1116 enable_pwm_interface
= it87_check_pwm(dev
);
1118 /* Initialize the IT87 chip */
1119 it87_init_device(pdev
);
1121 /* Register sysfs hooks */
1122 if ((err
= sysfs_create_group(&dev
->kobj
, &it87_group
)))
1125 /* Do not create fan files for disabled fans */
1126 if (has_16bit_fans(data
)) {
1127 /* 16-bit tachometers */
1128 if (data
->has_fan
& (1 << 0)) {
1129 if ((err
= device_create_file(dev
,
1130 &sensor_dev_attr_fan1_input16
.dev_attr
))
1131 || (err
= device_create_file(dev
,
1132 &sensor_dev_attr_fan1_min16
.dev_attr
))
1133 || (err
= device_create_file(dev
,
1134 &sensor_dev_attr_fan1_alarm
.dev_attr
)))
1137 if (data
->has_fan
& (1 << 1)) {
1138 if ((err
= device_create_file(dev
,
1139 &sensor_dev_attr_fan2_input16
.dev_attr
))
1140 || (err
= device_create_file(dev
,
1141 &sensor_dev_attr_fan2_min16
.dev_attr
))
1142 || (err
= device_create_file(dev
,
1143 &sensor_dev_attr_fan2_alarm
.dev_attr
)))
1146 if (data
->has_fan
& (1 << 2)) {
1147 if ((err
= device_create_file(dev
,
1148 &sensor_dev_attr_fan3_input16
.dev_attr
))
1149 || (err
= device_create_file(dev
,
1150 &sensor_dev_attr_fan3_min16
.dev_attr
))
1151 || (err
= device_create_file(dev
,
1152 &sensor_dev_attr_fan3_alarm
.dev_attr
)))
1155 if (data
->has_fan
& (1 << 3)) {
1156 if ((err
= device_create_file(dev
,
1157 &sensor_dev_attr_fan4_input16
.dev_attr
))
1158 || (err
= device_create_file(dev
,
1159 &sensor_dev_attr_fan4_min16
.dev_attr
))
1160 || (err
= device_create_file(dev
,
1161 &sensor_dev_attr_fan4_alarm
.dev_attr
)))
1164 if (data
->has_fan
& (1 << 4)) {
1165 if ((err
= device_create_file(dev
,
1166 &sensor_dev_attr_fan5_input16
.dev_attr
))
1167 || (err
= device_create_file(dev
,
1168 &sensor_dev_attr_fan5_min16
.dev_attr
))
1169 || (err
= device_create_file(dev
,
1170 &sensor_dev_attr_fan5_alarm
.dev_attr
)))
1174 /* 8-bit tachometers with clock divider */
1175 if (data
->has_fan
& (1 << 0)) {
1176 if ((err
= device_create_file(dev
,
1177 &sensor_dev_attr_fan1_input
.dev_attr
))
1178 || (err
= device_create_file(dev
,
1179 &sensor_dev_attr_fan1_min
.dev_attr
))
1180 || (err
= device_create_file(dev
,
1181 &sensor_dev_attr_fan1_div
.dev_attr
))
1182 || (err
= device_create_file(dev
,
1183 &sensor_dev_attr_fan1_alarm
.dev_attr
)))
1186 if (data
->has_fan
& (1 << 1)) {
1187 if ((err
= device_create_file(dev
,
1188 &sensor_dev_attr_fan2_input
.dev_attr
))
1189 || (err
= device_create_file(dev
,
1190 &sensor_dev_attr_fan2_min
.dev_attr
))
1191 || (err
= device_create_file(dev
,
1192 &sensor_dev_attr_fan2_div
.dev_attr
))
1193 || (err
= device_create_file(dev
,
1194 &sensor_dev_attr_fan2_alarm
.dev_attr
)))
1197 if (data
->has_fan
& (1 << 2)) {
1198 if ((err
= device_create_file(dev
,
1199 &sensor_dev_attr_fan3_input
.dev_attr
))
1200 || (err
= device_create_file(dev
,
1201 &sensor_dev_attr_fan3_min
.dev_attr
))
1202 || (err
= device_create_file(dev
,
1203 &sensor_dev_attr_fan3_div
.dev_attr
))
1204 || (err
= device_create_file(dev
,
1205 &sensor_dev_attr_fan3_alarm
.dev_attr
)))
1210 if (enable_pwm_interface
) {
1211 if (!(sio_data
->skip_pwm
& (1 << 0))) {
1212 if ((err
= device_create_file(dev
,
1213 &sensor_dev_attr_pwm1_enable
.dev_attr
))
1214 || (err
= device_create_file(dev
,
1215 &sensor_dev_attr_pwm1
.dev_attr
))
1216 || (err
= device_create_file(dev
,
1217 &dev_attr_pwm1_freq
)))
1220 if (!(sio_data
->skip_pwm
& (1 << 1))) {
1221 if ((err
= device_create_file(dev
,
1222 &sensor_dev_attr_pwm2_enable
.dev_attr
))
1223 || (err
= device_create_file(dev
,
1224 &sensor_dev_attr_pwm2
.dev_attr
))
1225 || (err
= device_create_file(dev
,
1226 &dev_attr_pwm2_freq
)))
1229 if (!(sio_data
->skip_pwm
& (1 << 2))) {
1230 if ((err
= device_create_file(dev
,
1231 &sensor_dev_attr_pwm3_enable
.dev_attr
))
1232 || (err
= device_create_file(dev
,
1233 &sensor_dev_attr_pwm3
.dev_attr
))
1234 || (err
= device_create_file(dev
,
1235 &dev_attr_pwm3_freq
)))
1240 if (data
->type
== it8712
|| data
->type
== it8716
1241 || data
->type
== it8718
|| data
->type
== it8720
) {
1242 data
->vrm
= vid_which_vrm();
1243 /* VID reading from Super-I/O config space if available */
1244 data
->vid
= sio_data
->vid_value
;
1245 if ((err
= device_create_file(dev
,
1247 || (err
= device_create_file(dev
,
1248 &dev_attr_cpu0_vid
)))
1252 data
->hwmon_dev
= hwmon_device_register(dev
);
1253 if (IS_ERR(data
->hwmon_dev
)) {
1254 err
= PTR_ERR(data
->hwmon_dev
);
1261 sysfs_remove_group(&dev
->kobj
, &it87_group
);
1262 sysfs_remove_group(&dev
->kobj
, &it87_group_opt
);
1264 platform_set_drvdata(pdev
, NULL
);
1267 release_region(res
->start
, IT87_EC_EXTENT
);
1272 static int __devexit
it87_remove(struct platform_device
*pdev
)
1274 struct it87_data
*data
= platform_get_drvdata(pdev
);
1276 hwmon_device_unregister(data
->hwmon_dev
);
1277 sysfs_remove_group(&pdev
->dev
.kobj
, &it87_group
);
1278 sysfs_remove_group(&pdev
->dev
.kobj
, &it87_group_opt
);
1280 release_region(data
->addr
, IT87_EC_EXTENT
);
1281 platform_set_drvdata(pdev
, NULL
);
1287 /* Must be called with data->update_lock held, except during initialization.
1288 We ignore the IT87 BUSY flag at this moment - it could lead to deadlocks,
1289 would slow down the IT87 access and should not be necessary. */
1290 static int it87_read_value(struct it87_data
*data
, u8 reg
)
1292 outb_p(reg
, data
->addr
+ IT87_ADDR_REG_OFFSET
);
1293 return inb_p(data
->addr
+ IT87_DATA_REG_OFFSET
);
1296 /* Must be called with data->update_lock held, except during initialization.
1297 We ignore the IT87 BUSY flag at this moment - it could lead to deadlocks,
1298 would slow down the IT87 access and should not be necessary. */
1299 static void it87_write_value(struct it87_data
*data
, u8 reg
, u8 value
)
1301 outb_p(reg
, data
->addr
+ IT87_ADDR_REG_OFFSET
);
1302 outb_p(value
, data
->addr
+ IT87_DATA_REG_OFFSET
);
1305 /* Return 1 if and only if the PWM interface is safe to use */
1306 static int __devinit
it87_check_pwm(struct device
*dev
)
1308 struct it87_data
*data
= dev_get_drvdata(dev
);
1309 /* Some BIOSes fail to correctly configure the IT87 fans. All fans off
1310 * and polarity set to active low is sign that this is the case so we
1311 * disable pwm control to protect the user. */
1312 int tmp
= it87_read_value(data
, IT87_REG_FAN_CTL
);
1313 if ((tmp
& 0x87) == 0) {
1314 if (fix_pwm_polarity
) {
1315 /* The user asks us to attempt a chip reconfiguration.
1316 * This means switching to active high polarity and
1317 * inverting all fan speed values. */
1321 for (i
= 0; i
< 3; i
++)
1322 pwm
[i
] = it87_read_value(data
,
1325 /* If any fan is in automatic pwm mode, the polarity
1326 * might be correct, as suspicious as it seems, so we
1327 * better don't change anything (but still disable the
1328 * PWM interface). */
1329 if (!((pwm
[0] | pwm
[1] | pwm
[2]) & 0x80)) {
1330 dev_info(dev
, "Reconfiguring PWM to "
1331 "active high polarity\n");
1332 it87_write_value(data
, IT87_REG_FAN_CTL
,
1334 for (i
= 0; i
< 3; i
++)
1335 it87_write_value(data
,
1341 dev_info(dev
, "PWM configuration is "
1342 "too broken to be fixed\n");
1345 dev_info(dev
, "Detected broken BIOS "
1346 "defaults, disabling PWM interface\n");
1348 } else if (fix_pwm_polarity
) {
1349 dev_info(dev
, "PWM configuration looks "
1350 "sane, won't touch\n");
1356 /* Called when we have found a new IT87. */
1357 static void __devinit
it87_init_device(struct platform_device
*pdev
)
1359 struct it87_data
*data
= platform_get_drvdata(pdev
);
1362 /* initialize to sane defaults:
1363 * - if the chip is in manual pwm mode, this will be overwritten with
1364 * the actual settings on the chip (so in this case, initialization
1366 * - if in automatic or on/off mode, we could switch to manual mode,
1367 * read the registers and set manual_pwm_ctl accordingly, but currently
1368 * this is not implemented, so we initialize to something sane */
1369 for (i
= 0; i
< 3; i
++) {
1370 data
->manual_pwm_ctl
[i
] = 0xff;
1373 /* Some chips seem to have default value 0xff for all limit
1374 * registers. For low voltage limits it makes no sense and triggers
1375 * alarms, so change to 0 instead. For high temperature limits, it
1376 * means -1 degree C, which surprisingly doesn't trigger an alarm,
1377 * but is still confusing, so change to 127 degrees C. */
1378 for (i
= 0; i
< 8; i
++) {
1379 tmp
= it87_read_value(data
, IT87_REG_VIN_MIN(i
));
1381 it87_write_value(data
, IT87_REG_VIN_MIN(i
), 0);
1383 for (i
= 0; i
< 3; i
++) {
1384 tmp
= it87_read_value(data
, IT87_REG_TEMP_HIGH(i
));
1386 it87_write_value(data
, IT87_REG_TEMP_HIGH(i
), 127);
1389 /* Check if temperature channels are reset manually or by some reason */
1390 tmp
= it87_read_value(data
, IT87_REG_TEMP_ENABLE
);
1391 if ((tmp
& 0x3f) == 0) {
1392 /* Temp1,Temp3=thermistor; Temp2=thermal diode */
1393 tmp
= (tmp
& 0xc0) | 0x2a;
1394 it87_write_value(data
, IT87_REG_TEMP_ENABLE
, tmp
);
1398 /* Check if voltage monitors are reset manually or by some reason */
1399 tmp
= it87_read_value(data
, IT87_REG_VIN_ENABLE
);
1400 if ((tmp
& 0xff) == 0) {
1401 /* Enable all voltage monitors */
1402 it87_write_value(data
, IT87_REG_VIN_ENABLE
, 0xff);
1405 /* Check if tachometers are reset manually or by some reason */
1406 data
->fan_main_ctrl
= it87_read_value(data
, IT87_REG_FAN_MAIN_CTRL
);
1407 if ((data
->fan_main_ctrl
& 0x70) == 0) {
1408 /* Enable all fan tachometers */
1409 data
->fan_main_ctrl
|= 0x70;
1410 it87_write_value(data
, IT87_REG_FAN_MAIN_CTRL
, data
->fan_main_ctrl
);
1412 data
->has_fan
= (data
->fan_main_ctrl
>> 4) & 0x07;
1414 /* Set tachometers to 16-bit mode if needed */
1415 if (has_16bit_fans(data
)) {
1416 tmp
= it87_read_value(data
, IT87_REG_FAN_16BIT
);
1417 if (~tmp
& 0x07 & data
->has_fan
) {
1419 "Setting fan1-3 to 16-bit mode\n");
1420 it87_write_value(data
, IT87_REG_FAN_16BIT
,
1423 /* IT8705F only supports three fans. */
1424 if (data
->type
!= it87
) {
1426 data
->has_fan
|= (1 << 3); /* fan4 enabled */
1428 data
->has_fan
|= (1 << 4); /* fan5 enabled */
1432 /* Set current fan mode registers and the default settings for the
1433 * other mode registers */
1434 for (i
= 0; i
< 3; i
++) {
1435 if (data
->fan_main_ctrl
& (1 << i
)) {
1437 tmp
= it87_read_value(data
, IT87_REG_PWM(i
));
1439 /* automatic pwm - not yet implemented, but
1440 * leave the settings made by the BIOS alone
1441 * until a change is requested via the sysfs
1445 data
->manual_pwm_ctl
[i
] = PWM_FROM_REG(tmp
);
1450 /* Start monitoring */
1451 it87_write_value(data
, IT87_REG_CONFIG
,
1452 (it87_read_value(data
, IT87_REG_CONFIG
) & 0x36)
1453 | (update_vbat
? 0x41 : 0x01));
1456 static struct it87_data
*it87_update_device(struct device
*dev
)
1458 struct it87_data
*data
= dev_get_drvdata(dev
);
1461 mutex_lock(&data
->update_lock
);
1463 if (time_after(jiffies
, data
->last_updated
+ HZ
+ HZ
/ 2)
1467 /* Cleared after each update, so reenable. Value
1468 returned by this read will be previous value */
1469 it87_write_value(data
, IT87_REG_CONFIG
,
1470 it87_read_value(data
, IT87_REG_CONFIG
) | 0x40);
1472 for (i
= 0; i
<= 7; i
++) {
1474 it87_read_value(data
, IT87_REG_VIN(i
));
1476 it87_read_value(data
, IT87_REG_VIN_MIN(i
));
1478 it87_read_value(data
, IT87_REG_VIN_MAX(i
));
1480 /* in8 (battery) has no limit registers */
1482 it87_read_value(data
, IT87_REG_VIN(8));
1484 for (i
= 0; i
< 5; i
++) {
1485 /* Skip disabled fans */
1486 if (!(data
->has_fan
& (1 << i
)))
1490 it87_read_value(data
, IT87_REG_FAN_MIN
[i
]);
1491 data
->fan
[i
] = it87_read_value(data
,
1493 /* Add high byte if in 16-bit mode */
1494 if (has_16bit_fans(data
)) {
1495 data
->fan
[i
] |= it87_read_value(data
,
1496 IT87_REG_FANX
[i
]) << 8;
1497 data
->fan_min
[i
] |= it87_read_value(data
,
1498 IT87_REG_FANX_MIN
[i
]) << 8;
1501 for (i
= 0; i
< 3; i
++) {
1503 it87_read_value(data
, IT87_REG_TEMP(i
));
1504 data
->temp_high
[i
] =
1505 it87_read_value(data
, IT87_REG_TEMP_HIGH(i
));
1507 it87_read_value(data
, IT87_REG_TEMP_LOW(i
));
1510 /* Newer chips don't have clock dividers */
1511 if ((data
->has_fan
& 0x07) && !has_16bit_fans(data
)) {
1512 i
= it87_read_value(data
, IT87_REG_FAN_DIV
);
1513 data
->fan_div
[0] = i
& 0x07;
1514 data
->fan_div
[1] = (i
>> 3) & 0x07;
1515 data
->fan_div
[2] = (i
& 0x40) ? 3 : 1;
1519 it87_read_value(data
, IT87_REG_ALARM1
) |
1520 (it87_read_value(data
, IT87_REG_ALARM2
) << 8) |
1521 (it87_read_value(data
, IT87_REG_ALARM3
) << 16);
1522 data
->fan_main_ctrl
= it87_read_value(data
,
1523 IT87_REG_FAN_MAIN_CTRL
);
1524 data
->fan_ctl
= it87_read_value(data
, IT87_REG_FAN_CTL
);
1526 data
->sensor
= it87_read_value(data
, IT87_REG_TEMP_ENABLE
);
1527 /* The 8705 does not have VID capability.
1528 The 8718 and the 8720 don't use IT87_REG_VID for the
1530 if (data
->type
== it8712
|| data
->type
== it8716
) {
1531 data
->vid
= it87_read_value(data
, IT87_REG_VID
);
1532 /* The older IT8712F revisions had only 5 VID pins,
1533 but we assume it is always safe to read 6 bits. */
1536 data
->last_updated
= jiffies
;
1540 mutex_unlock(&data
->update_lock
);
1545 static int __init
it87_device_add(unsigned short address
,
1546 const struct it87_sio_data
*sio_data
)
1548 struct resource res
= {
1549 .start
= address
+ IT87_EC_OFFSET
,
1550 .end
= address
+ IT87_EC_OFFSET
+ IT87_EC_EXTENT
- 1,
1552 .flags
= IORESOURCE_IO
,
1556 err
= acpi_check_resource_conflict(&res
);
1560 pdev
= platform_device_alloc(DRVNAME
, address
);
1563 printk(KERN_ERR DRVNAME
": Device allocation failed\n");
1567 err
= platform_device_add_resources(pdev
, &res
, 1);
1569 printk(KERN_ERR DRVNAME
": Device resource addition failed "
1571 goto exit_device_put
;
1574 err
= platform_device_add_data(pdev
, sio_data
,
1575 sizeof(struct it87_sio_data
));
1577 printk(KERN_ERR DRVNAME
": Platform data allocation failed\n");
1578 goto exit_device_put
;
1581 err
= platform_device_add(pdev
);
1583 printk(KERN_ERR DRVNAME
": Device addition failed (%d)\n",
1585 goto exit_device_put
;
1591 platform_device_put(pdev
);
1596 static int __init
sm_it87_init(void)
1599 unsigned short isa_address
=0;
1600 struct it87_sio_data sio_data
;
1602 memset(&sio_data
, 0, sizeof(struct it87_sio_data
));
1603 err
= it87_find(&isa_address
, &sio_data
);
1606 err
= platform_driver_register(&it87_driver
);
1610 err
= it87_device_add(isa_address
, &sio_data
);
1612 platform_driver_unregister(&it87_driver
);
1619 static void __exit
sm_it87_exit(void)
1621 platform_device_unregister(pdev
);
1622 platform_driver_unregister(&it87_driver
);
1626 MODULE_AUTHOR("Chris Gauthron, "
1627 "Jean Delvare <khali@linux-fr.org>");
1628 MODULE_DESCRIPTION("IT8705F/8712F/8716F/8718F/8720F/8726F, SiS950 driver");
1629 module_param(update_vbat
, bool, 0);
1630 MODULE_PARM_DESC(update_vbat
, "Update vbat if set else return powerup value");
1631 module_param(fix_pwm_polarity
, bool, 0);
1632 MODULE_PARM_DESC(fix_pwm_polarity
, "Force PWM polarity to active high (DANGEROUS)");
1633 MODULE_LICENSE("GPL");
1635 module_init(sm_it87_init
);
1636 module_exit(sm_it87_exit
);