virtio: explicit enable_cb/disable_cb rather than callback return.
[linux-2.6] / drivers / hwmon / w83627ehf.c
1 /*
2     w83627ehf - Driver for the hardware monitoring functionality of
3                 the Winbond W83627EHF Super-I/O chip
4     Copyright (C) 2005  Jean Delvare <khali@linux-fr.org>
5     Copyright (C) 2006  Yuan Mu (Winbond),
6                         Rudolf Marek <r.marek@assembler.cz>
7                         David Hubbard <david.c.hubbard@gmail.com>
8
9     Shamelessly ripped from the w83627hf driver
10     Copyright (C) 2003  Mark Studebaker
11
12     Thanks to Leon Moonen, Steve Cliffe and Grant Coady for their help
13     in testing and debugging this driver.
14
15     This driver also supports the W83627EHG, which is the lead-free
16     version of the W83627EHF.
17
18     This program is free software; you can redistribute it and/or modify
19     it under the terms of the GNU General Public License as published by
20     the Free Software Foundation; either version 2 of the License, or
21     (at your option) any later version.
22
23     This program is distributed in the hope that it will be useful,
24     but WITHOUT ANY WARRANTY; without even the implied warranty of
25     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26     GNU General Public License for more details.
27
28     You should have received a copy of the GNU General Public License
29     along with this program; if not, write to the Free Software
30     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31
32
33     Supports the following chips:
34
35     Chip        #vin    #fan    #pwm    #temp  chip IDs       man ID
36     w83627ehf   10      5       4       3      0x8850 0x88    0x5ca3
37                                                0x8860 0xa1
38     w83627dhg    9      5       4       3      0xa020 0xc1    0x5ca3
39 */
40
41 #include <linux/module.h>
42 #include <linux/init.h>
43 #include <linux/slab.h>
44 #include <linux/jiffies.h>
45 #include <linux/platform_device.h>
46 #include <linux/hwmon.h>
47 #include <linux/hwmon-sysfs.h>
48 #include <linux/hwmon-vid.h>
49 #include <linux/err.h>
50 #include <linux/mutex.h>
51 #include <asm/io.h>
52 #include "lm75.h"
53
54 enum kinds { w83627ehf, w83627dhg };
55
56 /* used to set data->name = w83627ehf_device_names[data->sio_kind] */
57 static const char * w83627ehf_device_names[] = {
58         "w83627ehf",
59         "w83627dhg",
60 };
61
62 #define DRVNAME "w83627ehf"
63
64 /*
65  * Super-I/O constants and functions
66  */
67
68 #define W83627EHF_LD_HWM        0x0b
69
70 #define SIO_REG_LDSEL           0x07    /* Logical device select */
71 #define SIO_REG_DEVID           0x20    /* Device ID (2 bytes) */
72 #define SIO_REG_EN_VRM10        0x2C    /* GPIO3, GPIO4 selection */
73 #define SIO_REG_ENABLE          0x30    /* Logical device enable */
74 #define SIO_REG_ADDR            0x60    /* Logical device address (2 bytes) */
75 #define SIO_REG_VID_CTRL        0xF0    /* VID control */
76 #define SIO_REG_VID_DATA        0xF1    /* VID data */
77
78 #define SIO_W83627EHF_ID        0x8850
79 #define SIO_W83627EHG_ID        0x8860
80 #define SIO_W83627DHG_ID        0xa020
81 #define SIO_ID_MASK             0xFFF0
82
83 static inline void
84 superio_outb(int ioreg, int reg, int val)
85 {
86         outb(reg, ioreg);
87         outb(val, ioreg + 1);
88 }
89
90 static inline int
91 superio_inb(int ioreg, int reg)
92 {
93         outb(reg, ioreg);
94         return inb(ioreg + 1);
95 }
96
97 static inline void
98 superio_select(int ioreg, int ld)
99 {
100         outb(SIO_REG_LDSEL, ioreg);
101         outb(ld, ioreg + 1);
102 }
103
104 static inline void
105 superio_enter(int ioreg)
106 {
107         outb(0x87, ioreg);
108         outb(0x87, ioreg);
109 }
110
111 static inline void
112 superio_exit(int ioreg)
113 {
114         outb(0x02, ioreg);
115         outb(0x02, ioreg + 1);
116 }
117
118 /*
119  * ISA constants
120  */
121
122 #define IOREGION_ALIGNMENT      ~7
123 #define IOREGION_OFFSET         5
124 #define IOREGION_LENGTH         2
125 #define ADDR_REG_OFFSET         0
126 #define DATA_REG_OFFSET         1
127
128 #define W83627EHF_REG_BANK              0x4E
129 #define W83627EHF_REG_CONFIG            0x40
130
131 /* Not currently used:
132  * REG_MAN_ID has the value 0x5ca3 for all supported chips.
133  * REG_CHIP_ID == 0x88/0xa1/0xc1 depending on chip model.
134  * REG_MAN_ID is at port 0x4f
135  * REG_CHIP_ID is at port 0x58 */
136
137 static const u16 W83627EHF_REG_FAN[] = { 0x28, 0x29, 0x2a, 0x3f, 0x553 };
138 static const u16 W83627EHF_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d, 0x3e, 0x55c };
139
140 /* The W83627EHF registers for nr=7,8,9 are in bank 5 */
141 #define W83627EHF_REG_IN_MAX(nr)        ((nr < 7) ? (0x2b + (nr) * 2) : \
142                                          (0x554 + (((nr) - 7) * 2)))
143 #define W83627EHF_REG_IN_MIN(nr)        ((nr < 7) ? (0x2c + (nr) * 2) : \
144                                          (0x555 + (((nr) - 7) * 2)))
145 #define W83627EHF_REG_IN(nr)            ((nr < 7) ? (0x20 + (nr)) : \
146                                          (0x550 + (nr) - 7))
147
148 #define W83627EHF_REG_TEMP1             0x27
149 #define W83627EHF_REG_TEMP1_HYST        0x3a
150 #define W83627EHF_REG_TEMP1_OVER        0x39
151 static const u16 W83627EHF_REG_TEMP[] = { 0x150, 0x250 };
152 static const u16 W83627EHF_REG_TEMP_HYST[] = { 0x153, 0x253 };
153 static const u16 W83627EHF_REG_TEMP_OVER[] = { 0x155, 0x255 };
154 static const u16 W83627EHF_REG_TEMP_CONFIG[] = { 0x152, 0x252 };
155
156 /* Fan clock dividers are spread over the following five registers */
157 #define W83627EHF_REG_FANDIV1           0x47
158 #define W83627EHF_REG_FANDIV2           0x4B
159 #define W83627EHF_REG_VBAT              0x5D
160 #define W83627EHF_REG_DIODE             0x59
161 #define W83627EHF_REG_SMI_OVT           0x4C
162
163 #define W83627EHF_REG_ALARM1            0x459
164 #define W83627EHF_REG_ALARM2            0x45A
165 #define W83627EHF_REG_ALARM3            0x45B
166
167 /* SmartFan registers */
168 /* DC or PWM output fan configuration */
169 static const u8 W83627EHF_REG_PWM_ENABLE[] = {
170         0x04,                   /* SYS FAN0 output mode and PWM mode */
171         0x04,                   /* CPU FAN0 output mode and PWM mode */
172         0x12,                   /* AUX FAN mode */
173         0x62,                   /* CPU fan1 mode */
174 };
175
176 static const u8 W83627EHF_PWM_MODE_SHIFT[] = { 0, 1, 0, 6 };
177 static const u8 W83627EHF_PWM_ENABLE_SHIFT[] = { 2, 4, 1, 4 };
178
179 /* FAN Duty Cycle, be used to control */
180 static const u8 W83627EHF_REG_PWM[] = { 0x01, 0x03, 0x11, 0x61 };
181 static const u8 W83627EHF_REG_TARGET[] = { 0x05, 0x06, 0x13, 0x63 };
182 static const u8 W83627EHF_REG_TOLERANCE[] = { 0x07, 0x07, 0x14, 0x62 };
183
184
185 /* Advanced Fan control, some values are common for all fans */
186 static const u8 W83627EHF_REG_FAN_MIN_OUTPUT[] = { 0x08, 0x09, 0x15, 0x64 };
187 static const u8 W83627EHF_REG_FAN_STOP_TIME[] = { 0x0C, 0x0D, 0x17, 0x66 };
188
189 /*
190  * Conversions
191  */
192
193 /* 1 is PWM mode, output in ms */
194 static inline unsigned int step_time_from_reg(u8 reg, u8 mode)
195 {
196         return mode ? 100 * reg : 400 * reg;
197 }
198
199 static inline u8 step_time_to_reg(unsigned int msec, u8 mode)
200 {
201         return SENSORS_LIMIT((mode ? (msec + 50) / 100 :
202                                                 (msec + 200) / 400), 1, 255);
203 }
204
205 static inline unsigned int
206 fan_from_reg(u8 reg, unsigned int div)
207 {
208         if (reg == 0 || reg == 255)
209                 return 0;
210         return 1350000U / (reg * div);
211 }
212
213 static inline unsigned int
214 div_from_reg(u8 reg)
215 {
216         return 1 << reg;
217 }
218
219 static inline int
220 temp1_from_reg(s8 reg)
221 {
222         return reg * 1000;
223 }
224
225 static inline s8
226 temp1_to_reg(long temp, int min, int max)
227 {
228         if (temp <= min)
229                 return min / 1000;
230         if (temp >= max)
231                 return max / 1000;
232         if (temp < 0)
233                 return (temp - 500) / 1000;
234         return (temp + 500) / 1000;
235 }
236
237 /* Some of analog inputs have internal scaling (2x), 8mV is ADC LSB */
238
239 static u8 scale_in[10] = { 8, 8, 16, 16, 8, 8, 8, 16, 16, 8 };
240
241 static inline long in_from_reg(u8 reg, u8 nr)
242 {
243         return reg * scale_in[nr];
244 }
245
246 static inline u8 in_to_reg(u32 val, u8 nr)
247 {
248         return SENSORS_LIMIT(((val + (scale_in[nr] / 2)) / scale_in[nr]), 0, 255);
249 }
250
251 /*
252  * Data structures and manipulation thereof
253  */
254
255 struct w83627ehf_data {
256         int addr;       /* IO base of hw monitor block */
257         const char *name;
258
259         struct device *hwmon_dev;
260         struct mutex lock;
261
262         struct mutex update_lock;
263         char valid;             /* !=0 if following fields are valid */
264         unsigned long last_updated;     /* In jiffies */
265
266         /* Register values */
267         u8 in_num;              /* number of in inputs we have */
268         u8 in[10];              /* Register value */
269         u8 in_max[10];          /* Register value */
270         u8 in_min[10];          /* Register value */
271         u8 fan[5];
272         u8 fan_min[5];
273         u8 fan_div[5];
274         u8 has_fan;             /* some fan inputs can be disabled */
275         u8 temp_type[3];
276         s8 temp1;
277         s8 temp1_max;
278         s8 temp1_max_hyst;
279         s16 temp[2];
280         s16 temp_max[2];
281         s16 temp_max_hyst[2];
282         u32 alarms;
283
284         u8 pwm_mode[4]; /* 0->DC variable voltage, 1->PWM variable duty cycle */
285         u8 pwm_enable[4]; /* 1->manual
286                              2->thermal cruise (also called SmartFan I) */
287         u8 pwm[4];
288         u8 target_temp[4];
289         u8 tolerance[4];
290
291         u8 fan_min_output[4]; /* minimum fan speed */
292         u8 fan_stop_time[4];
293
294         u8 vid;
295         u8 vrm;
296 };
297
298 struct w83627ehf_sio_data {
299         int sioreg;
300         enum kinds kind;
301 };
302
303 static inline int is_word_sized(u16 reg)
304 {
305         return (((reg & 0xff00) == 0x100
306               || (reg & 0xff00) == 0x200)
307              && ((reg & 0x00ff) == 0x50
308               || (reg & 0x00ff) == 0x53
309               || (reg & 0x00ff) == 0x55));
310 }
311
312 /* Registers 0x50-0x5f are banked */
313 static inline void w83627ehf_set_bank(struct w83627ehf_data *data, u16 reg)
314 {
315         if ((reg & 0x00f0) == 0x50) {
316                 outb_p(W83627EHF_REG_BANK, data->addr + ADDR_REG_OFFSET);
317                 outb_p(reg >> 8, data->addr + DATA_REG_OFFSET);
318         }
319 }
320
321 /* Not strictly necessary, but play it safe for now */
322 static inline void w83627ehf_reset_bank(struct w83627ehf_data *data, u16 reg)
323 {
324         if (reg & 0xff00) {
325                 outb_p(W83627EHF_REG_BANK, data->addr + ADDR_REG_OFFSET);
326                 outb_p(0, data->addr + DATA_REG_OFFSET);
327         }
328 }
329
330 static u16 w83627ehf_read_value(struct w83627ehf_data *data, u16 reg)
331 {
332         int res, word_sized = is_word_sized(reg);
333
334         mutex_lock(&data->lock);
335
336         w83627ehf_set_bank(data, reg);
337         outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET);
338         res = inb_p(data->addr + DATA_REG_OFFSET);
339         if (word_sized) {
340                 outb_p((reg & 0xff) + 1,
341                        data->addr + ADDR_REG_OFFSET);
342                 res = (res << 8) + inb_p(data->addr + DATA_REG_OFFSET);
343         }
344         w83627ehf_reset_bank(data, reg);
345
346         mutex_unlock(&data->lock);
347
348         return res;
349 }
350
351 static int w83627ehf_write_value(struct w83627ehf_data *data, u16 reg, u16 value)
352 {
353         int word_sized = is_word_sized(reg);
354
355         mutex_lock(&data->lock);
356
357         w83627ehf_set_bank(data, reg);
358         outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET);
359         if (word_sized) {
360                 outb_p(value >> 8, data->addr + DATA_REG_OFFSET);
361                 outb_p((reg & 0xff) + 1,
362                        data->addr + ADDR_REG_OFFSET);
363         }
364         outb_p(value & 0xff, data->addr + DATA_REG_OFFSET);
365         w83627ehf_reset_bank(data, reg);
366
367         mutex_unlock(&data->lock);
368         return 0;
369 }
370
371 /* This function assumes that the caller holds data->update_lock */
372 static void w83627ehf_write_fan_div(struct w83627ehf_data *data, int nr)
373 {
374         u8 reg;
375
376         switch (nr) {
377         case 0:
378                 reg = (w83627ehf_read_value(data, W83627EHF_REG_FANDIV1) & 0xcf)
379                     | ((data->fan_div[0] & 0x03) << 4);
380                 /* fan5 input control bit is write only, compute the value */
381                 reg |= (data->has_fan & (1 << 4)) ? 1 : 0;
382                 w83627ehf_write_value(data, W83627EHF_REG_FANDIV1, reg);
383                 reg = (w83627ehf_read_value(data, W83627EHF_REG_VBAT) & 0xdf)
384                     | ((data->fan_div[0] & 0x04) << 3);
385                 w83627ehf_write_value(data, W83627EHF_REG_VBAT, reg);
386                 break;
387         case 1:
388                 reg = (w83627ehf_read_value(data, W83627EHF_REG_FANDIV1) & 0x3f)
389                     | ((data->fan_div[1] & 0x03) << 6);
390                 /* fan5 input control bit is write only, compute the value */
391                 reg |= (data->has_fan & (1 << 4)) ? 1 : 0;
392                 w83627ehf_write_value(data, W83627EHF_REG_FANDIV1, reg);
393                 reg = (w83627ehf_read_value(data, W83627EHF_REG_VBAT) & 0xbf)
394                     | ((data->fan_div[1] & 0x04) << 4);
395                 w83627ehf_write_value(data, W83627EHF_REG_VBAT, reg);
396                 break;
397         case 2:
398                 reg = (w83627ehf_read_value(data, W83627EHF_REG_FANDIV2) & 0x3f)
399                     | ((data->fan_div[2] & 0x03) << 6);
400                 w83627ehf_write_value(data, W83627EHF_REG_FANDIV2, reg);
401                 reg = (w83627ehf_read_value(data, W83627EHF_REG_VBAT) & 0x7f)
402                     | ((data->fan_div[2] & 0x04) << 5);
403                 w83627ehf_write_value(data, W83627EHF_REG_VBAT, reg);
404                 break;
405         case 3:
406                 reg = (w83627ehf_read_value(data, W83627EHF_REG_DIODE) & 0xfc)
407                     | (data->fan_div[3] & 0x03);
408                 w83627ehf_write_value(data, W83627EHF_REG_DIODE, reg);
409                 reg = (w83627ehf_read_value(data, W83627EHF_REG_SMI_OVT) & 0x7f)
410                     | ((data->fan_div[3] & 0x04) << 5);
411                 w83627ehf_write_value(data, W83627EHF_REG_SMI_OVT, reg);
412                 break;
413         case 4:
414                 reg = (w83627ehf_read_value(data, W83627EHF_REG_DIODE) & 0x73)
415                     | ((data->fan_div[4] & 0x03) << 2)
416                     | ((data->fan_div[4] & 0x04) << 5);
417                 w83627ehf_write_value(data, W83627EHF_REG_DIODE, reg);
418                 break;
419         }
420 }
421
422 static void w83627ehf_update_fan_div(struct w83627ehf_data *data)
423 {
424         int i;
425
426         i = w83627ehf_read_value(data, W83627EHF_REG_FANDIV1);
427         data->fan_div[0] = (i >> 4) & 0x03;
428         data->fan_div[1] = (i >> 6) & 0x03;
429         i = w83627ehf_read_value(data, W83627EHF_REG_FANDIV2);
430         data->fan_div[2] = (i >> 6) & 0x03;
431         i = w83627ehf_read_value(data, W83627EHF_REG_VBAT);
432         data->fan_div[0] |= (i >> 3) & 0x04;
433         data->fan_div[1] |= (i >> 4) & 0x04;
434         data->fan_div[2] |= (i >> 5) & 0x04;
435         if (data->has_fan & ((1 << 3) | (1 << 4))) {
436                 i = w83627ehf_read_value(data, W83627EHF_REG_DIODE);
437                 data->fan_div[3] = i & 0x03;
438                 data->fan_div[4] = ((i >> 2) & 0x03)
439                                  | ((i >> 5) & 0x04);
440         }
441         if (data->has_fan & (1 << 3)) {
442                 i = w83627ehf_read_value(data, W83627EHF_REG_SMI_OVT);
443                 data->fan_div[3] |= (i >> 5) & 0x04;
444         }
445 }
446
447 static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
448 {
449         struct w83627ehf_data *data = dev_get_drvdata(dev);
450         int pwmcfg = 0, tolerance = 0; /* shut up the compiler */
451         int i;
452
453         mutex_lock(&data->update_lock);
454
455         if (time_after(jiffies, data->last_updated + HZ + HZ/2)
456          || !data->valid) {
457                 /* Fan clock dividers */
458                 w83627ehf_update_fan_div(data);
459
460                 /* Measured voltages and limits */
461                 for (i = 0; i < data->in_num; i++) {
462                         data->in[i] = w83627ehf_read_value(data,
463                                       W83627EHF_REG_IN(i));
464                         data->in_min[i] = w83627ehf_read_value(data,
465                                           W83627EHF_REG_IN_MIN(i));
466                         data->in_max[i] = w83627ehf_read_value(data,
467                                           W83627EHF_REG_IN_MAX(i));
468                 }
469
470                 /* Measured fan speeds and limits */
471                 for (i = 0; i < 5; i++) {
472                         if (!(data->has_fan & (1 << i)))
473                                 continue;
474
475                         data->fan[i] = w83627ehf_read_value(data,
476                                        W83627EHF_REG_FAN[i]);
477                         data->fan_min[i] = w83627ehf_read_value(data,
478                                            W83627EHF_REG_FAN_MIN[i]);
479
480                         /* If we failed to measure the fan speed and clock
481                            divider can be increased, let's try that for next
482                            time */
483                         if (data->fan[i] == 0xff
484                          && data->fan_div[i] < 0x07) {
485                                 dev_dbg(dev, "Increasing fan%d "
486                                         "clock divider from %u to %u\n",
487                                         i + 1, div_from_reg(data->fan_div[i]),
488                                         div_from_reg(data->fan_div[i] + 1));
489                                 data->fan_div[i]++;
490                                 w83627ehf_write_fan_div(data, i);
491                                 /* Preserve min limit if possible */
492                                 if (data->fan_min[i] >= 2
493                                  && data->fan_min[i] != 255)
494                                         w83627ehf_write_value(data,
495                                                 W83627EHF_REG_FAN_MIN[i],
496                                                 (data->fan_min[i] /= 2));
497                         }
498                 }
499
500                 for (i = 0; i < 4; i++) {
501                         /* pwmcfg, tolarance mapped for i=0, i=1 to same reg */
502                         if (i != 1) {
503                                 pwmcfg = w83627ehf_read_value(data,
504                                                 W83627EHF_REG_PWM_ENABLE[i]);
505                                 tolerance = w83627ehf_read_value(data,
506                                                 W83627EHF_REG_TOLERANCE[i]);
507                         }
508                         data->pwm_mode[i] =
509                                 ((pwmcfg >> W83627EHF_PWM_MODE_SHIFT[i]) & 1)
510                                 ? 0 : 1;
511                         data->pwm_enable[i] =
512                                         ((pwmcfg >> W83627EHF_PWM_ENABLE_SHIFT[i])
513                                                 & 3) + 1;
514                         data->pwm[i] = w83627ehf_read_value(data,
515                                                 W83627EHF_REG_PWM[i]);
516                         data->fan_min_output[i] = w83627ehf_read_value(data,
517                                                 W83627EHF_REG_FAN_MIN_OUTPUT[i]);
518                         data->fan_stop_time[i] = w83627ehf_read_value(data,
519                                                 W83627EHF_REG_FAN_STOP_TIME[i]);
520                         data->target_temp[i] =
521                                 w83627ehf_read_value(data,
522                                         W83627EHF_REG_TARGET[i]) &
523                                         (data->pwm_mode[i] == 1 ? 0x7f : 0xff);
524                         data->tolerance[i] = (tolerance >> (i == 1 ? 4 : 0))
525                                                                         & 0x0f;
526                 }
527
528                 /* Measured temperatures and limits */
529                 data->temp1 = w83627ehf_read_value(data,
530                               W83627EHF_REG_TEMP1);
531                 data->temp1_max = w83627ehf_read_value(data,
532                                   W83627EHF_REG_TEMP1_OVER);
533                 data->temp1_max_hyst = w83627ehf_read_value(data,
534                                        W83627EHF_REG_TEMP1_HYST);
535                 for (i = 0; i < 2; i++) {
536                         data->temp[i] = w83627ehf_read_value(data,
537                                         W83627EHF_REG_TEMP[i]);
538                         data->temp_max[i] = w83627ehf_read_value(data,
539                                             W83627EHF_REG_TEMP_OVER[i]);
540                         data->temp_max_hyst[i] = w83627ehf_read_value(data,
541                                                  W83627EHF_REG_TEMP_HYST[i]);
542                 }
543
544                 data->alarms = w83627ehf_read_value(data,
545                                         W83627EHF_REG_ALARM1) |
546                                (w83627ehf_read_value(data,
547                                         W83627EHF_REG_ALARM2) << 8) |
548                                (w83627ehf_read_value(data,
549                                         W83627EHF_REG_ALARM3) << 16);
550
551                 data->last_updated = jiffies;
552                 data->valid = 1;
553         }
554
555         mutex_unlock(&data->update_lock);
556         return data;
557 }
558
559 /*
560  * Sysfs callback functions
561  */
562 #define show_in_reg(reg) \
563 static ssize_t \
564 show_##reg(struct device *dev, struct device_attribute *attr, \
565            char *buf) \
566 { \
567         struct w83627ehf_data *data = w83627ehf_update_device(dev); \
568         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
569         int nr = sensor_attr->index; \
570         return sprintf(buf, "%ld\n", in_from_reg(data->reg[nr], nr)); \
571 }
572 show_in_reg(in)
573 show_in_reg(in_min)
574 show_in_reg(in_max)
575
576 #define store_in_reg(REG, reg) \
577 static ssize_t \
578 store_in_##reg (struct device *dev, struct device_attribute *attr, \
579                         const char *buf, size_t count) \
580 { \
581         struct w83627ehf_data *data = dev_get_drvdata(dev); \
582         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
583         int nr = sensor_attr->index; \
584         u32 val = simple_strtoul(buf, NULL, 10); \
585  \
586         mutex_lock(&data->update_lock); \
587         data->in_##reg[nr] = in_to_reg(val, nr); \
588         w83627ehf_write_value(data, W83627EHF_REG_IN_##REG(nr), \
589                               data->in_##reg[nr]); \
590         mutex_unlock(&data->update_lock); \
591         return count; \
592 }
593
594 store_in_reg(MIN, min)
595 store_in_reg(MAX, max)
596
597 static ssize_t show_alarm(struct device *dev, struct device_attribute *attr, char *buf)
598 {
599         struct w83627ehf_data *data = w83627ehf_update_device(dev);
600         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
601         int nr = sensor_attr->index;
602         return sprintf(buf, "%u\n", (data->alarms >> nr) & 0x01);
603 }
604
605 static struct sensor_device_attribute sda_in_input[] = {
606         SENSOR_ATTR(in0_input, S_IRUGO, show_in, NULL, 0),
607         SENSOR_ATTR(in1_input, S_IRUGO, show_in, NULL, 1),
608         SENSOR_ATTR(in2_input, S_IRUGO, show_in, NULL, 2),
609         SENSOR_ATTR(in3_input, S_IRUGO, show_in, NULL, 3),
610         SENSOR_ATTR(in4_input, S_IRUGO, show_in, NULL, 4),
611         SENSOR_ATTR(in5_input, S_IRUGO, show_in, NULL, 5),
612         SENSOR_ATTR(in6_input, S_IRUGO, show_in, NULL, 6),
613         SENSOR_ATTR(in7_input, S_IRUGO, show_in, NULL, 7),
614         SENSOR_ATTR(in8_input, S_IRUGO, show_in, NULL, 8),
615         SENSOR_ATTR(in9_input, S_IRUGO, show_in, NULL, 9),
616 };
617
618 static struct sensor_device_attribute sda_in_alarm[] = {
619         SENSOR_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0),
620         SENSOR_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1),
621         SENSOR_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2),
622         SENSOR_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3),
623         SENSOR_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8),
624         SENSOR_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 21),
625         SENSOR_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 20),
626         SENSOR_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 16),
627         SENSOR_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 17),
628         SENSOR_ATTR(in9_alarm, S_IRUGO, show_alarm, NULL, 19),
629 };
630
631 static struct sensor_device_attribute sda_in_min[] = {
632        SENSOR_ATTR(in0_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 0),
633        SENSOR_ATTR(in1_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 1),
634        SENSOR_ATTR(in2_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 2),
635        SENSOR_ATTR(in3_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 3),
636        SENSOR_ATTR(in4_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 4),
637        SENSOR_ATTR(in5_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 5),
638        SENSOR_ATTR(in6_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 6),
639        SENSOR_ATTR(in7_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 7),
640        SENSOR_ATTR(in8_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 8),
641        SENSOR_ATTR(in9_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 9),
642 };
643
644 static struct sensor_device_attribute sda_in_max[] = {
645        SENSOR_ATTR(in0_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 0),
646        SENSOR_ATTR(in1_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 1),
647        SENSOR_ATTR(in2_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 2),
648        SENSOR_ATTR(in3_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 3),
649        SENSOR_ATTR(in4_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 4),
650        SENSOR_ATTR(in5_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 5),
651        SENSOR_ATTR(in6_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 6),
652        SENSOR_ATTR(in7_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 7),
653        SENSOR_ATTR(in8_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 8),
654        SENSOR_ATTR(in9_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 9),
655 };
656
657 #define show_fan_reg(reg) \
658 static ssize_t \
659 show_##reg(struct device *dev, struct device_attribute *attr, \
660            char *buf) \
661 { \
662         struct w83627ehf_data *data = w83627ehf_update_device(dev); \
663         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
664         int nr = sensor_attr->index; \
665         return sprintf(buf, "%d\n", \
666                        fan_from_reg(data->reg[nr], \
667                                     div_from_reg(data->fan_div[nr]))); \
668 }
669 show_fan_reg(fan);
670 show_fan_reg(fan_min);
671
672 static ssize_t
673 show_fan_div(struct device *dev, struct device_attribute *attr,
674              char *buf)
675 {
676         struct w83627ehf_data *data = w83627ehf_update_device(dev);
677         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
678         int nr = sensor_attr->index;
679         return sprintf(buf, "%u\n", div_from_reg(data->fan_div[nr]));
680 }
681
682 static ssize_t
683 store_fan_min(struct device *dev, struct device_attribute *attr,
684               const char *buf, size_t count)
685 {
686         struct w83627ehf_data *data = dev_get_drvdata(dev);
687         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
688         int nr = sensor_attr->index;
689         unsigned int val = simple_strtoul(buf, NULL, 10);
690         unsigned int reg;
691         u8 new_div;
692
693         mutex_lock(&data->update_lock);
694         if (!val) {
695                 /* No min limit, alarm disabled */
696                 data->fan_min[nr] = 255;
697                 new_div = data->fan_div[nr]; /* No change */
698                 dev_info(dev, "fan%u low limit and alarm disabled\n", nr + 1);
699         } else if ((reg = 1350000U / val) >= 128 * 255) {
700                 /* Speed below this value cannot possibly be represented,
701                    even with the highest divider (128) */
702                 data->fan_min[nr] = 254;
703                 new_div = 7; /* 128 == (1 << 7) */
704                 dev_warn(dev, "fan%u low limit %u below minimum %u, set to "
705                          "minimum\n", nr + 1, val, fan_from_reg(254, 128));
706         } else if (!reg) {
707                 /* Speed above this value cannot possibly be represented,
708                    even with the lowest divider (1) */
709                 data->fan_min[nr] = 1;
710                 new_div = 0; /* 1 == (1 << 0) */
711                 dev_warn(dev, "fan%u low limit %u above maximum %u, set to "
712                          "maximum\n", nr + 1, val, fan_from_reg(1, 1));
713         } else {
714                 /* Automatically pick the best divider, i.e. the one such
715                    that the min limit will correspond to a register value
716                    in the 96..192 range */
717                 new_div = 0;
718                 while (reg > 192 && new_div < 7) {
719                         reg >>= 1;
720                         new_div++;
721                 }
722                 data->fan_min[nr] = reg;
723         }
724
725         /* Write both the fan clock divider (if it changed) and the new
726            fan min (unconditionally) */
727         if (new_div != data->fan_div[nr]) {
728                 /* Preserve the fan speed reading */
729                 if (data->fan[nr] != 0xff) {
730                         if (new_div > data->fan_div[nr])
731                                 data->fan[nr] >>= new_div - data->fan_div[nr];
732                         else if (data->fan[nr] & 0x80)
733                                 data->fan[nr] = 0xff;
734                         else
735                                 data->fan[nr] <<= data->fan_div[nr] - new_div;
736                 }
737
738                 dev_dbg(dev, "fan%u clock divider changed from %u to %u\n",
739                         nr + 1, div_from_reg(data->fan_div[nr]),
740                         div_from_reg(new_div));
741                 data->fan_div[nr] = new_div;
742                 w83627ehf_write_fan_div(data, nr);
743                 /* Give the chip time to sample a new speed value */
744                 data->last_updated = jiffies;
745         }
746         w83627ehf_write_value(data, W83627EHF_REG_FAN_MIN[nr],
747                               data->fan_min[nr]);
748         mutex_unlock(&data->update_lock);
749
750         return count;
751 }
752
753 static struct sensor_device_attribute sda_fan_input[] = {
754         SENSOR_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0),
755         SENSOR_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1),
756         SENSOR_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2),
757         SENSOR_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 3),
758         SENSOR_ATTR(fan5_input, S_IRUGO, show_fan, NULL, 4),
759 };
760
761 static struct sensor_device_attribute sda_fan_alarm[] = {
762         SENSOR_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6),
763         SENSOR_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7),
764         SENSOR_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 11),
765         SENSOR_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 10),
766         SENSOR_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 23),
767 };
768
769 static struct sensor_device_attribute sda_fan_min[] = {
770         SENSOR_ATTR(fan1_min, S_IWUSR | S_IRUGO, show_fan_min,
771                     store_fan_min, 0),
772         SENSOR_ATTR(fan2_min, S_IWUSR | S_IRUGO, show_fan_min,
773                     store_fan_min, 1),
774         SENSOR_ATTR(fan3_min, S_IWUSR | S_IRUGO, show_fan_min,
775                     store_fan_min, 2),
776         SENSOR_ATTR(fan4_min, S_IWUSR | S_IRUGO, show_fan_min,
777                     store_fan_min, 3),
778         SENSOR_ATTR(fan5_min, S_IWUSR | S_IRUGO, show_fan_min,
779                     store_fan_min, 4),
780 };
781
782 static struct sensor_device_attribute sda_fan_div[] = {
783         SENSOR_ATTR(fan1_div, S_IRUGO, show_fan_div, NULL, 0),
784         SENSOR_ATTR(fan2_div, S_IRUGO, show_fan_div, NULL, 1),
785         SENSOR_ATTR(fan3_div, S_IRUGO, show_fan_div, NULL, 2),
786         SENSOR_ATTR(fan4_div, S_IRUGO, show_fan_div, NULL, 3),
787         SENSOR_ATTR(fan5_div, S_IRUGO, show_fan_div, NULL, 4),
788 };
789
790 #define show_temp1_reg(reg) \
791 static ssize_t \
792 show_##reg(struct device *dev, struct device_attribute *attr, \
793            char *buf) \
794 { \
795         struct w83627ehf_data *data = w83627ehf_update_device(dev); \
796         return sprintf(buf, "%d\n", temp1_from_reg(data->reg)); \
797 }
798 show_temp1_reg(temp1);
799 show_temp1_reg(temp1_max);
800 show_temp1_reg(temp1_max_hyst);
801
802 #define store_temp1_reg(REG, reg) \
803 static ssize_t \
804 store_temp1_##reg(struct device *dev, struct device_attribute *attr, \
805                   const char *buf, size_t count) \
806 { \
807         struct w83627ehf_data *data = dev_get_drvdata(dev); \
808         long val = simple_strtol(buf, NULL, 10); \
809  \
810         mutex_lock(&data->update_lock); \
811         data->temp1_##reg = temp1_to_reg(val, -128000, 127000); \
812         w83627ehf_write_value(data, W83627EHF_REG_TEMP1_##REG, \
813                               data->temp1_##reg); \
814         mutex_unlock(&data->update_lock); \
815         return count; \
816 }
817 store_temp1_reg(OVER, max);
818 store_temp1_reg(HYST, max_hyst);
819
820 #define show_temp_reg(reg) \
821 static ssize_t \
822 show_##reg(struct device *dev, struct device_attribute *attr, \
823            char *buf) \
824 { \
825         struct w83627ehf_data *data = w83627ehf_update_device(dev); \
826         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
827         int nr = sensor_attr->index; \
828         return sprintf(buf, "%d\n", \
829                        LM75_TEMP_FROM_REG(data->reg[nr])); \
830 }
831 show_temp_reg(temp);
832 show_temp_reg(temp_max);
833 show_temp_reg(temp_max_hyst);
834
835 #define store_temp_reg(REG, reg) \
836 static ssize_t \
837 store_##reg(struct device *dev, struct device_attribute *attr, \
838             const char *buf, size_t count) \
839 { \
840         struct w83627ehf_data *data = dev_get_drvdata(dev); \
841         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
842         int nr = sensor_attr->index; \
843         long val = simple_strtol(buf, NULL, 10); \
844  \
845         mutex_lock(&data->update_lock); \
846         data->reg[nr] = LM75_TEMP_TO_REG(val); \
847         w83627ehf_write_value(data, W83627EHF_REG_TEMP_##REG[nr], \
848                               data->reg[nr]); \
849         mutex_unlock(&data->update_lock); \
850         return count; \
851 }
852 store_temp_reg(OVER, temp_max);
853 store_temp_reg(HYST, temp_max_hyst);
854
855 static ssize_t
856 show_temp_type(struct device *dev, struct device_attribute *attr, char *buf)
857 {
858         struct w83627ehf_data *data = w83627ehf_update_device(dev);
859         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
860         int nr = sensor_attr->index;
861         return sprintf(buf, "%d\n", (int)data->temp_type[nr]);
862 }
863
864 static struct sensor_device_attribute sda_temp[] = {
865         SENSOR_ATTR(temp1_input, S_IRUGO, show_temp1, NULL, 0),
866         SENSOR_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 0),
867         SENSOR_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 1),
868         SENSOR_ATTR(temp1_max, S_IRUGO | S_IWUSR, show_temp1_max,
869                     store_temp1_max, 0),
870         SENSOR_ATTR(temp2_max, S_IRUGO | S_IWUSR, show_temp_max,
871                     store_temp_max, 0),
872         SENSOR_ATTR(temp3_max, S_IRUGO | S_IWUSR, show_temp_max,
873                     store_temp_max, 1),
874         SENSOR_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR, show_temp1_max_hyst,
875                     store_temp1_max_hyst, 0),
876         SENSOR_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
877                     store_temp_max_hyst, 0),
878         SENSOR_ATTR(temp3_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
879                     store_temp_max_hyst, 1),
880         SENSOR_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4),
881         SENSOR_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5),
882         SENSOR_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13),
883         SENSOR_ATTR(temp1_type, S_IRUGO, show_temp_type, NULL, 0),
884         SENSOR_ATTR(temp2_type, S_IRUGO, show_temp_type, NULL, 1),
885         SENSOR_ATTR(temp3_type, S_IRUGO, show_temp_type, NULL, 2),
886 };
887
888 #define show_pwm_reg(reg) \
889 static ssize_t show_##reg (struct device *dev, struct device_attribute *attr, \
890                                 char *buf) \
891 { \
892         struct w83627ehf_data *data = w83627ehf_update_device(dev); \
893         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
894         int nr = sensor_attr->index; \
895         return sprintf(buf, "%d\n", data->reg[nr]); \
896 }
897
898 show_pwm_reg(pwm_mode)
899 show_pwm_reg(pwm_enable)
900 show_pwm_reg(pwm)
901
902 static ssize_t
903 store_pwm_mode(struct device *dev, struct device_attribute *attr,
904                         const char *buf, size_t count)
905 {
906         struct w83627ehf_data *data = dev_get_drvdata(dev);
907         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
908         int nr = sensor_attr->index;
909         u32 val = simple_strtoul(buf, NULL, 10);
910         u16 reg;
911
912         if (val > 1)
913                 return -EINVAL;
914         mutex_lock(&data->update_lock);
915         reg = w83627ehf_read_value(data, W83627EHF_REG_PWM_ENABLE[nr]);
916         data->pwm_mode[nr] = val;
917         reg &= ~(1 << W83627EHF_PWM_MODE_SHIFT[nr]);
918         if (!val)
919                 reg |= 1 << W83627EHF_PWM_MODE_SHIFT[nr];
920         w83627ehf_write_value(data, W83627EHF_REG_PWM_ENABLE[nr], reg);
921         mutex_unlock(&data->update_lock);
922         return count;
923 }
924
925 static ssize_t
926 store_pwm(struct device *dev, struct device_attribute *attr,
927                         const char *buf, size_t count)
928 {
929         struct w83627ehf_data *data = dev_get_drvdata(dev);
930         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
931         int nr = sensor_attr->index;
932         u32 val = SENSORS_LIMIT(simple_strtoul(buf, NULL, 10), 0, 255);
933
934         mutex_lock(&data->update_lock);
935         data->pwm[nr] = val;
936         w83627ehf_write_value(data, W83627EHF_REG_PWM[nr], val);
937         mutex_unlock(&data->update_lock);
938         return count;
939 }
940
941 static ssize_t
942 store_pwm_enable(struct device *dev, struct device_attribute *attr,
943                         const char *buf, size_t count)
944 {
945         struct w83627ehf_data *data = dev_get_drvdata(dev);
946         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
947         int nr = sensor_attr->index;
948         u32 val = simple_strtoul(buf, NULL, 10);
949         u16 reg;
950
951         if (!val || (val > 2))  /* only modes 1 and 2 are supported */
952                 return -EINVAL;
953         mutex_lock(&data->update_lock);
954         reg = w83627ehf_read_value(data, W83627EHF_REG_PWM_ENABLE[nr]);
955         data->pwm_enable[nr] = val;
956         reg &= ~(0x03 << W83627EHF_PWM_ENABLE_SHIFT[nr]);
957         reg |= (val - 1) << W83627EHF_PWM_ENABLE_SHIFT[nr];
958         w83627ehf_write_value(data, W83627EHF_REG_PWM_ENABLE[nr], reg);
959         mutex_unlock(&data->update_lock);
960         return count;
961 }
962
963
964 #define show_tol_temp(reg) \
965 static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
966                                 char *buf) \
967 { \
968         struct w83627ehf_data *data = w83627ehf_update_device(dev); \
969         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
970         int nr = sensor_attr->index; \
971         return sprintf(buf, "%d\n", temp1_from_reg(data->reg[nr])); \
972 }
973
974 show_tol_temp(tolerance)
975 show_tol_temp(target_temp)
976
977 static ssize_t
978 store_target_temp(struct device *dev, struct device_attribute *attr,
979                         const char *buf, size_t count)
980 {
981         struct w83627ehf_data *data = dev_get_drvdata(dev);
982         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
983         int nr = sensor_attr->index;
984         u8 val = temp1_to_reg(simple_strtoul(buf, NULL, 10), 0, 127000);
985
986         mutex_lock(&data->update_lock);
987         data->target_temp[nr] = val;
988         w83627ehf_write_value(data, W83627EHF_REG_TARGET[nr], val);
989         mutex_unlock(&data->update_lock);
990         return count;
991 }
992
993 static ssize_t
994 store_tolerance(struct device *dev, struct device_attribute *attr,
995                         const char *buf, size_t count)
996 {
997         struct w83627ehf_data *data = dev_get_drvdata(dev);
998         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
999         int nr = sensor_attr->index;
1000         u16 reg;
1001         /* Limit the temp to 0C - 15C */
1002         u8 val = temp1_to_reg(simple_strtoul(buf, NULL, 10), 0, 15000);
1003
1004         mutex_lock(&data->update_lock);
1005         reg = w83627ehf_read_value(data, W83627EHF_REG_TOLERANCE[nr]);
1006         data->tolerance[nr] = val;
1007         if (nr == 1)
1008                 reg = (reg & 0x0f) | (val << 4);
1009         else
1010                 reg = (reg & 0xf0) | val;
1011         w83627ehf_write_value(data, W83627EHF_REG_TOLERANCE[nr], reg);
1012         mutex_unlock(&data->update_lock);
1013         return count;
1014 }
1015
1016 static struct sensor_device_attribute sda_pwm[] = {
1017         SENSOR_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0),
1018         SENSOR_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 1),
1019         SENSOR_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 2),
1020         SENSOR_ATTR(pwm4, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 3),
1021 };
1022
1023 static struct sensor_device_attribute sda_pwm_mode[] = {
1024         SENSOR_ATTR(pwm1_mode, S_IWUSR | S_IRUGO, show_pwm_mode,
1025                     store_pwm_mode, 0),
1026         SENSOR_ATTR(pwm2_mode, S_IWUSR | S_IRUGO, show_pwm_mode,
1027                     store_pwm_mode, 1),
1028         SENSOR_ATTR(pwm3_mode, S_IWUSR | S_IRUGO, show_pwm_mode,
1029                     store_pwm_mode, 2),
1030         SENSOR_ATTR(pwm4_mode, S_IWUSR | S_IRUGO, show_pwm_mode,
1031                     store_pwm_mode, 3),
1032 };
1033
1034 static struct sensor_device_attribute sda_pwm_enable[] = {
1035         SENSOR_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
1036                     store_pwm_enable, 0),
1037         SENSOR_ATTR(pwm2_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
1038                     store_pwm_enable, 1),
1039         SENSOR_ATTR(pwm3_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
1040                     store_pwm_enable, 2),
1041         SENSOR_ATTR(pwm4_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
1042                     store_pwm_enable, 3),
1043 };
1044
1045 static struct sensor_device_attribute sda_target_temp[] = {
1046         SENSOR_ATTR(pwm1_target, S_IWUSR | S_IRUGO, show_target_temp,
1047                     store_target_temp, 0),
1048         SENSOR_ATTR(pwm2_target, S_IWUSR | S_IRUGO, show_target_temp,
1049                     store_target_temp, 1),
1050         SENSOR_ATTR(pwm3_target, S_IWUSR | S_IRUGO, show_target_temp,
1051                     store_target_temp, 2),
1052         SENSOR_ATTR(pwm4_target, S_IWUSR | S_IRUGO, show_target_temp,
1053                     store_target_temp, 3),
1054 };
1055
1056 static struct sensor_device_attribute sda_tolerance[] = {
1057         SENSOR_ATTR(pwm1_tolerance, S_IWUSR | S_IRUGO, show_tolerance,
1058                     store_tolerance, 0),
1059         SENSOR_ATTR(pwm2_tolerance, S_IWUSR | S_IRUGO, show_tolerance,
1060                     store_tolerance, 1),
1061         SENSOR_ATTR(pwm3_tolerance, S_IWUSR | S_IRUGO, show_tolerance,
1062                     store_tolerance, 2),
1063         SENSOR_ATTR(pwm4_tolerance, S_IWUSR | S_IRUGO, show_tolerance,
1064                     store_tolerance, 3),
1065 };
1066
1067 /* Smart Fan registers */
1068
1069 #define fan_functions(reg, REG) \
1070 static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
1071                        char *buf) \
1072 { \
1073         struct w83627ehf_data *data = w83627ehf_update_device(dev); \
1074         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
1075         int nr = sensor_attr->index; \
1076         return sprintf(buf, "%d\n", data->reg[nr]); \
1077 }\
1078 static ssize_t \
1079 store_##reg(struct device *dev, struct device_attribute *attr, \
1080                             const char *buf, size_t count) \
1081 {\
1082         struct w83627ehf_data *data = dev_get_drvdata(dev); \
1083         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
1084         int nr = sensor_attr->index; \
1085         u32 val = SENSORS_LIMIT(simple_strtoul(buf, NULL, 10), 1, 255); \
1086         mutex_lock(&data->update_lock); \
1087         data->reg[nr] = val; \
1088         w83627ehf_write_value(data, W83627EHF_REG_##REG[nr], val); \
1089         mutex_unlock(&data->update_lock); \
1090         return count; \
1091 }
1092
1093 fan_functions(fan_min_output, FAN_MIN_OUTPUT)
1094
1095 #define fan_time_functions(reg, REG) \
1096 static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
1097                                 char *buf) \
1098 { \
1099         struct w83627ehf_data *data = w83627ehf_update_device(dev); \
1100         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
1101         int nr = sensor_attr->index; \
1102         return sprintf(buf, "%d\n", \
1103                         step_time_from_reg(data->reg[nr], data->pwm_mode[nr])); \
1104 } \
1105 \
1106 static ssize_t \
1107 store_##reg(struct device *dev, struct device_attribute *attr, \
1108                         const char *buf, size_t count) \
1109 { \
1110         struct w83627ehf_data *data = dev_get_drvdata(dev); \
1111         struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
1112         int nr = sensor_attr->index; \
1113         u8 val = step_time_to_reg(simple_strtoul(buf, NULL, 10), \
1114                                         data->pwm_mode[nr]); \
1115         mutex_lock(&data->update_lock); \
1116         data->reg[nr] = val; \
1117         w83627ehf_write_value(data, W83627EHF_REG_##REG[nr], val); \
1118         mutex_unlock(&data->update_lock); \
1119         return count; \
1120 } \
1121
1122 fan_time_functions(fan_stop_time, FAN_STOP_TIME)
1123
1124 static ssize_t show_name(struct device *dev, struct device_attribute *attr,
1125                          char *buf)
1126 {
1127         struct w83627ehf_data *data = dev_get_drvdata(dev);
1128
1129         return sprintf(buf, "%s\n", data->name);
1130 }
1131 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
1132
1133 static struct sensor_device_attribute sda_sf3_arrays_fan4[] = {
1134         SENSOR_ATTR(pwm4_stop_time, S_IWUSR | S_IRUGO, show_fan_stop_time,
1135                     store_fan_stop_time, 3),
1136         SENSOR_ATTR(pwm4_min_output, S_IWUSR | S_IRUGO, show_fan_min_output,
1137                     store_fan_min_output, 3),
1138 };
1139
1140 static struct sensor_device_attribute sda_sf3_arrays[] = {
1141         SENSOR_ATTR(pwm1_stop_time, S_IWUSR | S_IRUGO, show_fan_stop_time,
1142                     store_fan_stop_time, 0),
1143         SENSOR_ATTR(pwm2_stop_time, S_IWUSR | S_IRUGO, show_fan_stop_time,
1144                     store_fan_stop_time, 1),
1145         SENSOR_ATTR(pwm3_stop_time, S_IWUSR | S_IRUGO, show_fan_stop_time,
1146                     store_fan_stop_time, 2),
1147         SENSOR_ATTR(pwm1_min_output, S_IWUSR | S_IRUGO, show_fan_min_output,
1148                     store_fan_min_output, 0),
1149         SENSOR_ATTR(pwm2_min_output, S_IWUSR | S_IRUGO, show_fan_min_output,
1150                     store_fan_min_output, 1),
1151         SENSOR_ATTR(pwm3_min_output, S_IWUSR | S_IRUGO, show_fan_min_output,
1152                     store_fan_min_output, 2),
1153 };
1154
1155 static ssize_t
1156 show_vid(struct device *dev, struct device_attribute *attr, char *buf)
1157 {
1158         struct w83627ehf_data *data = dev_get_drvdata(dev);
1159         return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
1160 }
1161 static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
1162
1163 /*
1164  * Driver and device management
1165  */
1166
1167 static void w83627ehf_device_remove_files(struct device *dev)
1168 {
1169         /* some entries in the following arrays may not have been used in
1170          * device_create_file(), but device_remove_file() will ignore them */
1171         int i;
1172         struct w83627ehf_data *data = dev_get_drvdata(dev);
1173
1174         for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays); i++)
1175                 device_remove_file(dev, &sda_sf3_arrays[i].dev_attr);
1176         for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays_fan4); i++)
1177                 device_remove_file(dev, &sda_sf3_arrays_fan4[i].dev_attr);
1178         for (i = 0; i < data->in_num; i++) {
1179                 device_remove_file(dev, &sda_in_input[i].dev_attr);
1180                 device_remove_file(dev, &sda_in_alarm[i].dev_attr);
1181                 device_remove_file(dev, &sda_in_min[i].dev_attr);
1182                 device_remove_file(dev, &sda_in_max[i].dev_attr);
1183         }
1184         for (i = 0; i < 5; i++) {
1185                 device_remove_file(dev, &sda_fan_input[i].dev_attr);
1186                 device_remove_file(dev, &sda_fan_alarm[i].dev_attr);
1187                 device_remove_file(dev, &sda_fan_div[i].dev_attr);
1188                 device_remove_file(dev, &sda_fan_min[i].dev_attr);
1189         }
1190         for (i = 0; i < 4; i++) {
1191                 device_remove_file(dev, &sda_pwm[i].dev_attr);
1192                 device_remove_file(dev, &sda_pwm_mode[i].dev_attr);
1193                 device_remove_file(dev, &sda_pwm_enable[i].dev_attr);
1194                 device_remove_file(dev, &sda_target_temp[i].dev_attr);
1195                 device_remove_file(dev, &sda_tolerance[i].dev_attr);
1196         }
1197         for (i = 0; i < ARRAY_SIZE(sda_temp); i++)
1198                 device_remove_file(dev, &sda_temp[i].dev_attr);
1199
1200         device_remove_file(dev, &dev_attr_name);
1201         if (data->vid != 0x3f)
1202                 device_remove_file(dev, &dev_attr_cpu0_vid);
1203 }
1204
1205 /* Get the monitoring functions started */
1206 static inline void __devinit w83627ehf_init_device(struct w83627ehf_data *data)
1207 {
1208         int i;
1209         u8 tmp, diode;
1210
1211         /* Start monitoring is needed */
1212         tmp = w83627ehf_read_value(data, W83627EHF_REG_CONFIG);
1213         if (!(tmp & 0x01))
1214                 w83627ehf_write_value(data, W83627EHF_REG_CONFIG,
1215                                       tmp | 0x01);
1216
1217         /* Enable temp2 and temp3 if needed */
1218         for (i = 0; i < 2; i++) {
1219                 tmp = w83627ehf_read_value(data,
1220                                            W83627EHF_REG_TEMP_CONFIG[i]);
1221                 if (tmp & 0x01)
1222                         w83627ehf_write_value(data,
1223                                               W83627EHF_REG_TEMP_CONFIG[i],
1224                                               tmp & 0xfe);
1225         }
1226
1227         /* Enable VBAT monitoring if needed */
1228         tmp = w83627ehf_read_value(data, W83627EHF_REG_VBAT);
1229         if (!(tmp & 0x01))
1230                 w83627ehf_write_value(data, W83627EHF_REG_VBAT, tmp | 0x01);
1231
1232         /* Get thermal sensor types */
1233         diode = w83627ehf_read_value(data, W83627EHF_REG_DIODE);
1234         for (i = 0; i < 3; i++) {
1235                 if ((tmp & (0x02 << i)))
1236                         data->temp_type[i] = (diode & (0x10 << i)) ? 1 : 2;
1237                 else
1238                         data->temp_type[i] = 4; /* thermistor */
1239         }
1240 }
1241
1242 static int __devinit w83627ehf_probe(struct platform_device *pdev)
1243 {
1244         struct device *dev = &pdev->dev;
1245         struct w83627ehf_sio_data *sio_data = dev->platform_data;
1246         struct w83627ehf_data *data;
1247         struct resource *res;
1248         u8 fan4pin, fan5pin, en_vrm10;
1249         int i, err = 0;
1250
1251         res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1252         if (!request_region(res->start, IOREGION_LENGTH, DRVNAME)) {
1253                 err = -EBUSY;
1254                 dev_err(dev, "Failed to request region 0x%lx-0x%lx\n",
1255                         (unsigned long)res->start,
1256                         (unsigned long)res->start + IOREGION_LENGTH - 1);
1257                 goto exit;
1258         }
1259
1260         if (!(data = kzalloc(sizeof(struct w83627ehf_data), GFP_KERNEL))) {
1261                 err = -ENOMEM;
1262                 goto exit_release;
1263         }
1264
1265         data->addr = res->start;
1266         mutex_init(&data->lock);
1267         mutex_init(&data->update_lock);
1268         data->name = w83627ehf_device_names[sio_data->kind];
1269         platform_set_drvdata(pdev, data);
1270
1271         /* 627EHG and 627EHF have 10 voltage inputs; DHG has 9 */
1272         data->in_num = (sio_data->kind == w83627dhg) ? 9 : 10;
1273
1274         /* Initialize the chip */
1275         w83627ehf_init_device(data);
1276
1277         data->vrm = vid_which_vrm();
1278         superio_enter(sio_data->sioreg);
1279         /* Read VID value */
1280         superio_select(sio_data->sioreg, W83627EHF_LD_HWM);
1281         if (superio_inb(sio_data->sioreg, SIO_REG_VID_CTRL) & 0x80) {
1282                 /* Set VID input sensibility if needed. In theory the BIOS
1283                    should have set it, but in practice it's not always the
1284                    case. We only do it for the W83627EHF/EHG because the
1285                    W83627DHG is more complex in this respect. */
1286                 if (sio_data->kind == w83627ehf) {
1287                         en_vrm10 = superio_inb(sio_data->sioreg,
1288                                                SIO_REG_EN_VRM10);
1289                         if ((en_vrm10 & 0x08) && data->vrm == 90) {
1290                                 dev_warn(dev, "Setting VID input voltage to "
1291                                          "TTL\n");
1292                                 superio_outb(sio_data->sioreg, SIO_REG_EN_VRM10,
1293                                              en_vrm10 & ~0x08);
1294                         } else if (!(en_vrm10 & 0x08) && data->vrm == 100) {
1295                                 dev_warn(dev, "Setting VID input voltage to "
1296                                          "VRM10\n");
1297                                 superio_outb(sio_data->sioreg, SIO_REG_EN_VRM10,
1298                                              en_vrm10 | 0x08);
1299                         }
1300                 }
1301
1302                 data->vid = superio_inb(sio_data->sioreg, SIO_REG_VID_DATA) & 0x3f;
1303         } else {
1304                 dev_info(dev, "VID pins in output mode, CPU VID not "
1305                          "available\n");
1306                 data->vid = 0x3f;
1307         }
1308
1309         /* fan4 and fan5 share some pins with the GPIO and serial flash */
1310
1311         fan5pin = superio_inb(sio_data->sioreg, 0x24) & 0x2;
1312         fan4pin = superio_inb(sio_data->sioreg, 0x29) & 0x6;
1313         superio_exit(sio_data->sioreg);
1314
1315         /* It looks like fan4 and fan5 pins can be alternatively used
1316            as fan on/off switches, but fan5 control is write only :/
1317            We assume that if the serial interface is disabled, designers
1318            connected fan5 as input unless they are emitting log 1, which
1319            is not the default. */
1320
1321         data->has_fan = 0x07; /* fan1, fan2 and fan3 */
1322         i = w83627ehf_read_value(data, W83627EHF_REG_FANDIV1);
1323         if ((i & (1 << 2)) && (!fan4pin))
1324                 data->has_fan |= (1 << 3);
1325         if (!(i & (1 << 1)) && (!fan5pin))
1326                 data->has_fan |= (1 << 4);
1327
1328         /* Read fan clock dividers immediately */
1329         w83627ehf_update_fan_div(data);
1330
1331         /* Register sysfs hooks */
1332         for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays); i++)
1333                 if ((err = device_create_file(dev,
1334                         &sda_sf3_arrays[i].dev_attr)))
1335                         goto exit_remove;
1336
1337         /* if fan4 is enabled create the sf3 files for it */
1338         if (data->has_fan & (1 << 3))
1339                 for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays_fan4); i++) {
1340                         if ((err = device_create_file(dev,
1341                                 &sda_sf3_arrays_fan4[i].dev_attr)))
1342                                 goto exit_remove;
1343                 }
1344
1345         for (i = 0; i < data->in_num; i++)
1346                 if ((err = device_create_file(dev, &sda_in_input[i].dev_attr))
1347                         || (err = device_create_file(dev,
1348                                 &sda_in_alarm[i].dev_attr))
1349                         || (err = device_create_file(dev,
1350                                 &sda_in_min[i].dev_attr))
1351                         || (err = device_create_file(dev,
1352                                 &sda_in_max[i].dev_attr)))
1353                         goto exit_remove;
1354
1355         for (i = 0; i < 5; i++) {
1356                 if (data->has_fan & (1 << i)) {
1357                         if ((err = device_create_file(dev,
1358                                         &sda_fan_input[i].dev_attr))
1359                                 || (err = device_create_file(dev,
1360                                         &sda_fan_alarm[i].dev_attr))
1361                                 || (err = device_create_file(dev,
1362                                         &sda_fan_div[i].dev_attr))
1363                                 || (err = device_create_file(dev,
1364                                         &sda_fan_min[i].dev_attr)))
1365                                 goto exit_remove;
1366                         if (i < 4 && /* w83627ehf only has 4 pwm */
1367                                 ((err = device_create_file(dev,
1368                                         &sda_pwm[i].dev_attr))
1369                                 || (err = device_create_file(dev,
1370                                         &sda_pwm_mode[i].dev_attr))
1371                                 || (err = device_create_file(dev,
1372                                         &sda_pwm_enable[i].dev_attr))
1373                                 || (err = device_create_file(dev,
1374                                         &sda_target_temp[i].dev_attr))
1375                                 || (err = device_create_file(dev,
1376                                         &sda_tolerance[i].dev_attr))))
1377                                 goto exit_remove;
1378                 }
1379         }
1380
1381         for (i = 0; i < ARRAY_SIZE(sda_temp); i++)
1382                 if ((err = device_create_file(dev, &sda_temp[i].dev_attr)))
1383                         goto exit_remove;
1384
1385         err = device_create_file(dev, &dev_attr_name);
1386         if (err)
1387                 goto exit_remove;
1388
1389         if (data->vid != 0x3f) {
1390                 err = device_create_file(dev, &dev_attr_cpu0_vid);
1391                 if (err)
1392                         goto exit_remove;
1393         }
1394
1395         data->hwmon_dev = hwmon_device_register(dev);
1396         if (IS_ERR(data->hwmon_dev)) {
1397                 err = PTR_ERR(data->hwmon_dev);
1398                 goto exit_remove;
1399         }
1400
1401         return 0;
1402
1403 exit_remove:
1404         w83627ehf_device_remove_files(dev);
1405         kfree(data);
1406         platform_set_drvdata(pdev, NULL);
1407 exit_release:
1408         release_region(res->start, IOREGION_LENGTH);
1409 exit:
1410         return err;
1411 }
1412
1413 static int __devexit w83627ehf_remove(struct platform_device *pdev)
1414 {
1415         struct w83627ehf_data *data = platform_get_drvdata(pdev);
1416
1417         hwmon_device_unregister(data->hwmon_dev);
1418         w83627ehf_device_remove_files(&pdev->dev);
1419         release_region(data->addr, IOREGION_LENGTH);
1420         platform_set_drvdata(pdev, NULL);
1421         kfree(data);
1422
1423         return 0;
1424 }
1425
1426 static struct platform_driver w83627ehf_driver = {
1427         .driver = {
1428                 .owner  = THIS_MODULE,
1429                 .name   = DRVNAME,
1430         },
1431         .probe          = w83627ehf_probe,
1432         .remove         = __devexit_p(w83627ehf_remove),
1433 };
1434
1435 /* w83627ehf_find() looks for a '627 in the Super-I/O config space */
1436 static int __init w83627ehf_find(int sioaddr, unsigned short *addr,
1437                                  struct w83627ehf_sio_data *sio_data)
1438 {
1439         static const char __initdata sio_name_W83627EHF[] = "W83627EHF";
1440         static const char __initdata sio_name_W83627EHG[] = "W83627EHG";
1441         static const char __initdata sio_name_W83627DHG[] = "W83627DHG";
1442
1443         u16 val;
1444         const char *sio_name;
1445
1446         superio_enter(sioaddr);
1447
1448         val = (superio_inb(sioaddr, SIO_REG_DEVID) << 8)
1449             | superio_inb(sioaddr, SIO_REG_DEVID + 1);
1450         switch (val & SIO_ID_MASK) {
1451         case SIO_W83627EHF_ID:
1452                 sio_data->kind = w83627ehf;
1453                 sio_name = sio_name_W83627EHF;
1454                 break;
1455         case SIO_W83627EHG_ID:
1456                 sio_data->kind = w83627ehf;
1457                 sio_name = sio_name_W83627EHG;
1458                 break;
1459         case SIO_W83627DHG_ID:
1460                 sio_data->kind = w83627dhg;
1461                 sio_name = sio_name_W83627DHG;
1462                 break;
1463         default:
1464                 if (val != 0xffff)
1465                         pr_debug(DRVNAME ": unsupported chip ID: 0x%04x\n",
1466                                  val);
1467                 superio_exit(sioaddr);
1468                 return -ENODEV;
1469         }
1470
1471         /* We have a known chip, find the HWM I/O address */
1472         superio_select(sioaddr, W83627EHF_LD_HWM);
1473         val = (superio_inb(sioaddr, SIO_REG_ADDR) << 8)
1474             | superio_inb(sioaddr, SIO_REG_ADDR + 1);
1475         *addr = val & IOREGION_ALIGNMENT;
1476         if (*addr == 0) {
1477                 printk(KERN_ERR DRVNAME ": Refusing to enable a Super-I/O "
1478                        "device with a base I/O port 0.\n");
1479                 superio_exit(sioaddr);
1480                 return -ENODEV;
1481         }
1482
1483         /* Activate logical device if needed */
1484         val = superio_inb(sioaddr, SIO_REG_ENABLE);
1485         if (!(val & 0x01)) {
1486                 printk(KERN_WARNING DRVNAME ": Forcibly enabling Super-I/O. "
1487                        "Sensor is probably unusable.\n");
1488                 superio_outb(sioaddr, SIO_REG_ENABLE, val | 0x01);
1489         }
1490
1491         superio_exit(sioaddr);
1492         pr_info(DRVNAME ": Found %s chip at %#x\n", sio_name, *addr);
1493         sio_data->sioreg = sioaddr;
1494
1495         return 0;
1496 }
1497
1498 /* when Super-I/O functions move to a separate file, the Super-I/O
1499  * bus will manage the lifetime of the device and this module will only keep
1500  * track of the w83627ehf driver. But since we platform_device_alloc(), we
1501  * must keep track of the device */
1502 static struct platform_device *pdev;
1503
1504 static int __init sensors_w83627ehf_init(void)
1505 {
1506         int err;
1507         unsigned short address;
1508         struct resource res;
1509         struct w83627ehf_sio_data sio_data;
1510
1511         /* initialize sio_data->kind and sio_data->sioreg.
1512          *
1513          * when Super-I/O functions move to a separate file, the Super-I/O
1514          * driver will probe 0x2e and 0x4e and auto-detect the presence of a
1515          * w83627ehf hardware monitor, and call probe() */
1516         if (w83627ehf_find(0x2e, &address, &sio_data) &&
1517             w83627ehf_find(0x4e, &address, &sio_data))
1518                 return -ENODEV;
1519
1520         err = platform_driver_register(&w83627ehf_driver);
1521         if (err)
1522                 goto exit;
1523
1524         if (!(pdev = platform_device_alloc(DRVNAME, address))) {
1525                 err = -ENOMEM;
1526                 printk(KERN_ERR DRVNAME ": Device allocation failed\n");
1527                 goto exit_unregister;
1528         }
1529
1530         err = platform_device_add_data(pdev, &sio_data,
1531                                        sizeof(struct w83627ehf_sio_data));
1532         if (err) {
1533                 printk(KERN_ERR DRVNAME ": Platform data allocation failed\n");
1534                 goto exit_device_put;
1535         }
1536
1537         memset(&res, 0, sizeof(res));
1538         res.name = DRVNAME;
1539         res.start = address + IOREGION_OFFSET;
1540         res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1;
1541         res.flags = IORESOURCE_IO;
1542         err = platform_device_add_resources(pdev, &res, 1);
1543         if (err) {
1544                 printk(KERN_ERR DRVNAME ": Device resource addition failed "
1545                        "(%d)\n", err);
1546                 goto exit_device_put;
1547         }
1548
1549         /* platform_device_add calls probe() */
1550         err = platform_device_add(pdev);
1551         if (err) {
1552                 printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n",
1553                        err);
1554                 goto exit_device_put;
1555         }
1556
1557         return 0;
1558
1559 exit_device_put:
1560         platform_device_put(pdev);
1561 exit_unregister:
1562         platform_driver_unregister(&w83627ehf_driver);
1563 exit:
1564         return err;
1565 }
1566
1567 static void __exit sensors_w83627ehf_exit(void)
1568 {
1569         platform_device_unregister(pdev);
1570         platform_driver_unregister(&w83627ehf_driver);
1571 }
1572
1573 MODULE_AUTHOR("Jean Delvare <khali@linux-fr.org>");
1574 MODULE_DESCRIPTION("W83627EHF driver");
1575 MODULE_LICENSE("GPL");
1576
1577 module_init(sensors_w83627ehf_init);
1578 module_exit(sensors_w83627ehf_exit);