Pull xpc-disengage into release branch
[sfrench/cifs-2.6.git] / drivers / hwmon / sis5595.c
1 /*
2     sis5595.c - Part of lm_sensors, Linux kernel modules
3                 for hardware monitoring
4
5     Copyright (C) 1998 - 2001 Frodo Looijaard <frodol@dds.nl>,
6                         Kyösti Mälkki <kmalkki@cc.hut.fi>, and
7                         Mark D. Studebaker <mdsxyz123@yahoo.com>
8     Ported to Linux 2.6 by Aurelien Jarno <aurelien@aurel32.net> with
9     the help of Jean Delvare <khali@linux-fr.org>
10
11     This program is free software; you can redistribute it and/or modify
12     it under the terms of the GNU General Public License as published by
13     the Free Software Foundation; either version 2 of the License, or
14     (at your option) any later version.
15
16     This program is distributed in the hope that it will be useful,
17     but WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19     GNU General Public License for more details.
20
21     You should have received a copy of the GNU General Public License
22     along with this program; if not, write to the Free Software
23     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 */
25
26 /*
27    SiS southbridge has a LM78-like chip integrated on the same IC.
28    This driver is a customized copy of lm78.c
29    
30    Supports following revisions:
31         Version         PCI ID          PCI Revision
32         1               1039/0008       AF or less
33         2               1039/0008       B0 or greater
34
35    Note: these chips contain a 0008 device which is incompatible with the
36          5595. We recognize these by the presence of the listed
37          "blacklist" PCI ID and refuse to load.
38
39    NOT SUPPORTED        PCI ID          BLACKLIST PCI ID        
40          540            0008            0540
41          550            0008            0550
42         5513            0008            5511
43         5581            0008            5597
44         5582            0008            5597
45         5597            0008            5597
46         5598            0008            5597/5598
47          630            0008            0630
48          645            0008            0645
49          730            0008            0730
50          735            0008            0735
51 */
52
53 #include <linux/module.h>
54 #include <linux/slab.h>
55 #include <linux/ioport.h>
56 #include <linux/pci.h>
57 #include <linux/i2c.h>
58 #include <linux/i2c-isa.h>
59 #include <linux/hwmon.h>
60 #include <linux/err.h>
61 #include <linux/init.h>
62 #include <linux/jiffies.h>
63 #include <asm/io.h>
64
65
66 /* If force_addr is set to anything different from 0, we forcibly enable
67    the device at the given address. */
68 static u16 force_addr;
69 module_param(force_addr, ushort, 0);
70 MODULE_PARM_DESC(force_addr,
71                  "Initialize the base address of the sensors");
72
73 /* Device address
74    Note that we can't determine the ISA address until we have initialized
75    our module */
76 static unsigned short address;
77
78 /* Many SIS5595 constants specified below */
79
80 /* Length of ISA address segment */
81 #define SIS5595_EXTENT 8
82 /* PCI Config Registers */
83 #define SIS5595_REVISION_REG 0x08
84 #define SIS5595_BASE_REG 0x68
85 #define SIS5595_PIN_REG 0x7A
86 #define SIS5595_ENABLE_REG 0x7B
87
88 /* Where are the ISA address/data registers relative to the base address */
89 #define SIS5595_ADDR_REG_OFFSET 5
90 #define SIS5595_DATA_REG_OFFSET 6
91
92 /* The SIS5595 registers */
93 #define SIS5595_REG_IN_MAX(nr) (0x2b + (nr) * 2)
94 #define SIS5595_REG_IN_MIN(nr) (0x2c + (nr) * 2)
95 #define SIS5595_REG_IN(nr) (0x20 + (nr))
96
97 #define SIS5595_REG_FAN_MIN(nr) (0x3b + (nr))
98 #define SIS5595_REG_FAN(nr) (0x28 + (nr))
99
100 /* On the first version of the chip, the temp registers are separate.
101    On the second version,
102    TEMP pin is shared with IN4, configured in PCI register 0x7A.
103    The registers are the same as well.
104    OVER and HYST are really MAX and MIN. */
105
106 #define REV2MIN 0xb0
107 #define SIS5595_REG_TEMP        (( data->revision) >= REV2MIN) ? \
108                                         SIS5595_REG_IN(4) : 0x27
109 #define SIS5595_REG_TEMP_OVER   (( data->revision) >= REV2MIN) ? \
110                                         SIS5595_REG_IN_MAX(4) : 0x39
111 #define SIS5595_REG_TEMP_HYST   (( data->revision) >= REV2MIN) ? \
112                                         SIS5595_REG_IN_MIN(4) : 0x3a
113
114 #define SIS5595_REG_CONFIG 0x40
115 #define SIS5595_REG_ALARM1 0x41
116 #define SIS5595_REG_ALARM2 0x42
117 #define SIS5595_REG_FANDIV 0x47
118
119 /* Conversions. Limit checking is only done on the TO_REG
120    variants. */
121
122 /* IN: mV, (0V to 4.08V)
123    REG: 16mV/bit */
124 static inline u8 IN_TO_REG(unsigned long val)
125 {
126         unsigned long nval = SENSORS_LIMIT(val, 0, 4080);
127         return (nval + 8) / 16;
128 }
129 #define IN_FROM_REG(val) ((val) *  16)
130
131 static inline u8 FAN_TO_REG(long rpm, int div)
132 {
133         if (rpm <= 0)
134                 return 255;
135         return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
136 }
137
138 static inline int FAN_FROM_REG(u8 val, int div)
139 {
140         return val==0 ? -1 : val==255 ? 0 : 1350000/(val*div);
141 }
142
143 /* TEMP: mC (-54.12C to +157.53C)
144    REG: 0.83C/bit + 52.12, two's complement  */
145 static inline int TEMP_FROM_REG(s8 val)
146 {
147         return val * 830 + 52120;
148 }
149 static inline s8 TEMP_TO_REG(int val)
150 {
151         int nval = SENSORS_LIMIT(val, -54120, 157530) ;
152         return nval<0 ? (nval-5212-415)/830 : (nval-5212+415)/830;
153 }
154
155 /* FAN DIV: 1, 2, 4, or 8 (defaults to 2)
156    REG: 0, 1, 2, or 3 (respectively) (defaults to 1) */
157 static inline u8 DIV_TO_REG(int val)
158 {
159         return val==8 ? 3 : val==4 ? 2 : val==1 ? 0 : 1;
160 }
161 #define DIV_FROM_REG(val) (1 << (val))
162
163 /* For the SIS5595, we need to keep some data in memory. That
164    data is pointed to by sis5595_list[NR]->data. The structure itself is
165    dynamically allocated, at the time when the new sis5595 client is
166    allocated. */
167 struct sis5595_data {
168         struct i2c_client client;
169         struct class_device *class_dev;
170         struct semaphore lock;
171
172         struct semaphore update_lock;
173         char valid;             /* !=0 if following fields are valid */
174         unsigned long last_updated;     /* In jiffies */
175         char maxins;            /* == 3 if temp enabled, otherwise == 4 */
176         u8 revision;            /* Reg. value */
177
178         u8 in[5];               /* Register value */
179         u8 in_max[5];           /* Register value */
180         u8 in_min[5];           /* Register value */
181         u8 fan[2];              /* Register value */
182         u8 fan_min[2];          /* Register value */
183         s8 temp;                /* Register value */
184         s8 temp_over;           /* Register value */
185         s8 temp_hyst;           /* Register value */
186         u8 fan_div[2];          /* Register encoding, shifted right */
187         u16 alarms;             /* Register encoding, combined */
188 };
189
190 static struct pci_dev *s_bridge;        /* pointer to the (only) sis5595 */
191
192 static int sis5595_detect(struct i2c_adapter *adapter);
193 static int sis5595_detach_client(struct i2c_client *client);
194
195 static int sis5595_read_value(struct i2c_client *client, u8 register);
196 static int sis5595_write_value(struct i2c_client *client, u8 register, u8 value);
197 static struct sis5595_data *sis5595_update_device(struct device *dev);
198 static void sis5595_init_client(struct i2c_client *client);
199
200 static struct i2c_driver sis5595_driver = {
201         .owner          = THIS_MODULE,
202         .name           = "sis5595",
203         .attach_adapter = sis5595_detect,
204         .detach_client  = sis5595_detach_client,
205 };
206
207 /* 4 Voltages */
208 static ssize_t show_in(struct device *dev, char *buf, int nr)
209 {
210         struct sis5595_data *data = sis5595_update_device(dev);
211         return sprintf(buf, "%d\n", IN_FROM_REG(data->in[nr]));
212 }
213
214 static ssize_t show_in_min(struct device *dev, char *buf, int nr)
215 {
216         struct sis5595_data *data = sis5595_update_device(dev);
217         return sprintf(buf, "%d\n", IN_FROM_REG(data->in_min[nr]));
218 }
219
220 static ssize_t show_in_max(struct device *dev, char *buf, int nr)
221 {
222         struct sis5595_data *data = sis5595_update_device(dev);
223         return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[nr]));
224 }
225
226 static ssize_t set_in_min(struct device *dev, const char *buf,
227                size_t count, int nr)
228 {
229         struct i2c_client *client = to_i2c_client(dev);
230         struct sis5595_data *data = i2c_get_clientdata(client);
231         unsigned long val = simple_strtoul(buf, NULL, 10);
232
233         down(&data->update_lock);
234         data->in_min[nr] = IN_TO_REG(val);
235         sis5595_write_value(client, SIS5595_REG_IN_MIN(nr), data->in_min[nr]);
236         up(&data->update_lock);
237         return count;
238 }
239
240 static ssize_t set_in_max(struct device *dev, const char *buf,
241                size_t count, int nr)
242 {
243         struct i2c_client *client = to_i2c_client(dev);
244         struct sis5595_data *data = i2c_get_clientdata(client);
245         unsigned long val = simple_strtoul(buf, NULL, 10);
246
247         down(&data->update_lock);
248         data->in_max[nr] = IN_TO_REG(val);
249         sis5595_write_value(client, SIS5595_REG_IN_MAX(nr), data->in_max[nr]);
250         up(&data->update_lock);
251         return count;
252 }
253
254 #define show_in_offset(offset)                                  \
255 static ssize_t                                                  \
256         show_in##offset (struct device *dev, struct device_attribute *attr, char *buf)          \
257 {                                                               \
258         return show_in(dev, buf, offset);                       \
259 }                                                               \
260 static DEVICE_ATTR(in##offset##_input, S_IRUGO,                 \
261                 show_in##offset, NULL);                         \
262 static ssize_t                                                  \
263         show_in##offset##_min (struct device *dev, struct device_attribute *attr, char *buf)    \
264 {                                                               \
265         return show_in_min(dev, buf, offset);                   \
266 }                                                               \
267 static ssize_t                                                  \
268         show_in##offset##_max (struct device *dev, struct device_attribute *attr, char *buf)    \
269 {                                                               \
270         return show_in_max(dev, buf, offset);                   \
271 }                                                               \
272 static ssize_t set_in##offset##_min (struct device *dev, struct device_attribute *attr, \
273                 const char *buf, size_t count)                  \
274 {                                                               \
275         return set_in_min(dev, buf, count, offset);             \
276 }                                                               \
277 static ssize_t set_in##offset##_max (struct device *dev, struct device_attribute *attr, \
278                 const char *buf, size_t count)                  \
279 {                                                               \
280         return set_in_max(dev, buf, count, offset);             \
281 }                                                               \
282 static DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR,         \
283                 show_in##offset##_min, set_in##offset##_min);   \
284 static DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR,         \
285                 show_in##offset##_max, set_in##offset##_max);
286
287 show_in_offset(0);
288 show_in_offset(1);
289 show_in_offset(2);
290 show_in_offset(3);
291 show_in_offset(4);
292
293 /* Temperature */
294 static ssize_t show_temp(struct device *dev, struct device_attribute *attr, char *buf)
295 {
296         struct sis5595_data *data = sis5595_update_device(dev);
297         return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
298 }
299
300 static ssize_t show_temp_over(struct device *dev, struct device_attribute *attr, char *buf)
301 {
302         struct sis5595_data *data = sis5595_update_device(dev);
303         return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
304 }
305
306 static ssize_t set_temp_over(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
307 {
308         struct i2c_client *client = to_i2c_client(dev);
309         struct sis5595_data *data = i2c_get_clientdata(client);
310         long val = simple_strtol(buf, NULL, 10);
311
312         down(&data->update_lock);
313         data->temp_over = TEMP_TO_REG(val);
314         sis5595_write_value(client, SIS5595_REG_TEMP_OVER, data->temp_over);
315         up(&data->update_lock);
316         return count;
317 }
318
319 static ssize_t show_temp_hyst(struct device *dev, struct device_attribute *attr, char *buf)
320 {
321         struct sis5595_data *data = sis5595_update_device(dev);
322         return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_hyst));
323 }
324
325 static ssize_t set_temp_hyst(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
326 {
327         struct i2c_client *client = to_i2c_client(dev);
328         struct sis5595_data *data = i2c_get_clientdata(client);
329         long val = simple_strtol(buf, NULL, 10);
330
331         down(&data->update_lock);
332         data->temp_hyst = TEMP_TO_REG(val);
333         sis5595_write_value(client, SIS5595_REG_TEMP_HYST, data->temp_hyst);
334         up(&data->update_lock);
335         return count;
336 }
337
338 static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
339 static DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
340                 show_temp_over, set_temp_over);
341 static DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
342                 show_temp_hyst, set_temp_hyst);
343
344 /* 2 Fans */
345 static ssize_t show_fan(struct device *dev, char *buf, int nr)
346 {
347         struct sis5595_data *data = sis5595_update_device(dev);
348         return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr],
349                 DIV_FROM_REG(data->fan_div[nr])) );
350 }
351
352 static ssize_t show_fan_min(struct device *dev, char *buf, int nr)
353 {
354         struct sis5595_data *data = sis5595_update_device(dev);
355         return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan_min[nr],
356                 DIV_FROM_REG(data->fan_div[nr])) );
357 }
358
359 static ssize_t set_fan_min(struct device *dev, const char *buf,
360                 size_t count, int nr)
361 {
362         struct i2c_client *client = to_i2c_client(dev);
363         struct sis5595_data *data = i2c_get_clientdata(client);
364         unsigned long val = simple_strtoul(buf, NULL, 10);
365
366         down(&data->update_lock);
367         data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
368         sis5595_write_value(client, SIS5595_REG_FAN_MIN(nr), data->fan_min[nr]);
369         up(&data->update_lock);
370         return count;
371 }
372
373 static ssize_t show_fan_div(struct device *dev, char *buf, int nr)
374 {
375         struct sis5595_data *data = sis5595_update_device(dev);
376         return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr]) );
377 }
378
379 /* Note: we save and restore the fan minimum here, because its value is
380    determined in part by the fan divisor.  This follows the principle of
381    least suprise; the user doesn't expect the fan minimum to change just
382    because the divisor changed. */
383 static ssize_t set_fan_div(struct device *dev, const char *buf,
384         size_t count, int nr)
385 {
386         struct i2c_client *client = to_i2c_client(dev);
387         struct sis5595_data *data = i2c_get_clientdata(client);
388         unsigned long min;
389         unsigned long val = simple_strtoul(buf, NULL, 10);
390         int reg;
391
392         down(&data->update_lock);
393         min = FAN_FROM_REG(data->fan_min[nr],
394                         DIV_FROM_REG(data->fan_div[nr]));
395         reg = sis5595_read_value(client, SIS5595_REG_FANDIV);
396
397         switch (val) {
398         case 1: data->fan_div[nr] = 0; break;
399         case 2: data->fan_div[nr] = 1; break;
400         case 4: data->fan_div[nr] = 2; break;
401         case 8: data->fan_div[nr] = 3; break;
402         default:
403                 dev_err(&client->dev, "fan_div value %ld not "
404                         "supported. Choose one of 1, 2, 4 or 8!\n", val);
405                 up(&data->update_lock);
406                 return -EINVAL;
407         }
408         
409         switch (nr) {
410         case 0:
411                 reg = (reg & 0xcf) | (data->fan_div[nr] << 4);
412                 break;
413         case 1:
414                 reg = (reg & 0x3f) | (data->fan_div[nr] << 6);
415                 break;
416         }
417         sis5595_write_value(client, SIS5595_REG_FANDIV, reg);
418         data->fan_min[nr] =
419                 FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
420         sis5595_write_value(client, SIS5595_REG_FAN_MIN(nr), data->fan_min[nr]);
421         up(&data->update_lock);
422         return count;
423 }
424
425 #define show_fan_offset(offset)                                         \
426 static ssize_t show_fan_##offset (struct device *dev, struct device_attribute *attr, char *buf) \
427 {                                                                       \
428         return show_fan(dev, buf, offset - 1);                  \
429 }                                                                       \
430 static ssize_t show_fan_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf)   \
431 {                                                                       \
432         return show_fan_min(dev, buf, offset - 1);                      \
433 }                                                                       \
434 static ssize_t show_fan_##offset##_div (struct device *dev, struct device_attribute *attr, char *buf)   \
435 {                                                                       \
436         return show_fan_div(dev, buf, offset - 1);                      \
437 }                                                                       \
438 static ssize_t set_fan_##offset##_min (struct device *dev, struct device_attribute *attr,               \
439                 const char *buf, size_t count)                          \
440 {                                                                       \
441         return set_fan_min(dev, buf, count, offset - 1);                \
442 }                                                                       \
443 static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan_##offset, NULL);\
444 static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR,                \
445                 show_fan_##offset##_min, set_fan_##offset##_min);
446
447 show_fan_offset(1);
448 show_fan_offset(2);
449
450 static ssize_t set_fan_1_div(struct device *dev, struct device_attribute *attr, const char *buf,
451                 size_t count)
452 {
453         return set_fan_div(dev, buf, count, 0) ;
454 }
455
456 static ssize_t set_fan_2_div(struct device *dev, struct device_attribute *attr, const char *buf,
457                 size_t count)
458 {
459         return set_fan_div(dev, buf, count, 1) ;
460 }
461 static DEVICE_ATTR(fan1_div, S_IRUGO | S_IWUSR,
462                 show_fan_1_div, set_fan_1_div);
463 static DEVICE_ATTR(fan2_div, S_IRUGO | S_IWUSR,
464                 show_fan_2_div, set_fan_2_div);
465
466 /* Alarms */
467 static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
468 {
469         struct sis5595_data *data = sis5595_update_device(dev);
470         return sprintf(buf, "%d\n", data->alarms);
471 }
472 static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
473  
474 /* This is called when the module is loaded */
475 static int sis5595_detect(struct i2c_adapter *adapter)
476 {
477         int err = 0;
478         int i;
479         struct i2c_client *new_client;
480         struct sis5595_data *data;
481         char val;
482         u16 a;
483
484         if (force_addr)
485                 address = force_addr & ~(SIS5595_EXTENT - 1);
486         /* Reserve the ISA region */
487         if (!request_region(address, SIS5595_EXTENT, sis5595_driver.name)) {
488                 err = -EBUSY;
489                 goto exit;
490         }
491         if (force_addr) {
492                 dev_warn(&adapter->dev, "forcing ISA address 0x%04X\n", address);
493                 if (PCIBIOS_SUCCESSFUL !=
494                     pci_write_config_word(s_bridge, SIS5595_BASE_REG, address))
495                         goto exit_release;
496                 if (PCIBIOS_SUCCESSFUL !=
497                     pci_read_config_word(s_bridge, SIS5595_BASE_REG, &a))
498                         goto exit_release;
499                 if ((a & ~(SIS5595_EXTENT - 1)) != address)
500                         /* doesn't work for some chips? */
501                         goto exit_release;
502         }
503
504         if (PCIBIOS_SUCCESSFUL !=
505             pci_read_config_byte(s_bridge, SIS5595_ENABLE_REG, &val)) {
506                 goto exit_release;
507         }
508         if ((val & 0x80) == 0) {
509                 if (PCIBIOS_SUCCESSFUL !=
510                     pci_write_config_byte(s_bridge, SIS5595_ENABLE_REG,
511                                           val | 0x80))
512                         goto exit_release;
513                 if (PCIBIOS_SUCCESSFUL !=
514                     pci_read_config_byte(s_bridge, SIS5595_ENABLE_REG, &val))
515                         goto exit_release;
516                 if ((val & 0x80) == 0) 
517                         /* doesn't work for some chips! */
518                         goto exit_release;
519         }
520
521         if (!(data = kmalloc(sizeof(struct sis5595_data), GFP_KERNEL))) {
522                 err = -ENOMEM;
523                 goto exit_release;
524         }
525         memset(data, 0, sizeof(struct sis5595_data));
526
527         new_client = &data->client;
528         new_client->addr = address;
529         init_MUTEX(&data->lock);
530         i2c_set_clientdata(new_client, data);
531         new_client->adapter = adapter;
532         new_client->driver = &sis5595_driver;
533         new_client->flags = 0;
534
535         /* Check revision and pin registers to determine whether 4 or 5 voltages */
536         pci_read_config_byte(s_bridge, SIS5595_REVISION_REG, &(data->revision));
537         /* 4 voltages, 1 temp */
538         data->maxins = 3;
539         if (data->revision >= REV2MIN) {
540                 pci_read_config_byte(s_bridge, SIS5595_PIN_REG, &val);
541                 if (!(val & 0x80))
542                         /* 5 voltages, no temps */
543                         data->maxins = 4;
544         }
545         
546         /* Fill in the remaining client fields and put it into the global list */
547         strlcpy(new_client->name, "sis5595", I2C_NAME_SIZE);
548
549         data->valid = 0;
550         init_MUTEX(&data->update_lock);
551
552         /* Tell the I2C layer a new client has arrived */
553         if ((err = i2c_attach_client(new_client)))
554                 goto exit_free;
555         
556         /* Initialize the SIS5595 chip */
557         sis5595_init_client(new_client);
558
559         /* A few vars need to be filled upon startup */
560         for (i = 0; i < 2; i++) {
561                 data->fan_min[i] = sis5595_read_value(new_client,
562                                         SIS5595_REG_FAN_MIN(i));
563         }
564
565         /* Register sysfs hooks */
566         data->class_dev = hwmon_device_register(&new_client->dev);
567         if (IS_ERR(data->class_dev)) {
568                 err = PTR_ERR(data->class_dev);
569                 goto exit_detach;
570         }
571
572         device_create_file(&new_client->dev, &dev_attr_in0_input);
573         device_create_file(&new_client->dev, &dev_attr_in0_min);
574         device_create_file(&new_client->dev, &dev_attr_in0_max);
575         device_create_file(&new_client->dev, &dev_attr_in1_input);
576         device_create_file(&new_client->dev, &dev_attr_in1_min);
577         device_create_file(&new_client->dev, &dev_attr_in1_max);
578         device_create_file(&new_client->dev, &dev_attr_in2_input);
579         device_create_file(&new_client->dev, &dev_attr_in2_min);
580         device_create_file(&new_client->dev, &dev_attr_in2_max);
581         device_create_file(&new_client->dev, &dev_attr_in3_input);
582         device_create_file(&new_client->dev, &dev_attr_in3_min);
583         device_create_file(&new_client->dev, &dev_attr_in3_max);
584         if (data->maxins == 4) {
585                 device_create_file(&new_client->dev, &dev_attr_in4_input);
586                 device_create_file(&new_client->dev, &dev_attr_in4_min);
587                 device_create_file(&new_client->dev, &dev_attr_in4_max);
588         }
589         device_create_file(&new_client->dev, &dev_attr_fan1_input);
590         device_create_file(&new_client->dev, &dev_attr_fan1_min);
591         device_create_file(&new_client->dev, &dev_attr_fan1_div);
592         device_create_file(&new_client->dev, &dev_attr_fan2_input);
593         device_create_file(&new_client->dev, &dev_attr_fan2_min);
594         device_create_file(&new_client->dev, &dev_attr_fan2_div);
595         device_create_file(&new_client->dev, &dev_attr_alarms);
596         if (data->maxins == 3) {
597                 device_create_file(&new_client->dev, &dev_attr_temp1_input);
598                 device_create_file(&new_client->dev, &dev_attr_temp1_max);
599                 device_create_file(&new_client->dev, &dev_attr_temp1_max_hyst);
600         }
601         return 0;
602
603 exit_detach:
604         i2c_detach_client(new_client);
605 exit_free:
606         kfree(data);
607 exit_release:
608         release_region(address, SIS5595_EXTENT);
609 exit:
610         return err;
611 }
612
613 static int sis5595_detach_client(struct i2c_client *client)
614 {
615         struct sis5595_data *data = i2c_get_clientdata(client);
616         int err;
617
618         hwmon_device_unregister(data->class_dev);
619
620         if ((err = i2c_detach_client(client)))
621                 return err;
622
623         release_region(client->addr, SIS5595_EXTENT);
624
625         kfree(data);
626
627         return 0;
628 }
629
630
631 /* ISA access must be locked explicitly. */
632 static int sis5595_read_value(struct i2c_client *client, u8 reg)
633 {
634         int res;
635
636         struct sis5595_data *data = i2c_get_clientdata(client);
637         down(&data->lock);
638         outb_p(reg, client->addr + SIS5595_ADDR_REG_OFFSET);
639         res = inb_p(client->addr + SIS5595_DATA_REG_OFFSET);
640         up(&data->lock);
641         return res;
642 }
643
644 static int sis5595_write_value(struct i2c_client *client, u8 reg, u8 value)
645 {
646         struct sis5595_data *data = i2c_get_clientdata(client);
647         down(&data->lock);
648         outb_p(reg, client->addr + SIS5595_ADDR_REG_OFFSET);
649         outb_p(value, client->addr + SIS5595_DATA_REG_OFFSET);
650         up(&data->lock);
651         return 0;
652 }
653
654 /* Called when we have found a new SIS5595. */
655 static void sis5595_init_client(struct i2c_client *client)
656 {
657         u8 config = sis5595_read_value(client, SIS5595_REG_CONFIG);
658         if (!(config & 0x01))
659                 sis5595_write_value(client, SIS5595_REG_CONFIG,
660                                 (config & 0xf7) | 0x01);
661 }
662
663 static struct sis5595_data *sis5595_update_device(struct device *dev)
664 {
665         struct i2c_client *client = to_i2c_client(dev);
666         struct sis5595_data *data = i2c_get_clientdata(client);
667         int i;
668
669         down(&data->update_lock);
670
671         if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
672             || !data->valid) {
673
674                 for (i = 0; i <= data->maxins; i++) {
675                         data->in[i] =
676                             sis5595_read_value(client, SIS5595_REG_IN(i));
677                         data->in_min[i] =
678                             sis5595_read_value(client,
679                                                SIS5595_REG_IN_MIN(i));
680                         data->in_max[i] =
681                             sis5595_read_value(client,
682                                                SIS5595_REG_IN_MAX(i));
683                 }
684                 for (i = 0; i < 2; i++) {
685                         data->fan[i] =
686                             sis5595_read_value(client, SIS5595_REG_FAN(i));
687                         data->fan_min[i] =
688                             sis5595_read_value(client,
689                                                SIS5595_REG_FAN_MIN(i));
690                 }
691                 if (data->maxins == 3) {
692                         data->temp =
693                             sis5595_read_value(client, SIS5595_REG_TEMP);
694                         data->temp_over =
695                             sis5595_read_value(client, SIS5595_REG_TEMP_OVER);
696                         data->temp_hyst =
697                             sis5595_read_value(client, SIS5595_REG_TEMP_HYST);
698                 }
699                 i = sis5595_read_value(client, SIS5595_REG_FANDIV);
700                 data->fan_div[0] = (i >> 4) & 0x03;
701                 data->fan_div[1] = i >> 6;
702                 data->alarms =
703                     sis5595_read_value(client, SIS5595_REG_ALARM1) |
704                     (sis5595_read_value(client, SIS5595_REG_ALARM2) << 8);
705                 data->last_updated = jiffies;
706                 data->valid = 1;
707         }
708
709         up(&data->update_lock);
710
711         return data;
712 }
713
714 static struct pci_device_id sis5595_pci_ids[] = {
715         { PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503) },
716         { 0, }
717 };
718
719 MODULE_DEVICE_TABLE(pci, sis5595_pci_ids);
720
721 static int blacklist[] __devinitdata = {
722         PCI_DEVICE_ID_SI_540,
723         PCI_DEVICE_ID_SI_550,
724         PCI_DEVICE_ID_SI_630,
725         PCI_DEVICE_ID_SI_645,
726         PCI_DEVICE_ID_SI_730,
727         PCI_DEVICE_ID_SI_735,
728         PCI_DEVICE_ID_SI_5511, /* 5513 chip has the 0008 device but
729                                   that ID shows up in other chips so we
730                                   use the 5511 ID for recognition */
731         PCI_DEVICE_ID_SI_5597,
732         PCI_DEVICE_ID_SI_5598,
733         0 };
734
735 static int __devinit sis5595_pci_probe(struct pci_dev *dev,
736                                        const struct pci_device_id *id)
737 {
738         u16 val;
739         int *i;
740
741         for (i = blacklist; *i != 0; i++) {
742                 struct pci_dev *dev;
743                 dev = pci_get_device(PCI_VENDOR_ID_SI, *i, NULL);
744                 if (dev) {
745                         dev_err(&dev->dev, "Looked for SIS5595 but found unsupported device %.4x\n", *i);
746                         pci_dev_put(dev);
747                         return -ENODEV;
748                 }
749         }
750         
751         if (PCIBIOS_SUCCESSFUL !=
752             pci_read_config_word(dev, SIS5595_BASE_REG, &val))
753                 return -ENODEV;
754         
755         address = val & ~(SIS5595_EXTENT - 1);
756         if (address == 0 && force_addr == 0) {
757                 dev_err(&dev->dev, "Base address not set - upgrade BIOS or use force_addr=0xaddr\n");
758                 return -ENODEV;
759         }
760
761         s_bridge = pci_dev_get(dev);
762         if (i2c_isa_add_driver(&sis5595_driver)) {
763                 pci_dev_put(s_bridge);
764                 s_bridge = NULL;
765         }
766
767         /* Always return failure here.  This is to allow other drivers to bind
768          * to this pci device.  We don't really want to have control over the
769          * pci device, we only wanted to read as few register values from it.
770          */
771         return -ENODEV;
772 }
773
774 static struct pci_driver sis5595_pci_driver = {
775         .name            = "sis5595",
776         .id_table        = sis5595_pci_ids,
777         .probe           = sis5595_pci_probe,
778 };
779
780 static int __init sm_sis5595_init(void)
781 {
782         return pci_register_driver(&sis5595_pci_driver);
783 }
784
785 static void __exit sm_sis5595_exit(void)
786 {
787         pci_unregister_driver(&sis5595_pci_driver);
788         if (s_bridge != NULL) {
789                 i2c_isa_del_driver(&sis5595_driver);
790                 pci_dev_put(s_bridge);
791                 s_bridge = NULL;
792         }
793 }
794
795 MODULE_AUTHOR("Aurelien Jarno <aurelien@aurel32.net>");
796 MODULE_DESCRIPTION("SiS 5595 Sensor device");
797 MODULE_LICENSE("GPL");
798
799 module_init(sm_sis5595_init);
800 module_exit(sm_sis5595_exit);