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>
53
#include <linux/io.h>
L
Linus Torvalds 已提交
54

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
	/* Read GPIO config and VID value from LDN 7 (GPIO) */
1031
	if (sio_data->type != it87) {
J
Jean Delvare 已提交
1032 1033 1034
		int reg;

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

		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");
	}

1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062
	/* 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 已提交
1063 1064 1065 1066 1067
exit:
	superio_exit();
	return err;
}

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

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

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

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

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

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

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

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

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

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

1124
	/* Do not create fan files for disabled fans */
1125
	if (has_16bit_fans(data)) {
J
Jean Delvare 已提交
1126
		/* 16-bit tachometers */
1127
		if (data->has_fan & (1 << 0)) {
1128
			if ((err = device_create_file(dev,
1129
			     &sensor_dev_attr_fan1_input16.dev_attr))
1130
			 || (err = device_create_file(dev,
1131 1132 1133
			     &sensor_dev_attr_fan1_min16.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_fan1_alarm.dev_attr)))
1134
				goto ERROR4;
1135 1136
		}
		if (data->has_fan & (1 << 1)) {
1137
			if ((err = device_create_file(dev,
1138
			     &sensor_dev_attr_fan2_input16.dev_attr))
1139
			 || (err = device_create_file(dev,
1140 1141 1142
			     &sensor_dev_attr_fan2_min16.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_fan2_alarm.dev_attr)))
1143
				goto ERROR4;
1144 1145
		}
		if (data->has_fan & (1 << 2)) {
1146
			if ((err = device_create_file(dev,
1147
			     &sensor_dev_attr_fan3_input16.dev_attr))
1148
			 || (err = device_create_file(dev,
1149 1150 1151
			     &sensor_dev_attr_fan3_min16.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_fan3_alarm.dev_attr)))
1152
				goto ERROR4;
1153
		}
1154 1155 1156 1157
		if (data->has_fan & (1 << 3)) {
			if ((err = device_create_file(dev,
			     &sensor_dev_attr_fan4_input16.dev_attr))
			 || (err = device_create_file(dev,
1158 1159 1160
			     &sensor_dev_attr_fan4_min16.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_fan4_alarm.dev_attr)))
1161 1162 1163 1164 1165 1166
				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,
1167 1168 1169
			     &sensor_dev_attr_fan5_min16.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_fan5_alarm.dev_attr)))
1170 1171
				goto ERROR4;
		}
J
Jean Delvare 已提交
1172
	} else {
J
Jean Delvare 已提交
1173
		/* 8-bit tachometers with clock divider */
1174
		if (data->has_fan & (1 << 0)) {
1175
			if ((err = device_create_file(dev,
1176
			     &sensor_dev_attr_fan1_input.dev_attr))
1177
			 || (err = device_create_file(dev,
1178
			     &sensor_dev_attr_fan1_min.dev_attr))
1179
			 || (err = device_create_file(dev,
1180 1181 1182
			     &sensor_dev_attr_fan1_div.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_fan1_alarm.dev_attr)))
1183
				goto ERROR4;
1184 1185
		}
		if (data->has_fan & (1 << 1)) {
1186
			if ((err = device_create_file(dev,
1187
			     &sensor_dev_attr_fan2_input.dev_attr))
1188
			 || (err = device_create_file(dev,
1189
			     &sensor_dev_attr_fan2_min.dev_attr))
1190
			 || (err = device_create_file(dev,
1191 1192 1193
			     &sensor_dev_attr_fan2_div.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_fan2_alarm.dev_attr)))
1194
				goto ERROR4;
1195 1196
		}
		if (data->has_fan & (1 << 2)) {
1197
			if ((err = device_create_file(dev,
1198
			     &sensor_dev_attr_fan3_input.dev_attr))
1199
			 || (err = device_create_file(dev,
1200
			     &sensor_dev_attr_fan3_min.dev_attr))
1201
			 || (err = device_create_file(dev,
1202 1203 1204
			     &sensor_dev_attr_fan3_div.dev_attr))
			 || (err = device_create_file(dev,
			     &sensor_dev_attr_fan3_alarm.dev_attr)))
1205
				goto ERROR4;
1206
		}
J
Jean Delvare 已提交
1207 1208
	}

L
Linus Torvalds 已提交
1209
	if (enable_pwm_interface) {
1210 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
		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 已提交
1237 1238
	}

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

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

	return 0;

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

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

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

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

	return 0;
}

1286
/* Must be called with data->update_lock held, except during initialization.
L
Linus Torvalds 已提交
1287 1288
   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. */
1289
static int it87_read_value(struct it87_data *data, u8 reg)
L
Linus Torvalds 已提交
1290
{
1291 1292
	outb_p(reg, data->addr + IT87_ADDR_REG_OFFSET);
	return inb_p(data->addr + IT87_DATA_REG_OFFSET);
L
Linus Torvalds 已提交
1293 1294
}

1295
/* Must be called with data->update_lock held, except during initialization.
L
Linus Torvalds 已提交
1296 1297
   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. */
1298
static void it87_write_value(struct it87_data *data, u8 reg, u8 value)
L
Linus Torvalds 已提交
1299
{
1300 1301
	outb_p(reg, data->addr + IT87_ADDR_REG_OFFSET);
	outb_p(value, data->addr + IT87_DATA_REG_OFFSET);
L
Linus Torvalds 已提交
1302 1303 1304
}

/* Return 1 if and only if the PWM interface is safe to use */
1305
static int __devinit it87_check_pwm(struct device *dev)
L
Linus Torvalds 已提交
1306
{
1307
	struct it87_data *data = dev_get_drvdata(dev);
L
Linus Torvalds 已提交
1308 1309 1310
	/* 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. */
1311
	int tmp = it87_read_value(data, IT87_REG_FAN_CTL);
L
Linus Torvalds 已提交
1312 1313 1314 1315 1316 1317 1318 1319 1320
	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++)
1321
				pwm[i] = it87_read_value(data,
L
Linus Torvalds 已提交
1322 1323 1324 1325 1326 1327 1328
							 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)) {
1329
				dev_info(dev, "Reconfiguring PWM to "
L
Linus Torvalds 已提交
1330
					 "active high polarity\n");
1331
				it87_write_value(data, IT87_REG_FAN_CTL,
L
Linus Torvalds 已提交
1332 1333
						 tmp | 0x87);
				for (i = 0; i < 3; i++)
1334
					it87_write_value(data,
L
Linus Torvalds 已提交
1335 1336 1337 1338 1339
							 IT87_REG_PWM(i),
							 0x7f & ~pwm[i]);
				return 1;
			}

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

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

	return 1;
}

/* Called when we have found a new IT87. */
1356
static void __devinit it87_init_device(struct platform_device *pdev)
L
Linus Torvalds 已提交
1357
{
1358
	struct it87_data *data = platform_get_drvdata(pdev);
L
Linus Torvalds 已提交
1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371
	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;
	}

1372 1373 1374 1375 1376 1377
	/* 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++) {
1378
		tmp = it87_read_value(data, IT87_REG_VIN_MIN(i));
1379
		if (tmp == 0xff)
1380
			it87_write_value(data, IT87_REG_VIN_MIN(i), 0);
1381 1382
	}
	for (i = 0; i < 3; i++) {
1383
		tmp = it87_read_value(data, IT87_REG_TEMP_HIGH(i));
1384
		if (tmp == 0xff)
1385
			it87_write_value(data, IT87_REG_TEMP_HIGH(i), 127);
1386 1387
	}

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

	/* Check if voltage monitors are reset manually or by some reason */
1398
	tmp = it87_read_value(data, IT87_REG_VIN_ENABLE);
L
Linus Torvalds 已提交
1399 1400
	if ((tmp & 0xff) == 0) {
		/* Enable all voltage monitors */
1401
		it87_write_value(data, IT87_REG_VIN_ENABLE, 0xff);
L
Linus Torvalds 已提交
1402 1403 1404
	}

	/* Check if tachometers are reset manually or by some reason */
1405
	data->fan_main_ctrl = it87_read_value(data, IT87_REG_FAN_MAIN_CTRL);
L
Linus Torvalds 已提交
1406 1407 1408
	if ((data->fan_main_ctrl & 0x70) == 0) {
		/* Enable all fan tachometers */
		data->fan_main_ctrl |= 0x70;
1409
		it87_write_value(data, IT87_REG_FAN_MAIN_CTRL, data->fan_main_ctrl);
L
Linus Torvalds 已提交
1410
	}
1411
	data->has_fan = (data->fan_main_ctrl >> 4) & 0x07;
L
Linus Torvalds 已提交
1412

J
Jean Delvare 已提交
1413
	/* Set tachometers to 16-bit mode if needed */
1414
	if (has_16bit_fans(data)) {
1415
		tmp = it87_read_value(data, IT87_REG_FAN_16BIT);
1416
		if (~tmp & 0x07 & data->has_fan) {
1417
			dev_dbg(&pdev->dev,
J
Jean Delvare 已提交
1418
				"Setting fan1-3 to 16-bit mode\n");
1419
			it87_write_value(data, IT87_REG_FAN_16BIT,
J
Jean Delvare 已提交
1420 1421
					 tmp | 0x07);
		}
1422 1423 1424 1425 1426 1427 1428
		/* 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 已提交
1429 1430
	}

L
Linus Torvalds 已提交
1431 1432 1433 1434 1435
	/* 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 */
1436
			tmp = it87_read_value(data, IT87_REG_PWM(i));
L
Linus Torvalds 已提交
1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449
			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 */
1450 1451
	it87_write_value(data, IT87_REG_CONFIG,
			 (it87_read_value(data, IT87_REG_CONFIG) & 0x36)
L
Linus Torvalds 已提交
1452 1453 1454 1455 1456
			 | (update_vbat ? 0x41 : 0x01));
}

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

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

	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 */	
1468 1469
			it87_write_value(data, IT87_REG_CONFIG,
			   it87_read_value(data, IT87_REG_CONFIG) | 0x40);
L
Linus Torvalds 已提交
1470 1471 1472
		}
		for (i = 0; i <= 7; i++) {
			data->in[i] =
1473
			    it87_read_value(data, IT87_REG_VIN(i));
L
Linus Torvalds 已提交
1474
			data->in_min[i] =
1475
			    it87_read_value(data, IT87_REG_VIN_MIN(i));
L
Linus Torvalds 已提交
1476
			data->in_max[i] =
1477
			    it87_read_value(data, IT87_REG_VIN_MAX(i));
L
Linus Torvalds 已提交
1478
		}
J
Jean Delvare 已提交
1479
		/* in8 (battery) has no limit registers */
L
Linus Torvalds 已提交
1480
		data->in[8] =
1481
		    it87_read_value(data, IT87_REG_VIN(8));
L
Linus Torvalds 已提交
1482

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

L
Linus Torvalds 已提交
1488
			data->fan_min[i] =
1489
			    it87_read_value(data, IT87_REG_FAN_MIN[i]);
1490
			data->fan[i] = it87_read_value(data,
1491
				       IT87_REG_FAN[i]);
J
Jean Delvare 已提交
1492
			/* Add high byte if in 16-bit mode */
1493
			if (has_16bit_fans(data)) {
1494
				data->fan[i] |= it87_read_value(data,
1495
						IT87_REG_FANX[i]) << 8;
1496
				data->fan_min[i] |= it87_read_value(data,
1497
						IT87_REG_FANX_MIN[i]) << 8;
J
Jean Delvare 已提交
1498
			}
L
Linus Torvalds 已提交
1499 1500 1501
		}
		for (i = 0; i < 3; i++) {
			data->temp[i] =
1502
			    it87_read_value(data, IT87_REG_TEMP(i));
L
Linus Torvalds 已提交
1503
			data->temp_high[i] =
1504
			    it87_read_value(data, IT87_REG_TEMP_HIGH(i));
L
Linus Torvalds 已提交
1505
			data->temp_low[i] =
1506
			    it87_read_value(data, IT87_REG_TEMP_LOW(i));
L
Linus Torvalds 已提交
1507 1508
		}

J
Jean Delvare 已提交
1509
		/* Newer chips don't have clock dividers */
1510
		if ((data->has_fan & 0x07) && !has_16bit_fans(data)) {
1511
			i = it87_read_value(data, IT87_REG_FAN_DIV);
J
Jean Delvare 已提交
1512 1513 1514 1515
			data->fan_div[0] = i & 0x07;
			data->fan_div[1] = (i >> 3) & 0x07;
			data->fan_div[2] = (i & 0x40) ? 3 : 1;
		}
L
Linus Torvalds 已提交
1516 1517

		data->alarms =
1518 1519 1520 1521 1522 1523 1524 1525
			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);
1526
		/* The 8705 does not have VID capability.
1527 1528
		   The 8718 and the 8720 don't use IT87_REG_VID for the
		   same purpose. */
J
Jean Delvare 已提交
1529
		if (data->type == it8712 || data->type == it8716) {
1530
			data->vid = it87_read_value(data, IT87_REG_VID);
J
Jean Delvare 已提交
1531 1532 1533
			/* 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 已提交
1534 1535 1536 1537 1538
		}
		data->last_updated = jiffies;
		data->valid = 1;
	}

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

	return data;
}

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

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

1559 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
	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 已提交
1595 1596
static int __init sm_it87_init(void)
{
1597 1598 1599 1600
	int err;
	unsigned short isa_address=0;
	struct it87_sio_data sio_data;

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

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

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

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


1625
MODULE_AUTHOR("Chris Gauthron, "
J
Jean Delvare 已提交
1626
	      "Jean Delvare <khali@linux-fr.org>");
1627
MODULE_DESCRIPTION("IT8705F/8712F/8716F/8718F/8720F/8726F, SiS950 driver");
L
Linus Torvalds 已提交
1628 1629 1630 1631 1632 1633 1634 1635
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);