xref: /linux/drivers/hwmon/pc87427.c (revision c537b994505099b7197e7d3125b942ecbcc51eb6)
1 /*
2  *  pc87427.c - hardware monitoring driver for the
3  *              National Semiconductor PC87427 Super-I/O chip
4  *  Copyright (C) 2006 Jean Delvare <khali@linux-fr.org>
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License version 2 as
8  *  published by the Free Software Foundation.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  Supports the following chips:
16  *
17  *  Chip        #vin    #fan    #pwm    #temp   devid
18  *  PC87427     -       8       -       -       0xF2
19  *
20  *  This driver assumes that no more than one chip is present.
21  *  Only fan inputs are supported so far, although the chip can do much more.
22  */
23 
24 #include <linux/module.h>
25 #include <linux/init.h>
26 #include <linux/slab.h>
27 #include <linux/jiffies.h>
28 #include <linux/platform_device.h>
29 #include <linux/hwmon.h>
30 #include <linux/hwmon-sysfs.h>
31 #include <linux/err.h>
32 #include <linux/mutex.h>
33 #include <linux/sysfs.h>
34 #include <asm/io.h>
35 
36 static struct platform_device *pdev;
37 
38 #define DRVNAME "pc87427"
39 
40 /* The lock mutex protects both the I/O accesses (needed because the
41    device is using banked registers) and the register cache (needed to keep
42    the data in the registers and the cache in sync at any time). */
43 struct pc87427_data {
44 	struct class_device *class_dev;
45 	struct mutex lock;
46 	int address[2];
47 	const char *name;
48 
49 	unsigned long last_updated;	/* in jiffies */
50 	u8 fan_enabled;			/* bit vector */
51 	u16 fan[8];			/* register values */
52 	u16 fan_min[8];			/* register values */
53 	u8 fan_status[8];		/* register values */
54 };
55 
56 /*
57  * Super-I/O registers and operations
58  */
59 
60 #define SIOREG_LDSEL	0x07	/* Logical device select */
61 #define SIOREG_DEVID	0x20	/* Device ID */
62 #define SIOREG_ACT	0x30	/* Device activation */
63 #define SIOREG_MAP	0x50	/* I/O or memory mapping */
64 #define SIOREG_IOBASE	0x60	/* I/O base address */
65 
66 static const u8 logdev[2] = { 0x09, 0x14 };
67 static const char *logdev_str[2] = { DRVNAME " FMC", DRVNAME " HMC" };
68 #define LD_FAN		0
69 #define LD_IN		1
70 #define LD_TEMP		1
71 
72 static inline void superio_outb(int sioaddr, int reg, int val)
73 {
74 	outb(reg, sioaddr);
75 	outb(val, sioaddr + 1);
76 }
77 
78 static inline int superio_inb(int sioaddr, int reg)
79 {
80 	outb(reg, sioaddr);
81 	return inb(sioaddr + 1);
82 }
83 
84 static inline void superio_exit(int sioaddr)
85 {
86 	outb(0x02, sioaddr);
87 	outb(0x02, sioaddr + 1);
88 }
89 
90 /*
91  * Logical devices
92  */
93 
94 #define REGION_LENGTH		32
95 #define PC87427_REG_BANK	0x0f
96 #define BANK_FM(nr)		(nr)
97 #define BANK_FT(nr)		(0x08 + (nr))
98 #define BANK_FC(nr)		(0x10 + (nr) * 2)
99 
100 /*
101  * I/O access functions
102  */
103 
104 /* ldi is the logical device index */
105 static inline int pc87427_read8(struct pc87427_data *data, u8 ldi, u8 reg)
106 {
107 	return inb(data->address[ldi] + reg);
108 }
109 
110 /* Must be called with data->lock held, except during init */
111 static inline int pc87427_read8_bank(struct pc87427_data *data, u8 ldi,
112 				     u8 bank, u8 reg)
113 {
114 	outb(bank, data->address[ldi] + PC87427_REG_BANK);
115 	return inb(data->address[ldi] + reg);
116 }
117 
118 /* Must be called with data->lock held, except during init */
119 static inline void pc87427_write8_bank(struct pc87427_data *data, u8 ldi,
120 				       u8 bank, u8 reg, u8 value)
121 {
122 	outb(bank, data->address[ldi] + PC87427_REG_BANK);
123 	outb(value, data->address[ldi] + reg);
124 }
125 
126 /*
127  * Fan registers and conversions
128  */
129 
130 /* fan data registers are 16-bit wide */
131 #define PC87427_REG_FAN			0x12
132 #define PC87427_REG_FAN_MIN		0x14
133 #define PC87427_REG_FAN_STATUS		0x10
134 
135 #define FAN_STATUS_STALL		(1 << 3)
136 #define FAN_STATUS_LOSPD		(1 << 1)
137 #define FAN_STATUS_MONEN		(1 << 0)
138 
139 /* Dedicated function to read all registers related to a given fan input.
140    This saves us quite a few locks and bank selections.
141    Must be called with data->lock held.
142    nr is from 0 to 7 */
143 static void pc87427_readall_fan(struct pc87427_data *data, u8 nr)
144 {
145 	int iobase = data->address[LD_FAN];
146 
147 	outb(BANK_FM(nr), iobase + PC87427_REG_BANK);
148 	data->fan[nr] = inw(iobase + PC87427_REG_FAN);
149 	data->fan_min[nr] = inw(iobase + PC87427_REG_FAN_MIN);
150 	data->fan_status[nr] = inb(iobase + PC87427_REG_FAN_STATUS);
151 	/* Clear fan alarm bits */
152 	outb(data->fan_status[nr], iobase + PC87427_REG_FAN_STATUS);
153 }
154 
155 /* The 2 LSB of fan speed registers are used for something different.
156    The actual 2 LSB of the measurements are not available. */
157 static inline unsigned long fan_from_reg(u16 reg)
158 {
159 	reg &= 0xfffc;
160 	if (reg == 0x0000 || reg == 0xfffc)
161 		return 0;
162 	return 5400000UL / reg;
163 }
164 
165 /* The 2 LSB of the fan speed limit registers are not significant. */
166 static inline u16 fan_to_reg(unsigned long val)
167 {
168 	if (val < 83UL)
169 		return 0xffff;
170 	if (val >= 1350000UL)
171 		return 0x0004;
172 	return ((1350000UL + val / 2) / val) << 2;
173 }
174 
175 /*
176  * Data interface
177  */
178 
179 static struct pc87427_data *pc87427_update_device(struct device *dev)
180 {
181 	struct pc87427_data *data = dev_get_drvdata(dev);
182 	int i;
183 
184 	mutex_lock(&data->lock);
185 	if (!time_after(jiffies, data->last_updated + HZ)
186 	 && data->last_updated)
187 		goto done;
188 
189 	/* Fans */
190 	for (i = 0; i < 8; i++) {
191 		if (!(data->fan_enabled & (1 << i)))
192 			continue;
193 		pc87427_readall_fan(data, i);
194 	}
195 	data->last_updated = jiffies;
196 
197 done:
198 	mutex_unlock(&data->lock);
199 	return data;
200 }
201 
202 static ssize_t show_fan_input(struct device *dev, struct device_attribute
203 			      *devattr, char *buf)
204 {
205 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
206 	struct pc87427_data *data = pc87427_update_device(dev);
207 	int nr = attr->index;
208 
209 	return sprintf(buf, "%lu\n", fan_from_reg(data->fan[nr]));
210 }
211 
212 static ssize_t show_fan_min(struct device *dev, struct device_attribute
213 			    *devattr, char *buf)
214 {
215 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
216 	struct pc87427_data *data = pc87427_update_device(dev);
217 	int nr = attr->index;
218 
219 	return sprintf(buf, "%lu\n", fan_from_reg(data->fan_min[nr]));
220 }
221 
222 static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
223 			      *devattr, char *buf)
224 {
225 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
226 	struct pc87427_data *data = pc87427_update_device(dev);
227 	int nr = attr->index;
228 
229 	return sprintf(buf, "%d\n", !!(data->fan_status[nr]
230 				       & FAN_STATUS_LOSPD));
231 }
232 
233 static ssize_t show_fan_fault(struct device *dev, struct device_attribute
234 			      *devattr, char *buf)
235 {
236 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
237 	struct pc87427_data *data = pc87427_update_device(dev);
238 	int nr = attr->index;
239 
240 	return sprintf(buf, "%d\n", !!(data->fan_status[nr]
241 				       & FAN_STATUS_STALL));
242 }
243 
244 static ssize_t set_fan_min(struct device *dev, struct device_attribute
245 			   *devattr, const char *buf, size_t count)
246 {
247 	struct pc87427_data *data = dev_get_drvdata(dev);
248 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
249 	int nr = attr->index;
250 	unsigned long val = simple_strtoul(buf, NULL, 10);
251 	int iobase = data->address[LD_FAN];
252 
253 	mutex_lock(&data->lock);
254 	outb(BANK_FM(nr), iobase + PC87427_REG_BANK);
255 	/* The low speed limit registers are read-only while monitoring
256 	   is enabled, so we have to disable monitoring, then change the
257 	   limit, and finally enable monitoring again. */
258 	outb(0, iobase + PC87427_REG_FAN_STATUS);
259 	data->fan_min[nr] = fan_to_reg(val);
260 	outw(data->fan_min[nr], iobase + PC87427_REG_FAN_MIN);
261 	outb(FAN_STATUS_MONEN, iobase + PC87427_REG_FAN_STATUS);
262 	mutex_unlock(&data->lock);
263 
264 	return count;
265 }
266 
267 static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan_input, NULL, 0);
268 static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan_input, NULL, 1);
269 static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan_input, NULL, 2);
270 static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_fan_input, NULL, 3);
271 static SENSOR_DEVICE_ATTR(fan5_input, S_IRUGO, show_fan_input, NULL, 4);
272 static SENSOR_DEVICE_ATTR(fan6_input, S_IRUGO, show_fan_input, NULL, 5);
273 static SENSOR_DEVICE_ATTR(fan7_input, S_IRUGO, show_fan_input, NULL, 6);
274 static SENSOR_DEVICE_ATTR(fan8_input, S_IRUGO, show_fan_input, NULL, 7);
275 
276 static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO,
277 			  show_fan_min, set_fan_min, 0);
278 static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO,
279 			  show_fan_min, set_fan_min, 1);
280 static SENSOR_DEVICE_ATTR(fan3_min, S_IWUSR | S_IRUGO,
281 			  show_fan_min, set_fan_min, 2);
282 static SENSOR_DEVICE_ATTR(fan4_min, S_IWUSR | S_IRUGO,
283 			  show_fan_min, set_fan_min, 3);
284 static SENSOR_DEVICE_ATTR(fan5_min, S_IWUSR | S_IRUGO,
285 			  show_fan_min, set_fan_min, 4);
286 static SENSOR_DEVICE_ATTR(fan6_min, S_IWUSR | S_IRUGO,
287 			  show_fan_min, set_fan_min, 5);
288 static SENSOR_DEVICE_ATTR(fan7_min, S_IWUSR | S_IRUGO,
289 			  show_fan_min, set_fan_min, 6);
290 static SENSOR_DEVICE_ATTR(fan8_min, S_IWUSR | S_IRUGO,
291 			  show_fan_min, set_fan_min, 7);
292 
293 static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_fan_alarm, NULL, 0);
294 static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_fan_alarm, NULL, 1);
295 static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 2);
296 static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 3);
297 static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO, show_fan_alarm, NULL, 4);
298 static SENSOR_DEVICE_ATTR(fan6_alarm, S_IRUGO, show_fan_alarm, NULL, 5);
299 static SENSOR_DEVICE_ATTR(fan7_alarm, S_IRUGO, show_fan_alarm, NULL, 6);
300 static SENSOR_DEVICE_ATTR(fan8_alarm, S_IRUGO, show_fan_alarm, NULL, 7);
301 
302 static SENSOR_DEVICE_ATTR(fan1_fault, S_IRUGO, show_fan_fault, NULL, 0);
303 static SENSOR_DEVICE_ATTR(fan2_fault, S_IRUGO, show_fan_fault, NULL, 1);
304 static SENSOR_DEVICE_ATTR(fan3_fault, S_IRUGO, show_fan_fault, NULL, 2);
305 static SENSOR_DEVICE_ATTR(fan4_fault, S_IRUGO, show_fan_fault, NULL, 3);
306 static SENSOR_DEVICE_ATTR(fan5_fault, S_IRUGO, show_fan_fault, NULL, 4);
307 static SENSOR_DEVICE_ATTR(fan6_fault, S_IRUGO, show_fan_fault, NULL, 5);
308 static SENSOR_DEVICE_ATTR(fan7_fault, S_IRUGO, show_fan_fault, NULL, 6);
309 static SENSOR_DEVICE_ATTR(fan8_fault, S_IRUGO, show_fan_fault, NULL, 7);
310 
311 static struct attribute *pc87427_attributes_fan[8][5] = {
312 	{
313 		&sensor_dev_attr_fan1_input.dev_attr.attr,
314 		&sensor_dev_attr_fan1_min.dev_attr.attr,
315 		&sensor_dev_attr_fan1_alarm.dev_attr.attr,
316 		&sensor_dev_attr_fan1_fault.dev_attr.attr,
317 		NULL
318 	}, {
319 		&sensor_dev_attr_fan2_input.dev_attr.attr,
320 		&sensor_dev_attr_fan2_min.dev_attr.attr,
321 		&sensor_dev_attr_fan2_alarm.dev_attr.attr,
322 		&sensor_dev_attr_fan2_fault.dev_attr.attr,
323 		NULL
324 	}, {
325 		&sensor_dev_attr_fan3_input.dev_attr.attr,
326 		&sensor_dev_attr_fan3_min.dev_attr.attr,
327 		&sensor_dev_attr_fan3_alarm.dev_attr.attr,
328 		&sensor_dev_attr_fan3_fault.dev_attr.attr,
329 		NULL
330 	}, {
331 		&sensor_dev_attr_fan4_input.dev_attr.attr,
332 		&sensor_dev_attr_fan4_min.dev_attr.attr,
333 		&sensor_dev_attr_fan4_alarm.dev_attr.attr,
334 		&sensor_dev_attr_fan4_fault.dev_attr.attr,
335 		NULL
336 	}, {
337 		&sensor_dev_attr_fan5_input.dev_attr.attr,
338 		&sensor_dev_attr_fan5_min.dev_attr.attr,
339 		&sensor_dev_attr_fan5_alarm.dev_attr.attr,
340 		&sensor_dev_attr_fan5_fault.dev_attr.attr,
341 		NULL
342 	}, {
343 		&sensor_dev_attr_fan6_input.dev_attr.attr,
344 		&sensor_dev_attr_fan6_min.dev_attr.attr,
345 		&sensor_dev_attr_fan6_alarm.dev_attr.attr,
346 		&sensor_dev_attr_fan6_fault.dev_attr.attr,
347 		NULL
348 	}, {
349 		&sensor_dev_attr_fan7_input.dev_attr.attr,
350 		&sensor_dev_attr_fan7_min.dev_attr.attr,
351 		&sensor_dev_attr_fan7_alarm.dev_attr.attr,
352 		&sensor_dev_attr_fan7_fault.dev_attr.attr,
353 		NULL
354 	}, {
355 		&sensor_dev_attr_fan8_input.dev_attr.attr,
356 		&sensor_dev_attr_fan8_min.dev_attr.attr,
357 		&sensor_dev_attr_fan8_alarm.dev_attr.attr,
358 		&sensor_dev_attr_fan8_fault.dev_attr.attr,
359 		NULL
360 	}
361 };
362 
363 static const struct attribute_group pc87427_group_fan[8] = {
364 	{ .attrs = pc87427_attributes_fan[0] },
365 	{ .attrs = pc87427_attributes_fan[1] },
366 	{ .attrs = pc87427_attributes_fan[2] },
367 	{ .attrs = pc87427_attributes_fan[3] },
368 	{ .attrs = pc87427_attributes_fan[4] },
369 	{ .attrs = pc87427_attributes_fan[5] },
370 	{ .attrs = pc87427_attributes_fan[6] },
371 	{ .attrs = pc87427_attributes_fan[7] },
372 };
373 
374 static ssize_t show_name(struct device *dev, struct device_attribute
375 			 *devattr, char *buf)
376 {
377 	struct pc87427_data *data = dev_get_drvdata(dev);
378 
379 	return sprintf(buf, "%s\n", data->name);
380 }
381 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
382 
383 
384 /*
385  * Device detection, attach and detach
386  */
387 
388 static void __devinit pc87427_init_device(struct device *dev)
389 {
390 	struct pc87427_data *data = dev_get_drvdata(dev);
391 	int i;
392 	u8 reg;
393 
394 	/* The FMC module should be ready */
395 	reg = pc87427_read8(data, LD_FAN, PC87427_REG_BANK);
396 	if (!(reg & 0x80))
397 		dev_warn(dev, "FMC module not ready!\n");
398 
399 	/* Check which fans are enabled */
400 	for (i = 0; i < 8; i++) {
401 		reg = pc87427_read8_bank(data, LD_FAN, BANK_FM(i),
402 					 PC87427_REG_FAN_STATUS);
403 		if (reg & FAN_STATUS_MONEN)
404 			data->fan_enabled |= (1 << i);
405 	}
406 
407 	if (!data->fan_enabled) {
408 		dev_dbg(dev, "Enabling all fan inputs\n");
409 		for (i = 0; i < 8; i++)
410 			pc87427_write8_bank(data, LD_FAN, BANK_FM(i),
411 					    PC87427_REG_FAN_STATUS,
412 					    FAN_STATUS_MONEN);
413 		data->fan_enabled = 0xff;
414 	}
415 }
416 
417 static int __devinit pc87427_probe(struct platform_device *pdev)
418 {
419 	struct pc87427_data *data;
420 	struct resource *res;
421 	int i, err;
422 
423 	if (!(data = kzalloc(sizeof(struct pc87427_data), GFP_KERNEL))) {
424 		err = -ENOMEM;
425 		printk(KERN_ERR DRVNAME ": Out of memory\n");
426 		goto exit;
427 	}
428 
429 	/* This will need to be revisited when we add support for
430 	   temperature and voltage monitoring. */
431 	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
432 	data->address[0] = res->start;
433 
434 	mutex_init(&data->lock);
435 	data->name = "pc87427";
436 	platform_set_drvdata(pdev, data);
437 	pc87427_init_device(&pdev->dev);
438 
439 	/* Register sysfs hooks */
440 	if ((err = device_create_file(&pdev->dev, &dev_attr_name)))
441 		goto exit_kfree;
442 	for (i = 0; i < 8; i++) {
443 		if (!(data->fan_enabled & (1 << i)))
444 			continue;
445 		if ((err = sysfs_create_group(&pdev->dev.kobj,
446 					      &pc87427_group_fan[i])))
447 			goto exit_remove_files;
448 	}
449 
450 	data->class_dev = hwmon_device_register(&pdev->dev);
451 	if (IS_ERR(data->class_dev)) {
452 		err = PTR_ERR(data->class_dev);
453 		dev_err(&pdev->dev, "Class registration failed (%d)\n", err);
454 		goto exit_remove_files;
455 	}
456 
457 	return 0;
458 
459 exit_remove_files:
460 	for (i = 0; i < 8; i++) {
461 		if (!(data->fan_enabled & (1 << i)))
462 			continue;
463 		sysfs_remove_group(&pdev->dev.kobj, &pc87427_group_fan[i]);
464 	}
465 exit_kfree:
466 	platform_set_drvdata(pdev, NULL);
467 	kfree(data);
468 exit:
469 	return err;
470 }
471 
472 static int __devexit pc87427_remove(struct platform_device *pdev)
473 {
474 	struct pc87427_data *data = platform_get_drvdata(pdev);
475 	int i;
476 
477 	platform_set_drvdata(pdev, NULL);
478 	hwmon_device_unregister(data->class_dev);
479 	device_remove_file(&pdev->dev, &dev_attr_name);
480 	for (i = 0; i < 8; i++) {
481 		if (!(data->fan_enabled & (1 << i)))
482 			continue;
483 		sysfs_remove_group(&pdev->dev.kobj, &pc87427_group_fan[i]);
484 	}
485 	kfree(data);
486 
487 	return 0;
488 }
489 
490 
491 static struct platform_driver pc87427_driver = {
492 	.driver = {
493 		.owner	= THIS_MODULE,
494 		.name	= DRVNAME,
495 	},
496 	.probe		= pc87427_probe,
497 	.remove		= __devexit_p(pc87427_remove),
498 };
499 
500 static int __init pc87427_device_add(unsigned short address)
501 {
502 	struct resource res = {
503 		.start	= address,
504 		.end	= address + REGION_LENGTH - 1,
505 		.name	= logdev_str[0],
506 		.flags	= IORESOURCE_IO,
507 	};
508 	int err;
509 
510 	pdev = platform_device_alloc(DRVNAME, address);
511 	if (!pdev) {
512 		err = -ENOMEM;
513 		printk(KERN_ERR DRVNAME ": Device allocation failed\n");
514 		goto exit;
515 	}
516 
517 	err = platform_device_add_resources(pdev, &res, 1);
518 	if (err) {
519 		printk(KERN_ERR DRVNAME ": Device resource addition failed "
520 		       "(%d)\n", err);
521 		goto exit_device_put;
522 	}
523 
524 	err = platform_device_add(pdev);
525 	if (err) {
526 		printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n",
527 		       err);
528 		goto exit_device_put;
529 	}
530 
531 	return 0;
532 
533 exit_device_put:
534 	platform_device_put(pdev);
535 exit:
536 	return err;
537 }
538 
539 static int __init pc87427_find(int sioaddr, unsigned short *address)
540 {
541 	u16 val;
542 	int i, err = 0;
543 
544 	/* Identify device */
545 	val = superio_inb(sioaddr, SIOREG_DEVID);
546 	if (val != 0xf2) {	/* PC87427 */
547 		err = -ENODEV;
548 		goto exit;
549 	}
550 
551 	for (i = 0; i < 2; i++) {
552 		address[i] = 0;
553 		/* Select logical device */
554 		superio_outb(sioaddr, SIOREG_LDSEL, logdev[i]);
555 
556 		val = superio_inb(sioaddr, SIOREG_ACT);
557 		if (!(val & 0x01)) {
558 			printk(KERN_INFO DRVNAME ": Logical device 0x%02x "
559 			       "not activated\n", logdev[i]);
560 			continue;
561 		}
562 
563 		val = superio_inb(sioaddr, SIOREG_MAP);
564 		if (val & 0x01) {
565 			printk(KERN_WARNING DRVNAME ": Logical device 0x%02x "
566 			       "is memory-mapped, can't use\n", logdev[i]);
567 			continue;
568 		}
569 
570 		val = (superio_inb(sioaddr, SIOREG_IOBASE) << 8)
571 		    | superio_inb(sioaddr, SIOREG_IOBASE + 1);
572 		if (!val) {
573 			printk(KERN_INFO DRVNAME ": I/O base address not set "
574 			       "for logical device 0x%02x\n", logdev[i]);
575 			continue;
576 		}
577 		address[i] = val;
578 	}
579 
580 exit:
581 	superio_exit(sioaddr);
582 	return err;
583 }
584 
585 static int __init pc87427_init(void)
586 {
587 	int err;
588 	unsigned short address[2];
589 
590 	if (pc87427_find(0x2e, address)
591 	 && pc87427_find(0x4e, address))
592 		return -ENODEV;
593 
594 	/* For now the driver only handles fans so we only care about the
595 	   first address. */
596 	if (!address[0])
597 		return -ENODEV;
598 
599 	err = platform_driver_register(&pc87427_driver);
600 	if (err)
601 		goto exit;
602 
603 	/* Sets global pdev as a side effect */
604 	err = pc87427_device_add(address[0]);
605 	if (err)
606 		goto exit_driver;
607 
608 	return 0;
609 
610 exit_driver:
611 	platform_driver_unregister(&pc87427_driver);
612 exit:
613 	return err;
614 }
615 
616 static void __exit pc87427_exit(void)
617 {
618 	platform_device_unregister(pdev);
619 	platform_driver_unregister(&pc87427_driver);
620 }
621 
622 MODULE_AUTHOR("Jean Delvare <khali@linux-fr.org>");
623 MODULE_DESCRIPTION("PC87427 hardware monitoring driver");
624 MODULE_LICENSE("GPL");
625 
626 module_init(pc87427_init);
627 module_exit(pc87427_exit);
628