Merge branch 'drm-fixes' of master.kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6
[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
6     Shamelessly ripped from the w83627hf driver
7     Copyright (C) 2003  Mark Studebaker
8
9     Thanks to Leon Moonen, Steve Cliffe and Grant Coady for their help
10     in testing and debugging this driver.
11
12     This driver also supports the W83627EHG, which is the lead-free
13     version of the W83627EHF.
14
15     This program is free software; you can redistribute it and/or modify
16     it under the terms of the GNU General Public License as published by
17     the Free Software Foundation; either version 2 of the License, or
18     (at your option) any later version.
19
20     This program is distributed in the hope that it will be useful,
21     but WITHOUT ANY WARRANTY; without even the implied warranty of
22     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     GNU General Public License for more details.
24
25     You should have received a copy of the GNU General Public License
26     along with this program; if not, write to the Free Software
27     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28
29
30     Supports the following chips:
31
32     Chip        #vin    #fan    #pwm    #temp   chip_id man_id
33     w83627ehf   -       5       -       3       0x88    0x5ca3
34
35     This is a preliminary version of the driver, only supporting the
36     fan and temperature inputs. The chip does much more than that.
37 */
38
39 #include <linux/module.h>
40 #include <linux/init.h>
41 #include <linux/slab.h>
42 #include <linux/i2c.h>
43 #include <linux/i2c-isa.h>
44 #include <linux/hwmon.h>
45 #include <linux/err.h>
46 #include <asm/io.h>
47 #include "lm75.h"
48
49 /* The actual ISA address is read from Super-I/O configuration space */
50 static unsigned short address;
51
52 /*
53  * Super-I/O constants and functions
54  */
55
56 static int REG;         /* The register to read/write */
57 static int VAL;         /* The value to read/write */
58
59 #define W83627EHF_LD_HWM        0x0b
60
61 #define SIO_REG_LDSEL           0x07    /* Logical device select */
62 #define SIO_REG_DEVID           0x20    /* Device ID (2 bytes) */
63 #define SIO_REG_ENABLE          0x30    /* Logical device enable */
64 #define SIO_REG_ADDR            0x60    /* Logical device address (2 bytes) */
65
66 #define SIO_W83627EHF_ID        0x8840
67 #define SIO_ID_MASK             0xFFC0
68
69 static inline void
70 superio_outb(int reg, int val)
71 {
72         outb(reg, REG);
73         outb(val, VAL);
74 }
75
76 static inline int
77 superio_inb(int reg)
78 {
79         outb(reg, REG);
80         return inb(VAL);
81 }
82
83 static inline void
84 superio_select(int ld)
85 {
86         outb(SIO_REG_LDSEL, REG);
87         outb(ld, VAL);
88 }
89
90 static inline void
91 superio_enter(void)
92 {
93         outb(0x87, REG);
94         outb(0x87, REG);
95 }
96
97 static inline void
98 superio_exit(void)
99 {
100         outb(0x02, REG);
101         outb(0x02, VAL);
102 }
103
104 /*
105  * ISA constants
106  */
107
108 #define REGION_LENGTH           8
109 #define ADDR_REG_OFFSET         5
110 #define DATA_REG_OFFSET         6
111
112 #define W83627EHF_REG_BANK              0x4E
113 #define W83627EHF_REG_CONFIG            0x40
114 #define W83627EHF_REG_CHIP_ID           0x49
115 #define W83627EHF_REG_MAN_ID            0x4F
116
117 static const u16 W83627EHF_REG_FAN[] = { 0x28, 0x29, 0x2a, 0x3f, 0x553 };
118 static const u16 W83627EHF_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d, 0x3e, 0x55c };
119
120 #define W83627EHF_REG_TEMP1             0x27
121 #define W83627EHF_REG_TEMP1_HYST        0x3a
122 #define W83627EHF_REG_TEMP1_OVER        0x39
123 static const u16 W83627EHF_REG_TEMP[] = { 0x150, 0x250 };
124 static const u16 W83627EHF_REG_TEMP_HYST[] = { 0x153, 0x253 };
125 static const u16 W83627EHF_REG_TEMP_OVER[] = { 0x155, 0x255 };
126 static const u16 W83627EHF_REG_TEMP_CONFIG[] = { 0x152, 0x252 };
127
128 /* Fan clock dividers are spread over the following five registers */
129 #define W83627EHF_REG_FANDIV1           0x47
130 #define W83627EHF_REG_FANDIV2           0x4B
131 #define W83627EHF_REG_VBAT              0x5D
132 #define W83627EHF_REG_DIODE             0x59
133 #define W83627EHF_REG_SMI_OVT           0x4C
134
135 /*
136  * Conversions
137  */
138
139 static inline unsigned int
140 fan_from_reg(u8 reg, unsigned int div)
141 {
142         if (reg == 0 || reg == 255)
143                 return 0;
144         return 1350000U / (reg * div);
145 }
146
147 static inline unsigned int
148 div_from_reg(u8 reg)
149 {
150         return 1 << reg;
151 }
152
153 static inline int
154 temp1_from_reg(s8 reg)
155 {
156         return reg * 1000;
157 }
158
159 static inline s8
160 temp1_to_reg(int temp)
161 {
162         if (temp <= -128000)
163                 return -128;
164         if (temp >= 127000)
165                 return 127;
166         if (temp < 0)
167                 return (temp - 500) / 1000;
168         return (temp + 500) / 1000;
169 }
170
171 /*
172  * Data structures and manipulation thereof
173  */
174
175 struct w83627ehf_data {
176         struct i2c_client client;
177         struct class_device *class_dev;
178         struct semaphore lock;
179
180         struct semaphore update_lock;
181         char valid;             /* !=0 if following fields are valid */
182         unsigned long last_updated;     /* In jiffies */
183
184         /* Register values */
185         u8 fan[5];
186         u8 fan_min[5];
187         u8 fan_div[5];
188         u8 has_fan;             /* some fan inputs can be disabled */
189         s8 temp1;
190         s8 temp1_max;
191         s8 temp1_max_hyst;
192         s16 temp[2];
193         s16 temp_max[2];
194         s16 temp_max_hyst[2];
195 };
196
197 static inline int is_word_sized(u16 reg)
198 {
199         return (((reg & 0xff00) == 0x100
200               || (reg & 0xff00) == 0x200)
201              && ((reg & 0x00ff) == 0x50
202               || (reg & 0x00ff) == 0x53
203               || (reg & 0x00ff) == 0x55));
204 }
205
206 /* We assume that the default bank is 0, thus the following two functions do
207    nothing for registers which live in bank 0. For others, they respectively
208    set the bank register to the correct value (before the register is
209    accessed), and back to 0 (afterwards). */
210 static inline void w83627ehf_set_bank(struct i2c_client *client, u16 reg)
211 {
212         if (reg & 0xff00) {
213                 outb_p(W83627EHF_REG_BANK, client->addr + ADDR_REG_OFFSET);
214                 outb_p(reg >> 8, client->addr + DATA_REG_OFFSET);
215         }
216 }
217
218 static inline void w83627ehf_reset_bank(struct i2c_client *client, u16 reg)
219 {
220         if (reg & 0xff00) {
221                 outb_p(W83627EHF_REG_BANK, client->addr + ADDR_REG_OFFSET);
222                 outb_p(0, client->addr + DATA_REG_OFFSET);
223         }
224 }
225
226 static u16 w83627ehf_read_value(struct i2c_client *client, u16 reg)
227 {
228         struct w83627ehf_data *data = i2c_get_clientdata(client);
229         int res, word_sized = is_word_sized(reg);
230
231         down(&data->lock);
232
233         w83627ehf_set_bank(client, reg);
234         outb_p(reg & 0xff, client->addr + ADDR_REG_OFFSET);
235         res = inb_p(client->addr + DATA_REG_OFFSET);
236         if (word_sized) {
237                 outb_p((reg & 0xff) + 1,
238                        client->addr + ADDR_REG_OFFSET);
239                 res = (res << 8) + inb_p(client->addr + DATA_REG_OFFSET);
240         }
241         w83627ehf_reset_bank(client, reg);
242
243         up(&data->lock);
244
245         return res;
246 }
247
248 static int w83627ehf_write_value(struct i2c_client *client, u16 reg, u16 value)
249 {
250         struct w83627ehf_data *data = i2c_get_clientdata(client);
251         int word_sized = is_word_sized(reg);
252
253         down(&data->lock);
254
255         w83627ehf_set_bank(client, reg);
256         outb_p(reg & 0xff, client->addr + ADDR_REG_OFFSET);
257         if (word_sized) {
258                 outb_p(value >> 8, client->addr + DATA_REG_OFFSET);
259                 outb_p((reg & 0xff) + 1,
260                        client->addr + ADDR_REG_OFFSET);
261         }
262         outb_p(value & 0xff, client->addr + DATA_REG_OFFSET);
263         w83627ehf_reset_bank(client, reg);
264
265         up(&data->lock);
266         return 0;
267 }
268
269 /* This function assumes that the caller holds data->update_lock */
270 static void w83627ehf_write_fan_div(struct i2c_client *client, int nr)
271 {
272         struct w83627ehf_data *data = i2c_get_clientdata(client);
273         u8 reg;
274
275         switch (nr) {
276         case 0:
277                 reg = (w83627ehf_read_value(client, W83627EHF_REG_FANDIV1) & 0xcf)
278                     | ((data->fan_div[0] & 0x03) << 4);
279                 w83627ehf_write_value(client, W83627EHF_REG_FANDIV1, reg);
280                 reg = (w83627ehf_read_value(client, W83627EHF_REG_VBAT) & 0xdf)
281                     | ((data->fan_div[0] & 0x04) << 3);
282                 w83627ehf_write_value(client, W83627EHF_REG_VBAT, reg);
283                 break;
284         case 1:
285                 reg = (w83627ehf_read_value(client, W83627EHF_REG_FANDIV1) & 0x3f)
286                     | ((data->fan_div[1] & 0x03) << 6);
287                 w83627ehf_write_value(client, W83627EHF_REG_FANDIV1, reg);
288                 reg = (w83627ehf_read_value(client, W83627EHF_REG_VBAT) & 0xbf)
289                     | ((data->fan_div[1] & 0x04) << 4);
290                 w83627ehf_write_value(client, W83627EHF_REG_VBAT, reg);
291                 break;
292         case 2:
293                 reg = (w83627ehf_read_value(client, W83627EHF_REG_FANDIV2) & 0x3f)
294                     | ((data->fan_div[2] & 0x03) << 6);
295                 w83627ehf_write_value(client, W83627EHF_REG_FANDIV2, reg);
296                 reg = (w83627ehf_read_value(client, W83627EHF_REG_VBAT) & 0x7f)
297                     | ((data->fan_div[2] & 0x04) << 5);
298                 w83627ehf_write_value(client, W83627EHF_REG_VBAT, reg);
299                 break;
300         case 3:
301                 reg = (w83627ehf_read_value(client, W83627EHF_REG_DIODE) & 0xfc)
302                     | (data->fan_div[3] & 0x03);
303                 w83627ehf_write_value(client, W83627EHF_REG_DIODE, reg);
304                 reg = (w83627ehf_read_value(client, W83627EHF_REG_SMI_OVT) & 0x7f)
305                     | ((data->fan_div[3] & 0x04) << 5);
306                 w83627ehf_write_value(client, W83627EHF_REG_SMI_OVT, reg);
307                 break;
308         case 4:
309                 reg = (w83627ehf_read_value(client, W83627EHF_REG_DIODE) & 0x73)
310                     | ((data->fan_div[4] & 0x03) << 3)
311                     | ((data->fan_div[4] & 0x04) << 5);
312                 w83627ehf_write_value(client, W83627EHF_REG_DIODE, reg);
313                 break;
314         }
315 }
316
317 static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
318 {
319         struct i2c_client *client = to_i2c_client(dev);
320         struct w83627ehf_data *data = i2c_get_clientdata(client);
321         int i;
322
323         down(&data->update_lock);
324
325         if (time_after(jiffies, data->last_updated + HZ)
326          || !data->valid) {
327                 /* Fan clock dividers */
328                 i = w83627ehf_read_value(client, W83627EHF_REG_FANDIV1);
329                 data->fan_div[0] = (i >> 4) & 0x03;
330                 data->fan_div[1] = (i >> 6) & 0x03;
331                 i = w83627ehf_read_value(client, W83627EHF_REG_FANDIV2);
332                 data->fan_div[2] = (i >> 6) & 0x03;
333                 i = w83627ehf_read_value(client, W83627EHF_REG_VBAT);
334                 data->fan_div[0] |= (i >> 3) & 0x04;
335                 data->fan_div[1] |= (i >> 4) & 0x04;
336                 data->fan_div[2] |= (i >> 5) & 0x04;
337                 if (data->has_fan & ((1 << 3) | (1 << 4))) {
338                         i = w83627ehf_read_value(client, W83627EHF_REG_DIODE);
339                         data->fan_div[3] = i & 0x03;
340                         data->fan_div[4] = ((i >> 2) & 0x03)
341                                          | ((i >> 5) & 0x04);
342                 }
343                 if (data->has_fan & (1 << 3)) {
344                         i = w83627ehf_read_value(client, W83627EHF_REG_SMI_OVT);
345                         data->fan_div[3] |= (i >> 5) & 0x04;
346                 }
347
348                 /* Measured fan speeds and limits */
349                 for (i = 0; i < 5; i++) {
350                         if (!(data->has_fan & (1 << i)))
351                                 continue;
352
353                         data->fan[i] = w83627ehf_read_value(client,
354                                        W83627EHF_REG_FAN[i]);
355                         data->fan_min[i] = w83627ehf_read_value(client,
356                                            W83627EHF_REG_FAN_MIN[i]);
357
358                         /* If we failed to measure the fan speed and clock
359                            divider can be increased, let's try that for next
360                            time */
361                         if (data->fan[i] == 0xff
362                          && data->fan_div[i] < 0x07) {
363                                 dev_dbg(&client->dev, "Increasing fan %d "
364                                         "clock divider from %u to %u\n",
365                                         i, div_from_reg(data->fan_div[i]),
366                                         div_from_reg(data->fan_div[i] + 1));
367                                 data->fan_div[i]++;
368                                 w83627ehf_write_fan_div(client, i);
369                                 /* Preserve min limit if possible */
370                                 if (data->fan_min[i] >= 2
371                                  && data->fan_min[i] != 255)
372                                         w83627ehf_write_value(client,
373                                                 W83627EHF_REG_FAN_MIN[i],
374                                                 (data->fan_min[i] /= 2));
375                         }
376                 }
377
378                 /* Measured temperatures and limits */
379                 data->temp1 = w83627ehf_read_value(client,
380                               W83627EHF_REG_TEMP1);
381                 data->temp1_max = w83627ehf_read_value(client,
382                                   W83627EHF_REG_TEMP1_OVER);
383                 data->temp1_max_hyst = w83627ehf_read_value(client,
384                                        W83627EHF_REG_TEMP1_HYST);
385                 for (i = 0; i < 2; i++) {
386                         data->temp[i] = w83627ehf_read_value(client,
387                                         W83627EHF_REG_TEMP[i]);
388                         data->temp_max[i] = w83627ehf_read_value(client,
389                                             W83627EHF_REG_TEMP_OVER[i]);
390                         data->temp_max_hyst[i] = w83627ehf_read_value(client,
391                                                  W83627EHF_REG_TEMP_HYST[i]);
392                 }
393
394                 data->last_updated = jiffies;
395                 data->valid = 1;
396         }
397
398         up(&data->update_lock);
399         return data;
400 }
401
402 /*
403  * Sysfs callback functions
404  */
405
406 #define show_fan_reg(reg) \
407 static ssize_t \
408 show_##reg(struct device *dev, char *buf, int nr) \
409 { \
410         struct w83627ehf_data *data = w83627ehf_update_device(dev); \
411         return sprintf(buf, "%d\n", \
412                        fan_from_reg(data->reg[nr], \
413                                     div_from_reg(data->fan_div[nr]))); \
414 }
415 show_fan_reg(fan);
416 show_fan_reg(fan_min);
417
418 static ssize_t
419 show_fan_div(struct device *dev, char *buf, int nr)
420 {
421         struct w83627ehf_data *data = w83627ehf_update_device(dev);
422         return sprintf(buf, "%u\n",
423                        div_from_reg(data->fan_div[nr]));
424 }
425
426 static ssize_t
427 store_fan_min(struct device *dev, const char *buf, size_t count, int nr)
428 {
429         struct i2c_client *client = to_i2c_client(dev);
430         struct w83627ehf_data *data = i2c_get_clientdata(client);
431         unsigned int val = simple_strtoul(buf, NULL, 10);
432         unsigned int reg;
433         u8 new_div;
434
435         down(&data->update_lock);
436         if (!val) {
437                 /* No min limit, alarm disabled */
438                 data->fan_min[nr] = 255;
439                 new_div = data->fan_div[nr]; /* No change */
440                 dev_info(dev, "fan%u low limit and alarm disabled\n", nr + 1);
441         } else if ((reg = 1350000U / val) >= 128 * 255) {
442                 /* Speed below this value cannot possibly be represented,
443                    even with the highest divider (128) */
444                 data->fan_min[nr] = 254;
445                 new_div = 7; /* 128 == (1 << 7) */
446                 dev_warn(dev, "fan%u low limit %u below minimum %u, set to "
447                          "minimum\n", nr + 1, val, fan_from_reg(254, 128));
448         } else if (!reg) {
449                 /* Speed above this value cannot possibly be represented,
450                    even with the lowest divider (1) */
451                 data->fan_min[nr] = 1;
452                 new_div = 0; /* 1 == (1 << 0) */
453                 dev_warn(dev, "fan%u low limit %u above maximum %u, set to "
454                          "maximum\n", nr + 1, val, fan_from_reg(1, 1));
455         } else {
456                 /* Automatically pick the best divider, i.e. the one such
457                    that the min limit will correspond to a register value
458                    in the 96..192 range */
459                 new_div = 0;
460                 while (reg > 192 && new_div < 7) {
461                         reg >>= 1;
462                         new_div++;
463                 }
464                 data->fan_min[nr] = reg;
465         }
466
467         /* Write both the fan clock divider (if it changed) and the new
468            fan min (unconditionally) */
469         if (new_div != data->fan_div[nr]) {
470                 if (new_div > data->fan_div[nr])
471                         data->fan[nr] >>= (data->fan_div[nr] - new_div);
472                 else
473                         data->fan[nr] <<= (new_div - data->fan_div[nr]);
474
475                 dev_dbg(dev, "fan%u clock divider changed from %u to %u\n",
476                         nr + 1, div_from_reg(data->fan_div[nr]),
477                         div_from_reg(new_div));
478                 data->fan_div[nr] = new_div;
479                 w83627ehf_write_fan_div(client, nr);
480         }
481         w83627ehf_write_value(client, W83627EHF_REG_FAN_MIN[nr],
482                               data->fan_min[nr]);
483         up(&data->update_lock);
484
485         return count;
486 }
487
488 #define sysfs_fan_offset(offset) \
489 static ssize_t \
490 show_reg_fan_##offset(struct device *dev, struct device_attribute *attr, \
491                       char *buf) \
492 { \
493         return show_fan(dev, buf, offset-1); \
494 } \
495 static DEVICE_ATTR(fan##offset##_input, S_IRUGO, \
496                    show_reg_fan_##offset, NULL);
497
498 #define sysfs_fan_min_offset(offset) \
499 static ssize_t \
500 show_reg_fan##offset##_min(struct device *dev, struct device_attribute *attr, \
501                            char *buf) \
502 { \
503         return show_fan_min(dev, buf, offset-1); \
504 } \
505 static ssize_t \
506 store_reg_fan##offset##_min(struct device *dev, struct device_attribute *attr, \
507                             const char *buf, size_t count) \
508 { \
509         return store_fan_min(dev, buf, count, offset-1); \
510 } \
511 static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
512                    show_reg_fan##offset##_min, \
513                    store_reg_fan##offset##_min);
514
515 #define sysfs_fan_div_offset(offset) \
516 static ssize_t \
517 show_reg_fan##offset##_div(struct device *dev, struct device_attribute *attr, \
518                            char *buf) \
519 { \
520         return show_fan_div(dev, buf, offset - 1); \
521 } \
522 static DEVICE_ATTR(fan##offset##_div, S_IRUGO, \
523                    show_reg_fan##offset##_div, NULL);
524
525 sysfs_fan_offset(1);
526 sysfs_fan_min_offset(1);
527 sysfs_fan_div_offset(1);
528 sysfs_fan_offset(2);
529 sysfs_fan_min_offset(2);
530 sysfs_fan_div_offset(2);
531 sysfs_fan_offset(3);
532 sysfs_fan_min_offset(3);
533 sysfs_fan_div_offset(3);
534 sysfs_fan_offset(4);
535 sysfs_fan_min_offset(4);
536 sysfs_fan_div_offset(4);
537 sysfs_fan_offset(5);
538 sysfs_fan_min_offset(5);
539 sysfs_fan_div_offset(5);
540
541 #define show_temp1_reg(reg) \
542 static ssize_t \
543 show_##reg(struct device *dev, struct device_attribute *attr, \
544            char *buf) \
545 { \
546         struct w83627ehf_data *data = w83627ehf_update_device(dev); \
547         return sprintf(buf, "%d\n", temp1_from_reg(data->reg)); \
548 }
549 show_temp1_reg(temp1);
550 show_temp1_reg(temp1_max);
551 show_temp1_reg(temp1_max_hyst);
552
553 #define store_temp1_reg(REG, reg) \
554 static ssize_t \
555 store_temp1_##reg(struct device *dev, struct device_attribute *attr, \
556                   const char *buf, size_t count) \
557 { \
558         struct i2c_client *client = to_i2c_client(dev); \
559         struct w83627ehf_data *data = i2c_get_clientdata(client); \
560         u32 val = simple_strtoul(buf, NULL, 10); \
561  \
562         down(&data->update_lock); \
563         data->temp1_##reg = temp1_to_reg(val); \
564         w83627ehf_write_value(client, W83627EHF_REG_TEMP1_##REG, \
565                               data->temp1_##reg); \
566         up(&data->update_lock); \
567         return count; \
568 }
569 store_temp1_reg(OVER, max);
570 store_temp1_reg(HYST, max_hyst);
571
572 static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp1, NULL);
573 static DEVICE_ATTR(temp1_max, S_IRUGO| S_IWUSR,
574                    show_temp1_max, store_temp1_max);
575 static DEVICE_ATTR(temp1_max_hyst, S_IRUGO| S_IWUSR,
576                    show_temp1_max_hyst, store_temp1_max_hyst);
577
578 #define show_temp_reg(reg) \
579 static ssize_t \
580 show_##reg (struct device *dev, char *buf, int nr) \
581 { \
582         struct w83627ehf_data *data = w83627ehf_update_device(dev); \
583         return sprintf(buf, "%d\n", \
584                        LM75_TEMP_FROM_REG(data->reg[nr])); \
585 }
586 show_temp_reg(temp);
587 show_temp_reg(temp_max);
588 show_temp_reg(temp_max_hyst);
589
590 #define store_temp_reg(REG, reg) \
591 static ssize_t \
592 store_##reg (struct device *dev, const char *buf, size_t count, int nr) \
593 { \
594         struct i2c_client *client = to_i2c_client(dev); \
595         struct w83627ehf_data *data = i2c_get_clientdata(client); \
596         u32 val = simple_strtoul(buf, NULL, 10); \
597  \
598         down(&data->update_lock); \
599         data->reg[nr] = LM75_TEMP_TO_REG(val); \
600         w83627ehf_write_value(client, W83627EHF_REG_TEMP_##REG[nr], \
601                               data->reg[nr]); \
602         up(&data->update_lock); \
603         return count; \
604 }
605 store_temp_reg(OVER, temp_max);
606 store_temp_reg(HYST, temp_max_hyst);
607
608 #define sysfs_temp_offset(offset) \
609 static ssize_t \
610 show_reg_temp##offset (struct device *dev, struct device_attribute *attr, \
611                        char *buf) \
612 { \
613         return show_temp(dev, buf, offset - 2); \
614 } \
615 static DEVICE_ATTR(temp##offset##_input, S_IRUGO, \
616                    show_reg_temp##offset, NULL);
617
618 #define sysfs_temp_reg_offset(reg, offset) \
619 static ssize_t \
620 show_reg_temp##offset##_##reg(struct device *dev, struct device_attribute *attr, \
621                               char *buf) \
622 { \
623         return show_temp_##reg(dev, buf, offset - 2); \
624 } \
625 static ssize_t \
626 store_reg_temp##offset##_##reg(struct device *dev, struct device_attribute *attr, \
627                                const char *buf, size_t count) \
628 { \
629         return store_temp_##reg(dev, buf, count, offset - 2); \
630 } \
631 static DEVICE_ATTR(temp##offset##_##reg, S_IRUGO| S_IWUSR, \
632                    show_reg_temp##offset##_##reg, \
633                    store_reg_temp##offset##_##reg);
634
635 sysfs_temp_offset(2);
636 sysfs_temp_reg_offset(max, 2);
637 sysfs_temp_reg_offset(max_hyst, 2);
638 sysfs_temp_offset(3);
639 sysfs_temp_reg_offset(max, 3);
640 sysfs_temp_reg_offset(max_hyst, 3);
641
642 /*
643  * Driver and client management
644  */
645
646 static struct i2c_driver w83627ehf_driver;
647
648 static void w83627ehf_init_client(struct i2c_client *client)
649 {
650         int i;
651         u8 tmp;
652
653         /* Start monitoring is needed */
654         tmp = w83627ehf_read_value(client, W83627EHF_REG_CONFIG);
655         if (!(tmp & 0x01))
656                 w83627ehf_write_value(client, W83627EHF_REG_CONFIG,
657                                       tmp | 0x01);
658
659         /* Enable temp2 and temp3 if needed */
660         for (i = 0; i < 2; i++) {
661                 tmp = w83627ehf_read_value(client,
662                                            W83627EHF_REG_TEMP_CONFIG[i]);
663                 if (tmp & 0x01)
664                         w83627ehf_write_value(client,
665                                               W83627EHF_REG_TEMP_CONFIG[i],
666                                               tmp & 0xfe);
667         }
668 }
669
670 static int w83627ehf_detect(struct i2c_adapter *adapter)
671 {
672         struct i2c_client *client;
673         struct w83627ehf_data *data;
674         int i, err = 0;
675
676         if (!request_region(address, REGION_LENGTH, w83627ehf_driver.name)) {
677                 err = -EBUSY;
678                 goto exit;
679         }
680
681         if (!(data = kmalloc(sizeof(struct w83627ehf_data), GFP_KERNEL))) {
682                 err = -ENOMEM;
683                 goto exit_release;
684         }
685         memset(data, 0, sizeof(struct w83627ehf_data));
686
687         client = &data->client;
688         i2c_set_clientdata(client, data);
689         client->addr = address;
690         init_MUTEX(&data->lock);
691         client->adapter = adapter;
692         client->driver = &w83627ehf_driver;
693         client->flags = 0;
694
695         strlcpy(client->name, "w83627ehf", I2C_NAME_SIZE);
696         data->valid = 0;
697         init_MUTEX(&data->update_lock);
698
699         /* Tell the i2c layer a new client has arrived */
700         if ((err = i2c_attach_client(client)))
701                 goto exit_free;
702
703         /* Initialize the chip */
704         w83627ehf_init_client(client);
705
706         /* A few vars need to be filled upon startup */
707         for (i = 0; i < 5; i++)
708                 data->fan_min[i] = w83627ehf_read_value(client,
709                                    W83627EHF_REG_FAN_MIN[i]);
710
711         /* It looks like fan4 and fan5 pins can be alternatively used
712            as fan on/off switches */
713         data->has_fan = 0x07; /* fan1, fan2 and fan3 */
714         i = w83627ehf_read_value(client, W83627EHF_REG_FANDIV1);
715         if (i & (1 << 2))
716                 data->has_fan |= (1 << 3);
717         if (i & (1 << 0))
718                 data->has_fan |= (1 << 4);
719
720         /* Register sysfs hooks */
721         data->class_dev = hwmon_device_register(&client->dev);
722         if (IS_ERR(data->class_dev)) {
723                 err = PTR_ERR(data->class_dev);
724                 goto exit_detach;
725         }
726
727         device_create_file(&client->dev, &dev_attr_fan1_input);
728         device_create_file(&client->dev, &dev_attr_fan1_min);
729         device_create_file(&client->dev, &dev_attr_fan1_div);
730         device_create_file(&client->dev, &dev_attr_fan2_input);
731         device_create_file(&client->dev, &dev_attr_fan2_min);
732         device_create_file(&client->dev, &dev_attr_fan2_div);
733         device_create_file(&client->dev, &dev_attr_fan3_input);
734         device_create_file(&client->dev, &dev_attr_fan3_min);
735         device_create_file(&client->dev, &dev_attr_fan3_div);
736
737         if (data->has_fan & (1 << 3)) {
738                 device_create_file(&client->dev, &dev_attr_fan4_input);
739                 device_create_file(&client->dev, &dev_attr_fan4_min);
740                 device_create_file(&client->dev, &dev_attr_fan4_div);
741         }
742         if (data->has_fan & (1 << 4)) {
743                 device_create_file(&client->dev, &dev_attr_fan5_input);
744                 device_create_file(&client->dev, &dev_attr_fan5_min);
745                 device_create_file(&client->dev, &dev_attr_fan5_div);
746         }
747
748         device_create_file(&client->dev, &dev_attr_temp1_input);
749         device_create_file(&client->dev, &dev_attr_temp1_max);
750         device_create_file(&client->dev, &dev_attr_temp1_max_hyst);
751         device_create_file(&client->dev, &dev_attr_temp2_input);
752         device_create_file(&client->dev, &dev_attr_temp2_max);
753         device_create_file(&client->dev, &dev_attr_temp2_max_hyst);
754         device_create_file(&client->dev, &dev_attr_temp3_input);
755         device_create_file(&client->dev, &dev_attr_temp3_max);
756         device_create_file(&client->dev, &dev_attr_temp3_max_hyst);
757
758         return 0;
759
760 exit_detach:
761         i2c_detach_client(client);
762 exit_free:
763         kfree(data);
764 exit_release:
765         release_region(address, REGION_LENGTH);
766 exit:
767         return err;
768 }
769
770 static int w83627ehf_detach_client(struct i2c_client *client)
771 {
772         struct w83627ehf_data *data = i2c_get_clientdata(client);
773         int err;
774
775         hwmon_device_unregister(data->class_dev);
776
777         if ((err = i2c_detach_client(client)))
778                 return err;
779         release_region(client->addr, REGION_LENGTH);
780         kfree(data);
781
782         return 0;
783 }
784
785 static struct i2c_driver w83627ehf_driver = {
786         .owner          = THIS_MODULE,
787         .name           = "w83627ehf",
788         .attach_adapter = w83627ehf_detect,
789         .detach_client  = w83627ehf_detach_client,
790 };
791
792 static int __init w83627ehf_find(int sioaddr, unsigned short *addr)
793 {
794         u16 val;
795
796         REG = sioaddr;
797         VAL = sioaddr + 1;
798         superio_enter();
799
800         val = (superio_inb(SIO_REG_DEVID) << 8)
801             | superio_inb(SIO_REG_DEVID + 1);
802         if ((val & SIO_ID_MASK) != SIO_W83627EHF_ID) {
803                 superio_exit();
804                 return -ENODEV;
805         }
806
807         superio_select(W83627EHF_LD_HWM);
808         val = (superio_inb(SIO_REG_ADDR) << 8)
809             | superio_inb(SIO_REG_ADDR + 1);
810         *addr = val & ~(REGION_LENGTH - 1);
811         if (*addr == 0) {
812                 superio_exit();
813                 return -ENODEV;
814         }
815
816         /* Activate logical device if needed */
817         val = superio_inb(SIO_REG_ENABLE);
818         if (!(val & 0x01))
819                 superio_outb(SIO_REG_ENABLE, val | 0x01);
820
821         superio_exit();
822         return 0;
823 }
824
825 static int __init sensors_w83627ehf_init(void)
826 {
827         if (w83627ehf_find(0x2e, &address)
828          && w83627ehf_find(0x4e, &address))
829                 return -ENODEV;
830
831         return i2c_isa_add_driver(&w83627ehf_driver);
832 }
833
834 static void __exit sensors_w83627ehf_exit(void)
835 {
836         i2c_isa_del_driver(&w83627ehf_driver);
837 }
838
839 MODULE_AUTHOR("Jean Delvare <khali@linux-fr.org>");
840 MODULE_DESCRIPTION("W83627EHF driver");
841 MODULE_LICENSE("GPL");
842
843 module_init(sensors_w83627ehf_init);
844 module_exit(sensors_w83627ehf_exit);