it87.c 49.1 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4
/*
    it87.c - Part of lm_sensors, Linux kernel modules for hardware
             monitoring.

5 6 7 8 9 10 11 12
    The IT8705F is an LPC-based Super I/O part that contains UARTs, a
    parallel port, an IR port, a MIDI port, a floppy controller, etc., in
    addition to an Environment Controller (Enhanced Hardware Monitor and
    Fan Controller)

    This driver supports only the Environment Controller in the IT8705F and
    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
J
Jean Delvare 已提交
15
              IT8716F  Super I/O chip w/LPC interface
J
Jean Delvare 已提交
16
              IT8718F  Super I/O chip w/LPC interface
17
              IT8720F  Super I/O chip w/LPC interface
R
Rudolf Marek 已提交
18
              IT8726F  Super I/O chip w/LPC interface
L
Linus Torvalds 已提交
19 20
              Sis950   A clone of the IT8705F

21
    Copyright (C) 2001 Chris Gauthron
22
    Copyright (C) 2005-2007 Jean Delvare <khali@linux-fr.org>
L
Linus Torvalds 已提交
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/jiffies.h>
43
#include <linux/platform_device.h>
44
#include <linux/hwmon.h>
45 46
#include <linux/hwmon-sysfs.h>
#include <linux/hwmon-vid.h>
47
#include <linux/err.h>
48
#include <linux/mutex.h>
49
#include <linux/sysfs.h>
50 51
#include <linux/string.h>
#include <linux/dmi.h>
52
#include <linux/acpi.h>
L
Linus Torvalds 已提交
53 54
#include <asm/io.h>

55
#define DRVNAME "it87"
L
Linus Torvalds 已提交
56

57
enum chips { it87, it8712, it8716, it8718, it8720 };
L
Linus Torvalds 已提交
58

59 60 61 62
static unsigned short force_id;
module_param(force_id, ushort, 0);
MODULE_PARM_DESC(force_id, "Override the detected device ID");

63 64
static struct platform_device *pdev;

L
Linus Torvalds 已提交
65 66 67 68
#define	REG	0x2e	/* The register to read/write */
#define	DEV	0x07	/* Register: Logical device select */
#define	VAL	0x2f	/* The value to read/write */
#define PME	0x04	/* The device with the fan registers in it */
69 70 71 72

/* The device with the IT8718F/IT8720F VID value in it */
#define GPIO	0x07

L
Linus Torvalds 已提交
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
#define	DEVID	0x20	/* Register: Device ID */
#define	DEVREV	0x22	/* Register: Device Revision */

static inline int
superio_inb(int reg)
{
	outb(reg, REG);
	return inb(VAL);
}

static int superio_inw(int reg)
{
	int val;
	outb(reg++, REG);
	val = inb(VAL) << 8;
	outb(reg, REG);
	val |= inb(VAL);
	return val;
}

static inline void
J
Jean Delvare 已提交
94
superio_select(int ldn)
L
Linus Torvalds 已提交
95 96
{
	outb(DEV, REG);
J
Jean Delvare 已提交
97
	outb(ldn, VAL);
L
Linus Torvalds 已提交
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
}

static inline void
superio_enter(void)
{
	outb(0x87, REG);
	outb(0x01, REG);
	outb(0x55, REG);
	outb(0x55, REG);
}

static inline void
superio_exit(void)
{
	outb(0x02, REG);
	outb(0x02, VAL);
}

J
Jean Delvare 已提交
116
/* Logical device 4 registers */
L
Linus Torvalds 已提交
117 118
#define IT8712F_DEVID 0x8712
#define IT8705F_DEVID 0x8705
J
Jean Delvare 已提交
119
#define IT8716F_DEVID 0x8716
J
Jean Delvare 已提交
120
#define IT8718F_DEVID 0x8718
121
#define IT8720F_DEVID 0x8720
R
Rudolf Marek 已提交
122
#define IT8726F_DEVID 0x8726
L
Linus Torvalds 已提交
123 124 125
#define IT87_ACT_REG  0x30
#define IT87_BASE_REG 0x60

J
Jean Delvare 已提交
126 127 128 129
/* Logical device 7 registers (IT8712F and later) */
#define IT87_SIO_PINX2_REG	0x2c	/* Pin selection */
#define IT87_SIO_VID_REG	0xfc	/* VID value */

L
Linus Torvalds 已提交
130 131 132 133 134 135 136 137 138 139 140
/* Update battery voltage after every reading if true */
static int update_vbat;

/* Not all BIOSes properly configure the PWM registers */
static int fix_pwm_polarity;

/* Many IT87 constants specified below */

/* Length of ISA address segment */
#define IT87_EXTENT 8

141 142 143 144 145 146 147 148 149
/* Length of ISA address segment for Environmental Controller */
#define IT87_EC_EXTENT 2

/* Offset of EC registers from ISA base address */
#define IT87_EC_OFFSET 5

/* Where are the ISA address/data registers relative to the EC base address */
#define IT87_ADDR_REG_OFFSET 0
#define IT87_DATA_REG_OFFSET 1
L
Linus Torvalds 已提交
150 151 152 153 154 155 156 157 158

/*----- The IT87 registers -----*/

#define IT87_REG_CONFIG        0x00

#define IT87_REG_ALARM1        0x01
#define IT87_REG_ALARM2        0x02
#define IT87_REG_ALARM3        0x03

159 160
/* The IT8718F and IT8720F have the VID value in a different register, in
   Super-I/O configuration space. */
L
Linus Torvalds 已提交
161
#define IT87_REG_VID           0x0a
162 163 164
/* The IT8705F and IT8712F earlier than revision 0x08 use register 0x0b
   for fan divisors. Later IT8712F revisions must use 16-bit tachometer
   mode. */
L
Linus Torvalds 已提交
165
#define IT87_REG_FAN_DIV       0x0b
J
Jean Delvare 已提交
166
#define IT87_REG_FAN_16BIT     0x0c
L
Linus Torvalds 已提交
167 168 169

/* Monitors: 9 voltage (0 to 7, battery), 3 temp (1 to 3), 3 fan (1 to 3) */

170 171 172 173
static const u8 IT87_REG_FAN[]		= { 0x0d, 0x0e, 0x0f, 0x80, 0x82 };
static const u8 IT87_REG_FAN_MIN[]	= { 0x10, 0x11, 0x12, 0x84, 0x86 };
static const u8 IT87_REG_FANX[]		= { 0x18, 0x19, 0x1a, 0x81, 0x83 };
static const u8 IT87_REG_FANX_MIN[]	= { 0x1b, 0x1c, 0x1d, 0x85, 0x87 };
L
Linus Torvalds 已提交
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
#define IT87_REG_FAN_MAIN_CTRL 0x13
#define IT87_REG_FAN_CTL       0x14
#define IT87_REG_PWM(nr)       (0x15 + (nr))

#define IT87_REG_VIN(nr)       (0x20 + (nr))
#define IT87_REG_TEMP(nr)      (0x29 + (nr))

#define IT87_REG_VIN_MAX(nr)   (0x30 + (nr) * 2)
#define IT87_REG_VIN_MIN(nr)   (0x31 + (nr) * 2)
#define IT87_REG_TEMP_HIGH(nr) (0x40 + (nr) * 2)
#define IT87_REG_TEMP_LOW(nr)  (0x41 + (nr) * 2)

#define IT87_REG_VIN_ENABLE    0x50
#define IT87_REG_TEMP_ENABLE   0x51

#define IT87_REG_CHIPID        0x58

#define IN_TO_REG(val)  (SENSORS_LIMIT((((val) + 8)/16),0,255))
#define IN_FROM_REG(val) ((val) * 16)

static inline u8 FAN_TO_REG(long rpm, int div)
{
	if (rpm == 0)
		return 255;
	rpm = SENSORS_LIMIT(rpm, 1, 1000000);
	return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1,
			     254);
}

J
Jean Delvare 已提交
203 204 205 206 207 208 209
static inline u16 FAN16_TO_REG(long rpm)
{
	if (rpm == 0)
		return 0xffff;
	return SENSORS_LIMIT((1350000 + rpm) / (rpm * 2), 1, 0xfffe);
}

L
Linus Torvalds 已提交
210
#define FAN_FROM_REG(val,div) ((val)==0?-1:(val)==255?0:1350000/((val)*(div)))
J
Jean Delvare 已提交
211 212
/* The divider is fixed to 2 in 16-bit mode */
#define FAN16_FROM_REG(val) ((val)==0?-1:(val)==0xffff?0:1350000/((val)*2))
L
Linus Torvalds 已提交
213 214 215

#define TEMP_TO_REG(val) (SENSORS_LIMIT(((val)<0?(((val)-500)/1000):\
					((val)+500)/1000),-128,127))
216
#define TEMP_FROM_REG(val) ((val) * 1000)
L
Linus Torvalds 已提交
217 218 219 220 221 222 223

#define PWM_TO_REG(val)   ((val) >> 1)
#define PWM_FROM_REG(val) (((val)&0x7f) << 1)

static int DIV_TO_REG(int val)
{
	int answer = 0;
224
	while (answer < 7 && (val >>= 1))
L
Linus Torvalds 已提交
225 226 227 228 229
		answer++;
	return answer;
}
#define DIV_FROM_REG(val) (1 << (val))

230 231 232 233 234 235 236 237 238 239 240
static const unsigned int pwm_freq[8] = {
	48000000 / 128,
	24000000 / 128,
	12000000 / 128,
	8000000 / 128,
	6000000 / 128,
	3000000 / 128,
	1500000 / 128,
	750000 / 128,
};

L
Linus Torvalds 已提交
241

242 243 244
struct it87_sio_data {
	enum chips type;
	/* Values read from Super-I/O config space */
245
	u8 revision;
246
	u8 vid_value;
247 248
	/* Values set based on DMI strings */
	u8 skip_pwm;
249 250
};

251 252
/* For each registered chip, we need to keep some data in memory.
   The structure is dynamically allocated. */
L
Linus Torvalds 已提交
253
struct it87_data {
254
	struct device *hwmon_dev;
L
Linus Torvalds 已提交
255
	enum chips type;
256
	u8 revision;
L
Linus Torvalds 已提交
257

258 259
	unsigned short addr;
	const char *name;
260
	struct mutex update_lock;
L
Linus Torvalds 已提交
261 262 263 264
	char valid;		/* !=0 if following fields are valid */
	unsigned long last_updated;	/* In jiffies */

	u8 in[9];		/* Register value */
J
Jean Delvare 已提交
265 266
	u8 in_max[8];		/* Register value */
	u8 in_min[8];		/* Register value */
267
	u8 has_fan;		/* Bitfield, fans enabled */
268 269
	u16 fan[5];		/* Register values, possibly combined */
	u16 fan_min[5];		/* Register values, possibly combined */
270 271 272
	s8 temp[3];		/* Register value */
	s8 temp_high[3];	/* Register value */
	s8 temp_low[3];		/* Register value */
L
Linus Torvalds 已提交
273 274 275
	u8 sensor;		/* Register value */
	u8 fan_div[3];		/* Register encoding, shifted right */
	u8 vid;			/* Register encoding, combined */
276
	u8 vrm;
L
Linus Torvalds 已提交
277 278
	u32 alarms;		/* Register encoding, combined */
	u8 fan_main_ctrl;	/* Register value */
279
	u8 fan_ctl;		/* Register value */
L
Linus Torvalds 已提交
280 281 282
	u8 manual_pwm_ctl[3];   /* manual PWM value set by user */
};

283 284
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 288
	   These are the first revisions with 16bit tachometer support. */
	return (data->type == it87 && data->revision >= 0x03)
289
	    || (data->type == it8712 && data->revision >= 0x08)
290
	    || data->type == it8716
291 292
	    || data->type == it8718
	    || data->type == it8720;
293
}
L
Linus Torvalds 已提交
294

295
static int it87_probe(struct platform_device *pdev);
296
static int __devexit it87_remove(struct platform_device *pdev);
L
Linus Torvalds 已提交
297

298 299
static int it87_read_value(struct it87_data *data, u8 reg);
static void it87_write_value(struct it87_data *data, u8 reg, u8 value);
L
Linus Torvalds 已提交
300
static struct it87_data *it87_update_device(struct device *dev);
301 302
static int it87_check_pwm(struct device *dev);
static void it87_init_device(struct platform_device *pdev);
L
Linus Torvalds 已提交
303 304


305
static struct platform_driver it87_driver = {
306
	.driver = {
J
Jean Delvare 已提交
307
		.owner	= THIS_MODULE,
308
		.name	= DRVNAME,
309
	},
310 311
	.probe	= it87_probe,
	.remove	= __devexit_p(it87_remove),
312 313
};

314 315
static ssize_t show_in(struct device *dev, struct device_attribute *attr,
		char *buf)
L
Linus Torvalds 已提交
316
{
317 318 319
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

L
Linus Torvalds 已提交
320 321 322 323
	struct it87_data *data = it87_update_device(dev);
	return sprintf(buf, "%d\n", IN_FROM_REG(data->in[nr]));
}

324 325
static ssize_t show_in_min(struct device *dev, struct device_attribute *attr,
		char *buf)
L
Linus Torvalds 已提交
326
{
327 328 329
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

L
Linus Torvalds 已提交
330 331 332 333
	struct it87_data *data = it87_update_device(dev);
	return sprintf(buf, "%d\n", IN_FROM_REG(data->in_min[nr]));
}

334 335
static ssize_t show_in_max(struct device *dev, struct device_attribute *attr,
		char *buf)
L
Linus Torvalds 已提交
336
{
337 338 339
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

L
Linus Torvalds 已提交
340 341 342 343
	struct it87_data *data = it87_update_device(dev);
	return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[nr]));
}

344 345
static ssize_t set_in_min(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t count)
L
Linus Torvalds 已提交
346
{
347 348 349
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

350
	struct it87_data *data = dev_get_drvdata(dev);
L
Linus Torvalds 已提交
351 352
	unsigned long val = simple_strtoul(buf, NULL, 10);

353
	mutex_lock(&data->update_lock);
L
Linus Torvalds 已提交
354
	data->in_min[nr] = IN_TO_REG(val);
355
	it87_write_value(data, IT87_REG_VIN_MIN(nr),
L
Linus Torvalds 已提交
356
			data->in_min[nr]);
357
	mutex_unlock(&data->update_lock);
L
Linus Torvalds 已提交
358 359
	return count;
}
360 361
static ssize_t set_in_max(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t count)
L
Linus Torvalds 已提交
362
{
363 364 365
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

366
	struct it87_data *data = dev_get_drvdata(dev);
L
Linus Torvalds 已提交
367 368
	unsigned long val = simple_strtoul(buf, NULL, 10);

369
	mutex_lock(&data->update_lock);
L
Linus Torvalds 已提交
370
	data->in_max[nr] = IN_TO_REG(val);
371
	it87_write_value(data, IT87_REG_VIN_MAX(nr),
L
Linus Torvalds 已提交
372
			data->in_max[nr]);
373
	mutex_unlock(&data->update_lock);
L
Linus Torvalds 已提交
374 375 376 377
	return count;
}

#define show_in_offset(offset)					\
378 379
static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO,		\
		show_in, NULL, offset);
L
Linus Torvalds 已提交
380 381

#define limit_in_offset(offset)					\
382 383 384 385
static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR,	\
		show_in_min, set_in_min, offset);		\
static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR,	\
		show_in_max, set_in_max, offset);
L
Linus Torvalds 已提交
386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405

show_in_offset(0);
limit_in_offset(0);
show_in_offset(1);
limit_in_offset(1);
show_in_offset(2);
limit_in_offset(2);
show_in_offset(3);
limit_in_offset(3);
show_in_offset(4);
limit_in_offset(4);
show_in_offset(5);
limit_in_offset(5);
show_in_offset(6);
limit_in_offset(6);
show_in_offset(7);
limit_in_offset(7);
show_in_offset(8);

/* 3 temperatures */
406 407
static ssize_t show_temp(struct device *dev, struct device_attribute *attr,
		char *buf)
L
Linus Torvalds 已提交
408
{
409 410 411
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

L
Linus Torvalds 已提交
412 413 414
	struct it87_data *data = it87_update_device(dev);
	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[nr]));
}
415 416
static ssize_t show_temp_max(struct device *dev, struct device_attribute *attr,
		char *buf)
L
Linus Torvalds 已提交
417
{
418 419 420
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

L
Linus Torvalds 已提交
421 422 423
	struct it87_data *data = it87_update_device(dev);
	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_high[nr]));
}
424 425
static ssize_t show_temp_min(struct device *dev, struct device_attribute *attr,
		char *buf)
L
Linus Torvalds 已提交
426
{
427 428 429
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

L
Linus Torvalds 已提交
430 431 432
	struct it87_data *data = it87_update_device(dev);
	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_low[nr]));
}
433 434
static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t count)
L
Linus Torvalds 已提交
435
{
436 437 438
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

439
	struct it87_data *data = dev_get_drvdata(dev);
L
Linus Torvalds 已提交
440 441
	int val = simple_strtol(buf, NULL, 10);

442
	mutex_lock(&data->update_lock);
L
Linus Torvalds 已提交
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);
L
Linus Torvalds 已提交
446 447
	return count;
}
448 449
static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t count)
L
Linus Torvalds 已提交
450
{
451 452 453
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

454
	struct it87_data *data = dev_get_drvdata(dev);
L
Linus Torvalds 已提交
455 456
	int val = simple_strtol(buf, NULL, 10);

457
	mutex_lock(&data->update_lock);
L
Linus Torvalds 已提交
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);
L
Linus Torvalds 已提交
461 462 463
	return count;
}
#define show_temp_offset(offset)					\
464 465 466 467 468 469
static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO,		\
		show_temp, NULL, offset - 1);				\
static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR,	\
		show_temp_max, set_temp_max, offset - 1);		\
static SENSOR_DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR,	\
		show_temp_min, set_temp_min, offset - 1);
L
Linus Torvalds 已提交
470 471 472 473 474

show_temp_offset(1);
show_temp_offset(2);
show_temp_offset(3);

475 476
static ssize_t show_sensor(struct device *dev, struct device_attribute *attr,
		char *buf)
L
Linus Torvalds 已提交
477
{
478 479 480
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

L
Linus Torvalds 已提交
481 482 483 484 485 486
	struct it87_data *data = it87_update_device(dev);
	u8 reg = data->sensor; /* In case the value is updated while we use it */
	
	if (reg & (1 << nr))
		return sprintf(buf, "3\n");  /* thermal diode */
	if (reg & (8 << nr))
487
		return sprintf(buf, "4\n");  /* thermistor */
L
Linus Torvalds 已提交
488 489
	return sprintf(buf, "0\n");      /* disabled */
}
490 491
static ssize_t set_sensor(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t count)
L
Linus Torvalds 已提交
492
{
493 494 495
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

496
	struct it87_data *data = dev_get_drvdata(dev);
L
Linus Torvalds 已提交
497 498
	int val = simple_strtol(buf, NULL, 10);

499
	mutex_lock(&data->update_lock);
L
Linus Torvalds 已提交
500 501 502

	data->sensor &= ~(1 << nr);
	data->sensor &= ~(8 << nr);
503 504 505 506 507 508
	if (val == 2) {	/* backwards compatibility */
		dev_warn(dev, "Sensor type 2 is deprecated, please use 4 "
			 "instead\n");
		val = 4;
	}
	/* 3 = thermal diode; 4 = thermistor; 0 = disabled */
L
Linus Torvalds 已提交
509 510
	if (val == 3)
	    data->sensor |= 1 << nr;
511
	else if (val == 4)
L
Linus Torvalds 已提交
512 513
	    data->sensor |= 8 << nr;
	else if (val != 0) {
514
		mutex_unlock(&data->update_lock);
L
Linus Torvalds 已提交
515 516
		return -EINVAL;
	}
517
	it87_write_value(data, IT87_REG_TEMP_ENABLE, data->sensor);
518
	mutex_unlock(&data->update_lock);
L
Linus Torvalds 已提交
519 520 521
	return count;
}
#define show_sensor_offset(offset)					\
522 523
static SENSOR_DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR,	\
		show_sensor, set_sensor, offset - 1);
L
Linus Torvalds 已提交
524 525 526 527 528 529

show_sensor_offset(1);
show_sensor_offset(2);
show_sensor_offset(3);

/* 3 Fans */
530 531
static ssize_t show_fan(struct device *dev, struct device_attribute *attr,
		char *buf)
L
Linus Torvalds 已提交
532
{
533 534 535
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

L
Linus Torvalds 已提交
536 537 538 539
	struct it87_data *data = it87_update_device(dev);
	return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan[nr], 
				DIV_FROM_REG(data->fan_div[nr])));
}
540 541
static ssize_t show_fan_min(struct device *dev, struct device_attribute *attr,
		char *buf)
L
Linus Torvalds 已提交
542
{
543 544 545
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

L
Linus Torvalds 已提交
546 547 548 549
	struct it87_data *data = it87_update_device(dev);
	return sprintf(buf,"%d\n",
		FAN_FROM_REG(data->fan_min[nr], DIV_FROM_REG(data->fan_div[nr])));
}
550 551
static ssize_t show_fan_div(struct device *dev, struct device_attribute *attr,
		char *buf)
L
Linus Torvalds 已提交
552
{
553 554 555
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

L
Linus Torvalds 已提交
556 557 558
	struct it87_data *data = it87_update_device(dev);
	return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr]));
}
559 560
static ssize_t show_pwm_enable(struct device *dev, struct device_attribute *attr,
		char *buf)
L
Linus Torvalds 已提交
561
{
562 563 564
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

L
Linus Torvalds 已提交
565 566 567
	struct it87_data *data = it87_update_device(dev);
	return sprintf(buf,"%d\n", (data->fan_main_ctrl & (1 << nr)) ? 1 : 0);
}
568 569
static ssize_t show_pwm(struct device *dev, struct device_attribute *attr,
		char *buf)
L
Linus Torvalds 已提交
570
{
571 572 573
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

L
Linus Torvalds 已提交
574 575 576
	struct it87_data *data = it87_update_device(dev);
	return sprintf(buf,"%d\n", data->manual_pwm_ctl[nr]);
}
577 578 579 580 581 582 583 584
static ssize_t show_pwm_freq(struct device *dev, struct device_attribute *attr,
		char *buf)
{
	struct it87_data *data = it87_update_device(dev);
	int index = (data->fan_ctl >> 4) & 0x07;

	return sprintf(buf, "%u\n", pwm_freq[index]);
}
585 586
static ssize_t set_fan_min(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t count)
L
Linus Torvalds 已提交
587
{
588 589 590
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

591
	struct it87_data *data = dev_get_drvdata(dev);
L
Linus Torvalds 已提交
592
	int val = simple_strtol(buf, NULL, 10);
593
	u8 reg;
L
Linus Torvalds 已提交
594

595
	mutex_lock(&data->update_lock);
596
	reg = it87_read_value(data, IT87_REG_FAN_DIV);
597 598 599 600 601 602
	switch (nr) {
	case 0: data->fan_div[nr] = reg & 0x07; break;
	case 1: data->fan_div[nr] = (reg >> 3) & 0x07; break;
	case 2: data->fan_div[nr] = (reg & 0x40) ? 3 : 1; break;
	}

L
Linus Torvalds 已提交
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);
L
Linus Torvalds 已提交
606 607
	return count;
}
608 609
static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t count)
L
Linus Torvalds 已提交
610
{
611 612 613
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

614
	struct it87_data *data = dev_get_drvdata(dev);
615
	unsigned long val = simple_strtoul(buf, NULL, 10);
J
Jean Delvare 已提交
616
	int min;
L
Linus Torvalds 已提交
617 618
	u8 old;

619
	mutex_lock(&data->update_lock);
620
	old = it87_read_value(data, IT87_REG_FAN_DIV);
L
Linus Torvalds 已提交
621

J
Jean Delvare 已提交
622 623
	/* Save fan min limit */
	min = FAN_FROM_REG(data->fan_min[nr], DIV_FROM_REG(data->fan_div[nr]));
L
Linus Torvalds 已提交
624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640

	switch (nr) {
	case 0:
	case 1:
		data->fan_div[nr] = DIV_TO_REG(val);
		break;
	case 2:
		if (val < 8)
			data->fan_div[nr] = 1;
		else
			data->fan_div[nr] = 3;
	}
	val = old & 0x80;
	val |= (data->fan_div[0] & 0x07);
	val |= (data->fan_div[1] & 0x07) << 3;
	if (data->fan_div[2] == 3)
		val |= 0x1 << 6;
641
	it87_write_value(data, IT87_REG_FAN_DIV, val);
L
Linus Torvalds 已提交
642

J
Jean Delvare 已提交
643 644
	/* Restore fan min limit */
	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]);
J
Jean Delvare 已提交
646

647
	mutex_unlock(&data->update_lock);
L
Linus Torvalds 已提交
648 649
	return count;
}
650 651
static ssize_t set_pwm_enable(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
L
Linus Torvalds 已提交
652
{
653 654 655
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

656
	struct it87_data *data = dev_get_drvdata(dev);
L
Linus Torvalds 已提交
657 658
	int val = simple_strtol(buf, NULL, 10);

659
	mutex_lock(&data->update_lock);
L
Linus Torvalds 已提交
660 661 662 663

	if (val == 0) {
		int tmp;
		/* make sure the fan is on when in on/off mode */
664 665
		tmp = it87_read_value(data, IT87_REG_FAN_CTL);
		it87_write_value(data, IT87_REG_FAN_CTL, tmp | (1 << nr));
L
Linus Torvalds 已提交
666 667
		/* set on/off mode */
		data->fan_main_ctrl &= ~(1 << nr);
668
		it87_write_value(data, IT87_REG_FAN_MAIN_CTRL, data->fan_main_ctrl);
L
Linus Torvalds 已提交
669 670 671
	} else if (val == 1) {
		/* set SmartGuardian mode */
		data->fan_main_ctrl |= (1 << nr);
672
		it87_write_value(data, IT87_REG_FAN_MAIN_CTRL, data->fan_main_ctrl);
L
Linus Torvalds 已提交
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]));
L
Linus Torvalds 已提交
675
	} else {
676
		mutex_unlock(&data->update_lock);
L
Linus Torvalds 已提交
677 678 679
		return -EINVAL;
	}

680
	mutex_unlock(&data->update_lock);
L
Linus Torvalds 已提交
681 682
	return count;
}
683 684
static ssize_t set_pwm(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t count)
L
Linus Torvalds 已提交
685
{
686 687 688
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

689
	struct it87_data *data = dev_get_drvdata(dev);
L
Linus Torvalds 已提交
690 691 692 693 694
	int val = simple_strtol(buf, NULL, 10);

	if (val < 0 || val > 255)
		return -EINVAL;

695
	mutex_lock(&data->update_lock);
L
Linus Torvalds 已提交
696 697
	data->manual_pwm_ctl[nr] = val;
	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);
L
Linus Torvalds 已提交
700 701
	return count;
}
702 703 704
static ssize_t set_pwm_freq(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
{
705
	struct it87_data *data = dev_get_drvdata(dev);
706 707 708 709 710 711 712 713 714 715
	unsigned long val = simple_strtoul(buf, NULL, 10);
	int i;

	/* Search for the nearest available frequency */
	for (i = 0; i < 7; i++) {
		if (val > (pwm_freq[i] + pwm_freq[i+1]) / 2)
			break;
	}

	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 720 721 722
	mutex_unlock(&data->update_lock);

	return count;
}
L
Linus Torvalds 已提交
723

724 725 726 727 728 729 730
#define show_fan_offset(offset)					\
static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO,		\
		show_fan, NULL, offset - 1);			\
static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
		show_fan_min, set_fan_min, offset - 1);		\
static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
		show_fan_div, set_fan_div, offset - 1);
L
Linus Torvalds 已提交
731 732 733 734 735 736

show_fan_offset(1);
show_fan_offset(2);
show_fan_offset(3);

#define show_pwm_offset(offset)						\
737 738 739
static SENSOR_DEVICE_ATTR(pwm##offset##_enable, S_IRUGO | S_IWUSR,	\
		show_pwm_enable, set_pwm_enable, offset - 1);		\
static SENSOR_DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR,		\
740 741 742 743
		show_pwm, set_pwm, offset - 1);				\
static DEVICE_ATTR(pwm##offset##_freq,					\
		(offset == 1 ? S_IRUGO | S_IWUSR : S_IRUGO),		\
		show_pwm_freq, (offset == 1 ? set_pwm_freq : NULL));
L
Linus Torvalds 已提交
744 745 746 747 748

show_pwm_offset(1);
show_pwm_offset(2);
show_pwm_offset(3);

J
Jean Delvare 已提交
749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772
/* A different set of callbacks for 16-bit fans */
static ssize_t show_fan16(struct device *dev, struct device_attribute *attr,
		char *buf)
{
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;
	struct it87_data *data = it87_update_device(dev);
	return sprintf(buf, "%d\n", FAN16_FROM_REG(data->fan[nr]));
}

static ssize_t show_fan16_min(struct device *dev, struct device_attribute *attr,
		char *buf)
{
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;
	struct it87_data *data = it87_update_device(dev);
	return sprintf(buf, "%d\n", FAN16_FROM_REG(data->fan_min[nr]));
}

static ssize_t set_fan16_min(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t count)
{
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;
773
	struct it87_data *data = dev_get_drvdata(dev);
J
Jean Delvare 已提交
774 775 776 777
	int val = simple_strtol(buf, NULL, 10);

	mutex_lock(&data->update_lock);
	data->fan_min[nr] = FAN16_TO_REG(val);
778
	it87_write_value(data, IT87_REG_FAN_MIN[nr],
J
Jean Delvare 已提交
779
			 data->fan_min[nr] & 0xff);
780
	it87_write_value(data, IT87_REG_FANX_MIN[nr],
J
Jean Delvare 已提交
781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799
			 data->fan_min[nr] >> 8);
	mutex_unlock(&data->update_lock);
	return count;
}

/* We want to use the same sysfs file names as 8-bit fans, but we need
   different variable names, so we have to use SENSOR_ATTR instead of
   SENSOR_DEVICE_ATTR. */
#define show_fan16_offset(offset) \
static struct sensor_device_attribute sensor_dev_attr_fan##offset##_input16 \
	= SENSOR_ATTR(fan##offset##_input, S_IRUGO,		\
		show_fan16, NULL, offset - 1);			\
static struct sensor_device_attribute sensor_dev_attr_fan##offset##_min16 \
	= SENSOR_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR,	\
		show_fan16_min, set_fan16_min, offset - 1)

show_fan16_offset(1);
show_fan16_offset(2);
show_fan16_offset(3);
800 801
show_fan16_offset(4);
show_fan16_offset(5);
J
Jean Delvare 已提交
802

L
Linus Torvalds 已提交
803
/* Alarms */
804
static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
L
Linus Torvalds 已提交
805 806
{
	struct it87_data *data = it87_update_device(dev);
807
	return sprintf(buf, "%u\n", data->alarms);
L
Linus Torvalds 已提交
808
}
809
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
L
Linus Torvalds 已提交
810

811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834
static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
		char *buf)
{
	int bitnr = to_sensor_dev_attr(attr)->index;
	struct it87_data *data = it87_update_device(dev);
	return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1);
}
static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 8);
static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 9);
static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 10);
static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 11);
static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 12);
static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 13);
static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 14);
static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 15);
static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 0);
static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 1);
static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 2);
static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 3);
static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 6);
static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 16);
static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 17);
static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 18);

L
Linus Torvalds 已提交
835
static ssize_t
836
show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf)
L
Linus Torvalds 已提交
837
{
838
	struct it87_data *data = dev_get_drvdata(dev);
839
	return sprintf(buf, "%u\n", data->vrm);
L
Linus Torvalds 已提交
840 841
}
static ssize_t
842
store_vrm_reg(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
L
Linus Torvalds 已提交
843
{
844
	struct it87_data *data = dev_get_drvdata(dev);
L
Linus Torvalds 已提交
845 846 847 848 849 850 851 852 853 854
	u32 val;

	val = simple_strtoul(buf, NULL, 10);
	data->vrm = val;

	return count;
}
static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);

static ssize_t
855
show_vid_reg(struct device *dev, struct device_attribute *attr, char *buf)
L
Linus Torvalds 已提交
856 857 858 859 860
{
	struct it87_data *data = it87_update_device(dev);
	return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
}
static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
861

862 863 864 865 866 867 868 869
static ssize_t show_name(struct device *dev, struct device_attribute
			 *devattr, char *buf)
{
	struct it87_data *data = dev_get_drvdata(dev);
	return sprintf(buf, "%s\n", data->name);
}
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);

870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895
static struct attribute *it87_attributes[] = {
	&sensor_dev_attr_in0_input.dev_attr.attr,
	&sensor_dev_attr_in1_input.dev_attr.attr,
	&sensor_dev_attr_in2_input.dev_attr.attr,
	&sensor_dev_attr_in3_input.dev_attr.attr,
	&sensor_dev_attr_in4_input.dev_attr.attr,
	&sensor_dev_attr_in5_input.dev_attr.attr,
	&sensor_dev_attr_in6_input.dev_attr.attr,
	&sensor_dev_attr_in7_input.dev_attr.attr,
	&sensor_dev_attr_in8_input.dev_attr.attr,
	&sensor_dev_attr_in0_min.dev_attr.attr,
	&sensor_dev_attr_in1_min.dev_attr.attr,
	&sensor_dev_attr_in2_min.dev_attr.attr,
	&sensor_dev_attr_in3_min.dev_attr.attr,
	&sensor_dev_attr_in4_min.dev_attr.attr,
	&sensor_dev_attr_in5_min.dev_attr.attr,
	&sensor_dev_attr_in6_min.dev_attr.attr,
	&sensor_dev_attr_in7_min.dev_attr.attr,
	&sensor_dev_attr_in0_max.dev_attr.attr,
	&sensor_dev_attr_in1_max.dev_attr.attr,
	&sensor_dev_attr_in2_max.dev_attr.attr,
	&sensor_dev_attr_in3_max.dev_attr.attr,
	&sensor_dev_attr_in4_max.dev_attr.attr,
	&sensor_dev_attr_in5_max.dev_attr.attr,
	&sensor_dev_attr_in6_max.dev_attr.attr,
	&sensor_dev_attr_in7_max.dev_attr.attr,
896 897 898 899 900 901 902 903
	&sensor_dev_attr_in0_alarm.dev_attr.attr,
	&sensor_dev_attr_in1_alarm.dev_attr.attr,
	&sensor_dev_attr_in2_alarm.dev_attr.attr,
	&sensor_dev_attr_in3_alarm.dev_attr.attr,
	&sensor_dev_attr_in4_alarm.dev_attr.attr,
	&sensor_dev_attr_in5_alarm.dev_attr.attr,
	&sensor_dev_attr_in6_alarm.dev_attr.attr,
	&sensor_dev_attr_in7_alarm.dev_attr.attr,
904 905 906 907 908 909 910 911 912 913 914 915 916

	&sensor_dev_attr_temp1_input.dev_attr.attr,
	&sensor_dev_attr_temp2_input.dev_attr.attr,
	&sensor_dev_attr_temp3_input.dev_attr.attr,
	&sensor_dev_attr_temp1_max.dev_attr.attr,
	&sensor_dev_attr_temp2_max.dev_attr.attr,
	&sensor_dev_attr_temp3_max.dev_attr.attr,
	&sensor_dev_attr_temp1_min.dev_attr.attr,
	&sensor_dev_attr_temp2_min.dev_attr.attr,
	&sensor_dev_attr_temp3_min.dev_attr.attr,
	&sensor_dev_attr_temp1_type.dev_attr.attr,
	&sensor_dev_attr_temp2_type.dev_attr.attr,
	&sensor_dev_attr_temp3_type.dev_attr.attr,
917 918 919
	&sensor_dev_attr_temp1_alarm.dev_attr.attr,
	&sensor_dev_attr_temp2_alarm.dev_attr.attr,
	&sensor_dev_attr_temp3_alarm.dev_attr.attr,
920 921

	&dev_attr_alarms.attr,
922
	&dev_attr_name.attr,
923 924 925 926 927 928 929 930 931 932 933 934 935 936
	NULL
};

static const struct attribute_group it87_group = {
	.attrs = it87_attributes,
};

static struct attribute *it87_attributes_opt[] = {
	&sensor_dev_attr_fan1_input16.dev_attr.attr,
	&sensor_dev_attr_fan1_min16.dev_attr.attr,
	&sensor_dev_attr_fan2_input16.dev_attr.attr,
	&sensor_dev_attr_fan2_min16.dev_attr.attr,
	&sensor_dev_attr_fan3_input16.dev_attr.attr,
	&sensor_dev_attr_fan3_min16.dev_attr.attr,
937 938 939 940
	&sensor_dev_attr_fan4_input16.dev_attr.attr,
	&sensor_dev_attr_fan4_min16.dev_attr.attr,
	&sensor_dev_attr_fan5_input16.dev_attr.attr,
	&sensor_dev_attr_fan5_min16.dev_attr.attr,
941 942 943 944 945 946 947 948 949 950 951

	&sensor_dev_attr_fan1_input.dev_attr.attr,
	&sensor_dev_attr_fan1_min.dev_attr.attr,
	&sensor_dev_attr_fan1_div.dev_attr.attr,
	&sensor_dev_attr_fan2_input.dev_attr.attr,
	&sensor_dev_attr_fan2_min.dev_attr.attr,
	&sensor_dev_attr_fan2_div.dev_attr.attr,
	&sensor_dev_attr_fan3_input.dev_attr.attr,
	&sensor_dev_attr_fan3_min.dev_attr.attr,
	&sensor_dev_attr_fan3_div.dev_attr.attr,

952 953 954 955 956 957
	&sensor_dev_attr_fan1_alarm.dev_attr.attr,
	&sensor_dev_attr_fan2_alarm.dev_attr.attr,
	&sensor_dev_attr_fan3_alarm.dev_attr.attr,
	&sensor_dev_attr_fan4_alarm.dev_attr.attr,
	&sensor_dev_attr_fan5_alarm.dev_attr.attr,

958 959 960 961 962 963
	&sensor_dev_attr_pwm1_enable.dev_attr.attr,
	&sensor_dev_attr_pwm2_enable.dev_attr.attr,
	&sensor_dev_attr_pwm3_enable.dev_attr.attr,
	&sensor_dev_attr_pwm1.dev_attr.attr,
	&sensor_dev_attr_pwm2.dev_attr.attr,
	&sensor_dev_attr_pwm3.dev_attr.attr,
964 965 966
	&dev_attr_pwm1_freq.attr,
	&dev_attr_pwm2_freq.attr,
	&dev_attr_pwm3_freq.attr,
967 968 969 970 971 972 973 974 975

	&dev_attr_vrm.attr,
	&dev_attr_cpu0_vid.attr,
	NULL
};

static const struct attribute_group it87_group_opt = {
	.attrs = it87_attributes_opt,
};
L
Linus Torvalds 已提交
976

977
/* SuperIO detection - will change isa_address if a chip is found */
978 979
static int __init it87_find(unsigned short *address,
	struct it87_sio_data *sio_data)
L
Linus Torvalds 已提交
980 981
{
	int err = -ENODEV;
982
	u16 chip_type;
983
	const char *board_vendor, *board_name;
L
Linus Torvalds 已提交
984 985

	superio_enter();
986
	chip_type = force_id ? force_id : superio_inw(DEVID);
987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001

	switch (chip_type) {
	case IT8705F_DEVID:
		sio_data->type = it87;
		break;
	case IT8712F_DEVID:
		sio_data->type = it8712;
		break;
	case IT8716F_DEVID:
	case IT8726F_DEVID:
		sio_data->type = it8716;
		break;
	case IT8718F_DEVID:
		sio_data->type = it8718;
		break;
1002 1003 1004
	case IT8720F_DEVID:
		sio_data->type = it8720;
		break;
1005 1006 1007 1008 1009 1010 1011
	case 0xffff:	/* No device at all */
		goto exit;
	default:
		pr_debug(DRVNAME ": Unsupported chip (DEVID=0x%x)\n",
			 chip_type);
		goto exit;
	}
L
Linus Torvalds 已提交
1012

J
Jean Delvare 已提交
1013
	superio_select(PME);
L
Linus Torvalds 已提交
1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025
	if (!(superio_inb(IT87_ACT_REG) & 0x01)) {
		pr_info("it87: Device not activated, skipping\n");
		goto exit;
	}

	*address = superio_inw(IT87_BASE_REG) & ~(IT87_EXTENT - 1);
	if (*address == 0) {
		pr_info("it87: Base address not set, skipping\n");
		goto exit;
	}

	err = 0;
1026
	sio_data->revision = superio_inb(DEVREV) & 0x0f;
L
Linus Torvalds 已提交
1027
	pr_info("it87: Found IT%04xF chip at 0x%x, revision %d\n",
1028
		chip_type, *address, sio_data->revision);
L
Linus Torvalds 已提交
1029

J
Jean Delvare 已提交
1030 1031 1032 1033 1034
	/* Read GPIO config and VID value from LDN 7 (GPIO) */
	if (chip_type != IT8705F_DEVID) {
		int reg;

		superio_select(GPIO);
1035 1036
		if ((chip_type == it8718) ||
		    (chip_type == it8720))
1037
			sio_data->vid_value = superio_inb(IT87_SIO_VID_REG);
J
Jean Delvare 已提交
1038 1039 1040 1041 1042 1043 1044 1045

		reg = superio_inb(IT87_SIO_PINX2_REG);
		if (reg & (1 << 0))
			pr_info("it87: in3 is VCC (+5V)\n");
		if (reg & (1 << 1))
			pr_info("it87: in7 is VCCH (+5V Stand-By)\n");
	}

1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063
	/* Disable specific features based on DMI strings */
	board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
	board_name = dmi_get_system_info(DMI_BOARD_NAME);
	if (board_vendor && board_name) {
		if (strcmp(board_vendor, "nVIDIA") == 0
		 && strcmp(board_name, "FN68PT") == 0) {
			/* On the Shuttle SN68PT, FAN_CTL2 is apparently not
			   connected to a fan, but to something else. One user
			   has reported instant system power-off when changing
			   the PWM2 duty cycle, so we disable it.
			   I use the board name string as the trigger in case
			   the same board is ever used in other systems. */
			pr_info("it87: Disabling pwm2 due to "
				"hardware constraints\n");
			sio_data->skip_pwm = (1 << 1);
		}
	}

L
Linus Torvalds 已提交
1064 1065 1066 1067 1068
exit:
	superio_exit();
	return err;
}

1069
static int __devinit it87_probe(struct platform_device *pdev)
L
Linus Torvalds 已提交
1070 1071
{
	struct it87_data *data;
1072 1073 1074
	struct resource *res;
	struct device *dev = &pdev->dev;
	struct it87_sio_data *sio_data = dev->platform_data;
L
Linus Torvalds 已提交
1075 1076
	int err = 0;
	int enable_pwm_interface;
1077 1078 1079 1080 1081
	static const char *names[] = {
		"it87",
		"it8712",
		"it8716",
		"it8718",
1082
		"it8720",
1083 1084 1085
	};

	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1086
	if (!request_region(res->start, IT87_EC_EXTENT, DRVNAME)) {
1087 1088
		dev_err(dev, "Failed to request region 0x%lx-0x%lx\n",
			(unsigned long)res->start,
1089
			(unsigned long)(res->start + IT87_EC_EXTENT - 1));
1090 1091 1092
		err = -EBUSY;
		goto ERROR0;
	}
L
Linus Torvalds 已提交
1093

D
Deepak Saxena 已提交
1094
	if (!(data = kzalloc(sizeof(struct it87_data), GFP_KERNEL))) {
L
Linus Torvalds 已提交
1095 1096 1097 1098
		err = -ENOMEM;
		goto ERROR1;
	}

1099 1100
	data->addr = res->start;
	data->type = sio_data->type;
1101
	data->revision = sio_data->revision;
1102
	data->name = names[sio_data->type];
L
Linus Torvalds 已提交
1103 1104

	/* Now, we do the remaining detection. */
1105 1106
	if ((it87_read_value(data, IT87_REG_CONFIG) & 0x80)
	 || it87_read_value(data, IT87_REG_CHIPID) != 0x90) {
1107 1108
		err = -ENODEV;
		goto ERROR2;
L
Linus Torvalds 已提交
1109 1110
	}

1111
	platform_set_drvdata(pdev, data);
L
Linus Torvalds 已提交
1112

1113
	mutex_init(&data->update_lock);
L
Linus Torvalds 已提交
1114 1115

	/* Check PWM configuration */
1116
	enable_pwm_interface = it87_check_pwm(dev);
L
Linus Torvalds 已提交
1117 1118

	/* Initialize the IT87 chip */
1119
	it87_init_device(pdev);
L
Linus Torvalds 已提交
1120 1121

	/* Register sysfs hooks */
1122 1123
	if ((err = sysfs_create_group(&dev->kobj, &it87_group)))
		goto ERROR2;
J
Jean Delvare 已提交
1124

1125
	/* Do not create fan files for disabled fans */
1126
	if (has_16bit_fans(data)) {
J
Jean Delvare 已提交
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 1133 1134
			     &sensor_dev_attr_fan1_min16.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_fan1_alarm.dev_attr)))
1135
				goto ERROR4;
1136 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 1142 1143
			     &sensor_dev_attr_fan2_min16.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_fan2_alarm.dev_attr)))
1144
				goto ERROR4;
1145 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 1151 1152
			     &sensor_dev_attr_fan3_min16.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_fan3_alarm.dev_attr)))
1153
				goto ERROR4;
1154
		}
1155 1156 1157 1158
		if (data->has_fan & (1 << 3)) {
			if ((err = device_create_file(dev,
			     &sensor_dev_attr_fan4_input16.dev_attr))
			 || (err = device_create_file(dev,
1159 1160 1161
			     &sensor_dev_attr_fan4_min16.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_fan4_alarm.dev_attr)))
1162 1163 1164 1165 1166 1167
				goto ERROR4;
		}
		if (data->has_fan & (1 << 4)) {
			if ((err = device_create_file(dev,
			     &sensor_dev_attr_fan5_input16.dev_attr))
			 || (err = device_create_file(dev,
1168 1169 1170
			     &sensor_dev_attr_fan5_min16.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_fan5_alarm.dev_attr)))
1171 1172
				goto ERROR4;
		}
J
Jean Delvare 已提交
1173
	} else {
J
Jean Delvare 已提交
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 1182 1183
			     &sensor_dev_attr_fan1_div.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_fan1_alarm.dev_attr)))
1184
				goto ERROR4;
1185 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 1193 1194
			     &sensor_dev_attr_fan2_div.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_fan2_alarm.dev_attr)))
1195
				goto ERROR4;
1196 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 1204 1205
			     &sensor_dev_attr_fan3_div.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_fan3_alarm.dev_attr)))
1206
				goto ERROR4;
1207
		}
J
Jean Delvare 已提交
1208 1209
	}

L
Linus Torvalds 已提交
1210
	if (enable_pwm_interface) {
1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237
		if (!(sio_data->skip_pwm & (1 << 0))) {
			if ((err = device_create_file(dev,
			     &sensor_dev_attr_pwm1_enable.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_pwm1.dev_attr))
			 || (err = device_create_file(dev,
			     &dev_attr_pwm1_freq)))
				goto ERROR4;
		}
		if (!(sio_data->skip_pwm & (1 << 1))) {
			if ((err = device_create_file(dev,
			     &sensor_dev_attr_pwm2_enable.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_pwm2.dev_attr))
			 || (err = device_create_file(dev,
			     &dev_attr_pwm2_freq)))
				goto ERROR4;
		}
		if (!(sio_data->skip_pwm & (1 << 2))) {
			if ((err = device_create_file(dev,
			     &sensor_dev_attr_pwm3_enable.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_pwm3.dev_attr))
			 || (err = device_create_file(dev,
			     &dev_attr_pwm3_freq)))
				goto ERROR4;
		}
L
Linus Torvalds 已提交
1238 1239
	}

J
Jean Delvare 已提交
1240
	if (data->type == it8712 || data->type == it8716
1241
	 || data->type == it8718 || data->type == it8720) {
1242
		data->vrm = vid_which_vrm();
J
Jean Delvare 已提交
1243
		/* VID reading from Super-I/O config space if available */
1244 1245
		data->vid = sio_data->vid_value;
		if ((err = device_create_file(dev,
1246
		     &dev_attr_vrm))
1247
		 || (err = device_create_file(dev,
1248 1249 1250 1251
		     &dev_attr_cpu0_vid)))
			goto ERROR4;
	}

1252 1253 1254
	data->hwmon_dev = hwmon_device_register(dev);
	if (IS_ERR(data->hwmon_dev)) {
		err = PTR_ERR(data->hwmon_dev);
1255
		goto ERROR4;
L
Linus Torvalds 已提交
1256 1257 1258 1259
	}

	return 0;

1260
ERROR4:
1261 1262
	sysfs_remove_group(&dev->kobj, &it87_group);
	sysfs_remove_group(&dev->kobj, &it87_group_opt);
L
Linus Torvalds 已提交
1263
ERROR2:
1264
	platform_set_drvdata(pdev, NULL);
L
Linus Torvalds 已提交
1265 1266
	kfree(data);
ERROR1:
1267
	release_region(res->start, IT87_EC_EXTENT);
L
Linus Torvalds 已提交
1268 1269 1270 1271
ERROR0:
	return err;
}

1272
static int __devexit it87_remove(struct platform_device *pdev)
L
Linus Torvalds 已提交
1273
{
1274
	struct it87_data *data = platform_get_drvdata(pdev);
L
Linus Torvalds 已提交
1275

1276
	hwmon_device_unregister(data->hwmon_dev);
1277 1278
	sysfs_remove_group(&pdev->dev.kobj, &it87_group);
	sysfs_remove_group(&pdev->dev.kobj, &it87_group_opt);
1279

1280
	release_region(data->addr, IT87_EC_EXTENT);
1281
	platform_set_drvdata(pdev, NULL);
1282
	kfree(data);
L
Linus Torvalds 已提交
1283 1284 1285 1286

	return 0;
}

1287
/* Must be called with data->update_lock held, except during initialization.
L
Linus Torvalds 已提交
1288 1289
   We ignore the IT87 BUSY flag at this moment - it could lead to deadlocks,
   would slow down the IT87 access and should not be necessary. */
1290
static int it87_read_value(struct it87_data *data, u8 reg)
L
Linus Torvalds 已提交
1291
{
1292 1293
	outb_p(reg, data->addr + IT87_ADDR_REG_OFFSET);
	return inb_p(data->addr + IT87_DATA_REG_OFFSET);
L
Linus Torvalds 已提交
1294 1295
}

1296
/* Must be called with data->update_lock held, except during initialization.
L
Linus Torvalds 已提交
1297 1298
   We ignore the IT87 BUSY flag at this moment - it could lead to deadlocks,
   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)
L
Linus Torvalds 已提交
1300
{
1301 1302
	outb_p(reg, data->addr + IT87_ADDR_REG_OFFSET);
	outb_p(value, data->addr + IT87_DATA_REG_OFFSET);
L
Linus Torvalds 已提交
1303 1304 1305
}

/* Return 1 if and only if the PWM interface is safe to use */
1306
static int __devinit it87_check_pwm(struct device *dev)
L
Linus Torvalds 已提交
1307
{
1308
	struct it87_data *data = dev_get_drvdata(dev);
L
Linus Torvalds 已提交
1309 1310 1311
	/* Some BIOSes fail to correctly configure the IT87 fans. All fans off
	 * and polarity set to active low is sign that this is the case so we
	 * disable pwm control to protect the user. */
1312
	int tmp = it87_read_value(data, IT87_REG_FAN_CTL);
L
Linus Torvalds 已提交
1313 1314 1315 1316 1317 1318 1319 1320 1321
	if ((tmp & 0x87) == 0) {
		if (fix_pwm_polarity) {
			/* The user asks us to attempt a chip reconfiguration.
			 * This means switching to active high polarity and
			 * inverting all fan speed values. */
			int i;
			u8 pwm[3];

			for (i = 0; i < 3; i++)
1322
				pwm[i] = it87_read_value(data,
L
Linus Torvalds 已提交
1323 1324 1325 1326 1327 1328 1329
							 IT87_REG_PWM(i));

			/* If any fan is in automatic pwm mode, the polarity
			 * might be correct, as suspicious as it seems, so we
			 * better don't change anything (but still disable the
			 * PWM interface). */
			if (!((pwm[0] | pwm[1] | pwm[2]) & 0x80)) {
1330
				dev_info(dev, "Reconfiguring PWM to "
L
Linus Torvalds 已提交
1331
					 "active high polarity\n");
1332
				it87_write_value(data, IT87_REG_FAN_CTL,
L
Linus Torvalds 已提交
1333 1334
						 tmp | 0x87);
				for (i = 0; i < 3; i++)
1335
					it87_write_value(data,
L
Linus Torvalds 已提交
1336 1337 1338 1339 1340
							 IT87_REG_PWM(i),
							 0x7f & ~pwm[i]);
				return 1;
			}

1341
			dev_info(dev, "PWM configuration is "
L
Linus Torvalds 已提交
1342 1343 1344
				 "too broken to be fixed\n");
		}

1345
		dev_info(dev, "Detected broken BIOS "
L
Linus Torvalds 已提交
1346 1347 1348
			 "defaults, disabling PWM interface\n");
		return 0;
	} else if (fix_pwm_polarity) {
1349
		dev_info(dev, "PWM configuration looks "
L
Linus Torvalds 已提交
1350 1351 1352 1353 1354 1355 1356
			 "sane, won't touch\n");
	}

	return 1;
}

/* Called when we have found a new IT87. */
1357
static void __devinit it87_init_device(struct platform_device *pdev)
L
Linus Torvalds 已提交
1358
{
1359
	struct it87_data *data = platform_get_drvdata(pdev);
L
Linus Torvalds 已提交
1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372
	int tmp, i;

	/* initialize to sane defaults:
	 * - if the chip is in manual pwm mode, this will be overwritten with
	 *   the actual settings on the chip (so in this case, initialization
	 *   is not needed)
	 * - if in automatic or on/off mode, we could switch to manual mode,
	 *   read the registers and set manual_pwm_ctl accordingly, but currently
	 *   this is not implemented, so we initialize to something sane */
	for (i = 0; i < 3; i++) {
		data->manual_pwm_ctl[i] = 0xff;
	}

1373 1374 1375 1376 1377 1378
	/* Some chips seem to have default value 0xff for all limit
	 * registers. For low voltage limits it makes no sense and triggers
	 * alarms, so change to 0 instead. For high temperature limits, it
	 * means -1 degree C, which surprisingly doesn't trigger an alarm,
	 * but is still confusing, so change to 127 degrees C. */
	for (i = 0; i < 8; i++) {
1379
		tmp = it87_read_value(data, IT87_REG_VIN_MIN(i));
1380
		if (tmp == 0xff)
1381
			it87_write_value(data, IT87_REG_VIN_MIN(i), 0);
1382 1383
	}
	for (i = 0; i < 3; i++) {
1384
		tmp = it87_read_value(data, IT87_REG_TEMP_HIGH(i));
1385
		if (tmp == 0xff)
1386
			it87_write_value(data, IT87_REG_TEMP_HIGH(i), 127);
1387 1388
	}

J
Jean Delvare 已提交
1389
	/* Check if temperature channels are reset manually or by some reason */
1390
	tmp = it87_read_value(data, IT87_REG_TEMP_ENABLE);
L
Linus Torvalds 已提交
1391 1392 1393
	if ((tmp & 0x3f) == 0) {
		/* Temp1,Temp3=thermistor; Temp2=thermal diode */
		tmp = (tmp & 0xc0) | 0x2a;
1394
		it87_write_value(data, IT87_REG_TEMP_ENABLE, tmp);
L
Linus Torvalds 已提交
1395 1396 1397 1398
	}
	data->sensor = tmp;

	/* Check if voltage monitors are reset manually or by some reason */
1399
	tmp = it87_read_value(data, IT87_REG_VIN_ENABLE);
L
Linus Torvalds 已提交
1400 1401
	if ((tmp & 0xff) == 0) {
		/* Enable all voltage monitors */
1402
		it87_write_value(data, IT87_REG_VIN_ENABLE, 0xff);
L
Linus Torvalds 已提交
1403 1404 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);
L
Linus Torvalds 已提交
1407 1408 1409
	if ((data->fan_main_ctrl & 0x70) == 0) {
		/* Enable all fan tachometers */
		data->fan_main_ctrl |= 0x70;
1410
		it87_write_value(data, IT87_REG_FAN_MAIN_CTRL, data->fan_main_ctrl);
L
Linus Torvalds 已提交
1411
	}
1412
	data->has_fan = (data->fan_main_ctrl >> 4) & 0x07;
L
Linus Torvalds 已提交
1413

J
Jean Delvare 已提交
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) {
1418
			dev_dbg(&pdev->dev,
J
Jean Delvare 已提交
1419
				"Setting fan1-3 to 16-bit mode\n");
1420
			it87_write_value(data, IT87_REG_FAN_16BIT,
J
Jean Delvare 已提交
1421 1422
					 tmp | 0x07);
		}
1423 1424 1425 1426 1427 1428 1429
		/* IT8705F only supports three fans. */
		if (data->type != it87) {
			if (tmp & (1 << 4))
				data->has_fan |= (1 << 3); /* fan4 enabled */
			if (tmp & (1 << 5))
				data->has_fan |= (1 << 4); /* fan5 enabled */
		}
J
Jean Delvare 已提交
1430 1431
	}

L
Linus Torvalds 已提交
1432 1433 1434 1435 1436
	/* Set current fan mode registers and the default settings for the
	 * other mode registers */
	for (i = 0; i < 3; i++) {
		if (data->fan_main_ctrl & (1 << i)) {
			/* pwm mode */
1437
			tmp = it87_read_value(data, IT87_REG_PWM(i));
L
Linus Torvalds 已提交
1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450
			if (tmp & 0x80) {
				/* automatic pwm - not yet implemented, but
				 * leave the settings made by the BIOS alone
				 * until a change is requested via the sysfs
				 * interface */
			} else {
				/* manual pwm */
				data->manual_pwm_ctl[i] = PWM_FROM_REG(tmp);
			}
		}
 	}

	/* Start monitoring */
1451 1452
	it87_write_value(data, IT87_REG_CONFIG,
			 (it87_read_value(data, IT87_REG_CONFIG) & 0x36)
L
Linus Torvalds 已提交
1453 1454 1455 1456 1457
			 | (update_vbat ? 0x41 : 0x01));
}

static struct it87_data *it87_update_device(struct device *dev)
{
1458
	struct it87_data *data = dev_get_drvdata(dev);
L
Linus Torvalds 已提交
1459 1460
	int i;

1461
	mutex_lock(&data->update_lock);
L
Linus Torvalds 已提交
1462 1463 1464 1465 1466 1467 1468

	if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
	    || !data->valid) {

		if (update_vbat) {
			/* Cleared after each update, so reenable.  Value
		 	  returned by this read will be previous value */	
1469 1470
			it87_write_value(data, IT87_REG_CONFIG,
			   it87_read_value(data, IT87_REG_CONFIG) | 0x40);
L
Linus Torvalds 已提交
1471 1472 1473
		}
		for (i = 0; i <= 7; i++) {
			data->in[i] =
1474
			    it87_read_value(data, IT87_REG_VIN(i));
L
Linus Torvalds 已提交
1475
			data->in_min[i] =
1476
			    it87_read_value(data, IT87_REG_VIN_MIN(i));
L
Linus Torvalds 已提交
1477
			data->in_max[i] =
1478
			    it87_read_value(data, IT87_REG_VIN_MAX(i));
L
Linus Torvalds 已提交
1479
		}
J
Jean Delvare 已提交
1480
		/* in8 (battery) has no limit registers */
L
Linus Torvalds 已提交
1481
		data->in[8] =
1482
		    it87_read_value(data, IT87_REG_VIN(8));
L
Linus Torvalds 已提交
1483

1484
		for (i = 0; i < 5; i++) {
1485 1486 1487 1488
			/* Skip disabled fans */
			if (!(data->has_fan & (1 << i)))
				continue;

L
Linus Torvalds 已提交
1489
			data->fan_min[i] =
1490
			    it87_read_value(data, IT87_REG_FAN_MIN[i]);
1491
			data->fan[i] = it87_read_value(data,
1492
				       IT87_REG_FAN[i]);
J
Jean Delvare 已提交
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;
J
Jean Delvare 已提交
1499
			}
L
Linus Torvalds 已提交
1500 1501 1502
		}
		for (i = 0; i < 3; i++) {
			data->temp[i] =
1503
			    it87_read_value(data, IT87_REG_TEMP(i));
L
Linus Torvalds 已提交
1504
			data->temp_high[i] =
1505
			    it87_read_value(data, IT87_REG_TEMP_HIGH(i));
L
Linus Torvalds 已提交
1506
			data->temp_low[i] =
1507
			    it87_read_value(data, IT87_REG_TEMP_LOW(i));
L
Linus Torvalds 已提交
1508 1509
		}

J
Jean Delvare 已提交
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);
J
Jean Delvare 已提交
1513 1514 1515 1516
			data->fan_div[0] = i & 0x07;
			data->fan_div[1] = (i >> 3) & 0x07;
			data->fan_div[2] = (i & 0x40) ? 3 : 1;
		}
L
Linus Torvalds 已提交
1517 1518

		data->alarms =
1519 1520 1521 1522 1523 1524 1525 1526
			it87_read_value(data, IT87_REG_ALARM1) |
			(it87_read_value(data, IT87_REG_ALARM2) << 8) |
			(it87_read_value(data, IT87_REG_ALARM3) << 16);
		data->fan_main_ctrl = it87_read_value(data,
				IT87_REG_FAN_MAIN_CTRL);
		data->fan_ctl = it87_read_value(data, IT87_REG_FAN_CTL);

		data->sensor = it87_read_value(data, IT87_REG_TEMP_ENABLE);
1527
		/* The 8705 does not have VID capability.
1528 1529
		   The 8718 and the 8720 don't use IT87_REG_VID for the
		   same purpose. */
J
Jean Delvare 已提交
1530
		if (data->type == it8712 || data->type == it8716) {
1531
			data->vid = it87_read_value(data, IT87_REG_VID);
J
Jean Delvare 已提交
1532 1533 1534
			/* The older IT8712F revisions had only 5 VID pins,
			   but we assume it is always safe to read 6 bits. */
			data->vid &= 0x3f;
L
Linus Torvalds 已提交
1535 1536 1537 1538 1539
		}
		data->last_updated = jiffies;
		data->valid = 1;
	}

1540
	mutex_unlock(&data->update_lock);
L
Linus Torvalds 已提交
1541 1542 1543 1544

	return data;
}

1545 1546 1547 1548
static int __init it87_device_add(unsigned short address,
				  const struct it87_sio_data *sio_data)
{
	struct resource res = {
1549 1550
		.start	= address + IT87_EC_OFFSET,
		.end	= address + IT87_EC_OFFSET + IT87_EC_EXTENT - 1,
1551 1552 1553 1554 1555
		.name	= DRVNAME,
		.flags	= IORESOURCE_IO,
	};
	int err;

1556 1557 1558 1559
	err = acpi_check_resource_conflict(&res);
	if (err)
		goto exit;

1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595
	pdev = platform_device_alloc(DRVNAME, address);
	if (!pdev) {
		err = -ENOMEM;
		printk(KERN_ERR DRVNAME ": Device allocation failed\n");
		goto exit;
	}

	err = platform_device_add_resources(pdev, &res, 1);
	if (err) {
		printk(KERN_ERR DRVNAME ": Device resource addition failed "
		       "(%d)\n", err);
		goto exit_device_put;
	}

	err = platform_device_add_data(pdev, sio_data,
				       sizeof(struct it87_sio_data));
	if (err) {
		printk(KERN_ERR DRVNAME ": Platform data allocation failed\n");
		goto exit_device_put;
	}

	err = platform_device_add(pdev);
	if (err) {
		printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n",
		       err);
		goto exit_device_put;
	}

	return 0;

exit_device_put:
	platform_device_put(pdev);
exit:
	return err;
}

L
Linus Torvalds 已提交
1596 1597
static int __init sm_it87_init(void)
{
1598 1599 1600 1601
	int err;
	unsigned short isa_address=0;
	struct it87_sio_data sio_data;

1602
	memset(&sio_data, 0, sizeof(struct it87_sio_data));
1603 1604 1605 1606 1607 1608
	err = it87_find(&isa_address, &sio_data);
	if (err)
		return err;
	err = platform_driver_register(&it87_driver);
	if (err)
		return err;
1609

1610 1611 1612 1613 1614 1615 1616
	err = it87_device_add(isa_address, &sio_data);
	if (err){
		platform_driver_unregister(&it87_driver);
		return err;
	}

	return 0;
L
Linus Torvalds 已提交
1617 1618 1619 1620
}

static void __exit sm_it87_exit(void)
{
1621 1622
	platform_device_unregister(pdev);
	platform_driver_unregister(&it87_driver);
L
Linus Torvalds 已提交
1623 1624 1625
}


1626
MODULE_AUTHOR("Chris Gauthron, "
J
Jean Delvare 已提交
1627
	      "Jean Delvare <khali@linux-fr.org>");
1628
MODULE_DESCRIPTION("IT8705F/8712F/8716F/8718F/8720F/8726F, SiS950 driver");
L
Linus Torvalds 已提交
1629 1630 1631 1632 1633 1634 1635 1636
module_param(update_vbat, bool, 0);
MODULE_PARM_DESC(update_vbat, "Update vbat if set else return powerup value");
module_param(fix_pwm_polarity, bool, 0);
MODULE_PARM_DESC(fix_pwm_polarity, "Force PWM polarity to active high (DANGEROUS)");
MODULE_LICENSE("GPL");

module_init(sm_it87_init);
module_exit(sm_it87_exit);