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 IT8726F Super I/O chip w/LPC interface
18 Sis950 A clone of the IT8705F
20 Copyright (C) 2001 Chris Gauthron
21 Copyright (C) 2005-2007 Jean Delvare <khali@linux-fr.org>
23 This program is free software; you can redistribute it and/or modify
24 it under the terms of the GNU General Public License as published by
25 the Free Software Foundation; either version 2 of the License, or
26 (at your option) any later version.
28 This program is distributed in the hope that it will be useful,
29 but WITHOUT ANY WARRANTY; without even the implied warranty of
30 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
31 GNU General Public License for more details.
33 You should have received a copy of the GNU General Public License
34 along with this program; if not, write to the Free Software
35 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
38 #include <linux/module.h>
39 #include <linux/init.h>
40 #include <linux/slab.h>
41 #include <linux/jiffies.h>
42 #include <linux/platform_device.h>
43 #include <linux/hwmon.h>
44 #include <linux/hwmon-sysfs.h>
45 #include <linux/hwmon-vid.h>
46 #include <linux/err.h>
47 #include <linux/mutex.h>
48 #include <linux/sysfs.h>
49 #include <linux/string.h>
50 #include <linux/dmi.h>
53 #define DRVNAME "it87"
55 enum chips
{ it87
, it8712
, it8716
, it8718
};
57 static unsigned short force_id
;
58 module_param(force_id
, ushort
, 0);
59 MODULE_PARM_DESC(force_id
, "Override the detected device ID");
61 static struct platform_device
*pdev
;
63 #define REG 0x2e /* The register to read/write */
64 #define DEV 0x07 /* Register: Logical device select */
65 #define VAL 0x2f /* The value to read/write */
66 #define PME 0x04 /* The device with the fan registers in it */
67 #define GPIO 0x07 /* The device with the IT8718F VID value in it */
68 #define DEVID 0x20 /* Register: Device ID */
69 #define DEVREV 0x22 /* Register: Device Revision */
78 static int superio_inw(int reg
)
89 superio_select(int ldn
)
111 /* Logical device 4 registers */
112 #define IT8712F_DEVID 0x8712
113 #define IT8705F_DEVID 0x8705
114 #define IT8716F_DEVID 0x8716
115 #define IT8718F_DEVID 0x8718
116 #define IT8726F_DEVID 0x8726
117 #define IT87_ACT_REG 0x30
118 #define IT87_BASE_REG 0x60
120 /* Logical device 7 registers (IT8712F and later) */
121 #define IT87_SIO_PINX2_REG 0x2c /* Pin selection */
122 #define IT87_SIO_VID_REG 0xfc /* VID value */
124 /* Update battery voltage after every reading if true */
125 static int update_vbat
;
127 /* Not all BIOSes properly configure the PWM registers */
128 static int fix_pwm_polarity
;
130 /* Many IT87 constants specified below */
132 /* Length of ISA address segment */
133 #define IT87_EXTENT 8
135 /* Length of ISA address segment for Environmental Controller */
136 #define IT87_EC_EXTENT 2
138 /* Offset of EC registers from ISA base address */
139 #define IT87_EC_OFFSET 5
141 /* Where are the ISA address/data registers relative to the EC base address */
142 #define IT87_ADDR_REG_OFFSET 0
143 #define IT87_DATA_REG_OFFSET 1
145 /*----- The IT87 registers -----*/
147 #define IT87_REG_CONFIG 0x00
149 #define IT87_REG_ALARM1 0x01
150 #define IT87_REG_ALARM2 0x02
151 #define IT87_REG_ALARM3 0x03
153 /* The IT8718F has the VID value in a different register, in Super-I/O
154 configuration space. */
155 #define IT87_REG_VID 0x0a
156 /* The IT8705F and IT8712F earlier than revision 0x08 use register 0x0b
157 for fan divisors. Later IT8712F revisions must use 16-bit tachometer
159 #define IT87_REG_FAN_DIV 0x0b
160 #define IT87_REG_FAN_16BIT 0x0c
162 /* Monitors: 9 voltage (0 to 7, battery), 3 temp (1 to 3), 3 fan (1 to 3) */
164 static const u8 IT87_REG_FAN
[] = { 0x0d, 0x0e, 0x0f, 0x80, 0x82 };
165 static const u8 IT87_REG_FAN_MIN
[] = { 0x10, 0x11, 0x12, 0x84, 0x86 };
166 static const u8 IT87_REG_FANX
[] = { 0x18, 0x19, 0x1a, 0x81, 0x83 };
167 static const u8 IT87_REG_FANX_MIN
[] = { 0x1b, 0x1c, 0x1d, 0x85, 0x87 };
168 #define IT87_REG_FAN_MAIN_CTRL 0x13
169 #define IT87_REG_FAN_CTL 0x14
170 #define IT87_REG_PWM(nr) (0x15 + (nr))
172 #define IT87_REG_VIN(nr) (0x20 + (nr))
173 #define IT87_REG_TEMP(nr) (0x29 + (nr))
175 #define IT87_REG_VIN_MAX(nr) (0x30 + (nr) * 2)
176 #define IT87_REG_VIN_MIN(nr) (0x31 + (nr) * 2)
177 #define IT87_REG_TEMP_HIGH(nr) (0x40 + (nr) * 2)
178 #define IT87_REG_TEMP_LOW(nr) (0x41 + (nr) * 2)
180 #define IT87_REG_VIN_ENABLE 0x50
181 #define IT87_REG_TEMP_ENABLE 0x51
183 #define IT87_REG_CHIPID 0x58
185 #define IN_TO_REG(val) (SENSORS_LIMIT((((val) + 8)/16),0,255))
186 #define IN_FROM_REG(val) ((val) * 16)
188 static inline u8
FAN_TO_REG(long rpm
, int div
)
192 rpm
= SENSORS_LIMIT(rpm
, 1, 1000000);
193 return SENSORS_LIMIT((1350000 + rpm
* div
/ 2) / (rpm
* div
), 1,
197 static inline u16
FAN16_TO_REG(long rpm
)
201 return SENSORS_LIMIT((1350000 + rpm
) / (rpm
* 2), 1, 0xfffe);
204 #define FAN_FROM_REG(val,div) ((val)==0?-1:(val)==255?0:1350000/((val)*(div)))
205 /* The divider is fixed to 2 in 16-bit mode */
206 #define FAN16_FROM_REG(val) ((val)==0?-1:(val)==0xffff?0:1350000/((val)*2))
208 #define TEMP_TO_REG(val) (SENSORS_LIMIT(((val)<0?(((val)-500)/1000):\
209 ((val)+500)/1000),-128,127))
210 #define TEMP_FROM_REG(val) (((val)>0x80?(val)-0x100:(val))*1000)
212 #define PWM_TO_REG(val) ((val) >> 1)
213 #define PWM_FROM_REG(val) (((val)&0x7f) << 1)
215 static int DIV_TO_REG(int val
)
218 while (answer
< 7 && (val
>>= 1))
222 #define DIV_FROM_REG(val) (1 << (val))
224 static const unsigned int pwm_freq
[8] = {
236 struct it87_sio_data
{
238 /* Values read from Super-I/O config space */
241 /* Values set based on DMI strings */
245 /* For each registered chip, we need to keep some data in memory.
246 The structure is dynamically allocated. */
248 struct device
*hwmon_dev
;
254 struct mutex update_lock
;
255 char valid
; /* !=0 if following fields are valid */
256 unsigned long last_updated
; /* In jiffies */
258 u8 in
[9]; /* Register value */
259 u8 in_max
[8]; /* Register value */
260 u8 in_min
[8]; /* Register value */
261 u8 has_fan
; /* Bitfield, fans enabled */
262 u16 fan
[5]; /* Register values, possibly combined */
263 u16 fan_min
[5]; /* Register values, possibly combined */
264 u8 temp
[3]; /* Register value */
265 u8 temp_high
[3]; /* Register value */
266 u8 temp_low
[3]; /* Register value */
267 u8 sensor
; /* Register value */
268 u8 fan_div
[3]; /* Register encoding, shifted right */
269 u8 vid
; /* Register encoding, combined */
271 u32 alarms
; /* Register encoding, combined */
272 u8 fan_main_ctrl
; /* Register value */
273 u8 fan_ctl
; /* Register value */
274 u8 manual_pwm_ctl
[3]; /* manual PWM value set by user */
277 static inline int has_16bit_fans(const struct it87_data
*data
)
279 /* IT8705F Datasheet 0.4.1, 3h == Version G.
280 IT8712F Datasheet 0.9.1, section 8.3.5 indicates 8h == Version J.
281 These are the first revisions with 16bit tachometer support. */
282 return (data
->type
== it87
&& data
->revision
>= 0x03)
283 || (data
->type
== it8712
&& data
->revision
>= 0x08)
284 || data
->type
== it8716
285 || data
->type
== it8718
;
288 static int it87_probe(struct platform_device
*pdev
);
289 static int __devexit
it87_remove(struct platform_device
*pdev
);
291 static int it87_read_value(struct it87_data
*data
, u8 reg
);
292 static void it87_write_value(struct it87_data
*data
, u8 reg
, u8 value
);
293 static struct it87_data
*it87_update_device(struct device
*dev
);
294 static int it87_check_pwm(struct device
*dev
);
295 static void it87_init_device(struct platform_device
*pdev
);
298 static struct platform_driver it87_driver
= {
300 .owner
= THIS_MODULE
,
304 .remove
= __devexit_p(it87_remove
),
307 static ssize_t
show_in(struct device
*dev
, struct device_attribute
*attr
,
310 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
311 int nr
= sensor_attr
->index
;
313 struct it87_data
*data
= it87_update_device(dev
);
314 return sprintf(buf
, "%d\n", IN_FROM_REG(data
->in
[nr
]));
317 static ssize_t
show_in_min(struct device
*dev
, struct device_attribute
*attr
,
320 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
321 int nr
= sensor_attr
->index
;
323 struct it87_data
*data
= it87_update_device(dev
);
324 return sprintf(buf
, "%d\n", IN_FROM_REG(data
->in_min
[nr
]));
327 static ssize_t
show_in_max(struct device
*dev
, struct device_attribute
*attr
,
330 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
331 int nr
= sensor_attr
->index
;
333 struct it87_data
*data
= it87_update_device(dev
);
334 return sprintf(buf
, "%d\n", IN_FROM_REG(data
->in_max
[nr
]));
337 static ssize_t
set_in_min(struct device
*dev
, struct device_attribute
*attr
,
338 const char *buf
, size_t count
)
340 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
341 int nr
= sensor_attr
->index
;
343 struct it87_data
*data
= dev_get_drvdata(dev
);
344 unsigned long val
= simple_strtoul(buf
, NULL
, 10);
346 mutex_lock(&data
->update_lock
);
347 data
->in_min
[nr
] = IN_TO_REG(val
);
348 it87_write_value(data
, IT87_REG_VIN_MIN(nr
),
350 mutex_unlock(&data
->update_lock
);
353 static ssize_t
set_in_max(struct device
*dev
, struct device_attribute
*attr
,
354 const char *buf
, size_t count
)
356 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
357 int nr
= sensor_attr
->index
;
359 struct it87_data
*data
= dev_get_drvdata(dev
);
360 unsigned long val
= simple_strtoul(buf
, NULL
, 10);
362 mutex_lock(&data
->update_lock
);
363 data
->in_max
[nr
] = IN_TO_REG(val
);
364 it87_write_value(data
, IT87_REG_VIN_MAX(nr
),
366 mutex_unlock(&data
->update_lock
);
370 #define show_in_offset(offset) \
371 static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \
372 show_in, NULL, offset);
374 #define limit_in_offset(offset) \
375 static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
376 show_in_min, set_in_min, offset); \
377 static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
378 show_in_max, set_in_max, offset);
399 static ssize_t
show_temp(struct device
*dev
, struct device_attribute
*attr
,
402 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
403 int nr
= sensor_attr
->index
;
405 struct it87_data
*data
= it87_update_device(dev
);
406 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp
[nr
]));
408 static ssize_t
show_temp_max(struct device
*dev
, struct device_attribute
*attr
,
411 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
412 int nr
= sensor_attr
->index
;
414 struct it87_data
*data
= it87_update_device(dev
);
415 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp_high
[nr
]));
417 static ssize_t
show_temp_min(struct device
*dev
, struct device_attribute
*attr
,
420 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
421 int nr
= sensor_attr
->index
;
423 struct it87_data
*data
= it87_update_device(dev
);
424 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp_low
[nr
]));
426 static ssize_t
set_temp_max(struct device
*dev
, struct device_attribute
*attr
,
427 const char *buf
, size_t count
)
429 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
430 int nr
= sensor_attr
->index
;
432 struct it87_data
*data
= dev_get_drvdata(dev
);
433 int val
= simple_strtol(buf
, NULL
, 10);
435 mutex_lock(&data
->update_lock
);
436 data
->temp_high
[nr
] = TEMP_TO_REG(val
);
437 it87_write_value(data
, IT87_REG_TEMP_HIGH(nr
), data
->temp_high
[nr
]);
438 mutex_unlock(&data
->update_lock
);
441 static ssize_t
set_temp_min(struct device
*dev
, struct device_attribute
*attr
,
442 const char *buf
, size_t count
)
444 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
445 int nr
= sensor_attr
->index
;
447 struct it87_data
*data
= dev_get_drvdata(dev
);
448 int val
= simple_strtol(buf
, NULL
, 10);
450 mutex_lock(&data
->update_lock
);
451 data
->temp_low
[nr
] = TEMP_TO_REG(val
);
452 it87_write_value(data
, IT87_REG_TEMP_LOW(nr
), data
->temp_low
[nr
]);
453 mutex_unlock(&data
->update_lock
);
456 #define show_temp_offset(offset) \
457 static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, \
458 show_temp, NULL, offset - 1); \
459 static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \
460 show_temp_max, set_temp_max, offset - 1); \
461 static SENSOR_DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR, \
462 show_temp_min, set_temp_min, offset - 1);
468 static ssize_t
show_sensor(struct device
*dev
, struct device_attribute
*attr
,
471 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
472 int nr
= sensor_attr
->index
;
474 struct it87_data
*data
= it87_update_device(dev
);
475 u8 reg
= data
->sensor
; /* In case the value is updated while we use it */
478 return sprintf(buf
, "3\n"); /* thermal diode */
480 return sprintf(buf
, "4\n"); /* thermistor */
481 return sprintf(buf
, "0\n"); /* disabled */
483 static ssize_t
set_sensor(struct device
*dev
, struct device_attribute
*attr
,
484 const char *buf
, size_t count
)
486 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
487 int nr
= sensor_attr
->index
;
489 struct it87_data
*data
= dev_get_drvdata(dev
);
490 int val
= simple_strtol(buf
, NULL
, 10);
492 mutex_lock(&data
->update_lock
);
494 data
->sensor
&= ~(1 << nr
);
495 data
->sensor
&= ~(8 << nr
);
496 if (val
== 2) { /* backwards compatibility */
497 dev_warn(dev
, "Sensor type 2 is deprecated, please use 4 "
501 /* 3 = thermal diode; 4 = thermistor; 0 = disabled */
503 data
->sensor
|= 1 << nr
;
505 data
->sensor
|= 8 << nr
;
507 mutex_unlock(&data
->update_lock
);
510 it87_write_value(data
, IT87_REG_TEMP_ENABLE
, data
->sensor
);
511 mutex_unlock(&data
->update_lock
);
514 #define show_sensor_offset(offset) \
515 static SENSOR_DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR, \
516 show_sensor, set_sensor, offset - 1);
518 show_sensor_offset(1);
519 show_sensor_offset(2);
520 show_sensor_offset(3);
523 static ssize_t
show_fan(struct device
*dev
, struct device_attribute
*attr
,
526 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
527 int nr
= sensor_attr
->index
;
529 struct it87_data
*data
= it87_update_device(dev
);
530 return sprintf(buf
,"%d\n", FAN_FROM_REG(data
->fan
[nr
],
531 DIV_FROM_REG(data
->fan_div
[nr
])));
533 static ssize_t
show_fan_min(struct device
*dev
, struct device_attribute
*attr
,
536 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
537 int nr
= sensor_attr
->index
;
539 struct it87_data
*data
= it87_update_device(dev
);
540 return sprintf(buf
,"%d\n",
541 FAN_FROM_REG(data
->fan_min
[nr
], DIV_FROM_REG(data
->fan_div
[nr
])));
543 static ssize_t
show_fan_div(struct device
*dev
, struct device_attribute
*attr
,
546 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
547 int nr
= sensor_attr
->index
;
549 struct it87_data
*data
= it87_update_device(dev
);
550 return sprintf(buf
, "%d\n", DIV_FROM_REG(data
->fan_div
[nr
]));
552 static ssize_t
show_pwm_enable(struct device
*dev
, struct device_attribute
*attr
,
555 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
556 int nr
= sensor_attr
->index
;
558 struct it87_data
*data
= it87_update_device(dev
);
559 return sprintf(buf
,"%d\n", (data
->fan_main_ctrl
& (1 << nr
)) ? 1 : 0);
561 static ssize_t
show_pwm(struct device
*dev
, struct device_attribute
*attr
,
564 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
565 int nr
= sensor_attr
->index
;
567 struct it87_data
*data
= it87_update_device(dev
);
568 return sprintf(buf
,"%d\n", data
->manual_pwm_ctl
[nr
]);
570 static ssize_t
show_pwm_freq(struct device
*dev
, struct device_attribute
*attr
,
573 struct it87_data
*data
= it87_update_device(dev
);
574 int index
= (data
->fan_ctl
>> 4) & 0x07;
576 return sprintf(buf
, "%u\n", pwm_freq
[index
]);
578 static ssize_t
set_fan_min(struct device
*dev
, struct device_attribute
*attr
,
579 const char *buf
, size_t count
)
581 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
582 int nr
= sensor_attr
->index
;
584 struct it87_data
*data
= dev_get_drvdata(dev
);
585 int val
= simple_strtol(buf
, NULL
, 10);
588 mutex_lock(&data
->update_lock
);
589 reg
= it87_read_value(data
, IT87_REG_FAN_DIV
);
591 case 0: data
->fan_div
[nr
] = reg
& 0x07; break;
592 case 1: data
->fan_div
[nr
] = (reg
>> 3) & 0x07; break;
593 case 2: data
->fan_div
[nr
] = (reg
& 0x40) ? 3 : 1; break;
596 data
->fan_min
[nr
] = FAN_TO_REG(val
, DIV_FROM_REG(data
->fan_div
[nr
]));
597 it87_write_value(data
, IT87_REG_FAN_MIN
[nr
], data
->fan_min
[nr
]);
598 mutex_unlock(&data
->update_lock
);
601 static ssize_t
set_fan_div(struct device
*dev
, struct device_attribute
*attr
,
602 const char *buf
, size_t count
)
604 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
605 int nr
= sensor_attr
->index
;
607 struct it87_data
*data
= dev_get_drvdata(dev
);
608 unsigned long val
= simple_strtoul(buf
, NULL
, 10);
612 mutex_lock(&data
->update_lock
);
613 old
= it87_read_value(data
, IT87_REG_FAN_DIV
);
615 /* Save fan min limit */
616 min
= FAN_FROM_REG(data
->fan_min
[nr
], DIV_FROM_REG(data
->fan_div
[nr
]));
621 data
->fan_div
[nr
] = DIV_TO_REG(val
);
625 data
->fan_div
[nr
] = 1;
627 data
->fan_div
[nr
] = 3;
630 val
|= (data
->fan_div
[0] & 0x07);
631 val
|= (data
->fan_div
[1] & 0x07) << 3;
632 if (data
->fan_div
[2] == 3)
634 it87_write_value(data
, IT87_REG_FAN_DIV
, val
);
636 /* Restore fan min limit */
637 data
->fan_min
[nr
] = FAN_TO_REG(min
, DIV_FROM_REG(data
->fan_div
[nr
]));
638 it87_write_value(data
, IT87_REG_FAN_MIN
[nr
], data
->fan_min
[nr
]);
640 mutex_unlock(&data
->update_lock
);
643 static ssize_t
set_pwm_enable(struct device
*dev
,
644 struct device_attribute
*attr
, const char *buf
, size_t count
)
646 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
647 int nr
= sensor_attr
->index
;
649 struct it87_data
*data
= dev_get_drvdata(dev
);
650 int val
= simple_strtol(buf
, NULL
, 10);
652 mutex_lock(&data
->update_lock
);
656 /* make sure the fan is on when in on/off mode */
657 tmp
= it87_read_value(data
, IT87_REG_FAN_CTL
);
658 it87_write_value(data
, IT87_REG_FAN_CTL
, tmp
| (1 << nr
));
659 /* set on/off mode */
660 data
->fan_main_ctrl
&= ~(1 << nr
);
661 it87_write_value(data
, IT87_REG_FAN_MAIN_CTRL
, data
->fan_main_ctrl
);
662 } else if (val
== 1) {
663 /* set SmartGuardian mode */
664 data
->fan_main_ctrl
|= (1 << nr
);
665 it87_write_value(data
, IT87_REG_FAN_MAIN_CTRL
, data
->fan_main_ctrl
);
666 /* set saved pwm value, clear FAN_CTLX PWM mode bit */
667 it87_write_value(data
, IT87_REG_PWM(nr
), PWM_TO_REG(data
->manual_pwm_ctl
[nr
]));
669 mutex_unlock(&data
->update_lock
);
673 mutex_unlock(&data
->update_lock
);
676 static ssize_t
set_pwm(struct device
*dev
, struct device_attribute
*attr
,
677 const char *buf
, size_t count
)
679 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
680 int nr
= sensor_attr
->index
;
682 struct it87_data
*data
= dev_get_drvdata(dev
);
683 int val
= simple_strtol(buf
, NULL
, 10);
685 if (val
< 0 || val
> 255)
688 mutex_lock(&data
->update_lock
);
689 data
->manual_pwm_ctl
[nr
] = val
;
690 if (data
->fan_main_ctrl
& (1 << nr
))
691 it87_write_value(data
, IT87_REG_PWM(nr
), PWM_TO_REG(data
->manual_pwm_ctl
[nr
]));
692 mutex_unlock(&data
->update_lock
);
695 static ssize_t
set_pwm_freq(struct device
*dev
,
696 struct device_attribute
*attr
, const char *buf
, size_t count
)
698 struct it87_data
*data
= dev_get_drvdata(dev
);
699 unsigned long val
= simple_strtoul(buf
, NULL
, 10);
702 /* Search for the nearest available frequency */
703 for (i
= 0; i
< 7; i
++) {
704 if (val
> (pwm_freq
[i
] + pwm_freq
[i
+1]) / 2)
708 mutex_lock(&data
->update_lock
);
709 data
->fan_ctl
= it87_read_value(data
, IT87_REG_FAN_CTL
) & 0x8f;
710 data
->fan_ctl
|= i
<< 4;
711 it87_write_value(data
, IT87_REG_FAN_CTL
, data
->fan_ctl
);
712 mutex_unlock(&data
->update_lock
);
717 #define show_fan_offset(offset) \
718 static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, \
719 show_fan, NULL, offset - 1); \
720 static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
721 show_fan_min, set_fan_min, offset - 1); \
722 static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
723 show_fan_div, set_fan_div, offset - 1);
729 #define show_pwm_offset(offset) \
730 static SENSOR_DEVICE_ATTR(pwm##offset##_enable, S_IRUGO | S_IWUSR, \
731 show_pwm_enable, set_pwm_enable, offset - 1); \
732 static SENSOR_DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \
733 show_pwm, set_pwm, offset - 1); \
734 static DEVICE_ATTR(pwm##offset##_freq, \
735 (offset == 1 ? S_IRUGO | S_IWUSR : S_IRUGO), \
736 show_pwm_freq, (offset == 1 ? set_pwm_freq : NULL));
742 /* A different set of callbacks for 16-bit fans */
743 static ssize_t
show_fan16(struct device
*dev
, struct device_attribute
*attr
,
746 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
747 int nr
= sensor_attr
->index
;
748 struct it87_data
*data
= it87_update_device(dev
);
749 return sprintf(buf
, "%d\n", FAN16_FROM_REG(data
->fan
[nr
]));
752 static ssize_t
show_fan16_min(struct device
*dev
, struct device_attribute
*attr
,
755 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
756 int nr
= sensor_attr
->index
;
757 struct it87_data
*data
= it87_update_device(dev
);
758 return sprintf(buf
, "%d\n", FAN16_FROM_REG(data
->fan_min
[nr
]));
761 static ssize_t
set_fan16_min(struct device
*dev
, struct device_attribute
*attr
,
762 const char *buf
, size_t count
)
764 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
765 int nr
= sensor_attr
->index
;
766 struct it87_data
*data
= dev_get_drvdata(dev
);
767 int val
= simple_strtol(buf
, NULL
, 10);
769 mutex_lock(&data
->update_lock
);
770 data
->fan_min
[nr
] = FAN16_TO_REG(val
);
771 it87_write_value(data
, IT87_REG_FAN_MIN
[nr
],
772 data
->fan_min
[nr
] & 0xff);
773 it87_write_value(data
, IT87_REG_FANX_MIN
[nr
],
774 data
->fan_min
[nr
] >> 8);
775 mutex_unlock(&data
->update_lock
);
779 /* We want to use the same sysfs file names as 8-bit fans, but we need
780 different variable names, so we have to use SENSOR_ATTR instead of
781 SENSOR_DEVICE_ATTR. */
782 #define show_fan16_offset(offset) \
783 static struct sensor_device_attribute sensor_dev_attr_fan##offset##_input16 \
784 = SENSOR_ATTR(fan##offset##_input, S_IRUGO, \
785 show_fan16, NULL, offset - 1); \
786 static struct sensor_device_attribute sensor_dev_attr_fan##offset##_min16 \
787 = SENSOR_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
788 show_fan16_min, set_fan16_min, offset - 1)
790 show_fan16_offset(1);
791 show_fan16_offset(2);
792 show_fan16_offset(3);
793 show_fan16_offset(4);
794 show_fan16_offset(5);
797 static ssize_t
show_alarms(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
799 struct it87_data
*data
= it87_update_device(dev
);
800 return sprintf(buf
, "%u\n", data
->alarms
);
802 static DEVICE_ATTR(alarms
, S_IRUGO
, show_alarms
, NULL
);
804 static ssize_t
show_alarm(struct device
*dev
, struct device_attribute
*attr
,
807 int bitnr
= to_sensor_dev_attr(attr
)->index
;
808 struct it87_data
*data
= it87_update_device(dev
);
809 return sprintf(buf
, "%u\n", (data
->alarms
>> bitnr
) & 1);
811 static SENSOR_DEVICE_ATTR(in0_alarm
, S_IRUGO
, show_alarm
, NULL
, 8);
812 static SENSOR_DEVICE_ATTR(in1_alarm
, S_IRUGO
, show_alarm
, NULL
, 9);
813 static SENSOR_DEVICE_ATTR(in2_alarm
, S_IRUGO
, show_alarm
, NULL
, 10);
814 static SENSOR_DEVICE_ATTR(in3_alarm
, S_IRUGO
, show_alarm
, NULL
, 11);
815 static SENSOR_DEVICE_ATTR(in4_alarm
, S_IRUGO
, show_alarm
, NULL
, 12);
816 static SENSOR_DEVICE_ATTR(in5_alarm
, S_IRUGO
, show_alarm
, NULL
, 13);
817 static SENSOR_DEVICE_ATTR(in6_alarm
, S_IRUGO
, show_alarm
, NULL
, 14);
818 static SENSOR_DEVICE_ATTR(in7_alarm
, S_IRUGO
, show_alarm
, NULL
, 15);
819 static SENSOR_DEVICE_ATTR(fan1_alarm
, S_IRUGO
, show_alarm
, NULL
, 0);
820 static SENSOR_DEVICE_ATTR(fan2_alarm
, S_IRUGO
, show_alarm
, NULL
, 1);
821 static SENSOR_DEVICE_ATTR(fan3_alarm
, S_IRUGO
, show_alarm
, NULL
, 2);
822 static SENSOR_DEVICE_ATTR(fan4_alarm
, S_IRUGO
, show_alarm
, NULL
, 3);
823 static SENSOR_DEVICE_ATTR(fan5_alarm
, S_IRUGO
, show_alarm
, NULL
, 6);
824 static SENSOR_DEVICE_ATTR(temp1_alarm
, S_IRUGO
, show_alarm
, NULL
, 16);
825 static SENSOR_DEVICE_ATTR(temp2_alarm
, S_IRUGO
, show_alarm
, NULL
, 17);
826 static SENSOR_DEVICE_ATTR(temp3_alarm
, S_IRUGO
, show_alarm
, NULL
, 18);
829 show_vrm_reg(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
831 struct it87_data
*data
= dev_get_drvdata(dev
);
832 return sprintf(buf
, "%u\n", data
->vrm
);
835 store_vrm_reg(struct device
*dev
, struct device_attribute
*attr
, const char *buf
, size_t count
)
837 struct it87_data
*data
= dev_get_drvdata(dev
);
840 val
= simple_strtoul(buf
, NULL
, 10);
845 static DEVICE_ATTR(vrm
, S_IRUGO
| S_IWUSR
, show_vrm_reg
, store_vrm_reg
);
848 show_vid_reg(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
850 struct it87_data
*data
= it87_update_device(dev
);
851 return sprintf(buf
, "%ld\n", (long) vid_from_reg(data
->vid
, data
->vrm
));
853 static DEVICE_ATTR(cpu0_vid
, S_IRUGO
, show_vid_reg
, NULL
);
855 static ssize_t
show_name(struct device
*dev
, struct device_attribute
858 struct it87_data
*data
= dev_get_drvdata(dev
);
859 return sprintf(buf
, "%s\n", data
->name
);
861 static DEVICE_ATTR(name
, S_IRUGO
, show_name
, NULL
);
863 static struct attribute
*it87_attributes
[] = {
864 &sensor_dev_attr_in0_input
.dev_attr
.attr
,
865 &sensor_dev_attr_in1_input
.dev_attr
.attr
,
866 &sensor_dev_attr_in2_input
.dev_attr
.attr
,
867 &sensor_dev_attr_in3_input
.dev_attr
.attr
,
868 &sensor_dev_attr_in4_input
.dev_attr
.attr
,
869 &sensor_dev_attr_in5_input
.dev_attr
.attr
,
870 &sensor_dev_attr_in6_input
.dev_attr
.attr
,
871 &sensor_dev_attr_in7_input
.dev_attr
.attr
,
872 &sensor_dev_attr_in8_input
.dev_attr
.attr
,
873 &sensor_dev_attr_in0_min
.dev_attr
.attr
,
874 &sensor_dev_attr_in1_min
.dev_attr
.attr
,
875 &sensor_dev_attr_in2_min
.dev_attr
.attr
,
876 &sensor_dev_attr_in3_min
.dev_attr
.attr
,
877 &sensor_dev_attr_in4_min
.dev_attr
.attr
,
878 &sensor_dev_attr_in5_min
.dev_attr
.attr
,
879 &sensor_dev_attr_in6_min
.dev_attr
.attr
,
880 &sensor_dev_attr_in7_min
.dev_attr
.attr
,
881 &sensor_dev_attr_in0_max
.dev_attr
.attr
,
882 &sensor_dev_attr_in1_max
.dev_attr
.attr
,
883 &sensor_dev_attr_in2_max
.dev_attr
.attr
,
884 &sensor_dev_attr_in3_max
.dev_attr
.attr
,
885 &sensor_dev_attr_in4_max
.dev_attr
.attr
,
886 &sensor_dev_attr_in5_max
.dev_attr
.attr
,
887 &sensor_dev_attr_in6_max
.dev_attr
.attr
,
888 &sensor_dev_attr_in7_max
.dev_attr
.attr
,
889 &sensor_dev_attr_in0_alarm
.dev_attr
.attr
,
890 &sensor_dev_attr_in1_alarm
.dev_attr
.attr
,
891 &sensor_dev_attr_in2_alarm
.dev_attr
.attr
,
892 &sensor_dev_attr_in3_alarm
.dev_attr
.attr
,
893 &sensor_dev_attr_in4_alarm
.dev_attr
.attr
,
894 &sensor_dev_attr_in5_alarm
.dev_attr
.attr
,
895 &sensor_dev_attr_in6_alarm
.dev_attr
.attr
,
896 &sensor_dev_attr_in7_alarm
.dev_attr
.attr
,
898 &sensor_dev_attr_temp1_input
.dev_attr
.attr
,
899 &sensor_dev_attr_temp2_input
.dev_attr
.attr
,
900 &sensor_dev_attr_temp3_input
.dev_attr
.attr
,
901 &sensor_dev_attr_temp1_max
.dev_attr
.attr
,
902 &sensor_dev_attr_temp2_max
.dev_attr
.attr
,
903 &sensor_dev_attr_temp3_max
.dev_attr
.attr
,
904 &sensor_dev_attr_temp1_min
.dev_attr
.attr
,
905 &sensor_dev_attr_temp2_min
.dev_attr
.attr
,
906 &sensor_dev_attr_temp3_min
.dev_attr
.attr
,
907 &sensor_dev_attr_temp1_type
.dev_attr
.attr
,
908 &sensor_dev_attr_temp2_type
.dev_attr
.attr
,
909 &sensor_dev_attr_temp3_type
.dev_attr
.attr
,
910 &sensor_dev_attr_temp1_alarm
.dev_attr
.attr
,
911 &sensor_dev_attr_temp2_alarm
.dev_attr
.attr
,
912 &sensor_dev_attr_temp3_alarm
.dev_attr
.attr
,
914 &dev_attr_alarms
.attr
,
919 static const struct attribute_group it87_group
= {
920 .attrs
= it87_attributes
,
923 static struct attribute
*it87_attributes_opt
[] = {
924 &sensor_dev_attr_fan1_input16
.dev_attr
.attr
,
925 &sensor_dev_attr_fan1_min16
.dev_attr
.attr
,
926 &sensor_dev_attr_fan2_input16
.dev_attr
.attr
,
927 &sensor_dev_attr_fan2_min16
.dev_attr
.attr
,
928 &sensor_dev_attr_fan3_input16
.dev_attr
.attr
,
929 &sensor_dev_attr_fan3_min16
.dev_attr
.attr
,
930 &sensor_dev_attr_fan4_input16
.dev_attr
.attr
,
931 &sensor_dev_attr_fan4_min16
.dev_attr
.attr
,
932 &sensor_dev_attr_fan5_input16
.dev_attr
.attr
,
933 &sensor_dev_attr_fan5_min16
.dev_attr
.attr
,
935 &sensor_dev_attr_fan1_input
.dev_attr
.attr
,
936 &sensor_dev_attr_fan1_min
.dev_attr
.attr
,
937 &sensor_dev_attr_fan1_div
.dev_attr
.attr
,
938 &sensor_dev_attr_fan2_input
.dev_attr
.attr
,
939 &sensor_dev_attr_fan2_min
.dev_attr
.attr
,
940 &sensor_dev_attr_fan2_div
.dev_attr
.attr
,
941 &sensor_dev_attr_fan3_input
.dev_attr
.attr
,
942 &sensor_dev_attr_fan3_min
.dev_attr
.attr
,
943 &sensor_dev_attr_fan3_div
.dev_attr
.attr
,
945 &sensor_dev_attr_fan1_alarm
.dev_attr
.attr
,
946 &sensor_dev_attr_fan2_alarm
.dev_attr
.attr
,
947 &sensor_dev_attr_fan3_alarm
.dev_attr
.attr
,
948 &sensor_dev_attr_fan4_alarm
.dev_attr
.attr
,
949 &sensor_dev_attr_fan5_alarm
.dev_attr
.attr
,
951 &sensor_dev_attr_pwm1_enable
.dev_attr
.attr
,
952 &sensor_dev_attr_pwm2_enable
.dev_attr
.attr
,
953 &sensor_dev_attr_pwm3_enable
.dev_attr
.attr
,
954 &sensor_dev_attr_pwm1
.dev_attr
.attr
,
955 &sensor_dev_attr_pwm2
.dev_attr
.attr
,
956 &sensor_dev_attr_pwm3
.dev_attr
.attr
,
957 &dev_attr_pwm1_freq
.attr
,
958 &dev_attr_pwm2_freq
.attr
,
959 &dev_attr_pwm3_freq
.attr
,
962 &dev_attr_cpu0_vid
.attr
,
966 static const struct attribute_group it87_group_opt
= {
967 .attrs
= it87_attributes_opt
,
970 /* SuperIO detection - will change isa_address if a chip is found */
971 static int __init
it87_find(unsigned short *address
,
972 struct it87_sio_data
*sio_data
)
976 const char *board_vendor
, *board_name
;
979 chip_type
= force_id
? force_id
: superio_inw(DEVID
);
983 sio_data
->type
= it87
;
986 sio_data
->type
= it8712
;
990 sio_data
->type
= it8716
;
993 sio_data
->type
= it8718
;
995 case 0xffff: /* No device at all */
998 pr_debug(DRVNAME
": Unsupported chip (DEVID=0x%x)\n",
1003 superio_select(PME
);
1004 if (!(superio_inb(IT87_ACT_REG
) & 0x01)) {
1005 pr_info("it87: Device not activated, skipping\n");
1009 *address
= superio_inw(IT87_BASE_REG
) & ~(IT87_EXTENT
- 1);
1010 if (*address
== 0) {
1011 pr_info("it87: Base address not set, skipping\n");
1016 sio_data
->revision
= superio_inb(DEVREV
) & 0x0f;
1017 pr_info("it87: Found IT%04xF chip at 0x%x, revision %d\n",
1018 chip_type
, *address
, sio_data
->revision
);
1020 /* Read GPIO config and VID value from LDN 7 (GPIO) */
1021 if (chip_type
!= IT8705F_DEVID
) {
1024 superio_select(GPIO
);
1025 if (chip_type
== it8718
)
1026 sio_data
->vid_value
= superio_inb(IT87_SIO_VID_REG
);
1028 reg
= superio_inb(IT87_SIO_PINX2_REG
);
1030 pr_info("it87: in3 is VCC (+5V)\n");
1032 pr_info("it87: in7 is VCCH (+5V Stand-By)\n");
1035 /* Disable specific features based on DMI strings */
1036 board_vendor
= dmi_get_system_info(DMI_BOARD_VENDOR
);
1037 board_name
= dmi_get_system_info(DMI_BOARD_NAME
);
1038 if (board_vendor
&& board_name
) {
1039 if (strcmp(board_vendor
, "nVIDIA") == 0
1040 && strcmp(board_name
, "FN68PT") == 0) {
1041 /* On the Shuttle SN68PT, FAN_CTL2 is apparently not
1042 connected to a fan, but to something else. One user
1043 has reported instant system power-off when changing
1044 the PWM2 duty cycle, so we disable it.
1045 I use the board name string as the trigger in case
1046 the same board is ever used in other systems. */
1047 pr_info("it87: Disabling pwm2 due to "
1048 "hardware constraints\n");
1049 sio_data
->skip_pwm
= (1 << 1);
1058 static int __devinit
it87_probe(struct platform_device
*pdev
)
1060 struct it87_data
*data
;
1061 struct resource
*res
;
1062 struct device
*dev
= &pdev
->dev
;
1063 struct it87_sio_data
*sio_data
= dev
->platform_data
;
1065 int enable_pwm_interface
;
1066 static const char *names
[] = {
1073 res
= platform_get_resource(pdev
, IORESOURCE_IO
, 0);
1074 if (!request_region(res
->start
, IT87_EC_EXTENT
, DRVNAME
)) {
1075 dev_err(dev
, "Failed to request region 0x%lx-0x%lx\n",
1076 (unsigned long)res
->start
,
1077 (unsigned long)(res
->start
+ IT87_EC_EXTENT
- 1));
1082 if (!(data
= kzalloc(sizeof(struct it87_data
), GFP_KERNEL
))) {
1087 data
->addr
= res
->start
;
1088 data
->type
= sio_data
->type
;
1089 data
->revision
= sio_data
->revision
;
1090 data
->name
= names
[sio_data
->type
];
1092 /* Now, we do the remaining detection. */
1093 if ((it87_read_value(data
, IT87_REG_CONFIG
) & 0x80)
1094 || it87_read_value(data
, IT87_REG_CHIPID
) != 0x90) {
1099 platform_set_drvdata(pdev
, data
);
1101 mutex_init(&data
->update_lock
);
1103 /* Check PWM configuration */
1104 enable_pwm_interface
= it87_check_pwm(dev
);
1106 /* Initialize the IT87 chip */
1107 it87_init_device(pdev
);
1109 /* Register sysfs hooks */
1110 if ((err
= sysfs_create_group(&dev
->kobj
, &it87_group
)))
1113 /* Do not create fan files for disabled fans */
1114 if (has_16bit_fans(data
)) {
1115 /* 16-bit tachometers */
1116 if (data
->has_fan
& (1 << 0)) {
1117 if ((err
= device_create_file(dev
,
1118 &sensor_dev_attr_fan1_input16
.dev_attr
))
1119 || (err
= device_create_file(dev
,
1120 &sensor_dev_attr_fan1_min16
.dev_attr
))
1121 || (err
= device_create_file(dev
,
1122 &sensor_dev_attr_fan1_alarm
.dev_attr
)))
1125 if (data
->has_fan
& (1 << 1)) {
1126 if ((err
= device_create_file(dev
,
1127 &sensor_dev_attr_fan2_input16
.dev_attr
))
1128 || (err
= device_create_file(dev
,
1129 &sensor_dev_attr_fan2_min16
.dev_attr
))
1130 || (err
= device_create_file(dev
,
1131 &sensor_dev_attr_fan2_alarm
.dev_attr
)))
1134 if (data
->has_fan
& (1 << 2)) {
1135 if ((err
= device_create_file(dev
,
1136 &sensor_dev_attr_fan3_input16
.dev_attr
))
1137 || (err
= device_create_file(dev
,
1138 &sensor_dev_attr_fan3_min16
.dev_attr
))
1139 || (err
= device_create_file(dev
,
1140 &sensor_dev_attr_fan3_alarm
.dev_attr
)))
1143 if (data
->has_fan
& (1 << 3)) {
1144 if ((err
= device_create_file(dev
,
1145 &sensor_dev_attr_fan4_input16
.dev_attr
))
1146 || (err
= device_create_file(dev
,
1147 &sensor_dev_attr_fan4_min16
.dev_attr
))
1148 || (err
= device_create_file(dev
,
1149 &sensor_dev_attr_fan4_alarm
.dev_attr
)))
1152 if (data
->has_fan
& (1 << 4)) {
1153 if ((err
= device_create_file(dev
,
1154 &sensor_dev_attr_fan5_input16
.dev_attr
))
1155 || (err
= device_create_file(dev
,
1156 &sensor_dev_attr_fan5_min16
.dev_attr
))
1157 || (err
= device_create_file(dev
,
1158 &sensor_dev_attr_fan5_alarm
.dev_attr
)))
1162 /* 8-bit tachometers with clock divider */
1163 if (data
->has_fan
& (1 << 0)) {
1164 if ((err
= device_create_file(dev
,
1165 &sensor_dev_attr_fan1_input
.dev_attr
))
1166 || (err
= device_create_file(dev
,
1167 &sensor_dev_attr_fan1_min
.dev_attr
))
1168 || (err
= device_create_file(dev
,
1169 &sensor_dev_attr_fan1_div
.dev_attr
))
1170 || (err
= device_create_file(dev
,
1171 &sensor_dev_attr_fan1_alarm
.dev_attr
)))
1174 if (data
->has_fan
& (1 << 1)) {
1175 if ((err
= device_create_file(dev
,
1176 &sensor_dev_attr_fan2_input
.dev_attr
))
1177 || (err
= device_create_file(dev
,
1178 &sensor_dev_attr_fan2_min
.dev_attr
))
1179 || (err
= device_create_file(dev
,
1180 &sensor_dev_attr_fan2_div
.dev_attr
))
1181 || (err
= device_create_file(dev
,
1182 &sensor_dev_attr_fan2_alarm
.dev_attr
)))
1185 if (data
->has_fan
& (1 << 2)) {
1186 if ((err
= device_create_file(dev
,
1187 &sensor_dev_attr_fan3_input
.dev_attr
))
1188 || (err
= device_create_file(dev
,
1189 &sensor_dev_attr_fan3_min
.dev_attr
))
1190 || (err
= device_create_file(dev
,
1191 &sensor_dev_attr_fan3_div
.dev_attr
))
1192 || (err
= device_create_file(dev
,
1193 &sensor_dev_attr_fan3_alarm
.dev_attr
)))
1198 if (enable_pwm_interface
) {
1199 if (!(sio_data
->skip_pwm
& (1 << 0))) {
1200 if ((err
= device_create_file(dev
,
1201 &sensor_dev_attr_pwm1_enable
.dev_attr
))
1202 || (err
= device_create_file(dev
,
1203 &sensor_dev_attr_pwm1
.dev_attr
))
1204 || (err
= device_create_file(dev
,
1205 &dev_attr_pwm1_freq
)))
1208 if (!(sio_data
->skip_pwm
& (1 << 1))) {
1209 if ((err
= device_create_file(dev
,
1210 &sensor_dev_attr_pwm2_enable
.dev_attr
))
1211 || (err
= device_create_file(dev
,
1212 &sensor_dev_attr_pwm2
.dev_attr
))
1213 || (err
= device_create_file(dev
,
1214 &dev_attr_pwm2_freq
)))
1217 if (!(sio_data
->skip_pwm
& (1 << 2))) {
1218 if ((err
= device_create_file(dev
,
1219 &sensor_dev_attr_pwm3_enable
.dev_attr
))
1220 || (err
= device_create_file(dev
,
1221 &sensor_dev_attr_pwm3
.dev_attr
))
1222 || (err
= device_create_file(dev
,
1223 &dev_attr_pwm3_freq
)))
1228 if (data
->type
== it8712
|| data
->type
== it8716
1229 || data
->type
== it8718
) {
1230 data
->vrm
= vid_which_vrm();
1231 /* VID reading from Super-I/O config space if available */
1232 data
->vid
= sio_data
->vid_value
;
1233 if ((err
= device_create_file(dev
,
1235 || (err
= device_create_file(dev
,
1236 &dev_attr_cpu0_vid
)))
1240 data
->hwmon_dev
= hwmon_device_register(dev
);
1241 if (IS_ERR(data
->hwmon_dev
)) {
1242 err
= PTR_ERR(data
->hwmon_dev
);
1249 sysfs_remove_group(&dev
->kobj
, &it87_group
);
1250 sysfs_remove_group(&dev
->kobj
, &it87_group_opt
);
1252 platform_set_drvdata(pdev
, NULL
);
1255 release_region(res
->start
, IT87_EC_EXTENT
);
1260 static int __devexit
it87_remove(struct platform_device
*pdev
)
1262 struct it87_data
*data
= platform_get_drvdata(pdev
);
1264 hwmon_device_unregister(data
->hwmon_dev
);
1265 sysfs_remove_group(&pdev
->dev
.kobj
, &it87_group
);
1266 sysfs_remove_group(&pdev
->dev
.kobj
, &it87_group_opt
);
1268 release_region(data
->addr
, IT87_EC_EXTENT
);
1269 platform_set_drvdata(pdev
, NULL
);
1275 /* Must be called with data->update_lock held, except during initialization.
1276 We ignore the IT87 BUSY flag at this moment - it could lead to deadlocks,
1277 would slow down the IT87 access and should not be necessary. */
1278 static int it87_read_value(struct it87_data
*data
, u8 reg
)
1280 outb_p(reg
, data
->addr
+ IT87_ADDR_REG_OFFSET
);
1281 return inb_p(data
->addr
+ IT87_DATA_REG_OFFSET
);
1284 /* Must be called with data->update_lock held, except during initialization.
1285 We ignore the IT87 BUSY flag at this moment - it could lead to deadlocks,
1286 would slow down the IT87 access and should not be necessary. */
1287 static void it87_write_value(struct it87_data
*data
, u8 reg
, u8 value
)
1289 outb_p(reg
, data
->addr
+ IT87_ADDR_REG_OFFSET
);
1290 outb_p(value
, data
->addr
+ IT87_DATA_REG_OFFSET
);
1293 /* Return 1 if and only if the PWM interface is safe to use */
1294 static int __devinit
it87_check_pwm(struct device
*dev
)
1296 struct it87_data
*data
= dev_get_drvdata(dev
);
1297 /* Some BIOSes fail to correctly configure the IT87 fans. All fans off
1298 * and polarity set to active low is sign that this is the case so we
1299 * disable pwm control to protect the user. */
1300 int tmp
= it87_read_value(data
, IT87_REG_FAN_CTL
);
1301 if ((tmp
& 0x87) == 0) {
1302 if (fix_pwm_polarity
) {
1303 /* The user asks us to attempt a chip reconfiguration.
1304 * This means switching to active high polarity and
1305 * inverting all fan speed values. */
1309 for (i
= 0; i
< 3; i
++)
1310 pwm
[i
] = it87_read_value(data
,
1313 /* If any fan is in automatic pwm mode, the polarity
1314 * might be correct, as suspicious as it seems, so we
1315 * better don't change anything (but still disable the
1316 * PWM interface). */
1317 if (!((pwm
[0] | pwm
[1] | pwm
[2]) & 0x80)) {
1318 dev_info(dev
, "Reconfiguring PWM to "
1319 "active high polarity\n");
1320 it87_write_value(data
, IT87_REG_FAN_CTL
,
1322 for (i
= 0; i
< 3; i
++)
1323 it87_write_value(data
,
1329 dev_info(dev
, "PWM configuration is "
1330 "too broken to be fixed\n");
1333 dev_info(dev
, "Detected broken BIOS "
1334 "defaults, disabling PWM interface\n");
1336 } else if (fix_pwm_polarity
) {
1337 dev_info(dev
, "PWM configuration looks "
1338 "sane, won't touch\n");
1344 /* Called when we have found a new IT87. */
1345 static void __devinit
it87_init_device(struct platform_device
*pdev
)
1347 struct it87_data
*data
= platform_get_drvdata(pdev
);
1350 /* initialize to sane defaults:
1351 * - if the chip is in manual pwm mode, this will be overwritten with
1352 * the actual settings on the chip (so in this case, initialization
1354 * - if in automatic or on/off mode, we could switch to manual mode,
1355 * read the registers and set manual_pwm_ctl accordingly, but currently
1356 * this is not implemented, so we initialize to something sane */
1357 for (i
= 0; i
< 3; i
++) {
1358 data
->manual_pwm_ctl
[i
] = 0xff;
1361 /* Some chips seem to have default value 0xff for all limit
1362 * registers. For low voltage limits it makes no sense and triggers
1363 * alarms, so change to 0 instead. For high temperature limits, it
1364 * means -1 degree C, which surprisingly doesn't trigger an alarm,
1365 * but is still confusing, so change to 127 degrees C. */
1366 for (i
= 0; i
< 8; i
++) {
1367 tmp
= it87_read_value(data
, IT87_REG_VIN_MIN(i
));
1369 it87_write_value(data
, IT87_REG_VIN_MIN(i
), 0);
1371 for (i
= 0; i
< 3; i
++) {
1372 tmp
= it87_read_value(data
, IT87_REG_TEMP_HIGH(i
));
1374 it87_write_value(data
, IT87_REG_TEMP_HIGH(i
), 127);
1377 /* Check if temperature channnels are reset manually or by some reason */
1378 tmp
= it87_read_value(data
, IT87_REG_TEMP_ENABLE
);
1379 if ((tmp
& 0x3f) == 0) {
1380 /* Temp1,Temp3=thermistor; Temp2=thermal diode */
1381 tmp
= (tmp
& 0xc0) | 0x2a;
1382 it87_write_value(data
, IT87_REG_TEMP_ENABLE
, tmp
);
1386 /* Check if voltage monitors are reset manually or by some reason */
1387 tmp
= it87_read_value(data
, IT87_REG_VIN_ENABLE
);
1388 if ((tmp
& 0xff) == 0) {
1389 /* Enable all voltage monitors */
1390 it87_write_value(data
, IT87_REG_VIN_ENABLE
, 0xff);
1393 /* Check if tachometers are reset manually or by some reason */
1394 data
->fan_main_ctrl
= it87_read_value(data
, IT87_REG_FAN_MAIN_CTRL
);
1395 if ((data
->fan_main_ctrl
& 0x70) == 0) {
1396 /* Enable all fan tachometers */
1397 data
->fan_main_ctrl
|= 0x70;
1398 it87_write_value(data
, IT87_REG_FAN_MAIN_CTRL
, data
->fan_main_ctrl
);
1400 data
->has_fan
= (data
->fan_main_ctrl
>> 4) & 0x07;
1402 /* Set tachometers to 16-bit mode if needed */
1403 if (has_16bit_fans(data
)) {
1404 tmp
= it87_read_value(data
, IT87_REG_FAN_16BIT
);
1405 if (~tmp
& 0x07 & data
->has_fan
) {
1407 "Setting fan1-3 to 16-bit mode\n");
1408 it87_write_value(data
, IT87_REG_FAN_16BIT
,
1411 /* IT8705F only supports three fans. */
1412 if (data
->type
!= it87
) {
1414 data
->has_fan
|= (1 << 3); /* fan4 enabled */
1416 data
->has_fan
|= (1 << 4); /* fan5 enabled */
1420 /* Set current fan mode registers and the default settings for the
1421 * other mode registers */
1422 for (i
= 0; i
< 3; i
++) {
1423 if (data
->fan_main_ctrl
& (1 << i
)) {
1425 tmp
= it87_read_value(data
, IT87_REG_PWM(i
));
1427 /* automatic pwm - not yet implemented, but
1428 * leave the settings made by the BIOS alone
1429 * until a change is requested via the sysfs
1433 data
->manual_pwm_ctl
[i
] = PWM_FROM_REG(tmp
);
1438 /* Start monitoring */
1439 it87_write_value(data
, IT87_REG_CONFIG
,
1440 (it87_read_value(data
, IT87_REG_CONFIG
) & 0x36)
1441 | (update_vbat
? 0x41 : 0x01));
1444 static struct it87_data
*it87_update_device(struct device
*dev
)
1446 struct it87_data
*data
= dev_get_drvdata(dev
);
1449 mutex_lock(&data
->update_lock
);
1451 if (time_after(jiffies
, data
->last_updated
+ HZ
+ HZ
/ 2)
1455 /* Cleared after each update, so reenable. Value
1456 returned by this read will be previous value */
1457 it87_write_value(data
, IT87_REG_CONFIG
,
1458 it87_read_value(data
, IT87_REG_CONFIG
) | 0x40);
1460 for (i
= 0; i
<= 7; i
++) {
1462 it87_read_value(data
, IT87_REG_VIN(i
));
1464 it87_read_value(data
, IT87_REG_VIN_MIN(i
));
1466 it87_read_value(data
, IT87_REG_VIN_MAX(i
));
1468 /* in8 (battery) has no limit registers */
1470 it87_read_value(data
, IT87_REG_VIN(8));
1472 for (i
= 0; i
< 5; i
++) {
1473 /* Skip disabled fans */
1474 if (!(data
->has_fan
& (1 << i
)))
1478 it87_read_value(data
, IT87_REG_FAN_MIN
[i
]);
1479 data
->fan
[i
] = it87_read_value(data
,
1481 /* Add high byte if in 16-bit mode */
1482 if (has_16bit_fans(data
)) {
1483 data
->fan
[i
] |= it87_read_value(data
,
1484 IT87_REG_FANX
[i
]) << 8;
1485 data
->fan_min
[i
] |= it87_read_value(data
,
1486 IT87_REG_FANX_MIN
[i
]) << 8;
1489 for (i
= 0; i
< 3; i
++) {
1491 it87_read_value(data
, IT87_REG_TEMP(i
));
1492 data
->temp_high
[i
] =
1493 it87_read_value(data
, IT87_REG_TEMP_HIGH(i
));
1495 it87_read_value(data
, IT87_REG_TEMP_LOW(i
));
1498 /* Newer chips don't have clock dividers */
1499 if ((data
->has_fan
& 0x07) && !has_16bit_fans(data
)) {
1500 i
= it87_read_value(data
, IT87_REG_FAN_DIV
);
1501 data
->fan_div
[0] = i
& 0x07;
1502 data
->fan_div
[1] = (i
>> 3) & 0x07;
1503 data
->fan_div
[2] = (i
& 0x40) ? 3 : 1;
1507 it87_read_value(data
, IT87_REG_ALARM1
) |
1508 (it87_read_value(data
, IT87_REG_ALARM2
) << 8) |
1509 (it87_read_value(data
, IT87_REG_ALARM3
) << 16);
1510 data
->fan_main_ctrl
= it87_read_value(data
,
1511 IT87_REG_FAN_MAIN_CTRL
);
1512 data
->fan_ctl
= it87_read_value(data
, IT87_REG_FAN_CTL
);
1514 data
->sensor
= it87_read_value(data
, IT87_REG_TEMP_ENABLE
);
1515 /* The 8705 does not have VID capability.
1516 The 8718 does not use IT87_REG_VID for the same purpose. */
1517 if (data
->type
== it8712
|| data
->type
== it8716
) {
1518 data
->vid
= it87_read_value(data
, IT87_REG_VID
);
1519 /* The older IT8712F revisions had only 5 VID pins,
1520 but we assume it is always safe to read 6 bits. */
1523 data
->last_updated
= jiffies
;
1527 mutex_unlock(&data
->update_lock
);
1532 static int __init
it87_device_add(unsigned short address
,
1533 const struct it87_sio_data
*sio_data
)
1535 struct resource res
= {
1536 .start
= address
+ IT87_EC_OFFSET
,
1537 .end
= address
+ IT87_EC_OFFSET
+ IT87_EC_EXTENT
- 1,
1539 .flags
= IORESOURCE_IO
,
1543 pdev
= platform_device_alloc(DRVNAME
, address
);
1546 printk(KERN_ERR DRVNAME
": Device allocation failed\n");
1550 err
= platform_device_add_resources(pdev
, &res
, 1);
1552 printk(KERN_ERR DRVNAME
": Device resource addition failed "
1554 goto exit_device_put
;
1557 err
= platform_device_add_data(pdev
, sio_data
,
1558 sizeof(struct it87_sio_data
));
1560 printk(KERN_ERR DRVNAME
": Platform data allocation failed\n");
1561 goto exit_device_put
;
1564 err
= platform_device_add(pdev
);
1566 printk(KERN_ERR DRVNAME
": Device addition failed (%d)\n",
1568 goto exit_device_put
;
1574 platform_device_put(pdev
);
1579 static int __init
sm_it87_init(void)
1582 unsigned short isa_address
=0;
1583 struct it87_sio_data sio_data
;
1585 memset(&sio_data
, 0, sizeof(struct it87_sio_data
));
1586 err
= it87_find(&isa_address
, &sio_data
);
1589 err
= platform_driver_register(&it87_driver
);
1593 err
= it87_device_add(isa_address
, &sio_data
);
1595 platform_driver_unregister(&it87_driver
);
1602 static void __exit
sm_it87_exit(void)
1604 platform_device_unregister(pdev
);
1605 platform_driver_unregister(&it87_driver
);
1609 MODULE_AUTHOR("Chris Gauthron, "
1610 "Jean Delvare <khali@linux-fr.org>");
1611 MODULE_DESCRIPTION("IT8705F/8712F/8716F/8718F/8726F, SiS950 driver");
1612 module_param(update_vbat
, bool, 0);
1613 MODULE_PARM_DESC(update_vbat
, "Update vbat if set else return powerup value");
1614 module_param(fix_pwm_polarity
, bool, 0);
1615 MODULE_PARM_DESC(fix_pwm_polarity
, "Force PWM polarity to active high (DANGEROUS)");
1616 MODULE_LICENSE("GPL");
1618 module_init(sm_it87_init
);
1619 module_exit(sm_it87_exit
);