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