hwmon: f71882fg: use a muxed resource lock for the Super I/O port
[linux-2.6.git] / drivers / hwmon / f71882fg.c
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 int 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         val  = superio_inb(base, reg) << 8;
860         val |= superio_inb(base, reg + 1);
861         return val;
862 }
863
864 static inline int superio_enter(int base)
865 {
866         /* Don't step on other drivers' I/O space by accident */
867         if (!request_muxed_region(base, 2, DRVNAME)) {
868                 printk(KERN_ERR DRVNAME ": I/O address 0x%04x already in use\n",
869                                 base);
870                 return -EBUSY;
871         }
872
873         /* according to the datasheet the key must be send twice! */
874         outb(SIO_UNLOCK_KEY, base);
875         outb(SIO_UNLOCK_KEY, base);
876
877         return 0;
878 }
879
880 static inline void superio_select(int base, int ld)
881 {
882         outb(SIO_REG_LDSEL, base);
883         outb(ld, base + 1);
884 }
885
886 static inline void superio_exit(int base)
887 {
888         outb(SIO_LOCK_KEY, base);
889         release_region(base, 2);
890 }
891
892 static inline int fan_from_reg(u16 reg)
893 {
894         return reg ? (1500000 / reg) : 0;
895 }
896
897 static inline u16 fan_to_reg(int fan)
898 {
899         return fan ? (1500000 / fan) : 0;
900 }
901
902 static u8 f71882fg_read8(struct f71882fg_data *data, u8 reg)
903 {
904         u8 val;
905
906         outb(reg, data->addr + ADDR_REG_OFFSET);
907         val = inb(data->addr + DATA_REG_OFFSET);
908
909         return val;
910 }
911
912 static u16 f71882fg_read16(struct f71882fg_data *data, u8 reg)
913 {
914         u16 val;
915
916         val  = f71882fg_read8(data, reg) << 8;
917         val |= f71882fg_read8(data, reg + 1);
918
919         return val;
920 }
921
922 static void f71882fg_write8(struct f71882fg_data *data, u8 reg, u8 val)
923 {
924         outb(reg, data->addr + ADDR_REG_OFFSET);
925         outb(val, data->addr + DATA_REG_OFFSET);
926 }
927
928 static void f71882fg_write16(struct f71882fg_data *data, u8 reg, u16 val)
929 {
930         f71882fg_write8(data, reg,     val >> 8);
931         f71882fg_write8(data, reg + 1, val & 0xff);
932 }
933
934 static u16 f71882fg_read_temp(struct f71882fg_data *data, int nr)
935 {
936         if (data->type == f71858fg)
937                 return f71882fg_read16(data, F71882FG_REG_TEMP(nr));
938         else
939                 return f71882fg_read8(data, F71882FG_REG_TEMP(nr));
940 }
941
942 static struct f71882fg_data *f71882fg_update_device(struct device *dev)
943 {
944         struct f71882fg_data *data = dev_get_drvdata(dev);
945         int nr, reg = 0, reg2;
946         int nr_fans = (data->type == f71882fg) ? 4 : 3;
947         int nr_ins = (data->type == f71858fg || data->type == f8000) ? 3 : 9;
948
949         mutex_lock(&data->update_lock);
950
951         /* Update once every 60 seconds */
952         if (time_after(jiffies, data->last_limits + 60 * HZ) ||
953                         !data->valid) {
954                 if (data->type == f71882fg || data->type == f71889fg) {
955                         data->in1_max =
956                                 f71882fg_read8(data, F71882FG_REG_IN1_HIGH);
957                         data->in_beep =
958                                 f71882fg_read8(data, F71882FG_REG_IN_BEEP);
959                 }
960
961                 /* Get High & boundary temps*/
962                 for (nr = data->temp_start; nr < 3 + data->temp_start; nr++) {
963                         data->temp_ovt[nr] = f71882fg_read8(data,
964                                                 F71882FG_REG_TEMP_OVT(nr));
965                         data->temp_high[nr] = f71882fg_read8(data,
966                                                 F71882FG_REG_TEMP_HIGH(nr));
967                 }
968
969                 if (data->type != f8000) {
970                         data->temp_hyst[0] = f71882fg_read8(data,
971                                                 F71882FG_REG_TEMP_HYST(0));
972                         data->temp_hyst[1] = f71882fg_read8(data,
973                                                 F71882FG_REG_TEMP_HYST(1));
974                 }
975
976                 if (data->type == f71862fg || data->type == f71882fg ||
977                     data->type == f71889fg) {
978                         data->fan_beep = f71882fg_read8(data,
979                                                 F71882FG_REG_FAN_BEEP);
980                         data->temp_beep = f71882fg_read8(data,
981                                                 F71882FG_REG_TEMP_BEEP);
982                         /* Have to hardcode type, because temp1 is special */
983                         reg  = f71882fg_read8(data, F71882FG_REG_TEMP_TYPE);
984                         data->temp_type[2] = (reg & 0x04) ? 2 : 4;
985                         data->temp_type[3] = (reg & 0x08) ? 2 : 4;
986                 }
987                 /* Determine temp index 1 sensor type */
988                 if (data->type == f71889fg) {
989                         reg2 = f71882fg_read8(data, F71882FG_REG_START);
990                         switch ((reg2 & 0x60) >> 5) {
991                         case 0x00: /* BJT / Thermistor */
992                                 data->temp_type[1] = (reg & 0x02) ? 2 : 4;
993                                 break;
994                         case 0x01: /* AMDSI */
995                                 data->temp_type[1] = 5;
996                                 break;
997                         case 0x02: /* PECI */
998                         case 0x03: /* Ibex Peak ?? Report as PECI for now */
999                                 data->temp_type[1] = 6;
1000                                 break;
1001                         }
1002                 } else {
1003                         reg2 = f71882fg_read8(data, F71882FG_REG_PECI);
1004                         if ((reg2 & 0x03) == 0x01)
1005                                 data->temp_type[1] = 6; /* PECI */
1006                         else if ((reg2 & 0x03) == 0x02)
1007                                 data->temp_type[1] = 5; /* AMDSI */
1008                         else if (data->type == f71862fg ||
1009                                  data->type == f71882fg)
1010                                 data->temp_type[1] = (reg & 0x02) ? 2 : 4;
1011                         else /* f71858fg and f8000 only support BJT */
1012                                 data->temp_type[1] = 2;
1013                 }
1014
1015                 data->pwm_enable = f71882fg_read8(data,
1016                                                   F71882FG_REG_PWM_ENABLE);
1017                 data->pwm_auto_point_hyst[0] =
1018                         f71882fg_read8(data, F71882FG_REG_FAN_HYST(0));
1019                 data->pwm_auto_point_hyst[1] =
1020                         f71882fg_read8(data, F71882FG_REG_FAN_HYST(1));
1021
1022                 for (nr = 0; nr < nr_fans; nr++) {
1023                         data->pwm_auto_point_mapping[nr] =
1024                             f71882fg_read8(data,
1025                                            F71882FG_REG_POINT_MAPPING(nr));
1026
1027                         if (data->type != f71862fg) {
1028                                 int point;
1029                                 for (point = 0; point < 5; point++) {
1030                                         data->pwm_auto_point_pwm[nr][point] =
1031                                                 f71882fg_read8(data,
1032                                                         F71882FG_REG_POINT_PWM
1033                                                         (nr, point));
1034                                 }
1035                                 for (point = 0; point < 4; point++) {
1036                                         data->pwm_auto_point_temp[nr][point] =
1037                                                 f71882fg_read8(data,
1038                                                         F71882FG_REG_POINT_TEMP
1039                                                         (nr, point));
1040                                 }
1041                         } else {
1042                                 data->pwm_auto_point_pwm[nr][1] =
1043                                         f71882fg_read8(data,
1044                                                 F71882FG_REG_POINT_PWM
1045                                                 (nr, 1));
1046                                 data->pwm_auto_point_pwm[nr][4] =
1047                                         f71882fg_read8(data,
1048                                                 F71882FG_REG_POINT_PWM
1049                                                 (nr, 4));
1050                                 data->pwm_auto_point_temp[nr][0] =
1051                                         f71882fg_read8(data,
1052                                                 F71882FG_REG_POINT_TEMP
1053                                                 (nr, 0));
1054                                 data->pwm_auto_point_temp[nr][3] =
1055                                         f71882fg_read8(data,
1056                                                 F71882FG_REG_POINT_TEMP
1057                                                 (nr, 3));
1058                         }
1059                 }
1060                 data->last_limits = jiffies;
1061         }
1062
1063         /* Update every second */
1064         if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
1065                 data->temp_status = f71882fg_read8(data,
1066                                                 F71882FG_REG_TEMP_STATUS);
1067                 data->temp_diode_open = f71882fg_read8(data,
1068                                                 F71882FG_REG_TEMP_DIODE_OPEN);
1069                 for (nr = data->temp_start; nr < 3 + data->temp_start; nr++)
1070                         data->temp[nr] = f71882fg_read_temp(data, nr);
1071
1072                 data->fan_status = f71882fg_read8(data,
1073                                                 F71882FG_REG_FAN_STATUS);
1074                 for (nr = 0; nr < nr_fans; nr++) {
1075                         data->fan[nr] = f71882fg_read16(data,
1076                                                 F71882FG_REG_FAN(nr));
1077                         data->fan_target[nr] =
1078                             f71882fg_read16(data, F71882FG_REG_FAN_TARGET(nr));
1079                         data->fan_full_speed[nr] =
1080                             f71882fg_read16(data,
1081                                             F71882FG_REG_FAN_FULL_SPEED(nr));
1082                         data->pwm[nr] =
1083                             f71882fg_read8(data, F71882FG_REG_PWM(nr));
1084                 }
1085
1086                 /* The f8000 can monitor 1 more fan, but has no pwm for it */
1087                 if (data->type == f8000)
1088                         data->fan[3] = f71882fg_read16(data,
1089                                                 F71882FG_REG_FAN(3));
1090                 if (data->type == f71882fg || data->type == f71889fg)
1091                         data->in_status = f71882fg_read8(data,
1092                                                 F71882FG_REG_IN_STATUS);
1093                 for (nr = 0; nr < nr_ins; nr++)
1094                         data->in[nr] = f71882fg_read8(data,
1095                                                 F71882FG_REG_IN(nr));
1096
1097                 data->last_updated = jiffies;
1098                 data->valid = 1;
1099         }
1100
1101         mutex_unlock(&data->update_lock);
1102
1103         return data;
1104 }
1105
1106 /* Sysfs Interface */
1107 static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
1108         char *buf)
1109 {
1110         struct f71882fg_data *data = f71882fg_update_device(dev);
1111         int nr = to_sensor_dev_attr_2(devattr)->index;
1112         int speed = fan_from_reg(data->fan[nr]);
1113
1114         if (speed == FAN_MIN_DETECT)
1115                 speed = 0;
1116
1117         return sprintf(buf, "%d\n", speed);
1118 }
1119
1120 static ssize_t show_fan_full_speed(struct device *dev,
1121                                    struct device_attribute *devattr, char *buf)
1122 {
1123         struct f71882fg_data *data = f71882fg_update_device(dev);
1124         int nr = to_sensor_dev_attr_2(devattr)->index;
1125         int speed = fan_from_reg(data->fan_full_speed[nr]);
1126         return sprintf(buf, "%d\n", speed);
1127 }
1128
1129 static ssize_t store_fan_full_speed(struct device *dev,
1130                                     struct device_attribute *devattr,
1131                                     const char *buf, size_t count)
1132 {
1133         struct f71882fg_data *data = dev_get_drvdata(dev);
1134         int err, nr = to_sensor_dev_attr_2(devattr)->index;
1135         long val;
1136
1137         err = strict_strtol(buf, 10, &val);
1138         if (err)
1139                 return err;
1140
1141         val = SENSORS_LIMIT(val, 23, 1500000);
1142         val = fan_to_reg(val);
1143
1144         mutex_lock(&data->update_lock);
1145         f71882fg_write16(data, F71882FG_REG_FAN_FULL_SPEED(nr), val);
1146         data->fan_full_speed[nr] = val;
1147         mutex_unlock(&data->update_lock);
1148
1149         return count;
1150 }
1151
1152 static ssize_t show_fan_beep(struct device *dev, struct device_attribute
1153         *devattr, char *buf)
1154 {
1155         struct f71882fg_data *data = f71882fg_update_device(dev);
1156         int nr = to_sensor_dev_attr_2(devattr)->index;
1157
1158         if (data->fan_beep & (1 << nr))
1159                 return sprintf(buf, "1\n");
1160         else
1161                 return sprintf(buf, "0\n");
1162 }
1163
1164 static ssize_t store_fan_beep(struct device *dev, struct device_attribute
1165         *devattr, const char *buf, size_t count)
1166 {
1167         struct f71882fg_data *data = dev_get_drvdata(dev);
1168         int err, nr = to_sensor_dev_attr_2(devattr)->index;
1169         unsigned long val;
1170
1171         err = strict_strtoul(buf, 10, &val);
1172         if (err)
1173                 return err;
1174
1175         mutex_lock(&data->update_lock);
1176         data->fan_beep = f71882fg_read8(data, F71882FG_REG_FAN_BEEP);
1177         if (val)
1178                 data->fan_beep |= 1 << nr;
1179         else
1180                 data->fan_beep &= ~(1 << nr);
1181
1182         f71882fg_write8(data, F71882FG_REG_FAN_BEEP, data->fan_beep);
1183         mutex_unlock(&data->update_lock);
1184
1185         return count;
1186 }
1187
1188 static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
1189         *devattr, char *buf)
1190 {
1191         struct f71882fg_data *data = f71882fg_update_device(dev);
1192         int nr = to_sensor_dev_attr_2(devattr)->index;
1193
1194         if (data->fan_status & (1 << nr))
1195                 return sprintf(buf, "1\n");
1196         else
1197                 return sprintf(buf, "0\n");
1198 }
1199
1200 static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
1201         char *buf)
1202 {
1203         struct f71882fg_data *data = f71882fg_update_device(dev);
1204         int nr = to_sensor_dev_attr_2(devattr)->index;
1205
1206         return sprintf(buf, "%d\n", data->in[nr] * 8);
1207 }
1208
1209 static ssize_t show_in_max(struct device *dev, struct device_attribute
1210         *devattr, char *buf)
1211 {
1212         struct f71882fg_data *data = f71882fg_update_device(dev);
1213
1214         return sprintf(buf, "%d\n", data->in1_max * 8);
1215 }
1216
1217 static ssize_t store_in_max(struct device *dev, struct device_attribute
1218         *devattr, const char *buf, size_t count)
1219 {
1220         struct f71882fg_data *data = dev_get_drvdata(dev);
1221         int err;
1222         long val;
1223
1224         err = strict_strtol(buf, 10, &val);
1225         if (err)
1226                 return err;
1227
1228         val /= 8;
1229         val = SENSORS_LIMIT(val, 0, 255);
1230
1231         mutex_lock(&data->update_lock);
1232         f71882fg_write8(data, F71882FG_REG_IN1_HIGH, val);
1233         data->in1_max = val;
1234         mutex_unlock(&data->update_lock);
1235
1236         return count;
1237 }
1238
1239 static ssize_t show_in_beep(struct device *dev, struct device_attribute
1240         *devattr, char *buf)
1241 {
1242         struct f71882fg_data *data = f71882fg_update_device(dev);
1243         int nr = to_sensor_dev_attr_2(devattr)->index;
1244
1245         if (data->in_beep & (1 << nr))
1246                 return sprintf(buf, "1\n");
1247         else
1248                 return sprintf(buf, "0\n");
1249 }
1250
1251 static ssize_t store_in_beep(struct device *dev, struct device_attribute
1252         *devattr, const char *buf, size_t count)
1253 {
1254         struct f71882fg_data *data = dev_get_drvdata(dev);
1255         int err, nr = to_sensor_dev_attr_2(devattr)->index;
1256         unsigned long val;
1257
1258         err = strict_strtoul(buf, 10, &val);
1259         if (err)
1260                 return err;
1261
1262         mutex_lock(&data->update_lock);
1263         data->in_beep = f71882fg_read8(data, F71882FG_REG_IN_BEEP);
1264         if (val)
1265                 data->in_beep |= 1 << nr;
1266         else
1267                 data->in_beep &= ~(1 << nr);
1268
1269         f71882fg_write8(data, F71882FG_REG_IN_BEEP, data->in_beep);
1270         mutex_unlock(&data->update_lock);
1271
1272         return count;
1273 }
1274
1275 static ssize_t show_in_alarm(struct device *dev, struct device_attribute
1276         *devattr, char *buf)
1277 {
1278         struct f71882fg_data *data = f71882fg_update_device(dev);
1279         int nr = to_sensor_dev_attr_2(devattr)->index;
1280
1281         if (data->in_status & (1 << nr))
1282                 return sprintf(buf, "1\n");
1283         else
1284                 return sprintf(buf, "0\n");
1285 }
1286
1287 static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
1288         char *buf)
1289 {
1290         struct f71882fg_data *data = f71882fg_update_device(dev);
1291         int nr = to_sensor_dev_attr_2(devattr)->index;
1292         int sign, temp;
1293
1294         if (data->type == f71858fg) {
1295                 /* TEMP_TABLE_SEL 1 or 3 ? */
1296                 if (data->temp_config & 1) {
1297                         sign = data->temp[nr] & 0x0001;
1298                         temp = (data->temp[nr] >> 5) & 0x7ff;
1299                 } else {
1300                         sign = data->temp[nr] & 0x8000;
1301                         temp = (data->temp[nr] >> 5) & 0x3ff;
1302                 }
1303                 temp *= 125;
1304                 if (sign)
1305                         temp -= 128000;
1306         } else
1307                 temp = data->temp[nr] * 1000;
1308
1309         return sprintf(buf, "%d\n", temp);
1310 }
1311
1312 static ssize_t show_temp_max(struct device *dev, struct device_attribute
1313         *devattr, char *buf)
1314 {
1315         struct f71882fg_data *data = f71882fg_update_device(dev);
1316         int nr = to_sensor_dev_attr_2(devattr)->index;
1317
1318         return sprintf(buf, "%d\n", data->temp_high[nr] * 1000);
1319 }
1320
1321 static ssize_t store_temp_max(struct device *dev, struct device_attribute
1322         *devattr, const char *buf, size_t count)
1323 {
1324         struct f71882fg_data *data = dev_get_drvdata(dev);
1325         int err, nr = to_sensor_dev_attr_2(devattr)->index;
1326         long val;
1327
1328         err = strict_strtol(buf, 10, &val);
1329         if (err)
1330                 return err;
1331
1332         val /= 1000;
1333         val = SENSORS_LIMIT(val, 0, 255);
1334
1335         mutex_lock(&data->update_lock);
1336         f71882fg_write8(data, F71882FG_REG_TEMP_HIGH(nr), val);
1337         data->temp_high[nr] = val;
1338         mutex_unlock(&data->update_lock);
1339
1340         return count;
1341 }
1342
1343 static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute
1344         *devattr, char *buf)
1345 {
1346         struct f71882fg_data *data = f71882fg_update_device(dev);
1347         int nr = to_sensor_dev_attr_2(devattr)->index;
1348         int temp_max_hyst;
1349
1350         mutex_lock(&data->update_lock);
1351         if (nr & 1)
1352                 temp_max_hyst = data->temp_hyst[nr / 2] >> 4;
1353         else
1354                 temp_max_hyst = data->temp_hyst[nr / 2] & 0x0f;
1355         temp_max_hyst = (data->temp_high[nr] - temp_max_hyst) * 1000;
1356         mutex_unlock(&data->update_lock);
1357
1358         return sprintf(buf, "%d\n", temp_max_hyst);
1359 }
1360
1361 static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute
1362         *devattr, const char *buf, size_t count)
1363 {
1364         struct f71882fg_data *data = dev_get_drvdata(dev);
1365         int err, nr = to_sensor_dev_attr_2(devattr)->index;
1366         ssize_t ret = count;
1367         u8 reg;
1368         long val;
1369
1370         err = strict_strtol(buf, 10, &val);
1371         if (err)
1372                 return err;
1373
1374         val /= 1000;
1375
1376         mutex_lock(&data->update_lock);
1377
1378         /* convert abs to relative and check */
1379         data->temp_high[nr] = f71882fg_read8(data, F71882FG_REG_TEMP_HIGH(nr));
1380         val = SENSORS_LIMIT(val, data->temp_high[nr] - 15,
1381                             data->temp_high[nr]);
1382         val = data->temp_high[nr] - val;
1383
1384         /* convert value to register contents */
1385         reg = f71882fg_read8(data, F71882FG_REG_TEMP_HYST(nr / 2));
1386         if (nr & 1)
1387                 reg = (reg & 0x0f) | (val << 4);
1388         else
1389                 reg = (reg & 0xf0) | val;
1390         f71882fg_write8(data, F71882FG_REG_TEMP_HYST(nr / 2), reg);
1391         data->temp_hyst[nr / 2] = reg;
1392
1393         mutex_unlock(&data->update_lock);
1394         return ret;
1395 }
1396
1397 static ssize_t show_temp_crit(struct device *dev, struct device_attribute
1398         *devattr, char *buf)
1399 {
1400         struct f71882fg_data *data = f71882fg_update_device(dev);
1401         int nr = to_sensor_dev_attr_2(devattr)->index;
1402
1403         return sprintf(buf, "%d\n", data->temp_ovt[nr] * 1000);
1404 }
1405
1406 static ssize_t store_temp_crit(struct device *dev, struct device_attribute
1407         *devattr, const char *buf, size_t count)
1408 {
1409         struct f71882fg_data *data = dev_get_drvdata(dev);
1410         int err, nr = to_sensor_dev_attr_2(devattr)->index;
1411         long val;
1412
1413         err = strict_strtol(buf, 10, &val);
1414         if (err)
1415                 return err;
1416
1417         val /= 1000;
1418         val = SENSORS_LIMIT(val, 0, 255);
1419
1420         mutex_lock(&data->update_lock);
1421         f71882fg_write8(data, F71882FG_REG_TEMP_OVT(nr), val);
1422         data->temp_ovt[nr] = val;
1423         mutex_unlock(&data->update_lock);
1424
1425         return count;
1426 }
1427
1428 static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute
1429         *devattr, char *buf)
1430 {
1431         struct f71882fg_data *data = f71882fg_update_device(dev);
1432         int nr = to_sensor_dev_attr_2(devattr)->index;
1433         int temp_crit_hyst;
1434
1435         mutex_lock(&data->update_lock);
1436         if (nr & 1)
1437                 temp_crit_hyst = data->temp_hyst[nr / 2] >> 4;
1438         else
1439                 temp_crit_hyst = data->temp_hyst[nr / 2] & 0x0f;
1440         temp_crit_hyst = (data->temp_ovt[nr] - temp_crit_hyst) * 1000;
1441         mutex_unlock(&data->update_lock);
1442
1443         return sprintf(buf, "%d\n", temp_crit_hyst);
1444 }
1445
1446 static ssize_t show_temp_type(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         return sprintf(buf, "%d\n", data->temp_type[nr]);
1453 }
1454
1455 static ssize_t show_temp_beep(struct device *dev, struct device_attribute
1456         *devattr, char *buf)
1457 {
1458         struct f71882fg_data *data = f71882fg_update_device(dev);
1459         int nr = to_sensor_dev_attr_2(devattr)->index;
1460
1461         if (data->temp_beep & (1 << nr))
1462                 return sprintf(buf, "1\n");
1463         else
1464                 return sprintf(buf, "0\n");
1465 }
1466
1467 static ssize_t store_temp_beep(struct device *dev, struct device_attribute
1468         *devattr, const char *buf, size_t count)
1469 {
1470         struct f71882fg_data *data = dev_get_drvdata(dev);
1471         int err, nr = to_sensor_dev_attr_2(devattr)->index;
1472         unsigned long val;
1473
1474         err = strict_strtoul(buf, 10, &val);
1475         if (err)
1476                 return err;
1477
1478         mutex_lock(&data->update_lock);
1479         data->temp_beep = f71882fg_read8(data, F71882FG_REG_TEMP_BEEP);
1480         if (val)
1481                 data->temp_beep |= 1 << nr;
1482         else
1483                 data->temp_beep &= ~(1 << nr);
1484
1485         f71882fg_write8(data, F71882FG_REG_TEMP_BEEP, data->temp_beep);
1486         mutex_unlock(&data->update_lock);
1487
1488         return count;
1489 }
1490
1491 static ssize_t show_temp_alarm(struct device *dev, struct device_attribute
1492         *devattr, char *buf)
1493 {
1494         struct f71882fg_data *data = f71882fg_update_device(dev);
1495         int nr = to_sensor_dev_attr_2(devattr)->index;
1496
1497         if (data->temp_status & (1 << nr))
1498                 return sprintf(buf, "1\n");
1499         else
1500                 return sprintf(buf, "0\n");
1501 }
1502
1503 static ssize_t show_temp_fault(struct device *dev, struct device_attribute
1504         *devattr, char *buf)
1505 {
1506         struct f71882fg_data *data = f71882fg_update_device(dev);
1507         int nr = to_sensor_dev_attr_2(devattr)->index;
1508
1509         if (data->temp_diode_open & (1 << nr))
1510                 return sprintf(buf, "1\n");
1511         else
1512                 return sprintf(buf, "0\n");
1513 }
1514
1515 static ssize_t show_pwm(struct device *dev,
1516                         struct device_attribute *devattr, char *buf)
1517 {
1518         struct f71882fg_data *data = f71882fg_update_device(dev);
1519         int val, nr = to_sensor_dev_attr_2(devattr)->index;
1520         mutex_lock(&data->update_lock);
1521         if (data->pwm_enable & (1 << (2 * nr)))
1522                 /* PWM mode */
1523                 val = data->pwm[nr];
1524         else {
1525                 /* RPM mode */
1526                 val = 255 * fan_from_reg(data->fan_target[nr])
1527                         / fan_from_reg(data->fan_full_speed[nr]);
1528         }
1529         mutex_unlock(&data->update_lock);
1530         return sprintf(buf, "%d\n", val);
1531 }
1532
1533 static ssize_t store_pwm(struct device *dev,
1534                          struct device_attribute *devattr, const char *buf,
1535                          size_t count)
1536 {
1537         struct f71882fg_data *data = dev_get_drvdata(dev);
1538         int err, nr = to_sensor_dev_attr_2(devattr)->index;
1539         long val;
1540
1541         err = strict_strtol(buf, 10, &val);
1542         if (err)
1543                 return err;
1544
1545         val = SENSORS_LIMIT(val, 0, 255);
1546
1547         mutex_lock(&data->update_lock);
1548         data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1549         if ((data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 3) != 2) ||
1550             (data->type != f8000 && !((data->pwm_enable >> 2 * nr) & 2))) {
1551                 count = -EROFS;
1552                 goto leave;
1553         }
1554         if (data->pwm_enable & (1 << (2 * nr))) {
1555                 /* PWM mode */
1556                 f71882fg_write8(data, F71882FG_REG_PWM(nr), val);
1557                 data->pwm[nr] = val;
1558         } else {
1559                 /* RPM mode */
1560                 int target, full_speed;
1561                 full_speed = f71882fg_read16(data,
1562                                              F71882FG_REG_FAN_FULL_SPEED(nr));
1563                 target = fan_to_reg(val * fan_from_reg(full_speed) / 255);
1564                 f71882fg_write16(data, F71882FG_REG_FAN_TARGET(nr), target);
1565                 data->fan_target[nr] = target;
1566                 data->fan_full_speed[nr] = full_speed;
1567         }
1568 leave:
1569         mutex_unlock(&data->update_lock);
1570
1571         return count;
1572 }
1573
1574 static ssize_t show_pwm_enable(struct device *dev,
1575                                struct device_attribute *devattr, char *buf)
1576 {
1577         int result = 0;
1578         struct f71882fg_data *data = f71882fg_update_device(dev);
1579         int nr = to_sensor_dev_attr_2(devattr)->index;
1580
1581         switch ((data->pwm_enable >> 2 * nr) & 3) {
1582         case 0:
1583         case 1:
1584                 result = 2; /* Normal auto mode */
1585                 break;
1586         case 2:
1587                 result = 1; /* Manual mode */
1588                 break;
1589         case 3:
1590                 if (data->type == f8000)
1591                         result = 3; /* Thermostat mode */
1592                 else
1593                         result = 1; /* Manual mode */
1594                 break;
1595         }
1596
1597         return sprintf(buf, "%d\n", result);
1598 }
1599
1600 static ssize_t store_pwm_enable(struct device *dev, struct device_attribute
1601                                 *devattr, const char *buf, size_t count)
1602 {
1603         struct f71882fg_data *data = dev_get_drvdata(dev);
1604         int err, nr = to_sensor_dev_attr_2(devattr)->index;
1605         long val;
1606
1607         err = strict_strtol(buf, 10, &val);
1608         if (err)
1609                 return err;
1610
1611         /* Special case for F8000 pwm channel 3 which only does auto mode */
1612         if (data->type == f8000 && nr == 2 && val != 2)
1613                 return -EINVAL;
1614
1615         mutex_lock(&data->update_lock);
1616         data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1617         /* Special case for F8000 auto PWM mode / Thermostat mode */
1618         if (data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 1)) {
1619                 switch (val) {
1620                 case 2:
1621                         data->pwm_enable &= ~(2 << (2 * nr));
1622                         break;          /* Normal auto mode */
1623                 case 3:
1624                         data->pwm_enable |= 2 << (2 * nr);
1625                         break;          /* Thermostat mode */
1626                 default:
1627                         count = -EINVAL;
1628                         goto leave;
1629                 }
1630         } else {
1631                 switch (val) {
1632                 case 1:
1633                         /* The f71858fg does not support manual RPM mode */
1634                         if (data->type == f71858fg &&
1635                             ((data->pwm_enable >> (2 * nr)) & 1)) {
1636                                 count = -EINVAL;
1637                                 goto leave;
1638                         }
1639                         data->pwm_enable |= 2 << (2 * nr);
1640                         break;          /* Manual */
1641                 case 2:
1642                         data->pwm_enable &= ~(2 << (2 * nr));
1643                         break;          /* Normal auto mode */
1644                 default:
1645                         count = -EINVAL;
1646                         goto leave;
1647                 }
1648         }
1649         f71882fg_write8(data, F71882FG_REG_PWM_ENABLE, data->pwm_enable);
1650 leave:
1651         mutex_unlock(&data->update_lock);
1652
1653         return count;
1654 }
1655
1656 static ssize_t show_pwm_auto_point_pwm(struct device *dev,
1657                                        struct device_attribute *devattr,
1658                                        char *buf)
1659 {
1660         int result;
1661         struct f71882fg_data *data = f71882fg_update_device(dev);
1662         int pwm = to_sensor_dev_attr_2(devattr)->index;
1663         int point = to_sensor_dev_attr_2(devattr)->nr;
1664
1665         mutex_lock(&data->update_lock);
1666         if (data->pwm_enable & (1 << (2 * pwm))) {
1667                 /* PWM mode */
1668                 result = data->pwm_auto_point_pwm[pwm][point];
1669         } else {
1670                 /* RPM mode */
1671                 result = 32 * 255 / (32 + data->pwm_auto_point_pwm[pwm][point]);
1672         }
1673         mutex_unlock(&data->update_lock);
1674
1675         return sprintf(buf, "%d\n", result);
1676 }
1677
1678 static ssize_t store_pwm_auto_point_pwm(struct device *dev,
1679                                         struct device_attribute *devattr,
1680                                         const char *buf, size_t count)
1681 {
1682         struct f71882fg_data *data = dev_get_drvdata(dev);
1683         int err, pwm = to_sensor_dev_attr_2(devattr)->index;
1684         int point = to_sensor_dev_attr_2(devattr)->nr;
1685         long val;
1686
1687         err = strict_strtol(buf, 10, &val);
1688         if (err)
1689                 return err;
1690
1691         val = SENSORS_LIMIT(val, 0, 255);
1692
1693         mutex_lock(&data->update_lock);
1694         data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1695         if (data->pwm_enable & (1 << (2 * pwm))) {
1696                 /* PWM mode */
1697         } else {
1698                 /* RPM mode */
1699                 if (val < 29)   /* Prevent negative numbers */
1700                         val = 255;
1701                 else
1702                         val = (255 - val) * 32 / val;
1703         }
1704         f71882fg_write8(data, F71882FG_REG_POINT_PWM(pwm, point), val);
1705         data->pwm_auto_point_pwm[pwm][point] = val;
1706         mutex_unlock(&data->update_lock);
1707
1708         return count;
1709 }
1710
1711 static ssize_t show_pwm_auto_point_temp_hyst(struct device *dev,
1712                                              struct device_attribute *devattr,
1713                                              char *buf)
1714 {
1715         int result = 0;
1716         struct f71882fg_data *data = f71882fg_update_device(dev);
1717         int nr = to_sensor_dev_attr_2(devattr)->index;
1718         int point = to_sensor_dev_attr_2(devattr)->nr;
1719
1720         mutex_lock(&data->update_lock);
1721         if (nr & 1)
1722                 result = data->pwm_auto_point_hyst[nr / 2] >> 4;
1723         else
1724                 result = data->pwm_auto_point_hyst[nr / 2] & 0x0f;
1725         result = 1000 * (data->pwm_auto_point_temp[nr][point] - result);
1726         mutex_unlock(&data->update_lock);
1727
1728         return sprintf(buf, "%d\n", result);
1729 }
1730
1731 static ssize_t store_pwm_auto_point_temp_hyst(struct device *dev,
1732                                               struct device_attribute *devattr,
1733                                               const char *buf, size_t count)
1734 {
1735         struct f71882fg_data *data = dev_get_drvdata(dev);
1736         int err, nr = to_sensor_dev_attr_2(devattr)->index;
1737         int point = to_sensor_dev_attr_2(devattr)->nr;
1738         u8 reg;
1739         long val;
1740
1741         err = strict_strtol(buf, 10, &val);
1742         if (err)
1743                 return err;
1744
1745         val /= 1000;
1746
1747         mutex_lock(&data->update_lock);
1748         data->pwm_auto_point_temp[nr][point] =
1749                 f71882fg_read8(data, F71882FG_REG_POINT_TEMP(nr, point));
1750         val = SENSORS_LIMIT(val, data->pwm_auto_point_temp[nr][point] - 15,
1751                                 data->pwm_auto_point_temp[nr][point]);
1752         val = data->pwm_auto_point_temp[nr][point] - val;
1753
1754         reg = f71882fg_read8(data, F71882FG_REG_FAN_HYST(nr / 2));
1755         if (nr & 1)
1756                 reg = (reg & 0x0f) | (val << 4);
1757         else
1758                 reg = (reg & 0xf0) | val;
1759
1760         f71882fg_write8(data, F71882FG_REG_FAN_HYST(nr / 2), reg);
1761         data->pwm_auto_point_hyst[nr / 2] = reg;
1762         mutex_unlock(&data->update_lock);
1763
1764         return count;
1765 }
1766
1767 static ssize_t show_pwm_interpolate(struct device *dev,
1768                                     struct device_attribute *devattr, char *buf)
1769 {
1770         int result;
1771         struct f71882fg_data *data = f71882fg_update_device(dev);
1772         int nr = to_sensor_dev_attr_2(devattr)->index;
1773
1774         result = (data->pwm_auto_point_mapping[nr] >> 4) & 1;
1775
1776         return sprintf(buf, "%d\n", result);
1777 }
1778
1779 static ssize_t store_pwm_interpolate(struct device *dev,
1780                                      struct device_attribute *devattr,
1781                                      const char *buf, size_t count)
1782 {
1783         struct f71882fg_data *data = dev_get_drvdata(dev);
1784         int err, nr = to_sensor_dev_attr_2(devattr)->index;
1785         unsigned long val;
1786
1787         err = strict_strtoul(buf, 10, &val);
1788         if (err)
1789                 return err;
1790
1791         mutex_lock(&data->update_lock);
1792         data->pwm_auto_point_mapping[nr] =
1793                 f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr));
1794         if (val)
1795                 val = data->pwm_auto_point_mapping[nr] | (1 << 4);
1796         else
1797                 val = data->pwm_auto_point_mapping[nr] & (~(1 << 4));
1798         f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val);
1799         data->pwm_auto_point_mapping[nr] = val;
1800         mutex_unlock(&data->update_lock);
1801
1802         return count;
1803 }
1804
1805 static ssize_t show_pwm_auto_point_channel(struct device *dev,
1806                                            struct device_attribute *devattr,
1807                                            char *buf)
1808 {
1809         int result;
1810         struct f71882fg_data *data = f71882fg_update_device(dev);
1811         int nr = to_sensor_dev_attr_2(devattr)->index;
1812
1813         result = 1 << ((data->pwm_auto_point_mapping[nr] & 3) -
1814                        data->temp_start);
1815
1816         return sprintf(buf, "%d\n", result);
1817 }
1818
1819 static ssize_t store_pwm_auto_point_channel(struct device *dev,
1820                                             struct device_attribute *devattr,
1821                                             const char *buf, size_t count)
1822 {
1823         struct f71882fg_data *data = dev_get_drvdata(dev);
1824         int err, nr = to_sensor_dev_attr_2(devattr)->index;
1825         long val;
1826
1827         err = strict_strtol(buf, 10, &val);
1828         if (err)
1829                 return err;
1830
1831         switch (val) {
1832         case 1:
1833                 val = 0;
1834                 break;
1835         case 2:
1836                 val = 1;
1837                 break;
1838         case 4:
1839                 val = 2;
1840                 break;
1841         default:
1842                 return -EINVAL;
1843         }
1844         val += data->temp_start;
1845         mutex_lock(&data->update_lock);
1846         data->pwm_auto_point_mapping[nr] =
1847                 f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr));
1848         val = (data->pwm_auto_point_mapping[nr] & 0xfc) | val;
1849         f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val);
1850         data->pwm_auto_point_mapping[nr] = val;
1851         mutex_unlock(&data->update_lock);
1852
1853         return count;
1854 }
1855
1856 static ssize_t show_pwm_auto_point_temp(struct device *dev,
1857                                         struct device_attribute *devattr,
1858                                         char *buf)
1859 {
1860         int result;
1861         struct f71882fg_data *data = f71882fg_update_device(dev);
1862         int pwm = to_sensor_dev_attr_2(devattr)->index;
1863         int point = to_sensor_dev_attr_2(devattr)->nr;
1864
1865         result = data->pwm_auto_point_temp[pwm][point];
1866         return sprintf(buf, "%d\n", 1000 * result);
1867 }
1868
1869 static ssize_t store_pwm_auto_point_temp(struct device *dev,
1870                                          struct device_attribute *devattr,
1871                                          const char *buf, size_t count)
1872 {
1873         struct f71882fg_data *data = dev_get_drvdata(dev);
1874         int err, pwm = to_sensor_dev_attr_2(devattr)->index;
1875         int point = to_sensor_dev_attr_2(devattr)->nr;
1876         long val;
1877
1878         err = strict_strtol(buf, 10, &val);
1879         if (err)
1880                 return err;
1881
1882         val /= 1000;
1883
1884         if (data->type == f71889fg)
1885                 val = SENSORS_LIMIT(val, -128, 127);
1886         else
1887                 val = SENSORS_LIMIT(val, 0, 127);
1888
1889         mutex_lock(&data->update_lock);
1890         f71882fg_write8(data, F71882FG_REG_POINT_TEMP(pwm, point), val);
1891         data->pwm_auto_point_temp[pwm][point] = val;
1892         mutex_unlock(&data->update_lock);
1893
1894         return count;
1895 }
1896
1897 static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
1898         char *buf)
1899 {
1900         struct f71882fg_data *data = dev_get_drvdata(dev);
1901         return sprintf(buf, "%s\n", f71882fg_names[data->type]);
1902 }
1903
1904 static int __devinit f71882fg_create_sysfs_files(struct platform_device *pdev,
1905         struct sensor_device_attribute_2 *attr, int count)
1906 {
1907         int err, i;
1908
1909         for (i = 0; i < count; i++) {
1910                 err = device_create_file(&pdev->dev, &attr[i].dev_attr);
1911                 if (err)
1912                         return err;
1913         }
1914         return 0;
1915 }
1916
1917 static void f71882fg_remove_sysfs_files(struct platform_device *pdev,
1918         struct sensor_device_attribute_2 *attr, int count)
1919 {
1920         int i;
1921
1922         for (i = 0; i < count; i++)
1923                 device_remove_file(&pdev->dev, &attr[i].dev_attr);
1924 }
1925
1926 static int __devinit f71882fg_probe(struct platform_device *pdev)
1927 {
1928         struct f71882fg_data *data;
1929         struct f71882fg_sio_data *sio_data = pdev->dev.platform_data;
1930         int err, i, nr_fans = (sio_data->type == f71882fg) ? 4 : 3;
1931         u8 start_reg;
1932
1933         data = kzalloc(sizeof(struct f71882fg_data), GFP_KERNEL);
1934         if (!data)
1935                 return -ENOMEM;
1936
1937         data->addr = platform_get_resource(pdev, IORESOURCE_IO, 0)->start;
1938         data->type = sio_data->type;
1939         data->temp_start =
1940             (data->type == f71858fg || data->type == f8000) ? 0 : 1;
1941         mutex_init(&data->update_lock);
1942         platform_set_drvdata(pdev, data);
1943
1944         start_reg = f71882fg_read8(data, F71882FG_REG_START);
1945         if (start_reg & 0x04) {
1946                 dev_warn(&pdev->dev, "Hardware monitor is powered down\n");
1947                 err = -ENODEV;
1948                 goto exit_free;
1949         }
1950         if (!(start_reg & 0x03)) {
1951                 dev_warn(&pdev->dev, "Hardware monitoring not activated\n");
1952                 err = -ENODEV;
1953                 goto exit_free;
1954         }
1955
1956         /* Register sysfs interface files */
1957         err = device_create_file(&pdev->dev, &dev_attr_name);
1958         if (err)
1959                 goto exit_unregister_sysfs;
1960
1961         if (start_reg & 0x01) {
1962                 switch (data->type) {
1963                 case f71858fg:
1964                         data->temp_config =
1965                                 f71882fg_read8(data, F71882FG_REG_TEMP_CONFIG);
1966                         if (data->temp_config & 0x10)
1967                                 /* The f71858fg temperature alarms behave as
1968                                    the f8000 alarms in this mode */
1969                                 err = f71882fg_create_sysfs_files(pdev,
1970                                         f8000_in_temp_attr,
1971                                         ARRAY_SIZE(f8000_in_temp_attr));
1972                         else
1973                                 err = f71882fg_create_sysfs_files(pdev,
1974                                         f71858fg_in_temp_attr,
1975                                         ARRAY_SIZE(f71858fg_in_temp_attr));
1976                         break;
1977                 case f71882fg:
1978                 case f71889fg:
1979                         err = f71882fg_create_sysfs_files(pdev,
1980                                         fxxxx_in1_alarm_attr,
1981                                         ARRAY_SIZE(fxxxx_in1_alarm_attr));
1982                         if (err)
1983                                 goto exit_unregister_sysfs;
1984                         /* fall through! */
1985                 case f71862fg:
1986                         err = f71882fg_create_sysfs_files(pdev,
1987                                         fxxxx_in_temp_attr,
1988                                         ARRAY_SIZE(fxxxx_in_temp_attr));
1989                         break;
1990                 case f8000:
1991                         err = f71882fg_create_sysfs_files(pdev,
1992                                         f8000_in_temp_attr,
1993                                         ARRAY_SIZE(f8000_in_temp_attr));
1994                         break;
1995                 }
1996                 if (err)
1997                         goto exit_unregister_sysfs;
1998         }
1999
2000         if (start_reg & 0x02) {
2001                 data->pwm_enable =
2002                         f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
2003
2004                 /* Sanity check the pwm settings */
2005                 switch (data->type) {
2006                 case f71858fg:
2007                         err = 0;
2008                         for (i = 0; i < nr_fans; i++)
2009                                 if (((data->pwm_enable >> (i * 2)) & 3) == 3)
2010                                         err = 1;
2011                         break;
2012                 case f71862fg:
2013                         err = (data->pwm_enable & 0x15) != 0x15;
2014                         break;
2015                 case f71882fg:
2016                 case f71889fg:
2017                         err = 0;
2018                         break;
2019                 case f8000:
2020                         err = data->pwm_enable & 0x20;
2021                         break;
2022                 }
2023                 if (err) {
2024                         dev_err(&pdev->dev,
2025                                 "Invalid (reserved) pwm settings: 0x%02x\n",
2026                                 (unsigned int)data->pwm_enable);
2027                         err = -ENODEV;
2028                         goto exit_unregister_sysfs;
2029                 }
2030
2031                 err = f71882fg_create_sysfs_files(pdev, &fxxxx_fan_attr[0][0],
2032                                 ARRAY_SIZE(fxxxx_fan_attr[0]) * nr_fans);
2033                 if (err)
2034                         goto exit_unregister_sysfs;
2035
2036                 if (data->type == f71862fg || data->type == f71882fg ||
2037                     data->type == f71889fg) {
2038                         err = f71882fg_create_sysfs_files(pdev,
2039                                         fxxxx_fan_beep_attr, nr_fans);
2040                         if (err)
2041                                 goto exit_unregister_sysfs;
2042                 }
2043
2044                 switch (data->type) {
2045                 case f71862fg:
2046                         err = f71882fg_create_sysfs_files(pdev,
2047                                         f71862fg_auto_pwm_attr,
2048                                         ARRAY_SIZE(f71862fg_auto_pwm_attr));
2049                         break;
2050                 case f8000:
2051                         err = f71882fg_create_sysfs_files(pdev,
2052                                         f8000_fan_attr,
2053                                         ARRAY_SIZE(f8000_fan_attr));
2054                         if (err)
2055                                 goto exit_unregister_sysfs;
2056                         err = f71882fg_create_sysfs_files(pdev,
2057                                         f8000_auto_pwm_attr,
2058                                         ARRAY_SIZE(f8000_auto_pwm_attr));
2059                         break;
2060                 case f71889fg:
2061                         for (i = 0; i < nr_fans; i++) {
2062                                 data->pwm_auto_point_mapping[i] =
2063                                         f71882fg_read8(data,
2064                                                 F71882FG_REG_POINT_MAPPING(i));
2065                                 if (data->pwm_auto_point_mapping[i] & 0x80)
2066                                         break;
2067                         }
2068                         if (i != nr_fans) {
2069                                 dev_warn(&pdev->dev,
2070                                          "Auto pwm controlled by raw digital "
2071                                          "data, disabling pwm auto_point "
2072                                          "sysfs attributes\n");
2073                                 break;
2074                         }
2075                         /* fall through */
2076                 default: /* f71858fg / f71882fg */
2077                         err = f71882fg_create_sysfs_files(pdev,
2078                                 &fxxxx_auto_pwm_attr[0][0],
2079                                 ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans);
2080                 }
2081                 if (err)
2082                         goto exit_unregister_sysfs;
2083
2084                 for (i = 0; i < nr_fans; i++)
2085                         dev_info(&pdev->dev, "Fan: %d is in %s mode\n", i + 1,
2086                                  (data->pwm_enable & (1 << 2 * i)) ?
2087                                  "duty-cycle" : "RPM");
2088         }
2089
2090         data->hwmon_dev = hwmon_device_register(&pdev->dev);
2091         if (IS_ERR(data->hwmon_dev)) {
2092                 err = PTR_ERR(data->hwmon_dev);
2093                 data->hwmon_dev = NULL;
2094                 goto exit_unregister_sysfs;
2095         }
2096
2097         return 0;
2098
2099 exit_unregister_sysfs:
2100         f71882fg_remove(pdev); /* Will unregister the sysfs files for us */
2101         return err; /* f71882fg_remove() also frees our data */
2102 exit_free:
2103         kfree(data);
2104         return err;
2105 }
2106
2107 static int f71882fg_remove(struct platform_device *pdev)
2108 {
2109         struct f71882fg_data *data = platform_get_drvdata(pdev);
2110         int nr_fans = (data->type == f71882fg) ? 4 : 3;
2111         u8 start_reg = f71882fg_read8(data, F71882FG_REG_START);
2112
2113         platform_set_drvdata(pdev, NULL);
2114         if (data->hwmon_dev)
2115                 hwmon_device_unregister(data->hwmon_dev);
2116
2117         device_remove_file(&pdev->dev, &dev_attr_name);
2118
2119         if (start_reg & 0x01) {
2120                 switch (data->type) {
2121                 case f71858fg:
2122                         if (data->temp_config & 0x10)
2123                                 f71882fg_remove_sysfs_files(pdev,
2124                                         f8000_in_temp_attr,
2125                                         ARRAY_SIZE(f8000_in_temp_attr));
2126                         else
2127                                 f71882fg_remove_sysfs_files(pdev,
2128                                         f71858fg_in_temp_attr,
2129                                         ARRAY_SIZE(f71858fg_in_temp_attr));
2130                         break;
2131                 case f71882fg:
2132                 case f71889fg:
2133                         f71882fg_remove_sysfs_files(pdev,
2134                                         fxxxx_in1_alarm_attr,
2135                                         ARRAY_SIZE(fxxxx_in1_alarm_attr));
2136                         /* fall through! */
2137                 case f71862fg:
2138                         f71882fg_remove_sysfs_files(pdev,
2139                                         fxxxx_in_temp_attr,
2140                                         ARRAY_SIZE(fxxxx_in_temp_attr));
2141                         break;
2142                 case f8000:
2143                         f71882fg_remove_sysfs_files(pdev,
2144                                         f8000_in_temp_attr,
2145                                         ARRAY_SIZE(f8000_in_temp_attr));
2146                         break;
2147                 }
2148         }
2149
2150         if (start_reg & 0x02) {
2151                 f71882fg_remove_sysfs_files(pdev, &fxxxx_fan_attr[0][0],
2152                                 ARRAY_SIZE(fxxxx_fan_attr[0]) * nr_fans);
2153
2154                 if (data->type == f71862fg || data->type == f71882fg ||
2155                     data->type == f71889fg)
2156                         f71882fg_remove_sysfs_files(pdev,
2157                                         fxxxx_fan_beep_attr, nr_fans);
2158
2159                 switch (data->type) {
2160                 case f71862fg:
2161                         f71882fg_remove_sysfs_files(pdev,
2162                                         f71862fg_auto_pwm_attr,
2163                                         ARRAY_SIZE(f71862fg_auto_pwm_attr));
2164                         break;
2165                 case f8000:
2166                         f71882fg_remove_sysfs_files(pdev,
2167                                         f8000_fan_attr,
2168                                         ARRAY_SIZE(f8000_fan_attr));
2169                         f71882fg_remove_sysfs_files(pdev,
2170                                         f8000_auto_pwm_attr,
2171                                         ARRAY_SIZE(f8000_auto_pwm_attr));
2172                         break;
2173                 default: /* f71858fg / f71882fg / f71889fg */
2174                         f71882fg_remove_sysfs_files(pdev,
2175                                 &fxxxx_auto_pwm_attr[0][0],
2176                                 ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans);
2177                 }
2178         }
2179
2180         kfree(data);
2181
2182         return 0;
2183 }
2184
2185 static int __init f71882fg_find(int sioaddr, unsigned short *address,
2186         struct f71882fg_sio_data *sio_data)
2187 {
2188         u16 devid;
2189         int err = superio_enter(sioaddr);
2190         if (err)
2191                 return err;
2192
2193         devid = superio_inw(sioaddr, SIO_REG_MANID);
2194         if (devid != SIO_FINTEK_ID) {
2195                 pr_debug(DRVNAME ": Not a Fintek device\n");
2196                 err = -ENODEV;
2197                 goto exit;
2198         }
2199
2200         devid = force_id ? force_id : superio_inw(sioaddr, SIO_REG_DEVID);
2201         switch (devid) {
2202         case SIO_F71858_ID:
2203                 sio_data->type = f71858fg;
2204                 break;
2205         case SIO_F71862_ID:
2206                 sio_data->type = f71862fg;
2207                 break;
2208         case SIO_F71882_ID:
2209                 sio_data->type = f71882fg;
2210                 break;
2211         case SIO_F71889_ID:
2212                 sio_data->type = f71889fg;
2213                 break;
2214         case SIO_F8000_ID:
2215                 sio_data->type = f8000;
2216                 break;
2217         default:
2218                 printk(KERN_INFO DRVNAME ": Unsupported Fintek device: %04x\n",
2219                        (unsigned int)devid);
2220                 err = -ENODEV;
2221                 goto exit;
2222         }
2223
2224         if (sio_data->type == f71858fg)
2225                 superio_select(sioaddr, SIO_F71858FG_LD_HWM);
2226         else
2227                 superio_select(sioaddr, SIO_F71882FG_LD_HWM);
2228
2229         if (!(superio_inb(sioaddr, SIO_REG_ENABLE) & 0x01)) {
2230                 printk(KERN_WARNING DRVNAME ": Device not activated\n");
2231                 err = -ENODEV;
2232                 goto exit;
2233         }
2234
2235         *address = superio_inw(sioaddr, SIO_REG_ADDR);
2236         if (*address == 0) {
2237                 printk(KERN_WARNING DRVNAME ": Base address not set\n");
2238                 err = -ENODEV;
2239                 goto exit;
2240         }
2241         *address &= ~(REGION_LENGTH - 1);       /* Ignore 3 LSB */
2242
2243         err = 0;
2244         printk(KERN_INFO DRVNAME ": Found %s chip at %#x, revision %d\n",
2245                 f71882fg_names[sio_data->type], (unsigned int)*address,
2246                 (int)superio_inb(sioaddr, SIO_REG_DEVREV));
2247 exit:
2248         superio_exit(sioaddr);
2249         return err;
2250 }
2251
2252 static int __init f71882fg_device_add(unsigned short address,
2253         const struct f71882fg_sio_data *sio_data)
2254 {
2255         struct resource res = {
2256                 .start  = address,
2257                 .end    = address + REGION_LENGTH - 1,
2258                 .flags  = IORESOURCE_IO,
2259         };
2260         int err;
2261
2262         f71882fg_pdev = platform_device_alloc(DRVNAME, address);
2263         if (!f71882fg_pdev)
2264                 return -ENOMEM;
2265
2266         res.name = f71882fg_pdev->name;
2267         err = acpi_check_resource_conflict(&res);
2268         if (err)
2269                 goto exit_device_put;
2270
2271         err = platform_device_add_resources(f71882fg_pdev, &res, 1);
2272         if (err) {
2273                 printk(KERN_ERR DRVNAME ": Device resource addition failed\n");
2274                 goto exit_device_put;
2275         }
2276
2277         err = platform_device_add_data(f71882fg_pdev, sio_data,
2278                                        sizeof(struct f71882fg_sio_data));
2279         if (err) {
2280                 printk(KERN_ERR DRVNAME ": Platform data allocation failed\n");
2281                 goto exit_device_put;
2282         }
2283
2284         err = platform_device_add(f71882fg_pdev);
2285         if (err) {
2286                 printk(KERN_ERR DRVNAME ": Device addition failed\n");
2287                 goto exit_device_put;
2288         }
2289
2290         return 0;
2291
2292 exit_device_put:
2293         platform_device_put(f71882fg_pdev);
2294
2295         return err;
2296 }
2297
2298 static int __init f71882fg_init(void)
2299 {
2300         int err = -ENODEV;
2301         unsigned short address;
2302         struct f71882fg_sio_data sio_data;
2303
2304         memset(&sio_data, 0, sizeof(sio_data));
2305
2306         if (f71882fg_find(0x2e, &address, &sio_data) &&
2307             f71882fg_find(0x4e, &address, &sio_data))
2308                 goto exit;
2309
2310         err = platform_driver_register(&f71882fg_driver);
2311         if (err)
2312                 goto exit;
2313
2314         err = f71882fg_device_add(address, &sio_data);
2315         if (err)
2316                 goto exit_driver;
2317
2318         return 0;
2319
2320 exit_driver:
2321         platform_driver_unregister(&f71882fg_driver);
2322 exit:
2323         return err;
2324 }
2325
2326 static void __exit f71882fg_exit(void)
2327 {
2328         platform_device_unregister(f71882fg_pdev);
2329         platform_driver_unregister(&f71882fg_driver);
2330 }
2331
2332 MODULE_DESCRIPTION("F71882FG Hardware Monitoring Driver");
2333 MODULE_AUTHOR("Hans Edgington, Hans de Goede (hdegoede@redhat.com)");
2334 MODULE_LICENSE("GPL");
2335
2336 module_init(f71882fg_init);
2337 module_exit(f71882fg_exit);