Linux Audio

Check our new training course

Loading...
v3.1
   1/***************************************************************************
   2 *   Copyright (C) 2006 by Hans Edgington <hans@edgington.nl>              *
   3 *   Copyright (C) 2007-2011 Hans de Goede <hdegoede@redhat.com>           *
   4 *                                                                         *
   5 *   This program is free software; you can redistribute it and/or modify  *
   6 *   it under the terms of the GNU General Public License as published by  *
   7 *   the Free Software Foundation; either version 2 of the License, or     *
   8 *   (at your option) any later version.                                   *
   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 *   You should have received a copy of the GNU General Public License     *
  16 *   along with this program; if not, write to the                         *
  17 *   Free Software Foundation, Inc.,                                       *
  18 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  19 ***************************************************************************/
  20
  21#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  22
  23#include <linux/module.h>
  24#include <linux/init.h>
  25#include <linux/slab.h>
  26#include <linux/jiffies.h>
  27#include <linux/platform_device.h>
  28#include <linux/hwmon.h>
  29#include <linux/hwmon-sysfs.h>
  30#include <linux/err.h>
  31#include <linux/mutex.h>
  32#include <linux/io.h>
  33#include <linux/acpi.h>
  34
  35#define DRVNAME "f71882fg"
  36
  37#define SIO_F71858FG_LD_HWM	0x02	/* Hardware monitor logical device */
  38#define SIO_F71882FG_LD_HWM	0x04	/* Hardware monitor logical device */
  39#define SIO_UNLOCK_KEY		0x87	/* Key to enable Super-I/O */
  40#define SIO_LOCK_KEY		0xAA	/* Key to disable Super-I/O */
  41
  42#define SIO_REG_LDSEL		0x07	/* Logical device select */
  43#define SIO_REG_DEVID		0x20	/* Device ID (2 bytes) */
  44#define SIO_REG_DEVREV		0x22	/* Device revision */
  45#define SIO_REG_MANID		0x23	/* Fintek ID (2 bytes) */
  46#define SIO_REG_ENABLE		0x30	/* Logical device enable */
  47#define SIO_REG_ADDR		0x60	/* Logical device address (2 bytes) */
  48
  49#define SIO_FINTEK_ID		0x1934	/* Manufacturers ID */
  50#define SIO_F71808E_ID		0x0901	/* Chipset ID */
  51#define SIO_F71808A_ID		0x1001	/* Chipset ID */
  52#define SIO_F71858_ID		0x0507  /* Chipset ID */
  53#define SIO_F71862_ID		0x0601	/* Chipset ID */
 
  54#define SIO_F71869_ID		0x0814	/* Chipset ID */
  55#define SIO_F71869A_ID		0x1007	/* Chipset ID */
  56#define SIO_F71882_ID		0x0541	/* Chipset ID */
  57#define SIO_F71889_ID		0x0723	/* Chipset ID */
  58#define SIO_F71889E_ID		0x0909	/* Chipset ID */
  59#define SIO_F71889A_ID		0x1005	/* Chipset ID */
  60#define SIO_F8000_ID		0x0581	/* Chipset ID */
 
  61#define SIO_F81865_ID		0x0704	/* Chipset ID */
 
  62
  63#define REGION_LENGTH		8
  64#define ADDR_REG_OFFSET		5
  65#define DATA_REG_OFFSET		6
  66
  67#define F71882FG_REG_IN_STATUS		0x12 /* f7188x only */
  68#define F71882FG_REG_IN_BEEP		0x13 /* f7188x only */
  69#define F71882FG_REG_IN(nr)		(0x20  + (nr))
  70#define F71882FG_REG_IN1_HIGH		0x32 /* f7188x only */
  71
 
 
 
 
  72#define F71882FG_REG_FAN(nr)		(0xA0 + (16 * (nr)))
  73#define F71882FG_REG_FAN_TARGET(nr)	(0xA2 + (16 * (nr)))
  74#define F71882FG_REG_FAN_FULL_SPEED(nr)	(0xA4 + (16 * (nr)))
  75#define F71882FG_REG_FAN_STATUS		0x92
  76#define F71882FG_REG_FAN_BEEP		0x93
  77
  78#define F71882FG_REG_TEMP(nr)		(0x70 + 2 * (nr))
  79#define F71882FG_REG_TEMP_OVT(nr)	(0x80 + 2 * (nr))
  80#define F71882FG_REG_TEMP_HIGH(nr)	(0x81 + 2 * (nr))
  81#define F71882FG_REG_TEMP_STATUS	0x62
  82#define F71882FG_REG_TEMP_BEEP		0x63
  83#define F71882FG_REG_TEMP_CONFIG	0x69
  84#define F71882FG_REG_TEMP_HYST(nr)	(0x6C + (nr))
  85#define F71882FG_REG_TEMP_TYPE		0x6B
  86#define F71882FG_REG_TEMP_DIODE_OPEN	0x6F
  87
  88#define F71882FG_REG_PWM(nr)		(0xA3 + (16 * (nr)))
  89#define F71882FG_REG_PWM_TYPE		0x94
  90#define F71882FG_REG_PWM_ENABLE		0x96
  91
  92#define F71882FG_REG_FAN_HYST(nr)	(0x98 + (nr))
  93
  94#define F71882FG_REG_FAN_FAULT_T	0x9F
  95#define F71882FG_FAN_NEG_TEMP_EN	0x20
  96#define F71882FG_FAN_PROG_SEL		0x80
  97
  98#define F71882FG_REG_POINT_PWM(pwm, point)	(0xAA + (point) + (16 * (pwm)))
  99#define F71882FG_REG_POINT_TEMP(pwm, point)	(0xA6 + (point) + (16 * (pwm)))
 100#define F71882FG_REG_POINT_MAPPING(nr)		(0xAF + 16 * (nr))
 101
 102#define	F71882FG_REG_START		0x01
 103
 104#define F71882FG_MAX_INS		9
 105
 106#define FAN_MIN_DETECT			366 /* Lowest detectable fanspeed */
 107
 108static unsigned short force_id;
 109module_param(force_id, ushort, 0);
 110MODULE_PARM_DESC(force_id, "Override the detected device ID");
 111
 112enum chips { f71808e, f71808a, f71858fg, f71862fg, f71869, f71869a, f71882fg,
 113	     f71889fg, f71889ed, f71889a, f8000, f81865f };
 
 114
 115static const char *f71882fg_names[] = {
 116	"f71808e",
 117	"f71808a",
 118	"f71858fg",
 119	"f71862fg",
 
 120	"f71869", /* Both f71869f and f71869e, reg. compatible and same id */
 121	"f71869a",
 122	"f71882fg",
 123	"f71889fg", /* f81801u too, same id */
 124	"f71889ed",
 125	"f71889a",
 126	"f8000",
 
 127	"f81865f",
 
 128};
 129
 130static const char f71882fg_has_in[][F71882FG_MAX_INS] = {
 131	[f71808e]	= { 1, 1, 1, 1, 1, 1, 0, 1, 1 },
 132	[f71808a]	= { 1, 1, 1, 1, 0, 0, 0, 1, 1 },
 133	[f71858fg]	= { 1, 1, 1, 0, 0, 0, 0, 0, 0 },
 134	[f71862fg]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
 135	[f71869]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
 136	[f71869a]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
 137	[f71882fg]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
 138	[f71889fg]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
 139	[f71889ed]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
 140	[f71889a]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
 141	[f8000]		= { 1, 1, 1, 0, 0, 0, 0, 0, 0 },
 142	[f81865f]	= { 1, 1, 1, 1, 1, 1, 1, 0, 0 },
 
 
 
 143};
 144
 145static const char f71882fg_has_in1_alarm[] = {
 146	[f71808e]	= 0,
 147	[f71808a]	= 0,
 148	[f71858fg]	= 0,
 149	[f71862fg]	= 0,
 
 150	[f71869]	= 0,
 151	[f71869a]	= 0,
 152	[f71882fg]	= 1,
 153	[f71889fg]	= 1,
 154	[f71889ed]	= 1,
 155	[f71889a]	= 1,
 156	[f8000]		= 0,
 
 157	[f81865f]	= 1,
 
 158};
 159
 160static const char f71882fg_fan_has_beep[] = {
 161	[f71808e]	= 0,
 162	[f71808a]	= 0,
 163	[f71858fg]	= 0,
 164	[f71862fg]	= 1,
 
 165	[f71869]	= 1,
 166	[f71869a]	= 1,
 167	[f71882fg]	= 1,
 168	[f71889fg]	= 1,
 169	[f71889ed]	= 1,
 170	[f71889a]	= 1,
 171	[f8000]		= 0,
 
 172	[f81865f]	= 1,
 
 173};
 174
 175static const char f71882fg_nr_fans[] = {
 176	[f71808e]	= 3,
 177	[f71808a]	= 2, /* +1 fan which is monitor + simple pwm only */
 178	[f71858fg]	= 3,
 179	[f71862fg]	= 3,
 
 180	[f71869]	= 3,
 181	[f71869a]	= 3,
 182	[f71882fg]	= 4,
 183	[f71889fg]	= 3,
 184	[f71889ed]	= 3,
 185	[f71889a]	= 3,
 186	[f8000]		= 3, /* +1 fan which is monitor only */
 
 187	[f81865f]	= 2,
 
 188};
 189
 190static const char f71882fg_temp_has_beep[] = {
 191	[f71808e]	= 0,
 192	[f71808a]	= 1,
 193	[f71858fg]	= 0,
 194	[f71862fg]	= 1,
 
 195	[f71869]	= 1,
 196	[f71869a]	= 1,
 197	[f71882fg]	= 1,
 198	[f71889fg]	= 1,
 199	[f71889ed]	= 1,
 200	[f71889a]	= 1,
 201	[f8000]		= 0,
 
 202	[f81865f]	= 1,
 
 203};
 204
 205static const char f71882fg_nr_temps[] = {
 206	[f71808e]	= 2,
 207	[f71808a]	= 2,
 208	[f71858fg]	= 3,
 209	[f71862fg]	= 3,
 
 210	[f71869]	= 3,
 211	[f71869a]	= 3,
 212	[f71882fg]	= 3,
 213	[f71889fg]	= 3,
 214	[f71889ed]	= 3,
 215	[f71889a]	= 3,
 216	[f8000]		= 3,
 
 217	[f81865f]	= 2,
 
 218};
 219
 220static struct platform_device *f71882fg_pdev;
 221
 222/* Super-I/O Function prototypes */
 223static inline int superio_inb(int base, int reg);
 224static inline int superio_inw(int base, int reg);
 225static inline int superio_enter(int base);
 226static inline void superio_select(int base, int ld);
 227static inline void superio_exit(int base);
 228
 229struct f71882fg_sio_data {
 230	enum chips type;
 231};
 232
 233struct f71882fg_data {
 234	unsigned short addr;
 235	enum chips type;
 236	struct device *hwmon_dev;
 237
 238	struct mutex update_lock;
 239	int temp_start;			/* temp numbering start (0 or 1) */
 240	char valid;			/* !=0 if following fields are valid */
 241	char auto_point_temp_signed;
 242	unsigned long last_updated;	/* In jiffies */
 243	unsigned long last_limits;	/* In jiffies */
 244
 245	/* Register Values */
 246	u8	in[F71882FG_MAX_INS];
 247	u8	in1_max;
 248	u8	in_status;
 249	u8	in_beep;
 250	u16	fan[4];
 251	u16	fan_target[4];
 252	u16	fan_full_speed[4];
 253	u8	fan_status;
 254	u8	fan_beep;
 255	/* Note: all models have max 3 temperature channels, but on some
 256	   they are addressed as 0-2 and on others as 1-3, so for coding
 257	   convenience we reserve space for 4 channels */
 
 
 258	u16	temp[4];
 259	u8	temp_ovt[4];
 260	u8	temp_high[4];
 261	u8	temp_hyst[2]; /* 2 hysts stored per reg */
 262	u8	temp_type[4];
 263	u8	temp_status;
 264	u8	temp_beep;
 265	u8	temp_diode_open;
 266	u8	temp_config;
 267	u8	pwm[4];
 268	u8	pwm_enable;
 269	u8	pwm_auto_point_hyst[2];
 270	u8	pwm_auto_point_mapping[4];
 271	u8	pwm_auto_point_pwm[4][5];
 272	s8	pwm_auto_point_temp[4][4];
 273};
 274
 275/* Sysfs in */
 276static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
 277	char *buf);
 278static ssize_t show_in_max(struct device *dev, struct device_attribute
 279	*devattr, char *buf);
 280static ssize_t store_in_max(struct device *dev, struct device_attribute
 281	*devattr, const char *buf, size_t count);
 282static ssize_t show_in_beep(struct device *dev, struct device_attribute
 283	*devattr, char *buf);
 284static ssize_t store_in_beep(struct device *dev, struct device_attribute
 285	*devattr, const char *buf, size_t count);
 286static ssize_t show_in_alarm(struct device *dev, struct device_attribute
 287	*devattr, char *buf);
 288/* Sysfs Fan */
 289static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
 290	char *buf);
 291static ssize_t show_fan_full_speed(struct device *dev,
 292	struct device_attribute *devattr, char *buf);
 293static ssize_t store_fan_full_speed(struct device *dev,
 294	struct device_attribute *devattr, const char *buf, size_t count);
 295static ssize_t show_fan_beep(struct device *dev, struct device_attribute
 296	*devattr, char *buf);
 297static ssize_t store_fan_beep(struct device *dev, struct device_attribute
 298	*devattr, const char *buf, size_t count);
 299static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
 300	*devattr, char *buf);
 301/* Sysfs Temp */
 302static ssize_t show_temp(struct device *dev, struct device_attribute
 303	*devattr, char *buf);
 304static ssize_t show_temp_max(struct device *dev, struct device_attribute
 305	*devattr, char *buf);
 306static ssize_t store_temp_max(struct device *dev, struct device_attribute
 307	*devattr, const char *buf, size_t count);
 308static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute
 309	*devattr, char *buf);
 310static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute
 311	*devattr, const char *buf, size_t count);
 312static ssize_t show_temp_crit(struct device *dev, struct device_attribute
 313	*devattr, char *buf);
 314static ssize_t store_temp_crit(struct device *dev, struct device_attribute
 315	*devattr, const char *buf, size_t count);
 316static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute
 317	*devattr, char *buf);
 318static ssize_t show_temp_type(struct device *dev, struct device_attribute
 319	*devattr, char *buf);
 320static ssize_t show_temp_beep(struct device *dev, struct device_attribute
 321	*devattr, char *buf);
 322static ssize_t store_temp_beep(struct device *dev, struct device_attribute
 323	*devattr, const char *buf, size_t count);
 324static ssize_t show_temp_alarm(struct device *dev, struct device_attribute
 325	*devattr, char *buf);
 326static ssize_t show_temp_fault(struct device *dev, struct device_attribute
 327	*devattr, char *buf);
 328/* PWM and Auto point control */
 329static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr,
 330	char *buf);
 331static ssize_t store_pwm(struct device *dev, struct device_attribute *devattr,
 332	const char *buf, size_t count);
 333static ssize_t show_simple_pwm(struct device *dev,
 334	struct device_attribute *devattr, char *buf);
 335static ssize_t store_simple_pwm(struct device *dev,
 336	struct device_attribute *devattr, const char *buf, size_t count);
 337static ssize_t show_pwm_enable(struct device *dev,
 338	struct device_attribute *devattr, char *buf);
 339static ssize_t store_pwm_enable(struct device *dev,
 340	struct device_attribute	*devattr, const char *buf, size_t count);
 341static ssize_t show_pwm_interpolate(struct device *dev,
 342	struct device_attribute *devattr, char *buf);
 343static ssize_t store_pwm_interpolate(struct device *dev,
 344	struct device_attribute *devattr, const char *buf, size_t count);
 345static ssize_t show_pwm_auto_point_channel(struct device *dev,
 346	struct device_attribute *devattr, char *buf);
 347static ssize_t store_pwm_auto_point_channel(struct device *dev,
 348	struct device_attribute *devattr, const char *buf, size_t count);
 349static ssize_t show_pwm_auto_point_temp_hyst(struct device *dev,
 350	struct device_attribute *devattr, char *buf);
 351static ssize_t store_pwm_auto_point_temp_hyst(struct device *dev,
 352	struct device_attribute *devattr, const char *buf, size_t count);
 353static ssize_t show_pwm_auto_point_pwm(struct device *dev,
 354	struct device_attribute *devattr, char *buf);
 355static ssize_t store_pwm_auto_point_pwm(struct device *dev,
 356	struct device_attribute *devattr, const char *buf, size_t count);
 357static ssize_t show_pwm_auto_point_temp(struct device *dev,
 358	struct device_attribute *devattr, char *buf);
 359static ssize_t store_pwm_auto_point_temp(struct device *dev,
 360	struct device_attribute *devattr, const char *buf, size_t count);
 361/* Sysfs misc */
 362static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
 363	char *buf);
 364
 365static int __devinit f71882fg_probe(struct platform_device * pdev);
 366static int f71882fg_remove(struct platform_device *pdev);
 367
 368static struct platform_driver f71882fg_driver = {
 369	.driver = {
 370		.owner	= THIS_MODULE,
 371		.name	= DRVNAME,
 372	},
 373	.probe		= f71882fg_probe,
 374	.remove		= f71882fg_remove,
 375};
 376
 377static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
 378
 379/* Temp attr for the f71858fg, the f71858fg is special as it has its
 380   temperature indexes start at 0 (the others start at 1) */
 
 
 381static struct sensor_device_attribute_2 f71858fg_temp_attr[] = {
 382	SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0),
 383	SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_max,
 384		store_temp_max, 0, 0),
 385	SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 386		store_temp_max_hyst, 0, 0),
 387	SENSOR_ATTR_2(temp1_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 0),
 388	SENSOR_ATTR_2(temp1_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 389		store_temp_crit, 0, 0),
 390	SENSOR_ATTR_2(temp1_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 391		0, 0),
 392	SENSOR_ATTR_2(temp1_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 4),
 393	SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 0),
 394	SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 1),
 395	SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_max,
 396		store_temp_max, 0, 1),
 397	SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 398		store_temp_max_hyst, 0, 1),
 399	SENSOR_ATTR_2(temp2_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 1),
 400	SENSOR_ATTR_2(temp2_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 401		store_temp_crit, 0, 1),
 402	SENSOR_ATTR_2(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 403		0, 1),
 404	SENSOR_ATTR_2(temp2_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5),
 405	SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
 406	SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 2),
 407	SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_max,
 408		store_temp_max, 0, 2),
 409	SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 410		store_temp_max_hyst, 0, 2),
 411	SENSOR_ATTR_2(temp3_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 2),
 412	SENSOR_ATTR_2(temp3_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 413		store_temp_crit, 0, 2),
 414	SENSOR_ATTR_2(temp3_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 415		0, 2),
 416	SENSOR_ATTR_2(temp3_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6),
 417	SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
 418};
 419
 420/* Temp attr for the standard models */
 421static struct sensor_device_attribute_2 fxxxx_temp_attr[3][9] = { {
 422	SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 1),
 423	SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_max,
 424		store_temp_max, 0, 1),
 425	SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 426		store_temp_max_hyst, 0, 1),
 427	/* Should really be temp1_max_alarm, but older versions did not handle
 428	   the max and crit alarms separately and lm_sensors v2 depends on the
 429	   presence of temp#_alarm files. The same goes for temp2/3 _alarm. */
 
 
 430	SENSOR_ATTR_2(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 1),
 431	SENSOR_ATTR_2(temp1_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 432		store_temp_crit, 0, 1),
 433	SENSOR_ATTR_2(temp1_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 434		0, 1),
 435	SENSOR_ATTR_2(temp1_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5),
 436	SENSOR_ATTR_2(temp1_type, S_IRUGO, show_temp_type, NULL, 0, 1),
 437	SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
 438}, {
 439	SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 2),
 440	SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_max,
 441		store_temp_max, 0, 2),
 442	SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 443		store_temp_max_hyst, 0, 2),
 444	/* Should be temp2_max_alarm, see temp1_alarm note */
 445	SENSOR_ATTR_2(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 2),
 446	SENSOR_ATTR_2(temp2_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 447		store_temp_crit, 0, 2),
 448	SENSOR_ATTR_2(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 449		0, 2),
 450	SENSOR_ATTR_2(temp2_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6),
 451	SENSOR_ATTR_2(temp2_type, S_IRUGO, show_temp_type, NULL, 0, 2),
 452	SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
 453}, {
 454	SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 3),
 455	SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_max,
 456		store_temp_max, 0, 3),
 457	SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 458		store_temp_max_hyst, 0, 3),
 459	/* Should be temp3_max_alarm, see temp1_alarm note */
 460	SENSOR_ATTR_2(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 3),
 461	SENSOR_ATTR_2(temp3_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 462		store_temp_crit, 0, 3),
 463	SENSOR_ATTR_2(temp3_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 464		0, 3),
 465	SENSOR_ATTR_2(temp3_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 7),
 466	SENSOR_ATTR_2(temp3_type, S_IRUGO, show_temp_type, NULL, 0, 3),
 467	SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 3),
 468} };
 469
 470/* Temp attr for models which can beep on temp alarm */
 471static struct sensor_device_attribute_2 fxxxx_temp_beep_attr[3][2] = { {
 472	SENSOR_ATTR_2(temp1_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 473		store_temp_beep, 0, 1),
 474	SENSOR_ATTR_2(temp1_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 475		store_temp_beep, 0, 5),
 476}, {
 477	SENSOR_ATTR_2(temp2_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 478		store_temp_beep, 0, 2),
 479	SENSOR_ATTR_2(temp2_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 480		store_temp_beep, 0, 6),
 481}, {
 482	SENSOR_ATTR_2(temp3_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 483		store_temp_beep, 0, 3),
 484	SENSOR_ATTR_2(temp3_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 485		store_temp_beep, 0, 7),
 486} };
 487
 488/* Temp attr for the f8000
 489   Note on the f8000 temp_ovt (crit) is used as max, and temp_high (max)
 490   is used as hysteresis value to clear alarms
 491   Also like the f71858fg its temperature indexes start at 0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 492 */
 493static struct sensor_device_attribute_2 f8000_temp_attr[] = {
 494	SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0),
 495	SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_crit,
 496		store_temp_crit, 0, 0),
 497	SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
 498		store_temp_max, 0, 0),
 499	SENSOR_ATTR_2(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 4),
 500	SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 0),
 501	SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 1),
 502	SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_crit,
 503		store_temp_crit, 0, 1),
 504	SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
 505		store_temp_max, 0, 1),
 506	SENSOR_ATTR_2(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5),
 507	SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
 508	SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 2),
 509	SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_crit,
 510		store_temp_crit, 0, 2),
 511	SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
 512		store_temp_max, 0, 2),
 513	SENSOR_ATTR_2(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6),
 514	SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
 515};
 516
 517/* in attr for all models */
 518static struct sensor_device_attribute_2 fxxxx_in_attr[] = {
 519	SENSOR_ATTR_2(in0_input, S_IRUGO, show_in, NULL, 0, 0),
 520	SENSOR_ATTR_2(in1_input, S_IRUGO, show_in, NULL, 0, 1),
 521	SENSOR_ATTR_2(in2_input, S_IRUGO, show_in, NULL, 0, 2),
 522	SENSOR_ATTR_2(in3_input, S_IRUGO, show_in, NULL, 0, 3),
 523	SENSOR_ATTR_2(in4_input, S_IRUGO, show_in, NULL, 0, 4),
 524	SENSOR_ATTR_2(in5_input, S_IRUGO, show_in, NULL, 0, 5),
 525	SENSOR_ATTR_2(in6_input, S_IRUGO, show_in, NULL, 0, 6),
 526	SENSOR_ATTR_2(in7_input, S_IRUGO, show_in, NULL, 0, 7),
 527	SENSOR_ATTR_2(in8_input, S_IRUGO, show_in, NULL, 0, 8),
 
 
 528};
 529
 530/* For models with in1 alarm capability */
 531static struct sensor_device_attribute_2 fxxxx_in1_alarm_attr[] = {
 532	SENSOR_ATTR_2(in1_max, S_IRUGO|S_IWUSR, show_in_max, store_in_max,
 533		0, 1),
 534	SENSOR_ATTR_2(in1_beep, S_IRUGO|S_IWUSR, show_in_beep, store_in_beep,
 535		0, 1),
 536	SENSOR_ATTR_2(in1_alarm, S_IRUGO, show_in_alarm, NULL, 0, 1),
 537};
 538
 539/* Fan / PWM attr common to all models */
 540static struct sensor_device_attribute_2 fxxxx_fan_attr[4][6] = { {
 541	SENSOR_ATTR_2(fan1_input, S_IRUGO, show_fan, NULL, 0, 0),
 542	SENSOR_ATTR_2(fan1_full_speed, S_IRUGO|S_IWUSR,
 543		      show_fan_full_speed,
 544		      store_fan_full_speed, 0, 0),
 545	SENSOR_ATTR_2(fan1_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 0),
 546	SENSOR_ATTR_2(pwm1, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 0),
 547	SENSOR_ATTR_2(pwm1_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
 548		      store_pwm_enable, 0, 0),
 549	SENSOR_ATTR_2(pwm1_interpolate, S_IRUGO|S_IWUSR,
 550		      show_pwm_interpolate, store_pwm_interpolate, 0, 0),
 551}, {
 552	SENSOR_ATTR_2(fan2_input, S_IRUGO, show_fan, NULL, 0, 1),
 553	SENSOR_ATTR_2(fan2_full_speed, S_IRUGO|S_IWUSR,
 554		      show_fan_full_speed,
 555		      store_fan_full_speed, 0, 1),
 556	SENSOR_ATTR_2(fan2_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 1),
 557	SENSOR_ATTR_2(pwm2, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 1),
 558	SENSOR_ATTR_2(pwm2_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
 559		      store_pwm_enable, 0, 1),
 560	SENSOR_ATTR_2(pwm2_interpolate, S_IRUGO|S_IWUSR,
 561		      show_pwm_interpolate, store_pwm_interpolate, 0, 1),
 562}, {
 563	SENSOR_ATTR_2(fan3_input, S_IRUGO, show_fan, NULL, 0, 2),
 564	SENSOR_ATTR_2(fan3_full_speed, S_IRUGO|S_IWUSR,
 565		      show_fan_full_speed,
 566		      store_fan_full_speed, 0, 2),
 567	SENSOR_ATTR_2(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 2),
 568	SENSOR_ATTR_2(pwm3, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 2),
 569	SENSOR_ATTR_2(pwm3_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
 570		      store_pwm_enable, 0, 2),
 571	SENSOR_ATTR_2(pwm3_interpolate, S_IRUGO|S_IWUSR,
 572		      show_pwm_interpolate, store_pwm_interpolate, 0, 2),
 573}, {
 574	SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3),
 575	SENSOR_ATTR_2(fan4_full_speed, S_IRUGO|S_IWUSR,
 576		      show_fan_full_speed,
 577		      store_fan_full_speed, 0, 3),
 578	SENSOR_ATTR_2(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 3),
 579	SENSOR_ATTR_2(pwm4, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 3),
 580	SENSOR_ATTR_2(pwm4_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
 581		      store_pwm_enable, 0, 3),
 582	SENSOR_ATTR_2(pwm4_interpolate, S_IRUGO|S_IWUSR,
 583		      show_pwm_interpolate, store_pwm_interpolate, 0, 3),
 584} };
 585
 586/* Attr for the third fan of the f71808a, which only has manual pwm */
 587static struct sensor_device_attribute_2 f71808a_fan3_attr[] = {
 588	SENSOR_ATTR_2(fan3_input, S_IRUGO, show_fan, NULL, 0, 2),
 589	SENSOR_ATTR_2(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 2),
 590	SENSOR_ATTR_2(pwm3, S_IRUGO|S_IWUSR,
 591		      show_simple_pwm, store_simple_pwm, 0, 2),
 592};
 593
 594/* Attr for models which can beep on Fan alarm */
 595static struct sensor_device_attribute_2 fxxxx_fan_beep_attr[] = {
 596	SENSOR_ATTR_2(fan1_beep, S_IRUGO|S_IWUSR, show_fan_beep,
 597		store_fan_beep, 0, 0),
 598	SENSOR_ATTR_2(fan2_beep, S_IRUGO|S_IWUSR, show_fan_beep,
 599		store_fan_beep, 0, 1),
 600	SENSOR_ATTR_2(fan3_beep, S_IRUGO|S_IWUSR, show_fan_beep,
 601		store_fan_beep, 0, 2),
 602	SENSOR_ATTR_2(fan4_beep, S_IRUGO|S_IWUSR, show_fan_beep,
 603		store_fan_beep, 0, 3),
 604};
 605
 606/* PWM attr for the f71862fg, fewer pwms and fewer zones per pwm than the
 607   standard models */
 608static struct sensor_device_attribute_2 f71862fg_auto_pwm_attr[] = {
 
 
 609	SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
 610		      show_pwm_auto_point_channel,
 611		      store_pwm_auto_point_channel, 0, 0),
 612	SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR,
 613		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 614		      1, 0),
 615	SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR,
 616		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 617		      4, 0),
 618	SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR,
 619		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 620		      0, 0),
 621	SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR,
 622		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 623		      3, 0),
 624	SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 625		      show_pwm_auto_point_temp_hyst,
 626		      store_pwm_auto_point_temp_hyst,
 627		      0, 0),
 628	SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO,
 629		      show_pwm_auto_point_temp_hyst, NULL, 3, 0),
 630
 631	SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
 632		      show_pwm_auto_point_channel,
 633		      store_pwm_auto_point_channel, 0, 1),
 634	SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR,
 635		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 636		      1, 1),
 637	SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR,
 638		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 639		      4, 1),
 640	SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR,
 641		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 642		      0, 1),
 643	SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR,
 644		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 645		      3, 1),
 646	SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 647		      show_pwm_auto_point_temp_hyst,
 648		      store_pwm_auto_point_temp_hyst,
 649		      0, 1),
 650	SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO,
 651		      show_pwm_auto_point_temp_hyst, NULL, 3, 1),
 652
 653	SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
 654		      show_pwm_auto_point_channel,
 655		      store_pwm_auto_point_channel, 0, 2),
 656	SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR,
 657		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 658		      1, 2),
 659	SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR,
 660		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 661		      4, 2),
 662	SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR,
 663		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 664		      0, 2),
 665	SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR,
 666		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 667		      3, 2),
 668	SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 669		      show_pwm_auto_point_temp_hyst,
 670		      store_pwm_auto_point_temp_hyst,
 671		      0, 2),
 672	SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO,
 673		      show_pwm_auto_point_temp_hyst, NULL, 3, 2),
 674};
 675
 676/* PWM attr for the f71808e/f71869, almost identical to the f71862fg, but the
 677   pwm setting when the temperature is above the pwmX_auto_point1_temp can be
 678   programmed instead of being hardcoded to 0xff */
 679static struct sensor_device_attribute_2 f71869_auto_pwm_attr[] = {
 
 
 680	SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
 681		      show_pwm_auto_point_channel,
 682		      store_pwm_auto_point_channel, 0, 0),
 683	SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR,
 684		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 685		      0, 0),
 686	SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR,
 687		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 688		      1, 0),
 689	SENSOR_ATTR_2(pwm1_auto_point3_pwm, S_IRUGO|S_IWUSR,
 690		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 691		      4, 0),
 692	SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR,
 693		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 694		      0, 0),
 695	SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR,
 696		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 697		      3, 0),
 698	SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 699		      show_pwm_auto_point_temp_hyst,
 700		      store_pwm_auto_point_temp_hyst,
 701		      0, 0),
 702	SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO,
 703		      show_pwm_auto_point_temp_hyst, NULL, 3, 0),
 704
 705	SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
 706		      show_pwm_auto_point_channel,
 707		      store_pwm_auto_point_channel, 0, 1),
 708	SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR,
 709		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 710		      0, 1),
 711	SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR,
 712		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 713		      1, 1),
 714	SENSOR_ATTR_2(pwm2_auto_point3_pwm, S_IRUGO|S_IWUSR,
 715		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 716		      4, 1),
 717	SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR,
 718		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 719		      0, 1),
 720	SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR,
 721		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 722		      3, 1),
 723	SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 724		      show_pwm_auto_point_temp_hyst,
 725		      store_pwm_auto_point_temp_hyst,
 726		      0, 1),
 727	SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO,
 728		      show_pwm_auto_point_temp_hyst, NULL, 3, 1),
 729
 730	SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
 731		      show_pwm_auto_point_channel,
 732		      store_pwm_auto_point_channel, 0, 2),
 733	SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR,
 734		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 735		      0, 2),
 736	SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR,
 737		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 738		      1, 2),
 739	SENSOR_ATTR_2(pwm3_auto_point3_pwm, S_IRUGO|S_IWUSR,
 740		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 741		      4, 2),
 742	SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR,
 743		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 744		      0, 2),
 745	SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR,
 746		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 747		      3, 2),
 748	SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 749		      show_pwm_auto_point_temp_hyst,
 750		      store_pwm_auto_point_temp_hyst,
 751		      0, 2),
 752	SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO,
 753		      show_pwm_auto_point_temp_hyst, NULL, 3, 2),
 754};
 755
 756/* PWM attr for the standard models */
 757static struct sensor_device_attribute_2 fxxxx_auto_pwm_attr[4][14] = { {
 758	SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
 759		      show_pwm_auto_point_channel,
 760		      store_pwm_auto_point_channel, 0, 0),
 761	SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR,
 762		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 763		      0, 0),
 764	SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR,
 765		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 766		      1, 0),
 767	SENSOR_ATTR_2(pwm1_auto_point3_pwm, S_IRUGO|S_IWUSR,
 768		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 769		      2, 0),
 770	SENSOR_ATTR_2(pwm1_auto_point4_pwm, S_IRUGO|S_IWUSR,
 771		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 772		      3, 0),
 773	SENSOR_ATTR_2(pwm1_auto_point5_pwm, S_IRUGO|S_IWUSR,
 774		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 775		      4, 0),
 776	SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR,
 777		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 778		      0, 0),
 779	SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR,
 780		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 781		      1, 0),
 782	SENSOR_ATTR_2(pwm1_auto_point3_temp, S_IRUGO|S_IWUSR,
 783		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 784		      2, 0),
 785	SENSOR_ATTR_2(pwm1_auto_point4_temp, S_IRUGO|S_IWUSR,
 786		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 787		      3, 0),
 788	SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 789		      show_pwm_auto_point_temp_hyst,
 790		      store_pwm_auto_point_temp_hyst,
 791		      0, 0),
 792	SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO,
 793		      show_pwm_auto_point_temp_hyst, NULL, 1, 0),
 794	SENSOR_ATTR_2(pwm1_auto_point3_temp_hyst, S_IRUGO,
 795		      show_pwm_auto_point_temp_hyst, NULL, 2, 0),
 796	SENSOR_ATTR_2(pwm1_auto_point4_temp_hyst, S_IRUGO,
 797		      show_pwm_auto_point_temp_hyst, NULL, 3, 0),
 798}, {
 799	SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
 800		      show_pwm_auto_point_channel,
 801		      store_pwm_auto_point_channel, 0, 1),
 802	SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR,
 803		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 804		      0, 1),
 805	SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR,
 806		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 807		      1, 1),
 808	SENSOR_ATTR_2(pwm2_auto_point3_pwm, S_IRUGO|S_IWUSR,
 809		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 810		      2, 1),
 811	SENSOR_ATTR_2(pwm2_auto_point4_pwm, S_IRUGO|S_IWUSR,
 812		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 813		      3, 1),
 814	SENSOR_ATTR_2(pwm2_auto_point5_pwm, S_IRUGO|S_IWUSR,
 815		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 816		      4, 1),
 817	SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR,
 818		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 819		      0, 1),
 820	SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR,
 821		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 822		      1, 1),
 823	SENSOR_ATTR_2(pwm2_auto_point3_temp, S_IRUGO|S_IWUSR,
 824		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 825		      2, 1),
 826	SENSOR_ATTR_2(pwm2_auto_point4_temp, S_IRUGO|S_IWUSR,
 827		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 828		      3, 1),
 829	SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 830		      show_pwm_auto_point_temp_hyst,
 831		      store_pwm_auto_point_temp_hyst,
 832		      0, 1),
 833	SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO,
 834		      show_pwm_auto_point_temp_hyst, NULL, 1, 1),
 835	SENSOR_ATTR_2(pwm2_auto_point3_temp_hyst, S_IRUGO,
 836		      show_pwm_auto_point_temp_hyst, NULL, 2, 1),
 837	SENSOR_ATTR_2(pwm2_auto_point4_temp_hyst, S_IRUGO,
 838		      show_pwm_auto_point_temp_hyst, NULL, 3, 1),
 839}, {
 840	SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
 841		      show_pwm_auto_point_channel,
 842		      store_pwm_auto_point_channel, 0, 2),
 843	SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR,
 844		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 845		      0, 2),
 846	SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR,
 847		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 848		      1, 2),
 849	SENSOR_ATTR_2(pwm3_auto_point3_pwm, S_IRUGO|S_IWUSR,
 850		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 851		      2, 2),
 852	SENSOR_ATTR_2(pwm3_auto_point4_pwm, S_IRUGO|S_IWUSR,
 853		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 854		      3, 2),
 855	SENSOR_ATTR_2(pwm3_auto_point5_pwm, S_IRUGO|S_IWUSR,
 856		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 857		      4, 2),
 858	SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR,
 859		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 860		      0, 2),
 861	SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR,
 862		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 863		      1, 2),
 864	SENSOR_ATTR_2(pwm3_auto_point3_temp, S_IRUGO|S_IWUSR,
 865		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 866		      2, 2),
 867	SENSOR_ATTR_2(pwm3_auto_point4_temp, S_IRUGO|S_IWUSR,
 868		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 869		      3, 2),
 870	SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 871		      show_pwm_auto_point_temp_hyst,
 872		      store_pwm_auto_point_temp_hyst,
 873		      0, 2),
 874	SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO,
 875		      show_pwm_auto_point_temp_hyst, NULL, 1, 2),
 876	SENSOR_ATTR_2(pwm3_auto_point3_temp_hyst, S_IRUGO,
 877		      show_pwm_auto_point_temp_hyst, NULL, 2, 2),
 878	SENSOR_ATTR_2(pwm3_auto_point4_temp_hyst, S_IRUGO,
 879		      show_pwm_auto_point_temp_hyst, NULL, 3, 2),
 880}, {
 881	SENSOR_ATTR_2(pwm4_auto_channels_temp, S_IRUGO|S_IWUSR,
 882		      show_pwm_auto_point_channel,
 883		      store_pwm_auto_point_channel, 0, 3),
 884	SENSOR_ATTR_2(pwm4_auto_point1_pwm, S_IRUGO|S_IWUSR,
 885		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 886		      0, 3),
 887	SENSOR_ATTR_2(pwm4_auto_point2_pwm, S_IRUGO|S_IWUSR,
 888		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 889		      1, 3),
 890	SENSOR_ATTR_2(pwm4_auto_point3_pwm, S_IRUGO|S_IWUSR,
 891		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 892		      2, 3),
 893	SENSOR_ATTR_2(pwm4_auto_point4_pwm, S_IRUGO|S_IWUSR,
 894		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 895		      3, 3),
 896	SENSOR_ATTR_2(pwm4_auto_point5_pwm, S_IRUGO|S_IWUSR,
 897		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 898		      4, 3),
 899	SENSOR_ATTR_2(pwm4_auto_point1_temp, S_IRUGO|S_IWUSR,
 900		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 901		      0, 3),
 902	SENSOR_ATTR_2(pwm4_auto_point2_temp, S_IRUGO|S_IWUSR,
 903		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 904		      1, 3),
 905	SENSOR_ATTR_2(pwm4_auto_point3_temp, S_IRUGO|S_IWUSR,
 906		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 907		      2, 3),
 908	SENSOR_ATTR_2(pwm4_auto_point4_temp, S_IRUGO|S_IWUSR,
 909		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 910		      3, 3),
 911	SENSOR_ATTR_2(pwm4_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 912		      show_pwm_auto_point_temp_hyst,
 913		      store_pwm_auto_point_temp_hyst,
 914		      0, 3),
 915	SENSOR_ATTR_2(pwm4_auto_point2_temp_hyst, S_IRUGO,
 916		      show_pwm_auto_point_temp_hyst, NULL, 1, 3),
 917	SENSOR_ATTR_2(pwm4_auto_point3_temp_hyst, S_IRUGO,
 918		      show_pwm_auto_point_temp_hyst, NULL, 2, 3),
 919	SENSOR_ATTR_2(pwm4_auto_point4_temp_hyst, S_IRUGO,
 920		      show_pwm_auto_point_temp_hyst, NULL, 3, 3),
 921} };
 922
 923/* Fan attr specific to the f8000 (4th fan input can only measure speed) */
 924static struct sensor_device_attribute_2 f8000_fan_attr[] = {
 925	SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3),
 926};
 927
 928/* PWM attr for the f8000, zones mapped to temp instead of to pwm!
 929   Also the register block at offset A0 maps to TEMP1 (so our temp2, as the
 930   F8000 starts counting temps at 0), B0 maps the TEMP2 and C0 maps to TEMP0 */
 931static struct sensor_device_attribute_2 f8000_auto_pwm_attr[] = {
 
 
 932	SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
 933		      show_pwm_auto_point_channel,
 934		      store_pwm_auto_point_channel, 0, 0),
 935	SENSOR_ATTR_2(temp1_auto_point1_pwm, S_IRUGO|S_IWUSR,
 936		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 937		      0, 2),
 938	SENSOR_ATTR_2(temp1_auto_point2_pwm, S_IRUGO|S_IWUSR,
 939		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 940		      1, 2),
 941	SENSOR_ATTR_2(temp1_auto_point3_pwm, S_IRUGO|S_IWUSR,
 942		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 943		      2, 2),
 944	SENSOR_ATTR_2(temp1_auto_point4_pwm, S_IRUGO|S_IWUSR,
 945		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 946		      3, 2),
 947	SENSOR_ATTR_2(temp1_auto_point5_pwm, S_IRUGO|S_IWUSR,
 948		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 949		      4, 2),
 950	SENSOR_ATTR_2(temp1_auto_point1_temp, S_IRUGO|S_IWUSR,
 951		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 952		      0, 2),
 953	SENSOR_ATTR_2(temp1_auto_point2_temp, S_IRUGO|S_IWUSR,
 954		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 955		      1, 2),
 956	SENSOR_ATTR_2(temp1_auto_point3_temp, S_IRUGO|S_IWUSR,
 957		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 958		      2, 2),
 959	SENSOR_ATTR_2(temp1_auto_point4_temp, S_IRUGO|S_IWUSR,
 960		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 961		      3, 2),
 962	SENSOR_ATTR_2(temp1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 963		      show_pwm_auto_point_temp_hyst,
 964		      store_pwm_auto_point_temp_hyst,
 965		      0, 2),
 966	SENSOR_ATTR_2(temp1_auto_point2_temp_hyst, S_IRUGO,
 967		      show_pwm_auto_point_temp_hyst, NULL, 1, 2),
 968	SENSOR_ATTR_2(temp1_auto_point3_temp_hyst, S_IRUGO,
 969		      show_pwm_auto_point_temp_hyst, NULL, 2, 2),
 970	SENSOR_ATTR_2(temp1_auto_point4_temp_hyst, S_IRUGO,
 971		      show_pwm_auto_point_temp_hyst, NULL, 3, 2),
 972
 973	SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
 974		      show_pwm_auto_point_channel,
 975		      store_pwm_auto_point_channel, 0, 1),
 976	SENSOR_ATTR_2(temp2_auto_point1_pwm, S_IRUGO|S_IWUSR,
 977		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 978		      0, 0),
 979	SENSOR_ATTR_2(temp2_auto_point2_pwm, S_IRUGO|S_IWUSR,
 980		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 981		      1, 0),
 982	SENSOR_ATTR_2(temp2_auto_point3_pwm, S_IRUGO|S_IWUSR,
 983		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 984		      2, 0),
 985	SENSOR_ATTR_2(temp2_auto_point4_pwm, S_IRUGO|S_IWUSR,
 986		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 987		      3, 0),
 988	SENSOR_ATTR_2(temp2_auto_point5_pwm, S_IRUGO|S_IWUSR,
 989		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 990		      4, 0),
 991	SENSOR_ATTR_2(temp2_auto_point1_temp, S_IRUGO|S_IWUSR,
 992		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 993		      0, 0),
 994	SENSOR_ATTR_2(temp2_auto_point2_temp, S_IRUGO|S_IWUSR,
 995		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 996		      1, 0),
 997	SENSOR_ATTR_2(temp2_auto_point3_temp, S_IRUGO|S_IWUSR,
 998		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 999		      2, 0),
1000	SENSOR_ATTR_2(temp2_auto_point4_temp, S_IRUGO|S_IWUSR,
1001		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1002		      3, 0),
1003	SENSOR_ATTR_2(temp2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
1004		      show_pwm_auto_point_temp_hyst,
1005		      store_pwm_auto_point_temp_hyst,
1006		      0, 0),
1007	SENSOR_ATTR_2(temp2_auto_point2_temp_hyst, S_IRUGO,
1008		      show_pwm_auto_point_temp_hyst, NULL, 1, 0),
1009	SENSOR_ATTR_2(temp2_auto_point3_temp_hyst, S_IRUGO,
1010		      show_pwm_auto_point_temp_hyst, NULL, 2, 0),
1011	SENSOR_ATTR_2(temp2_auto_point4_temp_hyst, S_IRUGO,
1012		      show_pwm_auto_point_temp_hyst, NULL, 3, 0),
1013
1014	SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
1015		      show_pwm_auto_point_channel,
1016		      store_pwm_auto_point_channel, 0, 2),
1017	SENSOR_ATTR_2(temp3_auto_point1_pwm, S_IRUGO|S_IWUSR,
1018		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1019		      0, 1),
1020	SENSOR_ATTR_2(temp3_auto_point2_pwm, S_IRUGO|S_IWUSR,
1021		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1022		      1, 1),
1023	SENSOR_ATTR_2(temp3_auto_point3_pwm, S_IRUGO|S_IWUSR,
1024		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1025		      2, 1),
1026	SENSOR_ATTR_2(temp3_auto_point4_pwm, S_IRUGO|S_IWUSR,
1027		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1028		      3, 1),
1029	SENSOR_ATTR_2(temp3_auto_point5_pwm, S_IRUGO|S_IWUSR,
1030		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1031		      4, 1),
1032	SENSOR_ATTR_2(temp3_auto_point1_temp, S_IRUGO|S_IWUSR,
1033		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1034		      0, 1),
1035	SENSOR_ATTR_2(temp3_auto_point2_temp, S_IRUGO|S_IWUSR,
1036		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1037		      1, 1),
1038	SENSOR_ATTR_2(temp3_auto_point3_temp, S_IRUGO|S_IWUSR,
1039		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1040		      2, 1),
1041	SENSOR_ATTR_2(temp3_auto_point4_temp, S_IRUGO|S_IWUSR,
1042		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1043		      3, 1),
1044	SENSOR_ATTR_2(temp3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
1045		      show_pwm_auto_point_temp_hyst,
1046		      store_pwm_auto_point_temp_hyst,
1047		      0, 1),
1048	SENSOR_ATTR_2(temp3_auto_point2_temp_hyst, S_IRUGO,
1049		      show_pwm_auto_point_temp_hyst, NULL, 1, 1),
1050	SENSOR_ATTR_2(temp3_auto_point3_temp_hyst, S_IRUGO,
1051		      show_pwm_auto_point_temp_hyst, NULL, 2, 1),
1052	SENSOR_ATTR_2(temp3_auto_point4_temp_hyst, S_IRUGO,
1053		      show_pwm_auto_point_temp_hyst, NULL, 3, 1),
1054};
1055
1056/* Super I/O functions */
1057static inline int superio_inb(int base, int reg)
1058{
1059	outb(reg, base);
1060	return inb(base + 1);
1061}
1062
1063static int superio_inw(int base, int reg)
1064{
1065	int val;
1066	val  = superio_inb(base, reg) << 8;
1067	val |= superio_inb(base, reg + 1);
1068	return val;
1069}
1070
1071static inline int superio_enter(int base)
1072{
1073	/* Don't step on other drivers' I/O space by accident */
1074	if (!request_muxed_region(base, 2, DRVNAME)) {
1075		pr_err("I/O address 0x%04x already in use\n", base);
1076		return -EBUSY;
1077	}
1078
1079	/* according to the datasheet the key must be send twice! */
1080	outb(SIO_UNLOCK_KEY, base);
1081	outb(SIO_UNLOCK_KEY, base);
1082
1083	return 0;
1084}
1085
1086static inline void superio_select(int base, int ld)
1087{
1088	outb(SIO_REG_LDSEL, base);
1089	outb(ld, base + 1);
1090}
1091
1092static inline void superio_exit(int base)
1093{
1094	outb(SIO_LOCK_KEY, base);
1095	release_region(base, 2);
1096}
1097
1098static inline int fan_from_reg(u16 reg)
1099{
1100	return reg ? (1500000 / reg) : 0;
1101}
1102
1103static inline u16 fan_to_reg(int fan)
1104{
1105	return fan ? (1500000 / fan) : 0;
1106}
1107
1108static u8 f71882fg_read8(struct f71882fg_data *data, u8 reg)
1109{
1110	u8 val;
1111
1112	outb(reg, data->addr + ADDR_REG_OFFSET);
1113	val = inb(data->addr + DATA_REG_OFFSET);
1114
1115	return val;
1116}
1117
1118static u16 f71882fg_read16(struct f71882fg_data *data, u8 reg)
1119{
1120	u16 val;
1121
1122	val  = f71882fg_read8(data, reg) << 8;
1123	val |= f71882fg_read8(data, reg + 1);
1124
1125	return val;
1126}
1127
1128static void f71882fg_write8(struct f71882fg_data *data, u8 reg, u8 val)
1129{
1130	outb(reg, data->addr + ADDR_REG_OFFSET);
1131	outb(val, data->addr + DATA_REG_OFFSET);
1132}
1133
1134static void f71882fg_write16(struct f71882fg_data *data, u8 reg, u16 val)
1135{
1136	f71882fg_write8(data, reg,     val >> 8);
1137	f71882fg_write8(data, reg + 1, val & 0xff);
1138}
1139
1140static u16 f71882fg_read_temp(struct f71882fg_data *data, int nr)
1141{
1142	if (data->type == f71858fg)
1143		return f71882fg_read16(data, F71882FG_REG_TEMP(nr));
1144	else
1145		return f71882fg_read8(data, F71882FG_REG_TEMP(nr));
1146}
1147
1148static struct f71882fg_data *f71882fg_update_device(struct device *dev)
1149{
1150	struct f71882fg_data *data = dev_get_drvdata(dev);
1151	int nr_fans = f71882fg_nr_fans[data->type];
1152	int nr_temps = f71882fg_nr_temps[data->type];
1153	int nr, reg, point;
1154
1155	mutex_lock(&data->update_lock);
1156
1157	/* Update once every 60 seconds */
1158	if (time_after(jiffies, data->last_limits + 60 * HZ) ||
1159			!data->valid) {
1160		if (f71882fg_has_in1_alarm[data->type]) {
1161			data->in1_max =
1162				f71882fg_read8(data, F71882FG_REG_IN1_HIGH);
1163			data->in_beep =
1164				f71882fg_read8(data, F71882FG_REG_IN_BEEP);
 
 
 
 
 
 
 
 
 
 
 
1165		}
1166
1167		/* Get High & boundary temps*/
1168		for (nr = data->temp_start; nr < nr_temps + data->temp_start;
1169									nr++) {
1170			data->temp_ovt[nr] = f71882fg_read8(data,
1171						F71882FG_REG_TEMP_OVT(nr));
1172			data->temp_high[nr] = f71882fg_read8(data,
1173						F71882FG_REG_TEMP_HIGH(nr));
1174		}
1175
1176		if (data->type != f8000) {
1177			data->temp_hyst[0] = f71882fg_read8(data,
1178						F71882FG_REG_TEMP_HYST(0));
1179			data->temp_hyst[1] = f71882fg_read8(data,
1180						F71882FG_REG_TEMP_HYST(1));
1181		}
1182		/* All but the f71858fg / f8000 have this register */
1183		if ((data->type != f71858fg) && (data->type != f8000)) {
1184			reg  = f71882fg_read8(data, F71882FG_REG_TEMP_TYPE);
1185			data->temp_type[1] = (reg & 0x02) ? 2 : 4;
1186			data->temp_type[2] = (reg & 0x04) ? 2 : 4;
1187			data->temp_type[3] = (reg & 0x08) ? 2 : 4;
1188		}
1189
1190		if (f71882fg_fan_has_beep[data->type])
1191			data->fan_beep = f71882fg_read8(data,
1192						F71882FG_REG_FAN_BEEP);
1193
1194		if (f71882fg_temp_has_beep[data->type])
1195			data->temp_beep = f71882fg_read8(data,
1196						F71882FG_REG_TEMP_BEEP);
1197
1198		data->pwm_enable = f71882fg_read8(data,
1199						  F71882FG_REG_PWM_ENABLE);
1200		data->pwm_auto_point_hyst[0] =
1201			f71882fg_read8(data, F71882FG_REG_FAN_HYST(0));
1202		data->pwm_auto_point_hyst[1] =
1203			f71882fg_read8(data, F71882FG_REG_FAN_HYST(1));
1204
1205		for (nr = 0; nr < nr_fans; nr++) {
1206			data->pwm_auto_point_mapping[nr] =
1207			    f71882fg_read8(data,
1208					   F71882FG_REG_POINT_MAPPING(nr));
1209
1210			switch (data->type) {
1211			default:
1212				for (point = 0; point < 5; point++) {
1213					data->pwm_auto_point_pwm[nr][point] =
1214						f71882fg_read8(data,
1215							F71882FG_REG_POINT_PWM
1216							(nr, point));
1217				}
1218				for (point = 0; point < 4; point++) {
1219					data->pwm_auto_point_temp[nr][point] =
1220						f71882fg_read8(data,
1221							F71882FG_REG_POINT_TEMP
1222							(nr, point));
1223				}
1224				break;
1225			case f71808e:
1226			case f71869:
1227				data->pwm_auto_point_pwm[nr][0] =
1228					f71882fg_read8(data,
1229						F71882FG_REG_POINT_PWM(nr, 0));
1230				/* Fall through */
1231			case f71862fg:
1232				data->pwm_auto_point_pwm[nr][1] =
1233					f71882fg_read8(data,
1234						F71882FG_REG_POINT_PWM
1235						(nr, 1));
1236				data->pwm_auto_point_pwm[nr][4] =
1237					f71882fg_read8(data,
1238						F71882FG_REG_POINT_PWM
1239						(nr, 4));
1240				data->pwm_auto_point_temp[nr][0] =
1241					f71882fg_read8(data,
1242						F71882FG_REG_POINT_TEMP
1243						(nr, 0));
1244				data->pwm_auto_point_temp[nr][3] =
1245					f71882fg_read8(data,
1246						F71882FG_REG_POINT_TEMP
1247						(nr, 3));
1248				break;
1249			}
1250		}
1251		data->last_limits = jiffies;
1252	}
1253
1254	/* Update every second */
1255	if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
1256		data->temp_status = f71882fg_read8(data,
1257						F71882FG_REG_TEMP_STATUS);
1258		data->temp_diode_open = f71882fg_read8(data,
1259						F71882FG_REG_TEMP_DIODE_OPEN);
1260		for (nr = data->temp_start; nr < nr_temps + data->temp_start;
1261									nr++)
1262			data->temp[nr] = f71882fg_read_temp(data, nr);
1263
1264		data->fan_status = f71882fg_read8(data,
1265						F71882FG_REG_FAN_STATUS);
1266		for (nr = 0; nr < nr_fans; nr++) {
1267			data->fan[nr] = f71882fg_read16(data,
1268						F71882FG_REG_FAN(nr));
1269			data->fan_target[nr] =
1270			    f71882fg_read16(data, F71882FG_REG_FAN_TARGET(nr));
1271			data->fan_full_speed[nr] =
1272			    f71882fg_read16(data,
1273					    F71882FG_REG_FAN_FULL_SPEED(nr));
1274			data->pwm[nr] =
1275			    f71882fg_read8(data, F71882FG_REG_PWM(nr));
1276		}
1277		/* Some models have 1 more fan with limited capabilities */
1278		if (data->type == f71808a) {
1279			data->fan[2] = f71882fg_read16(data,
1280						F71882FG_REG_FAN(2));
1281			data->pwm[2] = f71882fg_read8(data,
1282							F71882FG_REG_PWM(2));
1283		}
1284		if (data->type == f8000)
1285			data->fan[3] = f71882fg_read16(data,
1286						F71882FG_REG_FAN(3));
1287
1288		if (f71882fg_has_in1_alarm[data->type])
1289			data->in_status = f71882fg_read8(data,
 
 
 
 
 
1290						F71882FG_REG_IN_STATUS);
 
 
1291		for (nr = 0; nr < F71882FG_MAX_INS; nr++)
1292			if (f71882fg_has_in[data->type][nr])
1293				data->in[nr] = f71882fg_read8(data,
1294							F71882FG_REG_IN(nr));
1295
1296		data->last_updated = jiffies;
1297		data->valid = 1;
1298	}
1299
1300	mutex_unlock(&data->update_lock);
1301
1302	return data;
1303}
1304
1305/* Sysfs Interface */
1306static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
1307	char *buf)
1308{
1309	struct f71882fg_data *data = f71882fg_update_device(dev);
1310	int nr = to_sensor_dev_attr_2(devattr)->index;
1311	int speed = fan_from_reg(data->fan[nr]);
1312
1313	if (speed == FAN_MIN_DETECT)
1314		speed = 0;
1315
1316	return sprintf(buf, "%d\n", speed);
1317}
1318
1319static ssize_t show_fan_full_speed(struct device *dev,
1320				   struct device_attribute *devattr, char *buf)
1321{
1322	struct f71882fg_data *data = f71882fg_update_device(dev);
1323	int nr = to_sensor_dev_attr_2(devattr)->index;
1324	int speed = fan_from_reg(data->fan_full_speed[nr]);
1325	return sprintf(buf, "%d\n", speed);
1326}
1327
1328static ssize_t store_fan_full_speed(struct device *dev,
1329				    struct device_attribute *devattr,
1330				    const char *buf, size_t count)
1331{
1332	struct f71882fg_data *data = dev_get_drvdata(dev);
1333	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1334	long val;
1335
1336	err = strict_strtol(buf, 10, &val);
1337	if (err)
1338		return err;
1339
1340	val = SENSORS_LIMIT(val, 23, 1500000);
1341	val = fan_to_reg(val);
1342
1343	mutex_lock(&data->update_lock);
1344	f71882fg_write16(data, F71882FG_REG_FAN_FULL_SPEED(nr), val);
1345	data->fan_full_speed[nr] = val;
1346	mutex_unlock(&data->update_lock);
1347
1348	return count;
1349}
1350
1351static ssize_t show_fan_beep(struct device *dev, struct device_attribute
1352	*devattr, char *buf)
1353{
1354	struct f71882fg_data *data = f71882fg_update_device(dev);
1355	int nr = to_sensor_dev_attr_2(devattr)->index;
1356
1357	if (data->fan_beep & (1 << nr))
1358		return sprintf(buf, "1\n");
1359	else
1360		return sprintf(buf, "0\n");
1361}
1362
1363static ssize_t store_fan_beep(struct device *dev, struct device_attribute
1364	*devattr, const char *buf, size_t count)
1365{
1366	struct f71882fg_data *data = dev_get_drvdata(dev);
1367	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1368	unsigned long val;
1369
1370	err = strict_strtoul(buf, 10, &val);
1371	if (err)
1372		return err;
1373
1374	mutex_lock(&data->update_lock);
1375	data->fan_beep = f71882fg_read8(data, F71882FG_REG_FAN_BEEP);
1376	if (val)
1377		data->fan_beep |= 1 << nr;
1378	else
1379		data->fan_beep &= ~(1 << nr);
1380
1381	f71882fg_write8(data, F71882FG_REG_FAN_BEEP, data->fan_beep);
1382	mutex_unlock(&data->update_lock);
1383
1384	return count;
1385}
1386
1387static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
1388	*devattr, char *buf)
1389{
1390	struct f71882fg_data *data = f71882fg_update_device(dev);
1391	int nr = to_sensor_dev_attr_2(devattr)->index;
1392
1393	if (data->fan_status & (1 << nr))
1394		return sprintf(buf, "1\n");
1395	else
1396		return sprintf(buf, "0\n");
1397}
1398
1399static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
1400	char *buf)
1401{
1402	struct f71882fg_data *data = f71882fg_update_device(dev);
1403	int nr = to_sensor_dev_attr_2(devattr)->index;
1404
1405	return sprintf(buf, "%d\n", data->in[nr] * 8);
1406}
1407
1408static ssize_t show_in_max(struct device *dev, struct device_attribute
1409	*devattr, char *buf)
1410{
1411	struct f71882fg_data *data = f71882fg_update_device(dev);
1412
1413	return sprintf(buf, "%d\n", data->in1_max * 8);
1414}
1415
1416static ssize_t store_in_max(struct device *dev, struct device_attribute
1417	*devattr, const char *buf, size_t count)
1418{
1419	struct f71882fg_data *data = dev_get_drvdata(dev);
1420	int err;
1421	long val;
1422
1423	err = strict_strtol(buf, 10, &val);
1424	if (err)
1425		return err;
1426
1427	val /= 8;
1428	val = SENSORS_LIMIT(val, 0, 255);
1429
1430	mutex_lock(&data->update_lock);
1431	f71882fg_write8(data, F71882FG_REG_IN1_HIGH, val);
 
 
 
1432	data->in1_max = val;
1433	mutex_unlock(&data->update_lock);
1434
1435	return count;
1436}
1437
1438static ssize_t show_in_beep(struct device *dev, struct device_attribute
1439	*devattr, char *buf)
1440{
1441	struct f71882fg_data *data = f71882fg_update_device(dev);
1442	int nr = to_sensor_dev_attr_2(devattr)->index;
1443
1444	if (data->in_beep & (1 << nr))
1445		return sprintf(buf, "1\n");
1446	else
1447		return sprintf(buf, "0\n");
1448}
1449
1450static ssize_t store_in_beep(struct device *dev, struct device_attribute
1451	*devattr, const char *buf, size_t count)
1452{
1453	struct f71882fg_data *data = dev_get_drvdata(dev);
1454	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1455	unsigned long val;
1456
1457	err = strict_strtoul(buf, 10, &val);
1458	if (err)
1459		return err;
1460
1461	mutex_lock(&data->update_lock);
1462	data->in_beep = f71882fg_read8(data, F71882FG_REG_IN_BEEP);
 
 
 
 
1463	if (val)
1464		data->in_beep |= 1 << nr;
1465	else
1466		data->in_beep &= ~(1 << nr);
1467
1468	f71882fg_write8(data, F71882FG_REG_IN_BEEP, data->in_beep);
 
 
 
1469	mutex_unlock(&data->update_lock);
1470
1471	return count;
1472}
1473
1474static ssize_t show_in_alarm(struct device *dev, struct device_attribute
1475	*devattr, char *buf)
1476{
1477	struct f71882fg_data *data = f71882fg_update_device(dev);
1478	int nr = to_sensor_dev_attr_2(devattr)->index;
1479
1480	if (data->in_status & (1 << nr))
1481		return sprintf(buf, "1\n");
1482	else
1483		return sprintf(buf, "0\n");
1484}
1485
1486static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
1487	char *buf)
1488{
1489	struct f71882fg_data *data = f71882fg_update_device(dev);
1490	int nr = to_sensor_dev_attr_2(devattr)->index;
1491	int sign, temp;
1492
1493	if (data->type == f71858fg) {
1494		/* TEMP_TABLE_SEL 1 or 3 ? */
1495		if (data->temp_config & 1) {
1496			sign = data->temp[nr] & 0x0001;
1497			temp = (data->temp[nr] >> 5) & 0x7ff;
1498		} else {
1499			sign = data->temp[nr] & 0x8000;
1500			temp = (data->temp[nr] >> 5) & 0x3ff;
1501		}
1502		temp *= 125;
1503		if (sign)
1504			temp -= 128000;
1505	} else
1506		temp = data->temp[nr] * 1000;
1507
1508	return sprintf(buf, "%d\n", temp);
1509}
1510
1511static ssize_t show_temp_max(struct device *dev, struct device_attribute
1512	*devattr, char *buf)
1513{
1514	struct f71882fg_data *data = f71882fg_update_device(dev);
1515	int nr = to_sensor_dev_attr_2(devattr)->index;
1516
1517	return sprintf(buf, "%d\n", data->temp_high[nr] * 1000);
1518}
1519
1520static ssize_t store_temp_max(struct device *dev, struct device_attribute
1521	*devattr, const char *buf, size_t count)
1522{
1523	struct f71882fg_data *data = dev_get_drvdata(dev);
1524	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1525	long val;
1526
1527	err = strict_strtol(buf, 10, &val);
1528	if (err)
1529		return err;
1530
1531	val /= 1000;
1532	val = SENSORS_LIMIT(val, 0, 255);
1533
1534	mutex_lock(&data->update_lock);
1535	f71882fg_write8(data, F71882FG_REG_TEMP_HIGH(nr), val);
1536	data->temp_high[nr] = val;
1537	mutex_unlock(&data->update_lock);
1538
1539	return count;
1540}
1541
1542static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute
1543	*devattr, char *buf)
1544{
1545	struct f71882fg_data *data = f71882fg_update_device(dev);
1546	int nr = to_sensor_dev_attr_2(devattr)->index;
1547	int temp_max_hyst;
1548
1549	mutex_lock(&data->update_lock);
1550	if (nr & 1)
1551		temp_max_hyst = data->temp_hyst[nr / 2] >> 4;
1552	else
1553		temp_max_hyst = data->temp_hyst[nr / 2] & 0x0f;
1554	temp_max_hyst = (data->temp_high[nr] - temp_max_hyst) * 1000;
1555	mutex_unlock(&data->update_lock);
1556
1557	return sprintf(buf, "%d\n", temp_max_hyst);
1558}
1559
1560static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute
1561	*devattr, const char *buf, size_t count)
1562{
1563	struct f71882fg_data *data = dev_get_drvdata(dev);
1564	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1565	ssize_t ret = count;
1566	u8 reg;
1567	long val;
1568
1569	err = strict_strtol(buf, 10, &val);
1570	if (err)
1571		return err;
1572
1573	val /= 1000;
1574
1575	mutex_lock(&data->update_lock);
1576
1577	/* convert abs to relative and check */
1578	data->temp_high[nr] = f71882fg_read8(data, F71882FG_REG_TEMP_HIGH(nr));
1579	val = SENSORS_LIMIT(val, data->temp_high[nr] - 15,
1580			    data->temp_high[nr]);
1581	val = data->temp_high[nr] - val;
1582
1583	/* convert value to register contents */
1584	reg = f71882fg_read8(data, F71882FG_REG_TEMP_HYST(nr / 2));
1585	if (nr & 1)
1586		reg = (reg & 0x0f) | (val << 4);
1587	else
1588		reg = (reg & 0xf0) | val;
1589	f71882fg_write8(data, F71882FG_REG_TEMP_HYST(nr / 2), reg);
1590	data->temp_hyst[nr / 2] = reg;
1591
1592	mutex_unlock(&data->update_lock);
1593	return ret;
1594}
1595
1596static ssize_t show_temp_crit(struct device *dev, struct device_attribute
1597	*devattr, char *buf)
1598{
1599	struct f71882fg_data *data = f71882fg_update_device(dev);
1600	int nr = to_sensor_dev_attr_2(devattr)->index;
1601
1602	return sprintf(buf, "%d\n", data->temp_ovt[nr] * 1000);
1603}
1604
1605static ssize_t store_temp_crit(struct device *dev, struct device_attribute
1606	*devattr, const char *buf, size_t count)
1607{
1608	struct f71882fg_data *data = dev_get_drvdata(dev);
1609	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1610	long val;
1611
1612	err = strict_strtol(buf, 10, &val);
1613	if (err)
1614		return err;
1615
1616	val /= 1000;
1617	val = SENSORS_LIMIT(val, 0, 255);
1618
1619	mutex_lock(&data->update_lock);
1620	f71882fg_write8(data, F71882FG_REG_TEMP_OVT(nr), val);
1621	data->temp_ovt[nr] = val;
1622	mutex_unlock(&data->update_lock);
1623
1624	return count;
1625}
1626
1627static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute
1628	*devattr, char *buf)
1629{
1630	struct f71882fg_data *data = f71882fg_update_device(dev);
1631	int nr = to_sensor_dev_attr_2(devattr)->index;
1632	int temp_crit_hyst;
1633
1634	mutex_lock(&data->update_lock);
1635	if (nr & 1)
1636		temp_crit_hyst = data->temp_hyst[nr / 2] >> 4;
1637	else
1638		temp_crit_hyst = data->temp_hyst[nr / 2] & 0x0f;
1639	temp_crit_hyst = (data->temp_ovt[nr] - temp_crit_hyst) * 1000;
1640	mutex_unlock(&data->update_lock);
1641
1642	return sprintf(buf, "%d\n", temp_crit_hyst);
1643}
1644
1645static ssize_t show_temp_type(struct device *dev, struct device_attribute
1646	*devattr, char *buf)
1647{
1648	struct f71882fg_data *data = f71882fg_update_device(dev);
1649	int nr = to_sensor_dev_attr_2(devattr)->index;
1650
1651	return sprintf(buf, "%d\n", data->temp_type[nr]);
1652}
1653
1654static ssize_t show_temp_beep(struct device *dev, struct device_attribute
1655	*devattr, char *buf)
1656{
1657	struct f71882fg_data *data = f71882fg_update_device(dev);
1658	int nr = to_sensor_dev_attr_2(devattr)->index;
1659
1660	if (data->temp_beep & (1 << nr))
1661		return sprintf(buf, "1\n");
1662	else
1663		return sprintf(buf, "0\n");
1664}
1665
1666static ssize_t store_temp_beep(struct device *dev, struct device_attribute
1667	*devattr, const char *buf, size_t count)
1668{
1669	struct f71882fg_data *data = dev_get_drvdata(dev);
1670	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1671	unsigned long val;
1672
1673	err = strict_strtoul(buf, 10, &val);
1674	if (err)
1675		return err;
1676
1677	mutex_lock(&data->update_lock);
1678	data->temp_beep = f71882fg_read8(data, F71882FG_REG_TEMP_BEEP);
1679	if (val)
1680		data->temp_beep |= 1 << nr;
1681	else
1682		data->temp_beep &= ~(1 << nr);
1683
1684	f71882fg_write8(data, F71882FG_REG_TEMP_BEEP, data->temp_beep);
1685	mutex_unlock(&data->update_lock);
1686
1687	return count;
1688}
1689
1690static ssize_t show_temp_alarm(struct device *dev, struct device_attribute
1691	*devattr, char *buf)
1692{
1693	struct f71882fg_data *data = f71882fg_update_device(dev);
1694	int nr = to_sensor_dev_attr_2(devattr)->index;
1695
1696	if (data->temp_status & (1 << nr))
1697		return sprintf(buf, "1\n");
1698	else
1699		return sprintf(buf, "0\n");
1700}
1701
1702static ssize_t show_temp_fault(struct device *dev, struct device_attribute
1703	*devattr, char *buf)
1704{
1705	struct f71882fg_data *data = f71882fg_update_device(dev);
1706	int nr = to_sensor_dev_attr_2(devattr)->index;
1707
1708	if (data->temp_diode_open & (1 << nr))
1709		return sprintf(buf, "1\n");
1710	else
1711		return sprintf(buf, "0\n");
1712}
1713
1714static ssize_t show_pwm(struct device *dev,
1715			struct device_attribute *devattr, char *buf)
1716{
1717	struct f71882fg_data *data = f71882fg_update_device(dev);
1718	int val, nr = to_sensor_dev_attr_2(devattr)->index;
1719	mutex_lock(&data->update_lock);
1720	if (data->pwm_enable & (1 << (2 * nr)))
1721		/* PWM mode */
1722		val = data->pwm[nr];
1723	else {
1724		/* RPM mode */
1725		val = 255 * fan_from_reg(data->fan_target[nr])
1726			/ fan_from_reg(data->fan_full_speed[nr]);
1727	}
1728	mutex_unlock(&data->update_lock);
1729	return sprintf(buf, "%d\n", val);
1730}
1731
1732static ssize_t store_pwm(struct device *dev,
1733			 struct device_attribute *devattr, const char *buf,
1734			 size_t count)
1735{
1736	struct f71882fg_data *data = dev_get_drvdata(dev);
1737	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1738	long val;
1739
1740	err = strict_strtol(buf, 10, &val);
1741	if (err)
1742		return err;
1743
1744	val = SENSORS_LIMIT(val, 0, 255);
1745
1746	mutex_lock(&data->update_lock);
1747	data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1748	if ((data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 3) != 2) ||
1749	    (data->type != f8000 && !((data->pwm_enable >> 2 * nr) & 2))) {
1750		count = -EROFS;
1751		goto leave;
1752	}
1753	if (data->pwm_enable & (1 << (2 * nr))) {
1754		/* PWM mode */
1755		f71882fg_write8(data, F71882FG_REG_PWM(nr), val);
1756		data->pwm[nr] = val;
1757	} else {
1758		/* RPM mode */
1759		int target, full_speed;
1760		full_speed = f71882fg_read16(data,
1761					     F71882FG_REG_FAN_FULL_SPEED(nr));
1762		target = fan_to_reg(val * fan_from_reg(full_speed) / 255);
1763		f71882fg_write16(data, F71882FG_REG_FAN_TARGET(nr), target);
1764		data->fan_target[nr] = target;
1765		data->fan_full_speed[nr] = full_speed;
1766	}
1767leave:
1768	mutex_unlock(&data->update_lock);
1769
1770	return count;
1771}
1772
1773static ssize_t show_simple_pwm(struct device *dev,
1774			       struct device_attribute *devattr, char *buf)
1775{
1776	struct f71882fg_data *data = f71882fg_update_device(dev);
1777	int val, nr = to_sensor_dev_attr_2(devattr)->index;
1778
1779	val = data->pwm[nr];
1780	return sprintf(buf, "%d\n", val);
1781}
1782
1783static ssize_t store_simple_pwm(struct device *dev,
1784				struct device_attribute *devattr,
1785				const char *buf, size_t count)
1786{
1787	struct f71882fg_data *data = dev_get_drvdata(dev);
1788	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1789	long val;
1790
1791	err = strict_strtol(buf, 10, &val);
1792	if (err)
1793		return err;
1794
1795	val = SENSORS_LIMIT(val, 0, 255);
1796
1797	mutex_lock(&data->update_lock);
1798	f71882fg_write8(data, F71882FG_REG_PWM(nr), val);
1799	data->pwm[nr] = val;
1800	mutex_unlock(&data->update_lock);
1801
1802	return count;
1803}
1804
1805static ssize_t show_pwm_enable(struct device *dev,
1806			       struct device_attribute *devattr, char *buf)
1807{
1808	int result = 0;
1809	struct f71882fg_data *data = f71882fg_update_device(dev);
1810	int nr = to_sensor_dev_attr_2(devattr)->index;
1811
1812	switch ((data->pwm_enable >> 2 * nr) & 3) {
1813	case 0:
1814	case 1:
1815		result = 2; /* Normal auto mode */
1816		break;
1817	case 2:
1818		result = 1; /* Manual mode */
1819		break;
1820	case 3:
1821		if (data->type == f8000)
1822			result = 3; /* Thermostat mode */
1823		else
1824			result = 1; /* Manual mode */
1825		break;
1826	}
1827
1828	return sprintf(buf, "%d\n", result);
1829}
1830
1831static ssize_t store_pwm_enable(struct device *dev, struct device_attribute
1832				*devattr, const char *buf, size_t count)
1833{
1834	struct f71882fg_data *data = dev_get_drvdata(dev);
1835	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1836	long val;
1837
1838	err = strict_strtol(buf, 10, &val);
1839	if (err)
1840		return err;
1841
1842	/* Special case for F8000 pwm channel 3 which only does auto mode */
1843	if (data->type == f8000 && nr == 2 && val != 2)
1844		return -EINVAL;
1845
1846	mutex_lock(&data->update_lock);
1847	data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1848	/* Special case for F8000 auto PWM mode / Thermostat mode */
1849	if (data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 1)) {
1850		switch (val) {
1851		case 2:
1852			data->pwm_enable &= ~(2 << (2 * nr));
1853			break;		/* Normal auto mode */
1854		case 3:
1855			data->pwm_enable |= 2 << (2 * nr);
1856			break;		/* Thermostat mode */
1857		default:
1858			count = -EINVAL;
1859			goto leave;
1860		}
1861	} else {
1862		switch (val) {
1863		case 1:
1864			/* The f71858fg does not support manual RPM mode */
1865			if (data->type == f71858fg &&
1866			    ((data->pwm_enable >> (2 * nr)) & 1)) {
1867				count = -EINVAL;
1868				goto leave;
1869			}
1870			data->pwm_enable |= 2 << (2 * nr);
1871			break;		/* Manual */
1872		case 2:
1873			data->pwm_enable &= ~(2 << (2 * nr));
1874			break;		/* Normal auto mode */
1875		default:
1876			count = -EINVAL;
1877			goto leave;
1878		}
1879	}
1880	f71882fg_write8(data, F71882FG_REG_PWM_ENABLE, data->pwm_enable);
1881leave:
1882	mutex_unlock(&data->update_lock);
1883
1884	return count;
1885}
1886
1887static ssize_t show_pwm_auto_point_pwm(struct device *dev,
1888				       struct device_attribute *devattr,
1889				       char *buf)
1890{
1891	int result;
1892	struct f71882fg_data *data = f71882fg_update_device(dev);
1893	int pwm = to_sensor_dev_attr_2(devattr)->index;
1894	int point = to_sensor_dev_attr_2(devattr)->nr;
1895
1896	mutex_lock(&data->update_lock);
1897	if (data->pwm_enable & (1 << (2 * pwm))) {
1898		/* PWM mode */
1899		result = data->pwm_auto_point_pwm[pwm][point];
1900	} else {
1901		/* RPM mode */
1902		result = 32 * 255 / (32 + data->pwm_auto_point_pwm[pwm][point]);
1903	}
1904	mutex_unlock(&data->update_lock);
1905
1906	return sprintf(buf, "%d\n", result);
1907}
1908
1909static ssize_t store_pwm_auto_point_pwm(struct device *dev,
1910					struct device_attribute *devattr,
1911					const char *buf, size_t count)
1912{
1913	struct f71882fg_data *data = dev_get_drvdata(dev);
1914	int err, pwm = to_sensor_dev_attr_2(devattr)->index;
1915	int point = to_sensor_dev_attr_2(devattr)->nr;
1916	long val;
1917
1918	err = strict_strtol(buf, 10, &val);
1919	if (err)
1920		return err;
1921
1922	val = SENSORS_LIMIT(val, 0, 255);
1923
1924	mutex_lock(&data->update_lock);
1925	data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1926	if (data->pwm_enable & (1 << (2 * pwm))) {
1927		/* PWM mode */
1928	} else {
1929		/* RPM mode */
1930		if (val < 29)	/* Prevent negative numbers */
1931			val = 255;
1932		else
1933			val = (255 - val) * 32 / val;
1934	}
1935	f71882fg_write8(data, F71882FG_REG_POINT_PWM(pwm, point), val);
1936	data->pwm_auto_point_pwm[pwm][point] = val;
1937	mutex_unlock(&data->update_lock);
1938
1939	return count;
1940}
1941
1942static ssize_t show_pwm_auto_point_temp_hyst(struct device *dev,
1943					     struct device_attribute *devattr,
1944					     char *buf)
1945{
1946	int result = 0;
1947	struct f71882fg_data *data = f71882fg_update_device(dev);
1948	int nr = to_sensor_dev_attr_2(devattr)->index;
1949	int point = to_sensor_dev_attr_2(devattr)->nr;
1950
1951	mutex_lock(&data->update_lock);
1952	if (nr & 1)
1953		result = data->pwm_auto_point_hyst[nr / 2] >> 4;
1954	else
1955		result = data->pwm_auto_point_hyst[nr / 2] & 0x0f;
1956	result = 1000 * (data->pwm_auto_point_temp[nr][point] - result);
1957	mutex_unlock(&data->update_lock);
1958
1959	return sprintf(buf, "%d\n", result);
1960}
1961
1962static ssize_t store_pwm_auto_point_temp_hyst(struct device *dev,
1963					      struct device_attribute *devattr,
1964					      const char *buf, size_t count)
1965{
1966	struct f71882fg_data *data = dev_get_drvdata(dev);
1967	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1968	int point = to_sensor_dev_attr_2(devattr)->nr;
1969	u8 reg;
1970	long val;
1971
1972	err = strict_strtol(buf, 10, &val);
1973	if (err)
1974		return err;
1975
1976	val /= 1000;
1977
1978	mutex_lock(&data->update_lock);
1979	data->pwm_auto_point_temp[nr][point] =
1980		f71882fg_read8(data, F71882FG_REG_POINT_TEMP(nr, point));
1981	val = SENSORS_LIMIT(val, data->pwm_auto_point_temp[nr][point] - 15,
1982				data->pwm_auto_point_temp[nr][point]);
1983	val = data->pwm_auto_point_temp[nr][point] - val;
1984
1985	reg = f71882fg_read8(data, F71882FG_REG_FAN_HYST(nr / 2));
1986	if (nr & 1)
1987		reg = (reg & 0x0f) | (val << 4);
1988	else
1989		reg = (reg & 0xf0) | val;
1990
1991	f71882fg_write8(data, F71882FG_REG_FAN_HYST(nr / 2), reg);
1992	data->pwm_auto_point_hyst[nr / 2] = reg;
1993	mutex_unlock(&data->update_lock);
1994
1995	return count;
1996}
1997
1998static ssize_t show_pwm_interpolate(struct device *dev,
1999				    struct device_attribute *devattr, char *buf)
2000{
2001	int result;
2002	struct f71882fg_data *data = f71882fg_update_device(dev);
2003	int nr = to_sensor_dev_attr_2(devattr)->index;
2004
2005	result = (data->pwm_auto_point_mapping[nr] >> 4) & 1;
2006
2007	return sprintf(buf, "%d\n", result);
2008}
2009
2010static ssize_t store_pwm_interpolate(struct device *dev,
2011				     struct device_attribute *devattr,
2012				     const char *buf, size_t count)
2013{
2014	struct f71882fg_data *data = dev_get_drvdata(dev);
2015	int err, nr = to_sensor_dev_attr_2(devattr)->index;
2016	unsigned long val;
2017
2018	err = strict_strtoul(buf, 10, &val);
2019	if (err)
2020		return err;
2021
2022	mutex_lock(&data->update_lock);
2023	data->pwm_auto_point_mapping[nr] =
2024		f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr));
2025	if (val)
2026		val = data->pwm_auto_point_mapping[nr] | (1 << 4);
2027	else
2028		val = data->pwm_auto_point_mapping[nr] & (~(1 << 4));
2029	f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val);
2030	data->pwm_auto_point_mapping[nr] = val;
2031	mutex_unlock(&data->update_lock);
2032
2033	return count;
2034}
2035
2036static ssize_t show_pwm_auto_point_channel(struct device *dev,
2037					   struct device_attribute *devattr,
2038					   char *buf)
2039{
2040	int result;
2041	struct f71882fg_data *data = f71882fg_update_device(dev);
2042	int nr = to_sensor_dev_attr_2(devattr)->index;
2043
2044	result = 1 << ((data->pwm_auto_point_mapping[nr] & 3) -
2045		       data->temp_start);
2046
2047	return sprintf(buf, "%d\n", result);
2048}
2049
2050static ssize_t store_pwm_auto_point_channel(struct device *dev,
2051					    struct device_attribute *devattr,
2052					    const char *buf, size_t count)
2053{
2054	struct f71882fg_data *data = dev_get_drvdata(dev);
2055	int err, nr = to_sensor_dev_attr_2(devattr)->index;
2056	long val;
2057
2058	err = strict_strtol(buf, 10, &val);
2059	if (err)
2060		return err;
2061
2062	switch (val) {
2063	case 1:
2064		val = 0;
2065		break;
2066	case 2:
2067		val = 1;
2068		break;
2069	case 4:
2070		val = 2;
2071		break;
2072	default:
2073		return -EINVAL;
2074	}
2075	val += data->temp_start;
2076	mutex_lock(&data->update_lock);
2077	data->pwm_auto_point_mapping[nr] =
2078		f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr));
2079	val = (data->pwm_auto_point_mapping[nr] & 0xfc) | val;
2080	f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val);
2081	data->pwm_auto_point_mapping[nr] = val;
2082	mutex_unlock(&data->update_lock);
2083
2084	return count;
2085}
2086
2087static ssize_t show_pwm_auto_point_temp(struct device *dev,
2088					struct device_attribute *devattr,
2089					char *buf)
2090{
2091	int result;
2092	struct f71882fg_data *data = f71882fg_update_device(dev);
2093	int pwm = to_sensor_dev_attr_2(devattr)->index;
2094	int point = to_sensor_dev_attr_2(devattr)->nr;
2095
2096	result = data->pwm_auto_point_temp[pwm][point];
2097	return sprintf(buf, "%d\n", 1000 * result);
2098}
2099
2100static ssize_t store_pwm_auto_point_temp(struct device *dev,
2101					 struct device_attribute *devattr,
2102					 const char *buf, size_t count)
2103{
2104	struct f71882fg_data *data = dev_get_drvdata(dev);
2105	int err, pwm = to_sensor_dev_attr_2(devattr)->index;
2106	int point = to_sensor_dev_attr_2(devattr)->nr;
2107	long val;
2108
2109	err = strict_strtol(buf, 10, &val);
2110	if (err)
2111		return err;
2112
2113	val /= 1000;
2114
2115	if (data->auto_point_temp_signed)
2116		val = SENSORS_LIMIT(val, -128, 127);
2117	else
2118		val = SENSORS_LIMIT(val, 0, 127);
2119
2120	mutex_lock(&data->update_lock);
2121	f71882fg_write8(data, F71882FG_REG_POINT_TEMP(pwm, point), val);
2122	data->pwm_auto_point_temp[pwm][point] = val;
2123	mutex_unlock(&data->update_lock);
2124
2125	return count;
2126}
2127
2128static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
2129	char *buf)
2130{
2131	struct f71882fg_data *data = dev_get_drvdata(dev);
2132	return sprintf(buf, "%s\n", f71882fg_names[data->type]);
2133}
2134
2135static int __devinit f71882fg_create_sysfs_files(struct platform_device *pdev,
2136	struct sensor_device_attribute_2 *attr, int count)
2137{
2138	int err, i;
2139
2140	for (i = 0; i < count; i++) {
2141		err = device_create_file(&pdev->dev, &attr[i].dev_attr);
2142		if (err)
2143			return err;
2144	}
2145	return 0;
2146}
2147
2148static void f71882fg_remove_sysfs_files(struct platform_device *pdev,
2149	struct sensor_device_attribute_2 *attr, int count)
2150{
2151	int i;
2152
2153	for (i = 0; i < count; i++)
2154		device_remove_file(&pdev->dev, &attr[i].dev_attr);
2155}
2156
2157static int __devinit f71882fg_probe(struct platform_device *pdev)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2158{
2159	struct f71882fg_data *data;
2160	struct f71882fg_sio_data *sio_data = pdev->dev.platform_data;
2161	int nr_fans = f71882fg_nr_fans[sio_data->type];
2162	int nr_temps = f71882fg_nr_temps[sio_data->type];
2163	int err, i;
 
2164	u8 start_reg, reg;
2165
2166	data = kzalloc(sizeof(struct f71882fg_data), GFP_KERNEL);
 
2167	if (!data)
2168		return -ENOMEM;
2169
2170	data->addr = platform_get_resource(pdev, IORESOURCE_IO, 0)->start;
2171	data->type = sio_data->type;
2172	data->temp_start =
2173	    (data->type == f71858fg || data->type == f8000) ? 0 : 1;
 
2174	mutex_init(&data->update_lock);
2175	platform_set_drvdata(pdev, data);
2176
2177	start_reg = f71882fg_read8(data, F71882FG_REG_START);
2178	if (start_reg & 0x04) {
2179		dev_warn(&pdev->dev, "Hardware monitor is powered down\n");
2180		err = -ENODEV;
2181		goto exit_free;
2182	}
2183	if (!(start_reg & 0x03)) {
2184		dev_warn(&pdev->dev, "Hardware monitoring not activated\n");
2185		err = -ENODEV;
2186		goto exit_free;
2187	}
2188
2189	/* Register sysfs interface files */
2190	err = device_create_file(&pdev->dev, &dev_attr_name);
2191	if (err)
2192		goto exit_unregister_sysfs;
2193
2194	if (start_reg & 0x01) {
2195		switch (data->type) {
2196		case f71858fg:
2197			data->temp_config =
2198				f71882fg_read8(data, F71882FG_REG_TEMP_CONFIG);
2199			if (data->temp_config & 0x10)
2200				/* The f71858fg temperature alarms behave as
2201				   the f8000 alarms in this mode */
 
 
2202				err = f71882fg_create_sysfs_files(pdev,
2203					f8000_temp_attr,
2204					ARRAY_SIZE(f8000_temp_attr));
2205			else
2206				err = f71882fg_create_sysfs_files(pdev,
2207					f71858fg_temp_attr,
2208					ARRAY_SIZE(f71858fg_temp_attr));
2209			break;
2210		case f8000:
2211			err = f71882fg_create_sysfs_files(pdev,
2212					f8000_temp_attr,
2213					ARRAY_SIZE(f8000_temp_attr));
2214			break;
 
 
 
 
 
2215		default:
2216			err = f71882fg_create_sysfs_files(pdev,
2217				&fxxxx_temp_attr[0][0],
2218				ARRAY_SIZE(fxxxx_temp_attr[0]) * nr_temps);
2219		}
2220		if (err)
2221			goto exit_unregister_sysfs;
2222
2223		if (f71882fg_temp_has_beep[data->type]) {
2224			err = f71882fg_create_sysfs_files(pdev,
2225					&fxxxx_temp_beep_attr[0][0],
2226					ARRAY_SIZE(fxxxx_temp_beep_attr[0])
2227						* nr_temps);
 
 
 
 
 
 
 
 
2228			if (err)
2229				goto exit_unregister_sysfs;
2230		}
2231
2232		for (i = 0; i < F71882FG_MAX_INS; i++) {
2233			if (f71882fg_has_in[data->type][i]) {
2234				err = device_create_file(&pdev->dev,
2235						&fxxxx_in_attr[i].dev_attr);
2236				if (err)
2237					goto exit_unregister_sysfs;
2238			}
2239		}
2240		if (f71882fg_has_in1_alarm[data->type]) {
2241			err = f71882fg_create_sysfs_files(pdev,
2242					fxxxx_in1_alarm_attr,
2243					ARRAY_SIZE(fxxxx_in1_alarm_attr));
2244			if (err)
2245				goto exit_unregister_sysfs;
2246		}
2247	}
2248
2249	if (start_reg & 0x02) {
2250		switch (data->type) {
2251		case f71808e:
2252		case f71808a:
2253		case f71869:
2254		case f71869a:
2255			/* These always have signed auto point temps */
2256			data->auto_point_temp_signed = 1;
2257			/* Fall through to select correct fan/pwm reg bank! */
2258		case f71889fg:
2259		case f71889ed:
2260		case f71889a:
2261			reg = f71882fg_read8(data, F71882FG_REG_FAN_FAULT_T);
2262			if (reg & F71882FG_FAN_NEG_TEMP_EN)
2263				data->auto_point_temp_signed = 1;
2264			/* Ensure banked pwm registers point to right bank */
2265			reg &= ~F71882FG_FAN_PROG_SEL;
2266			f71882fg_write8(data, F71882FG_REG_FAN_FAULT_T, reg);
2267			break;
2268		default:
2269			break;
2270		}
2271
2272		data->pwm_enable =
2273			f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
2274
2275		/* Sanity check the pwm settings */
2276		switch (data->type) {
2277		case f71858fg:
2278			err = 0;
2279			for (i = 0; i < nr_fans; i++)
2280				if (((data->pwm_enable >> (i * 2)) & 3) == 3)
2281					err = 1;
2282			break;
2283		case f71862fg:
2284			err = (data->pwm_enable & 0x15) != 0x15;
2285			break;
2286		case f8000:
2287			err = data->pwm_enable & 0x20;
2288			break;
2289		default:
2290			err = 0;
2291			break;
2292		}
2293		if (err) {
2294			dev_err(&pdev->dev,
2295				"Invalid (reserved) pwm settings: 0x%02x\n",
2296				(unsigned int)data->pwm_enable);
2297			err = -ENODEV;
2298			goto exit_unregister_sysfs;
2299		}
2300
2301		err = f71882fg_create_sysfs_files(pdev, &fxxxx_fan_attr[0][0],
2302				ARRAY_SIZE(fxxxx_fan_attr[0]) * nr_fans);
2303		if (err)
2304			goto exit_unregister_sysfs;
2305
2306		if (f71882fg_fan_has_beep[data->type]) {
2307			err = f71882fg_create_sysfs_files(pdev,
2308					fxxxx_fan_beep_attr, nr_fans);
2309			if (err)
2310				goto exit_unregister_sysfs;
2311		}
2312
2313		switch (data->type) {
2314		case f71808e:
2315		case f71808a:
2316		case f71869:
2317		case f71869a:
2318		case f71889fg:
2319		case f71889ed:
2320		case f71889a:
2321			for (i = 0; i < nr_fans; i++) {
2322				data->pwm_auto_point_mapping[i] =
2323					f71882fg_read8(data,
2324						F71882FG_REG_POINT_MAPPING(i));
2325				if ((data->pwm_auto_point_mapping[i] & 0x80) ||
2326				    (data->pwm_auto_point_mapping[i] & 3) == 0)
2327					break;
2328			}
2329			if (i != nr_fans) {
2330				dev_warn(&pdev->dev,
2331					 "Auto pwm controlled by raw digital "
2332					 "data, disabling pwm auto_point "
2333					 "sysfs attributes\n");
2334				goto no_pwm_auto_point;
2335			}
2336			break;
2337		default:
2338			break;
2339		}
2340
2341		switch (data->type) {
2342		case f71808a:
2343			err = f71882fg_create_sysfs_files(pdev,
2344				&fxxxx_auto_pwm_attr[0][0],
2345				ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans);
2346			if (err)
2347				goto exit_unregister_sysfs;
2348			err = f71882fg_create_sysfs_files(pdev,
2349					f71808a_fan3_attr,
2350					ARRAY_SIZE(f71808a_fan3_attr));
2351			break;
2352		case f71862fg:
2353			err = f71882fg_create_sysfs_files(pdev,
2354					f71862fg_auto_pwm_attr,
2355					ARRAY_SIZE(f71862fg_auto_pwm_attr));
2356			break;
2357		case f71808e:
2358		case f71869:
2359			err = f71882fg_create_sysfs_files(pdev,
2360					f71869_auto_pwm_attr,
2361					ARRAY_SIZE(f71869_auto_pwm_attr));
2362			break;
2363		case f8000:
2364			err = f71882fg_create_sysfs_files(pdev,
2365					f8000_fan_attr,
2366					ARRAY_SIZE(f8000_fan_attr));
2367			if (err)
2368				goto exit_unregister_sysfs;
2369			err = f71882fg_create_sysfs_files(pdev,
2370					f8000_auto_pwm_attr,
2371					ARRAY_SIZE(f8000_auto_pwm_attr));
2372			break;
2373		default:
2374			err = f71882fg_create_sysfs_files(pdev,
2375				&fxxxx_auto_pwm_attr[0][0],
2376				ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans);
2377		}
2378		if (err)
2379			goto exit_unregister_sysfs;
2380
2381no_pwm_auto_point:
2382		for (i = 0; i < nr_fans; i++)
2383			dev_info(&pdev->dev, "Fan: %d is in %s mode\n", i + 1,
2384				 (data->pwm_enable & (1 << 2 * i)) ?
2385				 "duty-cycle" : "RPM");
2386	}
2387
2388	data->hwmon_dev = hwmon_device_register(&pdev->dev);
2389	if (IS_ERR(data->hwmon_dev)) {
2390		err = PTR_ERR(data->hwmon_dev);
2391		data->hwmon_dev = NULL;
2392		goto exit_unregister_sysfs;
2393	}
2394
2395	return 0;
2396
2397exit_unregister_sysfs:
2398	f71882fg_remove(pdev); /* Will unregister the sysfs files for us */
2399	return err; /* f71882fg_remove() also frees our data */
2400exit_free:
2401	kfree(data);
2402	return err;
2403}
2404
2405static int f71882fg_remove(struct platform_device *pdev)
2406{
2407	struct f71882fg_data *data = platform_get_drvdata(pdev);
2408	int nr_fans = f71882fg_nr_fans[data->type];
2409	int nr_temps = f71882fg_nr_temps[data->type];
2410	int i;
2411	u8 start_reg = f71882fg_read8(data, F71882FG_REG_START);
2412
2413	if (data->hwmon_dev)
2414		hwmon_device_unregister(data->hwmon_dev);
2415
2416	device_remove_file(&pdev->dev, &dev_attr_name);
2417
2418	if (start_reg & 0x01) {
2419		switch (data->type) {
2420		case f71858fg:
2421			if (data->temp_config & 0x10)
2422				f71882fg_remove_sysfs_files(pdev,
2423					f8000_temp_attr,
2424					ARRAY_SIZE(f8000_temp_attr));
2425			else
2426				f71882fg_remove_sysfs_files(pdev,
2427					f71858fg_temp_attr,
2428					ARRAY_SIZE(f71858fg_temp_attr));
2429			break;
2430		case f8000:
2431			f71882fg_remove_sysfs_files(pdev,
2432					f8000_temp_attr,
2433					ARRAY_SIZE(f8000_temp_attr));
2434			break;
 
 
 
 
 
2435		default:
2436			f71882fg_remove_sysfs_files(pdev,
2437				&fxxxx_temp_attr[0][0],
2438				ARRAY_SIZE(fxxxx_temp_attr[0]) * nr_temps);
2439		}
2440		if (f71882fg_temp_has_beep[data->type]) {
2441			f71882fg_remove_sysfs_files(pdev,
2442			       &fxxxx_temp_beep_attr[0][0],
2443			       ARRAY_SIZE(fxxxx_temp_beep_attr[0]) * nr_temps);
 
 
 
 
 
 
 
2444		}
2445
2446		for (i = 0; i < F71882FG_MAX_INS; i++) {
2447			if (f71882fg_has_in[data->type][i]) {
2448				device_remove_file(&pdev->dev,
2449						&fxxxx_in_attr[i].dev_attr);
2450			}
2451		}
2452		if (f71882fg_has_in1_alarm[data->type]) {
2453			f71882fg_remove_sysfs_files(pdev,
2454					fxxxx_in1_alarm_attr,
2455					ARRAY_SIZE(fxxxx_in1_alarm_attr));
2456		}
2457	}
2458
2459	if (start_reg & 0x02) {
2460		f71882fg_remove_sysfs_files(pdev, &fxxxx_fan_attr[0][0],
2461				ARRAY_SIZE(fxxxx_fan_attr[0]) * nr_fans);
2462
2463		if (f71882fg_fan_has_beep[data->type]) {
2464			f71882fg_remove_sysfs_files(pdev,
2465					fxxxx_fan_beep_attr, nr_fans);
2466		}
2467
2468		switch (data->type) {
2469		case f71808a:
2470			f71882fg_remove_sysfs_files(pdev,
2471				&fxxxx_auto_pwm_attr[0][0],
2472				ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans);
2473			f71882fg_remove_sysfs_files(pdev,
2474					f71808a_fan3_attr,
2475					ARRAY_SIZE(f71808a_fan3_attr));
2476			break;
2477		case f71862fg:
2478			f71882fg_remove_sysfs_files(pdev,
2479					f71862fg_auto_pwm_attr,
2480					ARRAY_SIZE(f71862fg_auto_pwm_attr));
 
2481			break;
2482		case f71808e:
2483		case f71869:
2484			f71882fg_remove_sysfs_files(pdev,
2485					f71869_auto_pwm_attr,
2486					ARRAY_SIZE(f71869_auto_pwm_attr));
2487			break;
2488		case f8000:
2489			f71882fg_remove_sysfs_files(pdev,
2490					f8000_fan_attr,
2491					ARRAY_SIZE(f8000_fan_attr));
2492			f71882fg_remove_sysfs_files(pdev,
2493					f8000_auto_pwm_attr,
2494					ARRAY_SIZE(f8000_auto_pwm_attr));
2495			break;
2496		default:
2497			f71882fg_remove_sysfs_files(pdev,
2498				&fxxxx_auto_pwm_attr[0][0],
2499				ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans);
2500		}
2501	}
2502
2503	platform_set_drvdata(pdev, NULL);
2504	kfree(data);
2505
2506	return 0;
2507}
2508
2509static int __init f71882fg_find(int sioaddr, unsigned short *address,
2510	struct f71882fg_sio_data *sio_data)
2511{
2512	u16 devid;
 
2513	int err = superio_enter(sioaddr);
2514	if (err)
2515		return err;
2516
2517	devid = superio_inw(sioaddr, SIO_REG_MANID);
2518	if (devid != SIO_FINTEK_ID) {
2519		pr_debug("Not a Fintek device\n");
2520		err = -ENODEV;
2521		goto exit;
2522	}
2523
2524	devid = force_id ? force_id : superio_inw(sioaddr, SIO_REG_DEVID);
2525	switch (devid) {
2526	case SIO_F71808E_ID:
2527		sio_data->type = f71808e;
2528		break;
2529	case SIO_F71808A_ID:
2530		sio_data->type = f71808a;
2531		break;
2532	case SIO_F71858_ID:
2533		sio_data->type = f71858fg;
2534		break;
2535	case SIO_F71862_ID:
2536		sio_data->type = f71862fg;
2537		break;
 
 
 
2538	case SIO_F71869_ID:
2539		sio_data->type = f71869;
2540		break;
2541	case SIO_F71869A_ID:
2542		sio_data->type = f71869a;
2543		break;
2544	case SIO_F71882_ID:
2545		sio_data->type = f71882fg;
2546		break;
2547	case SIO_F71889_ID:
2548		sio_data->type = f71889fg;
2549		break;
2550	case SIO_F71889E_ID:
2551		sio_data->type = f71889ed;
2552		break;
2553	case SIO_F71889A_ID:
2554		sio_data->type = f71889a;
2555		break;
2556	case SIO_F8000_ID:
2557		sio_data->type = f8000;
2558		break;
 
 
 
2559	case SIO_F81865_ID:
2560		sio_data->type = f81865f;
2561		break;
 
 
 
2562	default:
2563		pr_info("Unsupported Fintek device: %04x\n",
2564			(unsigned int)devid);
2565		err = -ENODEV;
2566		goto exit;
2567	}
2568
2569	if (sio_data->type == f71858fg)
2570		superio_select(sioaddr, SIO_F71858FG_LD_HWM);
2571	else
2572		superio_select(sioaddr, SIO_F71882FG_LD_HWM);
2573
2574	if (!(superio_inb(sioaddr, SIO_REG_ENABLE) & 0x01)) {
2575		pr_warn("Device not activated\n");
2576		err = -ENODEV;
2577		goto exit;
2578	}
2579
2580	*address = superio_inw(sioaddr, SIO_REG_ADDR);
2581	if (*address == 0) {
2582		pr_warn("Base address not set\n");
2583		err = -ENODEV;
2584		goto exit;
2585	}
2586	*address &= ~(REGION_LENGTH - 1);	/* Ignore 3 LSB */
2587
2588	err = 0;
2589	pr_info("Found %s chip at %#x, revision %d\n",
2590		f71882fg_names[sio_data->type],	(unsigned int)*address,
2591		(int)superio_inb(sioaddr, SIO_REG_DEVREV));
2592exit:
2593	superio_exit(sioaddr);
2594	return err;
2595}
2596
2597static int __init f71882fg_device_add(unsigned short address,
2598	const struct f71882fg_sio_data *sio_data)
2599{
2600	struct resource res = {
2601		.start	= address,
2602		.end	= address + REGION_LENGTH - 1,
2603		.flags	= IORESOURCE_IO,
2604	};
2605	int err;
2606
2607	f71882fg_pdev = platform_device_alloc(DRVNAME, address);
2608	if (!f71882fg_pdev)
2609		return -ENOMEM;
2610
2611	res.name = f71882fg_pdev->name;
2612	err = acpi_check_resource_conflict(&res);
2613	if (err)
2614		goto exit_device_put;
2615
2616	err = platform_device_add_resources(f71882fg_pdev, &res, 1);
2617	if (err) {
2618		pr_err("Device resource addition failed\n");
2619		goto exit_device_put;
2620	}
2621
2622	err = platform_device_add_data(f71882fg_pdev, sio_data,
2623				       sizeof(struct f71882fg_sio_data));
2624	if (err) {
2625		pr_err("Platform data allocation failed\n");
2626		goto exit_device_put;
2627	}
2628
2629	err = platform_device_add(f71882fg_pdev);
2630	if (err) {
2631		pr_err("Device addition failed\n");
2632		goto exit_device_put;
2633	}
2634
2635	return 0;
2636
2637exit_device_put:
2638	platform_device_put(f71882fg_pdev);
2639
2640	return err;
2641}
2642
2643static int __init f71882fg_init(void)
2644{
2645	int err = -ENODEV;
2646	unsigned short address;
2647	struct f71882fg_sio_data sio_data;
2648
2649	memset(&sio_data, 0, sizeof(sio_data));
2650
2651	if (f71882fg_find(0x2e, &address, &sio_data) &&
2652	    f71882fg_find(0x4e, &address, &sio_data))
2653		goto exit;
 
 
2654
2655	err = platform_driver_register(&f71882fg_driver);
2656	if (err)
2657		goto exit;
2658
2659	err = f71882fg_device_add(address, &sio_data);
2660	if (err)
2661		goto exit_driver;
2662
2663	return 0;
2664
2665exit_driver:
2666	platform_driver_unregister(&f71882fg_driver);
2667exit:
2668	return err;
2669}
2670
2671static void __exit f71882fg_exit(void)
2672{
2673	platform_device_unregister(f71882fg_pdev);
2674	platform_driver_unregister(&f71882fg_driver);
2675}
2676
2677MODULE_DESCRIPTION("F71882FG Hardware Monitoring Driver");
2678MODULE_AUTHOR("Hans Edgington, Hans de Goede <hdegoede@redhat.com>");
2679MODULE_LICENSE("GPL");
2680
2681module_init(f71882fg_init);
2682module_exit(f71882fg_exit);
v4.6
   1/***************************************************************************
   2 *   Copyright (C) 2006 by Hans Edgington <hans@edgington.nl>              *
   3 *   Copyright (C) 2007-2011 Hans de Goede <hdegoede@redhat.com>           *
   4 *                                                                         *
   5 *   This program is free software; you can redistribute it and/or modify  *
   6 *   it under the terms of the GNU General Public License as published by  *
   7 *   the Free Software Foundation; either version 2 of the License, or     *
   8 *   (at your option) any later version.                                   *
   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 *   You should have received a copy of the GNU General Public License     *
  16 *   along with this program; if not, write to the                         *
  17 *   Free Software Foundation, Inc.,                                       *
  18 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  19 ***************************************************************************/
  20
  21#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  22
  23#include <linux/module.h>
  24#include <linux/init.h>
  25#include <linux/slab.h>
  26#include <linux/jiffies.h>
  27#include <linux/platform_device.h>
  28#include <linux/hwmon.h>
  29#include <linux/hwmon-sysfs.h>
  30#include <linux/err.h>
  31#include <linux/mutex.h>
  32#include <linux/io.h>
  33#include <linux/acpi.h>
  34
  35#define DRVNAME "f71882fg"
  36
  37#define SIO_F71858FG_LD_HWM	0x02	/* Hardware monitor logical device */
  38#define SIO_F71882FG_LD_HWM	0x04	/* Hardware monitor logical device */
  39#define SIO_UNLOCK_KEY		0x87	/* Key to enable Super-I/O */
  40#define SIO_LOCK_KEY		0xAA	/* Key to disable Super-I/O */
  41
  42#define SIO_REG_LDSEL		0x07	/* Logical device select */
  43#define SIO_REG_DEVID		0x20	/* Device ID (2 bytes) */
  44#define SIO_REG_DEVREV		0x22	/* Device revision */
  45#define SIO_REG_MANID		0x23	/* Fintek ID (2 bytes) */
  46#define SIO_REG_ENABLE		0x30	/* Logical device enable */
  47#define SIO_REG_ADDR		0x60	/* Logical device address (2 bytes) */
  48
  49#define SIO_FINTEK_ID		0x1934	/* Manufacturers ID */
  50#define SIO_F71808E_ID		0x0901	/* Chipset ID */
  51#define SIO_F71808A_ID		0x1001	/* Chipset ID */
  52#define SIO_F71858_ID		0x0507  /* Chipset ID */
  53#define SIO_F71862_ID		0x0601	/* Chipset ID */
  54#define SIO_F71868_ID		0x1106	/* Chipset ID */
  55#define SIO_F71869_ID		0x0814	/* Chipset ID */
  56#define SIO_F71869A_ID		0x1007	/* Chipset ID */
  57#define SIO_F71882_ID		0x0541	/* Chipset ID */
  58#define SIO_F71889_ID		0x0723	/* Chipset ID */
  59#define SIO_F71889E_ID		0x0909	/* Chipset ID */
  60#define SIO_F71889A_ID		0x1005	/* Chipset ID */
  61#define SIO_F8000_ID		0x0581	/* Chipset ID */
  62#define SIO_F81768D_ID		0x1210	/* Chipset ID */
  63#define SIO_F81865_ID		0x0704	/* Chipset ID */
  64#define SIO_F81866_ID		0x1010	/* Chipset ID */
  65
  66#define REGION_LENGTH		8
  67#define ADDR_REG_OFFSET		5
  68#define DATA_REG_OFFSET		6
  69
  70#define F71882FG_REG_IN_STATUS		0x12 /* f7188x only */
  71#define F71882FG_REG_IN_BEEP		0x13 /* f7188x only */
  72#define F71882FG_REG_IN(nr)		(0x20  + (nr))
  73#define F71882FG_REG_IN1_HIGH		0x32 /* f7188x only */
  74
  75#define F81866_REG_IN_STATUS		0x16 /* F81866 only */
  76#define F81866_REG_IN_BEEP			0x17 /* F81866 only */
  77#define F81866_REG_IN1_HIGH		0x3a /* F81866 only */
  78
  79#define F71882FG_REG_FAN(nr)		(0xA0 + (16 * (nr)))
  80#define F71882FG_REG_FAN_TARGET(nr)	(0xA2 + (16 * (nr)))
  81#define F71882FG_REG_FAN_FULL_SPEED(nr)	(0xA4 + (16 * (nr)))
  82#define F71882FG_REG_FAN_STATUS		0x92
  83#define F71882FG_REG_FAN_BEEP		0x93
  84
  85#define F71882FG_REG_TEMP(nr)		(0x70 + 2 * (nr))
  86#define F71882FG_REG_TEMP_OVT(nr)	(0x80 + 2 * (nr))
  87#define F71882FG_REG_TEMP_HIGH(nr)	(0x81 + 2 * (nr))
  88#define F71882FG_REG_TEMP_STATUS	0x62
  89#define F71882FG_REG_TEMP_BEEP		0x63
  90#define F71882FG_REG_TEMP_CONFIG	0x69
  91#define F71882FG_REG_TEMP_HYST(nr)	(0x6C + (nr))
  92#define F71882FG_REG_TEMP_TYPE		0x6B
  93#define F71882FG_REG_TEMP_DIODE_OPEN	0x6F
  94
  95#define F71882FG_REG_PWM(nr)		(0xA3 + (16 * (nr)))
  96#define F71882FG_REG_PWM_TYPE		0x94
  97#define F71882FG_REG_PWM_ENABLE		0x96
  98
  99#define F71882FG_REG_FAN_HYST(nr)	(0x98 + (nr))
 100
 101#define F71882FG_REG_FAN_FAULT_T	0x9F
 102#define F71882FG_FAN_NEG_TEMP_EN	0x20
 103#define F71882FG_FAN_PROG_SEL		0x80
 104
 105#define F71882FG_REG_POINT_PWM(pwm, point)	(0xAA + (point) + (16 * (pwm)))
 106#define F71882FG_REG_POINT_TEMP(pwm, point)	(0xA6 + (point) + (16 * (pwm)))
 107#define F71882FG_REG_POINT_MAPPING(nr)		(0xAF + 16 * (nr))
 108
 109#define	F71882FG_REG_START		0x01
 110
 111#define F71882FG_MAX_INS		11
 112
 113#define FAN_MIN_DETECT			366 /* Lowest detectable fanspeed */
 114
 115static unsigned short force_id;
 116module_param(force_id, ushort, 0);
 117MODULE_PARM_DESC(force_id, "Override the detected device ID");
 118
 119enum chips { f71808e, f71808a, f71858fg, f71862fg, f71868a, f71869, f71869a,
 120	f71882fg, f71889fg, f71889ed, f71889a, f8000, f81768d, f81865f,
 121	f81866a};
 122
 123static const char *const f71882fg_names[] = {
 124	"f71808e",
 125	"f71808a",
 126	"f71858fg",
 127	"f71862fg",
 128	"f71868a",
 129	"f71869", /* Both f71869f and f71869e, reg. compatible and same id */
 130	"f71869a",
 131	"f71882fg",
 132	"f71889fg", /* f81801u too, same id */
 133	"f71889ed",
 134	"f71889a",
 135	"f8000",
 136	"f81768d",
 137	"f81865f",
 138	"f81866a",
 139};
 140
 141static const char f71882fg_has_in[][F71882FG_MAX_INS] = {
 142	[f71808e]	= { 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0 },
 143	[f71808a]	= { 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0 },
 144	[f71858fg]	= { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
 145	[f71862fg]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
 146	[f71868a]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
 147	[f71869]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
 148	[f71869a]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
 149	[f71882fg]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
 150	[f71889fg]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
 151	[f71889ed]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
 152	[f71889a]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
 153	[f8000]		= { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
 154	[f81768d]	= { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
 155	[f81865f]	= { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
 156	[f81866a]	= { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
 157};
 158
 159static const char f71882fg_has_in1_alarm[] = {
 160	[f71808e]	= 0,
 161	[f71808a]	= 0,
 162	[f71858fg]	= 0,
 163	[f71862fg]	= 0,
 164	[f71868a]	= 0,
 165	[f71869]	= 0,
 166	[f71869a]	= 0,
 167	[f71882fg]	= 1,
 168	[f71889fg]	= 1,
 169	[f71889ed]	= 1,
 170	[f71889a]	= 1,
 171	[f8000]		= 0,
 172	[f81768d]	= 1,
 173	[f81865f]	= 1,
 174	[f81866a]	= 1,
 175};
 176
 177static const char f71882fg_fan_has_beep[] = {
 178	[f71808e]	= 0,
 179	[f71808a]	= 0,
 180	[f71858fg]	= 0,
 181	[f71862fg]	= 1,
 182	[f71868a]	= 1,
 183	[f71869]	= 1,
 184	[f71869a]	= 1,
 185	[f71882fg]	= 1,
 186	[f71889fg]	= 1,
 187	[f71889ed]	= 1,
 188	[f71889a]	= 1,
 189	[f8000]		= 0,
 190	[f81768d]	= 1,
 191	[f81865f]	= 1,
 192	[f81866a]	= 1,
 193};
 194
 195static const char f71882fg_nr_fans[] = {
 196	[f71808e]	= 3,
 197	[f71808a]	= 2, /* +1 fan which is monitor + simple pwm only */
 198	[f71858fg]	= 3,
 199	[f71862fg]	= 3,
 200	[f71868a]	= 3,
 201	[f71869]	= 3,
 202	[f71869a]	= 3,
 203	[f71882fg]	= 4,
 204	[f71889fg]	= 3,
 205	[f71889ed]	= 3,
 206	[f71889a]	= 3,
 207	[f8000]		= 3, /* +1 fan which is monitor only */
 208	[f81768d]	= 3,
 209	[f81865f]	= 2,
 210	[f81866a]	= 3,
 211};
 212
 213static const char f71882fg_temp_has_beep[] = {
 214	[f71808e]	= 0,
 215	[f71808a]	= 1,
 216	[f71858fg]	= 0,
 217	[f71862fg]	= 1,
 218	[f71868a]	= 1,
 219	[f71869]	= 1,
 220	[f71869a]	= 1,
 221	[f71882fg]	= 1,
 222	[f71889fg]	= 1,
 223	[f71889ed]	= 1,
 224	[f71889a]	= 1,
 225	[f8000]		= 0,
 226	[f81768d]	= 1,
 227	[f81865f]	= 1,
 228	[f81866a]	= 1,
 229};
 230
 231static const char f71882fg_nr_temps[] = {
 232	[f71808e]	= 2,
 233	[f71808a]	= 2,
 234	[f71858fg]	= 3,
 235	[f71862fg]	= 3,
 236	[f71868a]	= 3,
 237	[f71869]	= 3,
 238	[f71869a]	= 3,
 239	[f71882fg]	= 3,
 240	[f71889fg]	= 3,
 241	[f71889ed]	= 3,
 242	[f71889a]	= 3,
 243	[f8000]		= 3,
 244	[f81768d]	= 3,
 245	[f81865f]	= 2,
 246	[f81866a]	= 3,
 247};
 248
 249static struct platform_device *f71882fg_pdev;
 250
 251/* Super-I/O Function prototypes */
 252static inline int superio_inb(int base, int reg);
 253static inline int superio_inw(int base, int reg);
 254static inline int superio_enter(int base);
 255static inline void superio_select(int base, int ld);
 256static inline void superio_exit(int base);
 257
 258struct f71882fg_sio_data {
 259	enum chips type;
 260};
 261
 262struct f71882fg_data {
 263	unsigned short addr;
 264	enum chips type;
 265	struct device *hwmon_dev;
 266
 267	struct mutex update_lock;
 268	int temp_start;			/* temp numbering start (0 or 1) */
 269	char valid;			/* !=0 if following fields are valid */
 270	char auto_point_temp_signed;
 271	unsigned long last_updated;	/* In jiffies */
 272	unsigned long last_limits;	/* In jiffies */
 273
 274	/* Register Values */
 275	u8	in[F71882FG_MAX_INS];
 276	u8	in1_max;
 277	u8	in_status;
 278	u8	in_beep;
 279	u16	fan[4];
 280	u16	fan_target[4];
 281	u16	fan_full_speed[4];
 282	u8	fan_status;
 283	u8	fan_beep;
 284	/*
 285	 * Note: all models have max 3 temperature channels, but on some
 286	 * they are addressed as 0-2 and on others as 1-3, so for coding
 287	 * convenience we reserve space for 4 channels
 288	 */
 289	u16	temp[4];
 290	u8	temp_ovt[4];
 291	u8	temp_high[4];
 292	u8	temp_hyst[2]; /* 2 hysts stored per reg */
 293	u8	temp_type[4];
 294	u8	temp_status;
 295	u8	temp_beep;
 296	u8	temp_diode_open;
 297	u8	temp_config;
 298	u8	pwm[4];
 299	u8	pwm_enable;
 300	u8	pwm_auto_point_hyst[2];
 301	u8	pwm_auto_point_mapping[4];
 302	u8	pwm_auto_point_pwm[4][5];
 303	s8	pwm_auto_point_temp[4][4];
 304};
 305
 306/* Sysfs in */
 307static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
 308	char *buf);
 309static ssize_t show_in_max(struct device *dev, struct device_attribute
 310	*devattr, char *buf);
 311static ssize_t store_in_max(struct device *dev, struct device_attribute
 312	*devattr, const char *buf, size_t count);
 313static ssize_t show_in_beep(struct device *dev, struct device_attribute
 314	*devattr, char *buf);
 315static ssize_t store_in_beep(struct device *dev, struct device_attribute
 316	*devattr, const char *buf, size_t count);
 317static ssize_t show_in_alarm(struct device *dev, struct device_attribute
 318	*devattr, char *buf);
 319/* Sysfs Fan */
 320static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
 321	char *buf);
 322static ssize_t show_fan_full_speed(struct device *dev,
 323	struct device_attribute *devattr, char *buf);
 324static ssize_t store_fan_full_speed(struct device *dev,
 325	struct device_attribute *devattr, const char *buf, size_t count);
 326static ssize_t show_fan_beep(struct device *dev, struct device_attribute
 327	*devattr, char *buf);
 328static ssize_t store_fan_beep(struct device *dev, struct device_attribute
 329	*devattr, const char *buf, size_t count);
 330static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
 331	*devattr, char *buf);
 332/* Sysfs Temp */
 333static ssize_t show_temp(struct device *dev, struct device_attribute
 334	*devattr, char *buf);
 335static ssize_t show_temp_max(struct device *dev, struct device_attribute
 336	*devattr, char *buf);
 337static ssize_t store_temp_max(struct device *dev, struct device_attribute
 338	*devattr, const char *buf, size_t count);
 339static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute
 340	*devattr, char *buf);
 341static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute
 342	*devattr, const char *buf, size_t count);
 343static ssize_t show_temp_crit(struct device *dev, struct device_attribute
 344	*devattr, char *buf);
 345static ssize_t store_temp_crit(struct device *dev, struct device_attribute
 346	*devattr, const char *buf, size_t count);
 347static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute
 348	*devattr, char *buf);
 349static ssize_t show_temp_type(struct device *dev, struct device_attribute
 350	*devattr, char *buf);
 351static ssize_t show_temp_beep(struct device *dev, struct device_attribute
 352	*devattr, char *buf);
 353static ssize_t store_temp_beep(struct device *dev, struct device_attribute
 354	*devattr, const char *buf, size_t count);
 355static ssize_t show_temp_alarm(struct device *dev, struct device_attribute
 356	*devattr, char *buf);
 357static ssize_t show_temp_fault(struct device *dev, struct device_attribute
 358	*devattr, char *buf);
 359/* PWM and Auto point control */
 360static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr,
 361	char *buf);
 362static ssize_t store_pwm(struct device *dev, struct device_attribute *devattr,
 363	const char *buf, size_t count);
 364static ssize_t show_simple_pwm(struct device *dev,
 365	struct device_attribute *devattr, char *buf);
 366static ssize_t store_simple_pwm(struct device *dev,
 367	struct device_attribute *devattr, const char *buf, size_t count);
 368static ssize_t show_pwm_enable(struct device *dev,
 369	struct device_attribute *devattr, char *buf);
 370static ssize_t store_pwm_enable(struct device *dev,
 371	struct device_attribute	*devattr, const char *buf, size_t count);
 372static ssize_t show_pwm_interpolate(struct device *dev,
 373	struct device_attribute *devattr, char *buf);
 374static ssize_t store_pwm_interpolate(struct device *dev,
 375	struct device_attribute *devattr, const char *buf, size_t count);
 376static ssize_t show_pwm_auto_point_channel(struct device *dev,
 377	struct device_attribute *devattr, char *buf);
 378static ssize_t store_pwm_auto_point_channel(struct device *dev,
 379	struct device_attribute *devattr, const char *buf, size_t count);
 380static ssize_t show_pwm_auto_point_temp_hyst(struct device *dev,
 381	struct device_attribute *devattr, char *buf);
 382static ssize_t store_pwm_auto_point_temp_hyst(struct device *dev,
 383	struct device_attribute *devattr, const char *buf, size_t count);
 384static ssize_t show_pwm_auto_point_pwm(struct device *dev,
 385	struct device_attribute *devattr, char *buf);
 386static ssize_t store_pwm_auto_point_pwm(struct device *dev,
 387	struct device_attribute *devattr, const char *buf, size_t count);
 388static ssize_t show_pwm_auto_point_temp(struct device *dev,
 389	struct device_attribute *devattr, char *buf);
 390static ssize_t store_pwm_auto_point_temp(struct device *dev,
 391	struct device_attribute *devattr, const char *buf, size_t count);
 392/* Sysfs misc */
 393static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
 394	char *buf);
 395
 396static int f71882fg_probe(struct platform_device *pdev);
 397static int f71882fg_remove(struct platform_device *pdev);
 398
 399static struct platform_driver f71882fg_driver = {
 400	.driver = {
 
 401		.name	= DRVNAME,
 402	},
 403	.probe		= f71882fg_probe,
 404	.remove		= f71882fg_remove,
 405};
 406
 407static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
 408
 409/*
 410 * Temp attr for the f71858fg, the f71858fg is special as it has its
 411 * temperature indexes start at 0 (the others start at 1)
 412 */
 413static struct sensor_device_attribute_2 f71858fg_temp_attr[] = {
 414	SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0),
 415	SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_max,
 416		store_temp_max, 0, 0),
 417	SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 418		store_temp_max_hyst, 0, 0),
 419	SENSOR_ATTR_2(temp1_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 0),
 420	SENSOR_ATTR_2(temp1_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 421		store_temp_crit, 0, 0),
 422	SENSOR_ATTR_2(temp1_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 423		0, 0),
 424	SENSOR_ATTR_2(temp1_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 4),
 425	SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 0),
 426	SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 1),
 427	SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_max,
 428		store_temp_max, 0, 1),
 429	SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 430		store_temp_max_hyst, 0, 1),
 431	SENSOR_ATTR_2(temp2_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 1),
 432	SENSOR_ATTR_2(temp2_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 433		store_temp_crit, 0, 1),
 434	SENSOR_ATTR_2(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 435		0, 1),
 436	SENSOR_ATTR_2(temp2_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5),
 437	SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
 438	SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 2),
 439	SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_max,
 440		store_temp_max, 0, 2),
 441	SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 442		store_temp_max_hyst, 0, 2),
 443	SENSOR_ATTR_2(temp3_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 2),
 444	SENSOR_ATTR_2(temp3_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 445		store_temp_crit, 0, 2),
 446	SENSOR_ATTR_2(temp3_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 447		0, 2),
 448	SENSOR_ATTR_2(temp3_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6),
 449	SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
 450};
 451
 452/* Temp attr for the standard models */
 453static struct sensor_device_attribute_2 fxxxx_temp_attr[3][9] = { {
 454	SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 1),
 455	SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_max,
 456		store_temp_max, 0, 1),
 457	SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 458		store_temp_max_hyst, 0, 1),
 459	/*
 460	 * Should really be temp1_max_alarm, but older versions did not handle
 461	 * the max and crit alarms separately and lm_sensors v2 depends on the
 462	 * presence of temp#_alarm files. The same goes for temp2/3 _alarm.
 463	 */
 464	SENSOR_ATTR_2(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 1),
 465	SENSOR_ATTR_2(temp1_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 466		store_temp_crit, 0, 1),
 467	SENSOR_ATTR_2(temp1_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 468		0, 1),
 469	SENSOR_ATTR_2(temp1_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5),
 470	SENSOR_ATTR_2(temp1_type, S_IRUGO, show_temp_type, NULL, 0, 1),
 471	SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
 472}, {
 473	SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 2),
 474	SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_max,
 475		store_temp_max, 0, 2),
 476	SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 477		store_temp_max_hyst, 0, 2),
 478	/* Should be temp2_max_alarm, see temp1_alarm note */
 479	SENSOR_ATTR_2(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 2),
 480	SENSOR_ATTR_2(temp2_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 481		store_temp_crit, 0, 2),
 482	SENSOR_ATTR_2(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 483		0, 2),
 484	SENSOR_ATTR_2(temp2_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6),
 485	SENSOR_ATTR_2(temp2_type, S_IRUGO, show_temp_type, NULL, 0, 2),
 486	SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
 487}, {
 488	SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 3),
 489	SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_max,
 490		store_temp_max, 0, 3),
 491	SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 492		store_temp_max_hyst, 0, 3),
 493	/* Should be temp3_max_alarm, see temp1_alarm note */
 494	SENSOR_ATTR_2(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 3),
 495	SENSOR_ATTR_2(temp3_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 496		store_temp_crit, 0, 3),
 497	SENSOR_ATTR_2(temp3_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 498		0, 3),
 499	SENSOR_ATTR_2(temp3_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 7),
 500	SENSOR_ATTR_2(temp3_type, S_IRUGO, show_temp_type, NULL, 0, 3),
 501	SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 3),
 502} };
 503
 504/* Temp attr for models which can beep on temp alarm */
 505static struct sensor_device_attribute_2 fxxxx_temp_beep_attr[3][2] = { {
 506	SENSOR_ATTR_2(temp1_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 507		store_temp_beep, 0, 1),
 508	SENSOR_ATTR_2(temp1_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 509		store_temp_beep, 0, 5),
 510}, {
 511	SENSOR_ATTR_2(temp2_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 512		store_temp_beep, 0, 2),
 513	SENSOR_ATTR_2(temp2_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 514		store_temp_beep, 0, 6),
 515}, {
 516	SENSOR_ATTR_2(temp3_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 517		store_temp_beep, 0, 3),
 518	SENSOR_ATTR_2(temp3_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 519		store_temp_beep, 0, 7),
 520} };
 521
 522static struct sensor_device_attribute_2 f81866_temp_beep_attr[3][2] = { {
 523	SENSOR_ATTR_2(temp1_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 524		store_temp_beep, 0, 0),
 525	SENSOR_ATTR_2(temp1_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 526		store_temp_beep, 0, 4),
 527}, {
 528	SENSOR_ATTR_2(temp2_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 529		store_temp_beep, 0, 1),
 530	SENSOR_ATTR_2(temp2_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 531		store_temp_beep, 0, 5),
 532}, {
 533	SENSOR_ATTR_2(temp3_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 534		store_temp_beep, 0, 2),
 535	SENSOR_ATTR_2(temp3_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 536		store_temp_beep, 0, 6),
 537} };
 538
 539/*
 540 * Temp attr for the f8000
 541 * Note on the f8000 temp_ovt (crit) is used as max, and temp_high (max)
 542 * is used as hysteresis value to clear alarms
 543 * Also like the f71858fg its temperature indexes start at 0
 544 */
 545static struct sensor_device_attribute_2 f8000_temp_attr[] = {
 546	SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0),
 547	SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_crit,
 548		store_temp_crit, 0, 0),
 549	SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
 550		store_temp_max, 0, 0),
 551	SENSOR_ATTR_2(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 4),
 552	SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 0),
 553	SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 1),
 554	SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_crit,
 555		store_temp_crit, 0, 1),
 556	SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
 557		store_temp_max, 0, 1),
 558	SENSOR_ATTR_2(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5),
 559	SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
 560	SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 2),
 561	SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_crit,
 562		store_temp_crit, 0, 2),
 563	SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
 564		store_temp_max, 0, 2),
 565	SENSOR_ATTR_2(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6),
 566	SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
 567};
 568
 569/* in attr for all models */
 570static struct sensor_device_attribute_2 fxxxx_in_attr[] = {
 571	SENSOR_ATTR_2(in0_input, S_IRUGO, show_in, NULL, 0, 0),
 572	SENSOR_ATTR_2(in1_input, S_IRUGO, show_in, NULL, 0, 1),
 573	SENSOR_ATTR_2(in2_input, S_IRUGO, show_in, NULL, 0, 2),
 574	SENSOR_ATTR_2(in3_input, S_IRUGO, show_in, NULL, 0, 3),
 575	SENSOR_ATTR_2(in4_input, S_IRUGO, show_in, NULL, 0, 4),
 576	SENSOR_ATTR_2(in5_input, S_IRUGO, show_in, NULL, 0, 5),
 577	SENSOR_ATTR_2(in6_input, S_IRUGO, show_in, NULL, 0, 6),
 578	SENSOR_ATTR_2(in7_input, S_IRUGO, show_in, NULL, 0, 7),
 579	SENSOR_ATTR_2(in8_input, S_IRUGO, show_in, NULL, 0, 8),
 580	SENSOR_ATTR_2(in9_input, S_IRUGO, show_in, NULL, 0, 9),
 581	SENSOR_ATTR_2(in10_input, S_IRUGO, show_in, NULL, 0, 10),
 582};
 583
 584/* For models with in1 alarm capability */
 585static struct sensor_device_attribute_2 fxxxx_in1_alarm_attr[] = {
 586	SENSOR_ATTR_2(in1_max, S_IRUGO|S_IWUSR, show_in_max, store_in_max,
 587		0, 1),
 588	SENSOR_ATTR_2(in1_beep, S_IRUGO|S_IWUSR, show_in_beep, store_in_beep,
 589		0, 1),
 590	SENSOR_ATTR_2(in1_alarm, S_IRUGO, show_in_alarm, NULL, 0, 1),
 591};
 592
 593/* Fan / PWM attr common to all models */
 594static struct sensor_device_attribute_2 fxxxx_fan_attr[4][6] = { {
 595	SENSOR_ATTR_2(fan1_input, S_IRUGO, show_fan, NULL, 0, 0),
 596	SENSOR_ATTR_2(fan1_full_speed, S_IRUGO|S_IWUSR,
 597		      show_fan_full_speed,
 598		      store_fan_full_speed, 0, 0),
 599	SENSOR_ATTR_2(fan1_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 0),
 600	SENSOR_ATTR_2(pwm1, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 0),
 601	SENSOR_ATTR_2(pwm1_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
 602		      store_pwm_enable, 0, 0),
 603	SENSOR_ATTR_2(pwm1_interpolate, S_IRUGO|S_IWUSR,
 604		      show_pwm_interpolate, store_pwm_interpolate, 0, 0),
 605}, {
 606	SENSOR_ATTR_2(fan2_input, S_IRUGO, show_fan, NULL, 0, 1),
 607	SENSOR_ATTR_2(fan2_full_speed, S_IRUGO|S_IWUSR,
 608		      show_fan_full_speed,
 609		      store_fan_full_speed, 0, 1),
 610	SENSOR_ATTR_2(fan2_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 1),
 611	SENSOR_ATTR_2(pwm2, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 1),
 612	SENSOR_ATTR_2(pwm2_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
 613		      store_pwm_enable, 0, 1),
 614	SENSOR_ATTR_2(pwm2_interpolate, S_IRUGO|S_IWUSR,
 615		      show_pwm_interpolate, store_pwm_interpolate, 0, 1),
 616}, {
 617	SENSOR_ATTR_2(fan3_input, S_IRUGO, show_fan, NULL, 0, 2),
 618	SENSOR_ATTR_2(fan3_full_speed, S_IRUGO|S_IWUSR,
 619		      show_fan_full_speed,
 620		      store_fan_full_speed, 0, 2),
 621	SENSOR_ATTR_2(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 2),
 622	SENSOR_ATTR_2(pwm3, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 2),
 623	SENSOR_ATTR_2(pwm3_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
 624		      store_pwm_enable, 0, 2),
 625	SENSOR_ATTR_2(pwm3_interpolate, S_IRUGO|S_IWUSR,
 626		      show_pwm_interpolate, store_pwm_interpolate, 0, 2),
 627}, {
 628	SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3),
 629	SENSOR_ATTR_2(fan4_full_speed, S_IRUGO|S_IWUSR,
 630		      show_fan_full_speed,
 631		      store_fan_full_speed, 0, 3),
 632	SENSOR_ATTR_2(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 3),
 633	SENSOR_ATTR_2(pwm4, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 3),
 634	SENSOR_ATTR_2(pwm4_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
 635		      store_pwm_enable, 0, 3),
 636	SENSOR_ATTR_2(pwm4_interpolate, S_IRUGO|S_IWUSR,
 637		      show_pwm_interpolate, store_pwm_interpolate, 0, 3),
 638} };
 639
 640/* Attr for the third fan of the f71808a, which only has manual pwm */
 641static struct sensor_device_attribute_2 f71808a_fan3_attr[] = {
 642	SENSOR_ATTR_2(fan3_input, S_IRUGO, show_fan, NULL, 0, 2),
 643	SENSOR_ATTR_2(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 2),
 644	SENSOR_ATTR_2(pwm3, S_IRUGO|S_IWUSR,
 645		      show_simple_pwm, store_simple_pwm, 0, 2),
 646};
 647
 648/* Attr for models which can beep on Fan alarm */
 649static struct sensor_device_attribute_2 fxxxx_fan_beep_attr[] = {
 650	SENSOR_ATTR_2(fan1_beep, S_IRUGO|S_IWUSR, show_fan_beep,
 651		store_fan_beep, 0, 0),
 652	SENSOR_ATTR_2(fan2_beep, S_IRUGO|S_IWUSR, show_fan_beep,
 653		store_fan_beep, 0, 1),
 654	SENSOR_ATTR_2(fan3_beep, S_IRUGO|S_IWUSR, show_fan_beep,
 655		store_fan_beep, 0, 2),
 656	SENSOR_ATTR_2(fan4_beep, S_IRUGO|S_IWUSR, show_fan_beep,
 657		store_fan_beep, 0, 3),
 658};
 659
 660/*
 661 * PWM attr for the f71862fg, fewer pwms and fewer zones per pwm than the
 662 * standard models
 663 */
 664static struct sensor_device_attribute_2 f71862fg_auto_pwm_attr[3][7] = { {
 665	SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
 666		      show_pwm_auto_point_channel,
 667		      store_pwm_auto_point_channel, 0, 0),
 668	SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR,
 669		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 670		      1, 0),
 671	SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR,
 672		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 673		      4, 0),
 674	SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR,
 675		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 676		      0, 0),
 677	SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR,
 678		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 679		      3, 0),
 680	SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 681		      show_pwm_auto_point_temp_hyst,
 682		      store_pwm_auto_point_temp_hyst,
 683		      0, 0),
 684	SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO,
 685		      show_pwm_auto_point_temp_hyst, NULL, 3, 0),
 686}, {
 687	SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
 688		      show_pwm_auto_point_channel,
 689		      store_pwm_auto_point_channel, 0, 1),
 690	SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR,
 691		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 692		      1, 1),
 693	SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR,
 694		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 695		      4, 1),
 696	SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR,
 697		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 698		      0, 1),
 699	SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR,
 700		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 701		      3, 1),
 702	SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 703		      show_pwm_auto_point_temp_hyst,
 704		      store_pwm_auto_point_temp_hyst,
 705		      0, 1),
 706	SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO,
 707		      show_pwm_auto_point_temp_hyst, NULL, 3, 1),
 708}, {
 709	SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
 710		      show_pwm_auto_point_channel,
 711		      store_pwm_auto_point_channel, 0, 2),
 712	SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR,
 713		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 714		      1, 2),
 715	SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR,
 716		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 717		      4, 2),
 718	SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR,
 719		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 720		      0, 2),
 721	SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR,
 722		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 723		      3, 2),
 724	SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 725		      show_pwm_auto_point_temp_hyst,
 726		      store_pwm_auto_point_temp_hyst,
 727		      0, 2),
 728	SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO,
 729		      show_pwm_auto_point_temp_hyst, NULL, 3, 2),
 730} };
 731
 732/*
 733 * PWM attr for the f71808e/f71869, almost identical to the f71862fg, but the
 734 * pwm setting when the temperature is above the pwmX_auto_point1_temp can be
 735 * programmed instead of being hardcoded to 0xff
 736 */
 737static struct sensor_device_attribute_2 f71869_auto_pwm_attr[3][8] = { {
 738	SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
 739		      show_pwm_auto_point_channel,
 740		      store_pwm_auto_point_channel, 0, 0),
 741	SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR,
 742		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 743		      0, 0),
 744	SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR,
 745		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 746		      1, 0),
 747	SENSOR_ATTR_2(pwm1_auto_point3_pwm, S_IRUGO|S_IWUSR,
 748		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 749		      4, 0),
 750	SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR,
 751		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 752		      0, 0),
 753	SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR,
 754		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 755		      3, 0),
 756	SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 757		      show_pwm_auto_point_temp_hyst,
 758		      store_pwm_auto_point_temp_hyst,
 759		      0, 0),
 760	SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO,
 761		      show_pwm_auto_point_temp_hyst, NULL, 3, 0),
 762}, {
 763	SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
 764		      show_pwm_auto_point_channel,
 765		      store_pwm_auto_point_channel, 0, 1),
 766	SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR,
 767		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 768		      0, 1),
 769	SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR,
 770		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 771		      1, 1),
 772	SENSOR_ATTR_2(pwm2_auto_point3_pwm, S_IRUGO|S_IWUSR,
 773		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 774		      4, 1),
 775	SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR,
 776		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 777		      0, 1),
 778	SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR,
 779		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 780		      3, 1),
 781	SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 782		      show_pwm_auto_point_temp_hyst,
 783		      store_pwm_auto_point_temp_hyst,
 784		      0, 1),
 785	SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO,
 786		      show_pwm_auto_point_temp_hyst, NULL, 3, 1),
 787}, {
 788	SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
 789		      show_pwm_auto_point_channel,
 790		      store_pwm_auto_point_channel, 0, 2),
 791	SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR,
 792		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 793		      0, 2),
 794	SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR,
 795		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 796		      1, 2),
 797	SENSOR_ATTR_2(pwm3_auto_point3_pwm, S_IRUGO|S_IWUSR,
 798		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 799		      4, 2),
 800	SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR,
 801		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 802		      0, 2),
 803	SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR,
 804		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 805		      3, 2),
 806	SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 807		      show_pwm_auto_point_temp_hyst,
 808		      store_pwm_auto_point_temp_hyst,
 809		      0, 2),
 810	SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO,
 811		      show_pwm_auto_point_temp_hyst, NULL, 3, 2),
 812} };
 813
 814/* PWM attr for the standard models */
 815static struct sensor_device_attribute_2 fxxxx_auto_pwm_attr[4][14] = { {
 816	SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
 817		      show_pwm_auto_point_channel,
 818		      store_pwm_auto_point_channel, 0, 0),
 819	SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR,
 820		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 821		      0, 0),
 822	SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR,
 823		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 824		      1, 0),
 825	SENSOR_ATTR_2(pwm1_auto_point3_pwm, S_IRUGO|S_IWUSR,
 826		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 827		      2, 0),
 828	SENSOR_ATTR_2(pwm1_auto_point4_pwm, S_IRUGO|S_IWUSR,
 829		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 830		      3, 0),
 831	SENSOR_ATTR_2(pwm1_auto_point5_pwm, S_IRUGO|S_IWUSR,
 832		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 833		      4, 0),
 834	SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR,
 835		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 836		      0, 0),
 837	SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR,
 838		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 839		      1, 0),
 840	SENSOR_ATTR_2(pwm1_auto_point3_temp, S_IRUGO|S_IWUSR,
 841		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 842		      2, 0),
 843	SENSOR_ATTR_2(pwm1_auto_point4_temp, S_IRUGO|S_IWUSR,
 844		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 845		      3, 0),
 846	SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 847		      show_pwm_auto_point_temp_hyst,
 848		      store_pwm_auto_point_temp_hyst,
 849		      0, 0),
 850	SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO,
 851		      show_pwm_auto_point_temp_hyst, NULL, 1, 0),
 852	SENSOR_ATTR_2(pwm1_auto_point3_temp_hyst, S_IRUGO,
 853		      show_pwm_auto_point_temp_hyst, NULL, 2, 0),
 854	SENSOR_ATTR_2(pwm1_auto_point4_temp_hyst, S_IRUGO,
 855		      show_pwm_auto_point_temp_hyst, NULL, 3, 0),
 856}, {
 857	SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
 858		      show_pwm_auto_point_channel,
 859		      store_pwm_auto_point_channel, 0, 1),
 860	SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR,
 861		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 862		      0, 1),
 863	SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR,
 864		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 865		      1, 1),
 866	SENSOR_ATTR_2(pwm2_auto_point3_pwm, S_IRUGO|S_IWUSR,
 867		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 868		      2, 1),
 869	SENSOR_ATTR_2(pwm2_auto_point4_pwm, S_IRUGO|S_IWUSR,
 870		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 871		      3, 1),
 872	SENSOR_ATTR_2(pwm2_auto_point5_pwm, S_IRUGO|S_IWUSR,
 873		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 874		      4, 1),
 875	SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR,
 876		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 877		      0, 1),
 878	SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR,
 879		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 880		      1, 1),
 881	SENSOR_ATTR_2(pwm2_auto_point3_temp, S_IRUGO|S_IWUSR,
 882		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 883		      2, 1),
 884	SENSOR_ATTR_2(pwm2_auto_point4_temp, S_IRUGO|S_IWUSR,
 885		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 886		      3, 1),
 887	SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 888		      show_pwm_auto_point_temp_hyst,
 889		      store_pwm_auto_point_temp_hyst,
 890		      0, 1),
 891	SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO,
 892		      show_pwm_auto_point_temp_hyst, NULL, 1, 1),
 893	SENSOR_ATTR_2(pwm2_auto_point3_temp_hyst, S_IRUGO,
 894		      show_pwm_auto_point_temp_hyst, NULL, 2, 1),
 895	SENSOR_ATTR_2(pwm2_auto_point4_temp_hyst, S_IRUGO,
 896		      show_pwm_auto_point_temp_hyst, NULL, 3, 1),
 897}, {
 898	SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
 899		      show_pwm_auto_point_channel,
 900		      store_pwm_auto_point_channel, 0, 2),
 901	SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR,
 902		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 903		      0, 2),
 904	SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR,
 905		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 906		      1, 2),
 907	SENSOR_ATTR_2(pwm3_auto_point3_pwm, S_IRUGO|S_IWUSR,
 908		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 909		      2, 2),
 910	SENSOR_ATTR_2(pwm3_auto_point4_pwm, S_IRUGO|S_IWUSR,
 911		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 912		      3, 2),
 913	SENSOR_ATTR_2(pwm3_auto_point5_pwm, S_IRUGO|S_IWUSR,
 914		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 915		      4, 2),
 916	SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR,
 917		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 918		      0, 2),
 919	SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR,
 920		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 921		      1, 2),
 922	SENSOR_ATTR_2(pwm3_auto_point3_temp, S_IRUGO|S_IWUSR,
 923		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 924		      2, 2),
 925	SENSOR_ATTR_2(pwm3_auto_point4_temp, S_IRUGO|S_IWUSR,
 926		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 927		      3, 2),
 928	SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 929		      show_pwm_auto_point_temp_hyst,
 930		      store_pwm_auto_point_temp_hyst,
 931		      0, 2),
 932	SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO,
 933		      show_pwm_auto_point_temp_hyst, NULL, 1, 2),
 934	SENSOR_ATTR_2(pwm3_auto_point3_temp_hyst, S_IRUGO,
 935		      show_pwm_auto_point_temp_hyst, NULL, 2, 2),
 936	SENSOR_ATTR_2(pwm3_auto_point4_temp_hyst, S_IRUGO,
 937		      show_pwm_auto_point_temp_hyst, NULL, 3, 2),
 938}, {
 939	SENSOR_ATTR_2(pwm4_auto_channels_temp, S_IRUGO|S_IWUSR,
 940		      show_pwm_auto_point_channel,
 941		      store_pwm_auto_point_channel, 0, 3),
 942	SENSOR_ATTR_2(pwm4_auto_point1_pwm, S_IRUGO|S_IWUSR,
 943		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 944		      0, 3),
 945	SENSOR_ATTR_2(pwm4_auto_point2_pwm, S_IRUGO|S_IWUSR,
 946		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 947		      1, 3),
 948	SENSOR_ATTR_2(pwm4_auto_point3_pwm, S_IRUGO|S_IWUSR,
 949		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 950		      2, 3),
 951	SENSOR_ATTR_2(pwm4_auto_point4_pwm, S_IRUGO|S_IWUSR,
 952		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 953		      3, 3),
 954	SENSOR_ATTR_2(pwm4_auto_point5_pwm, S_IRUGO|S_IWUSR,
 955		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 956		      4, 3),
 957	SENSOR_ATTR_2(pwm4_auto_point1_temp, S_IRUGO|S_IWUSR,
 958		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 959		      0, 3),
 960	SENSOR_ATTR_2(pwm4_auto_point2_temp, S_IRUGO|S_IWUSR,
 961		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 962		      1, 3),
 963	SENSOR_ATTR_2(pwm4_auto_point3_temp, S_IRUGO|S_IWUSR,
 964		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 965		      2, 3),
 966	SENSOR_ATTR_2(pwm4_auto_point4_temp, S_IRUGO|S_IWUSR,
 967		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 968		      3, 3),
 969	SENSOR_ATTR_2(pwm4_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 970		      show_pwm_auto_point_temp_hyst,
 971		      store_pwm_auto_point_temp_hyst,
 972		      0, 3),
 973	SENSOR_ATTR_2(pwm4_auto_point2_temp_hyst, S_IRUGO,
 974		      show_pwm_auto_point_temp_hyst, NULL, 1, 3),
 975	SENSOR_ATTR_2(pwm4_auto_point3_temp_hyst, S_IRUGO,
 976		      show_pwm_auto_point_temp_hyst, NULL, 2, 3),
 977	SENSOR_ATTR_2(pwm4_auto_point4_temp_hyst, S_IRUGO,
 978		      show_pwm_auto_point_temp_hyst, NULL, 3, 3),
 979} };
 980
 981/* Fan attr specific to the f8000 (4th fan input can only measure speed) */
 982static struct sensor_device_attribute_2 f8000_fan_attr[] = {
 983	SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3),
 984};
 985
 986/*
 987 * PWM attr for the f8000, zones mapped to temp instead of to pwm!
 988 * Also the register block at offset A0 maps to TEMP1 (so our temp2, as the
 989 * F8000 starts counting temps at 0), B0 maps the TEMP2 and C0 maps to TEMP0
 990 */
 991static struct sensor_device_attribute_2 f8000_auto_pwm_attr[3][14] = { {
 992	SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
 993		      show_pwm_auto_point_channel,
 994		      store_pwm_auto_point_channel, 0, 0),
 995	SENSOR_ATTR_2(temp1_auto_point1_pwm, S_IRUGO|S_IWUSR,
 996		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 997		      0, 2),
 998	SENSOR_ATTR_2(temp1_auto_point2_pwm, S_IRUGO|S_IWUSR,
 999		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1000		      1, 2),
1001	SENSOR_ATTR_2(temp1_auto_point3_pwm, S_IRUGO|S_IWUSR,
1002		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1003		      2, 2),
1004	SENSOR_ATTR_2(temp1_auto_point4_pwm, S_IRUGO|S_IWUSR,
1005		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1006		      3, 2),
1007	SENSOR_ATTR_2(temp1_auto_point5_pwm, S_IRUGO|S_IWUSR,
1008		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1009		      4, 2),
1010	SENSOR_ATTR_2(temp1_auto_point1_temp, S_IRUGO|S_IWUSR,
1011		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1012		      0, 2),
1013	SENSOR_ATTR_2(temp1_auto_point2_temp, S_IRUGO|S_IWUSR,
1014		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1015		      1, 2),
1016	SENSOR_ATTR_2(temp1_auto_point3_temp, S_IRUGO|S_IWUSR,
1017		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1018		      2, 2),
1019	SENSOR_ATTR_2(temp1_auto_point4_temp, S_IRUGO|S_IWUSR,
1020		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1021		      3, 2),
1022	SENSOR_ATTR_2(temp1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
1023		      show_pwm_auto_point_temp_hyst,
1024		      store_pwm_auto_point_temp_hyst,
1025		      0, 2),
1026	SENSOR_ATTR_2(temp1_auto_point2_temp_hyst, S_IRUGO,
1027		      show_pwm_auto_point_temp_hyst, NULL, 1, 2),
1028	SENSOR_ATTR_2(temp1_auto_point3_temp_hyst, S_IRUGO,
1029		      show_pwm_auto_point_temp_hyst, NULL, 2, 2),
1030	SENSOR_ATTR_2(temp1_auto_point4_temp_hyst, S_IRUGO,
1031		      show_pwm_auto_point_temp_hyst, NULL, 3, 2),
1032}, {
1033	SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
1034		      show_pwm_auto_point_channel,
1035		      store_pwm_auto_point_channel, 0, 1),
1036	SENSOR_ATTR_2(temp2_auto_point1_pwm, S_IRUGO|S_IWUSR,
1037		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1038		      0, 0),
1039	SENSOR_ATTR_2(temp2_auto_point2_pwm, S_IRUGO|S_IWUSR,
1040		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1041		      1, 0),
1042	SENSOR_ATTR_2(temp2_auto_point3_pwm, S_IRUGO|S_IWUSR,
1043		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1044		      2, 0),
1045	SENSOR_ATTR_2(temp2_auto_point4_pwm, S_IRUGO|S_IWUSR,
1046		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1047		      3, 0),
1048	SENSOR_ATTR_2(temp2_auto_point5_pwm, S_IRUGO|S_IWUSR,
1049		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1050		      4, 0),
1051	SENSOR_ATTR_2(temp2_auto_point1_temp, S_IRUGO|S_IWUSR,
1052		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1053		      0, 0),
1054	SENSOR_ATTR_2(temp2_auto_point2_temp, S_IRUGO|S_IWUSR,
1055		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1056		      1, 0),
1057	SENSOR_ATTR_2(temp2_auto_point3_temp, S_IRUGO|S_IWUSR,
1058		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1059		      2, 0),
1060	SENSOR_ATTR_2(temp2_auto_point4_temp, S_IRUGO|S_IWUSR,
1061		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1062		      3, 0),
1063	SENSOR_ATTR_2(temp2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
1064		      show_pwm_auto_point_temp_hyst,
1065		      store_pwm_auto_point_temp_hyst,
1066		      0, 0),
1067	SENSOR_ATTR_2(temp2_auto_point2_temp_hyst, S_IRUGO,
1068		      show_pwm_auto_point_temp_hyst, NULL, 1, 0),
1069	SENSOR_ATTR_2(temp2_auto_point3_temp_hyst, S_IRUGO,
1070		      show_pwm_auto_point_temp_hyst, NULL, 2, 0),
1071	SENSOR_ATTR_2(temp2_auto_point4_temp_hyst, S_IRUGO,
1072		      show_pwm_auto_point_temp_hyst, NULL, 3, 0),
1073}, {
1074	SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
1075		      show_pwm_auto_point_channel,
1076		      store_pwm_auto_point_channel, 0, 2),
1077	SENSOR_ATTR_2(temp3_auto_point1_pwm, S_IRUGO|S_IWUSR,
1078		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1079		      0, 1),
1080	SENSOR_ATTR_2(temp3_auto_point2_pwm, S_IRUGO|S_IWUSR,
1081		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1082		      1, 1),
1083	SENSOR_ATTR_2(temp3_auto_point3_pwm, S_IRUGO|S_IWUSR,
1084		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1085		      2, 1),
1086	SENSOR_ATTR_2(temp3_auto_point4_pwm, S_IRUGO|S_IWUSR,
1087		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1088		      3, 1),
1089	SENSOR_ATTR_2(temp3_auto_point5_pwm, S_IRUGO|S_IWUSR,
1090		      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1091		      4, 1),
1092	SENSOR_ATTR_2(temp3_auto_point1_temp, S_IRUGO|S_IWUSR,
1093		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1094		      0, 1),
1095	SENSOR_ATTR_2(temp3_auto_point2_temp, S_IRUGO|S_IWUSR,
1096		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1097		      1, 1),
1098	SENSOR_ATTR_2(temp3_auto_point3_temp, S_IRUGO|S_IWUSR,
1099		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1100		      2, 1),
1101	SENSOR_ATTR_2(temp3_auto_point4_temp, S_IRUGO|S_IWUSR,
1102		      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1103		      3, 1),
1104	SENSOR_ATTR_2(temp3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
1105		      show_pwm_auto_point_temp_hyst,
1106		      store_pwm_auto_point_temp_hyst,
1107		      0, 1),
1108	SENSOR_ATTR_2(temp3_auto_point2_temp_hyst, S_IRUGO,
1109		      show_pwm_auto_point_temp_hyst, NULL, 1, 1),
1110	SENSOR_ATTR_2(temp3_auto_point3_temp_hyst, S_IRUGO,
1111		      show_pwm_auto_point_temp_hyst, NULL, 2, 1),
1112	SENSOR_ATTR_2(temp3_auto_point4_temp_hyst, S_IRUGO,
1113		      show_pwm_auto_point_temp_hyst, NULL, 3, 1),
1114} };
1115
1116/* Super I/O functions */
1117static inline int superio_inb(int base, int reg)
1118{
1119	outb(reg, base);
1120	return inb(base + 1);
1121}
1122
1123static int superio_inw(int base, int reg)
1124{
1125	int val;
1126	val  = superio_inb(base, reg) << 8;
1127	val |= superio_inb(base, reg + 1);
1128	return val;
1129}
1130
1131static inline int superio_enter(int base)
1132{
1133	/* Don't step on other drivers' I/O space by accident */
1134	if (!request_muxed_region(base, 2, DRVNAME)) {
1135		pr_err("I/O address 0x%04x already in use\n", base);
1136		return -EBUSY;
1137	}
1138
1139	/* according to the datasheet the key must be send twice! */
1140	outb(SIO_UNLOCK_KEY, base);
1141	outb(SIO_UNLOCK_KEY, base);
1142
1143	return 0;
1144}
1145
1146static inline void superio_select(int base, int ld)
1147{
1148	outb(SIO_REG_LDSEL, base);
1149	outb(ld, base + 1);
1150}
1151
1152static inline void superio_exit(int base)
1153{
1154	outb(SIO_LOCK_KEY, base);
1155	release_region(base, 2);
1156}
1157
1158static inline int fan_from_reg(u16 reg)
1159{
1160	return reg ? (1500000 / reg) : 0;
1161}
1162
1163static inline u16 fan_to_reg(int fan)
1164{
1165	return fan ? (1500000 / fan) : 0;
1166}
1167
1168static u8 f71882fg_read8(struct f71882fg_data *data, u8 reg)
1169{
1170	u8 val;
1171
1172	outb(reg, data->addr + ADDR_REG_OFFSET);
1173	val = inb(data->addr + DATA_REG_OFFSET);
1174
1175	return val;
1176}
1177
1178static u16 f71882fg_read16(struct f71882fg_data *data, u8 reg)
1179{
1180	u16 val;
1181
1182	val  = f71882fg_read8(data, reg) << 8;
1183	val |= f71882fg_read8(data, reg + 1);
1184
1185	return val;
1186}
1187
1188static void f71882fg_write8(struct f71882fg_data *data, u8 reg, u8 val)
1189{
1190	outb(reg, data->addr + ADDR_REG_OFFSET);
1191	outb(val, data->addr + DATA_REG_OFFSET);
1192}
1193
1194static void f71882fg_write16(struct f71882fg_data *data, u8 reg, u16 val)
1195{
1196	f71882fg_write8(data, reg,     val >> 8);
1197	f71882fg_write8(data, reg + 1, val & 0xff);
1198}
1199
1200static u16 f71882fg_read_temp(struct f71882fg_data *data, int nr)
1201{
1202	if (data->type == f71858fg)
1203		return f71882fg_read16(data, F71882FG_REG_TEMP(nr));
1204	else
1205		return f71882fg_read8(data, F71882FG_REG_TEMP(nr));
1206}
1207
1208static struct f71882fg_data *f71882fg_update_device(struct device *dev)
1209{
1210	struct f71882fg_data *data = dev_get_drvdata(dev);
1211	int nr_fans = f71882fg_nr_fans[data->type];
1212	int nr_temps = f71882fg_nr_temps[data->type];
1213	int nr, reg, point;
1214
1215	mutex_lock(&data->update_lock);
1216
1217	/* Update once every 60 seconds */
1218	if (time_after(jiffies, data->last_limits + 60 * HZ) ||
1219			!data->valid) {
1220		if (f71882fg_has_in1_alarm[data->type]) {
1221			if (data->type == f81866a) {
1222				data->in1_max =
1223					f71882fg_read8(data,
1224						       F81866_REG_IN1_HIGH);
1225				data->in_beep =
1226					f71882fg_read8(data,
1227						       F81866_REG_IN_BEEP);
1228			} else {
1229				data->in1_max =
1230					f71882fg_read8(data,
1231						       F71882FG_REG_IN1_HIGH);
1232				data->in_beep =
1233					f71882fg_read8(data,
1234						       F71882FG_REG_IN_BEEP);
1235			}
1236		}
1237
1238		/* Get High & boundary temps*/
1239		for (nr = data->temp_start; nr < nr_temps + data->temp_start;
1240									nr++) {
1241			data->temp_ovt[nr] = f71882fg_read8(data,
1242						F71882FG_REG_TEMP_OVT(nr));
1243			data->temp_high[nr] = f71882fg_read8(data,
1244						F71882FG_REG_TEMP_HIGH(nr));
1245		}
1246
1247		if (data->type != f8000) {
1248			data->temp_hyst[0] = f71882fg_read8(data,
1249						F71882FG_REG_TEMP_HYST(0));
1250			data->temp_hyst[1] = f71882fg_read8(data,
1251						F71882FG_REG_TEMP_HYST(1));
1252		}
1253		/* All but the f71858fg / f8000 have this register */
1254		if ((data->type != f71858fg) && (data->type != f8000)) {
1255			reg  = f71882fg_read8(data, F71882FG_REG_TEMP_TYPE);
1256			data->temp_type[1] = (reg & 0x02) ? 2 : 4;
1257			data->temp_type[2] = (reg & 0x04) ? 2 : 4;
1258			data->temp_type[3] = (reg & 0x08) ? 2 : 4;
1259		}
1260
1261		if (f71882fg_fan_has_beep[data->type])
1262			data->fan_beep = f71882fg_read8(data,
1263						F71882FG_REG_FAN_BEEP);
1264
1265		if (f71882fg_temp_has_beep[data->type])
1266			data->temp_beep = f71882fg_read8(data,
1267						F71882FG_REG_TEMP_BEEP);
1268
1269		data->pwm_enable = f71882fg_read8(data,
1270						  F71882FG_REG_PWM_ENABLE);
1271		data->pwm_auto_point_hyst[0] =
1272			f71882fg_read8(data, F71882FG_REG_FAN_HYST(0));
1273		data->pwm_auto_point_hyst[1] =
1274			f71882fg_read8(data, F71882FG_REG_FAN_HYST(1));
1275
1276		for (nr = 0; nr < nr_fans; nr++) {
1277			data->pwm_auto_point_mapping[nr] =
1278			    f71882fg_read8(data,
1279					   F71882FG_REG_POINT_MAPPING(nr));
1280
1281			switch (data->type) {
1282			default:
1283				for (point = 0; point < 5; point++) {
1284					data->pwm_auto_point_pwm[nr][point] =
1285						f71882fg_read8(data,
1286							F71882FG_REG_POINT_PWM
1287							(nr, point));
1288				}
1289				for (point = 0; point < 4; point++) {
1290					data->pwm_auto_point_temp[nr][point] =
1291						f71882fg_read8(data,
1292							F71882FG_REG_POINT_TEMP
1293							(nr, point));
1294				}
1295				break;
1296			case f71808e:
1297			case f71869:
1298				data->pwm_auto_point_pwm[nr][0] =
1299					f71882fg_read8(data,
1300						F71882FG_REG_POINT_PWM(nr, 0));
1301				/* Fall through */
1302			case f71862fg:
1303				data->pwm_auto_point_pwm[nr][1] =
1304					f71882fg_read8(data,
1305						F71882FG_REG_POINT_PWM
1306						(nr, 1));
1307				data->pwm_auto_point_pwm[nr][4] =
1308					f71882fg_read8(data,
1309						F71882FG_REG_POINT_PWM
1310						(nr, 4));
1311				data->pwm_auto_point_temp[nr][0] =
1312					f71882fg_read8(data,
1313						F71882FG_REG_POINT_TEMP
1314						(nr, 0));
1315				data->pwm_auto_point_temp[nr][3] =
1316					f71882fg_read8(data,
1317						F71882FG_REG_POINT_TEMP
1318						(nr, 3));
1319				break;
1320			}
1321		}
1322		data->last_limits = jiffies;
1323	}
1324
1325	/* Update every second */
1326	if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
1327		data->temp_status = f71882fg_read8(data,
1328						F71882FG_REG_TEMP_STATUS);
1329		data->temp_diode_open = f71882fg_read8(data,
1330						F71882FG_REG_TEMP_DIODE_OPEN);
1331		for (nr = data->temp_start; nr < nr_temps + data->temp_start;
1332									nr++)
1333			data->temp[nr] = f71882fg_read_temp(data, nr);
1334
1335		data->fan_status = f71882fg_read8(data,
1336						F71882FG_REG_FAN_STATUS);
1337		for (nr = 0; nr < nr_fans; nr++) {
1338			data->fan[nr] = f71882fg_read16(data,
1339						F71882FG_REG_FAN(nr));
1340			data->fan_target[nr] =
1341			    f71882fg_read16(data, F71882FG_REG_FAN_TARGET(nr));
1342			data->fan_full_speed[nr] =
1343			    f71882fg_read16(data,
1344					    F71882FG_REG_FAN_FULL_SPEED(nr));
1345			data->pwm[nr] =
1346			    f71882fg_read8(data, F71882FG_REG_PWM(nr));
1347		}
1348		/* Some models have 1 more fan with limited capabilities */
1349		if (data->type == f71808a) {
1350			data->fan[2] = f71882fg_read16(data,
1351						F71882FG_REG_FAN(2));
1352			data->pwm[2] = f71882fg_read8(data,
1353							F71882FG_REG_PWM(2));
1354		}
1355		if (data->type == f8000)
1356			data->fan[3] = f71882fg_read16(data,
1357						F71882FG_REG_FAN(3));
1358
1359		if (f71882fg_has_in1_alarm[data->type]) {
1360			if (data->type == f81866a)
1361				data->in_status = f71882fg_read8(data,
1362						F81866_REG_IN_STATUS);
1363
1364			else
1365				data->in_status = f71882fg_read8(data,
1366						F71882FG_REG_IN_STATUS);
1367		}
1368
1369		for (nr = 0; nr < F71882FG_MAX_INS; nr++)
1370			if (f71882fg_has_in[data->type][nr])
1371				data->in[nr] = f71882fg_read8(data,
1372							F71882FG_REG_IN(nr));
1373
1374		data->last_updated = jiffies;
1375		data->valid = 1;
1376	}
1377
1378	mutex_unlock(&data->update_lock);
1379
1380	return data;
1381}
1382
1383/* Sysfs Interface */
1384static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
1385	char *buf)
1386{
1387	struct f71882fg_data *data = f71882fg_update_device(dev);
1388	int nr = to_sensor_dev_attr_2(devattr)->index;
1389	int speed = fan_from_reg(data->fan[nr]);
1390
1391	if (speed == FAN_MIN_DETECT)
1392		speed = 0;
1393
1394	return sprintf(buf, "%d\n", speed);
1395}
1396
1397static ssize_t show_fan_full_speed(struct device *dev,
1398				   struct device_attribute *devattr, char *buf)
1399{
1400	struct f71882fg_data *data = f71882fg_update_device(dev);
1401	int nr = to_sensor_dev_attr_2(devattr)->index;
1402	int speed = fan_from_reg(data->fan_full_speed[nr]);
1403	return sprintf(buf, "%d\n", speed);
1404}
1405
1406static ssize_t store_fan_full_speed(struct device *dev,
1407				    struct device_attribute *devattr,
1408				    const char *buf, size_t count)
1409{
1410	struct f71882fg_data *data = dev_get_drvdata(dev);
1411	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1412	long val;
1413
1414	err = kstrtol(buf, 10, &val);
1415	if (err)
1416		return err;
1417
1418	val = clamp_val(val, 23, 1500000);
1419	val = fan_to_reg(val);
1420
1421	mutex_lock(&data->update_lock);
1422	f71882fg_write16(data, F71882FG_REG_FAN_FULL_SPEED(nr), val);
1423	data->fan_full_speed[nr] = val;
1424	mutex_unlock(&data->update_lock);
1425
1426	return count;
1427}
1428
1429static ssize_t show_fan_beep(struct device *dev, struct device_attribute
1430	*devattr, char *buf)
1431{
1432	struct f71882fg_data *data = f71882fg_update_device(dev);
1433	int nr = to_sensor_dev_attr_2(devattr)->index;
1434
1435	if (data->fan_beep & (1 << nr))
1436		return sprintf(buf, "1\n");
1437	else
1438		return sprintf(buf, "0\n");
1439}
1440
1441static ssize_t store_fan_beep(struct device *dev, struct device_attribute
1442	*devattr, const char *buf, size_t count)
1443{
1444	struct f71882fg_data *data = dev_get_drvdata(dev);
1445	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1446	unsigned long val;
1447
1448	err = kstrtoul(buf, 10, &val);
1449	if (err)
1450		return err;
1451
1452	mutex_lock(&data->update_lock);
1453	data->fan_beep = f71882fg_read8(data, F71882FG_REG_FAN_BEEP);
1454	if (val)
1455		data->fan_beep |= 1 << nr;
1456	else
1457		data->fan_beep &= ~(1 << nr);
1458
1459	f71882fg_write8(data, F71882FG_REG_FAN_BEEP, data->fan_beep);
1460	mutex_unlock(&data->update_lock);
1461
1462	return count;
1463}
1464
1465static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
1466	*devattr, char *buf)
1467{
1468	struct f71882fg_data *data = f71882fg_update_device(dev);
1469	int nr = to_sensor_dev_attr_2(devattr)->index;
1470
1471	if (data->fan_status & (1 << nr))
1472		return sprintf(buf, "1\n");
1473	else
1474		return sprintf(buf, "0\n");
1475}
1476
1477static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
1478	char *buf)
1479{
1480	struct f71882fg_data *data = f71882fg_update_device(dev);
1481	int nr = to_sensor_dev_attr_2(devattr)->index;
1482
1483	return sprintf(buf, "%d\n", data->in[nr] * 8);
1484}
1485
1486static ssize_t show_in_max(struct device *dev, struct device_attribute
1487	*devattr, char *buf)
1488{
1489	struct f71882fg_data *data = f71882fg_update_device(dev);
1490
1491	return sprintf(buf, "%d\n", data->in1_max * 8);
1492}
1493
1494static ssize_t store_in_max(struct device *dev, struct device_attribute
1495	*devattr, const char *buf, size_t count)
1496{
1497	struct f71882fg_data *data = dev_get_drvdata(dev);
1498	int err;
1499	long val;
1500
1501	err = kstrtol(buf, 10, &val);
1502	if (err)
1503		return err;
1504
1505	val /= 8;
1506	val = clamp_val(val, 0, 255);
1507
1508	mutex_lock(&data->update_lock);
1509	if (data->type == f81866a)
1510		f71882fg_write8(data, F81866_REG_IN1_HIGH, val);
1511	else
1512		f71882fg_write8(data, F71882FG_REG_IN1_HIGH, val);
1513	data->in1_max = val;
1514	mutex_unlock(&data->update_lock);
1515
1516	return count;
1517}
1518
1519static ssize_t show_in_beep(struct device *dev, struct device_attribute
1520	*devattr, char *buf)
1521{
1522	struct f71882fg_data *data = f71882fg_update_device(dev);
1523	int nr = to_sensor_dev_attr_2(devattr)->index;
1524
1525	if (data->in_beep & (1 << nr))
1526		return sprintf(buf, "1\n");
1527	else
1528		return sprintf(buf, "0\n");
1529}
1530
1531static ssize_t store_in_beep(struct device *dev, struct device_attribute
1532	*devattr, const char *buf, size_t count)
1533{
1534	struct f71882fg_data *data = dev_get_drvdata(dev);
1535	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1536	unsigned long val;
1537
1538	err = kstrtoul(buf, 10, &val);
1539	if (err)
1540		return err;
1541
1542	mutex_lock(&data->update_lock);
1543	if (data->type == f81866a)
1544		data->in_beep = f71882fg_read8(data, F81866_REG_IN_BEEP);
1545	else
1546		data->in_beep = f71882fg_read8(data, F71882FG_REG_IN_BEEP);
1547
1548	if (val)
1549		data->in_beep |= 1 << nr;
1550	else
1551		data->in_beep &= ~(1 << nr);
1552
1553	if (data->type == f81866a)
1554		f71882fg_write8(data, F81866_REG_IN_BEEP, data->in_beep);
1555	else
1556		f71882fg_write8(data, F71882FG_REG_IN_BEEP, data->in_beep);
1557	mutex_unlock(&data->update_lock);
1558
1559	return count;
1560}
1561
1562static ssize_t show_in_alarm(struct device *dev, struct device_attribute
1563	*devattr, char *buf)
1564{
1565	struct f71882fg_data *data = f71882fg_update_device(dev);
1566	int nr = to_sensor_dev_attr_2(devattr)->index;
1567
1568	if (data->in_status & (1 << nr))
1569		return sprintf(buf, "1\n");
1570	else
1571		return sprintf(buf, "0\n");
1572}
1573
1574static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
1575	char *buf)
1576{
1577	struct f71882fg_data *data = f71882fg_update_device(dev);
1578	int nr = to_sensor_dev_attr_2(devattr)->index;
1579	int sign, temp;
1580
1581	if (data->type == f71858fg) {
1582		/* TEMP_TABLE_SEL 1 or 3 ? */
1583		if (data->temp_config & 1) {
1584			sign = data->temp[nr] & 0x0001;
1585			temp = (data->temp[nr] >> 5) & 0x7ff;
1586		} else {
1587			sign = data->temp[nr] & 0x8000;
1588			temp = (data->temp[nr] >> 5) & 0x3ff;
1589		}
1590		temp *= 125;
1591		if (sign)
1592			temp -= 128000;
1593	} else
1594		temp = data->temp[nr] * 1000;
1595
1596	return sprintf(buf, "%d\n", temp);
1597}
1598
1599static ssize_t show_temp_max(struct device *dev, struct device_attribute
1600	*devattr, char *buf)
1601{
1602	struct f71882fg_data *data = f71882fg_update_device(dev);
1603	int nr = to_sensor_dev_attr_2(devattr)->index;
1604
1605	return sprintf(buf, "%d\n", data->temp_high[nr] * 1000);
1606}
1607
1608static ssize_t store_temp_max(struct device *dev, struct device_attribute
1609	*devattr, const char *buf, size_t count)
1610{
1611	struct f71882fg_data *data = dev_get_drvdata(dev);
1612	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1613	long val;
1614
1615	err = kstrtol(buf, 10, &val);
1616	if (err)
1617		return err;
1618
1619	val /= 1000;
1620	val = clamp_val(val, 0, 255);
1621
1622	mutex_lock(&data->update_lock);
1623	f71882fg_write8(data, F71882FG_REG_TEMP_HIGH(nr), val);
1624	data->temp_high[nr] = val;
1625	mutex_unlock(&data->update_lock);
1626
1627	return count;
1628}
1629
1630static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute
1631	*devattr, char *buf)
1632{
1633	struct f71882fg_data *data = f71882fg_update_device(dev);
1634	int nr = to_sensor_dev_attr_2(devattr)->index;
1635	int temp_max_hyst;
1636
1637	mutex_lock(&data->update_lock);
1638	if (nr & 1)
1639		temp_max_hyst = data->temp_hyst[nr / 2] >> 4;
1640	else
1641		temp_max_hyst = data->temp_hyst[nr / 2] & 0x0f;
1642	temp_max_hyst = (data->temp_high[nr] - temp_max_hyst) * 1000;
1643	mutex_unlock(&data->update_lock);
1644
1645	return sprintf(buf, "%d\n", temp_max_hyst);
1646}
1647
1648static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute
1649	*devattr, const char *buf, size_t count)
1650{
1651	struct f71882fg_data *data = dev_get_drvdata(dev);
1652	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1653	ssize_t ret = count;
1654	u8 reg;
1655	long val;
1656
1657	err = kstrtol(buf, 10, &val);
1658	if (err)
1659		return err;
1660
1661	val /= 1000;
1662
1663	mutex_lock(&data->update_lock);
1664
1665	/* convert abs to relative and check */
1666	data->temp_high[nr] = f71882fg_read8(data, F71882FG_REG_TEMP_HIGH(nr));
1667	val = clamp_val(val, data->temp_high[nr] - 15, data->temp_high[nr]);
 
1668	val = data->temp_high[nr] - val;
1669
1670	/* convert value to register contents */
1671	reg = f71882fg_read8(data, F71882FG_REG_TEMP_HYST(nr / 2));
1672	if (nr & 1)
1673		reg = (reg & 0x0f) | (val << 4);
1674	else
1675		reg = (reg & 0xf0) | val;
1676	f71882fg_write8(data, F71882FG_REG_TEMP_HYST(nr / 2), reg);
1677	data->temp_hyst[nr / 2] = reg;
1678
1679	mutex_unlock(&data->update_lock);
1680	return ret;
1681}
1682
1683static ssize_t show_temp_crit(struct device *dev, struct device_attribute
1684	*devattr, char *buf)
1685{
1686	struct f71882fg_data *data = f71882fg_update_device(dev);
1687	int nr = to_sensor_dev_attr_2(devattr)->index;
1688
1689	return sprintf(buf, "%d\n", data->temp_ovt[nr] * 1000);
1690}
1691
1692static ssize_t store_temp_crit(struct device *dev, struct device_attribute
1693	*devattr, const char *buf, size_t count)
1694{
1695	struct f71882fg_data *data = dev_get_drvdata(dev);
1696	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1697	long val;
1698
1699	err = kstrtol(buf, 10, &val);
1700	if (err)
1701		return err;
1702
1703	val /= 1000;
1704	val = clamp_val(val, 0, 255);
1705
1706	mutex_lock(&data->update_lock);
1707	f71882fg_write8(data, F71882FG_REG_TEMP_OVT(nr), val);
1708	data->temp_ovt[nr] = val;
1709	mutex_unlock(&data->update_lock);
1710
1711	return count;
1712}
1713
1714static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute
1715	*devattr, char *buf)
1716{
1717	struct f71882fg_data *data = f71882fg_update_device(dev);
1718	int nr = to_sensor_dev_attr_2(devattr)->index;
1719	int temp_crit_hyst;
1720
1721	mutex_lock(&data->update_lock);
1722	if (nr & 1)
1723		temp_crit_hyst = data->temp_hyst[nr / 2] >> 4;
1724	else
1725		temp_crit_hyst = data->temp_hyst[nr / 2] & 0x0f;
1726	temp_crit_hyst = (data->temp_ovt[nr] - temp_crit_hyst) * 1000;
1727	mutex_unlock(&data->update_lock);
1728
1729	return sprintf(buf, "%d\n", temp_crit_hyst);
1730}
1731
1732static ssize_t show_temp_type(struct device *dev, struct device_attribute
1733	*devattr, char *buf)
1734{
1735	struct f71882fg_data *data = f71882fg_update_device(dev);
1736	int nr = to_sensor_dev_attr_2(devattr)->index;
1737
1738	return sprintf(buf, "%d\n", data->temp_type[nr]);
1739}
1740
1741static ssize_t show_temp_beep(struct device *dev, struct device_attribute
1742	*devattr, char *buf)
1743{
1744	struct f71882fg_data *data = f71882fg_update_device(dev);
1745	int nr = to_sensor_dev_attr_2(devattr)->index;
1746
1747	if (data->temp_beep & (1 << nr))
1748		return sprintf(buf, "1\n");
1749	else
1750		return sprintf(buf, "0\n");
1751}
1752
1753static ssize_t store_temp_beep(struct device *dev, struct device_attribute
1754	*devattr, const char *buf, size_t count)
1755{
1756	struct f71882fg_data *data = dev_get_drvdata(dev);
1757	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1758	unsigned long val;
1759
1760	err = kstrtoul(buf, 10, &val);
1761	if (err)
1762		return err;
1763
1764	mutex_lock(&data->update_lock);
1765	data->temp_beep = f71882fg_read8(data, F71882FG_REG_TEMP_BEEP);
1766	if (val)
1767		data->temp_beep |= 1 << nr;
1768	else
1769		data->temp_beep &= ~(1 << nr);
1770
1771	f71882fg_write8(data, F71882FG_REG_TEMP_BEEP, data->temp_beep);
1772	mutex_unlock(&data->update_lock);
1773
1774	return count;
1775}
1776
1777static ssize_t show_temp_alarm(struct device *dev, struct device_attribute
1778	*devattr, char *buf)
1779{
1780	struct f71882fg_data *data = f71882fg_update_device(dev);
1781	int nr = to_sensor_dev_attr_2(devattr)->index;
1782
1783	if (data->temp_status & (1 << nr))
1784		return sprintf(buf, "1\n");
1785	else
1786		return sprintf(buf, "0\n");
1787}
1788
1789static ssize_t show_temp_fault(struct device *dev, struct device_attribute
1790	*devattr, char *buf)
1791{
1792	struct f71882fg_data *data = f71882fg_update_device(dev);
1793	int nr = to_sensor_dev_attr_2(devattr)->index;
1794
1795	if (data->temp_diode_open & (1 << nr))
1796		return sprintf(buf, "1\n");
1797	else
1798		return sprintf(buf, "0\n");
1799}
1800
1801static ssize_t show_pwm(struct device *dev,
1802			struct device_attribute *devattr, char *buf)
1803{
1804	struct f71882fg_data *data = f71882fg_update_device(dev);
1805	int val, nr = to_sensor_dev_attr_2(devattr)->index;
1806	mutex_lock(&data->update_lock);
1807	if (data->pwm_enable & (1 << (2 * nr)))
1808		/* PWM mode */
1809		val = data->pwm[nr];
1810	else {
1811		/* RPM mode */
1812		val = 255 * fan_from_reg(data->fan_target[nr])
1813			/ fan_from_reg(data->fan_full_speed[nr]);
1814	}
1815	mutex_unlock(&data->update_lock);
1816	return sprintf(buf, "%d\n", val);
1817}
1818
1819static ssize_t store_pwm(struct device *dev,
1820			 struct device_attribute *devattr, const char *buf,
1821			 size_t count)
1822{
1823	struct f71882fg_data *data = dev_get_drvdata(dev);
1824	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1825	long val;
1826
1827	err = kstrtol(buf, 10, &val);
1828	if (err)
1829		return err;
1830
1831	val = clamp_val(val, 0, 255);
1832
1833	mutex_lock(&data->update_lock);
1834	data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1835	if ((data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 3) != 2) ||
1836	    (data->type != f8000 && !((data->pwm_enable >> 2 * nr) & 2))) {
1837		count = -EROFS;
1838		goto leave;
1839	}
1840	if (data->pwm_enable & (1 << (2 * nr))) {
1841		/* PWM mode */
1842		f71882fg_write8(data, F71882FG_REG_PWM(nr), val);
1843		data->pwm[nr] = val;
1844	} else {
1845		/* RPM mode */
1846		int target, full_speed;
1847		full_speed = f71882fg_read16(data,
1848					     F71882FG_REG_FAN_FULL_SPEED(nr));
1849		target = fan_to_reg(val * fan_from_reg(full_speed) / 255);
1850		f71882fg_write16(data, F71882FG_REG_FAN_TARGET(nr), target);
1851		data->fan_target[nr] = target;
1852		data->fan_full_speed[nr] = full_speed;
1853	}
1854leave:
1855	mutex_unlock(&data->update_lock);
1856
1857	return count;
1858}
1859
1860static ssize_t show_simple_pwm(struct device *dev,
1861			       struct device_attribute *devattr, char *buf)
1862{
1863	struct f71882fg_data *data = f71882fg_update_device(dev);
1864	int val, nr = to_sensor_dev_attr_2(devattr)->index;
1865
1866	val = data->pwm[nr];
1867	return sprintf(buf, "%d\n", val);
1868}
1869
1870static ssize_t store_simple_pwm(struct device *dev,
1871				struct device_attribute *devattr,
1872				const char *buf, size_t count)
1873{
1874	struct f71882fg_data *data = dev_get_drvdata(dev);
1875	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1876	long val;
1877
1878	err = kstrtol(buf, 10, &val);
1879	if (err)
1880		return err;
1881
1882	val = clamp_val(val, 0, 255);
1883
1884	mutex_lock(&data->update_lock);
1885	f71882fg_write8(data, F71882FG_REG_PWM(nr), val);
1886	data->pwm[nr] = val;
1887	mutex_unlock(&data->update_lock);
1888
1889	return count;
1890}
1891
1892static ssize_t show_pwm_enable(struct device *dev,
1893			       struct device_attribute *devattr, char *buf)
1894{
1895	int result = 0;
1896	struct f71882fg_data *data = f71882fg_update_device(dev);
1897	int nr = to_sensor_dev_attr_2(devattr)->index;
1898
1899	switch ((data->pwm_enable >> 2 * nr) & 3) {
1900	case 0:
1901	case 1:
1902		result = 2; /* Normal auto mode */
1903		break;
1904	case 2:
1905		result = 1; /* Manual mode */
1906		break;
1907	case 3:
1908		if (data->type == f8000)
1909			result = 3; /* Thermostat mode */
1910		else
1911			result = 1; /* Manual mode */
1912		break;
1913	}
1914
1915	return sprintf(buf, "%d\n", result);
1916}
1917
1918static ssize_t store_pwm_enable(struct device *dev, struct device_attribute
1919				*devattr, const char *buf, size_t count)
1920{
1921	struct f71882fg_data *data = dev_get_drvdata(dev);
1922	int err, nr = to_sensor_dev_attr_2(devattr)->index;
1923	long val;
1924
1925	err = kstrtol(buf, 10, &val);
1926	if (err)
1927		return err;
1928
1929	/* Special case for F8000 pwm channel 3 which only does auto mode */
1930	if (data->type == f8000 && nr == 2 && val != 2)
1931		return -EINVAL;
1932
1933	mutex_lock(&data->update_lock);
1934	data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1935	/* Special case for F8000 auto PWM mode / Thermostat mode */
1936	if (data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 1)) {
1937		switch (val) {
1938		case 2:
1939			data->pwm_enable &= ~(2 << (2 * nr));
1940			break;		/* Normal auto mode */
1941		case 3:
1942			data->pwm_enable |= 2 << (2 * nr);
1943			break;		/* Thermostat mode */
1944		default:
1945			count = -EINVAL;
1946			goto leave;
1947		}
1948	} else {
1949		switch (val) {
1950		case 1:
1951			/* The f71858fg does not support manual RPM mode */
1952			if (data->type == f71858fg &&
1953			    ((data->pwm_enable >> (2 * nr)) & 1)) {
1954				count = -EINVAL;
1955				goto leave;
1956			}
1957			data->pwm_enable |= 2 << (2 * nr);
1958			break;		/* Manual */
1959		case 2:
1960			data->pwm_enable &= ~(2 << (2 * nr));
1961			break;		/* Normal auto mode */
1962		default:
1963			count = -EINVAL;
1964			goto leave;
1965		}
1966	}
1967	f71882fg_write8(data, F71882FG_REG_PWM_ENABLE, data->pwm_enable);
1968leave:
1969	mutex_unlock(&data->update_lock);
1970
1971	return count;
1972}
1973
1974static ssize_t show_pwm_auto_point_pwm(struct device *dev,
1975				       struct device_attribute *devattr,
1976				       char *buf)
1977{
1978	int result;
1979	struct f71882fg_data *data = f71882fg_update_device(dev);
1980	int pwm = to_sensor_dev_attr_2(devattr)->index;
1981	int point = to_sensor_dev_attr_2(devattr)->nr;
1982
1983	mutex_lock(&data->update_lock);
1984	if (data->pwm_enable & (1 << (2 * pwm))) {
1985		/* PWM mode */
1986		result = data->pwm_auto_point_pwm[pwm][point];
1987	} else {
1988		/* RPM mode */
1989		result = 32 * 255 / (32 + data->pwm_auto_point_pwm[pwm][point]);
1990	}
1991	mutex_unlock(&data->update_lock);
1992
1993	return sprintf(buf, "%d\n", result);
1994}
1995
1996static ssize_t store_pwm_auto_point_pwm(struct device *dev,
1997					struct device_attribute *devattr,
1998					const char *buf, size_t count)
1999{
2000	struct f71882fg_data *data = dev_get_drvdata(dev);
2001	int err, pwm = to_sensor_dev_attr_2(devattr)->index;
2002	int point = to_sensor_dev_attr_2(devattr)->nr;
2003	long val;
2004
2005	err = kstrtol(buf, 10, &val);
2006	if (err)
2007		return err;
2008
2009	val = clamp_val(val, 0, 255);
2010
2011	mutex_lock(&data->update_lock);
2012	data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
2013	if (data->pwm_enable & (1 << (2 * pwm))) {
2014		/* PWM mode */
2015	} else {
2016		/* RPM mode */
2017		if (val < 29)	/* Prevent negative numbers */
2018			val = 255;
2019		else
2020			val = (255 - val) * 32 / val;
2021	}
2022	f71882fg_write8(data, F71882FG_REG_POINT_PWM(pwm, point), val);
2023	data->pwm_auto_point_pwm[pwm][point] = val;
2024	mutex_unlock(&data->update_lock);
2025
2026	return count;
2027}
2028
2029static ssize_t show_pwm_auto_point_temp_hyst(struct device *dev,
2030					     struct device_attribute *devattr,
2031					     char *buf)
2032{
2033	int result = 0;
2034	struct f71882fg_data *data = f71882fg_update_device(dev);
2035	int nr = to_sensor_dev_attr_2(devattr)->index;
2036	int point = to_sensor_dev_attr_2(devattr)->nr;
2037
2038	mutex_lock(&data->update_lock);
2039	if (nr & 1)
2040		result = data->pwm_auto_point_hyst[nr / 2] >> 4;
2041	else
2042		result = data->pwm_auto_point_hyst[nr / 2] & 0x0f;
2043	result = 1000 * (data->pwm_auto_point_temp[nr][point] - result);
2044	mutex_unlock(&data->update_lock);
2045
2046	return sprintf(buf, "%d\n", result);
2047}
2048
2049static ssize_t store_pwm_auto_point_temp_hyst(struct device *dev,
2050					      struct device_attribute *devattr,
2051					      const char *buf, size_t count)
2052{
2053	struct f71882fg_data *data = dev_get_drvdata(dev);
2054	int err, nr = to_sensor_dev_attr_2(devattr)->index;
2055	int point = to_sensor_dev_attr_2(devattr)->nr;
2056	u8 reg;
2057	long val;
2058
2059	err = kstrtol(buf, 10, &val);
2060	if (err)
2061		return err;
2062
2063	val /= 1000;
2064
2065	mutex_lock(&data->update_lock);
2066	data->pwm_auto_point_temp[nr][point] =
2067		f71882fg_read8(data, F71882FG_REG_POINT_TEMP(nr, point));
2068	val = clamp_val(val, data->pwm_auto_point_temp[nr][point] - 15,
2069			data->pwm_auto_point_temp[nr][point]);
2070	val = data->pwm_auto_point_temp[nr][point] - val;
2071
2072	reg = f71882fg_read8(data, F71882FG_REG_FAN_HYST(nr / 2));
2073	if (nr & 1)
2074		reg = (reg & 0x0f) | (val << 4);
2075	else
2076		reg = (reg & 0xf0) | val;
2077
2078	f71882fg_write8(data, F71882FG_REG_FAN_HYST(nr / 2), reg);
2079	data->pwm_auto_point_hyst[nr / 2] = reg;
2080	mutex_unlock(&data->update_lock);
2081
2082	return count;
2083}
2084
2085static ssize_t show_pwm_interpolate(struct device *dev,
2086				    struct device_attribute *devattr, char *buf)
2087{
2088	int result;
2089	struct f71882fg_data *data = f71882fg_update_device(dev);
2090	int nr = to_sensor_dev_attr_2(devattr)->index;
2091
2092	result = (data->pwm_auto_point_mapping[nr] >> 4) & 1;
2093
2094	return sprintf(buf, "%d\n", result);
2095}
2096
2097static ssize_t store_pwm_interpolate(struct device *dev,
2098				     struct device_attribute *devattr,
2099				     const char *buf, size_t count)
2100{
2101	struct f71882fg_data *data = dev_get_drvdata(dev);
2102	int err, nr = to_sensor_dev_attr_2(devattr)->index;
2103	unsigned long val;
2104
2105	err = kstrtoul(buf, 10, &val);
2106	if (err)
2107		return err;
2108
2109	mutex_lock(&data->update_lock);
2110	data->pwm_auto_point_mapping[nr] =
2111		f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr));
2112	if (val)
2113		val = data->pwm_auto_point_mapping[nr] | (1 << 4);
2114	else
2115		val = data->pwm_auto_point_mapping[nr] & (~(1 << 4));
2116	f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val);
2117	data->pwm_auto_point_mapping[nr] = val;
2118	mutex_unlock(&data->update_lock);
2119
2120	return count;
2121}
2122
2123static ssize_t show_pwm_auto_point_channel(struct device *dev,
2124					   struct device_attribute *devattr,
2125					   char *buf)
2126{
2127	int result;
2128	struct f71882fg_data *data = f71882fg_update_device(dev);
2129	int nr = to_sensor_dev_attr_2(devattr)->index;
2130
2131	result = 1 << ((data->pwm_auto_point_mapping[nr] & 3) -
2132		       data->temp_start);
2133
2134	return sprintf(buf, "%d\n", result);
2135}
2136
2137static ssize_t store_pwm_auto_point_channel(struct device *dev,
2138					    struct device_attribute *devattr,
2139					    const char *buf, size_t count)
2140{
2141	struct f71882fg_data *data = dev_get_drvdata(dev);
2142	int err, nr = to_sensor_dev_attr_2(devattr)->index;
2143	long val;
2144
2145	err = kstrtol(buf, 10, &val);
2146	if (err)
2147		return err;
2148
2149	switch (val) {
2150	case 1:
2151		val = 0;
2152		break;
2153	case 2:
2154		val = 1;
2155		break;
2156	case 4:
2157		val = 2;
2158		break;
2159	default:
2160		return -EINVAL;
2161	}
2162	val += data->temp_start;
2163	mutex_lock(&data->update_lock);
2164	data->pwm_auto_point_mapping[nr] =
2165		f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr));
2166	val = (data->pwm_auto_point_mapping[nr] & 0xfc) | val;
2167	f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val);
2168	data->pwm_auto_point_mapping[nr] = val;
2169	mutex_unlock(&data->update_lock);
2170
2171	return count;
2172}
2173
2174static ssize_t show_pwm_auto_point_temp(struct device *dev,
2175					struct device_attribute *devattr,
2176					char *buf)
2177{
2178	int result;
2179	struct f71882fg_data *data = f71882fg_update_device(dev);
2180	int pwm = to_sensor_dev_attr_2(devattr)->index;
2181	int point = to_sensor_dev_attr_2(devattr)->nr;
2182
2183	result = data->pwm_auto_point_temp[pwm][point];
2184	return sprintf(buf, "%d\n", 1000 * result);
2185}
2186
2187static ssize_t store_pwm_auto_point_temp(struct device *dev,
2188					 struct device_attribute *devattr,
2189					 const char *buf, size_t count)
2190{
2191	struct f71882fg_data *data = dev_get_drvdata(dev);
2192	int err, pwm = to_sensor_dev_attr_2(devattr)->index;
2193	int point = to_sensor_dev_attr_2(devattr)->nr;
2194	long val;
2195
2196	err = kstrtol(buf, 10, &val);
2197	if (err)
2198		return err;
2199
2200	val /= 1000;
2201
2202	if (data->auto_point_temp_signed)
2203		val = clamp_val(val, -128, 127);
2204	else
2205		val = clamp_val(val, 0, 127);
2206
2207	mutex_lock(&data->update_lock);
2208	f71882fg_write8(data, F71882FG_REG_POINT_TEMP(pwm, point), val);
2209	data->pwm_auto_point_temp[pwm][point] = val;
2210	mutex_unlock(&data->update_lock);
2211
2212	return count;
2213}
2214
2215static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
2216	char *buf)
2217{
2218	struct f71882fg_data *data = dev_get_drvdata(dev);
2219	return sprintf(buf, "%s\n", f71882fg_names[data->type]);
2220}
2221
2222static int f71882fg_create_sysfs_files(struct platform_device *pdev,
2223	struct sensor_device_attribute_2 *attr, int count)
2224{
2225	int err, i;
2226
2227	for (i = 0; i < count; i++) {
2228		err = device_create_file(&pdev->dev, &attr[i].dev_attr);
2229		if (err)
2230			return err;
2231	}
2232	return 0;
2233}
2234
2235static void f71882fg_remove_sysfs_files(struct platform_device *pdev,
2236	struct sensor_device_attribute_2 *attr, int count)
2237{
2238	int i;
2239
2240	for (i = 0; i < count; i++)
2241		device_remove_file(&pdev->dev, &attr[i].dev_attr);
2242}
2243
2244static int f71882fg_create_fan_sysfs_files(
2245	struct platform_device *pdev, int idx)
2246{
2247	struct f71882fg_data *data = platform_get_drvdata(pdev);
2248	int err;
2249
2250	/* Sanity check the pwm setting */
2251	err = 0;
2252	switch (data->type) {
2253	case f71858fg:
2254		if (((data->pwm_enable >> (idx * 2)) & 3) == 3)
2255			err = 1;
2256		break;
2257	case f71862fg:
2258		if (((data->pwm_enable >> (idx * 2)) & 1) != 1)
2259			err = 1;
2260		break;
2261	case f8000:
2262		if (idx == 2)
2263			err = data->pwm_enable & 0x20;
2264		break;
2265	default:
2266		break;
2267	}
2268	if (err) {
2269		dev_err(&pdev->dev,
2270			"Invalid (reserved) pwm settings: 0x%02x, "
2271			"skipping fan %d\n",
2272			(data->pwm_enable >> (idx * 2)) & 3, idx + 1);
2273		return 0; /* This is a non fatal condition */
2274	}
2275
2276	err = f71882fg_create_sysfs_files(pdev, &fxxxx_fan_attr[idx][0],
2277					  ARRAY_SIZE(fxxxx_fan_attr[0]));
2278	if (err)
2279		return err;
2280
2281	if (f71882fg_fan_has_beep[data->type]) {
2282		err = f71882fg_create_sysfs_files(pdev,
2283						  &fxxxx_fan_beep_attr[idx],
2284						  1);
2285		if (err)
2286			return err;
2287	}
2288
2289	dev_info(&pdev->dev, "Fan: %d is in %s mode\n", idx + 1,
2290		 (data->pwm_enable & (1 << (2 * idx))) ? "duty-cycle" : "RPM");
2291
2292	/* Check for unsupported auto pwm settings */
2293	switch (data->type) {
2294	case f71808e:
2295	case f71808a:
2296	case f71869:
2297	case f71869a:
2298	case f71889fg:
2299	case f71889ed:
2300	case f71889a:
2301		data->pwm_auto_point_mapping[idx] =
2302			f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(idx));
2303		if ((data->pwm_auto_point_mapping[idx] & 0x80) ||
2304		    (data->pwm_auto_point_mapping[idx] & 3) == 0) {
2305			dev_warn(&pdev->dev,
2306				 "Auto pwm controlled by raw digital "
2307				 "data, disabling pwm auto_point "
2308				 "sysfs attributes for fan %d\n", idx + 1);
2309			return 0; /* This is a non fatal condition */
2310		}
2311		break;
2312	default:
2313		break;
2314	}
2315
2316	switch (data->type) {
2317	case f71862fg:
2318		err = f71882fg_create_sysfs_files(pdev,
2319					&f71862fg_auto_pwm_attr[idx][0],
2320					ARRAY_SIZE(f71862fg_auto_pwm_attr[0]));
2321		break;
2322	case f71808e:
2323	case f71869:
2324		err = f71882fg_create_sysfs_files(pdev,
2325					&f71869_auto_pwm_attr[idx][0],
2326					ARRAY_SIZE(f71869_auto_pwm_attr[0]));
2327		break;
2328	case f8000:
2329		err = f71882fg_create_sysfs_files(pdev,
2330					&f8000_auto_pwm_attr[idx][0],
2331					ARRAY_SIZE(f8000_auto_pwm_attr[0]));
2332		break;
2333	default:
2334		err = f71882fg_create_sysfs_files(pdev,
2335					&fxxxx_auto_pwm_attr[idx][0],
2336					ARRAY_SIZE(fxxxx_auto_pwm_attr[0]));
2337	}
2338
2339	return err;
2340}
2341
2342static int f71882fg_probe(struct platform_device *pdev)
2343{
2344	struct f71882fg_data *data;
2345	struct f71882fg_sio_data *sio_data = dev_get_platdata(&pdev->dev);
2346	int nr_fans = f71882fg_nr_fans[sio_data->type];
2347	int nr_temps = f71882fg_nr_temps[sio_data->type];
2348	int err, i;
2349	int size;
2350	u8 start_reg, reg;
2351
2352	data = devm_kzalloc(&pdev->dev, sizeof(struct f71882fg_data),
2353			    GFP_KERNEL);
2354	if (!data)
2355		return -ENOMEM;
2356
2357	data->addr = platform_get_resource(pdev, IORESOURCE_IO, 0)->start;
2358	data->type = sio_data->type;
2359	data->temp_start =
2360	    (data->type == f71858fg || data->type == f8000 ||
2361		data->type == f81866a) ? 0 : 1;
2362	mutex_init(&data->update_lock);
2363	platform_set_drvdata(pdev, data);
2364
2365	start_reg = f71882fg_read8(data, F71882FG_REG_START);
2366	if (start_reg & 0x04) {
2367		dev_warn(&pdev->dev, "Hardware monitor is powered down\n");
2368		return -ENODEV;
 
2369	}
2370	if (!(start_reg & 0x03)) {
2371		dev_warn(&pdev->dev, "Hardware monitoring not activated\n");
2372		return -ENODEV;
 
2373	}
2374
2375	/* Register sysfs interface files */
2376	err = device_create_file(&pdev->dev, &dev_attr_name);
2377	if (err)
2378		goto exit_unregister_sysfs;
2379
2380	if (start_reg & 0x01) {
2381		switch (data->type) {
2382		case f71858fg:
2383			data->temp_config =
2384				f71882fg_read8(data, F71882FG_REG_TEMP_CONFIG);
2385			if (data->temp_config & 0x10)
2386				/*
2387				 * The f71858fg temperature alarms behave as
2388				 * the f8000 alarms in this mode
2389				 */
2390				err = f71882fg_create_sysfs_files(pdev,
2391					f8000_temp_attr,
2392					ARRAY_SIZE(f8000_temp_attr));
2393			else
2394				err = f71882fg_create_sysfs_files(pdev,
2395					f71858fg_temp_attr,
2396					ARRAY_SIZE(f71858fg_temp_attr));
2397			break;
2398		case f8000:
2399			err = f71882fg_create_sysfs_files(pdev,
2400					f8000_temp_attr,
2401					ARRAY_SIZE(f8000_temp_attr));
2402			break;
2403		case f81866a:
2404			err = f71882fg_create_sysfs_files(pdev,
2405					f71858fg_temp_attr,
2406					ARRAY_SIZE(f71858fg_temp_attr));
2407			break;
2408		default:
2409			err = f71882fg_create_sysfs_files(pdev,
2410				&fxxxx_temp_attr[0][0],
2411				ARRAY_SIZE(fxxxx_temp_attr[0]) * nr_temps);
2412		}
2413		if (err)
2414			goto exit_unregister_sysfs;
2415
2416		if (f71882fg_temp_has_beep[data->type]) {
2417			if (data->type == f81866a) {
2418				size = ARRAY_SIZE(f81866_temp_beep_attr[0]);
2419				err = f71882fg_create_sysfs_files(pdev,
2420						&f81866_temp_beep_attr[0][0],
2421						size * nr_temps);
2422
2423			} else {
2424				size = ARRAY_SIZE(fxxxx_temp_beep_attr[0]);
2425				err = f71882fg_create_sysfs_files(pdev,
2426						&fxxxx_temp_beep_attr[0][0],
2427						size * nr_temps);
2428			}
2429			if (err)
2430				goto exit_unregister_sysfs;
2431		}
2432
2433		for (i = 0; i < F71882FG_MAX_INS; i++) {
2434			if (f71882fg_has_in[data->type][i]) {
2435				err = device_create_file(&pdev->dev,
2436						&fxxxx_in_attr[i].dev_attr);
2437				if (err)
2438					goto exit_unregister_sysfs;
2439			}
2440		}
2441		if (f71882fg_has_in1_alarm[data->type]) {
2442			err = f71882fg_create_sysfs_files(pdev,
2443					fxxxx_in1_alarm_attr,
2444					ARRAY_SIZE(fxxxx_in1_alarm_attr));
2445			if (err)
2446				goto exit_unregister_sysfs;
2447		}
2448	}
2449
2450	if (start_reg & 0x02) {
2451		switch (data->type) {
2452		case f71808e:
2453		case f71808a:
2454		case f71869:
2455		case f71869a:
2456			/* These always have signed auto point temps */
2457			data->auto_point_temp_signed = 1;
2458			/* Fall through to select correct fan/pwm reg bank! */
2459		case f71889fg:
2460		case f71889ed:
2461		case f71889a:
2462			reg = f71882fg_read8(data, F71882FG_REG_FAN_FAULT_T);
2463			if (reg & F71882FG_FAN_NEG_TEMP_EN)
2464				data->auto_point_temp_signed = 1;
2465			/* Ensure banked pwm registers point to right bank */
2466			reg &= ~F71882FG_FAN_PROG_SEL;
2467			f71882fg_write8(data, F71882FG_REG_FAN_FAULT_T, reg);
2468			break;
2469		default:
2470			break;
2471		}
2472
2473		data->pwm_enable =
2474			f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
2475
2476		for (i = 0; i < nr_fans; i++) {
2477			err = f71882fg_create_fan_sysfs_files(pdev, i);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2478			if (err)
2479				goto exit_unregister_sysfs;
2480		}
2481
2482		/* Some types have 1 extra fan with limited functionality */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2483		switch (data->type) {
2484		case f71808a:
2485			err = f71882fg_create_sysfs_files(pdev,
 
 
 
 
 
2486					f71808a_fan3_attr,
2487					ARRAY_SIZE(f71808a_fan3_attr));
2488			break;
 
 
 
 
 
 
 
 
 
 
 
2489		case f8000:
2490			err = f71882fg_create_sysfs_files(pdev,
2491					f8000_fan_attr,
2492					ARRAY_SIZE(f8000_fan_attr));
 
 
 
 
 
2493			break;
2494		default:
2495			break;
 
 
2496		}
2497		if (err)
2498			goto exit_unregister_sysfs;
 
 
 
 
 
 
2499	}
2500
2501	data->hwmon_dev = hwmon_device_register(&pdev->dev);
2502	if (IS_ERR(data->hwmon_dev)) {
2503		err = PTR_ERR(data->hwmon_dev);
2504		data->hwmon_dev = NULL;
2505		goto exit_unregister_sysfs;
2506	}
2507
2508	return 0;
2509
2510exit_unregister_sysfs:
2511	f71882fg_remove(pdev); /* Will unregister the sysfs files for us */
2512	return err; /* f71882fg_remove() also frees our data */
 
 
 
2513}
2514
2515static int f71882fg_remove(struct platform_device *pdev)
2516{
2517	struct f71882fg_data *data = platform_get_drvdata(pdev);
2518	int nr_fans = f71882fg_nr_fans[data->type];
2519	int nr_temps = f71882fg_nr_temps[data->type];
2520	int i;
2521	u8 start_reg = f71882fg_read8(data, F71882FG_REG_START);
2522
2523	if (data->hwmon_dev)
2524		hwmon_device_unregister(data->hwmon_dev);
2525
2526	device_remove_file(&pdev->dev, &dev_attr_name);
2527
2528	if (start_reg & 0x01) {
2529		switch (data->type) {
2530		case f71858fg:
2531			if (data->temp_config & 0x10)
2532				f71882fg_remove_sysfs_files(pdev,
2533					f8000_temp_attr,
2534					ARRAY_SIZE(f8000_temp_attr));
2535			else
2536				f71882fg_remove_sysfs_files(pdev,
2537					f71858fg_temp_attr,
2538					ARRAY_SIZE(f71858fg_temp_attr));
2539			break;
2540		case f8000:
2541			f71882fg_remove_sysfs_files(pdev,
2542					f8000_temp_attr,
2543					ARRAY_SIZE(f8000_temp_attr));
2544			break;
2545		case f81866a:
2546			f71882fg_remove_sysfs_files(pdev,
2547					f71858fg_temp_attr,
2548					ARRAY_SIZE(f71858fg_temp_attr));
2549			break;
2550		default:
2551			f71882fg_remove_sysfs_files(pdev,
2552				&fxxxx_temp_attr[0][0],
2553				ARRAY_SIZE(fxxxx_temp_attr[0]) * nr_temps);
2554		}
2555		if (f71882fg_temp_has_beep[data->type]) {
2556			if (data->type == f81866a)
2557				f71882fg_remove_sysfs_files(pdev,
2558					&f81866_temp_beep_attr[0][0],
2559					ARRAY_SIZE(f81866_temp_beep_attr[0])
2560						* nr_temps);
2561			else
2562				f71882fg_remove_sysfs_files(pdev,
2563					&fxxxx_temp_beep_attr[0][0],
2564					ARRAY_SIZE(fxxxx_temp_beep_attr[0])
2565						* nr_temps);
2566		}
2567
2568		for (i = 0; i < F71882FG_MAX_INS; i++) {
2569			if (f71882fg_has_in[data->type][i]) {
2570				device_remove_file(&pdev->dev,
2571						&fxxxx_in_attr[i].dev_attr);
2572			}
2573		}
2574		if (f71882fg_has_in1_alarm[data->type]) {
2575			f71882fg_remove_sysfs_files(pdev,
2576					fxxxx_in1_alarm_attr,
2577					ARRAY_SIZE(fxxxx_in1_alarm_attr));
2578		}
2579	}
2580
2581	if (start_reg & 0x02) {
2582		f71882fg_remove_sysfs_files(pdev, &fxxxx_fan_attr[0][0],
2583				ARRAY_SIZE(fxxxx_fan_attr[0]) * nr_fans);
2584
2585		if (f71882fg_fan_has_beep[data->type]) {
2586			f71882fg_remove_sysfs_files(pdev,
2587					fxxxx_fan_beep_attr, nr_fans);
2588		}
2589
2590		switch (data->type) {
2591		case f71808a:
2592			f71882fg_remove_sysfs_files(pdev,
2593				&fxxxx_auto_pwm_attr[0][0],
2594				ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans);
2595			f71882fg_remove_sysfs_files(pdev,
2596					f71808a_fan3_attr,
2597					ARRAY_SIZE(f71808a_fan3_attr));
2598			break;
2599		case f71862fg:
2600			f71882fg_remove_sysfs_files(pdev,
2601				&f71862fg_auto_pwm_attr[0][0],
2602				ARRAY_SIZE(f71862fg_auto_pwm_attr[0]) *
2603					nr_fans);
2604			break;
2605		case f71808e:
2606		case f71869:
2607			f71882fg_remove_sysfs_files(pdev,
2608				&f71869_auto_pwm_attr[0][0],
2609				ARRAY_SIZE(f71869_auto_pwm_attr[0]) * nr_fans);
2610			break;
2611		case f8000:
2612			f71882fg_remove_sysfs_files(pdev,
2613					f8000_fan_attr,
2614					ARRAY_SIZE(f8000_fan_attr));
2615			f71882fg_remove_sysfs_files(pdev,
2616				&f8000_auto_pwm_attr[0][0],
2617				ARRAY_SIZE(f8000_auto_pwm_attr[0]) * nr_fans);
2618			break;
2619		default:
2620			f71882fg_remove_sysfs_files(pdev,
2621				&fxxxx_auto_pwm_attr[0][0],
2622				ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans);
2623		}
2624	}
 
 
 
 
2625	return 0;
2626}
2627
2628static int __init f71882fg_find(int sioaddr, struct f71882fg_sio_data *sio_data)
 
2629{
2630	u16 devid;
2631	unsigned short address;
2632	int err = superio_enter(sioaddr);
2633	if (err)
2634		return err;
2635
2636	devid = superio_inw(sioaddr, SIO_REG_MANID);
2637	if (devid != SIO_FINTEK_ID) {
2638		pr_debug("Not a Fintek device\n");
2639		err = -ENODEV;
2640		goto exit;
2641	}
2642
2643	devid = force_id ? force_id : superio_inw(sioaddr, SIO_REG_DEVID);
2644	switch (devid) {
2645	case SIO_F71808E_ID:
2646		sio_data->type = f71808e;
2647		break;
2648	case SIO_F71808A_ID:
2649		sio_data->type = f71808a;
2650		break;
2651	case SIO_F71858_ID:
2652		sio_data->type = f71858fg;
2653		break;
2654	case SIO_F71862_ID:
2655		sio_data->type = f71862fg;
2656		break;
2657	case SIO_F71868_ID:
2658		sio_data->type = f71868a;
2659		break;
2660	case SIO_F71869_ID:
2661		sio_data->type = f71869;
2662		break;
2663	case SIO_F71869A_ID:
2664		sio_data->type = f71869a;
2665		break;
2666	case SIO_F71882_ID:
2667		sio_data->type = f71882fg;
2668		break;
2669	case SIO_F71889_ID:
2670		sio_data->type = f71889fg;
2671		break;
2672	case SIO_F71889E_ID:
2673		sio_data->type = f71889ed;
2674		break;
2675	case SIO_F71889A_ID:
2676		sio_data->type = f71889a;
2677		break;
2678	case SIO_F8000_ID:
2679		sio_data->type = f8000;
2680		break;
2681	case SIO_F81768D_ID:
2682		sio_data->type = f81768d;
2683		break;
2684	case SIO_F81865_ID:
2685		sio_data->type = f81865f;
2686		break;
2687	case SIO_F81866_ID:
2688		sio_data->type = f81866a;
2689		break;
2690	default:
2691		pr_info("Unsupported Fintek device: %04x\n",
2692			(unsigned int)devid);
2693		err = -ENODEV;
2694		goto exit;
2695	}
2696
2697	if (sio_data->type == f71858fg)
2698		superio_select(sioaddr, SIO_F71858FG_LD_HWM);
2699	else
2700		superio_select(sioaddr, SIO_F71882FG_LD_HWM);
2701
2702	if (!(superio_inb(sioaddr, SIO_REG_ENABLE) & 0x01)) {
2703		pr_warn("Device not activated\n");
2704		err = -ENODEV;
2705		goto exit;
2706	}
2707
2708	address = superio_inw(sioaddr, SIO_REG_ADDR);
2709	if (address == 0) {
2710		pr_warn("Base address not set\n");
2711		err = -ENODEV;
2712		goto exit;
2713	}
2714	address &= ~(REGION_LENGTH - 1);	/* Ignore 3 LSB */
2715
2716	err = address;
2717	pr_info("Found %s chip at %#x, revision %d\n",
2718		f71882fg_names[sio_data->type],	(unsigned int)address,
2719		(int)superio_inb(sioaddr, SIO_REG_DEVREV));
2720exit:
2721	superio_exit(sioaddr);
2722	return err;
2723}
2724
2725static int __init f71882fg_device_add(int address,
2726				      const struct f71882fg_sio_data *sio_data)
2727{
2728	struct resource res = {
2729		.start	= address,
2730		.end	= address + REGION_LENGTH - 1,
2731		.flags	= IORESOURCE_IO,
2732	};
2733	int err;
2734
2735	f71882fg_pdev = platform_device_alloc(DRVNAME, address);
2736	if (!f71882fg_pdev)
2737		return -ENOMEM;
2738
2739	res.name = f71882fg_pdev->name;
2740	err = acpi_check_resource_conflict(&res);
2741	if (err)
2742		goto exit_device_put;
2743
2744	err = platform_device_add_resources(f71882fg_pdev, &res, 1);
2745	if (err) {
2746		pr_err("Device resource addition failed\n");
2747		goto exit_device_put;
2748	}
2749
2750	err = platform_device_add_data(f71882fg_pdev, sio_data,
2751				       sizeof(struct f71882fg_sio_data));
2752	if (err) {
2753		pr_err("Platform data allocation failed\n");
2754		goto exit_device_put;
2755	}
2756
2757	err = platform_device_add(f71882fg_pdev);
2758	if (err) {
2759		pr_err("Device addition failed\n");
2760		goto exit_device_put;
2761	}
2762
2763	return 0;
2764
2765exit_device_put:
2766	platform_device_put(f71882fg_pdev);
2767
2768	return err;
2769}
2770
2771static int __init f71882fg_init(void)
2772{
2773	int err;
2774	int address;
2775	struct f71882fg_sio_data sio_data;
2776
2777	memset(&sio_data, 0, sizeof(sio_data));
2778
2779	address = f71882fg_find(0x2e, &sio_data);
2780	if (address < 0)
2781		address = f71882fg_find(0x4e, &sio_data);
2782	if (address < 0)
2783		return address;
2784
2785	err = platform_driver_register(&f71882fg_driver);
2786	if (err)
2787		return err;
2788
2789	err = f71882fg_device_add(address, &sio_data);
2790	if (err)
2791		goto exit_driver;
2792
2793	return 0;
2794
2795exit_driver:
2796	platform_driver_unregister(&f71882fg_driver);
 
2797	return err;
2798}
2799
2800static void __exit f71882fg_exit(void)
2801{
2802	platform_device_unregister(f71882fg_pdev);
2803	platform_driver_unregister(&f71882fg_driver);
2804}
2805
2806MODULE_DESCRIPTION("F71882FG Hardware Monitoring Driver");
2807MODULE_AUTHOR("Hans Edgington, Hans de Goede <hdegoede@redhat.com>");
2808MODULE_LICENSE("GPL");
2809
2810module_init(f71882fg_init);
2811module_exit(f71882fg_exit);