PageRenderTime 58ms CodeModel.GetById 0ms app.highlight 50ms RepoModel.GetById 0ms app.codeStats 1ms

/drivers/hwmon/it87.c

https://bitbucket.org/ndreys/linux-sunxi
C | 2271 lines | 1780 code | 292 blank | 199 comment | 247 complexity | 177e2dad182cc1f2f84d4b1e910bf26c MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0

Large files files are truncated, but you can click here to view the full file

   1/*
   2 *  it87.c - Part of lm_sensors, Linux kernel modules for hardware
   3 *           monitoring.
   4 *
   5 *  The IT8705F is an LPC-based Super I/O part that contains UARTs, a
   6 *  parallel port, an IR port, a MIDI port, a floppy controller, etc., in
   7 *  addition to an Environment Controller (Enhanced Hardware Monitor and
   8 *  Fan Controller)
   9 *
  10 *  This driver supports only the Environment Controller in the IT8705F and
  11 *  similar parts.  The other devices are supported by different drivers.
  12 *
  13 *  Supports: IT8705F  Super I/O chip w/LPC interface
  14 *            IT8712F  Super I/O chip w/LPC interface
  15 *            IT8716F  Super I/O chip w/LPC interface
  16 *            IT8718F  Super I/O chip w/LPC interface
  17 *            IT8720F  Super I/O chip w/LPC interface
  18 *            IT8721F  Super I/O chip w/LPC interface
  19 *            IT8726F  Super I/O chip w/LPC interface
  20 *            IT8758E  Super I/O chip w/LPC interface
  21 *            Sis950   A clone of the IT8705F
  22 *
  23 *  Copyright (C) 2001 Chris Gauthron
  24 *  Copyright (C) 2005-2010 Jean Delvare <khali@linux-fr.org>
  25 *
  26 *  This program is free software; you can redistribute it and/or modify
  27 *  it under the terms of the GNU General Public License as published by
  28 *  the Free Software Foundation; either version 2 of the License, or
  29 *  (at your option) any later version.
  30 *
  31 *  This program is distributed in the hope that it will be useful,
  32 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  33 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  34 *  GNU General Public License for more details.
  35 *
  36 *  You should have received a copy of the GNU General Public License
  37 *  along with this program; if not, write to the Free Software
  38 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  39 */
  40
  41#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  42
  43#include <linux/module.h>
  44#include <linux/init.h>
  45#include <linux/slab.h>
  46#include <linux/jiffies.h>
  47#include <linux/platform_device.h>
  48#include <linux/hwmon.h>
  49#include <linux/hwmon-sysfs.h>
  50#include <linux/hwmon-vid.h>
  51#include <linux/err.h>
  52#include <linux/mutex.h>
  53#include <linux/sysfs.h>
  54#include <linux/string.h>
  55#include <linux/dmi.h>
  56#include <linux/acpi.h>
  57#include <linux/io.h>
  58
  59#define DRVNAME "it87"
  60
  61enum chips { it87, it8712, it8716, it8718, it8720, it8721 };
  62
  63static unsigned short force_id;
  64module_param(force_id, ushort, 0);
  65MODULE_PARM_DESC(force_id, "Override the detected device ID");
  66
  67static struct platform_device *pdev;
  68
  69#define	REG	0x2e	/* The register to read/write */
  70#define	DEV	0x07	/* Register: Logical device select */
  71#define	VAL	0x2f	/* The value to read/write */
  72#define PME	0x04	/* The device with the fan registers in it */
  73
  74/* The device with the IT8718F/IT8720F VID value in it */
  75#define GPIO	0x07
  76
  77#define	DEVID	0x20	/* Register: Device ID */
  78#define	DEVREV	0x22	/* Register: Device Revision */
  79
  80static inline int superio_inb(int reg)
  81{
  82	outb(reg, REG);
  83	return inb(VAL);
  84}
  85
  86static inline void superio_outb(int reg, int val)
  87{
  88	outb(reg, REG);
  89	outb(val, VAL);
  90}
  91
  92static int superio_inw(int reg)
  93{
  94	int val;
  95	outb(reg++, REG);
  96	val = inb(VAL) << 8;
  97	outb(reg, REG);
  98	val |= inb(VAL);
  99	return val;
 100}
 101
 102static inline void superio_select(int ldn)
 103{
 104	outb(DEV, REG);
 105	outb(ldn, VAL);
 106}
 107
 108static inline int superio_enter(void)
 109{
 110	/*
 111	 * Try to reserve REG and REG + 1 for exclusive access.
 112	 */
 113	if (!request_muxed_region(REG, 2, DRVNAME))
 114		return -EBUSY;
 115
 116	outb(0x87, REG);
 117	outb(0x01, REG);
 118	outb(0x55, REG);
 119	outb(0x55, REG);
 120	return 0;
 121}
 122
 123static inline void superio_exit(void)
 124{
 125	outb(0x02, REG);
 126	outb(0x02, VAL);
 127	release_region(REG, 2);
 128}
 129
 130/* Logical device 4 registers */
 131#define IT8712F_DEVID 0x8712
 132#define IT8705F_DEVID 0x8705
 133#define IT8716F_DEVID 0x8716
 134#define IT8718F_DEVID 0x8718
 135#define IT8720F_DEVID 0x8720
 136#define IT8721F_DEVID 0x8721
 137#define IT8726F_DEVID 0x8726
 138#define IT87_ACT_REG  0x30
 139#define IT87_BASE_REG 0x60
 140
 141/* Logical device 7 registers (IT8712F and later) */
 142#define IT87_SIO_GPIO3_REG	0x27
 143#define IT87_SIO_GPIO5_REG	0x29
 144#define IT87_SIO_PINX2_REG	0x2c	/* Pin selection */
 145#define IT87_SIO_VID_REG	0xfc	/* VID value */
 146#define IT87_SIO_BEEP_PIN_REG	0xf6	/* Beep pin mapping */
 147
 148/* Update battery voltage after every reading if true */
 149static int update_vbat;
 150
 151/* Not all BIOSes properly configure the PWM registers */
 152static int fix_pwm_polarity;
 153
 154/* Many IT87 constants specified below */
 155
 156/* Length of ISA address segment */
 157#define IT87_EXTENT 8
 158
 159/* Length of ISA address segment for Environmental Controller */
 160#define IT87_EC_EXTENT 2
 161
 162/* Offset of EC registers from ISA base address */
 163#define IT87_EC_OFFSET 5
 164
 165/* Where are the ISA address/data registers relative to the EC base address */
 166#define IT87_ADDR_REG_OFFSET 0
 167#define IT87_DATA_REG_OFFSET 1
 168
 169/*----- The IT87 registers -----*/
 170
 171#define IT87_REG_CONFIG        0x00
 172
 173#define IT87_REG_ALARM1        0x01
 174#define IT87_REG_ALARM2        0x02
 175#define IT87_REG_ALARM3        0x03
 176
 177/* The IT8718F and IT8720F have the VID value in a different register, in
 178   Super-I/O configuration space. */
 179#define IT87_REG_VID           0x0a
 180/* The IT8705F and IT8712F earlier than revision 0x08 use register 0x0b
 181   for fan divisors. Later IT8712F revisions must use 16-bit tachometer
 182   mode. */
 183#define IT87_REG_FAN_DIV       0x0b
 184#define IT87_REG_FAN_16BIT     0x0c
 185
 186/* Monitors: 9 voltage (0 to 7, battery), 3 temp (1 to 3), 3 fan (1 to 3) */
 187
 188static const u8 IT87_REG_FAN[]		= { 0x0d, 0x0e, 0x0f, 0x80, 0x82 };
 189static const u8 IT87_REG_FAN_MIN[]	= { 0x10, 0x11, 0x12, 0x84, 0x86 };
 190static const u8 IT87_REG_FANX[]		= { 0x18, 0x19, 0x1a, 0x81, 0x83 };
 191static const u8 IT87_REG_FANX_MIN[]	= { 0x1b, 0x1c, 0x1d, 0x85, 0x87 };
 192#define IT87_REG_FAN_MAIN_CTRL 0x13
 193#define IT87_REG_FAN_CTL       0x14
 194#define IT87_REG_PWM(nr)       (0x15 + (nr))
 195#define IT87_REG_PWM_DUTY(nr)  (0x63 + (nr) * 8)
 196
 197#define IT87_REG_VIN(nr)       (0x20 + (nr))
 198#define IT87_REG_TEMP(nr)      (0x29 + (nr))
 199
 200#define IT87_REG_VIN_MAX(nr)   (0x30 + (nr) * 2)
 201#define IT87_REG_VIN_MIN(nr)   (0x31 + (nr) * 2)
 202#define IT87_REG_TEMP_HIGH(nr) (0x40 + (nr) * 2)
 203#define IT87_REG_TEMP_LOW(nr)  (0x41 + (nr) * 2)
 204
 205#define IT87_REG_VIN_ENABLE    0x50
 206#define IT87_REG_TEMP_ENABLE   0x51
 207#define IT87_REG_BEEP_ENABLE   0x5c
 208
 209#define IT87_REG_CHIPID        0x58
 210
 211#define IT87_REG_AUTO_TEMP(nr, i) (0x60 + (nr) * 8 + (i))
 212#define IT87_REG_AUTO_PWM(nr, i)  (0x65 + (nr) * 8 + (i))
 213
 214
 215struct it87_sio_data {
 216	enum chips type;
 217	/* Values read from Super-I/O config space */
 218	u8 revision;
 219	u8 vid_value;
 220	u8 beep_pin;
 221	u8 internal;	/* Internal sensors can be labeled */
 222	/* Features skipped based on config or DMI */
 223	u8 skip_vid;
 224	u8 skip_fan;
 225	u8 skip_pwm;
 226};
 227
 228/* For each registered chip, we need to keep some data in memory.
 229   The structure is dynamically allocated. */
 230struct it87_data {
 231	struct device *hwmon_dev;
 232	enum chips type;
 233	u8 revision;
 234
 235	unsigned short addr;
 236	const char *name;
 237	struct mutex update_lock;
 238	char valid;		/* !=0 if following fields are valid */
 239	unsigned long last_updated;	/* In jiffies */
 240
 241	u16 in_scaled;		/* Internal voltage sensors are scaled */
 242	u8 in[9];		/* Register value */
 243	u8 in_max[8];		/* Register value */
 244	u8 in_min[8];		/* Register value */
 245	u8 has_fan;		/* Bitfield, fans enabled */
 246	u16 fan[5];		/* Register values, possibly combined */
 247	u16 fan_min[5];		/* Register values, possibly combined */
 248	s8 temp[3];		/* Register value */
 249	s8 temp_high[3];	/* Register value */
 250	s8 temp_low[3];		/* Register value */
 251	u8 sensor;		/* Register value */
 252	u8 fan_div[3];		/* Register encoding, shifted right */
 253	u8 vid;			/* Register encoding, combined */
 254	u8 vrm;
 255	u32 alarms;		/* Register encoding, combined */
 256	u8 beeps;		/* Register encoding */
 257	u8 fan_main_ctrl;	/* Register value */
 258	u8 fan_ctl;		/* Register value */
 259
 260	/* The following 3 arrays correspond to the same registers up to
 261	 * the IT8720F. The meaning of bits 6-0 depends on the value of bit
 262	 * 7, and we want to preserve settings on mode changes, so we have
 263	 * to track all values separately.
 264	 * Starting with the IT8721F, the manual PWM duty cycles are stored
 265	 * in separate registers (8-bit values), so the separate tracking
 266	 * is no longer needed, but it is still done to keep the driver
 267	 * simple. */
 268	u8 pwm_ctrl[3];		/* Register value */
 269	u8 pwm_duty[3];		/* Manual PWM value set by user */
 270	u8 pwm_temp_map[3];	/* PWM to temp. chan. mapping (bits 1-0) */
 271
 272	/* Automatic fan speed control registers */
 273	u8 auto_pwm[3][4];	/* [nr][3] is hard-coded */
 274	s8 auto_temp[3][5];	/* [nr][0] is point1_temp_hyst */
 275};
 276
 277static u8 in_to_reg(const struct it87_data *data, int nr, long val)
 278{
 279	long lsb;
 280
 281	if (data->type == it8721) {
 282		if (data->in_scaled & (1 << nr))
 283			lsb = 24;
 284		else
 285			lsb = 12;
 286	} else
 287		lsb = 16;
 288
 289	val = DIV_ROUND_CLOSEST(val, lsb);
 290	return SENSORS_LIMIT(val, 0, 255);
 291}
 292
 293static int in_from_reg(const struct it87_data *data, int nr, int val)
 294{
 295	if (data->type == it8721) {
 296		if (data->in_scaled & (1 << nr))
 297			return val * 24;
 298		else
 299			return val * 12;
 300	} else
 301		return val * 16;
 302}
 303
 304static inline u8 FAN_TO_REG(long rpm, int div)
 305{
 306	if (rpm == 0)
 307		return 255;
 308	rpm = SENSORS_LIMIT(rpm, 1, 1000000);
 309	return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1,
 310			     254);
 311}
 312
 313static inline u16 FAN16_TO_REG(long rpm)
 314{
 315	if (rpm == 0)
 316		return 0xffff;
 317	return SENSORS_LIMIT((1350000 + rpm) / (rpm * 2), 1, 0xfffe);
 318}
 319
 320#define FAN_FROM_REG(val, div) ((val) == 0 ? -1 : (val) == 255 ? 0 : \
 321				1350000 / ((val) * (div)))
 322/* The divider is fixed to 2 in 16-bit mode */
 323#define FAN16_FROM_REG(val) ((val) == 0 ? -1 : (val) == 0xffff ? 0 : \
 324			     1350000 / ((val) * 2))
 325
 326#define TEMP_TO_REG(val) (SENSORS_LIMIT(((val) < 0 ? (((val) - 500) / 1000) : \
 327					((val) + 500) / 1000), -128, 127))
 328#define TEMP_FROM_REG(val) ((val) * 1000)
 329
 330static u8 pwm_to_reg(const struct it87_data *data, long val)
 331{
 332	if (data->type == it8721)
 333		return val;
 334	else
 335		return val >> 1;
 336}
 337
 338static int pwm_from_reg(const struct it87_data *data, u8 reg)
 339{
 340	if (data->type == it8721)
 341		return reg;
 342	else
 343		return (reg & 0x7f) << 1;
 344}
 345
 346
 347static int DIV_TO_REG(int val)
 348{
 349	int answer = 0;
 350	while (answer < 7 && (val >>= 1))
 351		answer++;
 352	return answer;
 353}
 354#define DIV_FROM_REG(val) (1 << (val))
 355
 356static const unsigned int pwm_freq[8] = {
 357	48000000 / 128,
 358	24000000 / 128,
 359	12000000 / 128,
 360	8000000 / 128,
 361	6000000 / 128,
 362	3000000 / 128,
 363	1500000 / 128,
 364	750000 / 128,
 365};
 366
 367static inline int has_16bit_fans(const struct it87_data *data)
 368{
 369	/* IT8705F Datasheet 0.4.1, 3h == Version G.
 370	   IT8712F Datasheet 0.9.1, section 8.3.5 indicates 8h == Version J.
 371	   These are the first revisions with 16bit tachometer support. */
 372	return (data->type == it87 && data->revision >= 0x03)
 373	    || (data->type == it8712 && data->revision >= 0x08)
 374	    || data->type == it8716
 375	    || data->type == it8718
 376	    || data->type == it8720
 377	    || data->type == it8721;
 378}
 379
 380static inline int has_old_autopwm(const struct it87_data *data)
 381{
 382	/* The old automatic fan speed control interface is implemented
 383	   by IT8705F chips up to revision F and IT8712F chips up to
 384	   revision G. */
 385	return (data->type == it87 && data->revision < 0x03)
 386	    || (data->type == it8712 && data->revision < 0x08);
 387}
 388
 389static int it87_probe(struct platform_device *pdev);
 390static int __devexit it87_remove(struct platform_device *pdev);
 391
 392static int it87_read_value(struct it87_data *data, u8 reg);
 393static void it87_write_value(struct it87_data *data, u8 reg, u8 value);
 394static struct it87_data *it87_update_device(struct device *dev);
 395static int it87_check_pwm(struct device *dev);
 396static void it87_init_device(struct platform_device *pdev);
 397
 398
 399static struct platform_driver it87_driver = {
 400	.driver = {
 401		.owner	= THIS_MODULE,
 402		.name	= DRVNAME,
 403	},
 404	.probe	= it87_probe,
 405	.remove	= __devexit_p(it87_remove),
 406};
 407
 408static ssize_t show_in(struct device *dev, struct device_attribute *attr,
 409		char *buf)
 410{
 411	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 412	int nr = sensor_attr->index;
 413
 414	struct it87_data *data = it87_update_device(dev);
 415	return sprintf(buf, "%d\n", in_from_reg(data, nr, data->in[nr]));
 416}
 417
 418static ssize_t show_in_min(struct device *dev, struct device_attribute *attr,
 419		char *buf)
 420{
 421	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 422	int nr = sensor_attr->index;
 423
 424	struct it87_data *data = it87_update_device(dev);
 425	return sprintf(buf, "%d\n", in_from_reg(data, nr, data->in_min[nr]));
 426}
 427
 428static ssize_t show_in_max(struct device *dev, struct device_attribute *attr,
 429		char *buf)
 430{
 431	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 432	int nr = sensor_attr->index;
 433
 434	struct it87_data *data = it87_update_device(dev);
 435	return sprintf(buf, "%d\n", in_from_reg(data, nr, data->in_max[nr]));
 436}
 437
 438static ssize_t set_in_min(struct device *dev, struct device_attribute *attr,
 439		const char *buf, size_t count)
 440{
 441	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 442	int nr = sensor_attr->index;
 443
 444	struct it87_data *data = dev_get_drvdata(dev);
 445	unsigned long val;
 446
 447	if (strict_strtoul(buf, 10, &val) < 0)
 448		return -EINVAL;
 449
 450	mutex_lock(&data->update_lock);
 451	data->in_min[nr] = in_to_reg(data, nr, val);
 452	it87_write_value(data, IT87_REG_VIN_MIN(nr),
 453			data->in_min[nr]);
 454	mutex_unlock(&data->update_lock);
 455	return count;
 456}
 457static ssize_t set_in_max(struct device *dev, struct device_attribute *attr,
 458		const char *buf, size_t count)
 459{
 460	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 461	int nr = sensor_attr->index;
 462
 463	struct it87_data *data = dev_get_drvdata(dev);
 464	unsigned long val;
 465
 466	if (strict_strtoul(buf, 10, &val) < 0)
 467		return -EINVAL;
 468
 469	mutex_lock(&data->update_lock);
 470	data->in_max[nr] = in_to_reg(data, nr, val);
 471	it87_write_value(data, IT87_REG_VIN_MAX(nr),
 472			data->in_max[nr]);
 473	mutex_unlock(&data->update_lock);
 474	return count;
 475}
 476
 477#define show_in_offset(offset)					\
 478static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO,		\
 479		show_in, NULL, offset);
 480
 481#define limit_in_offset(offset)					\
 482static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR,	\
 483		show_in_min, set_in_min, offset);		\
 484static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR,	\
 485		show_in_max, set_in_max, offset);
 486
 487show_in_offset(0);
 488limit_in_offset(0);
 489show_in_offset(1);
 490limit_in_offset(1);
 491show_in_offset(2);
 492limit_in_offset(2);
 493show_in_offset(3);
 494limit_in_offset(3);
 495show_in_offset(4);
 496limit_in_offset(4);
 497show_in_offset(5);
 498limit_in_offset(5);
 499show_in_offset(6);
 500limit_in_offset(6);
 501show_in_offset(7);
 502limit_in_offset(7);
 503show_in_offset(8);
 504
 505/* 3 temperatures */
 506static ssize_t show_temp(struct device *dev, struct device_attribute *attr,
 507		char *buf)
 508{
 509	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 510	int nr = sensor_attr->index;
 511
 512	struct it87_data *data = it87_update_device(dev);
 513	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[nr]));
 514}
 515static ssize_t show_temp_max(struct device *dev, struct device_attribute *attr,
 516		char *buf)
 517{
 518	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 519	int nr = sensor_attr->index;
 520
 521	struct it87_data *data = it87_update_device(dev);
 522	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_high[nr]));
 523}
 524static ssize_t show_temp_min(struct device *dev, struct device_attribute *attr,
 525		char *buf)
 526{
 527	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 528	int nr = sensor_attr->index;
 529
 530	struct it87_data *data = it87_update_device(dev);
 531	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_low[nr]));
 532}
 533static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr,
 534		const char *buf, size_t count)
 535{
 536	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 537	int nr = sensor_attr->index;
 538
 539	struct it87_data *data = dev_get_drvdata(dev);
 540	long val;
 541
 542	if (strict_strtol(buf, 10, &val) < 0)
 543		return -EINVAL;
 544
 545	mutex_lock(&data->update_lock);
 546	data->temp_high[nr] = TEMP_TO_REG(val);
 547	it87_write_value(data, IT87_REG_TEMP_HIGH(nr), data->temp_high[nr]);
 548	mutex_unlock(&data->update_lock);
 549	return count;
 550}
 551static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr,
 552		const char *buf, size_t count)
 553{
 554	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 555	int nr = sensor_attr->index;
 556
 557	struct it87_data *data = dev_get_drvdata(dev);
 558	long val;
 559
 560	if (strict_strtol(buf, 10, &val) < 0)
 561		return -EINVAL;
 562
 563	mutex_lock(&data->update_lock);
 564	data->temp_low[nr] = TEMP_TO_REG(val);
 565	it87_write_value(data, IT87_REG_TEMP_LOW(nr), data->temp_low[nr]);
 566	mutex_unlock(&data->update_lock);
 567	return count;
 568}
 569#define show_temp_offset(offset)					\
 570static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO,		\
 571		show_temp, NULL, offset - 1);				\
 572static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR,	\
 573		show_temp_max, set_temp_max, offset - 1);		\
 574static SENSOR_DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR,	\
 575		show_temp_min, set_temp_min, offset - 1);
 576
 577show_temp_offset(1);
 578show_temp_offset(2);
 579show_temp_offset(3);
 580
 581static ssize_t show_sensor(struct device *dev, struct device_attribute *attr,
 582		char *buf)
 583{
 584	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 585	int nr = sensor_attr->index;
 586
 587	struct it87_data *data = it87_update_device(dev);
 588	u8 reg = data->sensor;		/* In case the value is updated while
 589					   we use it */
 590
 591	if (reg & (1 << nr))
 592		return sprintf(buf, "3\n");  /* thermal diode */
 593	if (reg & (8 << nr))
 594		return sprintf(buf, "4\n");  /* thermistor */
 595	return sprintf(buf, "0\n");      /* disabled */
 596}
 597static ssize_t set_sensor(struct device *dev, struct device_attribute *attr,
 598		const char *buf, size_t count)
 599{
 600	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 601	int nr = sensor_attr->index;
 602
 603	struct it87_data *data = dev_get_drvdata(dev);
 604	long val;
 605	u8 reg;
 606
 607	if (strict_strtol(buf, 10, &val) < 0)
 608		return -EINVAL;
 609
 610	reg = it87_read_value(data, IT87_REG_TEMP_ENABLE);
 611	reg &= ~(1 << nr);
 612	reg &= ~(8 << nr);
 613	if (val == 2) {	/* backwards compatibility */
 614		dev_warn(dev, "Sensor type 2 is deprecated, please use 4 "
 615			 "instead\n");
 616		val = 4;
 617	}
 618	/* 3 = thermal diode; 4 = thermistor; 0 = disabled */
 619	if (val == 3)
 620		reg |= 1 << nr;
 621	else if (val == 4)
 622		reg |= 8 << nr;
 623	else if (val != 0)
 624		return -EINVAL;
 625
 626	mutex_lock(&data->update_lock);
 627	data->sensor = reg;
 628	it87_write_value(data, IT87_REG_TEMP_ENABLE, data->sensor);
 629	data->valid = 0;	/* Force cache refresh */
 630	mutex_unlock(&data->update_lock);
 631	return count;
 632}
 633#define show_sensor_offset(offset)					\
 634static SENSOR_DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR,	\
 635		show_sensor, set_sensor, offset - 1);
 636
 637show_sensor_offset(1);
 638show_sensor_offset(2);
 639show_sensor_offset(3);
 640
 641/* 3 Fans */
 642
 643static int pwm_mode(const struct it87_data *data, int nr)
 644{
 645	int ctrl = data->fan_main_ctrl & (1 << nr);
 646
 647	if (ctrl == 0)					/* Full speed */
 648		return 0;
 649	if (data->pwm_ctrl[nr] & 0x80)			/* Automatic mode */
 650		return 2;
 651	else						/* Manual mode */
 652		return 1;
 653}
 654
 655static ssize_t show_fan(struct device *dev, struct device_attribute *attr,
 656		char *buf)
 657{
 658	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 659	int nr = sensor_attr->index;
 660
 661	struct it87_data *data = it87_update_device(dev);
 662	return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr],
 663				DIV_FROM_REG(data->fan_div[nr])));
 664}
 665static ssize_t show_fan_min(struct device *dev, struct device_attribute *attr,
 666		char *buf)
 667{
 668	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 669	int nr = sensor_attr->index;
 670
 671	struct it87_data *data = it87_update_device(dev);
 672	return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_min[nr],
 673				DIV_FROM_REG(data->fan_div[nr])));
 674}
 675static ssize_t show_fan_div(struct device *dev, struct device_attribute *attr,
 676		char *buf)
 677{
 678	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 679	int nr = sensor_attr->index;
 680
 681	struct it87_data *data = it87_update_device(dev);
 682	return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr]));
 683}
 684static ssize_t show_pwm_enable(struct device *dev,
 685		struct device_attribute *attr, char *buf)
 686{
 687	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 688	int nr = sensor_attr->index;
 689
 690	struct it87_data *data = it87_update_device(dev);
 691	return sprintf(buf, "%d\n", pwm_mode(data, nr));
 692}
 693static ssize_t show_pwm(struct device *dev, struct device_attribute *attr,
 694		char *buf)
 695{
 696	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 697	int nr = sensor_attr->index;
 698
 699	struct it87_data *data = it87_update_device(dev);
 700	return sprintf(buf, "%d\n",
 701		       pwm_from_reg(data, data->pwm_duty[nr]));
 702}
 703static ssize_t show_pwm_freq(struct device *dev, struct device_attribute *attr,
 704		char *buf)
 705{
 706	struct it87_data *data = it87_update_device(dev);
 707	int index = (data->fan_ctl >> 4) & 0x07;
 708
 709	return sprintf(buf, "%u\n", pwm_freq[index]);
 710}
 711static ssize_t set_fan_min(struct device *dev, struct device_attribute *attr,
 712		const char *buf, size_t count)
 713{
 714	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 715	int nr = sensor_attr->index;
 716
 717	struct it87_data *data = dev_get_drvdata(dev);
 718	long val;
 719	u8 reg;
 720
 721	if (strict_strtol(buf, 10, &val) < 0)
 722		return -EINVAL;
 723
 724	mutex_lock(&data->update_lock);
 725	reg = it87_read_value(data, IT87_REG_FAN_DIV);
 726	switch (nr) {
 727	case 0:
 728		data->fan_div[nr] = reg & 0x07;
 729		break;
 730	case 1:
 731		data->fan_div[nr] = (reg >> 3) & 0x07;
 732		break;
 733	case 2:
 734		data->fan_div[nr] = (reg & 0x40) ? 3 : 1;
 735		break;
 736	}
 737
 738	data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
 739	it87_write_value(data, IT87_REG_FAN_MIN[nr], data->fan_min[nr]);
 740	mutex_unlock(&data->update_lock);
 741	return count;
 742}
 743static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,
 744		const char *buf, size_t count)
 745{
 746	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 747	int nr = sensor_attr->index;
 748
 749	struct it87_data *data = dev_get_drvdata(dev);
 750	unsigned long val;
 751	int min;
 752	u8 old;
 753
 754	if (strict_strtoul(buf, 10, &val) < 0)
 755		return -EINVAL;
 756
 757	mutex_lock(&data->update_lock);
 758	old = it87_read_value(data, IT87_REG_FAN_DIV);
 759
 760	/* Save fan min limit */
 761	min = FAN_FROM_REG(data->fan_min[nr], DIV_FROM_REG(data->fan_div[nr]));
 762
 763	switch (nr) {
 764	case 0:
 765	case 1:
 766		data->fan_div[nr] = DIV_TO_REG(val);
 767		break;
 768	case 2:
 769		if (val < 8)
 770			data->fan_div[nr] = 1;
 771		else
 772			data->fan_div[nr] = 3;
 773	}
 774	val = old & 0x80;
 775	val |= (data->fan_div[0] & 0x07);
 776	val |= (data->fan_div[1] & 0x07) << 3;
 777	if (data->fan_div[2] == 3)
 778		val |= 0x1 << 6;
 779	it87_write_value(data, IT87_REG_FAN_DIV, val);
 780
 781	/* Restore fan min limit */
 782	data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
 783	it87_write_value(data, IT87_REG_FAN_MIN[nr], data->fan_min[nr]);
 784
 785	mutex_unlock(&data->update_lock);
 786	return count;
 787}
 788
 789/* Returns 0 if OK, -EINVAL otherwise */
 790static int check_trip_points(struct device *dev, int nr)
 791{
 792	const struct it87_data *data = dev_get_drvdata(dev);
 793	int i, err = 0;
 794
 795	if (has_old_autopwm(data)) {
 796		for (i = 0; i < 3; i++) {
 797			if (data->auto_temp[nr][i] > data->auto_temp[nr][i + 1])
 798				err = -EINVAL;
 799		}
 800		for (i = 0; i < 2; i++) {
 801			if (data->auto_pwm[nr][i] > data->auto_pwm[nr][i + 1])
 802				err = -EINVAL;
 803		}
 804	}
 805
 806	if (err) {
 807		dev_err(dev, "Inconsistent trip points, not switching to "
 808			"automatic mode\n");
 809		dev_err(dev, "Adjust the trip points and try again\n");
 810	}
 811	return err;
 812}
 813
 814static ssize_t set_pwm_enable(struct device *dev,
 815		struct device_attribute *attr, const char *buf, size_t count)
 816{
 817	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 818	int nr = sensor_attr->index;
 819
 820	struct it87_data *data = dev_get_drvdata(dev);
 821	long val;
 822
 823	if (strict_strtol(buf, 10, &val) < 0 || val < 0 || val > 2)
 824		return -EINVAL;
 825
 826	/* Check trip points before switching to automatic mode */
 827	if (val == 2) {
 828		if (check_trip_points(dev, nr) < 0)
 829			return -EINVAL;
 830	}
 831
 832	mutex_lock(&data->update_lock);
 833
 834	if (val == 0) {
 835		int tmp;
 836		/* make sure the fan is on when in on/off mode */
 837		tmp = it87_read_value(data, IT87_REG_FAN_CTL);
 838		it87_write_value(data, IT87_REG_FAN_CTL, tmp | (1 << nr));
 839		/* set on/off mode */
 840		data->fan_main_ctrl &= ~(1 << nr);
 841		it87_write_value(data, IT87_REG_FAN_MAIN_CTRL,
 842				 data->fan_main_ctrl);
 843	} else {
 844		if (val == 1)				/* Manual mode */
 845			data->pwm_ctrl[nr] = data->type == it8721 ?
 846					     data->pwm_temp_map[nr] :
 847					     data->pwm_duty[nr];
 848		else					/* Automatic mode */
 849			data->pwm_ctrl[nr] = 0x80 | data->pwm_temp_map[nr];
 850		it87_write_value(data, IT87_REG_PWM(nr), data->pwm_ctrl[nr]);
 851		/* set SmartGuardian mode */
 852		data->fan_main_ctrl |= (1 << nr);
 853		it87_write_value(data, IT87_REG_FAN_MAIN_CTRL,
 854				 data->fan_main_ctrl);
 855	}
 856
 857	mutex_unlock(&data->update_lock);
 858	return count;
 859}
 860static ssize_t set_pwm(struct device *dev, struct device_attribute *attr,
 861		const char *buf, size_t count)
 862{
 863	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 864	int nr = sensor_attr->index;
 865
 866	struct it87_data *data = dev_get_drvdata(dev);
 867	long val;
 868
 869	if (strict_strtol(buf, 10, &val) < 0 || val < 0 || val > 255)
 870		return -EINVAL;
 871
 872	mutex_lock(&data->update_lock);
 873	if (data->type == it8721) {
 874		/* If we are in automatic mode, the PWM duty cycle register
 875		 * is read-only so we can't write the value */
 876		if (data->pwm_ctrl[nr] & 0x80) {
 877			mutex_unlock(&data->update_lock);
 878			return -EBUSY;
 879		}
 880		data->pwm_duty[nr] = pwm_to_reg(data, val);
 881		it87_write_value(data, IT87_REG_PWM_DUTY(nr),
 882				 data->pwm_duty[nr]);
 883	} else {
 884		data->pwm_duty[nr] = pwm_to_reg(data, val);
 885		/* If we are in manual mode, write the duty cycle immediately;
 886		 * otherwise, just store it for later use. */
 887		if (!(data->pwm_ctrl[nr] & 0x80)) {
 888			data->pwm_ctrl[nr] = data->pwm_duty[nr];
 889			it87_write_value(data, IT87_REG_PWM(nr),
 890					 data->pwm_ctrl[nr]);
 891		}
 892	}
 893	mutex_unlock(&data->update_lock);
 894	return count;
 895}
 896static ssize_t set_pwm_freq(struct device *dev,
 897		struct device_attribute *attr, const char *buf, size_t count)
 898{
 899	struct it87_data *data = dev_get_drvdata(dev);
 900	unsigned long val;
 901	int i;
 902
 903	if (strict_strtoul(buf, 10, &val) < 0)
 904		return -EINVAL;
 905
 906	/* Search for the nearest available frequency */
 907	for (i = 0; i < 7; i++) {
 908		if (val > (pwm_freq[i] + pwm_freq[i+1]) / 2)
 909			break;
 910	}
 911
 912	mutex_lock(&data->update_lock);
 913	data->fan_ctl = it87_read_value(data, IT87_REG_FAN_CTL) & 0x8f;
 914	data->fan_ctl |= i << 4;
 915	it87_write_value(data, IT87_REG_FAN_CTL, data->fan_ctl);
 916	mutex_unlock(&data->update_lock);
 917
 918	return count;
 919}
 920static ssize_t show_pwm_temp_map(struct device *dev,
 921		struct device_attribute *attr, char *buf)
 922{
 923	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 924	int nr = sensor_attr->index;
 925
 926	struct it87_data *data = it87_update_device(dev);
 927	int map;
 928
 929	if (data->pwm_temp_map[nr] < 3)
 930		map = 1 << data->pwm_temp_map[nr];
 931	else
 932		map = 0;			/* Should never happen */
 933	return sprintf(buf, "%d\n", map);
 934}
 935static ssize_t set_pwm_temp_map(struct device *dev,
 936		struct device_attribute *attr, const char *buf, size_t count)
 937{
 938	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 939	int nr = sensor_attr->index;
 940
 941	struct it87_data *data = dev_get_drvdata(dev);
 942	long val;
 943	u8 reg;
 944
 945	/* This check can go away if we ever support automatic fan speed
 946	   control on newer chips. */
 947	if (!has_old_autopwm(data)) {
 948		dev_notice(dev, "Mapping change disabled for safety reasons\n");
 949		return -EINVAL;
 950	}
 951
 952	if (strict_strtol(buf, 10, &val) < 0)
 953		return -EINVAL;
 954
 955	switch (val) {
 956	case (1 << 0):
 957		reg = 0x00;
 958		break;
 959	case (1 << 1):
 960		reg = 0x01;
 961		break;
 962	case (1 << 2):
 963		reg = 0x02;
 964		break;
 965	default:
 966		return -EINVAL;
 967	}
 968
 969	mutex_lock(&data->update_lock);
 970	data->pwm_temp_map[nr] = reg;
 971	/* If we are in automatic mode, write the temp mapping immediately;
 972	 * otherwise, just store it for later use. */
 973	if (data->pwm_ctrl[nr] & 0x80) {
 974		data->pwm_ctrl[nr] = 0x80 | data->pwm_temp_map[nr];
 975		it87_write_value(data, IT87_REG_PWM(nr), data->pwm_ctrl[nr]);
 976	}
 977	mutex_unlock(&data->update_lock);
 978	return count;
 979}
 980
 981static ssize_t show_auto_pwm(struct device *dev,
 982		struct device_attribute *attr, char *buf)
 983{
 984	struct it87_data *data = it87_update_device(dev);
 985	struct sensor_device_attribute_2 *sensor_attr =
 986			to_sensor_dev_attr_2(attr);
 987	int nr = sensor_attr->nr;
 988	int point = sensor_attr->index;
 989
 990	return sprintf(buf, "%d\n",
 991		       pwm_from_reg(data, data->auto_pwm[nr][point]));
 992}
 993
 994static ssize_t set_auto_pwm(struct device *dev,
 995		struct device_attribute *attr, const char *buf, size_t count)
 996{
 997	struct it87_data *data = dev_get_drvdata(dev);
 998	struct sensor_device_attribute_2 *sensor_attr =
 999			to_sensor_dev_attr_2(attr);
1000	int nr = sensor_attr->nr;
1001	int point = sensor_attr->index;
1002	long val;
1003
1004	if (strict_strtol(buf, 10, &val) < 0 || val < 0 || val > 255)
1005		return -EINVAL;
1006
1007	mutex_lock(&data->update_lock);
1008	data->auto_pwm[nr][point] = pwm_to_reg(data, val);
1009	it87_write_value(data, IT87_REG_AUTO_PWM(nr, point),
1010			 data->auto_pwm[nr][point]);
1011	mutex_unlock(&data->update_lock);
1012	return count;
1013}
1014
1015static ssize_t show_auto_temp(struct device *dev,
1016		struct device_attribute *attr, char *buf)
1017{
1018	struct it87_data *data = it87_update_device(dev);
1019	struct sensor_device_attribute_2 *sensor_attr =
1020			to_sensor_dev_attr_2(attr);
1021	int nr = sensor_attr->nr;
1022	int point = sensor_attr->index;
1023
1024	return sprintf(buf, "%d\n", TEMP_FROM_REG(data->auto_temp[nr][point]));
1025}
1026
1027static ssize_t set_auto_temp(struct device *dev,
1028		struct device_attribute *attr, const char *buf, size_t count)
1029{
1030	struct it87_data *data = dev_get_drvdata(dev);
1031	struct sensor_device_attribute_2 *sensor_attr =
1032			to_sensor_dev_attr_2(attr);
1033	int nr = sensor_attr->nr;
1034	int point = sensor_attr->index;
1035	long val;
1036
1037	if (strict_strtol(buf, 10, &val) < 0 || val < -128000 || val > 127000)
1038		return -EINVAL;
1039
1040	mutex_lock(&data->update_lock);
1041	data->auto_temp[nr][point] = TEMP_TO_REG(val);
1042	it87_write_value(data, IT87_REG_AUTO_TEMP(nr, point),
1043			 data->auto_temp[nr][point]);
1044	mutex_unlock(&data->update_lock);
1045	return count;
1046}
1047
1048#define show_fan_offset(offset)					\
1049static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO,		\
1050		show_fan, NULL, offset - 1);			\
1051static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
1052		show_fan_min, set_fan_min, offset - 1);		\
1053static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
1054		show_fan_div, set_fan_div, offset - 1);
1055
1056show_fan_offset(1);
1057show_fan_offset(2);
1058show_fan_offset(3);
1059
1060#define show_pwm_offset(offset)						\
1061static SENSOR_DEVICE_ATTR(pwm##offset##_enable, S_IRUGO | S_IWUSR,	\
1062		show_pwm_enable, set_pwm_enable, offset - 1);		\
1063static SENSOR_DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR,		\
1064		show_pwm, set_pwm, offset - 1);				\
1065static DEVICE_ATTR(pwm##offset##_freq,					\
1066		(offset == 1 ? S_IRUGO | S_IWUSR : S_IRUGO),		\
1067		show_pwm_freq, (offset == 1 ? set_pwm_freq : NULL));	\
1068static SENSOR_DEVICE_ATTR(pwm##offset##_auto_channels_temp,		\
1069		S_IRUGO | S_IWUSR, show_pwm_temp_map, set_pwm_temp_map,	\
1070		offset - 1);						\
1071static SENSOR_DEVICE_ATTR_2(pwm##offset##_auto_point1_pwm,		\
1072		S_IRUGO | S_IWUSR, show_auto_pwm, set_auto_pwm,		\
1073		offset - 1, 0);						\
1074static SENSOR_DEVICE_ATTR_2(pwm##offset##_auto_point2_pwm,		\
1075		S_IRUGO | S_IWUSR, show_auto_pwm, set_auto_pwm,		\
1076		offset - 1, 1);						\
1077static SENSOR_DEVICE_ATTR_2(pwm##offset##_auto_point3_pwm,		\
1078		S_IRUGO | S_IWUSR, show_auto_pwm, set_auto_pwm,		\
1079		offset - 1, 2);						\
1080static SENSOR_DEVICE_ATTR_2(pwm##offset##_auto_point4_pwm,		\
1081		S_IRUGO, show_auto_pwm, NULL, offset - 1, 3);		\
1082static SENSOR_DEVICE_ATTR_2(pwm##offset##_auto_point1_temp,		\
1083		S_IRUGO | S_IWUSR, show_auto_temp, set_auto_temp,	\
1084		offset - 1, 1);						\
1085static SENSOR_DEVICE_ATTR_2(pwm##offset##_auto_point1_temp_hyst,	\
1086		S_IRUGO | S_IWUSR, show_auto_temp, set_auto_temp,	\
1087		offset - 1, 0);						\
1088static SENSOR_DEVICE_ATTR_2(pwm##offset##_auto_point2_temp,		\
1089		S_IRUGO | S_IWUSR, show_auto_temp, set_auto_temp,	\
1090		offset - 1, 2);						\
1091static SENSOR_DEVICE_ATTR_2(pwm##offset##_auto_point3_temp,		\
1092		S_IRUGO | S_IWUSR, show_auto_temp, set_auto_temp,	\
1093		offset - 1, 3);						\
1094static SENSOR_DEVICE_ATTR_2(pwm##offset##_auto_point4_temp,		\
1095		S_IRUGO | S_IWUSR, show_auto_temp, set_auto_temp,	\
1096		offset - 1, 4);
1097
1098show_pwm_offset(1);
1099show_pwm_offset(2);
1100show_pwm_offset(3);
1101
1102/* A different set of callbacks for 16-bit fans */
1103static ssize_t show_fan16(struct device *dev, struct device_attribute *attr,
1104		char *buf)
1105{
1106	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1107	int nr = sensor_attr->index;
1108	struct it87_data *data = it87_update_device(dev);
1109	return sprintf(buf, "%d\n", FAN16_FROM_REG(data->fan[nr]));
1110}
1111
1112static ssize_t show_fan16_min(struct device *dev, struct device_attribute *attr,
1113		char *buf)
1114{
1115	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1116	int nr = sensor_attr->index;
1117	struct it87_data *data = it87_update_device(dev);
1118	return sprintf(buf, "%d\n", FAN16_FROM_REG(data->fan_min[nr]));
1119}
1120
1121static ssize_t set_fan16_min(struct device *dev, struct device_attribute *attr,
1122		const char *buf, size_t count)
1123{
1124	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1125	int nr = sensor_attr->index;
1126	struct it87_data *data = dev_get_drvdata(dev);
1127	long val;
1128
1129	if (strict_strtol(buf, 10, &val) < 0)
1130		return -EINVAL;
1131
1132	mutex_lock(&data->update_lock);
1133	data->fan_min[nr] = FAN16_TO_REG(val);
1134	it87_write_value(data, IT87_REG_FAN_MIN[nr],
1135			 data->fan_min[nr] & 0xff);
1136	it87_write_value(data, IT87_REG_FANX_MIN[nr],
1137			 data->fan_min[nr] >> 8);
1138	mutex_unlock(&data->update_lock);
1139	return count;
1140}
1141
1142/* We want to use the same sysfs file names as 8-bit fans, but we need
1143   different variable names, so we have to use SENSOR_ATTR instead of
1144   SENSOR_DEVICE_ATTR. */
1145#define show_fan16_offset(offset) \
1146static struct sensor_device_attribute sensor_dev_attr_fan##offset##_input16 \
1147	= SENSOR_ATTR(fan##offset##_input, S_IRUGO,		\
1148		show_fan16, NULL, offset - 1);			\
1149static struct sensor_device_attribute sensor_dev_attr_fan##offset##_min16 \
1150	= SENSOR_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR,	\
1151		show_fan16_min, set_fan16_min, offset - 1)
1152
1153show_fan16_offset(1);
1154show_fan16_offset(2);
1155show_fan16_offset(3);
1156show_fan16_offset(4);
1157show_fan16_offset(5);
1158
1159/* Alarms */
1160static ssize_t show_alarms(struct device *dev, struct device_attribute *attr,
1161		char *buf)
1162{
1163	struct it87_data *data = it87_update_device(dev);
1164	return sprintf(buf, "%u\n", data->alarms);
1165}
1166static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
1167
1168static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
1169		char *buf)
1170{
1171	int bitnr = to_sensor_dev_attr(attr)->index;
1172	struct it87_data *data = it87_update_device(dev);
1173	return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1);
1174}
1175static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 8);
1176static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 9);
1177static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 10);
1178static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 11);
1179static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 12);
1180static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 13);
1181static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 14);
1182static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 15);
1183static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 0);
1184static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 1);
1185static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 2);
1186static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 3);
1187static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 6);
1188static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 16);
1189static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 17);
1190static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 18);
1191
1192static ssize_t show_beep(struct device *dev, struct device_attribute *attr,
1193		char *buf)
1194{
1195	int bitnr = to_sensor_dev_attr(attr)->index;
1196	struct it87_data *data = it87_update_device(dev);
1197	return sprintf(buf, "%u\n", (data->beeps >> bitnr) & 1);
1198}
1199static ssize_t set_beep(struct device *dev, struct device_attribute *attr,
1200		const char *buf, size_t count)
1201{
1202	int bitnr = to_sensor_dev_attr(attr)->index;
1203	struct it87_data *data = dev_get_drvdata(dev);
1204	long val;
1205
1206	if (strict_strtol(buf, 10, &val) < 0
1207	 || (val != 0 && val != 1))
1208		return -EINVAL;
1209
1210	mutex_lock(&data->update_lock);
1211	data->beeps = it87_read_value(data, IT87_REG_BEEP_ENABLE);
1212	if (val)
1213		data->beeps |= (1 << bitnr);
1214	else
1215		data->beeps &= ~(1 << bitnr);
1216	it87_write_value(data, IT87_REG_BEEP_ENABLE, data->beeps);
1217	mutex_unlock(&data->update_lock);
1218	return count;
1219}
1220
1221static SENSOR_DEVICE_ATTR(in0_beep, S_IRUGO | S_IWUSR,
1222			  show_beep, set_beep, 1);
1223static SENSOR_DEVICE_ATTR(in1_beep, S_IRUGO, show_beep, NULL, 1);
1224static SENSOR_DEVICE_ATTR(in2_beep, S_IRUGO, show_beep, NULL, 1);
1225static SENSOR_DEVICE_ATTR(in3_beep, S_IRUGO, show_beep, NULL, 1);
1226static SENSOR_DEVICE_ATTR(in4_beep, S_IRUGO, show_beep, NULL, 1);
1227static SENSOR_DEVICE_ATTR(in5_beep, S_IRUGO, show_beep, NULL, 1);
1228static SENSOR_DEVICE_ATTR(in6_beep, S_IRUGO, show_beep, NULL, 1);
1229static SENSOR_DEVICE_ATTR(in7_beep, S_IRUGO, show_beep, NULL, 1);
1230/* fanX_beep writability is set later */
1231static SENSOR_DEVICE_ATTR(fan1_beep, S_IRUGO, show_beep, set_beep, 0);
1232static SENSOR_DEVICE_ATTR(fan2_beep, S_IRUGO, show_beep, set_beep, 0);
1233static SENSOR_DEVICE_ATTR(fan3_beep, S_IRUGO, show_beep, set_beep, 0);
1234static SENSOR_DEVICE_ATTR(fan4_beep, S_IRUGO, show_beep, set_beep, 0);
1235static SENSOR_DEVICE_ATTR(fan5_beep, S_IRUGO, show_beep, set_beep, 0);
1236static SENSOR_DEVICE_ATTR(temp1_beep, S_IRUGO | S_IWUSR,
1237			  show_beep, set_beep, 2);
1238static SENSOR_DEVICE_ATTR(temp2_beep, S_IRUGO, show_beep, NULL, 2);
1239static SENSOR_DEVICE_ATTR(temp3_beep, S_IRUGO, show_beep, NULL, 2);
1240
1241static ssize_t show_vrm_reg(struct device *dev, struct device_attribute *attr,
1242		char *buf)
1243{
1244	struct it87_data *data = dev_get_drvdata(dev);
1245	return sprintf(buf, "%u\n", data->vrm);
1246}
1247static ssize_t store_vrm_reg(struct device *dev, struct device_attribute *attr,
1248		const char *buf, size_t count)
1249{
1250	struct it87_data *data = dev_get_drvdata(dev);
1251	unsigned long val;
1252
1253	if (strict_strtoul(buf, 10, &val) < 0)
1254		return -EINVAL;
1255
1256	data->vrm = val;
1257
1258	return count;
1259}
1260static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
1261
1262static ssize_t show_vid_reg(struct device *dev, struct device_attribute *attr,
1263		char *buf)
1264{
1265	struct it87_data *data = it87_update_device(dev);
1266	return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
1267}
1268static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
1269
1270static ssize_t show_label(struct device *dev, struct device_attribute *attr,
1271		char *buf)
1272{
1273	static const char *labels[] = {
1274		"+5V",
1275		"5VSB",
1276		"Vbat",
1277	};
1278	static const char *labels_it8721[] = {
1279		"+3.3V",
1280		"3VSB",
1281		"Vbat",
1282	};
1283	struct it87_data *data = dev_get_drvdata(dev);
1284	int nr = to_sensor_dev_attr(attr)->index;
1285
1286	return sprintf(buf, "%s\n", data->type == it8721 ? labels_it8721[nr]
1287							 : labels[nr]);
1288}
1289static SENSOR_DEVICE_ATTR(in3_label, S_IRUGO, show_label, NULL, 0);
1290static SENSOR_DEVICE_ATTR(in7_label, S_IRUGO, show_label, NULL, 1);
1291static SENSOR_DEVICE_ATTR(in8_label, S_IRUGO, show_label, NULL, 2);
1292
1293static ssize_t show_name(struct device *dev, struct device_attribute
1294			 *devattr, char *buf)
1295{
1296	struct it87_data *data = dev_get_drvdata(dev);
1297	return sprintf(buf, "%s\n", data->name);
1298}
1299static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
1300
1301static struct attribute *it87_attributes[] = {
1302	&sensor_dev_attr_in0_input.dev_attr.attr,
1303	&sensor_dev_attr_in1_input.dev_attr.attr,
1304	&sensor_dev_attr_in2_input.dev_attr.attr,
1305	&sensor_dev_attr_in3_input.dev_attr.attr,
1306	&sensor_dev_attr_in4_input.dev_attr.attr,
1307	&sensor_dev_attr_in5_input.dev_attr.attr,
1308	&sensor_dev_attr_in6_input.dev_attr.attr,
1309	&sensor_dev_attr_in7_input.dev_attr.attr,
1310	&sensor_dev_attr_in8_input.dev_attr.attr,
1311	&sensor_dev_attr_in0_min.dev_attr.attr,
1312	&sensor_dev_attr_in1_min.dev_attr.attr,
1313	&sensor_dev_attr_in2_min.dev_attr.attr,
1314	&sensor_dev_attr_in3_min.dev_attr.attr,
1315	&sensor_dev_attr_in4_min.dev_attr.attr,
1316	&sensor_dev_attr_in5_min.dev_attr.attr,
1317	&sensor_dev_attr_in6_min.dev_attr.attr,
1318	&sensor_dev_attr_in7_min.dev_attr.attr,
1319	&sensor_dev_attr_in0_max.dev_attr.attr,
1320	&sensor_dev_attr_in1_max.dev_attr.attr,
1321	&sensor_dev_attr_in2_max.dev_attr.attr,
1322	&sensor_dev_attr_in3_max.dev_attr.attr,
1323	&sensor_dev_attr_in4_max.dev_attr.attr,
1324	&sensor_dev_attr_in5_max.dev_attr.attr,
1325	&sensor_dev_attr_in6_max.dev_attr.attr,
1326	&sensor_dev_attr_in7_max.dev_attr.attr,
1327	&sensor_dev_attr_in0_alarm.dev_attr.attr,
1328	&sensor_dev_attr_in1_alarm.dev_attr.attr,
1329	&sensor_dev_attr_in2_alarm.dev_attr.attr,
1330	&sensor_dev_attr_in3_alarm.dev_attr.attr,
1331	&sensor_dev_attr_in4_alarm.dev_attr.attr,
1332	&sensor_dev_attr_in5_alarm.dev_attr.attr,
1333	&sensor_dev_attr_in6_alarm.dev_attr.attr,
1334	&sensor_dev_attr_in7_alarm.dev_attr.attr,
1335
1336	&sensor_dev_attr_temp1_input.dev_attr.attr,
1337	&sensor_dev_attr_temp2_input.dev_attr.attr,
1338	&sensor_dev_attr_temp3_input.dev_attr.attr,
1339	&sensor_dev_attr_temp1_max.dev_attr.attr,
1340	&sensor_dev_attr_temp2_max.dev_attr.attr,
1341	&sensor_dev_attr_temp3_max.dev_attr.attr,
1342	&sensor_dev_attr_temp1_min.dev_attr.attr,
1343	&sensor_dev_attr_temp2_min.dev_attr.attr,
1344	&sensor_dev_attr_temp3_min.dev_attr.attr,
1345	&sensor_dev_attr_temp1_type.dev_attr.attr,
1346	&sensor_dev_attr_temp2_type.dev_attr.attr,
1347	&sensor_dev_attr_temp3_type.dev_attr.attr,
1348	&sensor_dev_attr_temp1_alarm.dev_attr.attr,
1349	&sensor_dev_attr_temp2_alarm.dev_attr.attr,
1350	&sensor_dev_attr_temp3_alarm.dev_attr.attr,
1351
1352	&dev_attr_alarms.attr,
1353	&dev_attr_name.attr,
1354	NULL
1355};
1356
1357static const struct attribute_group it87_group = {
1358	.attrs = it87_attributes,
1359};
1360
1361static struct attribute *it87_attributes_beep[] = {
1362	&sensor_dev_attr_in0_beep.dev_attr.attr,
1363	&sensor_dev_attr_in1_beep.dev_attr.attr,
1364	&sensor_dev_attr_in2_beep.dev_attr.attr,
1365	&sensor_dev_attr_in3_beep.dev_attr.attr,
1366	&sensor_dev_attr_in4_beep.dev_attr.attr,
1367	&sensor_dev_attr_in5_beep.dev_attr.attr,
1368	&sensor_dev_attr_in6_beep.dev_attr.attr,
1369	&sensor_dev_attr_in7_beep.dev_attr.attr,
1370
1371	&sensor_dev_attr_temp1_beep.dev_attr.attr,
1372	&sensor_dev_attr_temp2_beep.dev_attr.attr,
1373	&sensor_dev_attr_temp3_beep.dev_attr.attr,
1374	NULL
1375};
1376
1377static const struct attribute_group it87_group_beep = {
1378	.attrs = it87_attributes_beep,
1379};
1380
1381static struct attribute *it87_attributes_fan16[5][3+1] = { {
1382	&sensor_dev_attr_fan1_input16.dev_attr.attr,
1383	&sensor_dev_attr_fan1_min16.dev_attr.attr,
1384	&sensor_dev_attr_fan1_alarm.dev_attr.attr,
1385	NULL
1386}, {
1387	&sensor_dev_attr_fan2_input16.dev_attr.attr,
1388	&sensor_dev_attr_fan2_min16.dev_attr.attr,
1389	&sensor_dev_attr_fan2_alarm.dev_attr.attr,
1390	NULL
1391}, {
1392	&sensor_dev_attr_fan3_input16.dev_attr.attr,
1393	&sensor_dev_attr_fan3_min16.dev_attr.attr,
1394	&sensor_dev_attr_fan3_alarm.dev_attr.attr,
1395	NULL
1396}, {
1397	&sensor_dev_attr_fan4_input16.dev_attr.attr,
1398	&sensor_dev_attr_fan4_min16.dev_attr.attr,
1399	&sensor_dev_attr_fan4_alarm.dev_attr.attr,
1400	NULL
1401}, {
1402	&sensor_dev_attr_fan5_input16.dev_attr.attr,
1403	&sensor_dev_attr_fan5_min16.dev_attr.attr,
1404	&sensor_dev_attr_fan5_alarm.dev_attr.attr,
1405	NULL
1406} };
1407
1408static const struct attribute_group it87_group_fan16[5] = {
1409	{ .attrs = it87_attributes_fan16[0] },
1410	{ .attrs = it87_attributes_fan16[1] },
1411	{ .attrs = it87_attributes_fan16[2] },
1412	{ .attrs = it87_attributes_fan16[3] },
1413	{ .attrs = it87_attributes_fan16[4] },
1414};
1415
1416static struct attribute *it87_attributes_fan[3][4+1] = { {
1417	&sensor_dev_attr_fan1_input.dev_attr.attr,
1418	&sensor_dev_attr_fan1_min.dev_attr.attr,
1419	&sensor_dev_attr_fan1_div.dev_attr.attr,
1420	&sensor_dev_attr_fan1_alarm.dev_attr.attr,
1421	NULL
1422}, {
1423	&sensor_dev_attr_fan2_input.dev_attr.attr,
1424	&sensor_dev_attr_fan2_min.dev_attr.attr,
1425	&sensor_dev_attr_fan2_div.dev_attr.attr,
1426	&sensor_dev_attr_fan2_alarm.dev_attr.attr,
1427	NULL
1428}, {
1429	&sensor_dev_attr_fan3_input.dev_attr.attr,
1430	&sensor_dev_attr_fan3_min.dev_attr.attr,
1431	&sensor_dev_attr_fan3_div.dev_attr.attr,
1432	&sensor_dev_attr_fan3_alarm.dev_attr.attr,
1433	NULL
1434} };
1435
1436static const struct attribute_group it87_group_fan[3] = {
1437	{ .attrs = it87_attributes_fan[0] },
1438	{ .attrs = it87_attributes_fan[1] },
1439	{ .attrs = it87_attributes_fan[2] },
1440};
1441
1442static const struct attribute_group *
1443it87_get_fan_group(const struct it87_data *data)
1444{
1445	return has_16bit_fans(data) ? it87_group_fan16 : it87_group_fan;
1446}
1447
1448static struct attribute *it87_attributes_pwm[3][4+1] = { {
1449	&sensor_dev_attr_pwm1_enable.dev_attr.attr,
1450	&sensor_dev_attr_pwm1.dev_attr.attr,
1451	&dev_attr_pwm1_freq.attr,
1452	&sensor_dev_attr_pwm1_auto_channels_temp.dev_attr.attr,
1453	NULL
1454}, {
1455	&sensor_dev_attr_pwm2_enable.dev_attr.attr,
1456	&sensor_dev_attr_pwm2.dev_attr.attr,
1457	&dev_attr_pwm2_freq.attr,
1458	&sensor_dev_attr_pwm2_auto_channels_temp.dev_attr.attr,
1459	NULL
1460}, {
1461	&sensor_dev_attr_pwm3_enable.dev_attr.attr,
1462	&sensor_dev_attr_pwm3.dev_attr.attr,
1463	&dev_attr_pwm3_freq.attr,
1464	&sensor_dev_attr_pwm3_auto_channels_temp.dev_attr.attr,
1465	NULL
1466} };
1467
1468static const struct attribute_group it87_group_pwm[3] = {
1469	{ .attrs = it87_attributes_pwm[0] },
1470	{ .attrs = it87_attributes_pwm[1] },
1471	{ .attrs = it87_attributes_pwm[2] },
1472};
1473
1474static struct attribute *it87_attributes_autopwm[3][9+1] = { {
1475	&sensor_dev_attr_pwm1_auto_point1_pwm.dev_attr.attr,
1476	&sensor_dev_attr_pwm1_auto_point2_pwm.dev_attr.attr,
1477	&sensor_dev_attr_pwm1_auto_point3_pwm.dev_attr.attr,
1478	&sensor_dev_attr_pwm1_auto_point4_pwm.dev_attr.attr,
1479	&sensor_dev_attr_pwm1_auto_point1_temp.dev_attr.attr,
1480	&sensor_dev_attr_pwm1_auto_point1_temp_hyst.dev_attr.attr,
1481	&sensor_dev_attr_pwm1_auto_point2_temp.dev_attr.attr,
1482	&sensor_dev_attr_pwm1_auto_point3_temp.dev_attr.attr,
1483	&sensor_dev_attr_pwm1_auto_point4_temp.dev_attr.attr,
1484	NULL
1485}, {
1486	&sensor_dev_attr_pwm2_auto_point1_pwm.dev_attr.attr,
1487	&sensor_dev_attr_pwm2_auto_point2_pwm.dev_attr.attr,
1488	&sensor_dev_attr_pwm2_auto_point3_pwm.dev_attr.attr,
1489	&sensor_dev_attr_pwm2_auto_point4_pwm.dev_attr.attr,
1490	&sensor_dev_attr_pwm2_auto_point1_temp.dev_attr.attr,
1491	&sensor_dev_attr_pwm2_auto_point1_temp_hyst.dev_attr.attr,
1492	&sensor_dev_attr_pwm2_auto_point2_temp.dev_attr.attr,
1493	&sensor_dev_attr_pwm2_auto_point3_temp.dev_attr.attr,
1494	&sensor_dev_attr_pwm2_auto_point4_temp.dev_attr.attr,
1495	NULL
1496}, {
1497	&sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr,
1498	&sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr,
1499	&sensor_dev_attr_pwm3_auto_point3_pwm.dev_attr.attr,
1500	&sensor_dev_attr_pwm3_auto_point4_pwm.dev_attr.attr,
1501	&sensor_dev_attr_pwm3_auto_point1_temp.dev_attr.attr,
1502	&sensor_dev_attr_pwm3_auto_point1_temp_hyst.dev_attr.attr,
1503	&sensor_dev_attr_pwm3_auto_point2_temp.dev_attr.attr,
1504	&sensor_dev_attr_pwm3_auto_point3_temp.dev_attr.attr,
1505	&sensor_dev_attr_pwm3_auto_point4_temp.dev_attr.attr,
1506	NULL
1507} };
1508
1509static const struct attribute_group it87_group_autopwm[3] = {
1510	{ .attrs = it87_attributes_autopwm[0] },
1511	{ .attrs = it87_attributes_autopwm[1] },
1512	{ .attrs = it87_attributes_autopwm[2] },
1513};
1514
1515static struct attribute *it87_attributes_fan_beep[] = {
1516	&sensor_dev_attr_fan1_beep.dev_attr.attr,
1517	&sensor_dev_attr_fan2_beep.dev_attr.attr,
1518	&sensor_dev_attr_fan3_beep.dev_attr.attr,
1519	&sensor_dev_attr_fan4_beep.dev_attr.attr,
1520	&sensor_dev_attr_fan5_beep.dev_attr.attr,
1521};
1522
1523static struct attribute *it87_attributes_vid[] = {
1524	&dev_attr_vrm.attr,
1525	&dev_attr_cpu0_vid.attr,
1526	NULL
1527};
1528
1529static const struct attribute_group it87_group_vid = {
1530	.attrs = it87_attributes_vid,
1531};
1532
1533static struct attribute *it87_attributes_label[] = {
1534	&sensor_dev_attr_in3_label.dev_attr.attr,
1535	&sensor_dev_attr_in7_label.dev_attr.attr,
1536	&sensor_dev_attr_in8_label.dev_attr.attr,
1537	NULL
1538};
1539
1540static const struct attribute_group it87_group_label = {
1541	.attrs = it87_attributes_label,
1542};
1543
1544/* SuperIO detection - will change isa_address if a chip is found */
1545static int __init it87_find(unsigned short *address,
1546	struct it87_sio_data *sio_data)
1547{
1548	int err;
1549	u16 chip_type;
1550	const char *board_vendor, *board_name;
1551
1552	err = superio_enter();
1553	if (err)
1554		return err;
1555
1556	err = -ENODEV;
1557	chip_type = force_id ? force_id : superio_inw(DEVID);
1558
1559	switch (chip_type) {
1560	case IT8705F_DEVID:
1561		sio_data->type = it87;
1562		break;
1563	case IT8712F_DEVID:
1564		sio_data->type = it8712;
1565		break;
1566	case IT8716F_DEVID:
1567	case IT8726F_DEVID:
1568		sio_data->type = it8716;
1569		break;
1570	case IT8718F_DEVID:
1571		sio_data->type = it8718;
1572		break;
1573	case IT8720F_DEVID:
1574		sio_data->type = it8720;
1575		break;
1576	case IT8721F_DEVID:
1577		sio_data->type = it8721;
1578		break;
1579	case 0xffff:	/* No device at all */
1580		goto exit;
1581	default:
1582		pr_debug("Unsupported chip (DEVID=0x%x)\n", chip_type);
1583		goto exit;
1584	}
1585
1586	superio_select(PME);
1587	if (!(superio_inb(IT87_ACT_REG) & 0x01)) {
1588		pr_info("Device not activated, skipping\n");
1589		goto exit;
1590	}
1591
1592	*address = superio_inw(IT87_BASE_REG) & ~(IT87_EXTENT - 1);
1593	if (*address == 0) {
1594		pr_info("Base address not set, skipping\n");
1595		goto exit;
1596	}
1597
1598	err = 0;
1599	sio_data->revision = superio_inb(DEVREV) & 0x0f;
1600	pr_info("Found IT%04xF chip at 0x%x, revision %d\n",
1601		chip_type, *address, sio_data->revision);
1602
1603	/* in8 (Vbat) is always internal */
1604	sio_data->internal = (1 << 2);
1605
1606	/* Read GPIO config and VID value from LDN 7 (GPIO) */
1607	if (sio_data->type == it87) {
1608		/* The IT8705F doesn't have VID pins at all */
1609		sio_data->skip_vid = 1;
1610
1611		/* The IT8705F has a different LD number for GPIO */
1612		superio_select(5);
1613		sio_data->beep_pin = superio_inb(IT87_SIO_BEEP_PIN_REG) & 0x3f;
1614	} else {
1615		int reg;
1616
1617		superio_select(GPIO);
1618
1619		reg = superio_inb(IT87_SIO_GPIO3_REG);
1620		if (sio_data->type == it8721) {
1621			/* The IT8721F/IT8758E doesn't have VID pins at all */
1622			sio_data->skip_vid = 1;
1623		} else {
1624			/* We need at least 4 VID pins */
1625			if (reg & 0x0f) {
1626				pr_info("VID is disabled (pins used for GPIO)\n");
1627				sio_data->skip_vid = 1;
1628			}
1629		}
1630
1631		/* Check if fan3 is there or not */
1632		if (reg & (1 << 6))
1633			sio_data->skip_pwm |= (1 << 2);
1634		if (reg & (1 << 7))
1635			sio_data->skip_fan |= (1 << 2);
1636
1637		/* Check if fan2 is there or not */
1638		reg = superio_inb(IT87_SIO_GPIO5_REG);
1639		if (reg & (1 << 1))
1640			sio_data->skip_

Large files files are truncated, but you can click here to view the full file