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