ide: another possible ide panic fix for blk-end-request
[linux-2.6] / drivers / hwmon / f71805f.c
1 /*
2  * f71805f.c - driver for the Fintek F71805F/FG and F71872F/FG Super-I/O
3  *             chips integrated hardware monitoring features
4  * Copyright (C) 2005-2006  Jean Delvare <khali@linux-fr.org>
5  *
6  * The F71805F/FG is a LPC Super-I/O chip made by Fintek. It integrates
7  * complete hardware monitoring features: voltage, fan and temperature
8  * sensors, and manual and automatic fan speed control.
9  *
10  * The F71872F/FG is almost the same, with two more voltages monitored,
11  * and 6 VID inputs.
12  *
13  * The F71806F/FG is essentially the same as the F71872F/FG. It even has
14  * the same chip ID, so the driver can't differentiate between.
15  *
16  * This program is free software; you can redistribute it and/or modify
17  * it under the terms of the GNU General Public License as published by
18  * the Free Software Foundation; either version 2 of the License, or
19  * (at your option) any later version.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU General Public License
27  * along with this program; if not, write to the Free Software
28  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29  */
30
31 #include <linux/module.h>
32 #include <linux/init.h>
33 #include <linux/slab.h>
34 #include <linux/jiffies.h>
35 #include <linux/platform_device.h>
36 #include <linux/hwmon.h>
37 #include <linux/hwmon-sysfs.h>
38 #include <linux/err.h>
39 #include <linux/mutex.h>
40 #include <linux/sysfs.h>
41 #include <linux/ioport.h>
42 #include <asm/io.h>
43
44 static unsigned short force_id;
45 module_param(force_id, ushort, 0);
46 MODULE_PARM_DESC(force_id, "Override the detected device ID");
47
48 static struct platform_device *pdev;
49
50 #define DRVNAME "f71805f"
51 enum kinds { f71805f, f71872f };
52
53 /*
54  * Super-I/O constants and functions
55  */
56
57 #define F71805F_LD_HWM          0x04
58
59 #define SIO_REG_LDSEL           0x07    /* Logical device select */
60 #define SIO_REG_DEVID           0x20    /* Device ID (2 bytes) */
61 #define SIO_REG_DEVREV          0x22    /* Device revision */
62 #define SIO_REG_MANID           0x23    /* Fintek ID (2 bytes) */
63 #define SIO_REG_FNSEL1          0x29    /* Multi Function Select 1 (F71872F) */
64 #define SIO_REG_ENABLE          0x30    /* Logical device enable */
65 #define SIO_REG_ADDR            0x60    /* Logical device address (2 bytes) */
66
67 #define SIO_FINTEK_ID           0x1934
68 #define SIO_F71805F_ID          0x0406
69 #define SIO_F71872F_ID          0x0341
70
71 static inline int
72 superio_inb(int base, int reg)
73 {
74         outb(reg, base);
75         return inb(base + 1);
76 }
77
78 static int
79 superio_inw(int base, int reg)
80 {
81         int val;
82         outb(reg++, base);
83         val = inb(base + 1) << 8;
84         outb(reg, base);
85         val |= inb(base + 1);
86         return val;
87 }
88
89 static inline void
90 superio_select(int base, int ld)
91 {
92         outb(SIO_REG_LDSEL, base);
93         outb(ld, base + 1);
94 }
95
96 static inline void
97 superio_enter(int base)
98 {
99         outb(0x87, base);
100         outb(0x87, base);
101 }
102
103 static inline void
104 superio_exit(int base)
105 {
106         outb(0xaa, base);
107 }
108
109 /*
110  * ISA constants
111  */
112
113 #define REGION_LENGTH           8
114 #define ADDR_REG_OFFSET         5
115 #define DATA_REG_OFFSET         6
116
117 /*
118  * Registers
119  */
120
121 /* in nr from 0 to 10 (8-bit values) */
122 #define F71805F_REG_IN(nr)              (0x10 + (nr))
123 #define F71805F_REG_IN_HIGH(nr)         ((nr) < 10 ? 0x40 + 2 * (nr) : 0x2E)
124 #define F71805F_REG_IN_LOW(nr)          ((nr) < 10 ? 0x41 + 2 * (nr) : 0x2F)
125 /* fan nr from 0 to 2 (12-bit values, two registers) */
126 #define F71805F_REG_FAN(nr)             (0x20 + 2 * (nr))
127 #define F71805F_REG_FAN_LOW(nr)         (0x28 + 2 * (nr))
128 #define F71805F_REG_FAN_TARGET(nr)      (0x69 + 16 * (nr))
129 #define F71805F_REG_FAN_CTRL(nr)        (0x60 + 16 * (nr))
130 #define F71805F_REG_PWM_FREQ(nr)        (0x63 + 16 * (nr))
131 #define F71805F_REG_PWM_DUTY(nr)        (0x6B + 16 * (nr))
132 /* temp nr from 0 to 2 (8-bit values) */
133 #define F71805F_REG_TEMP(nr)            (0x1B + (nr))
134 #define F71805F_REG_TEMP_HIGH(nr)       (0x54 + 2 * (nr))
135 #define F71805F_REG_TEMP_HYST(nr)       (0x55 + 2 * (nr))
136 #define F71805F_REG_TEMP_MODE           0x01
137 /* pwm/fan pwmnr from 0 to 2, auto point apnr from 0 to 2 */
138 /* map Fintek numbers to our numbers as follows: 9->0, 5->1, 1->2 */
139 #define F71805F_REG_PWM_AUTO_POINT_TEMP(pwmnr, apnr) \
140                                         (0xA0 + 0x10 * (pwmnr) + (2 - (apnr)))
141 #define F71805F_REG_PWM_AUTO_POINT_FAN(pwmnr, apnr) \
142                                         (0xA4 + 0x10 * (pwmnr) + \
143                                                 2 * (2 - (apnr)))
144
145 #define F71805F_REG_START               0x00
146 /* status nr from 0 to 2 */
147 #define F71805F_REG_STATUS(nr)          (0x36 + (nr))
148
149 /* individual register bits */
150 #define FAN_CTRL_DC_MODE                0x10
151 #define FAN_CTRL_LATCH_FULL             0x08
152 #define FAN_CTRL_MODE_MASK              0x03
153 #define FAN_CTRL_MODE_SPEED             0x00
154 #define FAN_CTRL_MODE_TEMPERATURE       0x01
155 #define FAN_CTRL_MODE_MANUAL            0x02
156
157 /*
158  * Data structures and manipulation thereof
159  */
160
161 struct f71805f_auto_point {
162         u8 temp[3];
163         u16 fan[3];
164 };
165
166 struct f71805f_data {
167         unsigned short addr;
168         const char *name;
169         struct device *hwmon_dev;
170
171         struct mutex update_lock;
172         char valid;             /* !=0 if following fields are valid */
173         unsigned long last_updated;     /* In jiffies */
174         unsigned long last_limits;      /* In jiffies */
175
176         /* Register values */
177         u8 in[11];
178         u8 in_high[11];
179         u8 in_low[11];
180         u16 has_in;
181         u16 fan[3];
182         u16 fan_low[3];
183         u16 fan_target[3];
184         u8 fan_ctrl[3];
185         u8 pwm[3];
186         u8 pwm_freq[3];
187         u8 temp[3];
188         u8 temp_high[3];
189         u8 temp_hyst[3];
190         u8 temp_mode;
191         unsigned long alarms;
192         struct f71805f_auto_point auto_points[3];
193 };
194
195 struct f71805f_sio_data {
196         enum kinds kind;
197         u8 fnsel1;
198 };
199
200 static inline long in_from_reg(u8 reg)
201 {
202         return (reg * 8);
203 }
204
205 /* The 2 least significant bits are not used */
206 static inline u8 in_to_reg(long val)
207 {
208         if (val <= 0)
209                 return 0;
210         if (val >= 2016)
211                 return 0xfc;
212         return (((val + 16) / 32) << 2);
213 }
214
215 /* in0 is downscaled by a factor 2 internally */
216 static inline long in0_from_reg(u8 reg)
217 {
218         return (reg * 16);
219 }
220
221 static inline u8 in0_to_reg(long val)
222 {
223         if (val <= 0)
224                 return 0;
225         if (val >= 4032)
226                 return 0xfc;
227         return (((val + 32) / 64) << 2);
228 }
229
230 /* The 4 most significant bits are not used */
231 static inline long fan_from_reg(u16 reg)
232 {
233         reg &= 0xfff;
234         if (!reg || reg == 0xfff)
235                 return 0;
236         return (1500000 / reg);
237 }
238
239 static inline u16 fan_to_reg(long rpm)
240 {
241         /* If the low limit is set below what the chip can measure,
242            store the largest possible 12-bit value in the registers,
243            so that no alarm will ever trigger. */
244         if (rpm < 367)
245                 return 0xfff;
246         return (1500000 / rpm);
247 }
248
249 static inline unsigned long pwm_freq_from_reg(u8 reg)
250 {
251         unsigned long clock = (reg & 0x80) ? 48000000UL : 1000000UL;
252
253         reg &= 0x7f;
254         if (reg == 0)
255                 reg++;
256         return clock / (reg << 8);
257 }
258
259 static inline u8 pwm_freq_to_reg(unsigned long val)
260 {
261         if (val >= 187500)      /* The highest we can do */
262                 return 0x80;
263         if (val >= 1475)        /* Use 48 MHz clock */
264                 return 0x80 | (48000000UL / (val << 8));
265         if (val < 31)           /* The lowest we can do */
266                 return 0x7f;
267         else                    /* Use 1 MHz clock */
268                 return 1000000UL / (val << 8);
269 }
270
271 static inline int pwm_mode_from_reg(u8 reg)
272 {
273         return !(reg & FAN_CTRL_DC_MODE);
274 }
275
276 static inline long temp_from_reg(u8 reg)
277 {
278         return (reg * 1000);
279 }
280
281 static inline u8 temp_to_reg(long val)
282 {
283         if (val < 0)
284                 val = 0;
285         else if (val > 1000 * 0xff)
286                 val = 0xff;
287         return ((val + 500) / 1000);
288 }
289
290 /*
291  * Device I/O access
292  */
293
294 /* Must be called with data->update_lock held, except during initialization */
295 static u8 f71805f_read8(struct f71805f_data *data, u8 reg)
296 {
297         outb(reg, data->addr + ADDR_REG_OFFSET);
298         return inb(data->addr + DATA_REG_OFFSET);
299 }
300
301 /* Must be called with data->update_lock held, except during initialization */
302 static void f71805f_write8(struct f71805f_data *data, u8 reg, u8 val)
303 {
304         outb(reg, data->addr + ADDR_REG_OFFSET);
305         outb(val, data->addr + DATA_REG_OFFSET);
306 }
307
308 /* It is important to read the MSB first, because doing so latches the
309    value of the LSB, so we are sure both bytes belong to the same value.
310    Must be called with data->update_lock held, except during initialization */
311 static u16 f71805f_read16(struct f71805f_data *data, u8 reg)
312 {
313         u16 val;
314
315         outb(reg, data->addr + ADDR_REG_OFFSET);
316         val = inb(data->addr + DATA_REG_OFFSET) << 8;
317         outb(++reg, data->addr + ADDR_REG_OFFSET);
318         val |= inb(data->addr + DATA_REG_OFFSET);
319
320         return val;
321 }
322
323 /* Must be called with data->update_lock held, except during initialization */
324 static void f71805f_write16(struct f71805f_data *data, u8 reg, u16 val)
325 {
326         outb(reg, data->addr + ADDR_REG_OFFSET);
327         outb(val >> 8, data->addr + DATA_REG_OFFSET);
328         outb(++reg, data->addr + ADDR_REG_OFFSET);
329         outb(val & 0xff, data->addr + DATA_REG_OFFSET);
330 }
331
332 static struct f71805f_data *f71805f_update_device(struct device *dev)
333 {
334         struct f71805f_data *data = dev_get_drvdata(dev);
335         int nr, apnr;
336
337         mutex_lock(&data->update_lock);
338
339         /* Limit registers cache is refreshed after 60 seconds */
340         if (time_after(jiffies, data->last_updated + 60 * HZ)
341          || !data->valid) {
342                 for (nr = 0; nr < 11; nr++) {
343                         if (!(data->has_in & (1 << nr)))
344                                 continue;
345                         data->in_high[nr] = f71805f_read8(data,
346                                             F71805F_REG_IN_HIGH(nr));
347                         data->in_low[nr] = f71805f_read8(data,
348                                            F71805F_REG_IN_LOW(nr));
349                 }
350                 for (nr = 0; nr < 3; nr++) {
351                         data->fan_low[nr] = f71805f_read16(data,
352                                             F71805F_REG_FAN_LOW(nr));
353                         data->fan_target[nr] = f71805f_read16(data,
354                                                F71805F_REG_FAN_TARGET(nr));
355                         data->pwm_freq[nr] = f71805f_read8(data,
356                                              F71805F_REG_PWM_FREQ(nr));
357                 }
358                 for (nr = 0; nr < 3; nr++) {
359                         data->temp_high[nr] = f71805f_read8(data,
360                                               F71805F_REG_TEMP_HIGH(nr));
361                         data->temp_hyst[nr] = f71805f_read8(data,
362                                               F71805F_REG_TEMP_HYST(nr));
363                 }
364                 data->temp_mode = f71805f_read8(data, F71805F_REG_TEMP_MODE);
365                 for (nr = 0; nr < 3; nr++) {
366                         for (apnr = 0; apnr < 3; apnr++) {
367                                 data->auto_points[nr].temp[apnr] =
368                                         f71805f_read8(data,
369                                         F71805F_REG_PWM_AUTO_POINT_TEMP(nr,
370                                                                         apnr));
371                                 data->auto_points[nr].fan[apnr] =
372                                         f71805f_read16(data,
373                                         F71805F_REG_PWM_AUTO_POINT_FAN(nr,
374                                                                        apnr));
375                         }
376                 }
377
378                 data->last_limits = jiffies;
379         }
380
381         /* Measurement registers cache is refreshed after 1 second */
382         if (time_after(jiffies, data->last_updated + HZ)
383          || !data->valid) {
384                 for (nr = 0; nr < 11; nr++) {
385                         if (!(data->has_in & (1 << nr)))
386                                 continue;
387                         data->in[nr] = f71805f_read8(data,
388                                        F71805F_REG_IN(nr));
389                 }
390                 for (nr = 0; nr < 3; nr++) {
391                         data->fan[nr] = f71805f_read16(data,
392                                         F71805F_REG_FAN(nr));
393                         data->fan_ctrl[nr] = f71805f_read8(data,
394                                              F71805F_REG_FAN_CTRL(nr));
395                         data->pwm[nr] = f71805f_read8(data,
396                                         F71805F_REG_PWM_DUTY(nr));
397                 }
398                 for (nr = 0; nr < 3; nr++) {
399                         data->temp[nr] = f71805f_read8(data,
400                                          F71805F_REG_TEMP(nr));
401                 }
402                 data->alarms = f71805f_read8(data, F71805F_REG_STATUS(0))
403                         + (f71805f_read8(data, F71805F_REG_STATUS(1)) << 8)
404                         + (f71805f_read8(data, F71805F_REG_STATUS(2)) << 16);
405
406                 data->last_updated = jiffies;
407                 data->valid = 1;
408         }
409
410         mutex_unlock(&data->update_lock);
411
412         return data;
413 }
414
415 /*
416  * Sysfs interface
417  */
418
419 static ssize_t show_in0(struct device *dev, struct device_attribute *devattr,
420                         char *buf)
421 {
422         struct f71805f_data *data = f71805f_update_device(dev);
423         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
424         int nr = attr->index;
425
426         return sprintf(buf, "%ld\n", in0_from_reg(data->in[nr]));
427 }
428
429 static ssize_t show_in0_max(struct device *dev, struct device_attribute
430                             *devattr, char *buf)
431 {
432         struct f71805f_data *data = f71805f_update_device(dev);
433         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
434         int nr = attr->index;
435
436         return sprintf(buf, "%ld\n", in0_from_reg(data->in_high[nr]));
437 }
438
439 static ssize_t show_in0_min(struct device *dev, struct device_attribute
440                             *devattr, char *buf)
441 {
442         struct f71805f_data *data = f71805f_update_device(dev);
443         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
444         int nr = attr->index;
445
446         return sprintf(buf, "%ld\n", in0_from_reg(data->in_low[nr]));
447 }
448
449 static ssize_t set_in0_max(struct device *dev, struct device_attribute
450                            *devattr, const char *buf, size_t count)
451 {
452         struct f71805f_data *data = dev_get_drvdata(dev);
453         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
454         int nr = attr->index;
455         long val = simple_strtol(buf, NULL, 10);
456
457         mutex_lock(&data->update_lock);
458         data->in_high[nr] = in0_to_reg(val);
459         f71805f_write8(data, F71805F_REG_IN_HIGH(nr), data->in_high[nr]);
460         mutex_unlock(&data->update_lock);
461
462         return count;
463 }
464
465 static ssize_t set_in0_min(struct device *dev, struct device_attribute
466                            *devattr, const char *buf, size_t count)
467 {
468         struct f71805f_data *data = dev_get_drvdata(dev);
469         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
470         int nr = attr->index;
471         long val = simple_strtol(buf, NULL, 10);
472
473         mutex_lock(&data->update_lock);
474         data->in_low[nr] = in0_to_reg(val);
475         f71805f_write8(data, F71805F_REG_IN_LOW(nr), data->in_low[nr]);
476         mutex_unlock(&data->update_lock);
477
478         return count;
479 }
480
481 static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
482                        char *buf)
483 {
484         struct f71805f_data *data = f71805f_update_device(dev);
485         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
486         int nr = attr->index;
487
488         return sprintf(buf, "%ld\n", in_from_reg(data->in[nr]));
489 }
490
491 static ssize_t show_in_max(struct device *dev, struct device_attribute
492                            *devattr, char *buf)
493 {
494         struct f71805f_data *data = f71805f_update_device(dev);
495         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
496         int nr = attr->index;
497
498         return sprintf(buf, "%ld\n", in_from_reg(data->in_high[nr]));
499 }
500
501 static ssize_t show_in_min(struct device *dev, struct device_attribute
502                            *devattr, char *buf)
503 {
504         struct f71805f_data *data = f71805f_update_device(dev);
505         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
506         int nr = attr->index;
507
508         return sprintf(buf, "%ld\n", in_from_reg(data->in_low[nr]));
509 }
510
511 static ssize_t set_in_max(struct device *dev, struct device_attribute
512                           *devattr, const char *buf, size_t count)
513 {
514         struct f71805f_data *data = dev_get_drvdata(dev);
515         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
516         int nr = attr->index;
517         long val = simple_strtol(buf, NULL, 10);
518
519         mutex_lock(&data->update_lock);
520         data->in_high[nr] = in_to_reg(val);
521         f71805f_write8(data, F71805F_REG_IN_HIGH(nr), data->in_high[nr]);
522         mutex_unlock(&data->update_lock);
523
524         return count;
525 }
526
527 static ssize_t set_in_min(struct device *dev, struct device_attribute
528                           *devattr, const char *buf, size_t count)
529 {
530         struct f71805f_data *data = dev_get_drvdata(dev);
531         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
532         int nr = attr->index;
533         long val = simple_strtol(buf, NULL, 10);
534
535         mutex_lock(&data->update_lock);
536         data->in_low[nr] = in_to_reg(val);
537         f71805f_write8(data, F71805F_REG_IN_LOW(nr), data->in_low[nr]);
538         mutex_unlock(&data->update_lock);
539
540         return count;
541 }
542
543 static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
544                         char *buf)
545 {
546         struct f71805f_data *data = f71805f_update_device(dev);
547         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
548         int nr = attr->index;
549
550         return sprintf(buf, "%ld\n", fan_from_reg(data->fan[nr]));
551 }
552
553 static ssize_t show_fan_min(struct device *dev, struct device_attribute
554                             *devattr, char *buf)
555 {
556         struct f71805f_data *data = f71805f_update_device(dev);
557         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
558         int nr = attr->index;
559
560         return sprintf(buf, "%ld\n", fan_from_reg(data->fan_low[nr]));
561 }
562
563 static ssize_t show_fan_target(struct device *dev, struct device_attribute
564                                *devattr, char *buf)
565 {
566         struct f71805f_data *data = f71805f_update_device(dev);
567         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
568         int nr = attr->index;
569
570         return sprintf(buf, "%ld\n", fan_from_reg(data->fan_target[nr]));
571 }
572
573 static ssize_t set_fan_min(struct device *dev, struct device_attribute
574                            *devattr, const char *buf, size_t count)
575 {
576         struct f71805f_data *data = dev_get_drvdata(dev);
577         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
578         int nr = attr->index;
579         long val = simple_strtol(buf, NULL, 10);
580
581         mutex_lock(&data->update_lock);
582         data->fan_low[nr] = fan_to_reg(val);
583         f71805f_write16(data, F71805F_REG_FAN_LOW(nr), data->fan_low[nr]);
584         mutex_unlock(&data->update_lock);
585
586         return count;
587 }
588
589 static ssize_t set_fan_target(struct device *dev, struct device_attribute
590                               *devattr, const char *buf, size_t count)
591 {
592         struct f71805f_data *data = dev_get_drvdata(dev);
593         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
594         int nr = attr->index;
595         long val = simple_strtol(buf, NULL, 10);
596
597         mutex_lock(&data->update_lock);
598         data->fan_target[nr] = fan_to_reg(val);
599         f71805f_write16(data, F71805F_REG_FAN_TARGET(nr),
600                         data->fan_target[nr]);
601         mutex_unlock(&data->update_lock);
602
603         return count;
604 }
605
606 static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr,
607                         char *buf)
608 {
609         struct f71805f_data *data = f71805f_update_device(dev);
610         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
611         int nr = attr->index;
612
613         return sprintf(buf, "%d\n", (int)data->pwm[nr]);
614 }
615
616 static ssize_t show_pwm_enable(struct device *dev, struct device_attribute
617                                *devattr, char *buf)
618 {
619         struct f71805f_data *data = f71805f_update_device(dev);
620         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
621         int nr = attr->index;
622         int mode;
623
624         switch (data->fan_ctrl[nr] & FAN_CTRL_MODE_MASK) {
625         case FAN_CTRL_MODE_SPEED:
626                 mode = 3;
627                 break;
628         case FAN_CTRL_MODE_TEMPERATURE:
629                 mode = 2;
630                 break;
631         default: /* MANUAL */
632                 mode = 1;
633         }
634
635         return sprintf(buf, "%d\n", mode);
636 }
637
638 static ssize_t show_pwm_freq(struct device *dev, struct device_attribute
639                              *devattr, char *buf)
640 {
641         struct f71805f_data *data = f71805f_update_device(dev);
642         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
643         int nr = attr->index;
644
645         return sprintf(buf, "%lu\n", pwm_freq_from_reg(data->pwm_freq[nr]));
646 }
647
648 static ssize_t show_pwm_mode(struct device *dev, struct device_attribute
649                              *devattr, char *buf)
650 {
651         struct f71805f_data *data = f71805f_update_device(dev);
652         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
653         int nr = attr->index;
654
655         return sprintf(buf, "%d\n", pwm_mode_from_reg(data->fan_ctrl[nr]));
656 }
657
658 static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr,
659                        const char *buf, size_t count)
660 {
661         struct f71805f_data *data = dev_get_drvdata(dev);
662         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
663         int nr = attr->index;
664         unsigned long val = simple_strtoul(buf, NULL, 10);
665
666         if (val > 255)
667                 return -EINVAL;
668
669         mutex_lock(&data->update_lock);
670         data->pwm[nr] = val;
671         f71805f_write8(data, F71805F_REG_PWM_DUTY(nr), data->pwm[nr]);
672         mutex_unlock(&data->update_lock);
673
674         return count;
675 }
676
677 static struct attribute *f71805f_attr_pwm[];
678
679 static ssize_t set_pwm_enable(struct device *dev, struct device_attribute
680                               *devattr, const char *buf, size_t count)
681 {
682         struct f71805f_data *data = dev_get_drvdata(dev);
683         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
684         int nr = attr->index;
685         unsigned long val = simple_strtoul(buf, NULL, 10);
686         u8 reg;
687
688         if (val < 1 || val > 3)
689                 return -EINVAL;
690
691         if (val > 1) { /* Automatic mode, user can't set PWM value */
692                 if (sysfs_chmod_file(&dev->kobj, f71805f_attr_pwm[nr],
693                                      S_IRUGO))
694                         dev_dbg(dev, "chmod -w pwm%d failed\n", nr + 1);
695         }
696
697         mutex_lock(&data->update_lock);
698         reg = f71805f_read8(data, F71805F_REG_FAN_CTRL(nr))
699             & ~FAN_CTRL_MODE_MASK;
700         switch (val) {
701         case 1:
702                 reg |= FAN_CTRL_MODE_MANUAL;
703                 break;
704         case 2:
705                 reg |= FAN_CTRL_MODE_TEMPERATURE;
706                 break;
707         case 3:
708                 reg |= FAN_CTRL_MODE_SPEED;
709                 break;
710         }
711         data->fan_ctrl[nr] = reg;
712         f71805f_write8(data, F71805F_REG_FAN_CTRL(nr), reg);
713         mutex_unlock(&data->update_lock);
714
715         if (val == 1) { /* Manual mode, user can set PWM value */
716                 if (sysfs_chmod_file(&dev->kobj, f71805f_attr_pwm[nr],
717                                      S_IRUGO | S_IWUSR))
718                         dev_dbg(dev, "chmod +w pwm%d failed\n", nr + 1);
719         }
720
721         return count;
722 }
723
724 static ssize_t set_pwm_freq(struct device *dev, struct device_attribute
725                             *devattr, const char *buf, size_t count)
726 {
727         struct f71805f_data *data = dev_get_drvdata(dev);
728         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
729         int nr = attr->index;
730         unsigned long val = simple_strtoul(buf, NULL, 10);
731
732         mutex_lock(&data->update_lock);
733         data->pwm_freq[nr] = pwm_freq_to_reg(val);
734         f71805f_write8(data, F71805F_REG_PWM_FREQ(nr), data->pwm_freq[nr]);
735         mutex_unlock(&data->update_lock);
736
737         return count;
738 }
739
740 static ssize_t show_pwm_auto_point_temp(struct device *dev,
741                                         struct device_attribute *devattr,
742                                         char* buf)
743 {
744         struct f71805f_data *data = dev_get_drvdata(dev);
745         struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
746         int pwmnr = attr->nr;
747         int apnr = attr->index;
748
749         return sprintf(buf, "%ld\n",
750                        temp_from_reg(data->auto_points[pwmnr].temp[apnr]));
751 }
752
753 static ssize_t set_pwm_auto_point_temp(struct device *dev,
754                                        struct device_attribute *devattr,
755                                        const char* buf, size_t count)
756 {
757         struct f71805f_data *data = dev_get_drvdata(dev);
758         struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
759         int pwmnr = attr->nr;
760         int apnr = attr->index;
761         unsigned long val = simple_strtol(buf, NULL, 10);
762
763         mutex_lock(&data->update_lock);
764         data->auto_points[pwmnr].temp[apnr] = temp_to_reg(val);
765         f71805f_write8(data, F71805F_REG_PWM_AUTO_POINT_TEMP(pwmnr, apnr),
766                        data->auto_points[pwmnr].temp[apnr]);
767         mutex_unlock(&data->update_lock);
768
769         return count;
770 }
771
772 static ssize_t show_pwm_auto_point_fan(struct device *dev,
773                                        struct device_attribute *devattr,
774                                        char* buf)
775 {
776         struct f71805f_data *data = dev_get_drvdata(dev);
777         struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
778         int pwmnr = attr->nr;
779         int apnr = attr->index;
780
781         return sprintf(buf, "%ld\n",
782                        fan_from_reg(data->auto_points[pwmnr].fan[apnr]));
783 }
784
785 static ssize_t set_pwm_auto_point_fan(struct device *dev,
786                                       struct device_attribute *devattr,
787                                       const char* buf, size_t count)
788 {
789         struct f71805f_data *data = dev_get_drvdata(dev);
790         struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
791         int pwmnr = attr->nr;
792         int apnr = attr->index;
793         unsigned long val = simple_strtoul(buf, NULL, 10);
794
795         mutex_lock(&data->update_lock);
796         data->auto_points[pwmnr].fan[apnr] = fan_to_reg(val);
797         f71805f_write16(data, F71805F_REG_PWM_AUTO_POINT_FAN(pwmnr, apnr),
798                         data->auto_points[pwmnr].fan[apnr]);
799         mutex_unlock(&data->update_lock);
800
801         return count;
802 }
803
804 static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
805                          char *buf)
806 {
807         struct f71805f_data *data = f71805f_update_device(dev);
808         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
809         int nr = attr->index;
810
811         return sprintf(buf, "%ld\n", temp_from_reg(data->temp[nr]));
812 }
813
814 static ssize_t show_temp_max(struct device *dev, struct device_attribute
815                              *devattr, char *buf)
816 {
817         struct f71805f_data *data = f71805f_update_device(dev);
818         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
819         int nr = attr->index;
820
821         return sprintf(buf, "%ld\n", temp_from_reg(data->temp_high[nr]));
822 }
823
824 static ssize_t show_temp_hyst(struct device *dev, struct device_attribute
825                               *devattr, char *buf)
826 {
827         struct f71805f_data *data = f71805f_update_device(dev);
828         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
829         int nr = attr->index;
830
831         return sprintf(buf, "%ld\n", temp_from_reg(data->temp_hyst[nr]));
832 }
833
834 static ssize_t show_temp_type(struct device *dev, struct device_attribute
835                               *devattr, char *buf)
836 {
837         struct f71805f_data *data = f71805f_update_device(dev);
838         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
839         int nr = attr->index;
840
841         /* 3 is diode, 4 is thermistor */
842         return sprintf(buf, "%u\n", (data->temp_mode & (1 << nr)) ? 3 : 4);
843 }
844
845 static ssize_t set_temp_max(struct device *dev, struct device_attribute
846                             *devattr, const char *buf, size_t count)
847 {
848         struct f71805f_data *data = dev_get_drvdata(dev);
849         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
850         int nr = attr->index;
851         long val = simple_strtol(buf, NULL, 10);
852
853         mutex_lock(&data->update_lock);
854         data->temp_high[nr] = temp_to_reg(val);
855         f71805f_write8(data, F71805F_REG_TEMP_HIGH(nr), data->temp_high[nr]);
856         mutex_unlock(&data->update_lock);
857
858         return count;
859 }
860
861 static ssize_t set_temp_hyst(struct device *dev, struct device_attribute
862                              *devattr, const char *buf, size_t count)
863 {
864         struct f71805f_data *data = dev_get_drvdata(dev);
865         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
866         int nr = attr->index;
867         long val = simple_strtol(buf, NULL, 10);
868
869         mutex_lock(&data->update_lock);
870         data->temp_hyst[nr] = temp_to_reg(val);
871         f71805f_write8(data, F71805F_REG_TEMP_HYST(nr), data->temp_hyst[nr]);
872         mutex_unlock(&data->update_lock);
873
874         return count;
875 }
876
877 static ssize_t show_alarms_in(struct device *dev, struct device_attribute
878                               *devattr, char *buf)
879 {
880         struct f71805f_data *data = f71805f_update_device(dev);
881
882         return sprintf(buf, "%lu\n", data->alarms & 0x7ff);
883 }
884
885 static ssize_t show_alarms_fan(struct device *dev, struct device_attribute
886                                *devattr, char *buf)
887 {
888         struct f71805f_data *data = f71805f_update_device(dev);
889
890         return sprintf(buf, "%lu\n", (data->alarms >> 16) & 0x07);
891 }
892
893 static ssize_t show_alarms_temp(struct device *dev, struct device_attribute
894                                 *devattr, char *buf)
895 {
896         struct f71805f_data *data = f71805f_update_device(dev);
897
898         return sprintf(buf, "%lu\n", (data->alarms >> 11) & 0x07);
899 }
900
901 static ssize_t show_alarm(struct device *dev, struct device_attribute
902                           *devattr, char *buf)
903 {
904         struct f71805f_data *data = f71805f_update_device(dev);
905         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
906         int bitnr = attr->index;
907
908         return sprintf(buf, "%lu\n", (data->alarms >> bitnr) & 1);
909 }
910
911 static ssize_t show_name(struct device *dev, struct device_attribute
912                          *devattr, char *buf)
913 {
914         struct f71805f_data *data = dev_get_drvdata(dev);
915
916         return sprintf(buf, "%s\n", data->name);
917 }
918
919 static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_in0, NULL, 0);
920 static SENSOR_DEVICE_ATTR(in0_max, S_IRUGO| S_IWUSR,
921                           show_in0_max, set_in0_max, 0);
922 static SENSOR_DEVICE_ATTR(in0_min, S_IRUGO| S_IWUSR,
923                           show_in0_min, set_in0_min, 0);
924 static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_in, NULL, 1);
925 static SENSOR_DEVICE_ATTR(in1_max, S_IRUGO | S_IWUSR,
926                           show_in_max, set_in_max, 1);
927 static SENSOR_DEVICE_ATTR(in1_min, S_IRUGO | S_IWUSR,
928                           show_in_min, set_in_min, 1);
929 static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_in, NULL, 2);
930 static SENSOR_DEVICE_ATTR(in2_max, S_IRUGO | S_IWUSR,
931                           show_in_max, set_in_max, 2);
932 static SENSOR_DEVICE_ATTR(in2_min, S_IRUGO | S_IWUSR,
933                           show_in_min, set_in_min, 2);
934 static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, show_in, NULL, 3);
935 static SENSOR_DEVICE_ATTR(in3_max, S_IRUGO | S_IWUSR,
936                           show_in_max, set_in_max, 3);
937 static SENSOR_DEVICE_ATTR(in3_min, S_IRUGO | S_IWUSR,
938                           show_in_min, set_in_min, 3);
939 static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, show_in, NULL, 4);
940 static SENSOR_DEVICE_ATTR(in4_max, S_IRUGO | S_IWUSR,
941                           show_in_max, set_in_max, 4);
942 static SENSOR_DEVICE_ATTR(in4_min, S_IRUGO | S_IWUSR,
943                           show_in_min, set_in_min, 4);
944 static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, show_in, NULL, 5);
945 static SENSOR_DEVICE_ATTR(in5_max, S_IRUGO | S_IWUSR,
946                           show_in_max, set_in_max, 5);
947 static SENSOR_DEVICE_ATTR(in5_min, S_IRUGO | S_IWUSR,
948                           show_in_min, set_in_min, 5);
949 static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_in, NULL, 6);
950 static SENSOR_DEVICE_ATTR(in6_max, S_IRUGO | S_IWUSR,
951                           show_in_max, set_in_max, 6);
952 static SENSOR_DEVICE_ATTR(in6_min, S_IRUGO | S_IWUSR,
953                           show_in_min, set_in_min, 6);
954 static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, show_in, NULL, 7);
955 static SENSOR_DEVICE_ATTR(in7_max, S_IRUGO | S_IWUSR,
956                           show_in_max, set_in_max, 7);
957 static SENSOR_DEVICE_ATTR(in7_min, S_IRUGO | S_IWUSR,
958                           show_in_min, set_in_min, 7);
959 static SENSOR_DEVICE_ATTR(in8_input, S_IRUGO, show_in, NULL, 8);
960 static SENSOR_DEVICE_ATTR(in8_max, S_IRUGO | S_IWUSR,
961                           show_in_max, set_in_max, 8);
962 static SENSOR_DEVICE_ATTR(in8_min, S_IRUGO | S_IWUSR,
963                           show_in_min, set_in_min, 8);
964 static SENSOR_DEVICE_ATTR(in9_input, S_IRUGO, show_in0, NULL, 9);
965 static SENSOR_DEVICE_ATTR(in9_max, S_IRUGO | S_IWUSR,
966                           show_in0_max, set_in0_max, 9);
967 static SENSOR_DEVICE_ATTR(in9_min, S_IRUGO | S_IWUSR,
968                           show_in0_min, set_in0_min, 9);
969 static SENSOR_DEVICE_ATTR(in10_input, S_IRUGO, show_in0, NULL, 10);
970 static SENSOR_DEVICE_ATTR(in10_max, S_IRUGO | S_IWUSR,
971                           show_in0_max, set_in0_max, 10);
972 static SENSOR_DEVICE_ATTR(in10_min, S_IRUGO | S_IWUSR,
973                           show_in0_min, set_in0_min, 10);
974
975 static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0);
976 static SENSOR_DEVICE_ATTR(fan1_min, S_IRUGO | S_IWUSR,
977                           show_fan_min, set_fan_min, 0);
978 static SENSOR_DEVICE_ATTR(fan1_target, S_IRUGO | S_IWUSR,
979                           show_fan_target, set_fan_target, 0);
980 static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1);
981 static SENSOR_DEVICE_ATTR(fan2_min, S_IRUGO | S_IWUSR,
982                           show_fan_min, set_fan_min, 1);
983 static SENSOR_DEVICE_ATTR(fan2_target, S_IRUGO | S_IWUSR,
984                           show_fan_target, set_fan_target, 1);
985 static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2);
986 static SENSOR_DEVICE_ATTR(fan3_min, S_IRUGO | S_IWUSR,
987                           show_fan_min, set_fan_min, 2);
988 static SENSOR_DEVICE_ATTR(fan3_target, S_IRUGO | S_IWUSR,
989                           show_fan_target, set_fan_target, 2);
990
991 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0);
992 static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
993                     show_temp_max, set_temp_max, 0);
994 static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
995                     show_temp_hyst, set_temp_hyst, 0);
996 static SENSOR_DEVICE_ATTR(temp1_type, S_IRUGO, show_temp_type, NULL, 0);
997 static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1);
998 static SENSOR_DEVICE_ATTR(temp2_max, S_IRUGO | S_IWUSR,
999                     show_temp_max, set_temp_max, 1);
1000 static SENSOR_DEVICE_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR,
1001                     show_temp_hyst, set_temp_hyst, 1);
1002 static SENSOR_DEVICE_ATTR(temp2_type, S_IRUGO, show_temp_type, NULL, 1);
1003 static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2);
1004 static SENSOR_DEVICE_ATTR(temp3_max, S_IRUGO | S_IWUSR,
1005                     show_temp_max, set_temp_max, 2);
1006 static SENSOR_DEVICE_ATTR(temp3_max_hyst, S_IRUGO | S_IWUSR,
1007                     show_temp_hyst, set_temp_hyst, 2);
1008 static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO, show_temp_type, NULL, 2);
1009
1010 /* pwm (value) files are created read-only, write permission is
1011    then added or removed dynamically as needed */
1012 static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO, show_pwm, set_pwm, 0);
1013 static SENSOR_DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR,
1014                           show_pwm_enable, set_pwm_enable, 0);
1015 static SENSOR_DEVICE_ATTR(pwm1_freq, S_IRUGO | S_IWUSR,
1016                           show_pwm_freq, set_pwm_freq, 0);
1017 static SENSOR_DEVICE_ATTR(pwm1_mode, S_IRUGO, show_pwm_mode, NULL, 0);
1018 static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO, show_pwm, set_pwm, 1);
1019 static SENSOR_DEVICE_ATTR(pwm2_enable, S_IRUGO | S_IWUSR,
1020                           show_pwm_enable, set_pwm_enable, 1);
1021 static SENSOR_DEVICE_ATTR(pwm2_freq, S_IRUGO | S_IWUSR,
1022                           show_pwm_freq, set_pwm_freq, 1);
1023 static SENSOR_DEVICE_ATTR(pwm2_mode, S_IRUGO, show_pwm_mode, NULL, 1);
1024 static SENSOR_DEVICE_ATTR(pwm3, S_IRUGO, show_pwm, set_pwm, 2);
1025 static SENSOR_DEVICE_ATTR(pwm3_enable, S_IRUGO | S_IWUSR,
1026                           show_pwm_enable, set_pwm_enable, 2);
1027 static SENSOR_DEVICE_ATTR(pwm3_freq, S_IRUGO | S_IWUSR,
1028                           show_pwm_freq, set_pwm_freq, 2);
1029 static SENSOR_DEVICE_ATTR(pwm3_mode, S_IRUGO, show_pwm_mode, NULL, 2);
1030
1031 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_temp, S_IRUGO | S_IWUSR,
1032                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1033                             0, 0);
1034 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_fan, S_IRUGO | S_IWUSR,
1035                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1036                             0, 0);
1037 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point2_temp, S_IRUGO | S_IWUSR,
1038                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1039                             0, 1);
1040 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point2_fan, S_IRUGO | S_IWUSR,
1041                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1042                             0, 1);
1043 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point3_temp, S_IRUGO | S_IWUSR,
1044                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1045                             0, 2);
1046 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point3_fan, S_IRUGO | S_IWUSR,
1047                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1048                             0, 2);
1049
1050 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_temp, S_IRUGO | S_IWUSR,
1051                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1052                             1, 0);
1053 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_fan, S_IRUGO | S_IWUSR,
1054                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1055                             1, 0);
1056 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point2_temp, S_IRUGO | S_IWUSR,
1057                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1058                             1, 1);
1059 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point2_fan, S_IRUGO | S_IWUSR,
1060                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1061                             1, 1);
1062 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point3_temp, S_IRUGO | S_IWUSR,
1063                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1064                             1, 2);
1065 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point3_fan, S_IRUGO | S_IWUSR,
1066                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1067                             1, 2);
1068
1069 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_temp, S_IRUGO | S_IWUSR,
1070                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1071                             2, 0);
1072 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_fan, S_IRUGO | S_IWUSR,
1073                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1074                             2, 0);
1075 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point2_temp, S_IRUGO | S_IWUSR,
1076                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1077                             2, 1);
1078 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point2_fan, S_IRUGO | S_IWUSR,
1079                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1080                             2, 1);
1081 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point3_temp, S_IRUGO | S_IWUSR,
1082                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
1083                             2, 2);
1084 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point3_fan, S_IRUGO | S_IWUSR,
1085                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
1086                             2, 2);
1087
1088 static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
1089 static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
1090 static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2);
1091 static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3);
1092 static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 4);
1093 static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 5);
1094 static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 6);
1095 static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 7);
1096 static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 8);
1097 static SENSOR_DEVICE_ATTR(in9_alarm, S_IRUGO, show_alarm, NULL, 9);
1098 static SENSOR_DEVICE_ATTR(in10_alarm, S_IRUGO, show_alarm, NULL, 10);
1099 static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 11);
1100 static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 12);
1101 static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13);
1102 static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 16);
1103 static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 17);
1104 static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 18);
1105 static DEVICE_ATTR(alarms_in, S_IRUGO, show_alarms_in, NULL);
1106 static DEVICE_ATTR(alarms_fan, S_IRUGO, show_alarms_fan, NULL);
1107 static DEVICE_ATTR(alarms_temp, S_IRUGO, show_alarms_temp, NULL);
1108
1109 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
1110
1111 static struct attribute *f71805f_attributes[] = {
1112         &sensor_dev_attr_in0_input.dev_attr.attr,
1113         &sensor_dev_attr_in0_max.dev_attr.attr,
1114         &sensor_dev_attr_in0_min.dev_attr.attr,
1115         &sensor_dev_attr_in1_input.dev_attr.attr,
1116         &sensor_dev_attr_in1_max.dev_attr.attr,
1117         &sensor_dev_attr_in1_min.dev_attr.attr,
1118         &sensor_dev_attr_in2_input.dev_attr.attr,
1119         &sensor_dev_attr_in2_max.dev_attr.attr,
1120         &sensor_dev_attr_in2_min.dev_attr.attr,
1121         &sensor_dev_attr_in3_input.dev_attr.attr,
1122         &sensor_dev_attr_in3_max.dev_attr.attr,
1123         &sensor_dev_attr_in3_min.dev_attr.attr,
1124         &sensor_dev_attr_in5_input.dev_attr.attr,
1125         &sensor_dev_attr_in5_max.dev_attr.attr,
1126         &sensor_dev_attr_in5_min.dev_attr.attr,
1127         &sensor_dev_attr_in6_input.dev_attr.attr,
1128         &sensor_dev_attr_in6_max.dev_attr.attr,
1129         &sensor_dev_attr_in6_min.dev_attr.attr,
1130         &sensor_dev_attr_in7_input.dev_attr.attr,
1131         &sensor_dev_attr_in7_max.dev_attr.attr,
1132         &sensor_dev_attr_in7_min.dev_attr.attr,
1133
1134         &sensor_dev_attr_fan1_input.dev_attr.attr,
1135         &sensor_dev_attr_fan1_min.dev_attr.attr,
1136         &sensor_dev_attr_fan1_alarm.dev_attr.attr,
1137         &sensor_dev_attr_fan1_target.dev_attr.attr,
1138         &sensor_dev_attr_fan2_input.dev_attr.attr,
1139         &sensor_dev_attr_fan2_min.dev_attr.attr,
1140         &sensor_dev_attr_fan2_alarm.dev_attr.attr,
1141         &sensor_dev_attr_fan2_target.dev_attr.attr,
1142         &sensor_dev_attr_fan3_input.dev_attr.attr,
1143         &sensor_dev_attr_fan3_min.dev_attr.attr,
1144         &sensor_dev_attr_fan3_alarm.dev_attr.attr,
1145         &sensor_dev_attr_fan3_target.dev_attr.attr,
1146
1147         &sensor_dev_attr_pwm1.dev_attr.attr,
1148         &sensor_dev_attr_pwm1_enable.dev_attr.attr,
1149         &sensor_dev_attr_pwm1_mode.dev_attr.attr,
1150         &sensor_dev_attr_pwm2.dev_attr.attr,
1151         &sensor_dev_attr_pwm2_enable.dev_attr.attr,
1152         &sensor_dev_attr_pwm2_mode.dev_attr.attr,
1153         &sensor_dev_attr_pwm3.dev_attr.attr,
1154         &sensor_dev_attr_pwm3_enable.dev_attr.attr,
1155         &sensor_dev_attr_pwm3_mode.dev_attr.attr,
1156
1157         &sensor_dev_attr_temp1_input.dev_attr.attr,
1158         &sensor_dev_attr_temp1_max.dev_attr.attr,
1159         &sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
1160         &sensor_dev_attr_temp1_type.dev_attr.attr,
1161         &sensor_dev_attr_temp2_input.dev_attr.attr,
1162         &sensor_dev_attr_temp2_max.dev_attr.attr,
1163         &sensor_dev_attr_temp2_max_hyst.dev_attr.attr,
1164         &sensor_dev_attr_temp2_type.dev_attr.attr,
1165         &sensor_dev_attr_temp3_input.dev_attr.attr,
1166         &sensor_dev_attr_temp3_max.dev_attr.attr,
1167         &sensor_dev_attr_temp3_max_hyst.dev_attr.attr,
1168         &sensor_dev_attr_temp3_type.dev_attr.attr,
1169
1170         &sensor_dev_attr_pwm1_auto_point1_temp.dev_attr.attr,
1171         &sensor_dev_attr_pwm1_auto_point1_fan.dev_attr.attr,
1172         &sensor_dev_attr_pwm1_auto_point2_temp.dev_attr.attr,
1173         &sensor_dev_attr_pwm1_auto_point2_fan.dev_attr.attr,
1174         &sensor_dev_attr_pwm1_auto_point3_temp.dev_attr.attr,
1175         &sensor_dev_attr_pwm1_auto_point3_fan.dev_attr.attr,
1176         &sensor_dev_attr_pwm2_auto_point1_temp.dev_attr.attr,
1177         &sensor_dev_attr_pwm2_auto_point1_fan.dev_attr.attr,
1178         &sensor_dev_attr_pwm2_auto_point2_temp.dev_attr.attr,
1179         &sensor_dev_attr_pwm2_auto_point2_fan.dev_attr.attr,
1180         &sensor_dev_attr_pwm2_auto_point3_temp.dev_attr.attr,
1181         &sensor_dev_attr_pwm2_auto_point3_fan.dev_attr.attr,
1182         &sensor_dev_attr_pwm3_auto_point1_temp.dev_attr.attr,
1183         &sensor_dev_attr_pwm3_auto_point1_fan.dev_attr.attr,
1184         &sensor_dev_attr_pwm3_auto_point2_temp.dev_attr.attr,
1185         &sensor_dev_attr_pwm3_auto_point2_fan.dev_attr.attr,
1186         &sensor_dev_attr_pwm3_auto_point3_temp.dev_attr.attr,
1187         &sensor_dev_attr_pwm3_auto_point3_fan.dev_attr.attr,
1188
1189         &sensor_dev_attr_in0_alarm.dev_attr.attr,
1190         &sensor_dev_attr_in1_alarm.dev_attr.attr,
1191         &sensor_dev_attr_in2_alarm.dev_attr.attr,
1192         &sensor_dev_attr_in3_alarm.dev_attr.attr,
1193         &sensor_dev_attr_in5_alarm.dev_attr.attr,
1194         &sensor_dev_attr_in6_alarm.dev_attr.attr,
1195         &sensor_dev_attr_in7_alarm.dev_attr.attr,
1196         &dev_attr_alarms_in.attr,
1197         &sensor_dev_attr_temp1_alarm.dev_attr.attr,
1198         &sensor_dev_attr_temp2_alarm.dev_attr.attr,
1199         &sensor_dev_attr_temp3_alarm.dev_attr.attr,
1200         &dev_attr_alarms_temp.attr,
1201         &dev_attr_alarms_fan.attr,
1202
1203         &dev_attr_name.attr,
1204         NULL
1205 };
1206
1207 static const struct attribute_group f71805f_group = {
1208         .attrs = f71805f_attributes,
1209 };
1210
1211 static struct attribute *f71805f_attributes_optin[4][5] = {
1212         {
1213                 &sensor_dev_attr_in4_input.dev_attr.attr,
1214                 &sensor_dev_attr_in4_max.dev_attr.attr,
1215                 &sensor_dev_attr_in4_min.dev_attr.attr,
1216                 &sensor_dev_attr_in4_alarm.dev_attr.attr,
1217                 NULL
1218         }, {
1219                 &sensor_dev_attr_in8_input.dev_attr.attr,
1220                 &sensor_dev_attr_in8_max.dev_attr.attr,
1221                 &sensor_dev_attr_in8_min.dev_attr.attr,
1222                 &sensor_dev_attr_in8_alarm.dev_attr.attr,
1223                 NULL
1224         }, {
1225                 &sensor_dev_attr_in9_input.dev_attr.attr,
1226                 &sensor_dev_attr_in9_max.dev_attr.attr,
1227                 &sensor_dev_attr_in9_min.dev_attr.attr,
1228                 &sensor_dev_attr_in9_alarm.dev_attr.attr,
1229                 NULL
1230         }, {
1231                 &sensor_dev_attr_in10_input.dev_attr.attr,
1232                 &sensor_dev_attr_in10_max.dev_attr.attr,
1233                 &sensor_dev_attr_in10_min.dev_attr.attr,
1234                 &sensor_dev_attr_in10_alarm.dev_attr.attr,
1235                 NULL
1236         }
1237 };
1238
1239 static const struct attribute_group f71805f_group_optin[4] = {
1240         { .attrs = f71805f_attributes_optin[0] },
1241         { .attrs = f71805f_attributes_optin[1] },
1242         { .attrs = f71805f_attributes_optin[2] },
1243         { .attrs = f71805f_attributes_optin[3] },
1244 };
1245
1246 /* We don't include pwm_freq files in the arrays above, because they must be
1247    created conditionally (only if pwm_mode is 1 == PWM) */
1248 static struct attribute *f71805f_attributes_pwm_freq[] = {
1249         &sensor_dev_attr_pwm1_freq.dev_attr.attr,
1250         &sensor_dev_attr_pwm2_freq.dev_attr.attr,
1251         &sensor_dev_attr_pwm3_freq.dev_attr.attr,
1252         NULL
1253 };
1254
1255 static const struct attribute_group f71805f_group_pwm_freq = {
1256         .attrs = f71805f_attributes_pwm_freq,
1257 };
1258
1259 /* We also need an indexed access to pwmN files to toggle writability */
1260 static struct attribute *f71805f_attr_pwm[] = {
1261         &sensor_dev_attr_pwm1.dev_attr.attr,
1262         &sensor_dev_attr_pwm2.dev_attr.attr,
1263         &sensor_dev_attr_pwm3.dev_attr.attr,
1264 };
1265
1266 /*
1267  * Device registration and initialization
1268  */
1269
1270 static void __devinit f71805f_init_device(struct f71805f_data *data)
1271 {
1272         u8 reg;
1273         int i;
1274
1275         reg = f71805f_read8(data, F71805F_REG_START);
1276         if ((reg & 0x41) != 0x01) {
1277                 printk(KERN_DEBUG DRVNAME ": Starting monitoring "
1278                        "operations\n");
1279                 f71805f_write8(data, F71805F_REG_START, (reg | 0x01) & ~0x40);
1280         }
1281
1282         /* Fan monitoring can be disabled. If it is, we won't be polling
1283            the register values, and won't create the related sysfs files. */
1284         for (i = 0; i < 3; i++) {
1285                 data->fan_ctrl[i] = f71805f_read8(data,
1286                                                   F71805F_REG_FAN_CTRL(i));
1287                 /* Clear latch full bit, else "speed mode" fan speed control
1288                    doesn't work */
1289                 if (data->fan_ctrl[i] & FAN_CTRL_LATCH_FULL) {
1290                         data->fan_ctrl[i] &= ~FAN_CTRL_LATCH_FULL;
1291                         f71805f_write8(data, F71805F_REG_FAN_CTRL(i),
1292                                        data->fan_ctrl[i]);
1293                 }
1294         }
1295 }
1296
1297 static int __devinit f71805f_probe(struct platform_device *pdev)
1298 {
1299         struct f71805f_sio_data *sio_data = pdev->dev.platform_data;
1300         struct f71805f_data *data;
1301         struct resource *res;
1302         int i, err;
1303
1304         static const char *names[] = {
1305                 "f71805f",
1306                 "f71872f",
1307         };
1308
1309         if (!(data = kzalloc(sizeof(struct f71805f_data), GFP_KERNEL))) {
1310                 err = -ENOMEM;
1311                 printk(KERN_ERR DRVNAME ": Out of memory\n");
1312                 goto exit;
1313         }
1314
1315         res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1316         if (!request_region(res->start + ADDR_REG_OFFSET, 2, DRVNAME)) {
1317                 err = -EBUSY;
1318                 dev_err(&pdev->dev, "Failed to request region 0x%lx-0x%lx\n",
1319                         (unsigned long)(res->start + ADDR_REG_OFFSET),
1320                         (unsigned long)(res->start + ADDR_REG_OFFSET + 1));
1321                 goto exit_free;
1322         }
1323         data->addr = res->start;
1324         data->name = names[sio_data->kind];
1325         mutex_init(&data->update_lock);
1326
1327         platform_set_drvdata(pdev, data);
1328
1329         /* Some voltage inputs depend on chip model and configuration */
1330         switch (sio_data->kind) {
1331         case f71805f:
1332                 data->has_in = 0x1ff;
1333                 break;
1334         case f71872f:
1335                 data->has_in = 0x6ef;
1336                 if (sio_data->fnsel1 & 0x01)
1337                         data->has_in |= (1 << 4); /* in4 */
1338                 if (sio_data->fnsel1 & 0x02)
1339                         data->has_in |= (1 << 8); /* in8 */
1340                 break;
1341         }
1342
1343         /* Initialize the F71805F chip */
1344         f71805f_init_device(data);
1345
1346         /* Register sysfs interface files */
1347         if ((err = sysfs_create_group(&pdev->dev.kobj, &f71805f_group)))
1348                 goto exit_release_region;
1349         if (data->has_in & (1 << 4)) { /* in4 */
1350                 if ((err = sysfs_create_group(&pdev->dev.kobj,
1351                                               &f71805f_group_optin[0])))
1352                         goto exit_remove_files;
1353         }
1354         if (data->has_in & (1 << 8)) { /* in8 */
1355                 if ((err = sysfs_create_group(&pdev->dev.kobj,
1356                                               &f71805f_group_optin[1])))
1357                         goto exit_remove_files;
1358         }
1359         if (data->has_in & (1 << 9)) { /* in9 (F71872F/FG only) */
1360                 if ((err = sysfs_create_group(&pdev->dev.kobj,
1361                                               &f71805f_group_optin[2])))
1362                         goto exit_remove_files;
1363         }
1364         if (data->has_in & (1 << 10)) { /* in9 (F71872F/FG only) */
1365                 if ((err = sysfs_create_group(&pdev->dev.kobj,
1366                                               &f71805f_group_optin[3])))
1367                         goto exit_remove_files;
1368         }
1369         for (i = 0; i < 3; i++) {
1370                 /* If control mode is PWM, create pwm_freq file */
1371                 if (!(data->fan_ctrl[i] & FAN_CTRL_DC_MODE)) {
1372                         if ((err = sysfs_create_file(&pdev->dev.kobj,
1373                                         f71805f_attributes_pwm_freq[i])))
1374                                 goto exit_remove_files;
1375                 }
1376                 /* If PWM is in manual mode, add write permission */
1377                 if (data->fan_ctrl[i] & FAN_CTRL_MODE_MANUAL) {
1378                         if ((err = sysfs_chmod_file(&pdev->dev.kobj,
1379                                                     f71805f_attr_pwm[i],
1380                                                     S_IRUGO | S_IWUSR))) {
1381                                 dev_err(&pdev->dev, "chmod +w pwm%d failed\n",
1382                                         i + 1);
1383                                 goto exit_remove_files;
1384                         }
1385                 }
1386         }
1387
1388         data->hwmon_dev = hwmon_device_register(&pdev->dev);
1389         if (IS_ERR(data->hwmon_dev)) {
1390                 err = PTR_ERR(data->hwmon_dev);
1391                 dev_err(&pdev->dev, "Class registration failed (%d)\n", err);
1392                 goto exit_remove_files;
1393         }
1394
1395         return 0;
1396
1397 exit_remove_files:
1398         sysfs_remove_group(&pdev->dev.kobj, &f71805f_group);
1399         for (i = 0; i < 4; i++)
1400                 sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_optin[i]);
1401         sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_pwm_freq);
1402 exit_release_region:
1403         release_region(res->start + ADDR_REG_OFFSET, 2);
1404 exit_free:
1405         platform_set_drvdata(pdev, NULL);
1406         kfree(data);
1407 exit:
1408         return err;
1409 }
1410
1411 static int __devexit f71805f_remove(struct platform_device *pdev)
1412 {
1413         struct f71805f_data *data = platform_get_drvdata(pdev);
1414         struct resource *res;
1415         int i;
1416
1417         hwmon_device_unregister(data->hwmon_dev);
1418         sysfs_remove_group(&pdev->dev.kobj, &f71805f_group);
1419         for (i = 0; i < 4; i++)
1420                 sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_optin[i]);
1421         sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_pwm_freq);
1422         platform_set_drvdata(pdev, NULL);
1423         kfree(data);
1424
1425         res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1426         release_region(res->start + ADDR_REG_OFFSET, 2);
1427
1428         return 0;
1429 }
1430
1431 static struct platform_driver f71805f_driver = {
1432         .driver = {
1433                 .owner  = THIS_MODULE,
1434                 .name   = DRVNAME,
1435         },
1436         .probe          = f71805f_probe,
1437         .remove         = __devexit_p(f71805f_remove),
1438 };
1439
1440 static int __init f71805f_device_add(unsigned short address,
1441                                      const struct f71805f_sio_data *sio_data)
1442 {
1443         struct resource res = {
1444                 .start  = address,
1445                 .end    = address + REGION_LENGTH - 1,
1446                 .flags  = IORESOURCE_IO,
1447         };
1448         int err;
1449
1450         pdev = platform_device_alloc(DRVNAME, address);
1451         if (!pdev) {
1452                 err = -ENOMEM;
1453                 printk(KERN_ERR DRVNAME ": Device allocation failed\n");
1454                 goto exit;
1455         }
1456
1457         res.name = pdev->name;
1458         err = platform_device_add_resources(pdev, &res, 1);
1459         if (err) {
1460                 printk(KERN_ERR DRVNAME ": Device resource addition failed "
1461                        "(%d)\n", err);
1462                 goto exit_device_put;
1463         }
1464
1465         err = platform_device_add_data(pdev, sio_data,
1466                                        sizeof(struct f71805f_sio_data));
1467         if (err) {
1468                 printk(KERN_ERR DRVNAME ": Platform data allocation failed\n");
1469                 goto exit_device_put;
1470         }
1471
1472         err = platform_device_add(pdev);
1473         if (err) {
1474                 printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n",
1475                        err);
1476                 goto exit_device_put;
1477         }
1478
1479         return 0;
1480
1481 exit_device_put:
1482         platform_device_put(pdev);
1483 exit:
1484         return err;
1485 }
1486
1487 static int __init f71805f_find(int sioaddr, unsigned short *address,
1488                                struct f71805f_sio_data *sio_data)
1489 {
1490         int err = -ENODEV;
1491         u16 devid;
1492
1493         static const char *names[] = {
1494                 "F71805F/FG",
1495                 "F71872F/FG or F71806F/FG",
1496         };
1497
1498         superio_enter(sioaddr);
1499
1500         devid = superio_inw(sioaddr, SIO_REG_MANID);
1501         if (devid != SIO_FINTEK_ID)
1502                 goto exit;
1503
1504         devid = force_id ? force_id : superio_inw(sioaddr, SIO_REG_DEVID);
1505         switch (devid) {
1506         case SIO_F71805F_ID:
1507                 sio_data->kind = f71805f;
1508                 break;
1509         case SIO_F71872F_ID:
1510                 sio_data->kind = f71872f;
1511                 sio_data->fnsel1 = superio_inb(sioaddr, SIO_REG_FNSEL1);
1512                 break;
1513         default:
1514                 printk(KERN_INFO DRVNAME ": Unsupported Fintek device, "
1515                        "skipping\n");
1516                 goto exit;
1517         }
1518
1519         superio_select(sioaddr, F71805F_LD_HWM);
1520         if (!(superio_inb(sioaddr, SIO_REG_ENABLE) & 0x01)) {
1521                 printk(KERN_WARNING DRVNAME ": Device not activated, "
1522                        "skipping\n");
1523                 goto exit;
1524         }
1525
1526         *address = superio_inw(sioaddr, SIO_REG_ADDR);
1527         if (*address == 0) {
1528                 printk(KERN_WARNING DRVNAME ": Base address not set, "
1529                        "skipping\n");
1530                 goto exit;
1531         }
1532         *address &= ~(REGION_LENGTH - 1);       /* Ignore 3 LSB */
1533
1534         err = 0;
1535         printk(KERN_INFO DRVNAME ": Found %s chip at %#x, revision %u\n",
1536                names[sio_data->kind], *address,
1537                superio_inb(sioaddr, SIO_REG_DEVREV));
1538
1539 exit:
1540         superio_exit(sioaddr);
1541         return err;
1542 }
1543
1544 static int __init f71805f_init(void)
1545 {
1546         int err;
1547         unsigned short address;
1548         struct f71805f_sio_data sio_data;
1549
1550         if (f71805f_find(0x2e, &address, &sio_data)
1551          && f71805f_find(0x4e, &address, &sio_data))
1552                 return -ENODEV;
1553
1554         err = platform_driver_register(&f71805f_driver);
1555         if (err)
1556                 goto exit;
1557
1558         /* Sets global pdev as a side effect */
1559         err = f71805f_device_add(address, &sio_data);
1560         if (err)
1561                 goto exit_driver;
1562
1563         return 0;
1564
1565 exit_driver:
1566         platform_driver_unregister(&f71805f_driver);
1567 exit:
1568         return err;
1569 }
1570
1571 static void __exit f71805f_exit(void)
1572 {
1573         platform_device_unregister(pdev);
1574         platform_driver_unregister(&f71805f_driver);
1575 }
1576
1577 MODULE_AUTHOR("Jean Delvare <khali@linux-fr>");
1578 MODULE_LICENSE("GPL");
1579 MODULE_DESCRIPTION("F71805F/F71872F hardware monitoring driver");
1580
1581 module_init(f71805f_init);
1582 module_exit(f71805f_exit);