it87.c 81.2 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2 3 4 5 6 7 8 9 10 11 12
 *  it87.c - Part of lm_sensors, Linux kernel modules for hardware
 *           monitoring.
 *
 *  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: IT8603E  Super I/O chip w/LPC interface
14
 *            IT8623E  Super I/O chip w/LPC interface
15
 *            IT8705F  Super I/O chip w/LPC interface
16 17 18 19
 *            IT8712F  Super I/O chip w/LPC interface
 *            IT8716F  Super I/O chip w/LPC interface
 *            IT8718F  Super I/O chip w/LPC interface
 *            IT8720F  Super I/O chip w/LPC interface
20
 *            IT8721F  Super I/O chip w/LPC interface
21
 *            IT8726F  Super I/O chip w/LPC interface
J
Jean Delvare 已提交
22
 *            IT8728F  Super I/O chip w/LPC interface
23
 *            IT8758E  Super I/O chip w/LPC interface
24 25
 *            IT8771E  Super I/O chip w/LPC interface
 *            IT8772E  Super I/O chip w/LPC interface
26
 *            IT8781F  Super I/O chip w/LPC interface
27 28
 *            IT8782F  Super I/O chip w/LPC interface
 *            IT8783E/F Super I/O chip w/LPC interface
29
 *            IT8786E  Super I/O chip w/LPC interface
30 31 32
 *            Sis950   A clone of the IT8705F
 *
 *  Copyright (C) 2001 Chris Gauthron
33
 *  Copyright (C) 2005-2010 Jean Delvare <jdelvare@suse.de>
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
 *
 *  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.
 */
L
Linus Torvalds 已提交
49

50 51
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

L
Linus Torvalds 已提交
52 53 54 55
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/jiffies.h>
56
#include <linux/platform_device.h>
57
#include <linux/hwmon.h>
58 59
#include <linux/hwmon-sysfs.h>
#include <linux/hwmon-vid.h>
60
#include <linux/err.h>
61
#include <linux/mutex.h>
62
#include <linux/sysfs.h>
63 64
#include <linux/string.h>
#include <linux/dmi.h>
65
#include <linux/acpi.h>
66
#include <linux/io.h>
L
Linus Torvalds 已提交
67

68
#define DRVNAME "it87"
L
Linus Torvalds 已提交
69

70
enum chips { it87, it8712, it8716, it8718, it8720, it8721, it8728, it8771,
71
	     it8772, it8781, it8782, it8783, it8786, it8603 };
L
Linus Torvalds 已提交
72

73 74 75 76
static unsigned short force_id;
module_param(force_id, ushort, 0);
MODULE_PARM_DESC(force_id, "Override the detected device ID");

77 78
static struct platform_device *pdev;

L
Linus Torvalds 已提交
79 80 81 82
#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 */
83 84 85 86

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

L
Linus Torvalds 已提交
87 88 89
#define	DEVID	0x20	/* Register: Device ID */
#define	DEVREV	0x22	/* Register: Device Revision */

90
static inline int superio_inb(int reg)
L
Linus Torvalds 已提交
91 92 93 94 95
{
	outb(reg, REG);
	return inb(VAL);
}

96
static inline void superio_outb(int reg, int val)
J
Jean Delvare 已提交
97 98 99 100 101
{
	outb(reg, REG);
	outb(val, VAL);
}

L
Linus Torvalds 已提交
102 103 104 105 106 107 108 109 110 111
static int superio_inw(int reg)
{
	int val;
	outb(reg++, REG);
	val = inb(VAL) << 8;
	outb(reg, REG);
	val |= inb(VAL);
	return val;
}

112
static inline void superio_select(int ldn)
L
Linus Torvalds 已提交
113 114
{
	outb(DEV, REG);
J
Jean Delvare 已提交
115
	outb(ldn, VAL);
L
Linus Torvalds 已提交
116 117
}

118
static inline int superio_enter(void)
L
Linus Torvalds 已提交
119
{
120 121 122 123 124 125
	/*
	 * Try to reserve REG and REG + 1 for exclusive access.
	 */
	if (!request_muxed_region(REG, 2, DRVNAME))
		return -EBUSY;

L
Linus Torvalds 已提交
126 127 128 129
	outb(0x87, REG);
	outb(0x01, REG);
	outb(0x55, REG);
	outb(0x55, REG);
130
	return 0;
L
Linus Torvalds 已提交
131 132
}

133
static inline void superio_exit(void)
L
Linus Torvalds 已提交
134 135 136
{
	outb(0x02, REG);
	outb(0x02, VAL);
137
	release_region(REG, 2);
L
Linus Torvalds 已提交
138 139
}

J
Jean Delvare 已提交
140
/* Logical device 4 registers */
L
Linus Torvalds 已提交
141 142
#define IT8712F_DEVID 0x8712
#define IT8705F_DEVID 0x8705
J
Jean Delvare 已提交
143
#define IT8716F_DEVID 0x8716
J
Jean Delvare 已提交
144
#define IT8718F_DEVID 0x8718
145
#define IT8720F_DEVID 0x8720
146
#define IT8721F_DEVID 0x8721
R
Rudolf Marek 已提交
147
#define IT8726F_DEVID 0x8726
J
Jean Delvare 已提交
148
#define IT8728F_DEVID 0x8728
149 150
#define IT8771E_DEVID 0x8771
#define IT8772E_DEVID 0x8772
151
#define IT8781F_DEVID 0x8781
152 153
#define IT8782F_DEVID 0x8782
#define IT8783E_DEVID 0x8783
154
#define IT8786E_DEVID 0x8786
155
#define IT8603E_DEVID 0x8603
156
#define IT8623E_DEVID 0x8623
L
Linus Torvalds 已提交
157 158 159
#define IT87_ACT_REG  0x30
#define IT87_BASE_REG 0x60

J
Jean Delvare 已提交
160
/* Logical device 7 registers (IT8712F and later) */
161
#define IT87_SIO_GPIO1_REG	0x25
162
#define IT87_SIO_GPIO3_REG	0x27
163
#define IT87_SIO_GPIO5_REG	0x29
164
#define IT87_SIO_PINX1_REG	0x2a	/* Pin selection */
J
Jean Delvare 已提交
165
#define IT87_SIO_PINX2_REG	0x2c	/* Pin selection */
166
#define IT87_SIO_SPI_REG	0xef	/* SPI function pin select */
J
Jean Delvare 已提交
167
#define IT87_SIO_VID_REG	0xfc	/* VID value */
168
#define IT87_SIO_BEEP_PIN_REG	0xf6	/* Beep pin mapping */
J
Jean Delvare 已提交
169

L
Linus Torvalds 已提交
170
/* Update battery voltage after every reading if true */
171
static bool update_vbat;
L
Linus Torvalds 已提交
172 173

/* Not all BIOSes properly configure the PWM registers */
174
static bool fix_pwm_polarity;
L
Linus Torvalds 已提交
175 176 177 178 179 180

/* Many IT87 constants specified below */

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

181 182 183 184 185 186 187 188 189
/* 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 已提交
190 191 192 193 194 195 196 197 198

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

#define IT87_REG_CONFIG        0x00

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

199 200 201 202
/*
 * The IT8718F and IT8720F have the VID value in a different register, in
 * Super-I/O configuration space.
 */
L
Linus Torvalds 已提交
203
#define IT87_REG_VID           0x0a
204 205 206 207 208
/*
 * 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 已提交
209
#define IT87_REG_FAN_DIV       0x0b
J
Jean Delvare 已提交
210
#define IT87_REG_FAN_16BIT     0x0c
L
Linus Torvalds 已提交
211 212 213

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

214 215 216 217
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 };
218 219
static const u8 IT87_REG_TEMP_OFFSET[]	= { 0x56, 0x57, 0x59 };

L
Linus Torvalds 已提交
220 221 222
#define IT87_REG_FAN_MAIN_CTRL 0x13
#define IT87_REG_FAN_CTL       0x14
#define IT87_REG_PWM(nr)       (0x15 + (nr))
223
#define IT87_REG_PWM_DUTY(nr)  (0x63 + (nr) * 8)
L
Linus Torvalds 已提交
224 225 226 227 228 229 230 231 232 233 234

#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
235
#define IT87_REG_TEMP_EXTRA    0x55
236
#define IT87_REG_BEEP_ENABLE   0x5c
L
Linus Torvalds 已提交
237 238 239

#define IT87_REG_CHIPID        0x58

240 241 242
#define IT87_REG_AUTO_TEMP(nr, i) (0x60 + (nr) * 8 + (i))
#define IT87_REG_AUTO_PWM(nr, i)  (0x65 + (nr) * 8 + (i))

243 244 245
struct it87_devices {
	const char *name;
	u16 features;
246 247
	u8 peci_mask;
	u8 old_peci_mask;
248 249 250 251 252 253 254
};

#define FEAT_12MV_ADC		(1 << 0)
#define FEAT_NEWER_AUTOPWM	(1 << 1)
#define FEAT_OLD_AUTOPWM	(1 << 2)
#define FEAT_16BIT_FANS		(1 << 3)
#define FEAT_TEMP_OFFSET	(1 << 4)
255
#define FEAT_TEMP_PECI		(1 << 5)
256
#define FEAT_TEMP_OLD_PECI	(1 << 6)
257 258
#define FEAT_FAN16_CONFIG	(1 << 7)	/* Need to enable 16-bit fans */
#define FEAT_FIVE_FANS		(1 << 8)	/* Supports five fans */
259
#define FEAT_VID		(1 << 9)	/* Set if chip supports VID */
260 261 262 263 264 265 266 267

static const struct it87_devices it87_devices[] = {
	[it87] = {
		.name = "it87",
		.features = FEAT_OLD_AUTOPWM,	/* may need to overwrite */
	},
	[it8712] = {
		.name = "it8712",
268 269
		.features = FEAT_OLD_AUTOPWM | FEAT_VID,
						/* may need to overwrite */
270 271 272
	},
	[it8716] = {
		.name = "it8716",
273
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID
274
		  | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS,
275 276 277
	},
	[it8718] = {
		.name = "it8718",
278
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID
279
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS,
280
		.old_peci_mask = 0x4,
281 282 283
	},
	[it8720] = {
		.name = "it8720",
284
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID
285
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS,
286
		.old_peci_mask = 0x4,
287 288 289 290
	},
	[it8721] = {
		.name = "it8721",
		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
291 292
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI
		  | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS,
293
		.peci_mask = 0x05,
294
		.old_peci_mask = 0x02,	/* Actually reports PCH */
295 296 297 298
	},
	[it8728] = {
		.name = "it8728",
		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
299
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_FIVE_FANS,
300
		.peci_mask = 0x07,
301
	},
302 303 304 305
	[it8771] = {
		.name = "it8771",
		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI,
306 307 308 309
				/* PECI: guesswork */
				/* 12mV ADC (OHM) */
				/* 16 bit fans (OHM) */
				/* three fans, always 16 bit (guesswork) */
310 311 312 313 314 315
		.peci_mask = 0x07,
	},
	[it8772] = {
		.name = "it8772",
		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI,
316 317 318 319
				/* PECI (coreboot) */
				/* 12mV ADC (HWSensors4, OHM) */
				/* 16 bit fans (HWSensors4, OHM) */
				/* three fans, always 16 bit (datasheet) */
320 321
		.peci_mask = 0x07,
	},
322 323 324
	[it8781] = {
		.name = "it8781",
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
325
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG,
326 327
		.old_peci_mask = 0x4,
	},
328 329
	[it8782] = {
		.name = "it8782",
330
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
331
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG,
332
		.old_peci_mask = 0x4,
333 334 335
	},
	[it8783] = {
		.name = "it8783",
336
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
337
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG,
338
		.old_peci_mask = 0x4,
339
	},
340 341 342 343 344 345
	[it8786] = {
		.name = "it8786",
		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI,
		.peci_mask = 0x07,
	},
346 347 348 349 350 351
	[it8603] = {
		.name = "it8603",
		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI,
		.peci_mask = 0x07,
	},
352 353 354 355 356 357 358
};

#define has_16bit_fans(data)	((data)->features & FEAT_16BIT_FANS)
#define has_12mv_adc(data)	((data)->features & FEAT_12MV_ADC)
#define has_newer_autopwm(data)	((data)->features & FEAT_NEWER_AUTOPWM)
#define has_old_autopwm(data)	((data)->features & FEAT_OLD_AUTOPWM)
#define has_temp_offset(data)	((data)->features & FEAT_TEMP_OFFSET)
359 360
#define has_temp_peci(data, nr)	(((data)->features & FEAT_TEMP_PECI) && \
				 ((data)->peci_mask & (1 << nr)))
361 362 363
#define has_temp_old_peci(data, nr) \
				(((data)->features & FEAT_TEMP_OLD_PECI) && \
				 ((data)->old_peci_mask & (1 << nr)))
364 365
#define has_fan16_config(data)	((data)->features & FEAT_FAN16_CONFIG)
#define has_five_fans(data)	((data)->features & FEAT_FIVE_FANS)
366
#define has_vid(data)		((data)->features & FEAT_VID)
L
Linus Torvalds 已提交
367

368 369 370
struct it87_sio_data {
	enum chips type;
	/* Values read from Super-I/O config space */
371
	u8 revision;
372
	u8 vid_value;
373
	u8 beep_pin;
374
	u8 internal;	/* Internal sensors can be labeled */
375
	/* Features skipped based on config or DMI */
376
	u16 skip_in;
377
	u8 skip_vid;
378
	u8 skip_fan;
379
	u8 skip_pwm;
380
	u8 skip_temp;
381 382
};

383 384 385 386
/*
 * For each registered chip, we need to keep some data in memory.
 * The structure is dynamically allocated.
 */
L
Linus Torvalds 已提交
387
struct it87_data {
388
	struct device *hwmon_dev;
L
Linus Torvalds 已提交
389
	enum chips type;
390
	u16 features;
391 392
	u8 peci_mask;
	u8 old_peci_mask;
L
Linus Torvalds 已提交
393

394 395
	unsigned short addr;
	const char *name;
396
	struct mutex update_lock;
L
Linus Torvalds 已提交
397 398 399
	char valid;		/* !=0 if following fields are valid */
	unsigned long last_updated;	/* In jiffies */

400
	u16 in_scaled;		/* Internal voltage sensors are scaled */
401
	u8 in[10][3];		/* [nr][0]=in, [1]=min, [2]=max */
402
	u8 has_fan;		/* Bitfield, fans enabled */
403
	u16 fan[5][2];		/* Register values, [nr][0]=fan, [1]=min */
404
	u8 has_temp;		/* Bitfield, temp sensors enabled */
405
	s8 temp[3][4];		/* [nr][0]=temp, [1]=min, [2]=max, [3]=offset */
406 407
	u8 sensor;		/* Register value (IT87_REG_TEMP_ENABLE) */
	u8 extra;		/* Register value (IT87_REG_TEMP_EXTRA) */
L
Linus Torvalds 已提交
408 409
	u8 fan_div[3];		/* Register encoding, shifted right */
	u8 vid;			/* Register encoding, combined */
410
	u8 vrm;
L
Linus Torvalds 已提交
411
	u32 alarms;		/* Register encoding, combined */
412
	u8 beeps;		/* Register encoding */
L
Linus Torvalds 已提交
413
	u8 fan_main_ctrl;	/* Register value */
414
	u8 fan_ctl;		/* Register value */
415

416 417
	/*
	 * The following 3 arrays correspond to the same registers up to
418 419 420 421 422 423
	 * the IT8720F. The meaning of bits 6-0 depends on the value of bit
	 * 7, and we want to preserve settings on mode changes, so we have
	 * to track all values separately.
	 * Starting with the IT8721F, the manual PWM duty cycles are stored
	 * in separate registers (8-bit values), so the separate tracking
	 * is no longer needed, but it is still done to keep the driver
424 425
	 * simple.
	 */
426
	u8 pwm_ctrl[3];		/* Register value */
427
	u8 pwm_duty[3];		/* Manual PWM value set by user */
428
	u8 pwm_temp_map[3];	/* PWM to temp. chan. mapping (bits 1-0) */
429 430 431 432

	/* Automatic fan speed control registers */
	u8 auto_pwm[3][4];	/* [nr][3] is hard-coded */
	s8 auto_temp[3][5];	/* [nr][0] is point1_temp_hyst */
L
Linus Torvalds 已提交
433
};
434

435
static int adc_lsb(const struct it87_data *data, int nr)
436
{
437 438 439 440 441
	int lsb = has_12mv_adc(data) ? 12 : 16;
	if (data->in_scaled & (1 << nr))
		lsb <<= 1;
	return lsb;
}
442

443 444 445
static u8 in_to_reg(const struct it87_data *data, int nr, long val)
{
	val = DIV_ROUND_CLOSEST(val, adc_lsb(data, nr));
446
	return clamp_val(val, 0, 255);
447 448 449 450
}

static int in_from_reg(const struct it87_data *data, int nr, int val)
{
451
	return val * adc_lsb(data, nr);
452
}
453 454 455 456 457

static inline u8 FAN_TO_REG(long rpm, int div)
{
	if (rpm == 0)
		return 255;
458 459
	rpm = clamp_val(rpm, 1, 1000000);
	return clamp_val((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
460 461 462 463 464 465
}

static inline u16 FAN16_TO_REG(long rpm)
{
	if (rpm == 0)
		return 0xffff;
466
	return clamp_val((1350000 + rpm) / (rpm * 2), 1, 0xfffe);
467 468 469 470 471 472 473 474
}

#define FAN_FROM_REG(val, div) ((val) == 0 ? -1 : (val) == 255 ? 0 : \
				1350000 / ((val) * (div)))
/* The divider is fixed to 2 in 16-bit mode */
#define FAN16_FROM_REG(val) ((val) == 0 ? -1 : (val) == 0xffff ? 0 : \
			     1350000 / ((val) * 2))

475 476
#define TEMP_TO_REG(val) (clamp_val(((val) < 0 ? (((val) - 500) / 1000) : \
				    ((val) + 500) / 1000), -128, 127))
477 478
#define TEMP_FROM_REG(val) ((val) * 1000)

479 480
static u8 pwm_to_reg(const struct it87_data *data, long val)
{
J
Jean Delvare 已提交
481
	if (has_newer_autopwm(data))
482 483 484 485 486 487 488
		return val;
	else
		return val >> 1;
}

static int pwm_from_reg(const struct it87_data *data, u8 reg)
{
J
Jean Delvare 已提交
489
	if (has_newer_autopwm(data))
490 491 492 493 494
		return reg;
	else
		return (reg & 0x7f) << 1;
}

495 496 497 498 499 500 501 502 503 504

static int DIV_TO_REG(int val)
{
	int answer = 0;
	while (answer < 7 && (val >>= 1))
		answer++;
	return answer;
}
#define DIV_FROM_REG(val) (1 << (val))

505 506 507 508 509 510 511 512 513 514
/*
 * PWM base frequencies. The frequency has to be divided by either 128 or 256,
 * depending on the chip type, to calculate the actual PWM frequency.
 *
 * Some of the chip datasheets suggest a base frequency of 51 kHz instead
 * of 750 kHz for the slowest base frequency, resulting in a PWM frequency
 * of 200 Hz. Sometimes both PWM frequency select registers are affected,
 * sometimes just one. It is unknown if this is a datasheet error or real,
 * so this is ignored for now.
 */
515
static const unsigned int pwm_freq[8] = {
516 517 518 519 520 521 522 523
	48000000,
	24000000,
	12000000,
	8000000,
	6000000,
	3000000,
	1500000,
	750000,
524
};
L
Linus Torvalds 已提交
525

526
static int it87_probe(struct platform_device *pdev);
B
Bill Pemberton 已提交
527
static int it87_remove(struct platform_device *pdev);
L
Linus Torvalds 已提交
528

529 530
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 已提交
531
static struct it87_data *it87_update_device(struct device *dev);
532 533
static int it87_check_pwm(struct device *dev);
static void it87_init_device(struct platform_device *pdev);
L
Linus Torvalds 已提交
534 535


536
static struct platform_driver it87_driver = {
537
	.driver = {
538
		.name	= DRVNAME,
539
	},
540
	.probe	= it87_probe,
B
Bill Pemberton 已提交
541
	.remove	= it87_remove,
542 543
};

544
static ssize_t show_in(struct device *dev, struct device_attribute *attr,
545
		       char *buf)
L
Linus Torvalds 已提交
546
{
547 548 549
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int index = sattr->index;
550

L
Linus Torvalds 已提交
551
	struct it87_data *data = it87_update_device(dev);
552
	return sprintf(buf, "%d\n", in_from_reg(data, nr, data->in[nr][index]));
L
Linus Torvalds 已提交
553 554
}

555 556
static ssize_t set_in(struct device *dev, struct device_attribute *attr,
		      const char *buf, size_t count)
L
Linus Torvalds 已提交
557
{
558 559 560
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int index = sattr->index;
561

562
	struct it87_data *data = dev_get_drvdata(dev);
563 564
	unsigned long val;

565
	if (kstrtoul(buf, 10, &val) < 0)
566
		return -EINVAL;
L
Linus Torvalds 已提交
567

568
	mutex_lock(&data->update_lock);
569 570 571 572 573
	data->in[nr][index] = in_to_reg(data, nr, val);
	it87_write_value(data,
			 index == 1 ? IT87_REG_VIN_MIN(nr)
				    : IT87_REG_VIN_MAX(nr),
			 data->in[nr][index]);
574
	mutex_unlock(&data->update_lock);
L
Linus Torvalds 已提交
575 576
	return count;
}
577

578 579 580 581 582
static SENSOR_DEVICE_ATTR_2(in0_input, S_IRUGO, show_in, NULL, 0, 0);
static SENSOR_DEVICE_ATTR_2(in0_min, S_IRUGO | S_IWUSR, show_in, set_in,
			    0, 1);
static SENSOR_DEVICE_ATTR_2(in0_max, S_IRUGO | S_IWUSR, show_in, set_in,
			    0, 2);
583

584 585 586 587 588
static SENSOR_DEVICE_ATTR_2(in1_input, S_IRUGO, show_in, NULL, 1, 0);
static SENSOR_DEVICE_ATTR_2(in1_min, S_IRUGO | S_IWUSR, show_in, set_in,
			    1, 1);
static SENSOR_DEVICE_ATTR_2(in1_max, S_IRUGO | S_IWUSR, show_in, set_in,
			    1, 2);
L
Linus Torvalds 已提交
589

590 591 592 593 594
static SENSOR_DEVICE_ATTR_2(in2_input, S_IRUGO, show_in, NULL, 2, 0);
static SENSOR_DEVICE_ATTR_2(in2_min, S_IRUGO | S_IWUSR, show_in, set_in,
			    2, 1);
static SENSOR_DEVICE_ATTR_2(in2_max, S_IRUGO | S_IWUSR, show_in, set_in,
			    2, 2);
L
Linus Torvalds 已提交
595

596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626
static SENSOR_DEVICE_ATTR_2(in3_input, S_IRUGO, show_in, NULL, 3, 0);
static SENSOR_DEVICE_ATTR_2(in3_min, S_IRUGO | S_IWUSR, show_in, set_in,
			    3, 1);
static SENSOR_DEVICE_ATTR_2(in3_max, S_IRUGO | S_IWUSR, show_in, set_in,
			    3, 2);

static SENSOR_DEVICE_ATTR_2(in4_input, S_IRUGO, show_in, NULL, 4, 0);
static SENSOR_DEVICE_ATTR_2(in4_min, S_IRUGO | S_IWUSR, show_in, set_in,
			    4, 1);
static SENSOR_DEVICE_ATTR_2(in4_max, S_IRUGO | S_IWUSR, show_in, set_in,
			    4, 2);

static SENSOR_DEVICE_ATTR_2(in5_input, S_IRUGO, show_in, NULL, 5, 0);
static SENSOR_DEVICE_ATTR_2(in5_min, S_IRUGO | S_IWUSR, show_in, set_in,
			    5, 1);
static SENSOR_DEVICE_ATTR_2(in5_max, S_IRUGO | S_IWUSR, show_in, set_in,
			    5, 2);

static SENSOR_DEVICE_ATTR_2(in6_input, S_IRUGO, show_in, NULL, 6, 0);
static SENSOR_DEVICE_ATTR_2(in6_min, S_IRUGO | S_IWUSR, show_in, set_in,
			    6, 1);
static SENSOR_DEVICE_ATTR_2(in6_max, S_IRUGO | S_IWUSR, show_in, set_in,
			    6, 2);

static SENSOR_DEVICE_ATTR_2(in7_input, S_IRUGO, show_in, NULL, 7, 0);
static SENSOR_DEVICE_ATTR_2(in7_min, S_IRUGO | S_IWUSR, show_in, set_in,
			    7, 1);
static SENSOR_DEVICE_ATTR_2(in7_max, S_IRUGO | S_IWUSR, show_in, set_in,
			    7, 2);

static SENSOR_DEVICE_ATTR_2(in8_input, S_IRUGO, show_in, NULL, 8, 0);
627
static SENSOR_DEVICE_ATTR_2(in9_input, S_IRUGO, show_in, NULL, 9, 0);
L
Linus Torvalds 已提交
628 629

/* 3 temperatures */
630
static ssize_t show_temp(struct device *dev, struct device_attribute *attr,
631
			 char *buf)
L
Linus Torvalds 已提交
632
{
633 634 635
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int index = sattr->index;
L
Linus Torvalds 已提交
636
	struct it87_data *data = it87_update_device(dev);
637

638
	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[nr][index]));
L
Linus Torvalds 已提交
639
}
640

641 642
static ssize_t set_temp(struct device *dev, struct device_attribute *attr,
			const char *buf, size_t count)
L
Linus Torvalds 已提交
643
{
644 645 646
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int index = sattr->index;
647
	struct it87_data *data = dev_get_drvdata(dev);
648
	long val;
649
	u8 reg, regval;
650

651
	if (kstrtol(buf, 10, &val) < 0)
652
		return -EINVAL;
L
Linus Torvalds 已提交
653

654
	mutex_lock(&data->update_lock);
655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674

	switch (index) {
	default:
	case 1:
		reg = IT87_REG_TEMP_LOW(nr);
		break;
	case 2:
		reg = IT87_REG_TEMP_HIGH(nr);
		break;
	case 3:
		regval = it87_read_value(data, IT87_REG_BEEP_ENABLE);
		if (!(regval & 0x80)) {
			regval |= 0x80;
			it87_write_value(data, IT87_REG_BEEP_ENABLE, regval);
		}
		data->valid = 0;
		reg = IT87_REG_TEMP_OFFSET[nr];
		break;
	}

675
	data->temp[nr][index] = TEMP_TO_REG(val);
676
	it87_write_value(data, reg, data->temp[nr][index]);
677
	mutex_unlock(&data->update_lock);
L
Linus Torvalds 已提交
678 679 680
	return count;
}

681 682 683 684 685
static SENSOR_DEVICE_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0);
static SENSOR_DEVICE_ATTR_2(temp1_min, S_IRUGO | S_IWUSR, show_temp, set_temp,
			    0, 1);
static SENSOR_DEVICE_ATTR_2(temp1_max, S_IRUGO | S_IWUSR, show_temp, set_temp,
			    0, 2);
686 687
static SENSOR_DEVICE_ATTR_2(temp1_offset, S_IRUGO | S_IWUSR, show_temp,
			    set_temp, 0, 3);
688 689 690 691 692
static SENSOR_DEVICE_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 1, 0);
static SENSOR_DEVICE_ATTR_2(temp2_min, S_IRUGO | S_IWUSR, show_temp, set_temp,
			    1, 1);
static SENSOR_DEVICE_ATTR_2(temp2_max, S_IRUGO | S_IWUSR, show_temp, set_temp,
			    1, 2);
693 694
static SENSOR_DEVICE_ATTR_2(temp2_offset, S_IRUGO | S_IWUSR, show_temp,
			    set_temp, 1, 3);
695 696 697 698 699
static SENSOR_DEVICE_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 2, 0);
static SENSOR_DEVICE_ATTR_2(temp3_min, S_IRUGO | S_IWUSR, show_temp, set_temp,
			    2, 1);
static SENSOR_DEVICE_ATTR_2(temp3_max, S_IRUGO | S_IWUSR, show_temp, set_temp,
			    2, 2);
700 701
static SENSOR_DEVICE_ATTR_2(temp3_offset, S_IRUGO | S_IWUSR, show_temp,
			    set_temp, 2, 3);
L
Linus Torvalds 已提交
702

703 704
static ssize_t show_temp_type(struct device *dev, struct device_attribute *attr,
			      char *buf)
L
Linus Torvalds 已提交
705
{
706 707
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;
L
Linus Torvalds 已提交
708
	struct it87_data *data = it87_update_device(dev);
709
	u8 reg = data->sensor;	    /* In case value is updated while used */
710
	u8 extra = data->extra;
711

712 713
	if ((has_temp_peci(data, nr) && (reg >> 6 == nr + 1))
	    || (has_temp_old_peci(data, nr) && (extra & 0x80)))
714
		return sprintf(buf, "6\n");  /* Intel PECI */
L
Linus Torvalds 已提交
715 716 717
	if (reg & (1 << nr))
		return sprintf(buf, "3\n");  /* thermal diode */
	if (reg & (8 << nr))
718
		return sprintf(buf, "4\n");  /* thermistor */
L
Linus Torvalds 已提交
719 720
	return sprintf(buf, "0\n");      /* disabled */
}
721 722 723

static ssize_t set_temp_type(struct device *dev, struct device_attribute *attr,
			     const char *buf, size_t count)
L
Linus Torvalds 已提交
724
{
725 726 727
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

728
	struct it87_data *data = dev_get_drvdata(dev);
729
	long val;
730
	u8 reg, extra;
731

732
	if (kstrtol(buf, 10, &val) < 0)
733
		return -EINVAL;
L
Linus Torvalds 已提交
734

735 736 737
	reg = it87_read_value(data, IT87_REG_TEMP_ENABLE);
	reg &= ~(1 << nr);
	reg &= ~(8 << nr);
738 739
	if (has_temp_peci(data, nr) && (reg >> 6 == nr + 1 || val == 6))
		reg &= 0x3f;
740 741 742
	extra = it87_read_value(data, IT87_REG_TEMP_EXTRA);
	if (has_temp_old_peci(data, nr) && ((extra & 0x80) || val == 6))
		extra &= 0x7f;
743
	if (val == 2) {	/* backwards compatibility */
744 745
		dev_warn(dev,
			 "Sensor type 2 is deprecated, please use 4 instead\n");
746 747
		val = 4;
	}
748
	/* 3 = thermal diode; 4 = thermistor; 6 = Intel PECI; 0 = disabled */
L
Linus Torvalds 已提交
749
	if (val == 3)
750
		reg |= 1 << nr;
751
	else if (val == 4)
752
		reg |= 8 << nr;
753 754
	else if (has_temp_peci(data, nr) && val == 6)
		reg |= (nr + 1) << 6;
755 756
	else if (has_temp_old_peci(data, nr) && val == 6)
		extra |= 0x80;
757
	else if (val != 0)
L
Linus Torvalds 已提交
758
		return -EINVAL;
759 760 761

	mutex_lock(&data->update_lock);
	data->sensor = reg;
762
	data->extra = extra;
763
	it87_write_value(data, IT87_REG_TEMP_ENABLE, data->sensor);
764 765
	if (has_temp_old_peci(data, nr))
		it87_write_value(data, IT87_REG_TEMP_EXTRA, data->extra);
766
	data->valid = 0;	/* Force cache refresh */
767
	mutex_unlock(&data->update_lock);
L
Linus Torvalds 已提交
768 769 770
	return count;
}

771 772 773 774 775 776
static SENSOR_DEVICE_ATTR(temp1_type, S_IRUGO | S_IWUSR, show_temp_type,
			  set_temp_type, 0);
static SENSOR_DEVICE_ATTR(temp2_type, S_IRUGO | S_IWUSR, show_temp_type,
			  set_temp_type, 1);
static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO | S_IWUSR, show_temp_type,
			  set_temp_type, 2);
L
Linus Torvalds 已提交
777 778

/* 3 Fans */
779 780 781 782 783

static int pwm_mode(const struct it87_data *data, int nr)
{
	int ctrl = data->fan_main_ctrl & (1 << nr);

784
	if (ctrl == 0 && data->type != it8603)		/* Full speed */
785 786 787 788 789 790 791
		return 0;
	if (data->pwm_ctrl[nr] & 0x80)			/* Automatic mode */
		return 2;
	else						/* Manual mode */
		return 1;
}

792
static ssize_t show_fan(struct device *dev, struct device_attribute *attr,
793
			char *buf)
L
Linus Torvalds 已提交
794
{
795 796 797 798
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int index = sattr->index;
	int speed;
L
Linus Torvalds 已提交
799
	struct it87_data *data = it87_update_device(dev);
800

801 802 803 804 805
	speed = has_16bit_fans(data) ?
		FAN16_FROM_REG(data->fan[nr][index]) :
		FAN_FROM_REG(data->fan[nr][index],
			     DIV_FROM_REG(data->fan_div[nr]));
	return sprintf(buf, "%d\n", speed);
L
Linus Torvalds 已提交
806
}
807

808 809
static ssize_t show_fan_div(struct device *dev, struct device_attribute *attr,
		char *buf)
L
Linus Torvalds 已提交
810
{
811 812 813
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

L
Linus Torvalds 已提交
814 815 816
	struct it87_data *data = it87_update_device(dev);
	return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr]));
}
817 818
static ssize_t show_pwm_enable(struct device *dev,
		struct device_attribute *attr, char *buf)
L
Linus Torvalds 已提交
819
{
820 821 822
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

L
Linus Torvalds 已提交
823
	struct it87_data *data = it87_update_device(dev);
824
	return sprintf(buf, "%d\n", pwm_mode(data, nr));
L
Linus Torvalds 已提交
825
}
826 827
static ssize_t show_pwm(struct device *dev, struct device_attribute *attr,
		char *buf)
L
Linus Torvalds 已提交
828
{
829 830 831
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

L
Linus Torvalds 已提交
832
	struct it87_data *data = it87_update_device(dev);
833 834
	return sprintf(buf, "%d\n",
		       pwm_from_reg(data, data->pwm_duty[nr]));
L
Linus Torvalds 已提交
835
}
836 837 838 839 840
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;
841
	unsigned int freq;
842

843 844 845
	freq = pwm_freq[index] / (has_newer_autopwm(data) ? 256 : 128);

	return sprintf(buf, "%u\n", freq);
846
}
847 848 849

static ssize_t set_fan(struct device *dev, struct device_attribute *attr,
		       const char *buf, size_t count)
L
Linus Torvalds 已提交
850
{
851 852 853
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int index = sattr->index;
854

855
	struct it87_data *data = dev_get_drvdata(dev);
856
	long val;
857
	u8 reg;
L
Linus Torvalds 已提交
858

859
	if (kstrtol(buf, 10, &val) < 0)
860 861
		return -EINVAL;

862
	mutex_lock(&data->update_lock);
863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886

	if (has_16bit_fans(data)) {
		data->fan[nr][index] = FAN16_TO_REG(val);
		it87_write_value(data, IT87_REG_FAN_MIN[nr],
				 data->fan[nr][index] & 0xff);
		it87_write_value(data, IT87_REG_FANX_MIN[nr],
				 data->fan[nr][index] >> 8);
	} else {
		reg = it87_read_value(data, IT87_REG_FAN_DIV);
		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;
		}
		data->fan[nr][index] =
		  FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
		it87_write_value(data, IT87_REG_FAN_MIN[nr],
				 data->fan[nr][index]);
887 888
	}

889
	mutex_unlock(&data->update_lock);
L
Linus Torvalds 已提交
890 891
	return count;
}
892

893 894
static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t count)
L
Linus Torvalds 已提交
895
{
896 897 898
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

899
	struct it87_data *data = dev_get_drvdata(dev);
900
	unsigned long val;
J
Jean Delvare 已提交
901
	int min;
L
Linus Torvalds 已提交
902 903
	u8 old;

904
	if (kstrtoul(buf, 10, &val) < 0)
905 906
		return -EINVAL;

907
	mutex_lock(&data->update_lock);
908
	old = it87_read_value(data, IT87_REG_FAN_DIV);
L
Linus Torvalds 已提交
909

J
Jean Delvare 已提交
910
	/* Save fan min limit */
911
	min = FAN_FROM_REG(data->fan[nr][1], DIV_FROM_REG(data->fan_div[nr]));
L
Linus Torvalds 已提交
912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928

	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;
929
	it87_write_value(data, IT87_REG_FAN_DIV, val);
L
Linus Torvalds 已提交
930

J
Jean Delvare 已提交
931
	/* Restore fan min limit */
932 933
	data->fan[nr][1] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
	it87_write_value(data, IT87_REG_FAN_MIN[nr], data->fan[nr][1]);
J
Jean Delvare 已提交
934

935
	mutex_unlock(&data->update_lock);
L
Linus Torvalds 已提交
936 937
	return count;
}
938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956

/* Returns 0 if OK, -EINVAL otherwise */
static int check_trip_points(struct device *dev, int nr)
{
	const struct it87_data *data = dev_get_drvdata(dev);
	int i, err = 0;

	if (has_old_autopwm(data)) {
		for (i = 0; i < 3; i++) {
			if (data->auto_temp[nr][i] > data->auto_temp[nr][i + 1])
				err = -EINVAL;
		}
		for (i = 0; i < 2; i++) {
			if (data->auto_pwm[nr][i] > data->auto_pwm[nr][i + 1])
				err = -EINVAL;
		}
	}

	if (err) {
957 958
		dev_err(dev,
			"Inconsistent trip points, not switching to automatic mode\n");
959 960 961 962 963
		dev_err(dev, "Adjust the trip points and try again\n");
	}
	return err;
}

964 965
static ssize_t set_pwm_enable(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
L
Linus Torvalds 已提交
966
{
967 968 969
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

970
	struct it87_data *data = dev_get_drvdata(dev);
971
	long val;
L
Linus Torvalds 已提交
972

973
	if (kstrtol(buf, 10, &val) < 0 || val < 0 || val > 2)
974 975
		return -EINVAL;

976 977 978 979 980 981
	/* Check trip points before switching to automatic mode */
	if (val == 2) {
		if (check_trip_points(dev, nr) < 0)
			return -EINVAL;
	}

982 983 984 985
	/* IT8603E does not have on/off mode */
	if (val == 0 && data->type == it8603)
		return -EINVAL;

986
	mutex_lock(&data->update_lock);
L
Linus Torvalds 已提交
987 988 989 990

	if (val == 0) {
		int tmp;
		/* make sure the fan is on when in on/off mode */
991 992
		tmp = it87_read_value(data, IT87_REG_FAN_CTL);
		it87_write_value(data, IT87_REG_FAN_CTL, tmp | (1 << nr));
L
Linus Torvalds 已提交
993 994
		/* set on/off mode */
		data->fan_main_ctrl &= ~(1 << nr);
995 996
		it87_write_value(data, IT87_REG_FAN_MAIN_CTRL,
				 data->fan_main_ctrl);
997 998
	} else {
		if (val == 1)				/* Manual mode */
J
Jean Delvare 已提交
999
			data->pwm_ctrl[nr] = has_newer_autopwm(data) ?
1000 1001
					     data->pwm_temp_map[nr] :
					     data->pwm_duty[nr];
1002 1003 1004
		else					/* Automatic mode */
			data->pwm_ctrl[nr] = 0x80 | data->pwm_temp_map[nr];
		it87_write_value(data, IT87_REG_PWM(nr), data->pwm_ctrl[nr]);
1005 1006 1007 1008 1009 1010 1011

		if (data->type != it8603) {
			/* set SmartGuardian mode */
			data->fan_main_ctrl |= (1 << nr);
			it87_write_value(data, IT87_REG_FAN_MAIN_CTRL,
					 data->fan_main_ctrl);
		}
L
Linus Torvalds 已提交
1012 1013
	}

1014
	mutex_unlock(&data->update_lock);
L
Linus Torvalds 已提交
1015 1016
	return count;
}
1017 1018
static ssize_t set_pwm(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t count)
L
Linus Torvalds 已提交
1019
{
1020 1021 1022
	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
	int nr = sensor_attr->index;

1023
	struct it87_data *data = dev_get_drvdata(dev);
1024
	long val;
L
Linus Torvalds 已提交
1025

1026
	if (kstrtol(buf, 10, &val) < 0 || val < 0 || val > 255)
L
Linus Torvalds 已提交
1027 1028
		return -EINVAL;

1029
	mutex_lock(&data->update_lock);
J
Jean Delvare 已提交
1030
	if (has_newer_autopwm(data)) {
1031 1032 1033 1034
		/*
		 * If we are in automatic mode, the PWM duty cycle register
		 * is read-only so we can't write the value.
		 */
1035 1036 1037 1038 1039 1040 1041 1042 1043
		if (data->pwm_ctrl[nr] & 0x80) {
			mutex_unlock(&data->update_lock);
			return -EBUSY;
		}
		data->pwm_duty[nr] = pwm_to_reg(data, val);
		it87_write_value(data, IT87_REG_PWM_DUTY(nr),
				 data->pwm_duty[nr]);
	} else {
		data->pwm_duty[nr] = pwm_to_reg(data, val);
1044 1045 1046 1047
		/*
		 * If we are in manual mode, write the duty cycle immediately;
		 * otherwise, just store it for later use.
		 */
1048 1049 1050 1051 1052
		if (!(data->pwm_ctrl[nr] & 0x80)) {
			data->pwm_ctrl[nr] = data->pwm_duty[nr];
			it87_write_value(data, IT87_REG_PWM(nr),
					 data->pwm_ctrl[nr]);
		}
1053
	}
1054
	mutex_unlock(&data->update_lock);
L
Linus Torvalds 已提交
1055 1056
	return count;
}
1057 1058 1059
static ssize_t set_pwm_freq(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
{
1060
	struct it87_data *data = dev_get_drvdata(dev);
1061
	unsigned long val;
1062 1063
	int i;

1064
	if (kstrtoul(buf, 10, &val) < 0)
1065
		return -EINVAL;
1066 1067 1068

	val = clamp_val(val, 0, 1000000);
	val *= has_newer_autopwm(data) ? 256 : 128;
1069

1070 1071 1072 1073 1074 1075 1076
	/* 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);
1077
	data->fan_ctl = it87_read_value(data, IT87_REG_FAN_CTL) & 0x8f;
1078
	data->fan_ctl |= i << 4;
1079
	it87_write_value(data, IT87_REG_FAN_CTL, data->fan_ctl);
1080 1081 1082 1083
	mutex_unlock(&data->update_lock);

	return count;
}
1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108
static ssize_t show_pwm_temp_map(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);
	int map;

	if (data->pwm_temp_map[nr] < 3)
		map = 1 << data->pwm_temp_map[nr];
	else
		map = 0;			/* Should never happen */
	return sprintf(buf, "%d\n", map);
}
static ssize_t set_pwm_temp_map(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;

	struct it87_data *data = dev_get_drvdata(dev);
	long val;
	u8 reg;

1109 1110 1111 1112
	/*
	 * This check can go away if we ever support automatic fan speed
	 * control on newer chips.
	 */
1113 1114 1115 1116 1117
	if (!has_old_autopwm(data)) {
		dev_notice(dev, "Mapping change disabled for safety reasons\n");
		return -EINVAL;
	}

1118
	if (kstrtol(buf, 10, &val) < 0)
1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136
		return -EINVAL;

	switch (val) {
	case (1 << 0):
		reg = 0x00;
		break;
	case (1 << 1):
		reg = 0x01;
		break;
	case (1 << 2):
		reg = 0x02;
		break;
	default:
		return -EINVAL;
	}

	mutex_lock(&data->update_lock);
	data->pwm_temp_map[nr] = reg;
1137 1138 1139 1140
	/*
	 * If we are in automatic mode, write the temp mapping immediately;
	 * otherwise, just store it for later use.
	 */
1141 1142 1143 1144 1145 1146 1147
	if (data->pwm_ctrl[nr] & 0x80) {
		data->pwm_ctrl[nr] = 0x80 | data->pwm_temp_map[nr];
		it87_write_value(data, IT87_REG_PWM(nr), data->pwm_ctrl[nr]);
	}
	mutex_unlock(&data->update_lock);
	return count;
}
L
Linus Torvalds 已提交
1148

1149 1150 1151 1152 1153 1154 1155 1156 1157
static ssize_t show_auto_pwm(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct it87_data *data = it87_update_device(dev);
	struct sensor_device_attribute_2 *sensor_attr =
			to_sensor_dev_attr_2(attr);
	int nr = sensor_attr->nr;
	int point = sensor_attr->index;

1158 1159
	return sprintf(buf, "%d\n",
		       pwm_from_reg(data, data->auto_pwm[nr][point]));
1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171
}

static ssize_t set_auto_pwm(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
{
	struct it87_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute_2 *sensor_attr =
			to_sensor_dev_attr_2(attr);
	int nr = sensor_attr->nr;
	int point = sensor_attr->index;
	long val;

1172
	if (kstrtol(buf, 10, &val) < 0 || val < 0 || val > 255)
1173 1174 1175
		return -EINVAL;

	mutex_lock(&data->update_lock);
1176
	data->auto_pwm[nr][point] = pwm_to_reg(data, val);
1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204
	it87_write_value(data, IT87_REG_AUTO_PWM(nr, point),
			 data->auto_pwm[nr][point]);
	mutex_unlock(&data->update_lock);
	return count;
}

static ssize_t show_auto_temp(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct it87_data *data = it87_update_device(dev);
	struct sensor_device_attribute_2 *sensor_attr =
			to_sensor_dev_attr_2(attr);
	int nr = sensor_attr->nr;
	int point = sensor_attr->index;

	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->auto_temp[nr][point]));
}

static ssize_t set_auto_temp(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
{
	struct it87_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute_2 *sensor_attr =
			to_sensor_dev_attr_2(attr);
	int nr = sensor_attr->nr;
	int point = sensor_attr->index;
	long val;

1205
	if (kstrtol(buf, 10, &val) < 0 || val < -128000 || val > 127000)
1206 1207 1208 1209 1210 1211 1212 1213 1214 1215
		return -EINVAL;

	mutex_lock(&data->update_lock);
	data->auto_temp[nr][point] = TEMP_TO_REG(val);
	it87_write_value(data, IT87_REG_AUTO_TEMP(nr, point),
			 data->auto_temp[nr][point]);
	mutex_unlock(&data->update_lock);
	return count;
}

1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236
static SENSOR_DEVICE_ATTR_2(fan1_input, S_IRUGO, show_fan, NULL, 0, 0);
static SENSOR_DEVICE_ATTR_2(fan1_min, S_IRUGO | S_IWUSR, show_fan, set_fan,
			    0, 1);
static SENSOR_DEVICE_ATTR(fan1_div, S_IRUGO | S_IWUSR, show_fan_div,
			  set_fan_div, 0);

static SENSOR_DEVICE_ATTR_2(fan2_input, S_IRUGO, show_fan, NULL, 1, 0);
static SENSOR_DEVICE_ATTR_2(fan2_min, S_IRUGO | S_IWUSR, show_fan, set_fan,
			    1, 1);
static SENSOR_DEVICE_ATTR(fan2_div, S_IRUGO | S_IWUSR, show_fan_div,
			  set_fan_div, 1);

static SENSOR_DEVICE_ATTR_2(fan3_input, S_IRUGO, show_fan, NULL, 2, 0);
static SENSOR_DEVICE_ATTR_2(fan3_min, S_IRUGO | S_IWUSR, show_fan, set_fan,
			    2, 1);
static SENSOR_DEVICE_ATTR(fan3_div, S_IRUGO | S_IWUSR, show_fan_div,
			  set_fan_div, 2);

static SENSOR_DEVICE_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 3, 0);
static SENSOR_DEVICE_ATTR_2(fan4_min, S_IRUGO | S_IWUSR, show_fan, set_fan,
			    3, 1);
L
Linus Torvalds 已提交
1237

1238 1239 1240
static SENSOR_DEVICE_ATTR_2(fan5_input, S_IRUGO, show_fan, NULL, 4, 0);
static SENSOR_DEVICE_ATTR_2(fan5_min, S_IRUGO | S_IWUSR, show_fan, set_fan,
			    4, 1);
L
Linus Torvalds 已提交
1241

1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315
static SENSOR_DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR,
			  show_pwm_enable, set_pwm_enable, 0);
static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 0);
static DEVICE_ATTR(pwm1_freq, S_IRUGO | S_IWUSR, show_pwm_freq, set_pwm_freq);
static SENSOR_DEVICE_ATTR(pwm1_auto_channels_temp, S_IRUGO | S_IWUSR,
			  show_pwm_temp_map, set_pwm_temp_map, 0);
static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO | S_IWUSR,
			    show_auto_pwm, set_auto_pwm, 0, 0);
static SENSOR_DEVICE_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO | S_IWUSR,
			    show_auto_pwm, set_auto_pwm, 0, 1);
static SENSOR_DEVICE_ATTR_2(pwm1_auto_point3_pwm, S_IRUGO | S_IWUSR,
			    show_auto_pwm, set_auto_pwm, 0, 2);
static SENSOR_DEVICE_ATTR_2(pwm1_auto_point4_pwm, S_IRUGO,
			    show_auto_pwm, NULL, 0, 3);
static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_temp, S_IRUGO | S_IWUSR,
			    show_auto_temp, set_auto_temp, 0, 1);
static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO | S_IWUSR,
			    show_auto_temp, set_auto_temp, 0, 0);
static SENSOR_DEVICE_ATTR_2(pwm1_auto_point2_temp, S_IRUGO | S_IWUSR,
			    show_auto_temp, set_auto_temp, 0, 2);
static SENSOR_DEVICE_ATTR_2(pwm1_auto_point3_temp, S_IRUGO | S_IWUSR,
			    show_auto_temp, set_auto_temp, 0, 3);
static SENSOR_DEVICE_ATTR_2(pwm1_auto_point4_temp, S_IRUGO | S_IWUSR,
			    show_auto_temp, set_auto_temp, 0, 4);

static SENSOR_DEVICE_ATTR(pwm2_enable, S_IRUGO | S_IWUSR,
			  show_pwm_enable, set_pwm_enable, 1);
static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 1);
static DEVICE_ATTR(pwm2_freq, S_IRUGO, show_pwm_freq, NULL);
static SENSOR_DEVICE_ATTR(pwm2_auto_channels_temp, S_IRUGO | S_IWUSR,
			  show_pwm_temp_map, set_pwm_temp_map, 1);
static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO | S_IWUSR,
			    show_auto_pwm, set_auto_pwm, 1, 0);
static SENSOR_DEVICE_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO | S_IWUSR,
			    show_auto_pwm, set_auto_pwm, 1, 1);
static SENSOR_DEVICE_ATTR_2(pwm2_auto_point3_pwm, S_IRUGO | S_IWUSR,
			    show_auto_pwm, set_auto_pwm, 1, 2);
static SENSOR_DEVICE_ATTR_2(pwm2_auto_point4_pwm, S_IRUGO,
			    show_auto_pwm, NULL, 1, 3);
static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_temp, S_IRUGO | S_IWUSR,
			    show_auto_temp, set_auto_temp, 1, 1);
static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO | S_IWUSR,
			    show_auto_temp, set_auto_temp, 1, 0);
static SENSOR_DEVICE_ATTR_2(pwm2_auto_point2_temp, S_IRUGO | S_IWUSR,
			    show_auto_temp, set_auto_temp, 1, 2);
static SENSOR_DEVICE_ATTR_2(pwm2_auto_point3_temp, S_IRUGO | S_IWUSR,
			    show_auto_temp, set_auto_temp, 1, 3);
static SENSOR_DEVICE_ATTR_2(pwm2_auto_point4_temp, S_IRUGO | S_IWUSR,
			    show_auto_temp, set_auto_temp, 1, 4);

static SENSOR_DEVICE_ATTR(pwm3_enable, S_IRUGO | S_IWUSR,
			  show_pwm_enable, set_pwm_enable, 2);
static SENSOR_DEVICE_ATTR(pwm3, S_IRUGO | S_IWUSR, show_pwm, set_pwm, 2);
static DEVICE_ATTR(pwm3_freq, S_IRUGO, show_pwm_freq, NULL);
static SENSOR_DEVICE_ATTR(pwm3_auto_channels_temp, S_IRUGO | S_IWUSR,
			  show_pwm_temp_map, set_pwm_temp_map, 2);
static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO | S_IWUSR,
			    show_auto_pwm, set_auto_pwm, 2, 0);
static SENSOR_DEVICE_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO | S_IWUSR,
			    show_auto_pwm, set_auto_pwm, 2, 1);
static SENSOR_DEVICE_ATTR_2(pwm3_auto_point3_pwm, S_IRUGO | S_IWUSR,
			    show_auto_pwm, set_auto_pwm, 2, 2);
static SENSOR_DEVICE_ATTR_2(pwm3_auto_point4_pwm, S_IRUGO,
			    show_auto_pwm, NULL, 2, 3);
static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_temp, S_IRUGO | S_IWUSR,
			    show_auto_temp, set_auto_temp, 2, 1);
static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO | S_IWUSR,
			    show_auto_temp, set_auto_temp, 2, 0);
static SENSOR_DEVICE_ATTR_2(pwm3_auto_point2_temp, S_IRUGO | S_IWUSR,
			    show_auto_temp, set_auto_temp, 2, 2);
static SENSOR_DEVICE_ATTR_2(pwm3_auto_point3_temp, S_IRUGO | S_IWUSR,
			    show_auto_temp, set_auto_temp, 2, 3);
static SENSOR_DEVICE_ATTR_2(pwm3_auto_point4_temp, S_IRUGO | S_IWUSR,
			    show_auto_temp, set_auto_temp, 2, 4);
L
Linus Torvalds 已提交
1316 1317

/* Alarms */
1318 1319
static ssize_t show_alarms(struct device *dev, struct device_attribute *attr,
		char *buf)
L
Linus Torvalds 已提交
1320 1321
{
	struct it87_data *data = it87_update_device(dev);
1322
	return sprintf(buf, "%u\n", data->alarms);
L
Linus Torvalds 已提交
1323
}
1324
static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
L
Linus Torvalds 已提交
1325

1326 1327 1328 1329 1330 1331 1332
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);
}
1333 1334 1335 1336 1337 1338 1339 1340

static ssize_t clear_intrusion(struct device *dev, struct device_attribute
		*attr, const char *buf, size_t count)
{
	struct it87_data *data = dev_get_drvdata(dev);
	long val;
	int config;

1341
	if (kstrtol(buf, 10, &val) < 0 || val != 0)
1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358
		return -EINVAL;

	mutex_lock(&data->update_lock);
	config = it87_read_value(data, IT87_REG_CONFIG);
	if (config < 0) {
		count = config;
	} else {
		config |= 1 << 5;
		it87_write_value(data, IT87_REG_CONFIG, config);
		/* Invalidate cache to force re-read */
		data->valid = 0;
	}
	mutex_unlock(&data->update_lock);

	return count;
}

1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374
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);
1375 1376
static SENSOR_DEVICE_ATTR(intrusion0_alarm, S_IRUGO | S_IWUSR,
			  show_alarm, clear_intrusion, 4);
1377

1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391
static ssize_t show_beep(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->beeps >> bitnr) & 1);
}
static ssize_t set_beep(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t count)
{
	int bitnr = to_sensor_dev_attr(attr)->index;
	struct it87_data *data = dev_get_drvdata(dev);
	long val;

1392
	if (kstrtol(buf, 10, &val) < 0
1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426
	 || (val != 0 && val != 1))
		return -EINVAL;

	mutex_lock(&data->update_lock);
	data->beeps = it87_read_value(data, IT87_REG_BEEP_ENABLE);
	if (val)
		data->beeps |= (1 << bitnr);
	else
		data->beeps &= ~(1 << bitnr);
	it87_write_value(data, IT87_REG_BEEP_ENABLE, data->beeps);
	mutex_unlock(&data->update_lock);
	return count;
}

static SENSOR_DEVICE_ATTR(in0_beep, S_IRUGO | S_IWUSR,
			  show_beep, set_beep, 1);
static SENSOR_DEVICE_ATTR(in1_beep, S_IRUGO, show_beep, NULL, 1);
static SENSOR_DEVICE_ATTR(in2_beep, S_IRUGO, show_beep, NULL, 1);
static SENSOR_DEVICE_ATTR(in3_beep, S_IRUGO, show_beep, NULL, 1);
static SENSOR_DEVICE_ATTR(in4_beep, S_IRUGO, show_beep, NULL, 1);
static SENSOR_DEVICE_ATTR(in5_beep, S_IRUGO, show_beep, NULL, 1);
static SENSOR_DEVICE_ATTR(in6_beep, S_IRUGO, show_beep, NULL, 1);
static SENSOR_DEVICE_ATTR(in7_beep, S_IRUGO, show_beep, NULL, 1);
/* fanX_beep writability is set later */
static SENSOR_DEVICE_ATTR(fan1_beep, S_IRUGO, show_beep, set_beep, 0);
static SENSOR_DEVICE_ATTR(fan2_beep, S_IRUGO, show_beep, set_beep, 0);
static SENSOR_DEVICE_ATTR(fan3_beep, S_IRUGO, show_beep, set_beep, 0);
static SENSOR_DEVICE_ATTR(fan4_beep, S_IRUGO, show_beep, set_beep, 0);
static SENSOR_DEVICE_ATTR(fan5_beep, S_IRUGO, show_beep, set_beep, 0);
static SENSOR_DEVICE_ATTR(temp1_beep, S_IRUGO | S_IWUSR,
			  show_beep, set_beep, 2);
static SENSOR_DEVICE_ATTR(temp2_beep, S_IRUGO, show_beep, NULL, 2);
static SENSOR_DEVICE_ATTR(temp3_beep, S_IRUGO, show_beep, NULL, 2);

1427 1428
static ssize_t show_vrm_reg(struct device *dev, struct device_attribute *attr,
		char *buf)
L
Linus Torvalds 已提交
1429
{
1430
	struct it87_data *data = dev_get_drvdata(dev);
1431
	return sprintf(buf, "%u\n", data->vrm);
L
Linus Torvalds 已提交
1432
}
1433 1434
static ssize_t store_vrm_reg(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t count)
L
Linus Torvalds 已提交
1435
{
1436
	struct it87_data *data = dev_get_drvdata(dev);
1437 1438
	unsigned long val;

1439
	if (kstrtoul(buf, 10, &val) < 0)
1440
		return -EINVAL;
L
Linus Torvalds 已提交
1441 1442 1443 1444 1445 1446 1447

	data->vrm = val;

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

1448 1449
static ssize_t show_vid_reg(struct device *dev, struct device_attribute *attr,
		char *buf)
L
Linus Torvalds 已提交
1450 1451 1452 1453 1454
{
	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);
1455

1456 1457 1458
static ssize_t show_label(struct device *dev, struct device_attribute *attr,
		char *buf)
{
1459
	static const char * const labels[] = {
1460 1461 1462 1463
		"+5V",
		"5VSB",
		"Vbat",
	};
1464
	static const char * const labels_it8721[] = {
1465 1466 1467 1468 1469
		"+3.3V",
		"3VSB",
		"Vbat",
	};
	struct it87_data *data = dev_get_drvdata(dev);
1470 1471
	int nr = to_sensor_dev_attr(attr)->index;

J
Jean Delvare 已提交
1472 1473
	return sprintf(buf, "%s\n", has_12mv_adc(data) ? labels_it8721[nr]
						       : labels[nr]);
1474 1475 1476 1477
}
static SENSOR_DEVICE_ATTR(in3_label, S_IRUGO, show_label, NULL, 0);
static SENSOR_DEVICE_ATTR(in7_label, S_IRUGO, show_label, NULL, 1);
static SENSOR_DEVICE_ATTR(in8_label, S_IRUGO, show_label, NULL, 2);
1478
/* special AVCC3 IT8603E in9 */
1479
static SENSOR_DEVICE_ATTR(in9_label, S_IRUGO, show_label, NULL, 0);
1480

1481 1482 1483 1484 1485 1486 1487 1488
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);

1489
static struct attribute *it87_attributes_in[10][5] = {
1490
{
1491 1492 1493
	&sensor_dev_attr_in0_input.dev_attr.attr,
	&sensor_dev_attr_in0_min.dev_attr.attr,
	&sensor_dev_attr_in0_max.dev_attr.attr,
1494
	&sensor_dev_attr_in0_alarm.dev_attr.attr,
1495 1496 1497 1498 1499
	NULL
}, {
	&sensor_dev_attr_in1_input.dev_attr.attr,
	&sensor_dev_attr_in1_min.dev_attr.attr,
	&sensor_dev_attr_in1_max.dev_attr.attr,
1500
	&sensor_dev_attr_in1_alarm.dev_attr.attr,
1501 1502 1503 1504 1505
	NULL
}, {
	&sensor_dev_attr_in2_input.dev_attr.attr,
	&sensor_dev_attr_in2_min.dev_attr.attr,
	&sensor_dev_attr_in2_max.dev_attr.attr,
1506
	&sensor_dev_attr_in2_alarm.dev_attr.attr,
1507 1508 1509 1510 1511
	NULL
}, {
	&sensor_dev_attr_in3_input.dev_attr.attr,
	&sensor_dev_attr_in3_min.dev_attr.attr,
	&sensor_dev_attr_in3_max.dev_attr.attr,
1512
	&sensor_dev_attr_in3_alarm.dev_attr.attr,
1513 1514 1515 1516 1517
	NULL
}, {
	&sensor_dev_attr_in4_input.dev_attr.attr,
	&sensor_dev_attr_in4_min.dev_attr.attr,
	&sensor_dev_attr_in4_max.dev_attr.attr,
1518
	&sensor_dev_attr_in4_alarm.dev_attr.attr,
1519 1520 1521 1522 1523
	NULL
}, {
	&sensor_dev_attr_in5_input.dev_attr.attr,
	&sensor_dev_attr_in5_min.dev_attr.attr,
	&sensor_dev_attr_in5_max.dev_attr.attr,
1524
	&sensor_dev_attr_in5_alarm.dev_attr.attr,
1525 1526 1527 1528 1529
	NULL
}, {
	&sensor_dev_attr_in6_input.dev_attr.attr,
	&sensor_dev_attr_in6_min.dev_attr.attr,
	&sensor_dev_attr_in6_max.dev_attr.attr,
1530
	&sensor_dev_attr_in6_alarm.dev_attr.attr,
1531 1532 1533 1534 1535
	NULL
}, {
	&sensor_dev_attr_in7_input.dev_attr.attr,
	&sensor_dev_attr_in7_min.dev_attr.attr,
	&sensor_dev_attr_in7_max.dev_attr.attr,
1536
	&sensor_dev_attr_in7_alarm.dev_attr.attr,
1537 1538 1539 1540
	NULL
}, {
	&sensor_dev_attr_in8_input.dev_attr.attr,
	NULL
1541 1542 1543
}, {
	&sensor_dev_attr_in9_input.dev_attr.attr,
	NULL
1544
} };
1545

1546
static const struct attribute_group it87_group_in[10] = {
1547 1548 1549 1550 1551 1552 1553 1554 1555
	{ .attrs = it87_attributes_in[0] },
	{ .attrs = it87_attributes_in[1] },
	{ .attrs = it87_attributes_in[2] },
	{ .attrs = it87_attributes_in[3] },
	{ .attrs = it87_attributes_in[4] },
	{ .attrs = it87_attributes_in[5] },
	{ .attrs = it87_attributes_in[6] },
	{ .attrs = it87_attributes_in[7] },
	{ .attrs = it87_attributes_in[8] },
1556
	{ .attrs = it87_attributes_in[9] },
1557 1558
};

1559 1560
static struct attribute *it87_attributes_temp[3][6] = {
{
1561 1562 1563 1564
	&sensor_dev_attr_temp1_input.dev_attr.attr,
	&sensor_dev_attr_temp1_max.dev_attr.attr,
	&sensor_dev_attr_temp1_min.dev_attr.attr,
	&sensor_dev_attr_temp1_type.dev_attr.attr,
1565
	&sensor_dev_attr_temp1_alarm.dev_attr.attr,
1566 1567 1568 1569 1570 1571
	NULL
} , {
	&sensor_dev_attr_temp2_input.dev_attr.attr,
	&sensor_dev_attr_temp2_max.dev_attr.attr,
	&sensor_dev_attr_temp2_min.dev_attr.attr,
	&sensor_dev_attr_temp2_type.dev_attr.attr,
1572
	&sensor_dev_attr_temp2_alarm.dev_attr.attr,
1573 1574 1575 1576 1577 1578
	NULL
} , {
	&sensor_dev_attr_temp3_input.dev_attr.attr,
	&sensor_dev_attr_temp3_max.dev_attr.attr,
	&sensor_dev_attr_temp3_min.dev_attr.attr,
	&sensor_dev_attr_temp3_type.dev_attr.attr,
1579
	&sensor_dev_attr_temp3_alarm.dev_attr.attr,
1580 1581 1582 1583 1584 1585 1586 1587
	NULL
} };

static const struct attribute_group it87_group_temp[3] = {
	{ .attrs = it87_attributes_temp[0] },
	{ .attrs = it87_attributes_temp[1] },
	{ .attrs = it87_attributes_temp[2] },
};
1588

1589 1590 1591 1592 1593 1594
static struct attribute *it87_attributes_temp_offset[] = {
	&sensor_dev_attr_temp1_offset.dev_attr.attr,
	&sensor_dev_attr_temp2_offset.dev_attr.attr,
	&sensor_dev_attr_temp3_offset.dev_attr.attr,
};

1595
static struct attribute *it87_attributes[] = {
1596
	&dev_attr_alarms.attr,
1597
	&sensor_dev_attr_intrusion0_alarm.dev_attr.attr,
1598
	&dev_attr_name.attr,
1599 1600 1601 1602 1603 1604 1605
	NULL
};

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

1606
static struct attribute *it87_attributes_in_beep[] = {
1607 1608 1609 1610 1611 1612 1613 1614
	&sensor_dev_attr_in0_beep.dev_attr.attr,
	&sensor_dev_attr_in1_beep.dev_attr.attr,
	&sensor_dev_attr_in2_beep.dev_attr.attr,
	&sensor_dev_attr_in3_beep.dev_attr.attr,
	&sensor_dev_attr_in4_beep.dev_attr.attr,
	&sensor_dev_attr_in5_beep.dev_attr.attr,
	&sensor_dev_attr_in6_beep.dev_attr.attr,
	&sensor_dev_attr_in7_beep.dev_attr.attr,
1615 1616
	NULL,
	NULL,
1617
};
1618

1619
static struct attribute *it87_attributes_temp_beep[] = {
1620 1621 1622 1623 1624
	&sensor_dev_attr_temp1_beep.dev_attr.attr,
	&sensor_dev_attr_temp2_beep.dev_attr.attr,
	&sensor_dev_attr_temp3_beep.dev_attr.attr,
};

1625 1626 1627
static struct attribute *it87_attributes_fan[5][3+1] = { {
	&sensor_dev_attr_fan1_input.dev_attr.attr,
	&sensor_dev_attr_fan1_min.dev_attr.attr,
1628 1629 1630
	&sensor_dev_attr_fan1_alarm.dev_attr.attr,
	NULL
}, {
1631 1632
	&sensor_dev_attr_fan2_input.dev_attr.attr,
	&sensor_dev_attr_fan2_min.dev_attr.attr,
1633 1634 1635
	&sensor_dev_attr_fan2_alarm.dev_attr.attr,
	NULL
}, {
1636 1637
	&sensor_dev_attr_fan3_input.dev_attr.attr,
	&sensor_dev_attr_fan3_min.dev_attr.attr,
1638 1639 1640
	&sensor_dev_attr_fan3_alarm.dev_attr.attr,
	NULL
}, {
1641 1642
	&sensor_dev_attr_fan4_input.dev_attr.attr,
	&sensor_dev_attr_fan4_min.dev_attr.attr,
1643 1644 1645
	&sensor_dev_attr_fan4_alarm.dev_attr.attr,
	NULL
}, {
1646 1647
	&sensor_dev_attr_fan5_input.dev_attr.attr,
	&sensor_dev_attr_fan5_min.dev_attr.attr,
1648 1649 1650 1651
	&sensor_dev_attr_fan5_alarm.dev_attr.attr,
	NULL
} };

1652 1653 1654 1655 1656 1657
static const struct attribute_group it87_group_fan[5] = {
	{ .attrs = it87_attributes_fan[0] },
	{ .attrs = it87_attributes_fan[1] },
	{ .attrs = it87_attributes_fan[2] },
	{ .attrs = it87_attributes_fan[3] },
	{ .attrs = it87_attributes_fan[4] },
1658
};
1659

1660
static const struct attribute *it87_attributes_fan_div[] = {
1661 1662 1663
	&sensor_dev_attr_fan1_div.dev_attr.attr,
	&sensor_dev_attr_fan2_div.dev_attr.attr,
	&sensor_dev_attr_fan3_div.dev_attr.attr,
1664 1665 1666
};

static struct attribute *it87_attributes_pwm[3][4+1] = { {
1667 1668
	&sensor_dev_attr_pwm1_enable.dev_attr.attr,
	&sensor_dev_attr_pwm1.dev_attr.attr,
1669
	&dev_attr_pwm1_freq.attr,
1670
	&sensor_dev_attr_pwm1_auto_channels_temp.dev_attr.attr,
1671 1672 1673 1674 1675
	NULL
}, {
	&sensor_dev_attr_pwm2_enable.dev_attr.attr,
	&sensor_dev_attr_pwm2.dev_attr.attr,
	&dev_attr_pwm2_freq.attr,
1676
	&sensor_dev_attr_pwm2_auto_channels_temp.dev_attr.attr,
1677 1678 1679 1680 1681
	NULL
}, {
	&sensor_dev_attr_pwm3_enable.dev_attr.attr,
	&sensor_dev_attr_pwm3.dev_attr.attr,
	&dev_attr_pwm3_freq.attr,
1682
	&sensor_dev_attr_pwm3_auto_channels_temp.dev_attr.attr,
1683 1684
	NULL
} };
1685

1686 1687 1688 1689 1690 1691
static const struct attribute_group it87_group_pwm[3] = {
	{ .attrs = it87_attributes_pwm[0] },
	{ .attrs = it87_attributes_pwm[1] },
	{ .attrs = it87_attributes_pwm[2] },
};

1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732
static struct attribute *it87_attributes_autopwm[3][9+1] = { {
	&sensor_dev_attr_pwm1_auto_point1_pwm.dev_attr.attr,
	&sensor_dev_attr_pwm1_auto_point2_pwm.dev_attr.attr,
	&sensor_dev_attr_pwm1_auto_point3_pwm.dev_attr.attr,
	&sensor_dev_attr_pwm1_auto_point4_pwm.dev_attr.attr,
	&sensor_dev_attr_pwm1_auto_point1_temp.dev_attr.attr,
	&sensor_dev_attr_pwm1_auto_point1_temp_hyst.dev_attr.attr,
	&sensor_dev_attr_pwm1_auto_point2_temp.dev_attr.attr,
	&sensor_dev_attr_pwm1_auto_point3_temp.dev_attr.attr,
	&sensor_dev_attr_pwm1_auto_point4_temp.dev_attr.attr,
	NULL
}, {
	&sensor_dev_attr_pwm2_auto_point1_pwm.dev_attr.attr,
	&sensor_dev_attr_pwm2_auto_point2_pwm.dev_attr.attr,
	&sensor_dev_attr_pwm2_auto_point3_pwm.dev_attr.attr,
	&sensor_dev_attr_pwm2_auto_point4_pwm.dev_attr.attr,
	&sensor_dev_attr_pwm2_auto_point1_temp.dev_attr.attr,
	&sensor_dev_attr_pwm2_auto_point1_temp_hyst.dev_attr.attr,
	&sensor_dev_attr_pwm2_auto_point2_temp.dev_attr.attr,
	&sensor_dev_attr_pwm2_auto_point3_temp.dev_attr.attr,
	&sensor_dev_attr_pwm2_auto_point4_temp.dev_attr.attr,
	NULL
}, {
	&sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr,
	&sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr,
	&sensor_dev_attr_pwm3_auto_point3_pwm.dev_attr.attr,
	&sensor_dev_attr_pwm3_auto_point4_pwm.dev_attr.attr,
	&sensor_dev_attr_pwm3_auto_point1_temp.dev_attr.attr,
	&sensor_dev_attr_pwm3_auto_point1_temp_hyst.dev_attr.attr,
	&sensor_dev_attr_pwm3_auto_point2_temp.dev_attr.attr,
	&sensor_dev_attr_pwm3_auto_point3_temp.dev_attr.attr,
	&sensor_dev_attr_pwm3_auto_point4_temp.dev_attr.attr,
	NULL
} };

static const struct attribute_group it87_group_autopwm[3] = {
	{ .attrs = it87_attributes_autopwm[0] },
	{ .attrs = it87_attributes_autopwm[1] },
	{ .attrs = it87_attributes_autopwm[2] },
};

1733 1734 1735 1736 1737 1738 1739 1740
static struct attribute *it87_attributes_fan_beep[] = {
	&sensor_dev_attr_fan1_beep.dev_attr.attr,
	&sensor_dev_attr_fan2_beep.dev_attr.attr,
	&sensor_dev_attr_fan3_beep.dev_attr.attr,
	&sensor_dev_attr_fan4_beep.dev_attr.attr,
	&sensor_dev_attr_fan5_beep.dev_attr.attr,
};

1741
static struct attribute *it87_attributes_vid[] = {
1742 1743 1744 1745 1746
	&dev_attr_vrm.attr,
	&dev_attr_cpu0_vid.attr,
	NULL
};

1747 1748
static const struct attribute_group it87_group_vid = {
	.attrs = it87_attributes_vid,
1749
};
L
Linus Torvalds 已提交
1750

1751 1752 1753 1754
static struct attribute *it87_attributes_label[] = {
	&sensor_dev_attr_in3_label.dev_attr.attr,
	&sensor_dev_attr_in7_label.dev_attr.attr,
	&sensor_dev_attr_in8_label.dev_attr.attr,
1755
	&sensor_dev_attr_in9_label.dev_attr.attr,
1756 1757 1758 1759
	NULL
};

static const struct attribute_group it87_group_label = {
1760
	.attrs = it87_attributes_label,
1761 1762
};

1763
/* SuperIO detection - will change isa_address if a chip is found */
1764 1765
static int __init it87_find(unsigned short *address,
	struct it87_sio_data *sio_data)
L
Linus Torvalds 已提交
1766
{
1767
	int err;
1768
	u16 chip_type;
1769
	const char *board_vendor, *board_name;
L
Linus Torvalds 已提交
1770

1771 1772 1773 1774 1775
	err = superio_enter();
	if (err)
		return err;

	err = -ENODEV;
1776
	chip_type = force_id ? force_id : superio_inw(DEVID);
1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791

	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;
1792 1793 1794
	case IT8720F_DEVID:
		sio_data->type = it8720;
		break;
1795 1796 1797
	case IT8721F_DEVID:
		sio_data->type = it8721;
		break;
J
Jean Delvare 已提交
1798 1799 1800
	case IT8728F_DEVID:
		sio_data->type = it8728;
		break;
1801 1802 1803 1804 1805 1806
	case IT8771E_DEVID:
		sio_data->type = it8771;
		break;
	case IT8772E_DEVID:
		sio_data->type = it8772;
		break;
1807 1808 1809
	case IT8781F_DEVID:
		sio_data->type = it8781;
		break;
1810 1811 1812 1813 1814 1815
	case IT8782F_DEVID:
		sio_data->type = it8782;
		break;
	case IT8783E_DEVID:
		sio_data->type = it8783;
		break;
1816 1817 1818
	case IT8786E_DEVID:
		sio_data->type = it8786;
		break;
1819
	case IT8603E_DEVID:
1820
	case IT8623E_DEVID:
1821 1822
		sio_data->type = it8603;
		break;
1823 1824 1825
	case 0xffff:	/* No device at all */
		goto exit;
	default:
1826
		pr_debug("Unsupported chip (DEVID=0x%x)\n", chip_type);
1827 1828
		goto exit;
	}
L
Linus Torvalds 已提交
1829

J
Jean Delvare 已提交
1830
	superio_select(PME);
L
Linus Torvalds 已提交
1831
	if (!(superio_inb(IT87_ACT_REG) & 0x01)) {
1832
		pr_info("Device not activated, skipping\n");
L
Linus Torvalds 已提交
1833 1834 1835 1836 1837
		goto exit;
	}

	*address = superio_inw(IT87_BASE_REG) & ~(IT87_EXTENT - 1);
	if (*address == 0) {
1838
		pr_info("Base address not set, skipping\n");
L
Linus Torvalds 已提交
1839 1840 1841 1842
		goto exit;
	}

	err = 0;
1843
	sio_data->revision = superio_inb(DEVREV) & 0x0f;
1844
	pr_info("Found IT%04x%c chip at 0x%x, revision %d\n", chip_type,
1845
		chip_type == 0x8771 || chip_type == 0x8772 ||
1846 1847
		chip_type == 0x8786 || chip_type == 0x8603 ? 'E' : 'F',
		*address, sio_data->revision);
L
Linus Torvalds 已提交
1848

1849 1850
	/* in8 (Vbat) is always internal */
	sio_data->internal = (1 << 2);
1851 1852 1853
	/* Only the IT8603E has in9 */
	if (sio_data->type != it8603)
		sio_data->skip_in |= (1 << 9);
1854

1855
	if (!(it87_devices[sio_data->type].features & FEAT_VID))
1856
		sio_data->skip_vid = 1;
1857

1858 1859
	/* Read GPIO config and VID value from LDN 7 (GPIO) */
	if (sio_data->type == it87) {
1860 1861 1862
		/* The IT8705F has a different LD number for GPIO */
		superio_select(5);
		sio_data->beep_pin = superio_inb(IT87_SIO_BEEP_PIN_REG) & 0x3f;
1863
	} else if (sio_data->type == it8783) {
1864
		int reg25, reg27, reg2a, reg2c, regef;
1865 1866 1867 1868 1869

		superio_select(GPIO);

		reg25 = superio_inb(IT87_SIO_GPIO1_REG);
		reg27 = superio_inb(IT87_SIO_GPIO3_REG);
1870 1871 1872
		reg2a = superio_inb(IT87_SIO_PINX1_REG);
		reg2c = superio_inb(IT87_SIO_PINX2_REG);
		regef = superio_inb(IT87_SIO_SPI_REG);
1873 1874

		/* Check if fan3 is there or not */
1875
		if ((reg27 & (1 << 0)) || !(reg2c & (1 << 2)))
1876 1877
			sio_data->skip_fan |= (1 << 2);
		if ((reg25 & (1 << 4))
1878
		    || (!(reg2a & (1 << 1)) && (regef & (1 << 0))))
1879 1880 1881 1882 1883 1884 1885 1886 1887
			sio_data->skip_pwm |= (1 << 2);

		/* Check if fan2 is there or not */
		if (reg27 & (1 << 7))
			sio_data->skip_fan |= (1 << 1);
		if (reg27 & (1 << 3))
			sio_data->skip_pwm |= (1 << 1);

		/* VIN5 */
1888
		if ((reg27 & (1 << 0)) || (reg2c & (1 << 2)))
1889
			sio_data->skip_in |= (1 << 5); /* No VIN5 */
1890 1891

		/* VIN6 */
1892 1893
		if (reg27 & (1 << 1))
			sio_data->skip_in |= (1 << 6); /* No VIN6 */
1894 1895 1896 1897 1898

		/*
		 * VIN7
		 * Does not depend on bit 2 of Reg2C, contrary to datasheet.
		 */
1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912
		if (reg27 & (1 << 2)) {
			/*
			 * The data sheet is a bit unclear regarding the
			 * internal voltage divider for VCCH5V. It says
			 * "This bit enables and switches VIN7 (pin 91) to the
			 * internal voltage divider for VCCH5V".
			 * This is different to other chips, where the internal
			 * voltage divider would connect VIN7 to an internal
			 * voltage source. Maybe that is the case here as well.
			 *
			 * Since we don't know for sure, re-route it if that is
			 * not the case, and ask the user to report if the
			 * resulting voltage is sane.
			 */
1913 1914 1915
			if (!(reg2c & (1 << 1))) {
				reg2c |= (1 << 1);
				superio_outb(IT87_SIO_PINX2_REG, reg2c);
1916 1917 1918 1919 1920
				pr_notice("Routing internal VCCH5V to in7.\n");
			}
			pr_notice("in7 routed to internal voltage divider, with external pin disabled.\n");
			pr_notice("Please report if it displays a reasonable voltage.\n");
		}
1921

1922
		if (reg2c & (1 << 0))
1923
			sio_data->internal |= (1 << 0);
1924
		if (reg2c & (1 << 1))
1925 1926 1927
			sio_data->internal |= (1 << 1);

		sio_data->beep_pin = superio_inb(IT87_SIO_BEEP_PIN_REG) & 0x3f;
1928 1929 1930 1931
	} else if (sio_data->type == it8603) {
		int reg27, reg29;

		superio_select(GPIO);
1932

1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954
		reg27 = superio_inb(IT87_SIO_GPIO3_REG);

		/* Check if fan3 is there or not */
		if (reg27 & (1 << 6))
			sio_data->skip_pwm |= (1 << 2);
		if (reg27 & (1 << 7))
			sio_data->skip_fan |= (1 << 2);

		/* Check if fan2 is there or not */
		reg29 = superio_inb(IT87_SIO_GPIO5_REG);
		if (reg29 & (1 << 1))
			sio_data->skip_pwm |= (1 << 1);
		if (reg29 & (1 << 2))
			sio_data->skip_fan |= (1 << 1);

		sio_data->skip_in |= (1 << 5); /* No VIN5 */
		sio_data->skip_in |= (1 << 6); /* No VIN6 */

		sio_data->internal |= (1 << 1); /* in7 is VSB */
		sio_data->internal |= (1 << 3); /* in9 is AVCC */

		sio_data->beep_pin = superio_inb(IT87_SIO_BEEP_PIN_REG) & 0x3f;
1955
	} else {
J
Jean Delvare 已提交
1956
		int reg;
1957
		bool uart6;
J
Jean Delvare 已提交
1958 1959

		superio_select(GPIO);
1960

1961
		reg = superio_inb(IT87_SIO_GPIO3_REG);
1962
		if (!sio_data->skip_vid) {
1963 1964
			/* We need at least 4 VID pins */
			if (reg & 0x0f) {
1965
				pr_info("VID is disabled (pins used for GPIO)\n");
1966 1967
				sio_data->skip_vid = 1;
			}
1968 1969
		}

1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982
		/* Check if fan3 is there or not */
		if (reg & (1 << 6))
			sio_data->skip_pwm |= (1 << 2);
		if (reg & (1 << 7))
			sio_data->skip_fan |= (1 << 2);

		/* Check if fan2 is there or not */
		reg = superio_inb(IT87_SIO_GPIO5_REG);
		if (reg & (1 << 1))
			sio_data->skip_pwm |= (1 << 1);
		if (reg & (1 << 2))
			sio_data->skip_fan |= (1 << 1);

1983 1984
		if ((sio_data->type == it8718 || sio_data->type == it8720)
		 && !(sio_data->skip_vid))
1985
			sio_data->vid_value = superio_inb(IT87_SIO_VID_REG);
J
Jean Delvare 已提交
1986 1987

		reg = superio_inb(IT87_SIO_PINX2_REG);
1988 1989 1990

		uart6 = sio_data->type == it8782 && (reg & (1 << 2));

J
Jean Delvare 已提交
1991 1992 1993 1994 1995 1996 1997 1998 1999
		/*
		 * The IT8720F has no VIN7 pin, so VCCH should always be
		 * routed internally to VIN7 with an internal divider.
		 * Curiously, there still is a configuration bit to control
		 * this, which means it can be set incorrectly. And even
		 * more curiously, many boards out there are improperly
		 * configured, even though the IT8720F datasheet claims
		 * that the internal routing of VCCH to VIN7 is the default
		 * setting. So we force the internal routing in this case.
2000 2001
		 *
		 * On IT8782F, VIN7 is multiplexed with one of the UART6 pins.
2002 2003
		 * If UART6 is enabled, re-route VIN7 to the internal divider
		 * if that is not already the case.
J
Jean Delvare 已提交
2004
		 */
2005
		if ((sio_data->type == it8720 || uart6) && !(reg & (1 << 1))) {
J
Jean Delvare 已提交
2006 2007
			reg |= (1 << 1);
			superio_outb(IT87_SIO_PINX2_REG, reg);
2008
			pr_notice("Routing internal VCCH to in7\n");
J
Jean Delvare 已提交
2009
		}
J
Jean Delvare 已提交
2010
		if (reg & (1 << 0))
2011
			sio_data->internal |= (1 << 0);
J
Jean Delvare 已提交
2012
		if ((reg & (1 << 1)) || sio_data->type == it8721 ||
2013 2014
		    sio_data->type == it8728 || sio_data->type == it8771 ||
		    sio_data->type == it8772 || sio_data->type == it8786)
2015
			sio_data->internal |= (1 << 1);
2016

2017 2018 2019 2020
		/*
		 * On IT8782F, UART6 pins overlap with VIN5, VIN6, and VIN7.
		 * While VIN7 can be routed to the internal voltage divider,
		 * VIN5 and VIN6 are not available if UART6 is enabled.
2021 2022 2023 2024
		 *
		 * Also, temp3 is not available if UART6 is enabled and TEMPIN3
		 * is the temperature source. Since we can not read the
		 * temperature source here, skip_temp is preliminary.
2025
		 */
2026
		if (uart6) {
2027
			sio_data->skip_in |= (1 << 5) | (1 << 6);
2028 2029
			sio_data->skip_temp |= (1 << 2);
		}
2030

2031
		sio_data->beep_pin = superio_inb(IT87_SIO_BEEP_PIN_REG) & 0x3f;
J
Jean Delvare 已提交
2032
	}
2033
	if (sio_data->beep_pin)
2034
		pr_info("Beeping is supported\n");
J
Jean Delvare 已提交
2035

2036 2037 2038 2039 2040 2041
	/* 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) {
2042 2043 2044 2045 2046 2047 2048 2049
			/*
			 * 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.
			 */
2050
			pr_info("Disabling pwm2 due to hardware constraints\n");
2051 2052 2053 2054
			sio_data->skip_pwm = (1 << 1);
		}
	}

L
Linus Torvalds 已提交
2055 2056 2057 2058 2059
exit:
	superio_exit();
	return err;
}

2060 2061 2062
static void it87_remove_files(struct device *dev)
{
	struct it87_data *data = platform_get_drvdata(pdev);
J
Jingoo Han 已提交
2063
	struct it87_sio_data *sio_data = dev_get_platdata(dev);
2064 2065 2066
	int i;

	sysfs_remove_group(&dev->kobj, &it87_group);
2067
	for (i = 0; i < 10; i++) {
2068 2069 2070 2071 2072 2073 2074
		if (sio_data->skip_in & (1 << i))
			continue;
		sysfs_remove_group(&dev->kobj, &it87_group_in[i]);
		if (it87_attributes_in_beep[i])
			sysfs_remove_file(&dev->kobj,
					  it87_attributes_in_beep[i]);
	}
2075 2076 2077 2078
	for (i = 0; i < 3; i++) {
		if (!(data->has_temp & (1 << i)))
			continue;
		sysfs_remove_group(&dev->kobj, &it87_group_temp[i]);
2079 2080 2081
		if (has_temp_offset(data))
			sysfs_remove_file(&dev->kobj,
					  it87_attributes_temp_offset[i]);
2082 2083 2084 2085
		if (sio_data->beep_pin)
			sysfs_remove_file(&dev->kobj,
					  it87_attributes_temp_beep[i]);
	}
2086 2087 2088
	for (i = 0; i < 5; i++) {
		if (!(data->has_fan & (1 << i)))
			continue;
2089
		sysfs_remove_group(&dev->kobj, &it87_group_fan[i]);
2090 2091 2092
		if (sio_data->beep_pin)
			sysfs_remove_file(&dev->kobj,
					  it87_attributes_fan_beep[i]);
2093 2094 2095
		if (i < 3 && !has_16bit_fans(data))
			sysfs_remove_file(&dev->kobj,
					  it87_attributes_fan_div[i]);
2096 2097
	}
	for (i = 0; i < 3; i++) {
2098
		if (sio_data->skip_pwm & (1 << i))
2099 2100
			continue;
		sysfs_remove_group(&dev->kobj, &it87_group_pwm[i]);
2101 2102 2103
		if (has_old_autopwm(data))
			sysfs_remove_group(&dev->kobj,
					   &it87_group_autopwm[i]);
2104
	}
2105 2106
	if (!sio_data->skip_vid)
		sysfs_remove_group(&dev->kobj, &it87_group_vid);
2107
	sysfs_remove_group(&dev->kobj, &it87_group_label);
2108 2109
}

B
Bill Pemberton 已提交
2110
static int it87_probe(struct platform_device *pdev)
L
Linus Torvalds 已提交
2111 2112
{
	struct it87_data *data;
2113 2114
	struct resource *res;
	struct device *dev = &pdev->dev;
J
Jingoo Han 已提交
2115
	struct it87_sio_data *sio_data = dev_get_platdata(dev);
2116
	int err = 0, i;
L
Linus Torvalds 已提交
2117
	int enable_pwm_interface;
2118
	int fan_beep_need_rw;
2119 2120

	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
2121 2122
	if (!devm_request_region(&pdev->dev, res->start, IT87_EC_EXTENT,
				 DRVNAME)) {
2123 2124
		dev_err(dev, "Failed to request region 0x%lx-0x%lx\n",
			(unsigned long)res->start,
2125
			(unsigned long)(res->start + IT87_EC_EXTENT - 1));
2126
		return -EBUSY;
2127
	}
L
Linus Torvalds 已提交
2128

2129 2130 2131
	data = devm_kzalloc(&pdev->dev, sizeof(struct it87_data), GFP_KERNEL);
	if (!data)
		return -ENOMEM;
L
Linus Torvalds 已提交
2132

2133 2134
	data->addr = res->start;
	data->type = sio_data->type;
2135
	data->features = it87_devices[sio_data->type].features;
2136
	data->peci_mask = it87_devices[sio_data->type].peci_mask;
2137
	data->old_peci_mask = it87_devices[sio_data->type].old_peci_mask;
2138 2139 2140 2141 2142 2143 2144 2145 2146 2147
	data->name = it87_devices[sio_data->type].name;
	/*
	 * IT8705F Datasheet 0.4.1, 3h == Version G.
	 * IT8712F Datasheet 0.9.1, section 8.3.5 indicates 8h == Version J.
	 * These are the first revisions with 16-bit tachometer support.
	 */
	switch (data->type) {
	case it87:
		if (sio_data->revision >= 0x03) {
			data->features &= ~FEAT_OLD_AUTOPWM;
2148
			data->features |= FEAT_FAN16_CONFIG | FEAT_16BIT_FANS;
2149 2150 2151 2152 2153
		}
		break;
	case it8712:
		if (sio_data->revision >= 0x08) {
			data->features &= ~FEAT_OLD_AUTOPWM;
2154 2155
			data->features |= FEAT_FAN16_CONFIG | FEAT_16BIT_FANS |
					  FEAT_FIVE_FANS;
2156 2157 2158 2159 2160
		}
		break;
	default:
		break;
	}
L
Linus Torvalds 已提交
2161 2162

	/* Now, we do the remaining detection. */
2163
	if ((it87_read_value(data, IT87_REG_CONFIG) & 0x80)
2164 2165
	 || it87_read_value(data, IT87_REG_CHIPID) != 0x90)
		return -ENODEV;
L
Linus Torvalds 已提交
2166

2167
	platform_set_drvdata(pdev, data);
L
Linus Torvalds 已提交
2168

2169
	mutex_init(&data->update_lock);
L
Linus Torvalds 已提交
2170 2171

	/* Check PWM configuration */
2172
	enable_pwm_interface = it87_check_pwm(dev);
L
Linus Torvalds 已提交
2173

2174
	/* Starting with IT8721F, we handle scaling of internal voltages */
J
Jean Delvare 已提交
2175
	if (has_12mv_adc(data)) {
2176 2177 2178 2179 2180 2181
		if (sio_data->internal & (1 << 0))
			data->in_scaled |= (1 << 3);	/* in3 is AVCC */
		if (sio_data->internal & (1 << 1))
			data->in_scaled |= (1 << 7);	/* in7 is VSB */
		if (sio_data->internal & (1 << 2))
			data->in_scaled |= (1 << 8);	/* in8 is Vbat */
2182 2183
		if (sio_data->internal & (1 << 3))
			data->in_scaled |= (1 << 9);	/* in9 is AVCC */
2184 2185
	} else if (sio_data->type == it8781 || sio_data->type == it8782 ||
		   sio_data->type == it8783) {
2186 2187 2188 2189
		if (sio_data->internal & (1 << 0))
			data->in_scaled |= (1 << 3);	/* in3 is VCC5V */
		if (sio_data->internal & (1 << 1))
			data->in_scaled |= (1 << 7);	/* in7 is VCCH5V */
2190 2191
	}

2192 2193 2194 2195 2196 2197 2198
	data->has_temp = 0x07;
	if (sio_data->skip_temp & (1 << 2)) {
		if (sio_data->type == it8782
		    && !(it87_read_value(data, IT87_REG_TEMP_EXTRA) & 0x80))
			data->has_temp &= ~(1 << 2);
	}

L
Linus Torvalds 已提交
2199
	/* Initialize the IT87 chip */
2200
	it87_init_device(pdev);
L
Linus Torvalds 已提交
2201 2202

	/* Register sysfs hooks */
2203 2204
	err = sysfs_create_group(&dev->kobj, &it87_group);
	if (err)
2205
		return err;
J
Jean Delvare 已提交
2206

2207
	for (i = 0; i < 10; i++) {
2208 2209 2210 2211
		if (sio_data->skip_in & (1 << i))
			continue;
		err = sysfs_create_group(&dev->kobj, &it87_group_in[i]);
		if (err)
2212
			goto error;
2213 2214 2215 2216
		if (sio_data->beep_pin && it87_attributes_in_beep[i]) {
			err = sysfs_create_file(&dev->kobj,
						it87_attributes_in_beep[i]);
			if (err)
2217
				goto error;
2218 2219 2220
		}
	}

2221 2222 2223 2224
	for (i = 0; i < 3; i++) {
		if (!(data->has_temp & (1 << i)))
			continue;
		err = sysfs_create_group(&dev->kobj, &it87_group_temp[i]);
2225
		if (err)
2226
			goto error;
2227 2228 2229 2230 2231 2232
		if (has_temp_offset(data)) {
			err = sysfs_create_file(&dev->kobj,
						it87_attributes_temp_offset[i]);
			if (err)
				goto error;
		}
2233 2234 2235 2236 2237 2238
		if (sio_data->beep_pin) {
			err = sysfs_create_file(&dev->kobj,
						it87_attributes_temp_beep[i]);
			if (err)
				goto error;
		}
2239 2240
	}

2241
	/* Do not create fan files for disabled fans */
2242
	fan_beep_need_rw = 1;
2243 2244 2245
	for (i = 0; i < 5; i++) {
		if (!(data->has_fan & (1 << i)))
			continue;
2246
		err = sysfs_create_group(&dev->kobj, &it87_group_fan[i]);
2247
		if (err)
2248
			goto error;
2249

2250 2251 2252 2253 2254 2255 2256
		if (i < 3 && !has_16bit_fans(data)) {
			err = sysfs_create_file(&dev->kobj,
						it87_attributes_fan_div[i]);
			if (err)
				goto error;
		}

2257 2258 2259 2260
		if (sio_data->beep_pin) {
			err = sysfs_create_file(&dev->kobj,
						it87_attributes_fan_beep[i]);
			if (err)
2261
				goto error;
2262 2263 2264
			if (!fan_beep_need_rw)
				continue;

2265 2266
			/*
			 * As we have a single beep enable bit for all fans,
2267
			 * only the first enabled fan has a writable attribute
2268 2269
			 * for it.
			 */
2270 2271 2272 2273 2274 2275 2276
			if (sysfs_chmod_file(&dev->kobj,
					     it87_attributes_fan_beep[i],
					     S_IRUGO | S_IWUSR))
				dev_dbg(dev, "chmod +w fan%d_beep failed\n",
					i + 1);
			fan_beep_need_rw = 0;
		}
J
Jean Delvare 已提交
2277 2278
	}

L
Linus Torvalds 已提交
2279
	if (enable_pwm_interface) {
2280 2281 2282 2283 2284 2285
		for (i = 0; i < 3; i++) {
			if (sio_data->skip_pwm & (1 << i))
				continue;
			err = sysfs_create_group(&dev->kobj,
						 &it87_group_pwm[i]);
			if (err)
2286
				goto error;
2287 2288 2289 2290 2291 2292

			if (!has_old_autopwm(data))
				continue;
			err = sysfs_create_group(&dev->kobj,
						 &it87_group_autopwm[i]);
			if (err)
2293
				goto error;
2294
		}
L
Linus Torvalds 已提交
2295 2296
	}

2297
	if (!sio_data->skip_vid) {
2298
		data->vrm = vid_which_vrm();
J
Jean Delvare 已提交
2299
		/* VID reading from Super-I/O config space if available */
2300
		data->vid = sio_data->vid_value;
2301 2302
		err = sysfs_create_group(&dev->kobj, &it87_group_vid);
		if (err)
2303
			goto error;
2304 2305
	}

2306
	/* Export labels for internal sensors */
2307
	for (i = 0; i < 4; i++) {
2308 2309 2310 2311 2312
		if (!(sio_data->internal & (1 << i)))
			continue;
		err = sysfs_create_file(&dev->kobj,
					it87_attributes_label[i]);
		if (err)
2313
			goto error;
2314 2315
	}

2316 2317 2318
	data->hwmon_dev = hwmon_device_register(dev);
	if (IS_ERR(data->hwmon_dev)) {
		err = PTR_ERR(data->hwmon_dev);
2319
		goto error;
L
Linus Torvalds 已提交
2320 2321 2322 2323
	}

	return 0;

2324
error:
2325
	it87_remove_files(dev);
L
Linus Torvalds 已提交
2326 2327 2328
	return err;
}

B
Bill Pemberton 已提交
2329
static int it87_remove(struct platform_device *pdev)
L
Linus Torvalds 已提交
2330
{
2331
	struct it87_data *data = platform_get_drvdata(pdev);
L
Linus Torvalds 已提交
2332

2333
	hwmon_device_unregister(data->hwmon_dev);
2334
	it87_remove_files(&pdev->dev);
2335

L
Linus Torvalds 已提交
2336 2337 2338
	return 0;
}

2339 2340 2341 2342 2343
/*
 * Must be called with data->update_lock held, except during initialization.
 * 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.
 */
2344
static int it87_read_value(struct it87_data *data, u8 reg)
L
Linus Torvalds 已提交
2345
{
2346 2347
	outb_p(reg, data->addr + IT87_ADDR_REG_OFFSET);
	return inb_p(data->addr + IT87_DATA_REG_OFFSET);
L
Linus Torvalds 已提交
2348 2349
}

2350 2351 2352 2353 2354
/*
 * Must be called with data->update_lock held, except during initialization.
 * 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.
 */
2355
static void it87_write_value(struct it87_data *data, u8 reg, u8 value)
L
Linus Torvalds 已提交
2356
{
2357 2358
	outb_p(reg, data->addr + IT87_ADDR_REG_OFFSET);
	outb_p(value, data->addr + IT87_DATA_REG_OFFSET);
L
Linus Torvalds 已提交
2359 2360 2361
}

/* Return 1 if and only if the PWM interface is safe to use */
B
Bill Pemberton 已提交
2362
static int it87_check_pwm(struct device *dev)
L
Linus Torvalds 已提交
2363
{
2364
	struct it87_data *data = dev_get_drvdata(dev);
2365 2366
	/*
	 * Some BIOSes fail to correctly configure the IT87 fans. All fans off
L
Linus Torvalds 已提交
2367
	 * and polarity set to active low is sign that this is the case so we
2368 2369
	 * disable pwm control to protect the user.
	 */
2370
	int tmp = it87_read_value(data, IT87_REG_FAN_CTL);
L
Linus Torvalds 已提交
2371 2372
	if ((tmp & 0x87) == 0) {
		if (fix_pwm_polarity) {
2373 2374
			/*
			 * The user asks us to attempt a chip reconfiguration.
L
Linus Torvalds 已提交
2375
			 * This means switching to active high polarity and
2376 2377
			 * inverting all fan speed values.
			 */
L
Linus Torvalds 已提交
2378 2379 2380 2381
			int i;
			u8 pwm[3];

			for (i = 0; i < 3; i++)
2382
				pwm[i] = it87_read_value(data,
L
Linus Torvalds 已提交
2383 2384
							 IT87_REG_PWM(i));

2385 2386
			/*
			 * If any fan is in automatic pwm mode, the polarity
L
Linus Torvalds 已提交
2387 2388
			 * might be correct, as suspicious as it seems, so we
			 * better don't change anything (but still disable the
2389 2390
			 * PWM interface).
			 */
L
Linus Torvalds 已提交
2391
			if (!((pwm[0] | pwm[1] | pwm[2]) & 0x80)) {
2392 2393
				dev_info(dev,
					 "Reconfiguring PWM to active high polarity\n");
2394
				it87_write_value(data, IT87_REG_FAN_CTL,
L
Linus Torvalds 已提交
2395 2396
						 tmp | 0x87);
				for (i = 0; i < 3; i++)
2397
					it87_write_value(data,
L
Linus Torvalds 已提交
2398 2399 2400 2401 2402
							 IT87_REG_PWM(i),
							 0x7f & ~pwm[i]);
				return 1;
			}

2403 2404
			dev_info(dev,
				 "PWM configuration is too broken to be fixed\n");
L
Linus Torvalds 已提交
2405 2406
		}

2407 2408
		dev_info(dev,
			 "Detected broken BIOS defaults, disabling PWM interface\n");
L
Linus Torvalds 已提交
2409 2410
		return 0;
	} else if (fix_pwm_polarity) {
2411 2412
		dev_info(dev,
			 "PWM configuration looks sane, won't touch\n");
L
Linus Torvalds 已提交
2413 2414 2415 2416 2417 2418
	}

	return 1;
}

/* Called when we have found a new IT87. */
B
Bill Pemberton 已提交
2419
static void it87_init_device(struct platform_device *pdev)
L
Linus Torvalds 已提交
2420
{
J
Jingoo Han 已提交
2421
	struct it87_sio_data *sio_data = dev_get_platdata(&pdev->dev);
2422
	struct it87_data *data = platform_get_drvdata(pdev);
L
Linus Torvalds 已提交
2423
	int tmp, i;
2424
	u8 mask;
L
Linus Torvalds 已提交
2425

2426 2427
	/*
	 * For each PWM channel:
2428 2429 2430 2431 2432 2433
	 * - If it is in automatic mode, setting to manual mode should set
	 *   the fan to full speed by default.
	 * - If it is in manual mode, we need a mapping to temperature
	 *   channels to use when later setting to automatic mode later.
	 *   Use a 1:1 mapping by default (we are clueless.)
	 * In both cases, the value can (and should) be changed by the user
2434 2435 2436
	 * prior to switching to a different mode.
	 * Note that this is no longer needed for the IT8721F and later, as
	 * these have separate registers for the temperature mapping and the
2437 2438
	 * manual duty cycle.
	 */
L
Linus Torvalds 已提交
2439
	for (i = 0; i < 3; i++) {
2440 2441
		data->pwm_temp_map[i] = i;
		data->pwm_duty[i] = 0x7f;	/* Full speed */
2442
		data->auto_pwm[i][3] = 0x7f;	/* Full speed, hard-coded */
L
Linus Torvalds 已提交
2443 2444
	}

2445 2446
	/*
	 * Some chips seem to have default value 0xff for all limit
2447 2448 2449
	 * 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,
2450 2451
	 * but is still confusing, so change to 127 degrees C.
	 */
2452
	for (i = 0; i < 8; i++) {
2453
		tmp = it87_read_value(data, IT87_REG_VIN_MIN(i));
2454
		if (tmp == 0xff)
2455
			it87_write_value(data, IT87_REG_VIN_MIN(i), 0);
2456 2457
	}
	for (i = 0; i < 3; i++) {
2458
		tmp = it87_read_value(data, IT87_REG_TEMP_HIGH(i));
2459
		if (tmp == 0xff)
2460
			it87_write_value(data, IT87_REG_TEMP_HIGH(i), 127);
2461 2462
	}

2463 2464
	/*
	 * Temperature channels are not forcibly enabled, as they can be
2465 2466
	 * set to two different sensor types and we can't guess which one
	 * is correct for a given system. These channels can be enabled at
2467 2468
	 * run-time through the temp{1-3}_type sysfs accessors if needed.
	 */
L
Linus Torvalds 已提交
2469 2470

	/* Check if voltage monitors are reset manually or by some reason */
2471
	tmp = it87_read_value(data, IT87_REG_VIN_ENABLE);
L
Linus Torvalds 已提交
2472 2473
	if ((tmp & 0xff) == 0) {
		/* Enable all voltage monitors */
2474
		it87_write_value(data, IT87_REG_VIN_ENABLE, 0xff);
L
Linus Torvalds 已提交
2475 2476 2477
	}

	/* Check if tachometers are reset manually or by some reason */
2478
	mask = 0x70 & ~(sio_data->skip_fan << 4);
2479
	data->fan_main_ctrl = it87_read_value(data, IT87_REG_FAN_MAIN_CTRL);
2480
	if ((data->fan_main_ctrl & mask) == 0) {
L
Linus Torvalds 已提交
2481
		/* Enable all fan tachometers */
2482
		data->fan_main_ctrl |= mask;
2483 2484
		it87_write_value(data, IT87_REG_FAN_MAIN_CTRL,
				 data->fan_main_ctrl);
L
Linus Torvalds 已提交
2485
	}
2486
	data->has_fan = (data->fan_main_ctrl >> 4) & 0x07;
L
Linus Torvalds 已提交
2487

2488 2489
	/* Set tachometers to 16-bit mode if needed */
	if (has_fan16_config(data)) {
2490
		tmp = it87_read_value(data, IT87_REG_FAN_16BIT);
2491
		if (~tmp & 0x07 & data->has_fan) {
2492
			dev_dbg(&pdev->dev,
J
Jean Delvare 已提交
2493
				"Setting fan1-3 to 16-bit mode\n");
2494
			it87_write_value(data, IT87_REG_FAN_16BIT,
J
Jean Delvare 已提交
2495 2496
					 tmp | 0x07);
		}
2497 2498 2499 2500 2501 2502 2503 2504 2505
	}

	/* Check for additional fans */
	if (has_five_fans(data)) {
		tmp = it87_read_value(data, IT87_REG_FAN_16BIT);
		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 已提交
2506 2507
	}

2508 2509 2510
	/* Fan input pins may be used for alternative functions */
	data->has_fan &= ~sio_data->skip_fan;

L
Linus Torvalds 已提交
2511
	/* Start monitoring */
2512
	it87_write_value(data, IT87_REG_CONFIG,
2513
			 (it87_read_value(data, IT87_REG_CONFIG) & 0x3e)
L
Linus Torvalds 已提交
2514 2515 2516
			 | (update_vbat ? 0x41 : 0x01));
}

2517 2518 2519
static void it87_update_pwm_ctrl(struct it87_data *data, int nr)
{
	data->pwm_ctrl[nr] = it87_read_value(data, IT87_REG_PWM(nr));
J
Jean Delvare 已提交
2520
	if (has_newer_autopwm(data)) {
2521
		data->pwm_temp_map[nr] = data->pwm_ctrl[nr] & 0x03;
2522 2523 2524 2525 2526 2527 2528 2529
		data->pwm_duty[nr] = it87_read_value(data,
						     IT87_REG_PWM_DUTY(nr));
	} else {
		if (data->pwm_ctrl[nr] & 0x80)	/* Automatic mode */
			data->pwm_temp_map[nr] = data->pwm_ctrl[nr] & 0x03;
		else				/* Manual mode */
			data->pwm_duty[nr] = data->pwm_ctrl[nr] & 0x7f;
	}
2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540

	if (has_old_autopwm(data)) {
		int i;

		for (i = 0; i < 5 ; i++)
			data->auto_temp[nr][i] = it87_read_value(data,
						IT87_REG_AUTO_TEMP(nr, i));
		for (i = 0; i < 3 ; i++)
			data->auto_pwm[nr][i] = it87_read_value(data,
						IT87_REG_AUTO_PWM(nr, i));
	}
2541 2542
}

L
Linus Torvalds 已提交
2543 2544
static struct it87_data *it87_update_device(struct device *dev)
{
2545
	struct it87_data *data = dev_get_drvdata(dev);
L
Linus Torvalds 已提交
2546 2547
	int i;

2548
	mutex_lock(&data->update_lock);
L
Linus Torvalds 已提交
2549 2550 2551 2552

	if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
	    || !data->valid) {
		if (update_vbat) {
2553 2554 2555 2556
			/*
			 * Cleared after each update, so reenable.  Value
			 * returned by this read will be previous value
			 */
2557
			it87_write_value(data, IT87_REG_CONFIG,
2558
				it87_read_value(data, IT87_REG_CONFIG) | 0x40);
L
Linus Torvalds 已提交
2559 2560
		}
		for (i = 0; i <= 7; i++) {
2561
			data->in[i][0] =
2562
				it87_read_value(data, IT87_REG_VIN(i));
2563
			data->in[i][1] =
2564
				it87_read_value(data, IT87_REG_VIN_MIN(i));
2565
			data->in[i][2] =
2566
				it87_read_value(data, IT87_REG_VIN_MAX(i));
L
Linus Torvalds 已提交
2567
		}
J
Jean Delvare 已提交
2568
		/* in8 (battery) has no limit registers */
2569
		data->in[8][0] = it87_read_value(data, IT87_REG_VIN(8));
2570 2571
		if (data->type == it8603)
			data->in[9][0] = it87_read_value(data, 0x2f);
L
Linus Torvalds 已提交
2572

2573
		for (i = 0; i < 5; i++) {
2574 2575 2576 2577
			/* Skip disabled fans */
			if (!(data->has_fan & (1 << i)))
				continue;

2578
			data->fan[i][1] =
2579
				it87_read_value(data, IT87_REG_FAN_MIN[i]);
2580
			data->fan[i][0] = it87_read_value(data,
2581
				       IT87_REG_FAN[i]);
J
Jean Delvare 已提交
2582
			/* Add high byte if in 16-bit mode */
2583
			if (has_16bit_fans(data)) {
2584
				data->fan[i][0] |= it87_read_value(data,
2585
						IT87_REG_FANX[i]) << 8;
2586
				data->fan[i][1] |= it87_read_value(data,
2587
						IT87_REG_FANX_MIN[i]) << 8;
J
Jean Delvare 已提交
2588
			}
L
Linus Torvalds 已提交
2589 2590
		}
		for (i = 0; i < 3; i++) {
2591 2592
			if (!(data->has_temp & (1 << i)))
				continue;
2593
			data->temp[i][0] =
2594
				it87_read_value(data, IT87_REG_TEMP(i));
2595
			data->temp[i][1] =
2596
				it87_read_value(data, IT87_REG_TEMP_LOW(i));
2597 2598
			data->temp[i][2] =
				it87_read_value(data, IT87_REG_TEMP_HIGH(i));
2599 2600 2601 2602
			if (has_temp_offset(data))
				data->temp[i][3] =
				  it87_read_value(data,
						  IT87_REG_TEMP_OFFSET[i]);
L
Linus Torvalds 已提交
2603 2604
		}

J
Jean Delvare 已提交
2605
		/* Newer chips don't have clock dividers */
2606
		if ((data->has_fan & 0x07) && !has_16bit_fans(data)) {
2607
			i = it87_read_value(data, IT87_REG_FAN_DIV);
J
Jean Delvare 已提交
2608 2609 2610 2611
			data->fan_div[0] = i & 0x07;
			data->fan_div[1] = (i >> 3) & 0x07;
			data->fan_div[2] = (i & 0x40) ? 3 : 1;
		}
L
Linus Torvalds 已提交
2612 2613

		data->alarms =
2614 2615 2616
			it87_read_value(data, IT87_REG_ALARM1) |
			(it87_read_value(data, IT87_REG_ALARM2) << 8) |
			(it87_read_value(data, IT87_REG_ALARM3) << 16);
2617
		data->beeps = it87_read_value(data, IT87_REG_BEEP_ENABLE);
2618

2619 2620 2621
		data->fan_main_ctrl = it87_read_value(data,
				IT87_REG_FAN_MAIN_CTRL);
		data->fan_ctl = it87_read_value(data, IT87_REG_FAN_CTL);
2622 2623
		for (i = 0; i < 3; i++)
			it87_update_pwm_ctrl(data, i);
2624 2625

		data->sensor = it87_read_value(data, IT87_REG_TEMP_ENABLE);
2626
		data->extra = it87_read_value(data, IT87_REG_TEMP_EXTRA);
2627 2628 2629 2630 2631
		/*
		 * The IT8705F does not have VID capability.
		 * The IT8718F and later don't use IT87_REG_VID for the
		 * same purpose.
		 */
J
Jean Delvare 已提交
2632
		if (data->type == it8712 || data->type == it8716) {
2633
			data->vid = it87_read_value(data, IT87_REG_VID);
2634 2635 2636 2637
			/*
			 * The older IT8712F revisions had only 5 VID pins,
			 * but we assume it is always safe to read 6 bits.
			 */
J
Jean Delvare 已提交
2638
			data->vid &= 0x3f;
L
Linus Torvalds 已提交
2639 2640 2641 2642 2643
		}
		data->last_updated = jiffies;
		data->valid = 1;
	}

2644
	mutex_unlock(&data->update_lock);
L
Linus Torvalds 已提交
2645 2646 2647 2648

	return data;
}

2649 2650 2651 2652
static int __init it87_device_add(unsigned short address,
				  const struct it87_sio_data *sio_data)
{
	struct resource res = {
2653 2654
		.start	= address + IT87_EC_OFFSET,
		.end	= address + IT87_EC_OFFSET + IT87_EC_EXTENT - 1,
2655 2656 2657 2658 2659
		.name	= DRVNAME,
		.flags	= IORESOURCE_IO,
	};
	int err;

2660 2661 2662 2663
	err = acpi_check_resource_conflict(&res);
	if (err)
		goto exit;

2664 2665 2666
	pdev = platform_device_alloc(DRVNAME, address);
	if (!pdev) {
		err = -ENOMEM;
2667
		pr_err("Device allocation failed\n");
2668 2669 2670 2671 2672
		goto exit;
	}

	err = platform_device_add_resources(pdev, &res, 1);
	if (err) {
2673
		pr_err("Device resource addition failed (%d)\n", err);
2674 2675 2676 2677 2678 2679
		goto exit_device_put;
	}

	err = platform_device_add_data(pdev, sio_data,
				       sizeof(struct it87_sio_data));
	if (err) {
2680
		pr_err("Platform data allocation failed\n");
2681 2682 2683 2684 2685
		goto exit_device_put;
	}

	err = platform_device_add(pdev);
	if (err) {
2686
		pr_err("Device addition failed (%d)\n", err);
2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697
		goto exit_device_put;
	}

	return 0;

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

L
Linus Torvalds 已提交
2698 2699
static int __init sm_it87_init(void)
{
2700
	int err;
2701
	unsigned short isa_address = 0;
2702 2703
	struct it87_sio_data sio_data;

2704
	memset(&sio_data, 0, sizeof(struct it87_sio_data));
2705 2706 2707 2708 2709 2710
	err = it87_find(&isa_address, &sio_data);
	if (err)
		return err;
	err = platform_driver_register(&it87_driver);
	if (err)
		return err;
2711

2712
	err = it87_device_add(isa_address, &sio_data);
2713
	if (err) {
2714 2715 2716 2717 2718
		platform_driver_unregister(&it87_driver);
		return err;
	}

	return 0;
L
Linus Torvalds 已提交
2719 2720 2721 2722
}

static void __exit sm_it87_exit(void)
{
2723 2724
	platform_device_unregister(pdev);
	platform_driver_unregister(&it87_driver);
L
Linus Torvalds 已提交
2725 2726 2727
}


2728
MODULE_AUTHOR("Chris Gauthron, Jean Delvare <jdelvare@suse.de>");
2729
MODULE_DESCRIPTION("IT8705F/IT871xF/IT872xF hardware monitoring driver");
L
Linus Torvalds 已提交
2730 2731 2732
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);
2733 2734
MODULE_PARM_DESC(fix_pwm_polarity,
		 "Force PWM polarity to active high (DANGEROUS)");
L
Linus Torvalds 已提交
2735 2736 2737 2738
MODULE_LICENSE("GPL");

module_init(sm_it87_init);
module_exit(sm_it87_exit);