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