xref: /openbmc/linux/drivers/hwmon/sis5595.c (revision 64c70b1c)
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 <linux/sysfs.h>
65 #include <asm/io.h>
66 
67 
68 /* If force_addr is set to anything different from 0, we forcibly enable
69    the device at the given address. */
70 static u16 force_addr;
71 module_param(force_addr, ushort, 0);
72 MODULE_PARM_DESC(force_addr,
73 		 "Initialize the base address of the sensors");
74 
75 /* Device address
76    Note that we can't determine the ISA address until we have initialized
77    our module */
78 static unsigned short address;
79 
80 /* Many SIS5595 constants specified below */
81 
82 /* Length of ISA address segment */
83 #define SIS5595_EXTENT 8
84 /* PCI Config Registers */
85 #define SIS5595_REVISION_REG 0x08
86 #define SIS5595_BASE_REG 0x68
87 #define SIS5595_PIN_REG 0x7A
88 #define SIS5595_ENABLE_REG 0x7B
89 
90 /* Where are the ISA address/data registers relative to the base address */
91 #define SIS5595_ADDR_REG_OFFSET 5
92 #define SIS5595_DATA_REG_OFFSET 6
93 
94 /* The SIS5595 registers */
95 #define SIS5595_REG_IN_MAX(nr) (0x2b + (nr) * 2)
96 #define SIS5595_REG_IN_MIN(nr) (0x2c + (nr) * 2)
97 #define SIS5595_REG_IN(nr) (0x20 + (nr))
98 
99 #define SIS5595_REG_FAN_MIN(nr) (0x3b + (nr))
100 #define SIS5595_REG_FAN(nr) (0x28 + (nr))
101 
102 /* On the first version of the chip, the temp registers are separate.
103    On the second version,
104    TEMP pin is shared with IN4, configured in PCI register 0x7A.
105    The registers are the same as well.
106    OVER and HYST are really MAX and MIN. */
107 
108 #define REV2MIN	0xb0
109 #define SIS5595_REG_TEMP 	(( data->revision) >= REV2MIN) ? \
110 					SIS5595_REG_IN(4) : 0x27
111 #define SIS5595_REG_TEMP_OVER	(( data->revision) >= REV2MIN) ? \
112 					SIS5595_REG_IN_MAX(4) : 0x39
113 #define SIS5595_REG_TEMP_HYST	(( data->revision) >= REV2MIN) ? \
114 					SIS5595_REG_IN_MIN(4) : 0x3a
115 
116 #define SIS5595_REG_CONFIG 0x40
117 #define SIS5595_REG_ALARM1 0x41
118 #define SIS5595_REG_ALARM2 0x42
119 #define SIS5595_REG_FANDIV 0x47
120 
121 /* Conversions. Limit checking is only done on the TO_REG
122    variants. */
123 
124 /* IN: mV, (0V to 4.08V)
125    REG: 16mV/bit */
126 static inline u8 IN_TO_REG(unsigned long val)
127 {
128 	unsigned long nval = SENSORS_LIMIT(val, 0, 4080);
129 	return (nval + 8) / 16;
130 }
131 #define IN_FROM_REG(val) ((val) *  16)
132 
133 static inline u8 FAN_TO_REG(long rpm, int div)
134 {
135 	if (rpm <= 0)
136 		return 255;
137 	return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
138 }
139 
140 static inline int FAN_FROM_REG(u8 val, int div)
141 {
142 	return val==0 ? -1 : val==255 ? 0 : 1350000/(val*div);
143 }
144 
145 /* TEMP: mC (-54.12C to +157.53C)
146    REG: 0.83C/bit + 52.12, two's complement  */
147 static inline int TEMP_FROM_REG(s8 val)
148 {
149 	return val * 830 + 52120;
150 }
151 static inline s8 TEMP_TO_REG(int val)
152 {
153 	int nval = SENSORS_LIMIT(val, -54120, 157530) ;
154 	return nval<0 ? (nval-5212-415)/830 : (nval-5212+415)/830;
155 }
156 
157 /* FAN DIV: 1, 2, 4, or 8 (defaults to 2)
158    REG: 0, 1, 2, or 3 (respectively) (defaults to 1) */
159 static inline u8 DIV_TO_REG(int val)
160 {
161 	return val==8 ? 3 : val==4 ? 2 : val==1 ? 0 : 1;
162 }
163 #define DIV_FROM_REG(val) (1 << (val))
164 
165 /* For each registered chip, we need to keep some data in memory.
166    The structure is dynamically allocated. */
167 struct sis5595_data {
168 	struct i2c_client client;
169 	struct class_device *class_dev;
170 	struct mutex lock;
171 
172 	struct mutex 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 reg);
196 static int sis5595_write_value(struct i2c_client *client, u8 reg, 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 	.driver = {
202 		.owner	= THIS_MODULE,
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 static struct attribute *sis5595_attributes[] = {
477 	&dev_attr_in0_input.attr,
478 	&dev_attr_in0_min.attr,
479 	&dev_attr_in0_max.attr,
480 	&dev_attr_in1_input.attr,
481 	&dev_attr_in1_min.attr,
482 	&dev_attr_in1_max.attr,
483 	&dev_attr_in2_input.attr,
484 	&dev_attr_in2_min.attr,
485 	&dev_attr_in2_max.attr,
486 	&dev_attr_in3_input.attr,
487 	&dev_attr_in3_min.attr,
488 	&dev_attr_in3_max.attr,
489 
490 	&dev_attr_fan1_input.attr,
491 	&dev_attr_fan1_min.attr,
492 	&dev_attr_fan1_div.attr,
493 	&dev_attr_fan2_input.attr,
494 	&dev_attr_fan2_min.attr,
495 	&dev_attr_fan2_div.attr,
496 
497 	&dev_attr_alarms.attr,
498 	NULL
499 };
500 
501 static const struct attribute_group sis5595_group = {
502 	.attrs = sis5595_attributes,
503 };
504 
505 static struct attribute *sis5595_attributes_opt[] = {
506 	&dev_attr_in4_input.attr,
507 	&dev_attr_in4_min.attr,
508 	&dev_attr_in4_max.attr,
509 
510 	&dev_attr_temp1_input.attr,
511 	&dev_attr_temp1_max.attr,
512 	&dev_attr_temp1_max_hyst.attr,
513 	NULL
514 };
515 
516 static const struct attribute_group sis5595_group_opt = {
517 	.attrs = sis5595_attributes_opt,
518 };
519 
520 /* This is called when the module is loaded */
521 static int sis5595_detect(struct i2c_adapter *adapter)
522 {
523 	int err = 0;
524 	int i;
525 	struct i2c_client *new_client;
526 	struct sis5595_data *data;
527 	char val;
528 	u16 a;
529 
530 	if (force_addr)
531 		address = force_addr & ~(SIS5595_EXTENT - 1);
532 	/* Reserve the ISA region */
533 	if (!request_region(address, SIS5595_EXTENT,
534 			    sis5595_driver.driver.name)) {
535 		err = -EBUSY;
536 		goto exit;
537 	}
538 	if (force_addr) {
539 		dev_warn(&adapter->dev, "forcing ISA address 0x%04X\n", address);
540 		if (PCIBIOS_SUCCESSFUL !=
541 		    pci_write_config_word(s_bridge, SIS5595_BASE_REG, address))
542 			goto exit_release;
543 		if (PCIBIOS_SUCCESSFUL !=
544 		    pci_read_config_word(s_bridge, SIS5595_BASE_REG, &a))
545 			goto exit_release;
546 		if ((a & ~(SIS5595_EXTENT - 1)) != address)
547 			/* doesn't work for some chips? */
548 			goto exit_release;
549 	}
550 
551 	if (PCIBIOS_SUCCESSFUL !=
552 	    pci_read_config_byte(s_bridge, SIS5595_ENABLE_REG, &val)) {
553 		goto exit_release;
554 	}
555 	if ((val & 0x80) == 0) {
556 		if (PCIBIOS_SUCCESSFUL !=
557 		    pci_write_config_byte(s_bridge, SIS5595_ENABLE_REG,
558 					  val | 0x80))
559 			goto exit_release;
560 		if (PCIBIOS_SUCCESSFUL !=
561 		    pci_read_config_byte(s_bridge, SIS5595_ENABLE_REG, &val))
562 			goto exit_release;
563 		if ((val & 0x80) == 0)
564 			/* doesn't work for some chips! */
565 			goto exit_release;
566 	}
567 
568 	if (!(data = kzalloc(sizeof(struct sis5595_data), GFP_KERNEL))) {
569 		err = -ENOMEM;
570 		goto exit_release;
571 	}
572 
573 	new_client = &data->client;
574 	new_client->addr = address;
575 	mutex_init(&data->lock);
576 	i2c_set_clientdata(new_client, data);
577 	new_client->adapter = adapter;
578 	new_client->driver = &sis5595_driver;
579 	new_client->flags = 0;
580 
581 	/* Check revision and pin registers to determine whether 4 or 5 voltages */
582 	pci_read_config_byte(s_bridge, SIS5595_REVISION_REG, &(data->revision));
583 	/* 4 voltages, 1 temp */
584 	data->maxins = 3;
585 	if (data->revision >= REV2MIN) {
586 		pci_read_config_byte(s_bridge, SIS5595_PIN_REG, &val);
587 		if (!(val & 0x80))
588 			/* 5 voltages, no temps */
589 			data->maxins = 4;
590 	}
591 
592 	/* Fill in the remaining client fields and put it into the global list */
593 	strlcpy(new_client->name, "sis5595", I2C_NAME_SIZE);
594 
595 	data->valid = 0;
596 	mutex_init(&data->update_lock);
597 
598 	/* Tell the I2C layer a new client has arrived */
599 	if ((err = i2c_attach_client(new_client)))
600 		goto exit_free;
601 
602 	/* Initialize the SIS5595 chip */
603 	sis5595_init_client(new_client);
604 
605 	/* A few vars need to be filled upon startup */
606 	for (i = 0; i < 2; i++) {
607 		data->fan_min[i] = sis5595_read_value(new_client,
608 					SIS5595_REG_FAN_MIN(i));
609 	}
610 
611 	/* Register sysfs hooks */
612 	if ((err = sysfs_create_group(&new_client->dev.kobj, &sis5595_group)))
613 		goto exit_detach;
614 	if (data->maxins == 4) {
615 		if ((err = device_create_file(&new_client->dev,
616 					      &dev_attr_in4_input))
617 		 || (err = device_create_file(&new_client->dev,
618 					      &dev_attr_in4_min))
619 		 || (err = device_create_file(&new_client->dev,
620 					      &dev_attr_in4_max)))
621 			goto exit_remove_files;
622 	} else {
623 		if ((err = device_create_file(&new_client->dev,
624 					      &dev_attr_temp1_input))
625 		 || (err = device_create_file(&new_client->dev,
626 					      &dev_attr_temp1_max))
627 		 || (err = device_create_file(&new_client->dev,
628 					      &dev_attr_temp1_max_hyst)))
629 			goto exit_remove_files;
630 	}
631 
632 	data->class_dev = hwmon_device_register(&new_client->dev);
633 	if (IS_ERR(data->class_dev)) {
634 		err = PTR_ERR(data->class_dev);
635 		goto exit_remove_files;
636 	}
637 
638 	return 0;
639 
640 exit_remove_files:
641 	sysfs_remove_group(&new_client->dev.kobj, &sis5595_group);
642 	sysfs_remove_group(&new_client->dev.kobj, &sis5595_group_opt);
643 exit_detach:
644 	i2c_detach_client(new_client);
645 exit_free:
646 	kfree(data);
647 exit_release:
648 	release_region(address, SIS5595_EXTENT);
649 exit:
650 	return err;
651 }
652 
653 static int sis5595_detach_client(struct i2c_client *client)
654 {
655 	struct sis5595_data *data = i2c_get_clientdata(client);
656 	int err;
657 
658 	hwmon_device_unregister(data->class_dev);
659 	sysfs_remove_group(&client->dev.kobj, &sis5595_group);
660 	sysfs_remove_group(&client->dev.kobj, &sis5595_group_opt);
661 
662 	if ((err = i2c_detach_client(client)))
663 		return err;
664 
665 	release_region(client->addr, SIS5595_EXTENT);
666 
667 	kfree(data);
668 
669 	return 0;
670 }
671 
672 
673 /* ISA access must be locked explicitly. */
674 static int sis5595_read_value(struct i2c_client *client, u8 reg)
675 {
676 	int res;
677 
678 	struct sis5595_data *data = i2c_get_clientdata(client);
679 	mutex_lock(&data->lock);
680 	outb_p(reg, client->addr + SIS5595_ADDR_REG_OFFSET);
681 	res = inb_p(client->addr + SIS5595_DATA_REG_OFFSET);
682 	mutex_unlock(&data->lock);
683 	return res;
684 }
685 
686 static int sis5595_write_value(struct i2c_client *client, u8 reg, u8 value)
687 {
688 	struct sis5595_data *data = i2c_get_clientdata(client);
689 	mutex_lock(&data->lock);
690 	outb_p(reg, client->addr + SIS5595_ADDR_REG_OFFSET);
691 	outb_p(value, client->addr + SIS5595_DATA_REG_OFFSET);
692 	mutex_unlock(&data->lock);
693 	return 0;
694 }
695 
696 /* Called when we have found a new SIS5595. */
697 static void sis5595_init_client(struct i2c_client *client)
698 {
699 	u8 config = sis5595_read_value(client, SIS5595_REG_CONFIG);
700 	if (!(config & 0x01))
701 		sis5595_write_value(client, SIS5595_REG_CONFIG,
702 				(config & 0xf7) | 0x01);
703 }
704 
705 static struct sis5595_data *sis5595_update_device(struct device *dev)
706 {
707 	struct i2c_client *client = to_i2c_client(dev);
708 	struct sis5595_data *data = i2c_get_clientdata(client);
709 	int i;
710 
711 	mutex_lock(&data->update_lock);
712 
713 	if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
714 	    || !data->valid) {
715 
716 		for (i = 0; i <= data->maxins; i++) {
717 			data->in[i] =
718 			    sis5595_read_value(client, SIS5595_REG_IN(i));
719 			data->in_min[i] =
720 			    sis5595_read_value(client,
721 					       SIS5595_REG_IN_MIN(i));
722 			data->in_max[i] =
723 			    sis5595_read_value(client,
724 					       SIS5595_REG_IN_MAX(i));
725 		}
726 		for (i = 0; i < 2; i++) {
727 			data->fan[i] =
728 			    sis5595_read_value(client, SIS5595_REG_FAN(i));
729 			data->fan_min[i] =
730 			    sis5595_read_value(client,
731 					       SIS5595_REG_FAN_MIN(i));
732 		}
733 		if (data->maxins == 3) {
734 			data->temp =
735 			    sis5595_read_value(client, SIS5595_REG_TEMP);
736 			data->temp_over =
737 			    sis5595_read_value(client, SIS5595_REG_TEMP_OVER);
738 			data->temp_hyst =
739 			    sis5595_read_value(client, SIS5595_REG_TEMP_HYST);
740 		}
741 		i = sis5595_read_value(client, SIS5595_REG_FANDIV);
742 		data->fan_div[0] = (i >> 4) & 0x03;
743 		data->fan_div[1] = i >> 6;
744 		data->alarms =
745 		    sis5595_read_value(client, SIS5595_REG_ALARM1) |
746 		    (sis5595_read_value(client, SIS5595_REG_ALARM2) << 8);
747 		data->last_updated = jiffies;
748 		data->valid = 1;
749 	}
750 
751 	mutex_unlock(&data->update_lock);
752 
753 	return data;
754 }
755 
756 static struct pci_device_id sis5595_pci_ids[] = {
757 	{ PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503) },
758 	{ 0, }
759 };
760 
761 MODULE_DEVICE_TABLE(pci, sis5595_pci_ids);
762 
763 static int blacklist[] __devinitdata = {
764 	PCI_DEVICE_ID_SI_540,
765 	PCI_DEVICE_ID_SI_550,
766 	PCI_DEVICE_ID_SI_630,
767 	PCI_DEVICE_ID_SI_645,
768 	PCI_DEVICE_ID_SI_730,
769 	PCI_DEVICE_ID_SI_735,
770 	PCI_DEVICE_ID_SI_5511, /* 5513 chip has the 0008 device but
771 				  that ID shows up in other chips so we
772 				  use the 5511 ID for recognition */
773 	PCI_DEVICE_ID_SI_5597,
774 	PCI_DEVICE_ID_SI_5598,
775 	0 };
776 
777 static int __devinit sis5595_pci_probe(struct pci_dev *dev,
778 				       const struct pci_device_id *id)
779 {
780 	u16 val;
781 	int *i;
782 
783 	for (i = blacklist; *i != 0; i++) {
784 		struct pci_dev *dev;
785 		dev = pci_get_device(PCI_VENDOR_ID_SI, *i, NULL);
786 		if (dev) {
787 			dev_err(&dev->dev, "Looked for SIS5595 but found unsupported device %.4x\n", *i);
788 			pci_dev_put(dev);
789 			return -ENODEV;
790 		}
791 	}
792 
793 	if (PCIBIOS_SUCCESSFUL !=
794 	    pci_read_config_word(dev, SIS5595_BASE_REG, &val))
795 		return -ENODEV;
796 
797 	address = val & ~(SIS5595_EXTENT - 1);
798 	if (address == 0 && force_addr == 0) {
799 		dev_err(&dev->dev, "Base address not set - upgrade BIOS or use force_addr=0xaddr\n");
800 		return -ENODEV;
801 	}
802 
803 	s_bridge = pci_dev_get(dev);
804 	if (i2c_isa_add_driver(&sis5595_driver)) {
805 		pci_dev_put(s_bridge);
806 		s_bridge = NULL;
807 	}
808 
809 	/* Always return failure here.  This is to allow other drivers to bind
810 	 * to this pci device.  We don't really want to have control over the
811 	 * pci device, we only wanted to read as few register values from it.
812 	 */
813 	return -ENODEV;
814 }
815 
816 static struct pci_driver sis5595_pci_driver = {
817 	.name            = "sis5595",
818 	.id_table        = sis5595_pci_ids,
819 	.probe           = sis5595_pci_probe,
820 };
821 
822 static int __init sm_sis5595_init(void)
823 {
824 	return pci_register_driver(&sis5595_pci_driver);
825 }
826 
827 static void __exit sm_sis5595_exit(void)
828 {
829 	pci_unregister_driver(&sis5595_pci_driver);
830 	if (s_bridge != NULL) {
831 		i2c_isa_del_driver(&sis5595_driver);
832 		pci_dev_put(s_bridge);
833 		s_bridge = NULL;
834 	}
835 }
836 
837 MODULE_AUTHOR("Aurelien Jarno <aurelien@aurel32.net>");
838 MODULE_DESCRIPTION("SiS 5595 Sensor device");
839 MODULE_LICENSE("GPL");
840 
841 module_init(sm_sis5595_init);
842 module_exit(sm_sis5595_exit);
843