Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  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);
1583 
  This page was automatically generated by the LXR engine.