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