Version:  2.0.40 2.2.26 2.4.37 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1 4.2

Linux/drivers/hwmon/f71882fg.c

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

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us