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