Linux Audio

Check our new training course

Loading...
v3.1
   1/*
   2 *  pc87427.c - hardware monitoring driver for the
   3 *              National Semiconductor PC87427 Super-I/O chip
   4 *  Copyright (C) 2006, 2008, 2010  Jean Delvare <khali@linux-fr.org>
   5 *
   6 *  This program is free software; you can redistribute it and/or modify
   7 *  it under the terms of the GNU General Public License version 2 as
   8 *  published by the Free Software Foundation.
   9 *
  10 *  This program is distributed in the hope that it will be useful,
  11 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 *  GNU General Public License for more details.
  14 *
  15 *  Supports the following chips:
  16 *
  17 *  Chip        #vin    #fan    #pwm    #temp   devid
  18 *  PC87427     -       8       4       6       0xF2
  19 *
  20 *  This driver assumes that no more than one chip is present.
  21 *  Only fans are fully supported so far. Temperatures are in read-only
  22 *  mode, and voltages aren't supported at all.
  23 */
  24
  25#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  26
  27#include <linux/module.h>
  28#include <linux/init.h>
  29#include <linux/slab.h>
  30#include <linux/jiffies.h>
  31#include <linux/platform_device.h>
  32#include <linux/hwmon.h>
  33#include <linux/hwmon-sysfs.h>
  34#include <linux/err.h>
  35#include <linux/mutex.h>
  36#include <linux/sysfs.h>
  37#include <linux/ioport.h>
  38#include <linux/acpi.h>
  39#include <linux/io.h>
  40
  41static unsigned short force_id;
  42module_param(force_id, ushort, 0);
  43MODULE_PARM_DESC(force_id, "Override the detected device ID");
  44
  45static struct platform_device *pdev;
  46
  47#define DRVNAME "pc87427"
  48
  49/* The lock mutex protects both the I/O accesses (needed because the
  50   device is using banked registers) and the register cache (needed to keep
  51   the data in the registers and the cache in sync at any time). */
 
 
  52struct pc87427_data {
  53	struct device *hwmon_dev;
  54	struct mutex lock;
  55	int address[2];
  56	const char *name;
  57
  58	unsigned long last_updated;	/* in jiffies */
  59	u8 fan_enabled;			/* bit vector */
  60	u16 fan[8];			/* register values */
  61	u16 fan_min[8];			/* register values */
  62	u8 fan_status[8];		/* register values */
  63
  64	u8 pwm_enabled;			/* bit vector */
  65	u8 pwm_auto_ok;			/* bit vector */
  66	u8 pwm_enable[4];		/* register values */
  67	u8 pwm[4];			/* register values */
  68
  69	u8 temp_enabled;		/* bit vector */
  70	s16 temp[6];			/* register values */
  71	s8 temp_min[6];			/* register values */
  72	s8 temp_max[6];			/* register values */
  73	s8 temp_crit[6];		/* register values */
  74	u8 temp_status[6];		/* register values */
  75	u8 temp_type[6];		/* register values */
  76};
  77
  78struct pc87427_sio_data {
  79	unsigned short address[2];
  80	u8 has_fanin;
  81	u8 has_fanout;
  82};
  83
  84/*
  85 * Super-I/O registers and operations
  86 */
  87
  88#define SIOREG_LDSEL	0x07	/* Logical device select */
  89#define SIOREG_DEVID	0x20	/* Device ID */
  90#define SIOREG_CF2	0x22	/* Configuration 2 */
  91#define SIOREG_CF3	0x23	/* Configuration 3 */
  92#define SIOREG_CF4	0x24	/* Configuration 4 */
  93#define SIOREG_CF5	0x25	/* Configuration 5 */
  94#define SIOREG_CFB	0x2B	/* Configuration B */
  95#define SIOREG_CFC	0x2C	/* Configuration C */
  96#define SIOREG_CFD	0x2D	/* Configuration D */
  97#define SIOREG_ACT	0x30	/* Device activation */
  98#define SIOREG_MAP	0x50	/* I/O or memory mapping */
  99#define SIOREG_IOBASE	0x60	/* I/O base address */
 100
 101static const u8 logdev[2] = { 0x09, 0x14 };
 102static const char *logdev_str[2] = { DRVNAME " FMC", DRVNAME " HMC" };
 103#define LD_FAN		0
 104#define LD_IN		1
 105#define LD_TEMP		1
 106
 107static inline void superio_outb(int sioaddr, int reg, int val)
 108{
 109	outb(reg, sioaddr);
 110	outb(val, sioaddr + 1);
 111}
 112
 113static inline int superio_inb(int sioaddr, int reg)
 114{
 115	outb(reg, sioaddr);
 116	return inb(sioaddr + 1);
 117}
 118
 119static inline void superio_exit(int sioaddr)
 120{
 121	outb(0x02, sioaddr);
 122	outb(0x02, sioaddr + 1);
 123}
 124
 125/*
 126 * Logical devices
 127 */
 128
 129#define REGION_LENGTH		32
 130#define PC87427_REG_BANK	0x0f
 131#define BANK_FM(nr)		(nr)
 132#define BANK_FT(nr)		(0x08 + (nr))
 133#define BANK_FC(nr)		(0x10 + (nr) * 2)
 134#define BANK_TM(nr)		(nr)
 135#define BANK_VM(nr)		(0x08 + (nr))
 136
 137/*
 138 * I/O access functions
 139 */
 140
 141/* ldi is the logical device index */
 142static inline int pc87427_read8(struct pc87427_data *data, u8 ldi, u8 reg)
 143{
 144	return inb(data->address[ldi] + reg);
 145}
 146
 147/* Must be called with data->lock held, except during init */
 148static inline int pc87427_read8_bank(struct pc87427_data *data, u8 ldi,
 149				     u8 bank, u8 reg)
 150{
 151	outb(bank, data->address[ldi] + PC87427_REG_BANK);
 152	return inb(data->address[ldi] + reg);
 153}
 154
 155/* Must be called with data->lock held, except during init */
 156static inline void pc87427_write8_bank(struct pc87427_data *data, u8 ldi,
 157				       u8 bank, u8 reg, u8 value)
 158{
 159	outb(bank, data->address[ldi] + PC87427_REG_BANK);
 160	outb(value, data->address[ldi] + reg);
 161}
 162
 163/*
 164 * Fan registers and conversions
 165 */
 166
 167/* fan data registers are 16-bit wide */
 168#define PC87427_REG_FAN			0x12
 169#define PC87427_REG_FAN_MIN		0x14
 170#define PC87427_REG_FAN_STATUS		0x10
 171
 172#define FAN_STATUS_STALL		(1 << 3)
 173#define FAN_STATUS_LOSPD		(1 << 1)
 174#define FAN_STATUS_MONEN		(1 << 0)
 175
 176/* Dedicated function to read all registers related to a given fan input.
 177   This saves us quite a few locks and bank selections.
 178   Must be called with data->lock held.
 179   nr is from 0 to 7 */
 
 
 180static void pc87427_readall_fan(struct pc87427_data *data, u8 nr)
 181{
 182	int iobase = data->address[LD_FAN];
 183
 184	outb(BANK_FM(nr), iobase + PC87427_REG_BANK);
 185	data->fan[nr] = inw(iobase + PC87427_REG_FAN);
 186	data->fan_min[nr] = inw(iobase + PC87427_REG_FAN_MIN);
 187	data->fan_status[nr] = inb(iobase + PC87427_REG_FAN_STATUS);
 188	/* Clear fan alarm bits */
 189	outb(data->fan_status[nr], iobase + PC87427_REG_FAN_STATUS);
 190}
 191
 192/* The 2 LSB of fan speed registers are used for something different.
 193   The actual 2 LSB of the measurements are not available. */
 
 
 194static inline unsigned long fan_from_reg(u16 reg)
 195{
 196	reg &= 0xfffc;
 197	if (reg == 0x0000 || reg == 0xfffc)
 198		return 0;
 199	return 5400000UL / reg;
 200}
 201
 202/* The 2 LSB of the fan speed limit registers are not significant. */
 203static inline u16 fan_to_reg(unsigned long val)
 204{
 205	if (val < 83UL)
 206		return 0xffff;
 207	if (val >= 1350000UL)
 208		return 0x0004;
 209	return ((1350000UL + val / 2) / val) << 2;
 210}
 211
 212/*
 213 * PWM registers and conversions
 214 */
 215
 216#define PC87427_REG_PWM_ENABLE		0x10
 217#define PC87427_REG_PWM_DUTY		0x12
 218
 219#define PWM_ENABLE_MODE_MASK		(7 << 4)
 220#define PWM_ENABLE_CTLEN		(1 << 0)
 221
 222#define PWM_MODE_MANUAL			(0 << 4)
 223#define PWM_MODE_AUTO			(1 << 4)
 224#define PWM_MODE_OFF			(2 << 4)
 225#define PWM_MODE_ON			(7 << 4)
 226
 227/* Dedicated function to read all registers related to a given PWM output.
 228   This saves us quite a few locks and bank selections.
 229   Must be called with data->lock held.
 230   nr is from 0 to 3 */
 
 
 231static void pc87427_readall_pwm(struct pc87427_data *data, u8 nr)
 232{
 233	int iobase = data->address[LD_FAN];
 234
 235	outb(BANK_FC(nr), iobase + PC87427_REG_BANK);
 236	data->pwm_enable[nr] = inb(iobase + PC87427_REG_PWM_ENABLE);
 237	data->pwm[nr] = inb(iobase + PC87427_REG_PWM_DUTY);
 238}
 239
 240static inline int pwm_enable_from_reg(u8 reg)
 241{
 242	switch (reg & PWM_ENABLE_MODE_MASK) {
 243	case PWM_MODE_ON:
 244		return 0;
 245	case PWM_MODE_MANUAL:
 246	case PWM_MODE_OFF:
 247		return 1;
 248	case PWM_MODE_AUTO:
 249		return 2;
 250	default:
 251		return -EPROTO;
 252	}
 253}
 254
 255static inline u8 pwm_enable_to_reg(unsigned long val, u8 pwmval)
 256{
 257	switch (val) {
 258	default:
 259		return PWM_MODE_ON;
 260	case 1:
 261		return pwmval ? PWM_MODE_MANUAL : PWM_MODE_OFF;
 262	case 2:
 263		return PWM_MODE_AUTO;
 264	}
 265}
 266
 267/*
 268 * Temperature registers and conversions
 269 */
 270
 271#define PC87427_REG_TEMP_STATUS		0x10
 272#define PC87427_REG_TEMP		0x14
 273#define PC87427_REG_TEMP_MAX		0x18
 274#define PC87427_REG_TEMP_MIN		0x19
 275#define PC87427_REG_TEMP_CRIT		0x1a
 276#define PC87427_REG_TEMP_TYPE		0x1d
 277
 278#define TEMP_STATUS_CHANEN		(1 << 0)
 279#define TEMP_STATUS_LOWFLG		(1 << 1)
 280#define TEMP_STATUS_HIGHFLG		(1 << 2)
 281#define TEMP_STATUS_CRITFLG		(1 << 3)
 282#define TEMP_STATUS_SENSERR		(1 << 5)
 283#define TEMP_TYPE_MASK			(3 << 5)
 284
 285#define TEMP_TYPE_THERMISTOR		(1 << 5)
 286#define TEMP_TYPE_REMOTE_DIODE		(2 << 5)
 287#define TEMP_TYPE_LOCAL_DIODE		(3 << 5)
 288
 289/* Dedicated function to read all registers related to a given temperature
 290   input. This saves us quite a few locks and bank selections.
 291   Must be called with data->lock held.
 292   nr is from 0 to 5 */
 
 
 293static void pc87427_readall_temp(struct pc87427_data *data, u8 nr)
 294{
 295	int iobase = data->address[LD_TEMP];
 296
 297	outb(BANK_TM(nr), iobase + PC87427_REG_BANK);
 298	data->temp[nr] = le16_to_cpu(inw(iobase + PC87427_REG_TEMP));
 299	data->temp_max[nr] = inb(iobase + PC87427_REG_TEMP_MAX);
 300	data->temp_min[nr] = inb(iobase + PC87427_REG_TEMP_MIN);
 301	data->temp_crit[nr] = inb(iobase + PC87427_REG_TEMP_CRIT);
 302	data->temp_type[nr] = inb(iobase + PC87427_REG_TEMP_TYPE);
 303	data->temp_status[nr] = inb(iobase + PC87427_REG_TEMP_STATUS);
 304	/* Clear fan alarm bits */
 305	outb(data->temp_status[nr], iobase + PC87427_REG_TEMP_STATUS);
 306}
 307
 308static inline unsigned int temp_type_from_reg(u8 reg)
 309{
 310	switch (reg & TEMP_TYPE_MASK) {
 311	case TEMP_TYPE_THERMISTOR:
 312		return 4;
 313	case TEMP_TYPE_REMOTE_DIODE:
 314	case TEMP_TYPE_LOCAL_DIODE:
 315		return 3;
 316	default:
 317		return 0;
 318	}
 319}
 320
 321/* We assume 8-bit thermal sensors; 9-bit thermal sensors are possible
 322   too, but I have no idea how to figure out when they are used. */
 
 
 323static inline long temp_from_reg(s16 reg)
 324{
 325	return reg * 1000 / 256;
 326}
 327
 328static inline long temp_from_reg8(s8 reg)
 329{
 330	return reg * 1000;
 331}
 332
 333/*
 334 * Data interface
 335 */
 336
 337static struct pc87427_data *pc87427_update_device(struct device *dev)
 338{
 339	struct pc87427_data *data = dev_get_drvdata(dev);
 340	int i;
 341
 342	mutex_lock(&data->lock);
 343	if (!time_after(jiffies, data->last_updated + HZ)
 344	 && data->last_updated)
 345		goto done;
 346
 347	/* Fans */
 348	for (i = 0; i < 8; i++) {
 349		if (!(data->fan_enabled & (1 << i)))
 350			continue;
 351		pc87427_readall_fan(data, i);
 352	}
 353
 354	/* PWM outputs */
 355	for (i = 0; i < 4; i++) {
 356		if (!(data->pwm_enabled & (1 << i)))
 357			continue;
 358		pc87427_readall_pwm(data, i);
 359	}
 360
 361	/* Temperature channels */
 362	for (i = 0; i < 6; i++) {
 363		if (!(data->temp_enabled & (1 << i)))
 364			continue;
 365		pc87427_readall_temp(data, i);
 366	}
 367
 368	data->last_updated = jiffies;
 369
 370done:
 371	mutex_unlock(&data->lock);
 372	return data;
 373}
 374
 375static ssize_t show_fan_input(struct device *dev, struct device_attribute
 376			      *devattr, char *buf)
 377{
 378	struct pc87427_data *data = pc87427_update_device(dev);
 379	int nr = to_sensor_dev_attr(devattr)->index;
 380
 381	return sprintf(buf, "%lu\n", fan_from_reg(data->fan[nr]));
 382}
 383
 384static ssize_t show_fan_min(struct device *dev, struct device_attribute
 385			    *devattr, char *buf)
 386{
 387	struct pc87427_data *data = pc87427_update_device(dev);
 388	int nr = to_sensor_dev_attr(devattr)->index;
 389
 390	return sprintf(buf, "%lu\n", fan_from_reg(data->fan_min[nr]));
 391}
 392
 393static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
 394			      *devattr, char *buf)
 395{
 396	struct pc87427_data *data = pc87427_update_device(dev);
 397	int nr = to_sensor_dev_attr(devattr)->index;
 398
 399	return sprintf(buf, "%d\n", !!(data->fan_status[nr]
 400				       & FAN_STATUS_LOSPD));
 401}
 402
 403static ssize_t show_fan_fault(struct device *dev, struct device_attribute
 404			      *devattr, char *buf)
 405{
 406	struct pc87427_data *data = pc87427_update_device(dev);
 407	int nr = to_sensor_dev_attr(devattr)->index;
 408
 409	return sprintf(buf, "%d\n", !!(data->fan_status[nr]
 410				       & FAN_STATUS_STALL));
 411}
 412
 413static ssize_t set_fan_min(struct device *dev, struct device_attribute
 414			   *devattr, const char *buf, size_t count)
 415{
 416	struct pc87427_data *data = dev_get_drvdata(dev);
 417	int nr = to_sensor_dev_attr(devattr)->index;
 418	unsigned long val;
 419	int iobase = data->address[LD_FAN];
 420
 421	if (strict_strtoul(buf, 10, &val) < 0)
 422		return -EINVAL;
 423
 424	mutex_lock(&data->lock);
 425	outb(BANK_FM(nr), iobase + PC87427_REG_BANK);
 426	/* The low speed limit registers are read-only while monitoring
 427	   is enabled, so we have to disable monitoring, then change the
 428	   limit, and finally enable monitoring again. */
 
 
 429	outb(0, iobase + PC87427_REG_FAN_STATUS);
 430	data->fan_min[nr] = fan_to_reg(val);
 431	outw(data->fan_min[nr], iobase + PC87427_REG_FAN_MIN);
 432	outb(FAN_STATUS_MONEN, iobase + PC87427_REG_FAN_STATUS);
 433	mutex_unlock(&data->lock);
 434
 435	return count;
 436}
 437
 438static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan_input, NULL, 0);
 439static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan_input, NULL, 1);
 440static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan_input, NULL, 2);
 441static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_fan_input, NULL, 3);
 442static SENSOR_DEVICE_ATTR(fan5_input, S_IRUGO, show_fan_input, NULL, 4);
 443static SENSOR_DEVICE_ATTR(fan6_input, S_IRUGO, show_fan_input, NULL, 5);
 444static SENSOR_DEVICE_ATTR(fan7_input, S_IRUGO, show_fan_input, NULL, 6);
 445static SENSOR_DEVICE_ATTR(fan8_input, S_IRUGO, show_fan_input, NULL, 7);
 446
 447static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO,
 448			  show_fan_min, set_fan_min, 0);
 449static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO,
 450			  show_fan_min, set_fan_min, 1);
 451static SENSOR_DEVICE_ATTR(fan3_min, S_IWUSR | S_IRUGO,
 452			  show_fan_min, set_fan_min, 2);
 453static SENSOR_DEVICE_ATTR(fan4_min, S_IWUSR | S_IRUGO,
 454			  show_fan_min, set_fan_min, 3);
 455static SENSOR_DEVICE_ATTR(fan5_min, S_IWUSR | S_IRUGO,
 456			  show_fan_min, set_fan_min, 4);
 457static SENSOR_DEVICE_ATTR(fan6_min, S_IWUSR | S_IRUGO,
 458			  show_fan_min, set_fan_min, 5);
 459static SENSOR_DEVICE_ATTR(fan7_min, S_IWUSR | S_IRUGO,
 460			  show_fan_min, set_fan_min, 6);
 461static SENSOR_DEVICE_ATTR(fan8_min, S_IWUSR | S_IRUGO,
 462			  show_fan_min, set_fan_min, 7);
 463
 464static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_fan_alarm, NULL, 0);
 465static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_fan_alarm, NULL, 1);
 466static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 2);
 467static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 3);
 468static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO, show_fan_alarm, NULL, 4);
 469static SENSOR_DEVICE_ATTR(fan6_alarm, S_IRUGO, show_fan_alarm, NULL, 5);
 470static SENSOR_DEVICE_ATTR(fan7_alarm, S_IRUGO, show_fan_alarm, NULL, 6);
 471static SENSOR_DEVICE_ATTR(fan8_alarm, S_IRUGO, show_fan_alarm, NULL, 7);
 472
 473static SENSOR_DEVICE_ATTR(fan1_fault, S_IRUGO, show_fan_fault, NULL, 0);
 474static SENSOR_DEVICE_ATTR(fan2_fault, S_IRUGO, show_fan_fault, NULL, 1);
 475static SENSOR_DEVICE_ATTR(fan3_fault, S_IRUGO, show_fan_fault, NULL, 2);
 476static SENSOR_DEVICE_ATTR(fan4_fault, S_IRUGO, show_fan_fault, NULL, 3);
 477static SENSOR_DEVICE_ATTR(fan5_fault, S_IRUGO, show_fan_fault, NULL, 4);
 478static SENSOR_DEVICE_ATTR(fan6_fault, S_IRUGO, show_fan_fault, NULL, 5);
 479static SENSOR_DEVICE_ATTR(fan7_fault, S_IRUGO, show_fan_fault, NULL, 6);
 480static SENSOR_DEVICE_ATTR(fan8_fault, S_IRUGO, show_fan_fault, NULL, 7);
 481
 482static struct attribute *pc87427_attributes_fan[8][5] = {
 483	{
 484		&sensor_dev_attr_fan1_input.dev_attr.attr,
 485		&sensor_dev_attr_fan1_min.dev_attr.attr,
 486		&sensor_dev_attr_fan1_alarm.dev_attr.attr,
 487		&sensor_dev_attr_fan1_fault.dev_attr.attr,
 488		NULL
 489	}, {
 490		&sensor_dev_attr_fan2_input.dev_attr.attr,
 491		&sensor_dev_attr_fan2_min.dev_attr.attr,
 492		&sensor_dev_attr_fan2_alarm.dev_attr.attr,
 493		&sensor_dev_attr_fan2_fault.dev_attr.attr,
 494		NULL
 495	}, {
 496		&sensor_dev_attr_fan3_input.dev_attr.attr,
 497		&sensor_dev_attr_fan3_min.dev_attr.attr,
 498		&sensor_dev_attr_fan3_alarm.dev_attr.attr,
 499		&sensor_dev_attr_fan3_fault.dev_attr.attr,
 500		NULL
 501	}, {
 502		&sensor_dev_attr_fan4_input.dev_attr.attr,
 503		&sensor_dev_attr_fan4_min.dev_attr.attr,
 504		&sensor_dev_attr_fan4_alarm.dev_attr.attr,
 505		&sensor_dev_attr_fan4_fault.dev_attr.attr,
 506		NULL
 507	}, {
 508		&sensor_dev_attr_fan5_input.dev_attr.attr,
 509		&sensor_dev_attr_fan5_min.dev_attr.attr,
 510		&sensor_dev_attr_fan5_alarm.dev_attr.attr,
 511		&sensor_dev_attr_fan5_fault.dev_attr.attr,
 512		NULL
 513	}, {
 514		&sensor_dev_attr_fan6_input.dev_attr.attr,
 515		&sensor_dev_attr_fan6_min.dev_attr.attr,
 516		&sensor_dev_attr_fan6_alarm.dev_attr.attr,
 517		&sensor_dev_attr_fan6_fault.dev_attr.attr,
 518		NULL
 519	}, {
 520		&sensor_dev_attr_fan7_input.dev_attr.attr,
 521		&sensor_dev_attr_fan7_min.dev_attr.attr,
 522		&sensor_dev_attr_fan7_alarm.dev_attr.attr,
 523		&sensor_dev_attr_fan7_fault.dev_attr.attr,
 524		NULL
 525	}, {
 526		&sensor_dev_attr_fan8_input.dev_attr.attr,
 527		&sensor_dev_attr_fan8_min.dev_attr.attr,
 528		&sensor_dev_attr_fan8_alarm.dev_attr.attr,
 529		&sensor_dev_attr_fan8_fault.dev_attr.attr,
 530		NULL
 531	}
 532};
 533
 534static const struct attribute_group pc87427_group_fan[8] = {
 535	{ .attrs = pc87427_attributes_fan[0] },
 536	{ .attrs = pc87427_attributes_fan[1] },
 537	{ .attrs = pc87427_attributes_fan[2] },
 538	{ .attrs = pc87427_attributes_fan[3] },
 539	{ .attrs = pc87427_attributes_fan[4] },
 540	{ .attrs = pc87427_attributes_fan[5] },
 541	{ .attrs = pc87427_attributes_fan[6] },
 542	{ .attrs = pc87427_attributes_fan[7] },
 543};
 544
 545/* Must be called with data->lock held and pc87427_readall_pwm() freshly
 546   called */
 
 
 547static void update_pwm_enable(struct pc87427_data *data, int nr, u8 mode)
 548{
 549	int iobase = data->address[LD_FAN];
 550	data->pwm_enable[nr] &= ~PWM_ENABLE_MODE_MASK;
 551	data->pwm_enable[nr] |= mode;
 552	outb(data->pwm_enable[nr], iobase + PC87427_REG_PWM_ENABLE);
 553}
 554
 555static ssize_t show_pwm_enable(struct device *dev, struct device_attribute
 556			       *devattr, char *buf)
 557{
 558	struct pc87427_data *data = pc87427_update_device(dev);
 559	int nr = to_sensor_dev_attr(devattr)->index;
 560	int pwm_enable;
 561
 562	pwm_enable = pwm_enable_from_reg(data->pwm_enable[nr]);
 563	if (pwm_enable < 0)
 564		return pwm_enable;
 565	return sprintf(buf, "%d\n", pwm_enable);
 566}
 567
 568static ssize_t set_pwm_enable(struct device *dev, struct device_attribute
 569			      *devattr, const char *buf, size_t count)
 570{
 571	struct pc87427_data *data = dev_get_drvdata(dev);
 572	int nr = to_sensor_dev_attr(devattr)->index;
 573	unsigned long val;
 574
 575	if (strict_strtoul(buf, 10, &val) < 0 || val > 2)
 576		return -EINVAL;
 577	/* Can't go to automatic mode if it isn't configured */
 578	if (val == 2 && !(data->pwm_auto_ok & (1 << nr)))
 579		return -EINVAL;
 580
 581	mutex_lock(&data->lock);
 582	pc87427_readall_pwm(data, nr);
 583	update_pwm_enable(data, nr, pwm_enable_to_reg(val, data->pwm[nr]));
 584	mutex_unlock(&data->lock);
 585
 586	return count;
 587}
 588
 589static ssize_t show_pwm(struct device *dev, struct device_attribute
 590			*devattr, char *buf)
 591{
 592	struct pc87427_data *data = pc87427_update_device(dev);
 593	int nr = to_sensor_dev_attr(devattr)->index;
 594
 595	return sprintf(buf, "%d\n", (int)data->pwm[nr]);
 596}
 597
 598static ssize_t set_pwm(struct device *dev, struct device_attribute
 599		       *devattr, const char *buf, size_t count)
 600{
 601	struct pc87427_data *data = dev_get_drvdata(dev);
 602	int nr = to_sensor_dev_attr(devattr)->index;
 603	unsigned long val;
 604	int iobase = data->address[LD_FAN];
 605	u8 mode;
 606
 607	if (strict_strtoul(buf, 10, &val) < 0 || val > 0xff)
 608		return -EINVAL;
 609
 610	mutex_lock(&data->lock);
 611	pc87427_readall_pwm(data, nr);
 612	mode = data->pwm_enable[nr] & PWM_ENABLE_MODE_MASK;
 613	if (mode != PWM_MODE_MANUAL && mode != PWM_MODE_OFF) {
 614		dev_notice(dev, "Can't set PWM%d duty cycle while not in "
 615			   "manual mode\n", nr + 1);
 616		mutex_unlock(&data->lock);
 617		return -EPERM;
 618	}
 619
 620	/* We may have to change the mode */
 621	if (mode == PWM_MODE_MANUAL && val == 0) {
 622		/* Transition from Manual to Off */
 623		update_pwm_enable(data, nr, PWM_MODE_OFF);
 624		mode = PWM_MODE_OFF;
 625		dev_dbg(dev, "Switching PWM%d from %s to %s\n", nr + 1,
 626			"manual", "off");
 627	} else if (mode == PWM_MODE_OFF && val != 0) {
 628		/* Transition from Off to Manual */
 629		update_pwm_enable(data, nr, PWM_MODE_MANUAL);
 630		mode = PWM_MODE_MANUAL;
 631		dev_dbg(dev, "Switching PWM%d from %s to %s\n", nr + 1,
 632			"off", "manual");
 633	}
 634
 635	data->pwm[nr] = val;
 636	if (mode == PWM_MODE_MANUAL)
 637		outb(val, iobase + PC87427_REG_PWM_DUTY);
 638	mutex_unlock(&data->lock);
 639
 640	return count;
 641}
 642
 643static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO,
 644			  show_pwm_enable, set_pwm_enable, 0);
 645static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO,
 646			  show_pwm_enable, set_pwm_enable, 1);
 647static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO,
 648			  show_pwm_enable, set_pwm_enable, 2);
 649static SENSOR_DEVICE_ATTR(pwm4_enable, S_IWUSR | S_IRUGO,
 650			  show_pwm_enable, set_pwm_enable, 3);
 651
 652static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 0);
 653static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 1);
 654static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 2);
 655static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 3);
 656
 657static struct attribute *pc87427_attributes_pwm[4][3] = {
 658	{
 659		&sensor_dev_attr_pwm1_enable.dev_attr.attr,
 660		&sensor_dev_attr_pwm1.dev_attr.attr,
 661		NULL
 662	}, {
 663		&sensor_dev_attr_pwm2_enable.dev_attr.attr,
 664		&sensor_dev_attr_pwm2.dev_attr.attr,
 665		NULL
 666	}, {
 667		&sensor_dev_attr_pwm3_enable.dev_attr.attr,
 668		&sensor_dev_attr_pwm3.dev_attr.attr,
 669		NULL
 670	}, {
 671		&sensor_dev_attr_pwm4_enable.dev_attr.attr,
 672		&sensor_dev_attr_pwm4.dev_attr.attr,
 673		NULL
 674	}
 675};
 676
 677static const struct attribute_group pc87427_group_pwm[4] = {
 678	{ .attrs = pc87427_attributes_pwm[0] },
 679	{ .attrs = pc87427_attributes_pwm[1] },
 680	{ .attrs = pc87427_attributes_pwm[2] },
 681	{ .attrs = pc87427_attributes_pwm[3] },
 682};
 683
 684static ssize_t show_temp_input(struct device *dev, struct device_attribute
 685			       *devattr, char *buf)
 686{
 687	struct pc87427_data *data = pc87427_update_device(dev);
 688	int nr = to_sensor_dev_attr(devattr)->index;
 689
 690	return sprintf(buf, "%ld\n", temp_from_reg(data->temp[nr]));
 691}
 692
 693static ssize_t show_temp_min(struct device *dev, struct device_attribute
 694			     *devattr, char *buf)
 695{
 696	struct pc87427_data *data = pc87427_update_device(dev);
 697	int nr = to_sensor_dev_attr(devattr)->index;
 698
 699	return sprintf(buf, "%ld\n", temp_from_reg8(data->temp_min[nr]));
 700}
 701
 702static ssize_t show_temp_max(struct device *dev, struct device_attribute
 703			     *devattr, char *buf)
 704{
 705	struct pc87427_data *data = pc87427_update_device(dev);
 706	int nr = to_sensor_dev_attr(devattr)->index;
 707
 708	return sprintf(buf, "%ld\n", temp_from_reg8(data->temp_max[nr]));
 709}
 710
 711static ssize_t show_temp_crit(struct device *dev, struct device_attribute
 712			      *devattr, char *buf)
 713{
 714	struct pc87427_data *data = pc87427_update_device(dev);
 715	int nr = to_sensor_dev_attr(devattr)->index;
 716
 717	return sprintf(buf, "%ld\n", temp_from_reg8(data->temp_crit[nr]));
 718}
 719
 720static ssize_t show_temp_type(struct device *dev, struct device_attribute
 721			      *devattr, char *buf)
 722{
 723	struct pc87427_data *data = pc87427_update_device(dev);
 724	int nr = to_sensor_dev_attr(devattr)->index;
 725
 726	return sprintf(buf, "%u\n", temp_type_from_reg(data->temp_type[nr]));
 727}
 728
 729static ssize_t show_temp_min_alarm(struct device *dev, struct device_attribute
 730				   *devattr, char *buf)
 731{
 732	struct pc87427_data *data = pc87427_update_device(dev);
 733	int nr = to_sensor_dev_attr(devattr)->index;
 734
 735	return sprintf(buf, "%d\n", !!(data->temp_status[nr]
 736				       & TEMP_STATUS_LOWFLG));
 737}
 738
 739static ssize_t show_temp_max_alarm(struct device *dev, struct device_attribute
 740				   *devattr, char *buf)
 741{
 742	struct pc87427_data *data = pc87427_update_device(dev);
 743	int nr = to_sensor_dev_attr(devattr)->index;
 744
 745	return sprintf(buf, "%d\n", !!(data->temp_status[nr]
 746				       & TEMP_STATUS_HIGHFLG));
 747}
 748
 749static ssize_t show_temp_crit_alarm(struct device *dev, struct device_attribute
 750				   *devattr, char *buf)
 751{
 752	struct pc87427_data *data = pc87427_update_device(dev);
 753	int nr = to_sensor_dev_attr(devattr)->index;
 754
 755	return sprintf(buf, "%d\n", !!(data->temp_status[nr]
 756				       & TEMP_STATUS_CRITFLG));
 757}
 758
 759static ssize_t show_temp_fault(struct device *dev, struct device_attribute
 760			       *devattr, char *buf)
 761{
 762	struct pc87427_data *data = pc87427_update_device(dev);
 763	int nr = to_sensor_dev_attr(devattr)->index;
 764
 765	return sprintf(buf, "%d\n", !!(data->temp_status[nr]
 766				       & TEMP_STATUS_SENSERR));
 767}
 768
 769static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp_input, NULL, 0);
 770static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp_input, NULL, 1);
 771static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp_input, NULL, 2);
 772static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_temp_input, NULL, 3);
 773static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO, show_temp_input, NULL, 4);
 774static SENSOR_DEVICE_ATTR(temp6_input, S_IRUGO, show_temp_input, NULL, 5);
 775
 776static SENSOR_DEVICE_ATTR(temp1_min, S_IRUGO, show_temp_min, NULL, 0);
 777static SENSOR_DEVICE_ATTR(temp2_min, S_IRUGO, show_temp_min, NULL, 1);
 778static SENSOR_DEVICE_ATTR(temp3_min, S_IRUGO, show_temp_min, NULL, 2);
 779static SENSOR_DEVICE_ATTR(temp4_min, S_IRUGO, show_temp_min, NULL, 3);
 780static SENSOR_DEVICE_ATTR(temp5_min, S_IRUGO, show_temp_min, NULL, 4);
 781static SENSOR_DEVICE_ATTR(temp6_min, S_IRUGO, show_temp_min, NULL, 5);
 782
 783static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO, show_temp_max, NULL, 0);
 784static SENSOR_DEVICE_ATTR(temp2_max, S_IRUGO, show_temp_max, NULL, 1);
 785static SENSOR_DEVICE_ATTR(temp3_max, S_IRUGO, show_temp_max, NULL, 2);
 786static SENSOR_DEVICE_ATTR(temp4_max, S_IRUGO, show_temp_max, NULL, 3);
 787static SENSOR_DEVICE_ATTR(temp5_max, S_IRUGO, show_temp_max, NULL, 4);
 788static SENSOR_DEVICE_ATTR(temp6_max, S_IRUGO, show_temp_max, NULL, 5);
 789
 790static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, show_temp_crit, NULL, 0);
 791static SENSOR_DEVICE_ATTR(temp2_crit, S_IRUGO, show_temp_crit, NULL, 1);
 792static SENSOR_DEVICE_ATTR(temp3_crit, S_IRUGO, show_temp_crit, NULL, 2);
 793static SENSOR_DEVICE_ATTR(temp4_crit, S_IRUGO, show_temp_crit, NULL, 3);
 794static SENSOR_DEVICE_ATTR(temp5_crit, S_IRUGO, show_temp_crit, NULL, 4);
 795static SENSOR_DEVICE_ATTR(temp6_crit, S_IRUGO, show_temp_crit, NULL, 5);
 796
 797static SENSOR_DEVICE_ATTR(temp1_type, S_IRUGO, show_temp_type, NULL, 0);
 798static SENSOR_DEVICE_ATTR(temp2_type, S_IRUGO, show_temp_type, NULL, 1);
 799static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO, show_temp_type, NULL, 2);
 800static SENSOR_DEVICE_ATTR(temp4_type, S_IRUGO, show_temp_type, NULL, 3);
 801static SENSOR_DEVICE_ATTR(temp5_type, S_IRUGO, show_temp_type, NULL, 4);
 802static SENSOR_DEVICE_ATTR(temp6_type, S_IRUGO, show_temp_type, NULL, 5);
 803
 804static SENSOR_DEVICE_ATTR(temp1_min_alarm, S_IRUGO,
 805			  show_temp_min_alarm, NULL, 0);
 806static SENSOR_DEVICE_ATTR(temp2_min_alarm, S_IRUGO,
 807			  show_temp_min_alarm, NULL, 1);
 808static SENSOR_DEVICE_ATTR(temp3_min_alarm, S_IRUGO,
 809			  show_temp_min_alarm, NULL, 2);
 810static SENSOR_DEVICE_ATTR(temp4_min_alarm, S_IRUGO,
 811			  show_temp_min_alarm, NULL, 3);
 812static SENSOR_DEVICE_ATTR(temp5_min_alarm, S_IRUGO,
 813			  show_temp_min_alarm, NULL, 4);
 814static SENSOR_DEVICE_ATTR(temp6_min_alarm, S_IRUGO,
 815			  show_temp_min_alarm, NULL, 5);
 816
 817static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO,
 818			  show_temp_max_alarm, NULL, 0);
 819static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO,
 820			  show_temp_max_alarm, NULL, 1);
 821static SENSOR_DEVICE_ATTR(temp3_max_alarm, S_IRUGO,
 822			  show_temp_max_alarm, NULL, 2);
 823static SENSOR_DEVICE_ATTR(temp4_max_alarm, S_IRUGO,
 824			  show_temp_max_alarm, NULL, 3);
 825static SENSOR_DEVICE_ATTR(temp5_max_alarm, S_IRUGO,
 826			  show_temp_max_alarm, NULL, 4);
 827static SENSOR_DEVICE_ATTR(temp6_max_alarm, S_IRUGO,
 828			  show_temp_max_alarm, NULL, 5);
 829
 830static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO,
 831			  show_temp_crit_alarm, NULL, 0);
 832static SENSOR_DEVICE_ATTR(temp2_crit_alarm, S_IRUGO,
 833			  show_temp_crit_alarm, NULL, 1);
 834static SENSOR_DEVICE_ATTR(temp3_crit_alarm, S_IRUGO,
 835			  show_temp_crit_alarm, NULL, 2);
 836static SENSOR_DEVICE_ATTR(temp4_crit_alarm, S_IRUGO,
 837			  show_temp_crit_alarm, NULL, 3);
 838static SENSOR_DEVICE_ATTR(temp5_crit_alarm, S_IRUGO,
 839			  show_temp_crit_alarm, NULL, 4);
 840static SENSOR_DEVICE_ATTR(temp6_crit_alarm, S_IRUGO,
 841			  show_temp_crit_alarm, NULL, 5);
 842
 843static SENSOR_DEVICE_ATTR(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0);
 844static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_temp_fault, NULL, 1);
 845static SENSOR_DEVICE_ATTR(temp3_fault, S_IRUGO, show_temp_fault, NULL, 2);
 846static SENSOR_DEVICE_ATTR(temp4_fault, S_IRUGO, show_temp_fault, NULL, 3);
 847static SENSOR_DEVICE_ATTR(temp5_fault, S_IRUGO, show_temp_fault, NULL, 4);
 848static SENSOR_DEVICE_ATTR(temp6_fault, S_IRUGO, show_temp_fault, NULL, 5);
 849
 850static struct attribute *pc87427_attributes_temp[6][10] = {
 851	{
 852		&sensor_dev_attr_temp1_input.dev_attr.attr,
 853		&sensor_dev_attr_temp1_min.dev_attr.attr,
 854		&sensor_dev_attr_temp1_max.dev_attr.attr,
 855		&sensor_dev_attr_temp1_crit.dev_attr.attr,
 856		&sensor_dev_attr_temp1_type.dev_attr.attr,
 857		&sensor_dev_attr_temp1_min_alarm.dev_attr.attr,
 858		&sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
 859		&sensor_dev_attr_temp1_crit_alarm.dev_attr.attr,
 860		&sensor_dev_attr_temp1_fault.dev_attr.attr,
 861		NULL
 862	}, {
 863		&sensor_dev_attr_temp2_input.dev_attr.attr,
 864		&sensor_dev_attr_temp2_min.dev_attr.attr,
 865		&sensor_dev_attr_temp2_max.dev_attr.attr,
 866		&sensor_dev_attr_temp2_crit.dev_attr.attr,
 867		&sensor_dev_attr_temp2_type.dev_attr.attr,
 868		&sensor_dev_attr_temp2_min_alarm.dev_attr.attr,
 869		&sensor_dev_attr_temp2_max_alarm.dev_attr.attr,
 870		&sensor_dev_attr_temp2_crit_alarm.dev_attr.attr,
 871		&sensor_dev_attr_temp2_fault.dev_attr.attr,
 872		NULL
 873	}, {
 874		&sensor_dev_attr_temp3_input.dev_attr.attr,
 875		&sensor_dev_attr_temp3_min.dev_attr.attr,
 876		&sensor_dev_attr_temp3_max.dev_attr.attr,
 877		&sensor_dev_attr_temp3_crit.dev_attr.attr,
 878		&sensor_dev_attr_temp3_type.dev_attr.attr,
 879		&sensor_dev_attr_temp3_min_alarm.dev_attr.attr,
 880		&sensor_dev_attr_temp3_max_alarm.dev_attr.attr,
 881		&sensor_dev_attr_temp3_crit_alarm.dev_attr.attr,
 882		&sensor_dev_attr_temp3_fault.dev_attr.attr,
 883		NULL
 884	}, {
 885		&sensor_dev_attr_temp4_input.dev_attr.attr,
 886		&sensor_dev_attr_temp4_min.dev_attr.attr,
 887		&sensor_dev_attr_temp4_max.dev_attr.attr,
 888		&sensor_dev_attr_temp4_crit.dev_attr.attr,
 889		&sensor_dev_attr_temp4_type.dev_attr.attr,
 890		&sensor_dev_attr_temp4_min_alarm.dev_attr.attr,
 891		&sensor_dev_attr_temp4_max_alarm.dev_attr.attr,
 892		&sensor_dev_attr_temp4_crit_alarm.dev_attr.attr,
 893		&sensor_dev_attr_temp4_fault.dev_attr.attr,
 894		NULL
 895	}, {
 896		&sensor_dev_attr_temp5_input.dev_attr.attr,
 897		&sensor_dev_attr_temp5_min.dev_attr.attr,
 898		&sensor_dev_attr_temp5_max.dev_attr.attr,
 899		&sensor_dev_attr_temp5_crit.dev_attr.attr,
 900		&sensor_dev_attr_temp5_type.dev_attr.attr,
 901		&sensor_dev_attr_temp5_min_alarm.dev_attr.attr,
 902		&sensor_dev_attr_temp5_max_alarm.dev_attr.attr,
 903		&sensor_dev_attr_temp5_crit_alarm.dev_attr.attr,
 904		&sensor_dev_attr_temp5_fault.dev_attr.attr,
 905		NULL
 906	}, {
 907		&sensor_dev_attr_temp6_input.dev_attr.attr,
 908		&sensor_dev_attr_temp6_min.dev_attr.attr,
 909		&sensor_dev_attr_temp6_max.dev_attr.attr,
 910		&sensor_dev_attr_temp6_crit.dev_attr.attr,
 911		&sensor_dev_attr_temp6_type.dev_attr.attr,
 912		&sensor_dev_attr_temp6_min_alarm.dev_attr.attr,
 913		&sensor_dev_attr_temp6_max_alarm.dev_attr.attr,
 914		&sensor_dev_attr_temp6_crit_alarm.dev_attr.attr,
 915		&sensor_dev_attr_temp6_fault.dev_attr.attr,
 916		NULL
 917	}
 918};
 919
 920static const struct attribute_group pc87427_group_temp[6] = {
 921	{ .attrs = pc87427_attributes_temp[0] },
 922	{ .attrs = pc87427_attributes_temp[1] },
 923	{ .attrs = pc87427_attributes_temp[2] },
 924	{ .attrs = pc87427_attributes_temp[3] },
 925	{ .attrs = pc87427_attributes_temp[4] },
 926	{ .attrs = pc87427_attributes_temp[5] },
 927};
 928
 929static ssize_t show_name(struct device *dev, struct device_attribute
 930			 *devattr, char *buf)
 931{
 932	struct pc87427_data *data = dev_get_drvdata(dev);
 933
 934	return sprintf(buf, "%s\n", data->name);
 935}
 936static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
 937
 938
 939/*
 940 * Device detection, attach and detach
 941 */
 942
 943static void pc87427_release_regions(struct platform_device *pdev, int count)
 944{
 945	struct resource *res;
 946	int i;
 947
 948	for (i = 0; i < count; i++) {
 949		res = platform_get_resource(pdev, IORESOURCE_IO, i);
 950		release_region(res->start, resource_size(res));
 951	}
 952}
 953
 954static int __devinit pc87427_request_regions(struct platform_device *pdev,
 955					     int count)
 956{
 957	struct resource *res;
 958	int i, err = 0;
 959
 960	for (i = 0; i < count; i++) {
 961		res = platform_get_resource(pdev, IORESOURCE_IO, i);
 962		if (!res) {
 963			err = -ENOENT;
 964			dev_err(&pdev->dev, "Missing resource #%d\n", i);
 965			break;
 966		}
 967		if (!request_region(res->start, resource_size(res), DRVNAME)) {
 968			err = -EBUSY;
 969			dev_err(&pdev->dev,
 970				"Failed to request region 0x%lx-0x%lx\n",
 971				(unsigned long)res->start,
 972				(unsigned long)res->end);
 973			break;
 974		}
 975	}
 976
 977	if (err && i)
 978		pc87427_release_regions(pdev, i);
 979
 980	return err;
 981}
 982
 983static void __devinit pc87427_init_device(struct device *dev)
 984{
 985	struct pc87427_sio_data *sio_data = dev->platform_data;
 986	struct pc87427_data *data = dev_get_drvdata(dev);
 987	int i;
 988	u8 reg;
 989
 990	/* The FMC module should be ready */
 991	reg = pc87427_read8(data, LD_FAN, PC87427_REG_BANK);
 992	if (!(reg & 0x80))
 993		dev_warn(dev, "%s module not ready!\n", "FMC");
 994
 995	/* Check which fans are enabled */
 996	for (i = 0; i < 8; i++) {
 997		if (!(sio_data->has_fanin & (1 << i)))	/* Not wired */
 998			continue;
 999		reg = pc87427_read8_bank(data, LD_FAN, BANK_FM(i),
1000					 PC87427_REG_FAN_STATUS);
1001		if (reg & FAN_STATUS_MONEN)
1002			data->fan_enabled |= (1 << i);
1003	}
1004
1005	if (!data->fan_enabled) {
1006		dev_dbg(dev, "Enabling monitoring of all fans\n");
1007		for (i = 0; i < 8; i++) {
1008			if (!(sio_data->has_fanin & (1 << i)))	/* Not wired */
1009				continue;
1010			pc87427_write8_bank(data, LD_FAN, BANK_FM(i),
1011					    PC87427_REG_FAN_STATUS,
1012					    FAN_STATUS_MONEN);
1013		}
1014		data->fan_enabled = sio_data->has_fanin;
1015	}
1016
1017	/* Check which PWM outputs are enabled */
1018	for (i = 0; i < 4; i++) {
1019		if (!(sio_data->has_fanout & (1 << i)))	/* Not wired */
1020			continue;
1021		reg = pc87427_read8_bank(data, LD_FAN, BANK_FC(i),
1022					 PC87427_REG_PWM_ENABLE);
1023		if (reg & PWM_ENABLE_CTLEN)
1024			data->pwm_enabled |= (1 << i);
1025
1026		/* We don't expose an interface to reconfigure the automatic
1027		   fan control mode, so only allow to return to this mode if
1028		   it was originally set. */
 
 
1029		if ((reg & PWM_ENABLE_MODE_MASK) == PWM_MODE_AUTO) {
1030			dev_dbg(dev, "PWM%d is in automatic control mode\n",
1031				i + 1);
1032			data->pwm_auto_ok |= (1 << i);
1033		}
1034	}
1035
1036	/* The HMC module should be ready */
1037	reg = pc87427_read8(data, LD_TEMP, PC87427_REG_BANK);
1038	if (!(reg & 0x80))
1039		dev_warn(dev, "%s module not ready!\n", "HMC");
1040
1041	/* Check which temperature channels are enabled */
1042	for (i = 0; i < 6; i++) {
1043		reg = pc87427_read8_bank(data, LD_TEMP, BANK_TM(i),
1044					 PC87427_REG_TEMP_STATUS);
1045		if (reg & TEMP_STATUS_CHANEN)
1046			data->temp_enabled |= (1 << i);
1047	}
1048}
1049
1050static void pc87427_remove_files(struct device *dev)
1051{
1052	struct pc87427_data *data = dev_get_drvdata(dev);
1053	int i;
1054
1055	device_remove_file(dev, &dev_attr_name);
1056	for (i = 0; i < 8; i++) {
1057		if (!(data->fan_enabled & (1 << i)))
1058			continue;
1059		sysfs_remove_group(&dev->kobj, &pc87427_group_fan[i]);
1060	}
1061	for (i = 0; i < 4; i++) {
1062		if (!(data->pwm_enabled & (1 << i)))
1063			continue;
1064		sysfs_remove_group(&dev->kobj, &pc87427_group_pwm[i]);
1065	}
1066	for (i = 0; i < 6; i++) {
1067		if (!(data->temp_enabled & (1 << i)))
1068			continue;
1069		sysfs_remove_group(&dev->kobj, &pc87427_group_temp[i]);
1070	}
1071}
1072
1073static int __devinit pc87427_probe(struct platform_device *pdev)
1074{
1075	struct pc87427_sio_data *sio_data = pdev->dev.platform_data;
1076	struct pc87427_data *data;
1077	int i, err, res_count;
1078
1079	data = kzalloc(sizeof(struct pc87427_data), GFP_KERNEL);
1080	if (!data) {
1081		err = -ENOMEM;
1082		pr_err("Out of memory\n");
1083		goto exit;
1084	}
1085
1086	data->address[0] = sio_data->address[0];
1087	data->address[1] = sio_data->address[1];
1088	res_count = (data->address[0] != 0) + (data->address[1] != 0);
1089
1090	err = pc87427_request_regions(pdev, res_count);
1091	if (err)
1092		goto exit_kfree;
1093
1094	mutex_init(&data->lock);
1095	data->name = "pc87427";
1096	platform_set_drvdata(pdev, data);
1097	pc87427_init_device(&pdev->dev);
1098
1099	/* Register sysfs hooks */
1100	err = device_create_file(&pdev->dev, &dev_attr_name);
1101	if (err)
1102		goto exit_release_region;
1103	for (i = 0; i < 8; i++) {
1104		if (!(data->fan_enabled & (1 << i)))
1105			continue;
1106		err = sysfs_create_group(&pdev->dev.kobj,
1107					 &pc87427_group_fan[i]);
1108		if (err)
1109			goto exit_remove_files;
1110	}
1111	for (i = 0; i < 4; i++) {
1112		if (!(data->pwm_enabled & (1 << i)))
1113			continue;
1114		err = sysfs_create_group(&pdev->dev.kobj,
1115					 &pc87427_group_pwm[i]);
1116		if (err)
1117			goto exit_remove_files;
1118	}
1119	for (i = 0; i < 6; i++) {
1120		if (!(data->temp_enabled & (1 << i)))
1121			continue;
1122		err = sysfs_create_group(&pdev->dev.kobj,
1123					 &pc87427_group_temp[i]);
1124		if (err)
1125			goto exit_remove_files;
1126	}
1127
1128	data->hwmon_dev = hwmon_device_register(&pdev->dev);
1129	if (IS_ERR(data->hwmon_dev)) {
1130		err = PTR_ERR(data->hwmon_dev);
1131		dev_err(&pdev->dev, "Class registration failed (%d)\n", err);
1132		goto exit_remove_files;
1133	}
1134
1135	return 0;
1136
1137exit_remove_files:
1138	pc87427_remove_files(&pdev->dev);
1139exit_release_region:
1140	pc87427_release_regions(pdev, res_count);
1141exit_kfree:
1142	platform_set_drvdata(pdev, NULL);
1143	kfree(data);
1144exit:
1145	return err;
1146}
1147
1148static int __devexit pc87427_remove(struct platform_device *pdev)
1149{
1150	struct pc87427_data *data = platform_get_drvdata(pdev);
1151	int res_count;
1152
1153	res_count = (data->address[0] != 0) + (data->address[1] != 0);
1154
1155	hwmon_device_unregister(data->hwmon_dev);
1156	pc87427_remove_files(&pdev->dev);
1157	platform_set_drvdata(pdev, NULL);
1158	kfree(data);
1159
1160	pc87427_release_regions(pdev, res_count);
1161
1162	return 0;
1163}
1164
1165
1166static struct platform_driver pc87427_driver = {
1167	.driver = {
1168		.owner	= THIS_MODULE,
1169		.name	= DRVNAME,
1170	},
1171	.probe		= pc87427_probe,
1172	.remove		= __devexit_p(pc87427_remove),
1173};
1174
1175static int __init pc87427_device_add(const struct pc87427_sio_data *sio_data)
1176{
1177	struct resource res[2] = {
1178		{ .flags	= IORESOURCE_IO },
1179		{ .flags	= IORESOURCE_IO },
1180	};
1181	int err, i, res_count;
1182
1183	res_count = 0;
1184	for (i = 0; i < 2; i++) {
1185		if (!sio_data->address[i])
1186			continue;
1187		res[res_count].start = sio_data->address[i];
1188		res[res_count].end = sio_data->address[i] + REGION_LENGTH - 1;
1189		res[res_count].name = logdev_str[i];
1190
1191		err = acpi_check_resource_conflict(&res[res_count]);
1192		if (err)
1193			goto exit;
1194
1195		res_count++;
1196	}
1197
1198	pdev = platform_device_alloc(DRVNAME, res[0].start);
1199	if (!pdev) {
1200		err = -ENOMEM;
1201		pr_err("Device allocation failed\n");
1202		goto exit;
1203	}
1204
1205	err = platform_device_add_resources(pdev, res, res_count);
1206	if (err) {
1207		pr_err("Device resource addition failed (%d)\n", err);
1208		goto exit_device_put;
1209	}
1210
1211	err = platform_device_add_data(pdev, sio_data,
1212				       sizeof(struct pc87427_sio_data));
1213	if (err) {
1214		pr_err("Platform data allocation failed\n");
1215		goto exit_device_put;
1216	}
1217
1218	err = platform_device_add(pdev);
1219	if (err) {
1220		pr_err("Device addition failed (%d)\n", err);
1221		goto exit_device_put;
1222	}
1223
1224	return 0;
1225
1226exit_device_put:
1227	platform_device_put(pdev);
1228exit:
1229	return err;
1230}
1231
1232static int __init pc87427_find(int sioaddr, struct pc87427_sio_data *sio_data)
1233{
1234	u16 val;
1235	u8 cfg, cfg_b;
1236	int i, err = 0;
1237
1238	/* Identify device */
1239	val = force_id ? force_id : superio_inb(sioaddr, SIOREG_DEVID);
1240	if (val != 0xf2) {	/* PC87427 */
1241		err = -ENODEV;
1242		goto exit;
1243	}
1244
1245	for (i = 0; i < 2; i++) {
1246		sio_data->address[i] = 0;
1247		/* Select logical device */
1248		superio_outb(sioaddr, SIOREG_LDSEL, logdev[i]);
1249
1250		val = superio_inb(sioaddr, SIOREG_ACT);
1251		if (!(val & 0x01)) {
1252			pr_info("Logical device 0x%02x not activated\n",
1253				logdev[i]);
1254			continue;
1255		}
1256
1257		val = superio_inb(sioaddr, SIOREG_MAP);
1258		if (val & 0x01) {
1259			pr_warn("Logical device 0x%02x is memory-mapped, "
1260				"can't use\n", logdev[i]);
1261			continue;
1262		}
1263
1264		val = (superio_inb(sioaddr, SIOREG_IOBASE) << 8)
1265		    | superio_inb(sioaddr, SIOREG_IOBASE + 1);
1266		if (!val) {
1267			pr_info("I/O base address not set for logical device "
1268				"0x%02x\n", logdev[i]);
1269			continue;
1270		}
1271		sio_data->address[i] = val;
1272	}
1273
1274	/* No point in loading the driver if everything is disabled */
1275	if (!sio_data->address[0] && !sio_data->address[1]) {
1276		err = -ENODEV;
1277		goto exit;
1278	}
1279
1280	/* Check which fan inputs are wired */
1281	sio_data->has_fanin = (1 << 2) | (1 << 3);	/* FANIN2, FANIN3 */
1282
1283	cfg = superio_inb(sioaddr, SIOREG_CF2);
1284	if (!(cfg & (1 << 3)))
1285		sio_data->has_fanin |= (1 << 0);	/* FANIN0 */
1286	if (!(cfg & (1 << 2)))
1287		sio_data->has_fanin |= (1 << 4);	/* FANIN4 */
1288
1289	cfg = superio_inb(sioaddr, SIOREG_CFD);
1290	if (!(cfg & (1 << 0)))
1291		sio_data->has_fanin |= (1 << 1);	/* FANIN1 */
1292
1293	cfg = superio_inb(sioaddr, SIOREG_CF4);
1294	if (!(cfg & (1 << 0)))
1295		sio_data->has_fanin |= (1 << 7);	/* FANIN7 */
1296	cfg_b = superio_inb(sioaddr, SIOREG_CFB);
1297	if (!(cfg & (1 << 1)) && (cfg_b & (1 << 3)))
1298		sio_data->has_fanin |= (1 << 5);	/* FANIN5 */
1299	cfg = superio_inb(sioaddr, SIOREG_CF3);
1300	if ((cfg & (1 << 3)) && !(cfg_b & (1 << 5)))
1301		sio_data->has_fanin |= (1 << 6);	/* FANIN6 */
1302
1303	/* Check which fan outputs are wired */
1304	sio_data->has_fanout = (1 << 0);		/* FANOUT0 */
1305	if (cfg_b & (1 << 0))
1306		sio_data->has_fanout |= (1 << 3);	/* FANOUT3 */
1307
1308	cfg = superio_inb(sioaddr, SIOREG_CFC);
1309	if (!(cfg & (1 << 4))) {
1310		if (cfg_b & (1 << 1))
1311			sio_data->has_fanout |= (1 << 1); /* FANOUT1 */
1312		if (cfg_b & (1 << 2))
1313			sio_data->has_fanout |= (1 << 2); /* FANOUT2 */
1314	}
1315
1316	/* FANOUT1 and FANOUT2 can each be routed to 2 different pins */
1317	cfg = superio_inb(sioaddr, SIOREG_CF5);
1318	if (cfg & (1 << 6))
1319		sio_data->has_fanout |= (1 << 1);	/* FANOUT1 */
1320	if (cfg & (1 << 5))
1321		sio_data->has_fanout |= (1 << 2);	/* FANOUT2 */
1322
1323exit:
1324	superio_exit(sioaddr);
1325	return err;
1326}
1327
1328static int __init pc87427_init(void)
1329{
1330	int err;
1331	struct pc87427_sio_data sio_data;
1332
1333	if (pc87427_find(0x2e, &sio_data)
1334	 && pc87427_find(0x4e, &sio_data))
1335		return -ENODEV;
1336
1337	err = platform_driver_register(&pc87427_driver);
1338	if (err)
1339		goto exit;
1340
1341	/* Sets global pdev as a side effect */
1342	err = pc87427_device_add(&sio_data);
1343	if (err)
1344		goto exit_driver;
1345
1346	return 0;
1347
1348exit_driver:
1349	platform_driver_unregister(&pc87427_driver);
1350exit:
1351	return err;
1352}
1353
1354static void __exit pc87427_exit(void)
1355{
1356	platform_device_unregister(pdev);
1357	platform_driver_unregister(&pc87427_driver);
1358}
1359
1360MODULE_AUTHOR("Jean Delvare <khali@linux-fr.org>");
1361MODULE_DESCRIPTION("PC87427 hardware monitoring driver");
1362MODULE_LICENSE("GPL");
1363
1364module_init(pc87427_init);
1365module_exit(pc87427_exit);
v3.5.6
   1/*
   2 *  pc87427.c - hardware monitoring driver for the
   3 *              National Semiconductor PC87427 Super-I/O chip
   4 *  Copyright (C) 2006, 2008, 2010  Jean Delvare <khali@linux-fr.org>
   5 *
   6 *  This program is free software; you can redistribute it and/or modify
   7 *  it under the terms of the GNU General Public License version 2 as
   8 *  published by the Free Software Foundation.
   9 *
  10 *  This program is distributed in the hope that it will be useful,
  11 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 *  GNU General Public License for more details.
  14 *
  15 *  Supports the following chips:
  16 *
  17 *  Chip        #vin    #fan    #pwm    #temp   devid
  18 *  PC87427     -       8       4       6       0xF2
  19 *
  20 *  This driver assumes that no more than one chip is present.
  21 *  Only fans are fully supported so far. Temperatures are in read-only
  22 *  mode, and voltages aren't supported at all.
  23 */
  24
  25#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  26
  27#include <linux/module.h>
  28#include <linux/init.h>
  29#include <linux/slab.h>
  30#include <linux/jiffies.h>
  31#include <linux/platform_device.h>
  32#include <linux/hwmon.h>
  33#include <linux/hwmon-sysfs.h>
  34#include <linux/err.h>
  35#include <linux/mutex.h>
  36#include <linux/sysfs.h>
  37#include <linux/ioport.h>
  38#include <linux/acpi.h>
  39#include <linux/io.h>
  40
  41static unsigned short force_id;
  42module_param(force_id, ushort, 0);
  43MODULE_PARM_DESC(force_id, "Override the detected device ID");
  44
  45static struct platform_device *pdev;
  46
  47#define DRVNAME "pc87427"
  48
  49/*
  50 * The lock mutex protects both the I/O accesses (needed because the
  51 * device is using banked registers) and the register cache (needed to keep
  52 * the data in the registers and the cache in sync at any time).
  53 */
  54struct pc87427_data {
  55	struct device *hwmon_dev;
  56	struct mutex lock;
  57	int address[2];
  58	const char *name;
  59
  60	unsigned long last_updated;	/* in jiffies */
  61	u8 fan_enabled;			/* bit vector */
  62	u16 fan[8];			/* register values */
  63	u16 fan_min[8];			/* register values */
  64	u8 fan_status[8];		/* register values */
  65
  66	u8 pwm_enabled;			/* bit vector */
  67	u8 pwm_auto_ok;			/* bit vector */
  68	u8 pwm_enable[4];		/* register values */
  69	u8 pwm[4];			/* register values */
  70
  71	u8 temp_enabled;		/* bit vector */
  72	s16 temp[6];			/* register values */
  73	s8 temp_min[6];			/* register values */
  74	s8 temp_max[6];			/* register values */
  75	s8 temp_crit[6];		/* register values */
  76	u8 temp_status[6];		/* register values */
  77	u8 temp_type[6];		/* register values */
  78};
  79
  80struct pc87427_sio_data {
  81	unsigned short address[2];
  82	u8 has_fanin;
  83	u8 has_fanout;
  84};
  85
  86/*
  87 * Super-I/O registers and operations
  88 */
  89
  90#define SIOREG_LDSEL	0x07	/* Logical device select */
  91#define SIOREG_DEVID	0x20	/* Device ID */
  92#define SIOREG_CF2	0x22	/* Configuration 2 */
  93#define SIOREG_CF3	0x23	/* Configuration 3 */
  94#define SIOREG_CF4	0x24	/* Configuration 4 */
  95#define SIOREG_CF5	0x25	/* Configuration 5 */
  96#define SIOREG_CFB	0x2B	/* Configuration B */
  97#define SIOREG_CFC	0x2C	/* Configuration C */
  98#define SIOREG_CFD	0x2D	/* Configuration D */
  99#define SIOREG_ACT	0x30	/* Device activation */
 100#define SIOREG_MAP	0x50	/* I/O or memory mapping */
 101#define SIOREG_IOBASE	0x60	/* I/O base address */
 102
 103static const u8 logdev[2] = { 0x09, 0x14 };
 104static const char *logdev_str[2] = { DRVNAME " FMC", DRVNAME " HMC" };
 105#define LD_FAN		0
 106#define LD_IN		1
 107#define LD_TEMP		1
 108
 109static inline void superio_outb(int sioaddr, int reg, int val)
 110{
 111	outb(reg, sioaddr);
 112	outb(val, sioaddr + 1);
 113}
 114
 115static inline int superio_inb(int sioaddr, int reg)
 116{
 117	outb(reg, sioaddr);
 118	return inb(sioaddr + 1);
 119}
 120
 121static inline void superio_exit(int sioaddr)
 122{
 123	outb(0x02, sioaddr);
 124	outb(0x02, sioaddr + 1);
 125}
 126
 127/*
 128 * Logical devices
 129 */
 130
 131#define REGION_LENGTH		32
 132#define PC87427_REG_BANK	0x0f
 133#define BANK_FM(nr)		(nr)
 134#define BANK_FT(nr)		(0x08 + (nr))
 135#define BANK_FC(nr)		(0x10 + (nr) * 2)
 136#define BANK_TM(nr)		(nr)
 137#define BANK_VM(nr)		(0x08 + (nr))
 138
 139/*
 140 * I/O access functions
 141 */
 142
 143/* ldi is the logical device index */
 144static inline int pc87427_read8(struct pc87427_data *data, u8 ldi, u8 reg)
 145{
 146	return inb(data->address[ldi] + reg);
 147}
 148
 149/* Must be called with data->lock held, except during init */
 150static inline int pc87427_read8_bank(struct pc87427_data *data, u8 ldi,
 151				     u8 bank, u8 reg)
 152{
 153	outb(bank, data->address[ldi] + PC87427_REG_BANK);
 154	return inb(data->address[ldi] + reg);
 155}
 156
 157/* Must be called with data->lock held, except during init */
 158static inline void pc87427_write8_bank(struct pc87427_data *data, u8 ldi,
 159				       u8 bank, u8 reg, u8 value)
 160{
 161	outb(bank, data->address[ldi] + PC87427_REG_BANK);
 162	outb(value, data->address[ldi] + reg);
 163}
 164
 165/*
 166 * Fan registers and conversions
 167 */
 168
 169/* fan data registers are 16-bit wide */
 170#define PC87427_REG_FAN			0x12
 171#define PC87427_REG_FAN_MIN		0x14
 172#define PC87427_REG_FAN_STATUS		0x10
 173
 174#define FAN_STATUS_STALL		(1 << 3)
 175#define FAN_STATUS_LOSPD		(1 << 1)
 176#define FAN_STATUS_MONEN		(1 << 0)
 177
 178/*
 179 * Dedicated function to read all registers related to a given fan input.
 180 * This saves us quite a few locks and bank selections.
 181 * Must be called with data->lock held.
 182 * nr is from 0 to 7
 183 */
 184static void pc87427_readall_fan(struct pc87427_data *data, u8 nr)
 185{
 186	int iobase = data->address[LD_FAN];
 187
 188	outb(BANK_FM(nr), iobase + PC87427_REG_BANK);
 189	data->fan[nr] = inw(iobase + PC87427_REG_FAN);
 190	data->fan_min[nr] = inw(iobase + PC87427_REG_FAN_MIN);
 191	data->fan_status[nr] = inb(iobase + PC87427_REG_FAN_STATUS);
 192	/* Clear fan alarm bits */
 193	outb(data->fan_status[nr], iobase + PC87427_REG_FAN_STATUS);
 194}
 195
 196/*
 197 * The 2 LSB of fan speed registers are used for something different.
 198 * The actual 2 LSB of the measurements are not available.
 199 */
 200static inline unsigned long fan_from_reg(u16 reg)
 201{
 202	reg &= 0xfffc;
 203	if (reg == 0x0000 || reg == 0xfffc)
 204		return 0;
 205	return 5400000UL / reg;
 206}
 207
 208/* The 2 LSB of the fan speed limit registers are not significant. */
 209static inline u16 fan_to_reg(unsigned long val)
 210{
 211	if (val < 83UL)
 212		return 0xffff;
 213	if (val >= 1350000UL)
 214		return 0x0004;
 215	return ((1350000UL + val / 2) / val) << 2;
 216}
 217
 218/*
 219 * PWM registers and conversions
 220 */
 221
 222#define PC87427_REG_PWM_ENABLE		0x10
 223#define PC87427_REG_PWM_DUTY		0x12
 224
 225#define PWM_ENABLE_MODE_MASK		(7 << 4)
 226#define PWM_ENABLE_CTLEN		(1 << 0)
 227
 228#define PWM_MODE_MANUAL			(0 << 4)
 229#define PWM_MODE_AUTO			(1 << 4)
 230#define PWM_MODE_OFF			(2 << 4)
 231#define PWM_MODE_ON			(7 << 4)
 232
 233/*
 234 * Dedicated function to read all registers related to a given PWM output.
 235 * This saves us quite a few locks and bank selections.
 236 * Must be called with data->lock held.
 237 * nr is from 0 to 3
 238 */
 239static void pc87427_readall_pwm(struct pc87427_data *data, u8 nr)
 240{
 241	int iobase = data->address[LD_FAN];
 242
 243	outb(BANK_FC(nr), iobase + PC87427_REG_BANK);
 244	data->pwm_enable[nr] = inb(iobase + PC87427_REG_PWM_ENABLE);
 245	data->pwm[nr] = inb(iobase + PC87427_REG_PWM_DUTY);
 246}
 247
 248static inline int pwm_enable_from_reg(u8 reg)
 249{
 250	switch (reg & PWM_ENABLE_MODE_MASK) {
 251	case PWM_MODE_ON:
 252		return 0;
 253	case PWM_MODE_MANUAL:
 254	case PWM_MODE_OFF:
 255		return 1;
 256	case PWM_MODE_AUTO:
 257		return 2;
 258	default:
 259		return -EPROTO;
 260	}
 261}
 262
 263static inline u8 pwm_enable_to_reg(unsigned long val, u8 pwmval)
 264{
 265	switch (val) {
 266	default:
 267		return PWM_MODE_ON;
 268	case 1:
 269		return pwmval ? PWM_MODE_MANUAL : PWM_MODE_OFF;
 270	case 2:
 271		return PWM_MODE_AUTO;
 272	}
 273}
 274
 275/*
 276 * Temperature registers and conversions
 277 */
 278
 279#define PC87427_REG_TEMP_STATUS		0x10
 280#define PC87427_REG_TEMP		0x14
 281#define PC87427_REG_TEMP_MAX		0x18
 282#define PC87427_REG_TEMP_MIN		0x19
 283#define PC87427_REG_TEMP_CRIT		0x1a
 284#define PC87427_REG_TEMP_TYPE		0x1d
 285
 286#define TEMP_STATUS_CHANEN		(1 << 0)
 287#define TEMP_STATUS_LOWFLG		(1 << 1)
 288#define TEMP_STATUS_HIGHFLG		(1 << 2)
 289#define TEMP_STATUS_CRITFLG		(1 << 3)
 290#define TEMP_STATUS_SENSERR		(1 << 5)
 291#define TEMP_TYPE_MASK			(3 << 5)
 292
 293#define TEMP_TYPE_THERMISTOR		(1 << 5)
 294#define TEMP_TYPE_REMOTE_DIODE		(2 << 5)
 295#define TEMP_TYPE_LOCAL_DIODE		(3 << 5)
 296
 297/*
 298 * Dedicated function to read all registers related to a given temperature
 299 * input. This saves us quite a few locks and bank selections.
 300 * Must be called with data->lock held.
 301 * nr is from 0 to 5
 302 */
 303static void pc87427_readall_temp(struct pc87427_data *data, u8 nr)
 304{
 305	int iobase = data->address[LD_TEMP];
 306
 307	outb(BANK_TM(nr), iobase + PC87427_REG_BANK);
 308	data->temp[nr] = le16_to_cpu(inw(iobase + PC87427_REG_TEMP));
 309	data->temp_max[nr] = inb(iobase + PC87427_REG_TEMP_MAX);
 310	data->temp_min[nr] = inb(iobase + PC87427_REG_TEMP_MIN);
 311	data->temp_crit[nr] = inb(iobase + PC87427_REG_TEMP_CRIT);
 312	data->temp_type[nr] = inb(iobase + PC87427_REG_TEMP_TYPE);
 313	data->temp_status[nr] = inb(iobase + PC87427_REG_TEMP_STATUS);
 314	/* Clear fan alarm bits */
 315	outb(data->temp_status[nr], iobase + PC87427_REG_TEMP_STATUS);
 316}
 317
 318static inline unsigned int temp_type_from_reg(u8 reg)
 319{
 320	switch (reg & TEMP_TYPE_MASK) {
 321	case TEMP_TYPE_THERMISTOR:
 322		return 4;
 323	case TEMP_TYPE_REMOTE_DIODE:
 324	case TEMP_TYPE_LOCAL_DIODE:
 325		return 3;
 326	default:
 327		return 0;
 328	}
 329}
 330
 331/*
 332 * We assume 8-bit thermal sensors; 9-bit thermal sensors are possible
 333 * too, but I have no idea how to figure out when they are used.
 334 */
 335static inline long temp_from_reg(s16 reg)
 336{
 337	return reg * 1000 / 256;
 338}
 339
 340static inline long temp_from_reg8(s8 reg)
 341{
 342	return reg * 1000;
 343}
 344
 345/*
 346 * Data interface
 347 */
 348
 349static struct pc87427_data *pc87427_update_device(struct device *dev)
 350{
 351	struct pc87427_data *data = dev_get_drvdata(dev);
 352	int i;
 353
 354	mutex_lock(&data->lock);
 355	if (!time_after(jiffies, data->last_updated + HZ)
 356	 && data->last_updated)
 357		goto done;
 358
 359	/* Fans */
 360	for (i = 0; i < 8; i++) {
 361		if (!(data->fan_enabled & (1 << i)))
 362			continue;
 363		pc87427_readall_fan(data, i);
 364	}
 365
 366	/* PWM outputs */
 367	for (i = 0; i < 4; i++) {
 368		if (!(data->pwm_enabled & (1 << i)))
 369			continue;
 370		pc87427_readall_pwm(data, i);
 371	}
 372
 373	/* Temperature channels */
 374	for (i = 0; i < 6; i++) {
 375		if (!(data->temp_enabled & (1 << i)))
 376			continue;
 377		pc87427_readall_temp(data, i);
 378	}
 379
 380	data->last_updated = jiffies;
 381
 382done:
 383	mutex_unlock(&data->lock);
 384	return data;
 385}
 386
 387static ssize_t show_fan_input(struct device *dev, struct device_attribute
 388			      *devattr, char *buf)
 389{
 390	struct pc87427_data *data = pc87427_update_device(dev);
 391	int nr = to_sensor_dev_attr(devattr)->index;
 392
 393	return sprintf(buf, "%lu\n", fan_from_reg(data->fan[nr]));
 394}
 395
 396static ssize_t show_fan_min(struct device *dev, struct device_attribute
 397			    *devattr, char *buf)
 398{
 399	struct pc87427_data *data = pc87427_update_device(dev);
 400	int nr = to_sensor_dev_attr(devattr)->index;
 401
 402	return sprintf(buf, "%lu\n", fan_from_reg(data->fan_min[nr]));
 403}
 404
 405static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
 406			      *devattr, char *buf)
 407{
 408	struct pc87427_data *data = pc87427_update_device(dev);
 409	int nr = to_sensor_dev_attr(devattr)->index;
 410
 411	return sprintf(buf, "%d\n", !!(data->fan_status[nr]
 412				       & FAN_STATUS_LOSPD));
 413}
 414
 415static ssize_t show_fan_fault(struct device *dev, struct device_attribute
 416			      *devattr, char *buf)
 417{
 418	struct pc87427_data *data = pc87427_update_device(dev);
 419	int nr = to_sensor_dev_attr(devattr)->index;
 420
 421	return sprintf(buf, "%d\n", !!(data->fan_status[nr]
 422				       & FAN_STATUS_STALL));
 423}
 424
 425static ssize_t set_fan_min(struct device *dev, struct device_attribute
 426			   *devattr, const char *buf, size_t count)
 427{
 428	struct pc87427_data *data = dev_get_drvdata(dev);
 429	int nr = to_sensor_dev_attr(devattr)->index;
 430	unsigned long val;
 431	int iobase = data->address[LD_FAN];
 432
 433	if (kstrtoul(buf, 10, &val) < 0)
 434		return -EINVAL;
 435
 436	mutex_lock(&data->lock);
 437	outb(BANK_FM(nr), iobase + PC87427_REG_BANK);
 438	/*
 439	 * The low speed limit registers are read-only while monitoring
 440	 * is enabled, so we have to disable monitoring, then change the
 441	 * limit, and finally enable monitoring again.
 442	 */
 443	outb(0, iobase + PC87427_REG_FAN_STATUS);
 444	data->fan_min[nr] = fan_to_reg(val);
 445	outw(data->fan_min[nr], iobase + PC87427_REG_FAN_MIN);
 446	outb(FAN_STATUS_MONEN, iobase + PC87427_REG_FAN_STATUS);
 447	mutex_unlock(&data->lock);
 448
 449	return count;
 450}
 451
 452static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan_input, NULL, 0);
 453static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan_input, NULL, 1);
 454static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan_input, NULL, 2);
 455static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_fan_input, NULL, 3);
 456static SENSOR_DEVICE_ATTR(fan5_input, S_IRUGO, show_fan_input, NULL, 4);
 457static SENSOR_DEVICE_ATTR(fan6_input, S_IRUGO, show_fan_input, NULL, 5);
 458static SENSOR_DEVICE_ATTR(fan7_input, S_IRUGO, show_fan_input, NULL, 6);
 459static SENSOR_DEVICE_ATTR(fan8_input, S_IRUGO, show_fan_input, NULL, 7);
 460
 461static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO,
 462			  show_fan_min, set_fan_min, 0);
 463static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO,
 464			  show_fan_min, set_fan_min, 1);
 465static SENSOR_DEVICE_ATTR(fan3_min, S_IWUSR | S_IRUGO,
 466			  show_fan_min, set_fan_min, 2);
 467static SENSOR_DEVICE_ATTR(fan4_min, S_IWUSR | S_IRUGO,
 468			  show_fan_min, set_fan_min, 3);
 469static SENSOR_DEVICE_ATTR(fan5_min, S_IWUSR | S_IRUGO,
 470			  show_fan_min, set_fan_min, 4);
 471static SENSOR_DEVICE_ATTR(fan6_min, S_IWUSR | S_IRUGO,
 472			  show_fan_min, set_fan_min, 5);
 473static SENSOR_DEVICE_ATTR(fan7_min, S_IWUSR | S_IRUGO,
 474			  show_fan_min, set_fan_min, 6);
 475static SENSOR_DEVICE_ATTR(fan8_min, S_IWUSR | S_IRUGO,
 476			  show_fan_min, set_fan_min, 7);
 477
 478static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_fan_alarm, NULL, 0);
 479static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_fan_alarm, NULL, 1);
 480static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 2);
 481static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 3);
 482static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO, show_fan_alarm, NULL, 4);
 483static SENSOR_DEVICE_ATTR(fan6_alarm, S_IRUGO, show_fan_alarm, NULL, 5);
 484static SENSOR_DEVICE_ATTR(fan7_alarm, S_IRUGO, show_fan_alarm, NULL, 6);
 485static SENSOR_DEVICE_ATTR(fan8_alarm, S_IRUGO, show_fan_alarm, NULL, 7);
 486
 487static SENSOR_DEVICE_ATTR(fan1_fault, S_IRUGO, show_fan_fault, NULL, 0);
 488static SENSOR_DEVICE_ATTR(fan2_fault, S_IRUGO, show_fan_fault, NULL, 1);
 489static SENSOR_DEVICE_ATTR(fan3_fault, S_IRUGO, show_fan_fault, NULL, 2);
 490static SENSOR_DEVICE_ATTR(fan4_fault, S_IRUGO, show_fan_fault, NULL, 3);
 491static SENSOR_DEVICE_ATTR(fan5_fault, S_IRUGO, show_fan_fault, NULL, 4);
 492static SENSOR_DEVICE_ATTR(fan6_fault, S_IRUGO, show_fan_fault, NULL, 5);
 493static SENSOR_DEVICE_ATTR(fan7_fault, S_IRUGO, show_fan_fault, NULL, 6);
 494static SENSOR_DEVICE_ATTR(fan8_fault, S_IRUGO, show_fan_fault, NULL, 7);
 495
 496static struct attribute *pc87427_attributes_fan[8][5] = {
 497	{
 498		&sensor_dev_attr_fan1_input.dev_attr.attr,
 499		&sensor_dev_attr_fan1_min.dev_attr.attr,
 500		&sensor_dev_attr_fan1_alarm.dev_attr.attr,
 501		&sensor_dev_attr_fan1_fault.dev_attr.attr,
 502		NULL
 503	}, {
 504		&sensor_dev_attr_fan2_input.dev_attr.attr,
 505		&sensor_dev_attr_fan2_min.dev_attr.attr,
 506		&sensor_dev_attr_fan2_alarm.dev_attr.attr,
 507		&sensor_dev_attr_fan2_fault.dev_attr.attr,
 508		NULL
 509	}, {
 510		&sensor_dev_attr_fan3_input.dev_attr.attr,
 511		&sensor_dev_attr_fan3_min.dev_attr.attr,
 512		&sensor_dev_attr_fan3_alarm.dev_attr.attr,
 513		&sensor_dev_attr_fan3_fault.dev_attr.attr,
 514		NULL
 515	}, {
 516		&sensor_dev_attr_fan4_input.dev_attr.attr,
 517		&sensor_dev_attr_fan4_min.dev_attr.attr,
 518		&sensor_dev_attr_fan4_alarm.dev_attr.attr,
 519		&sensor_dev_attr_fan4_fault.dev_attr.attr,
 520		NULL
 521	}, {
 522		&sensor_dev_attr_fan5_input.dev_attr.attr,
 523		&sensor_dev_attr_fan5_min.dev_attr.attr,
 524		&sensor_dev_attr_fan5_alarm.dev_attr.attr,
 525		&sensor_dev_attr_fan5_fault.dev_attr.attr,
 526		NULL
 527	}, {
 528		&sensor_dev_attr_fan6_input.dev_attr.attr,
 529		&sensor_dev_attr_fan6_min.dev_attr.attr,
 530		&sensor_dev_attr_fan6_alarm.dev_attr.attr,
 531		&sensor_dev_attr_fan6_fault.dev_attr.attr,
 532		NULL
 533	}, {
 534		&sensor_dev_attr_fan7_input.dev_attr.attr,
 535		&sensor_dev_attr_fan7_min.dev_attr.attr,
 536		&sensor_dev_attr_fan7_alarm.dev_attr.attr,
 537		&sensor_dev_attr_fan7_fault.dev_attr.attr,
 538		NULL
 539	}, {
 540		&sensor_dev_attr_fan8_input.dev_attr.attr,
 541		&sensor_dev_attr_fan8_min.dev_attr.attr,
 542		&sensor_dev_attr_fan8_alarm.dev_attr.attr,
 543		&sensor_dev_attr_fan8_fault.dev_attr.attr,
 544		NULL
 545	}
 546};
 547
 548static const struct attribute_group pc87427_group_fan[8] = {
 549	{ .attrs = pc87427_attributes_fan[0] },
 550	{ .attrs = pc87427_attributes_fan[1] },
 551	{ .attrs = pc87427_attributes_fan[2] },
 552	{ .attrs = pc87427_attributes_fan[3] },
 553	{ .attrs = pc87427_attributes_fan[4] },
 554	{ .attrs = pc87427_attributes_fan[5] },
 555	{ .attrs = pc87427_attributes_fan[6] },
 556	{ .attrs = pc87427_attributes_fan[7] },
 557};
 558
 559/*
 560 * Must be called with data->lock held and pc87427_readall_pwm() freshly
 561 * called
 562 */
 563static void update_pwm_enable(struct pc87427_data *data, int nr, u8 mode)
 564{
 565	int iobase = data->address[LD_FAN];
 566	data->pwm_enable[nr] &= ~PWM_ENABLE_MODE_MASK;
 567	data->pwm_enable[nr] |= mode;
 568	outb(data->pwm_enable[nr], iobase + PC87427_REG_PWM_ENABLE);
 569}
 570
 571static ssize_t show_pwm_enable(struct device *dev, struct device_attribute
 572			       *devattr, char *buf)
 573{
 574	struct pc87427_data *data = pc87427_update_device(dev);
 575	int nr = to_sensor_dev_attr(devattr)->index;
 576	int pwm_enable;
 577
 578	pwm_enable = pwm_enable_from_reg(data->pwm_enable[nr]);
 579	if (pwm_enable < 0)
 580		return pwm_enable;
 581	return sprintf(buf, "%d\n", pwm_enable);
 582}
 583
 584static ssize_t set_pwm_enable(struct device *dev, struct device_attribute
 585			      *devattr, const char *buf, size_t count)
 586{
 587	struct pc87427_data *data = dev_get_drvdata(dev);
 588	int nr = to_sensor_dev_attr(devattr)->index;
 589	unsigned long val;
 590
 591	if (kstrtoul(buf, 10, &val) < 0 || val > 2)
 592		return -EINVAL;
 593	/* Can't go to automatic mode if it isn't configured */
 594	if (val == 2 && !(data->pwm_auto_ok & (1 << nr)))
 595		return -EINVAL;
 596
 597	mutex_lock(&data->lock);
 598	pc87427_readall_pwm(data, nr);
 599	update_pwm_enable(data, nr, pwm_enable_to_reg(val, data->pwm[nr]));
 600	mutex_unlock(&data->lock);
 601
 602	return count;
 603}
 604
 605static ssize_t show_pwm(struct device *dev, struct device_attribute
 606			*devattr, char *buf)
 607{
 608	struct pc87427_data *data = pc87427_update_device(dev);
 609	int nr = to_sensor_dev_attr(devattr)->index;
 610
 611	return sprintf(buf, "%d\n", (int)data->pwm[nr]);
 612}
 613
 614static ssize_t set_pwm(struct device *dev, struct device_attribute
 615		       *devattr, const char *buf, size_t count)
 616{
 617	struct pc87427_data *data = dev_get_drvdata(dev);
 618	int nr = to_sensor_dev_attr(devattr)->index;
 619	unsigned long val;
 620	int iobase = data->address[LD_FAN];
 621	u8 mode;
 622
 623	if (kstrtoul(buf, 10, &val) < 0 || val > 0xff)
 624		return -EINVAL;
 625
 626	mutex_lock(&data->lock);
 627	pc87427_readall_pwm(data, nr);
 628	mode = data->pwm_enable[nr] & PWM_ENABLE_MODE_MASK;
 629	if (mode != PWM_MODE_MANUAL && mode != PWM_MODE_OFF) {
 630		dev_notice(dev, "Can't set PWM%d duty cycle while not in "
 631			   "manual mode\n", nr + 1);
 632		mutex_unlock(&data->lock);
 633		return -EPERM;
 634	}
 635
 636	/* We may have to change the mode */
 637	if (mode == PWM_MODE_MANUAL && val == 0) {
 638		/* Transition from Manual to Off */
 639		update_pwm_enable(data, nr, PWM_MODE_OFF);
 640		mode = PWM_MODE_OFF;
 641		dev_dbg(dev, "Switching PWM%d from %s to %s\n", nr + 1,
 642			"manual", "off");
 643	} else if (mode == PWM_MODE_OFF && val != 0) {
 644		/* Transition from Off to Manual */
 645		update_pwm_enable(data, nr, PWM_MODE_MANUAL);
 646		mode = PWM_MODE_MANUAL;
 647		dev_dbg(dev, "Switching PWM%d from %s to %s\n", nr + 1,
 648			"off", "manual");
 649	}
 650
 651	data->pwm[nr] = val;
 652	if (mode == PWM_MODE_MANUAL)
 653		outb(val, iobase + PC87427_REG_PWM_DUTY);
 654	mutex_unlock(&data->lock);
 655
 656	return count;
 657}
 658
 659static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO,
 660			  show_pwm_enable, set_pwm_enable, 0);
 661static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO,
 662			  show_pwm_enable, set_pwm_enable, 1);
 663static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO,
 664			  show_pwm_enable, set_pwm_enable, 2);
 665static SENSOR_DEVICE_ATTR(pwm4_enable, S_IWUSR | S_IRUGO,
 666			  show_pwm_enable, set_pwm_enable, 3);
 667
 668static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 0);
 669static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 1);
 670static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 2);
 671static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 3);
 672
 673static struct attribute *pc87427_attributes_pwm[4][3] = {
 674	{
 675		&sensor_dev_attr_pwm1_enable.dev_attr.attr,
 676		&sensor_dev_attr_pwm1.dev_attr.attr,
 677		NULL
 678	}, {
 679		&sensor_dev_attr_pwm2_enable.dev_attr.attr,
 680		&sensor_dev_attr_pwm2.dev_attr.attr,
 681		NULL
 682	}, {
 683		&sensor_dev_attr_pwm3_enable.dev_attr.attr,
 684		&sensor_dev_attr_pwm3.dev_attr.attr,
 685		NULL
 686	}, {
 687		&sensor_dev_attr_pwm4_enable.dev_attr.attr,
 688		&sensor_dev_attr_pwm4.dev_attr.attr,
 689		NULL
 690	}
 691};
 692
 693static const struct attribute_group pc87427_group_pwm[4] = {
 694	{ .attrs = pc87427_attributes_pwm[0] },
 695	{ .attrs = pc87427_attributes_pwm[1] },
 696	{ .attrs = pc87427_attributes_pwm[2] },
 697	{ .attrs = pc87427_attributes_pwm[3] },
 698};
 699
 700static ssize_t show_temp_input(struct device *dev, struct device_attribute
 701			       *devattr, char *buf)
 702{
 703	struct pc87427_data *data = pc87427_update_device(dev);
 704	int nr = to_sensor_dev_attr(devattr)->index;
 705
 706	return sprintf(buf, "%ld\n", temp_from_reg(data->temp[nr]));
 707}
 708
 709static ssize_t show_temp_min(struct device *dev, struct device_attribute
 710			     *devattr, char *buf)
 711{
 712	struct pc87427_data *data = pc87427_update_device(dev);
 713	int nr = to_sensor_dev_attr(devattr)->index;
 714
 715	return sprintf(buf, "%ld\n", temp_from_reg8(data->temp_min[nr]));
 716}
 717
 718static ssize_t show_temp_max(struct device *dev, struct device_attribute
 719			     *devattr, char *buf)
 720{
 721	struct pc87427_data *data = pc87427_update_device(dev);
 722	int nr = to_sensor_dev_attr(devattr)->index;
 723
 724	return sprintf(buf, "%ld\n", temp_from_reg8(data->temp_max[nr]));
 725}
 726
 727static ssize_t show_temp_crit(struct device *dev, struct device_attribute
 728			      *devattr, char *buf)
 729{
 730	struct pc87427_data *data = pc87427_update_device(dev);
 731	int nr = to_sensor_dev_attr(devattr)->index;
 732
 733	return sprintf(buf, "%ld\n", temp_from_reg8(data->temp_crit[nr]));
 734}
 735
 736static ssize_t show_temp_type(struct device *dev, struct device_attribute
 737			      *devattr, char *buf)
 738{
 739	struct pc87427_data *data = pc87427_update_device(dev);
 740	int nr = to_sensor_dev_attr(devattr)->index;
 741
 742	return sprintf(buf, "%u\n", temp_type_from_reg(data->temp_type[nr]));
 743}
 744
 745static ssize_t show_temp_min_alarm(struct device *dev, struct device_attribute
 746				   *devattr, char *buf)
 747{
 748	struct pc87427_data *data = pc87427_update_device(dev);
 749	int nr = to_sensor_dev_attr(devattr)->index;
 750
 751	return sprintf(buf, "%d\n", !!(data->temp_status[nr]
 752				       & TEMP_STATUS_LOWFLG));
 753}
 754
 755static ssize_t show_temp_max_alarm(struct device *dev, struct device_attribute
 756				   *devattr, char *buf)
 757{
 758	struct pc87427_data *data = pc87427_update_device(dev);
 759	int nr = to_sensor_dev_attr(devattr)->index;
 760
 761	return sprintf(buf, "%d\n", !!(data->temp_status[nr]
 762				       & TEMP_STATUS_HIGHFLG));
 763}
 764
 765static ssize_t show_temp_crit_alarm(struct device *dev, struct device_attribute
 766				   *devattr, char *buf)
 767{
 768	struct pc87427_data *data = pc87427_update_device(dev);
 769	int nr = to_sensor_dev_attr(devattr)->index;
 770
 771	return sprintf(buf, "%d\n", !!(data->temp_status[nr]
 772				       & TEMP_STATUS_CRITFLG));
 773}
 774
 775static ssize_t show_temp_fault(struct device *dev, struct device_attribute
 776			       *devattr, char *buf)
 777{
 778	struct pc87427_data *data = pc87427_update_device(dev);
 779	int nr = to_sensor_dev_attr(devattr)->index;
 780
 781	return sprintf(buf, "%d\n", !!(data->temp_status[nr]
 782				       & TEMP_STATUS_SENSERR));
 783}
 784
 785static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp_input, NULL, 0);
 786static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp_input, NULL, 1);
 787static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp_input, NULL, 2);
 788static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_temp_input, NULL, 3);
 789static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO, show_temp_input, NULL, 4);
 790static SENSOR_DEVICE_ATTR(temp6_input, S_IRUGO, show_temp_input, NULL, 5);
 791
 792static SENSOR_DEVICE_ATTR(temp1_min, S_IRUGO, show_temp_min, NULL, 0);
 793static SENSOR_DEVICE_ATTR(temp2_min, S_IRUGO, show_temp_min, NULL, 1);
 794static SENSOR_DEVICE_ATTR(temp3_min, S_IRUGO, show_temp_min, NULL, 2);
 795static SENSOR_DEVICE_ATTR(temp4_min, S_IRUGO, show_temp_min, NULL, 3);
 796static SENSOR_DEVICE_ATTR(temp5_min, S_IRUGO, show_temp_min, NULL, 4);
 797static SENSOR_DEVICE_ATTR(temp6_min, S_IRUGO, show_temp_min, NULL, 5);
 798
 799static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO, show_temp_max, NULL, 0);
 800static SENSOR_DEVICE_ATTR(temp2_max, S_IRUGO, show_temp_max, NULL, 1);
 801static SENSOR_DEVICE_ATTR(temp3_max, S_IRUGO, show_temp_max, NULL, 2);
 802static SENSOR_DEVICE_ATTR(temp4_max, S_IRUGO, show_temp_max, NULL, 3);
 803static SENSOR_DEVICE_ATTR(temp5_max, S_IRUGO, show_temp_max, NULL, 4);
 804static SENSOR_DEVICE_ATTR(temp6_max, S_IRUGO, show_temp_max, NULL, 5);
 805
 806static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, show_temp_crit, NULL, 0);
 807static SENSOR_DEVICE_ATTR(temp2_crit, S_IRUGO, show_temp_crit, NULL, 1);
 808static SENSOR_DEVICE_ATTR(temp3_crit, S_IRUGO, show_temp_crit, NULL, 2);
 809static SENSOR_DEVICE_ATTR(temp4_crit, S_IRUGO, show_temp_crit, NULL, 3);
 810static SENSOR_DEVICE_ATTR(temp5_crit, S_IRUGO, show_temp_crit, NULL, 4);
 811static SENSOR_DEVICE_ATTR(temp6_crit, S_IRUGO, show_temp_crit, NULL, 5);
 812
 813static SENSOR_DEVICE_ATTR(temp1_type, S_IRUGO, show_temp_type, NULL, 0);
 814static SENSOR_DEVICE_ATTR(temp2_type, S_IRUGO, show_temp_type, NULL, 1);
 815static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO, show_temp_type, NULL, 2);
 816static SENSOR_DEVICE_ATTR(temp4_type, S_IRUGO, show_temp_type, NULL, 3);
 817static SENSOR_DEVICE_ATTR(temp5_type, S_IRUGO, show_temp_type, NULL, 4);
 818static SENSOR_DEVICE_ATTR(temp6_type, S_IRUGO, show_temp_type, NULL, 5);
 819
 820static SENSOR_DEVICE_ATTR(temp1_min_alarm, S_IRUGO,
 821			  show_temp_min_alarm, NULL, 0);
 822static SENSOR_DEVICE_ATTR(temp2_min_alarm, S_IRUGO,
 823			  show_temp_min_alarm, NULL, 1);
 824static SENSOR_DEVICE_ATTR(temp3_min_alarm, S_IRUGO,
 825			  show_temp_min_alarm, NULL, 2);
 826static SENSOR_DEVICE_ATTR(temp4_min_alarm, S_IRUGO,
 827			  show_temp_min_alarm, NULL, 3);
 828static SENSOR_DEVICE_ATTR(temp5_min_alarm, S_IRUGO,
 829			  show_temp_min_alarm, NULL, 4);
 830static SENSOR_DEVICE_ATTR(temp6_min_alarm, S_IRUGO,
 831			  show_temp_min_alarm, NULL, 5);
 832
 833static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO,
 834			  show_temp_max_alarm, NULL, 0);
 835static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO,
 836			  show_temp_max_alarm, NULL, 1);
 837static SENSOR_DEVICE_ATTR(temp3_max_alarm, S_IRUGO,
 838			  show_temp_max_alarm, NULL, 2);
 839static SENSOR_DEVICE_ATTR(temp4_max_alarm, S_IRUGO,
 840			  show_temp_max_alarm, NULL, 3);
 841static SENSOR_DEVICE_ATTR(temp5_max_alarm, S_IRUGO,
 842			  show_temp_max_alarm, NULL, 4);
 843static SENSOR_DEVICE_ATTR(temp6_max_alarm, S_IRUGO,
 844			  show_temp_max_alarm, NULL, 5);
 845
 846static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO,
 847			  show_temp_crit_alarm, NULL, 0);
 848static SENSOR_DEVICE_ATTR(temp2_crit_alarm, S_IRUGO,
 849			  show_temp_crit_alarm, NULL, 1);
 850static SENSOR_DEVICE_ATTR(temp3_crit_alarm, S_IRUGO,
 851			  show_temp_crit_alarm, NULL, 2);
 852static SENSOR_DEVICE_ATTR(temp4_crit_alarm, S_IRUGO,
 853			  show_temp_crit_alarm, NULL, 3);
 854static SENSOR_DEVICE_ATTR(temp5_crit_alarm, S_IRUGO,
 855			  show_temp_crit_alarm, NULL, 4);
 856static SENSOR_DEVICE_ATTR(temp6_crit_alarm, S_IRUGO,
 857			  show_temp_crit_alarm, NULL, 5);
 858
 859static SENSOR_DEVICE_ATTR(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0);
 860static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_temp_fault, NULL, 1);
 861static SENSOR_DEVICE_ATTR(temp3_fault, S_IRUGO, show_temp_fault, NULL, 2);
 862static SENSOR_DEVICE_ATTR(temp4_fault, S_IRUGO, show_temp_fault, NULL, 3);
 863static SENSOR_DEVICE_ATTR(temp5_fault, S_IRUGO, show_temp_fault, NULL, 4);
 864static SENSOR_DEVICE_ATTR(temp6_fault, S_IRUGO, show_temp_fault, NULL, 5);
 865
 866static struct attribute *pc87427_attributes_temp[6][10] = {
 867	{
 868		&sensor_dev_attr_temp1_input.dev_attr.attr,
 869		&sensor_dev_attr_temp1_min.dev_attr.attr,
 870		&sensor_dev_attr_temp1_max.dev_attr.attr,
 871		&sensor_dev_attr_temp1_crit.dev_attr.attr,
 872		&sensor_dev_attr_temp1_type.dev_attr.attr,
 873		&sensor_dev_attr_temp1_min_alarm.dev_attr.attr,
 874		&sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
 875		&sensor_dev_attr_temp1_crit_alarm.dev_attr.attr,
 876		&sensor_dev_attr_temp1_fault.dev_attr.attr,
 877		NULL
 878	}, {
 879		&sensor_dev_attr_temp2_input.dev_attr.attr,
 880		&sensor_dev_attr_temp2_min.dev_attr.attr,
 881		&sensor_dev_attr_temp2_max.dev_attr.attr,
 882		&sensor_dev_attr_temp2_crit.dev_attr.attr,
 883		&sensor_dev_attr_temp2_type.dev_attr.attr,
 884		&sensor_dev_attr_temp2_min_alarm.dev_attr.attr,
 885		&sensor_dev_attr_temp2_max_alarm.dev_attr.attr,
 886		&sensor_dev_attr_temp2_crit_alarm.dev_attr.attr,
 887		&sensor_dev_attr_temp2_fault.dev_attr.attr,
 888		NULL
 889	}, {
 890		&sensor_dev_attr_temp3_input.dev_attr.attr,
 891		&sensor_dev_attr_temp3_min.dev_attr.attr,
 892		&sensor_dev_attr_temp3_max.dev_attr.attr,
 893		&sensor_dev_attr_temp3_crit.dev_attr.attr,
 894		&sensor_dev_attr_temp3_type.dev_attr.attr,
 895		&sensor_dev_attr_temp3_min_alarm.dev_attr.attr,
 896		&sensor_dev_attr_temp3_max_alarm.dev_attr.attr,
 897		&sensor_dev_attr_temp3_crit_alarm.dev_attr.attr,
 898		&sensor_dev_attr_temp3_fault.dev_attr.attr,
 899		NULL
 900	}, {
 901		&sensor_dev_attr_temp4_input.dev_attr.attr,
 902		&sensor_dev_attr_temp4_min.dev_attr.attr,
 903		&sensor_dev_attr_temp4_max.dev_attr.attr,
 904		&sensor_dev_attr_temp4_crit.dev_attr.attr,
 905		&sensor_dev_attr_temp4_type.dev_attr.attr,
 906		&sensor_dev_attr_temp4_min_alarm.dev_attr.attr,
 907		&sensor_dev_attr_temp4_max_alarm.dev_attr.attr,
 908		&sensor_dev_attr_temp4_crit_alarm.dev_attr.attr,
 909		&sensor_dev_attr_temp4_fault.dev_attr.attr,
 910		NULL
 911	}, {
 912		&sensor_dev_attr_temp5_input.dev_attr.attr,
 913		&sensor_dev_attr_temp5_min.dev_attr.attr,
 914		&sensor_dev_attr_temp5_max.dev_attr.attr,
 915		&sensor_dev_attr_temp5_crit.dev_attr.attr,
 916		&sensor_dev_attr_temp5_type.dev_attr.attr,
 917		&sensor_dev_attr_temp5_min_alarm.dev_attr.attr,
 918		&sensor_dev_attr_temp5_max_alarm.dev_attr.attr,
 919		&sensor_dev_attr_temp5_crit_alarm.dev_attr.attr,
 920		&sensor_dev_attr_temp5_fault.dev_attr.attr,
 921		NULL
 922	}, {
 923		&sensor_dev_attr_temp6_input.dev_attr.attr,
 924		&sensor_dev_attr_temp6_min.dev_attr.attr,
 925		&sensor_dev_attr_temp6_max.dev_attr.attr,
 926		&sensor_dev_attr_temp6_crit.dev_attr.attr,
 927		&sensor_dev_attr_temp6_type.dev_attr.attr,
 928		&sensor_dev_attr_temp6_min_alarm.dev_attr.attr,
 929		&sensor_dev_attr_temp6_max_alarm.dev_attr.attr,
 930		&sensor_dev_attr_temp6_crit_alarm.dev_attr.attr,
 931		&sensor_dev_attr_temp6_fault.dev_attr.attr,
 932		NULL
 933	}
 934};
 935
 936static const struct attribute_group pc87427_group_temp[6] = {
 937	{ .attrs = pc87427_attributes_temp[0] },
 938	{ .attrs = pc87427_attributes_temp[1] },
 939	{ .attrs = pc87427_attributes_temp[2] },
 940	{ .attrs = pc87427_attributes_temp[3] },
 941	{ .attrs = pc87427_attributes_temp[4] },
 942	{ .attrs = pc87427_attributes_temp[5] },
 943};
 944
 945static ssize_t show_name(struct device *dev, struct device_attribute
 946			 *devattr, char *buf)
 947{
 948	struct pc87427_data *data = dev_get_drvdata(dev);
 949
 950	return sprintf(buf, "%s\n", data->name);
 951}
 952static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
 953
 954
 955/*
 956 * Device detection, attach and detach
 957 */
 958
 959static void pc87427_release_regions(struct platform_device *pdev, int count)
 960{
 961	struct resource *res;
 962	int i;
 963
 964	for (i = 0; i < count; i++) {
 965		res = platform_get_resource(pdev, IORESOURCE_IO, i);
 966		release_region(res->start, resource_size(res));
 967	}
 968}
 969
 970static int __devinit pc87427_request_regions(struct platform_device *pdev,
 971					     int count)
 972{
 973	struct resource *res;
 974	int i, err = 0;
 975
 976	for (i = 0; i < count; i++) {
 977		res = platform_get_resource(pdev, IORESOURCE_IO, i);
 978		if (!res) {
 979			err = -ENOENT;
 980			dev_err(&pdev->dev, "Missing resource #%d\n", i);
 981			break;
 982		}
 983		if (!request_region(res->start, resource_size(res), DRVNAME)) {
 984			err = -EBUSY;
 985			dev_err(&pdev->dev,
 986				"Failed to request region 0x%lx-0x%lx\n",
 987				(unsigned long)res->start,
 988				(unsigned long)res->end);
 989			break;
 990		}
 991	}
 992
 993	if (err && i)
 994		pc87427_release_regions(pdev, i);
 995
 996	return err;
 997}
 998
 999static void __devinit pc87427_init_device(struct device *dev)
1000{
1001	struct pc87427_sio_data *sio_data = dev->platform_data;
1002	struct pc87427_data *data = dev_get_drvdata(dev);
1003	int i;
1004	u8 reg;
1005
1006	/* The FMC module should be ready */
1007	reg = pc87427_read8(data, LD_FAN, PC87427_REG_BANK);
1008	if (!(reg & 0x80))
1009		dev_warn(dev, "%s module not ready!\n", "FMC");
1010
1011	/* Check which fans are enabled */
1012	for (i = 0; i < 8; i++) {
1013		if (!(sio_data->has_fanin & (1 << i)))	/* Not wired */
1014			continue;
1015		reg = pc87427_read8_bank(data, LD_FAN, BANK_FM(i),
1016					 PC87427_REG_FAN_STATUS);
1017		if (reg & FAN_STATUS_MONEN)
1018			data->fan_enabled |= (1 << i);
1019	}
1020
1021	if (!data->fan_enabled) {
1022		dev_dbg(dev, "Enabling monitoring of all fans\n");
1023		for (i = 0; i < 8; i++) {
1024			if (!(sio_data->has_fanin & (1 << i)))	/* Not wired */
1025				continue;
1026			pc87427_write8_bank(data, LD_FAN, BANK_FM(i),
1027					    PC87427_REG_FAN_STATUS,
1028					    FAN_STATUS_MONEN);
1029		}
1030		data->fan_enabled = sio_data->has_fanin;
1031	}
1032
1033	/* Check which PWM outputs are enabled */
1034	for (i = 0; i < 4; i++) {
1035		if (!(sio_data->has_fanout & (1 << i)))	/* Not wired */
1036			continue;
1037		reg = pc87427_read8_bank(data, LD_FAN, BANK_FC(i),
1038					 PC87427_REG_PWM_ENABLE);
1039		if (reg & PWM_ENABLE_CTLEN)
1040			data->pwm_enabled |= (1 << i);
1041
1042		/*
1043		 * We don't expose an interface to reconfigure the automatic
1044		 * fan control mode, so only allow to return to this mode if
1045		 * it was originally set.
1046		 */
1047		if ((reg & PWM_ENABLE_MODE_MASK) == PWM_MODE_AUTO) {
1048			dev_dbg(dev, "PWM%d is in automatic control mode\n",
1049				i + 1);
1050			data->pwm_auto_ok |= (1 << i);
1051		}
1052	}
1053
1054	/* The HMC module should be ready */
1055	reg = pc87427_read8(data, LD_TEMP, PC87427_REG_BANK);
1056	if (!(reg & 0x80))
1057		dev_warn(dev, "%s module not ready!\n", "HMC");
1058
1059	/* Check which temperature channels are enabled */
1060	for (i = 0; i < 6; i++) {
1061		reg = pc87427_read8_bank(data, LD_TEMP, BANK_TM(i),
1062					 PC87427_REG_TEMP_STATUS);
1063		if (reg & TEMP_STATUS_CHANEN)
1064			data->temp_enabled |= (1 << i);
1065	}
1066}
1067
1068static void pc87427_remove_files(struct device *dev)
1069{
1070	struct pc87427_data *data = dev_get_drvdata(dev);
1071	int i;
1072
1073	device_remove_file(dev, &dev_attr_name);
1074	for (i = 0; i < 8; i++) {
1075		if (!(data->fan_enabled & (1 << i)))
1076			continue;
1077		sysfs_remove_group(&dev->kobj, &pc87427_group_fan[i]);
1078	}
1079	for (i = 0; i < 4; i++) {
1080		if (!(data->pwm_enabled & (1 << i)))
1081			continue;
1082		sysfs_remove_group(&dev->kobj, &pc87427_group_pwm[i]);
1083	}
1084	for (i = 0; i < 6; i++) {
1085		if (!(data->temp_enabled & (1 << i)))
1086			continue;
1087		sysfs_remove_group(&dev->kobj, &pc87427_group_temp[i]);
1088	}
1089}
1090
1091static int __devinit pc87427_probe(struct platform_device *pdev)
1092{
1093	struct pc87427_sio_data *sio_data = pdev->dev.platform_data;
1094	struct pc87427_data *data;
1095	int i, err, res_count;
1096
1097	data = kzalloc(sizeof(struct pc87427_data), GFP_KERNEL);
1098	if (!data) {
1099		err = -ENOMEM;
1100		pr_err("Out of memory\n");
1101		goto exit;
1102	}
1103
1104	data->address[0] = sio_data->address[0];
1105	data->address[1] = sio_data->address[1];
1106	res_count = (data->address[0] != 0) + (data->address[1] != 0);
1107
1108	err = pc87427_request_regions(pdev, res_count);
1109	if (err)
1110		goto exit_kfree;
1111
1112	mutex_init(&data->lock);
1113	data->name = "pc87427";
1114	platform_set_drvdata(pdev, data);
1115	pc87427_init_device(&pdev->dev);
1116
1117	/* Register sysfs hooks */
1118	err = device_create_file(&pdev->dev, &dev_attr_name);
1119	if (err)
1120		goto exit_release_region;
1121	for (i = 0; i < 8; i++) {
1122		if (!(data->fan_enabled & (1 << i)))
1123			continue;
1124		err = sysfs_create_group(&pdev->dev.kobj,
1125					 &pc87427_group_fan[i]);
1126		if (err)
1127			goto exit_remove_files;
1128	}
1129	for (i = 0; i < 4; i++) {
1130		if (!(data->pwm_enabled & (1 << i)))
1131			continue;
1132		err = sysfs_create_group(&pdev->dev.kobj,
1133					 &pc87427_group_pwm[i]);
1134		if (err)
1135			goto exit_remove_files;
1136	}
1137	for (i = 0; i < 6; i++) {
1138		if (!(data->temp_enabled & (1 << i)))
1139			continue;
1140		err = sysfs_create_group(&pdev->dev.kobj,
1141					 &pc87427_group_temp[i]);
1142		if (err)
1143			goto exit_remove_files;
1144	}
1145
1146	data->hwmon_dev = hwmon_device_register(&pdev->dev);
1147	if (IS_ERR(data->hwmon_dev)) {
1148		err = PTR_ERR(data->hwmon_dev);
1149		dev_err(&pdev->dev, "Class registration failed (%d)\n", err);
1150		goto exit_remove_files;
1151	}
1152
1153	return 0;
1154
1155exit_remove_files:
1156	pc87427_remove_files(&pdev->dev);
1157exit_release_region:
1158	pc87427_release_regions(pdev, res_count);
1159exit_kfree:
1160	platform_set_drvdata(pdev, NULL);
1161	kfree(data);
1162exit:
1163	return err;
1164}
1165
1166static int __devexit pc87427_remove(struct platform_device *pdev)
1167{
1168	struct pc87427_data *data = platform_get_drvdata(pdev);
1169	int res_count;
1170
1171	res_count = (data->address[0] != 0) + (data->address[1] != 0);
1172
1173	hwmon_device_unregister(data->hwmon_dev);
1174	pc87427_remove_files(&pdev->dev);
1175	platform_set_drvdata(pdev, NULL);
1176	kfree(data);
1177
1178	pc87427_release_regions(pdev, res_count);
1179
1180	return 0;
1181}
1182
1183
1184static struct platform_driver pc87427_driver = {
1185	.driver = {
1186		.owner	= THIS_MODULE,
1187		.name	= DRVNAME,
1188	},
1189	.probe		= pc87427_probe,
1190	.remove		= __devexit_p(pc87427_remove),
1191};
1192
1193static int __init pc87427_device_add(const struct pc87427_sio_data *sio_data)
1194{
1195	struct resource res[2] = {
1196		{ .flags	= IORESOURCE_IO },
1197		{ .flags	= IORESOURCE_IO },
1198	};
1199	int err, i, res_count;
1200
1201	res_count = 0;
1202	for (i = 0; i < 2; i++) {
1203		if (!sio_data->address[i])
1204			continue;
1205		res[res_count].start = sio_data->address[i];
1206		res[res_count].end = sio_data->address[i] + REGION_LENGTH - 1;
1207		res[res_count].name = logdev_str[i];
1208
1209		err = acpi_check_resource_conflict(&res[res_count]);
1210		if (err)
1211			goto exit;
1212
1213		res_count++;
1214	}
1215
1216	pdev = platform_device_alloc(DRVNAME, res[0].start);
1217	if (!pdev) {
1218		err = -ENOMEM;
1219		pr_err("Device allocation failed\n");
1220		goto exit;
1221	}
1222
1223	err = platform_device_add_resources(pdev, res, res_count);
1224	if (err) {
1225		pr_err("Device resource addition failed (%d)\n", err);
1226		goto exit_device_put;
1227	}
1228
1229	err = platform_device_add_data(pdev, sio_data,
1230				       sizeof(struct pc87427_sio_data));
1231	if (err) {
1232		pr_err("Platform data allocation failed\n");
1233		goto exit_device_put;
1234	}
1235
1236	err = platform_device_add(pdev);
1237	if (err) {
1238		pr_err("Device addition failed (%d)\n", err);
1239		goto exit_device_put;
1240	}
1241
1242	return 0;
1243
1244exit_device_put:
1245	platform_device_put(pdev);
1246exit:
1247	return err;
1248}
1249
1250static int __init pc87427_find(int sioaddr, struct pc87427_sio_data *sio_data)
1251{
1252	u16 val;
1253	u8 cfg, cfg_b;
1254	int i, err = 0;
1255
1256	/* Identify device */
1257	val = force_id ? force_id : superio_inb(sioaddr, SIOREG_DEVID);
1258	if (val != 0xf2) {	/* PC87427 */
1259		err = -ENODEV;
1260		goto exit;
1261	}
1262
1263	for (i = 0; i < 2; i++) {
1264		sio_data->address[i] = 0;
1265		/* Select logical device */
1266		superio_outb(sioaddr, SIOREG_LDSEL, logdev[i]);
1267
1268		val = superio_inb(sioaddr, SIOREG_ACT);
1269		if (!(val & 0x01)) {
1270			pr_info("Logical device 0x%02x not activated\n",
1271				logdev[i]);
1272			continue;
1273		}
1274
1275		val = superio_inb(sioaddr, SIOREG_MAP);
1276		if (val & 0x01) {
1277			pr_warn("Logical device 0x%02x is memory-mapped, "
1278				"can't use\n", logdev[i]);
1279			continue;
1280		}
1281
1282		val = (superio_inb(sioaddr, SIOREG_IOBASE) << 8)
1283		    | superio_inb(sioaddr, SIOREG_IOBASE + 1);
1284		if (!val) {
1285			pr_info("I/O base address not set for logical device "
1286				"0x%02x\n", logdev[i]);
1287			continue;
1288		}
1289		sio_data->address[i] = val;
1290	}
1291
1292	/* No point in loading the driver if everything is disabled */
1293	if (!sio_data->address[0] && !sio_data->address[1]) {
1294		err = -ENODEV;
1295		goto exit;
1296	}
1297
1298	/* Check which fan inputs are wired */
1299	sio_data->has_fanin = (1 << 2) | (1 << 3);	/* FANIN2, FANIN3 */
1300
1301	cfg = superio_inb(sioaddr, SIOREG_CF2);
1302	if (!(cfg & (1 << 3)))
1303		sio_data->has_fanin |= (1 << 0);	/* FANIN0 */
1304	if (!(cfg & (1 << 2)))
1305		sio_data->has_fanin |= (1 << 4);	/* FANIN4 */
1306
1307	cfg = superio_inb(sioaddr, SIOREG_CFD);
1308	if (!(cfg & (1 << 0)))
1309		sio_data->has_fanin |= (1 << 1);	/* FANIN1 */
1310
1311	cfg = superio_inb(sioaddr, SIOREG_CF4);
1312	if (!(cfg & (1 << 0)))
1313		sio_data->has_fanin |= (1 << 7);	/* FANIN7 */
1314	cfg_b = superio_inb(sioaddr, SIOREG_CFB);
1315	if (!(cfg & (1 << 1)) && (cfg_b & (1 << 3)))
1316		sio_data->has_fanin |= (1 << 5);	/* FANIN5 */
1317	cfg = superio_inb(sioaddr, SIOREG_CF3);
1318	if ((cfg & (1 << 3)) && !(cfg_b & (1 << 5)))
1319		sio_data->has_fanin |= (1 << 6);	/* FANIN6 */
1320
1321	/* Check which fan outputs are wired */
1322	sio_data->has_fanout = (1 << 0);		/* FANOUT0 */
1323	if (cfg_b & (1 << 0))
1324		sio_data->has_fanout |= (1 << 3);	/* FANOUT3 */
1325
1326	cfg = superio_inb(sioaddr, SIOREG_CFC);
1327	if (!(cfg & (1 << 4))) {
1328		if (cfg_b & (1 << 1))
1329			sio_data->has_fanout |= (1 << 1); /* FANOUT1 */
1330		if (cfg_b & (1 << 2))
1331			sio_data->has_fanout |= (1 << 2); /* FANOUT2 */
1332	}
1333
1334	/* FANOUT1 and FANOUT2 can each be routed to 2 different pins */
1335	cfg = superio_inb(sioaddr, SIOREG_CF5);
1336	if (cfg & (1 << 6))
1337		sio_data->has_fanout |= (1 << 1);	/* FANOUT1 */
1338	if (cfg & (1 << 5))
1339		sio_data->has_fanout |= (1 << 2);	/* FANOUT2 */
1340
1341exit:
1342	superio_exit(sioaddr);
1343	return err;
1344}
1345
1346static int __init pc87427_init(void)
1347{
1348	int err;
1349	struct pc87427_sio_data sio_data;
1350
1351	if (pc87427_find(0x2e, &sio_data)
1352	 && pc87427_find(0x4e, &sio_data))
1353		return -ENODEV;
1354
1355	err = platform_driver_register(&pc87427_driver);
1356	if (err)
1357		goto exit;
1358
1359	/* Sets global pdev as a side effect */
1360	err = pc87427_device_add(&sio_data);
1361	if (err)
1362		goto exit_driver;
1363
1364	return 0;
1365
1366exit_driver:
1367	platform_driver_unregister(&pc87427_driver);
1368exit:
1369	return err;
1370}
1371
1372static void __exit pc87427_exit(void)
1373{
1374	platform_device_unregister(pdev);
1375	platform_driver_unregister(&pc87427_driver);
1376}
1377
1378MODULE_AUTHOR("Jean Delvare <khali@linux-fr.org>");
1379MODULE_DESCRIPTION("PC87427 hardware monitoring driver");
1380MODULE_LICENSE("GPL");
1381
1382module_init(pc87427_init);
1383module_exit(pc87427_exit);