2 * pc87427.c - hardware monitoring driver for the
3 * National Semiconductor PC87427 Super-I/O chip
4 * Copyright (C) 2006, 2008 Jean Delvare <khali@linux-fr.org>
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.
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.
15 * Supports the following chips:
17 * Chip #vin #fan #pwm #temp devid
18 * PC87427 - 8 4 - 0xF2
20 * This driver assumes that no more than one chip is present.
21 * Only fans are supported so far, although the chip can do much more.
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 <linux/ioport.h>
35 #include <linux/acpi.h>
38 static unsigned short force_id;
39 module_param(force_id, ushort, 0);
40 MODULE_PARM_DESC(force_id, "Override the detected device ID");
42 static struct platform_device *pdev;
44 #define DRVNAME "pc87427"
46 /* The lock mutex protects both the I/O accesses (needed because the
47 device is using banked registers) and the register cache (needed to keep
48 the data in the registers and the cache in sync at any time). */
50 struct device *hwmon_dev;
55 unsigned long last_updated; /* in jiffies */
56 u8 fan_enabled; /* bit vector */
57 u16 fan[8]; /* register values */
58 u16 fan_min[8]; /* register values */
59 u8 fan_status[8]; /* register values */
61 u8 pwm_enabled; /* bit vector */
62 u8 pwm_auto_ok; /* bit vector */
63 u8 pwm_enable[4]; /* register values */
64 u8 pwm[4]; /* register values */
67 struct pc87427_sio_data {
73 * Super-I/O registers and operations
76 #define SIOREG_LDSEL 0x07 /* Logical device select */
77 #define SIOREG_DEVID 0x20 /* Device ID */
78 #define SIOREG_CF2 0x22 /* Configuration 2 */
79 #define SIOREG_CF3 0x23 /* Configuration 3 */
80 #define SIOREG_CF4 0x24 /* Configuration 4 */
81 #define SIOREG_CF5 0x25 /* Configuration 5 */
82 #define SIOREG_CFB 0x2B /* Configuration B */
83 #define SIOREG_CFC 0x2C /* Configuration C */
84 #define SIOREG_CFD 0x2D /* Configuration D */
85 #define SIOREG_ACT 0x30 /* Device activation */
86 #define SIOREG_MAP 0x50 /* I/O or memory mapping */
87 #define SIOREG_IOBASE 0x60 /* I/O base address */
89 static const u8 logdev[2] = { 0x09, 0x14 };
90 static const char *logdev_str[2] = { DRVNAME " FMC", DRVNAME " HMC" };
95 static inline void superio_outb(int sioaddr, int reg, int val)
98 outb(val, sioaddr + 1);
101 static inline int superio_inb(int sioaddr, int reg)
104 return inb(sioaddr + 1);
107 static inline void superio_exit(int sioaddr)
110 outb(0x02, sioaddr + 1);
117 #define REGION_LENGTH 32
118 #define PC87427_REG_BANK 0x0f
119 #define BANK_FM(nr) (nr)
120 #define BANK_FT(nr) (0x08 + (nr))
121 #define BANK_FC(nr) (0x10 + (nr) * 2)
124 * I/O access functions
127 /* ldi is the logical device index */
128 static inline int pc87427_read8(struct pc87427_data *data, u8 ldi, u8 reg)
130 return inb(data->address[ldi] + reg);
133 /* Must be called with data->lock held, except during init */
134 static inline int pc87427_read8_bank(struct pc87427_data *data, u8 ldi,
137 outb(bank, data->address[ldi] + PC87427_REG_BANK);
138 return inb(data->address[ldi] + reg);
141 /* Must be called with data->lock held, except during init */
142 static inline void pc87427_write8_bank(struct pc87427_data *data, u8 ldi,
143 u8 bank, u8 reg, u8 value)
145 outb(bank, data->address[ldi] + PC87427_REG_BANK);
146 outb(value, data->address[ldi] + reg);
150 * Fan registers and conversions
153 /* fan data registers are 16-bit wide */
154 #define PC87427_REG_FAN 0x12
155 #define PC87427_REG_FAN_MIN 0x14
156 #define PC87427_REG_FAN_STATUS 0x10
158 #define FAN_STATUS_STALL (1 << 3)
159 #define FAN_STATUS_LOSPD (1 << 1)
160 #define FAN_STATUS_MONEN (1 << 0)
162 /* Dedicated function to read all registers related to a given fan input.
163 This saves us quite a few locks and bank selections.
164 Must be called with data->lock held.
166 static void pc87427_readall_fan(struct pc87427_data *data, u8 nr)
168 int iobase = data->address[LD_FAN];
170 outb(BANK_FM(nr), iobase + PC87427_REG_BANK);
171 data->fan[nr] = inw(iobase + PC87427_REG_FAN);
172 data->fan_min[nr] = inw(iobase + PC87427_REG_FAN_MIN);
173 data->fan_status[nr] = inb(iobase + PC87427_REG_FAN_STATUS);
174 /* Clear fan alarm bits */
175 outb(data->fan_status[nr], iobase + PC87427_REG_FAN_STATUS);
178 /* The 2 LSB of fan speed registers are used for something different.
179 The actual 2 LSB of the measurements are not available. */
180 static inline unsigned long fan_from_reg(u16 reg)
183 if (reg == 0x0000 || reg == 0xfffc)
185 return 5400000UL / reg;
188 /* The 2 LSB of the fan speed limit registers are not significant. */
189 static inline u16 fan_to_reg(unsigned long val)
193 if (val >= 1350000UL)
195 return ((1350000UL + val / 2) / val) << 2;
199 * PWM registers and conversions
202 #define PC87427_REG_PWM_ENABLE 0x10
203 #define PC87427_REG_PWM_DUTY 0x12
205 #define PWM_ENABLE_MODE_MASK (7 << 4)
206 #define PWM_ENABLE_CTLEN (1 << 0)
208 #define PWM_MODE_MANUAL (0 << 4)
209 #define PWM_MODE_AUTO (1 << 4)
210 #define PWM_MODE_OFF (2 << 4)
211 #define PWM_MODE_ON (7 << 4)
213 /* Dedicated function to read all registers related to a given PWM output.
214 This saves us quite a few locks and bank selections.
215 Must be called with data->lock held.
217 static void pc87427_readall_pwm(struct pc87427_data *data, u8 nr)
219 int iobase = data->address[LD_FAN];
221 outb(BANK_FC(nr), iobase + PC87427_REG_BANK);
222 data->pwm_enable[nr] = inb(iobase + PC87427_REG_PWM_ENABLE);
223 data->pwm[nr] = inb(iobase + PC87427_REG_PWM_DUTY);
226 static inline int pwm_enable_from_reg(u8 reg)
228 switch (reg & PWM_ENABLE_MODE_MASK) {
231 case PWM_MODE_MANUAL:
241 static inline u8 pwm_enable_to_reg(unsigned long val, u8 pwmval)
247 return pwmval ? PWM_MODE_MANUAL : PWM_MODE_OFF;
249 return PWM_MODE_AUTO;
257 static struct pc87427_data *pc87427_update_device(struct device *dev)
259 struct pc87427_data *data = dev_get_drvdata(dev);
262 mutex_lock(&data->lock);
263 if (!time_after(jiffies, data->last_updated + HZ)
264 && data->last_updated)
268 for (i = 0; i < 8; i++) {
269 if (!(data->fan_enabled & (1 << i)))
271 pc87427_readall_fan(data, i);
275 for (i = 0; i < 4; i++) {
276 if (!(data->pwm_enabled & (1 << i)))
278 pc87427_readall_pwm(data, i);
281 data->last_updated = jiffies;
284 mutex_unlock(&data->lock);
288 static ssize_t show_fan_input(struct device *dev, struct device_attribute
291 struct pc87427_data *data = pc87427_update_device(dev);
292 int nr = to_sensor_dev_attr(devattr)->index;
294 return sprintf(buf, "%lu\n", fan_from_reg(data->fan[nr]));
297 static ssize_t show_fan_min(struct device *dev, struct device_attribute
300 struct pc87427_data *data = pc87427_update_device(dev);
301 int nr = to_sensor_dev_attr(devattr)->index;
303 return sprintf(buf, "%lu\n", fan_from_reg(data->fan_min[nr]));
306 static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
309 struct pc87427_data *data = pc87427_update_device(dev);
310 int nr = to_sensor_dev_attr(devattr)->index;
312 return sprintf(buf, "%d\n", !!(data->fan_status[nr]
313 & FAN_STATUS_LOSPD));
316 static ssize_t show_fan_fault(struct device *dev, struct device_attribute
319 struct pc87427_data *data = pc87427_update_device(dev);
320 int nr = to_sensor_dev_attr(devattr)->index;
322 return sprintf(buf, "%d\n", !!(data->fan_status[nr]
323 & FAN_STATUS_STALL));
326 static ssize_t set_fan_min(struct device *dev, struct device_attribute
327 *devattr, const char *buf, size_t count)
329 struct pc87427_data *data = dev_get_drvdata(dev);
330 int nr = to_sensor_dev_attr(devattr)->index;
332 int iobase = data->address[LD_FAN];
334 if (strict_strtoul(buf, 10, &val) < 0)
337 mutex_lock(&data->lock);
338 outb(BANK_FM(nr), iobase + PC87427_REG_BANK);
339 /* The low speed limit registers are read-only while monitoring
340 is enabled, so we have to disable monitoring, then change the
341 limit, and finally enable monitoring again. */
342 outb(0, iobase + PC87427_REG_FAN_STATUS);
343 data->fan_min[nr] = fan_to_reg(val);
344 outw(data->fan_min[nr], iobase + PC87427_REG_FAN_MIN);
345 outb(FAN_STATUS_MONEN, iobase + PC87427_REG_FAN_STATUS);
346 mutex_unlock(&data->lock);
351 static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan_input, NULL, 0);
352 static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan_input, NULL, 1);
353 static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan_input, NULL, 2);
354 static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_fan_input, NULL, 3);
355 static SENSOR_DEVICE_ATTR(fan5_input, S_IRUGO, show_fan_input, NULL, 4);
356 static SENSOR_DEVICE_ATTR(fan6_input, S_IRUGO, show_fan_input, NULL, 5);
357 static SENSOR_DEVICE_ATTR(fan7_input, S_IRUGO, show_fan_input, NULL, 6);
358 static SENSOR_DEVICE_ATTR(fan8_input, S_IRUGO, show_fan_input, NULL, 7);
360 static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO,
361 show_fan_min, set_fan_min, 0);
362 static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO,
363 show_fan_min, set_fan_min, 1);
364 static SENSOR_DEVICE_ATTR(fan3_min, S_IWUSR | S_IRUGO,
365 show_fan_min, set_fan_min, 2);
366 static SENSOR_DEVICE_ATTR(fan4_min, S_IWUSR | S_IRUGO,
367 show_fan_min, set_fan_min, 3);
368 static SENSOR_DEVICE_ATTR(fan5_min, S_IWUSR | S_IRUGO,
369 show_fan_min, set_fan_min, 4);
370 static SENSOR_DEVICE_ATTR(fan6_min, S_IWUSR | S_IRUGO,
371 show_fan_min, set_fan_min, 5);
372 static SENSOR_DEVICE_ATTR(fan7_min, S_IWUSR | S_IRUGO,
373 show_fan_min, set_fan_min, 6);
374 static SENSOR_DEVICE_ATTR(fan8_min, S_IWUSR | S_IRUGO,
375 show_fan_min, set_fan_min, 7);
377 static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_fan_alarm, NULL, 0);
378 static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_fan_alarm, NULL, 1);
379 static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 2);
380 static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 3);
381 static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO, show_fan_alarm, NULL, 4);
382 static SENSOR_DEVICE_ATTR(fan6_alarm, S_IRUGO, show_fan_alarm, NULL, 5);
383 static SENSOR_DEVICE_ATTR(fan7_alarm, S_IRUGO, show_fan_alarm, NULL, 6);
384 static SENSOR_DEVICE_ATTR(fan8_alarm, S_IRUGO, show_fan_alarm, NULL, 7);
386 static SENSOR_DEVICE_ATTR(fan1_fault, S_IRUGO, show_fan_fault, NULL, 0);
387 static SENSOR_DEVICE_ATTR(fan2_fault, S_IRUGO, show_fan_fault, NULL, 1);
388 static SENSOR_DEVICE_ATTR(fan3_fault, S_IRUGO, show_fan_fault, NULL, 2);
389 static SENSOR_DEVICE_ATTR(fan4_fault, S_IRUGO, show_fan_fault, NULL, 3);
390 static SENSOR_DEVICE_ATTR(fan5_fault, S_IRUGO, show_fan_fault, NULL, 4);
391 static SENSOR_DEVICE_ATTR(fan6_fault, S_IRUGO, show_fan_fault, NULL, 5);
392 static SENSOR_DEVICE_ATTR(fan7_fault, S_IRUGO, show_fan_fault, NULL, 6);
393 static SENSOR_DEVICE_ATTR(fan8_fault, S_IRUGO, show_fan_fault, NULL, 7);
395 static struct attribute *pc87427_attributes_fan[8][5] = {
397 &sensor_dev_attr_fan1_input.dev_attr.attr,
398 &sensor_dev_attr_fan1_min.dev_attr.attr,
399 &sensor_dev_attr_fan1_alarm.dev_attr.attr,
400 &sensor_dev_attr_fan1_fault.dev_attr.attr,
403 &sensor_dev_attr_fan2_input.dev_attr.attr,
404 &sensor_dev_attr_fan2_min.dev_attr.attr,
405 &sensor_dev_attr_fan2_alarm.dev_attr.attr,
406 &sensor_dev_attr_fan2_fault.dev_attr.attr,
409 &sensor_dev_attr_fan3_input.dev_attr.attr,
410 &sensor_dev_attr_fan3_min.dev_attr.attr,
411 &sensor_dev_attr_fan3_alarm.dev_attr.attr,
412 &sensor_dev_attr_fan3_fault.dev_attr.attr,
415 &sensor_dev_attr_fan4_input.dev_attr.attr,
416 &sensor_dev_attr_fan4_min.dev_attr.attr,
417 &sensor_dev_attr_fan4_alarm.dev_attr.attr,
418 &sensor_dev_attr_fan4_fault.dev_attr.attr,
421 &sensor_dev_attr_fan5_input.dev_attr.attr,
422 &sensor_dev_attr_fan5_min.dev_attr.attr,
423 &sensor_dev_attr_fan5_alarm.dev_attr.attr,
424 &sensor_dev_attr_fan5_fault.dev_attr.attr,
427 &sensor_dev_attr_fan6_input.dev_attr.attr,
428 &sensor_dev_attr_fan6_min.dev_attr.attr,
429 &sensor_dev_attr_fan6_alarm.dev_attr.attr,
430 &sensor_dev_attr_fan6_fault.dev_attr.attr,
433 &sensor_dev_attr_fan7_input.dev_attr.attr,
434 &sensor_dev_attr_fan7_min.dev_attr.attr,
435 &sensor_dev_attr_fan7_alarm.dev_attr.attr,
436 &sensor_dev_attr_fan7_fault.dev_attr.attr,
439 &sensor_dev_attr_fan8_input.dev_attr.attr,
440 &sensor_dev_attr_fan8_min.dev_attr.attr,
441 &sensor_dev_attr_fan8_alarm.dev_attr.attr,
442 &sensor_dev_attr_fan8_fault.dev_attr.attr,
447 static const struct attribute_group pc87427_group_fan[8] = {
448 { .attrs = pc87427_attributes_fan[0] },
449 { .attrs = pc87427_attributes_fan[1] },
450 { .attrs = pc87427_attributes_fan[2] },
451 { .attrs = pc87427_attributes_fan[3] },
452 { .attrs = pc87427_attributes_fan[4] },
453 { .attrs = pc87427_attributes_fan[5] },
454 { .attrs = pc87427_attributes_fan[6] },
455 { .attrs = pc87427_attributes_fan[7] },
458 /* Must be called with data->lock held and pc87427_readall_pwm() freshly
460 static void update_pwm_enable(struct pc87427_data *data, int nr, u8 mode)
462 int iobase = data->address[LD_FAN];
463 data->pwm_enable[nr] &= ~PWM_ENABLE_MODE_MASK;
464 data->pwm_enable[nr] |= mode;
465 outb(data->pwm_enable[nr], iobase + PC87427_REG_PWM_ENABLE);
468 static ssize_t show_pwm_enable(struct device *dev, struct device_attribute
471 struct pc87427_data *data = pc87427_update_device(dev);
472 int nr = to_sensor_dev_attr(devattr)->index;
475 pwm_enable = pwm_enable_from_reg(data->pwm_enable[nr]);
478 return sprintf(buf, "%d\n", pwm_enable);
481 static ssize_t set_pwm_enable(struct device *dev, struct device_attribute
482 *devattr, const char *buf, size_t count)
484 struct pc87427_data *data = dev_get_drvdata(dev);
485 int nr = to_sensor_dev_attr(devattr)->index;
488 if (strict_strtoul(buf, 10, &val) < 0 || val > 2)
490 /* Can't go to automatic mode if it isn't configured */
491 if (val == 2 && !(data->pwm_auto_ok & (1 << nr)))
494 mutex_lock(&data->lock);
495 pc87427_readall_pwm(data, nr);
496 update_pwm_enable(data, nr, pwm_enable_to_reg(val, data->pwm[nr]));
497 mutex_unlock(&data->lock);
502 static ssize_t show_pwm(struct device *dev, struct device_attribute
505 struct pc87427_data *data = pc87427_update_device(dev);
506 int nr = to_sensor_dev_attr(devattr)->index;
508 return sprintf(buf, "%d\n", (int)data->pwm[nr]);
511 static ssize_t set_pwm(struct device *dev, struct device_attribute
512 *devattr, const char *buf, size_t count)
514 struct pc87427_data *data = dev_get_drvdata(dev);
515 int nr = to_sensor_dev_attr(devattr)->index;
517 int iobase = data->address[LD_FAN];
520 if (strict_strtoul(buf, 10, &val) < 0 || val > 0xff)
523 mutex_lock(&data->lock);
524 pc87427_readall_pwm(data, nr);
525 mode = data->pwm_enable[nr] & PWM_ENABLE_MODE_MASK;
526 if (mode != PWM_MODE_MANUAL && mode != PWM_MODE_OFF) {
527 dev_notice(dev, "Can't set PWM%d duty cycle while not in "
528 "manual mode\n", nr + 1);
529 mutex_unlock(&data->lock);
533 /* We may have to change the mode */
534 if (mode == PWM_MODE_MANUAL && val == 0) {
535 /* Transition from Manual to Off */
536 update_pwm_enable(data, nr, PWM_MODE_OFF);
538 dev_dbg(dev, "Switching PWM%d from %s to %s\n", nr + 1,
540 } else if (mode == PWM_MODE_OFF && val != 0) {
541 /* Transition from Off to Manual */
542 update_pwm_enable(data, nr, PWM_MODE_MANUAL);
543 mode = PWM_MODE_MANUAL;
544 dev_dbg(dev, "Switching PWM%d from %s to %s\n", nr + 1,
549 if (mode == PWM_MODE_MANUAL)
550 outb(val, iobase + PC87427_REG_PWM_DUTY);
551 mutex_unlock(&data->lock);
556 static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO,
557 show_pwm_enable, set_pwm_enable, 0);
558 static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO,
559 show_pwm_enable, set_pwm_enable, 1);
560 static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO,
561 show_pwm_enable, set_pwm_enable, 2);
562 static SENSOR_DEVICE_ATTR(pwm4_enable, S_IWUSR | S_IRUGO,
563 show_pwm_enable, set_pwm_enable, 3);
565 static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 0);
566 static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 1);
567 static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 2);
568 static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 3);
570 static struct attribute *pc87427_attributes_pwm[4][3] = {
572 &sensor_dev_attr_pwm1_enable.dev_attr.attr,
573 &sensor_dev_attr_pwm1.dev_attr.attr,
576 &sensor_dev_attr_pwm2_enable.dev_attr.attr,
577 &sensor_dev_attr_pwm2.dev_attr.attr,
580 &sensor_dev_attr_pwm3_enable.dev_attr.attr,
581 &sensor_dev_attr_pwm3.dev_attr.attr,
584 &sensor_dev_attr_pwm4_enable.dev_attr.attr,
585 &sensor_dev_attr_pwm4.dev_attr.attr,
590 static const struct attribute_group pc87427_group_pwm[4] = {
591 { .attrs = pc87427_attributes_pwm[0] },
592 { .attrs = pc87427_attributes_pwm[1] },
593 { .attrs = pc87427_attributes_pwm[2] },
594 { .attrs = pc87427_attributes_pwm[3] },
597 static ssize_t show_name(struct device *dev, struct device_attribute
600 struct pc87427_data *data = dev_get_drvdata(dev);
602 return sprintf(buf, "%s\n", data->name);
604 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
608 * Device detection, attach and detach
611 static void __devinit pc87427_init_device(struct device *dev)
613 struct pc87427_sio_data *sio_data = dev->platform_data;
614 struct pc87427_data *data = dev_get_drvdata(dev);
618 /* The FMC module should be ready */
619 reg = pc87427_read8(data, LD_FAN, PC87427_REG_BANK);
621 dev_warn(dev, "FMC module not ready!\n");
623 /* Check which fans are enabled */
624 for (i = 0; i < 8; i++) {
625 if (!(sio_data->has_fanin & (1 << i))) /* Not wired */
627 reg = pc87427_read8_bank(data, LD_FAN, BANK_FM(i),
628 PC87427_REG_FAN_STATUS);
629 if (reg & FAN_STATUS_MONEN)
630 data->fan_enabled |= (1 << i);
633 if (!data->fan_enabled) {
634 dev_dbg(dev, "Enabling monitoring of all fans\n");
635 for (i = 0; i < 8; i++) {
636 if (!(sio_data->has_fanin & (1 << i))) /* Not wired */
638 pc87427_write8_bank(data, LD_FAN, BANK_FM(i),
639 PC87427_REG_FAN_STATUS,
642 data->fan_enabled = sio_data->has_fanin;
645 /* Check which PWM outputs are enabled */
646 for (i = 0; i < 4; i++) {
647 if (!(sio_data->has_fanout & (1 << i))) /* Not wired */
649 reg = pc87427_read8_bank(data, LD_FAN, BANK_FC(i),
650 PC87427_REG_PWM_ENABLE);
651 if (reg & PWM_ENABLE_CTLEN)
652 data->pwm_enabled |= (1 << i);
654 /* We don't expose an interface to reconfigure the automatic
655 fan control mode, so only allow to return to this mode if
656 it was originally set. */
657 if ((reg & PWM_ENABLE_MODE_MASK) == PWM_MODE_AUTO) {
658 dev_dbg(dev, "PWM%d is in automatic control mode\n",
660 data->pwm_auto_ok |= (1 << i);
665 static int __devinit pc87427_probe(struct platform_device *pdev)
667 struct pc87427_data *data;
668 struct resource *res;
671 data = kzalloc(sizeof(struct pc87427_data), GFP_KERNEL);
674 printk(KERN_ERR DRVNAME ": Out of memory\n");
678 /* This will need to be revisited when we add support for
679 temperature and voltage monitoring. */
680 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
681 if (!request_region(res->start, resource_size(res), DRVNAME)) {
683 dev_err(&pdev->dev, "Failed to request region 0x%lx-0x%lx\n",
684 (unsigned long)res->start, (unsigned long)res->end);
687 data->address[0] = res->start;
689 mutex_init(&data->lock);
690 data->name = "pc87427";
691 platform_set_drvdata(pdev, data);
692 pc87427_init_device(&pdev->dev);
694 /* Register sysfs hooks */
695 err = device_create_file(&pdev->dev, &dev_attr_name);
697 goto exit_release_region;
698 for (i = 0; i < 8; i++) {
699 if (!(data->fan_enabled & (1 << i)))
701 err = sysfs_create_group(&pdev->dev.kobj,
702 &pc87427_group_fan[i]);
704 goto exit_remove_files;
706 for (i = 0; i < 4; i++) {
707 if (!(data->pwm_enabled & (1 << i)))
709 err = sysfs_create_group(&pdev->dev.kobj,
710 &pc87427_group_pwm[i]);
712 goto exit_remove_files;
715 data->hwmon_dev = hwmon_device_register(&pdev->dev);
716 if (IS_ERR(data->hwmon_dev)) {
717 err = PTR_ERR(data->hwmon_dev);
718 dev_err(&pdev->dev, "Class registration failed (%d)\n", err);
719 goto exit_remove_files;
725 for (i = 0; i < 8; i++) {
726 if (!(data->fan_enabled & (1 << i)))
728 sysfs_remove_group(&pdev->dev.kobj, &pc87427_group_fan[i]);
730 for (i = 0; i < 4; i++) {
731 if (!(data->pwm_enabled & (1 << i)))
733 sysfs_remove_group(&pdev->dev.kobj, &pc87427_group_pwm[i]);
736 release_region(res->start, resource_size(res));
738 platform_set_drvdata(pdev, NULL);
744 static int __devexit pc87427_remove(struct platform_device *pdev)
746 struct pc87427_data *data = platform_get_drvdata(pdev);
747 struct resource *res;
750 hwmon_device_unregister(data->hwmon_dev);
751 device_remove_file(&pdev->dev, &dev_attr_name);
752 for (i = 0; i < 8; i++) {
753 if (!(data->fan_enabled & (1 << i)))
755 sysfs_remove_group(&pdev->dev.kobj, &pc87427_group_fan[i]);
757 for (i = 0; i < 4; i++) {
758 if (!(data->pwm_enabled & (1 << i)))
760 sysfs_remove_group(&pdev->dev.kobj, &pc87427_group_pwm[i]);
762 platform_set_drvdata(pdev, NULL);
765 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
766 release_region(res->start, resource_size(res));
772 static struct platform_driver pc87427_driver = {
774 .owner = THIS_MODULE,
777 .probe = pc87427_probe,
778 .remove = __devexit_p(pc87427_remove),
781 static int __init pc87427_device_add(unsigned short address,
782 const struct pc87427_sio_data *sio_data)
784 struct resource res = {
786 .end = address + REGION_LENGTH - 1,
787 .name = logdev_str[0],
788 .flags = IORESOURCE_IO,
792 err = acpi_check_resource_conflict(&res);
796 pdev = platform_device_alloc(DRVNAME, address);
799 printk(KERN_ERR DRVNAME ": Device allocation failed\n");
803 err = platform_device_add_resources(pdev, &res, 1);
805 printk(KERN_ERR DRVNAME ": Device resource addition failed "
807 goto exit_device_put;
810 err = platform_device_add_data(pdev, sio_data,
811 sizeof(struct pc87427_sio_data));
813 printk(KERN_ERR DRVNAME ": Platform data allocation failed\n");
814 goto exit_device_put;
817 err = platform_device_add(pdev);
819 printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n",
821 goto exit_device_put;
827 platform_device_put(pdev);
832 static int __init pc87427_find(int sioaddr, unsigned short *address,
833 struct pc87427_sio_data *sio_data)
839 /* Identify device */
840 val = force_id ? force_id : superio_inb(sioaddr, SIOREG_DEVID);
841 if (val != 0xf2) { /* PC87427 */
846 for (i = 0; i < 2; i++) {
848 /* Select logical device */
849 superio_outb(sioaddr, SIOREG_LDSEL, logdev[i]);
851 val = superio_inb(sioaddr, SIOREG_ACT);
853 printk(KERN_INFO DRVNAME ": Logical device 0x%02x "
854 "not activated\n", logdev[i]);
858 val = superio_inb(sioaddr, SIOREG_MAP);
860 printk(KERN_WARNING DRVNAME ": Logical device 0x%02x "
861 "is memory-mapped, can't use\n", logdev[i]);
865 val = (superio_inb(sioaddr, SIOREG_IOBASE) << 8)
866 | superio_inb(sioaddr, SIOREG_IOBASE + 1);
868 printk(KERN_INFO DRVNAME ": I/O base address not set "
869 "for logical device 0x%02x\n", logdev[i]);
875 /* Check which fan inputs are wired */
876 sio_data->has_fanin = (1 << 2) | (1 << 3); /* FANIN2, FANIN3 */
878 cfg = superio_inb(sioaddr, SIOREG_CF2);
879 if (!(cfg & (1 << 3)))
880 sio_data->has_fanin |= (1 << 0); /* FANIN0 */
881 if (!(cfg & (1 << 2)))
882 sio_data->has_fanin |= (1 << 4); /* FANIN4 */
884 cfg = superio_inb(sioaddr, SIOREG_CFD);
885 if (!(cfg & (1 << 0)))
886 sio_data->has_fanin |= (1 << 1); /* FANIN1 */
888 cfg = superio_inb(sioaddr, SIOREG_CF4);
889 if (!(cfg & (1 << 0)))
890 sio_data->has_fanin |= (1 << 7); /* FANIN7 */
891 cfg_b = superio_inb(sioaddr, SIOREG_CFB);
892 if (!(cfg & (1 << 1)) && (cfg_b & (1 << 3)))
893 sio_data->has_fanin |= (1 << 5); /* FANIN5 */
894 cfg = superio_inb(sioaddr, SIOREG_CF3);
895 if ((cfg & (1 << 3)) && !(cfg_b & (1 << 5)))
896 sio_data->has_fanin |= (1 << 6); /* FANIN6 */
898 /* Check which fan outputs are wired */
899 sio_data->has_fanout = (1 << 0); /* FANOUT0 */
900 if (cfg_b & (1 << 0))
901 sio_data->has_fanout |= (1 << 3); /* FANOUT3 */
903 cfg = superio_inb(sioaddr, SIOREG_CFC);
904 if (!(cfg & (1 << 4))) {
905 if (cfg_b & (1 << 1))
906 sio_data->has_fanout |= (1 << 1); /* FANOUT1 */
907 if (cfg_b & (1 << 2))
908 sio_data->has_fanout |= (1 << 2); /* FANOUT2 */
911 /* FANOUT1 and FANOUT2 can each be routed to 2 different pins */
912 cfg = superio_inb(sioaddr, SIOREG_CF5);
914 sio_data->has_fanout |= (1 << 1); /* FANOUT1 */
916 sio_data->has_fanout |= (1 << 2); /* FANOUT2 */
919 superio_exit(sioaddr);
923 static int __init pc87427_init(void)
926 unsigned short address[2];
927 struct pc87427_sio_data sio_data;
929 if (pc87427_find(0x2e, address, &sio_data)
930 && pc87427_find(0x4e, address, &sio_data))
933 /* For now the driver only handles fans so we only care about the
938 err = platform_driver_register(&pc87427_driver);
942 /* Sets global pdev as a side effect */
943 err = pc87427_device_add(address[0], &sio_data);
950 platform_driver_unregister(&pc87427_driver);
955 static void __exit pc87427_exit(void)
957 platform_device_unregister(pdev);
958 platform_driver_unregister(&pc87427_driver);
961 MODULE_AUTHOR("Jean Delvare <khali@linux-fr.org>");
962 MODULE_DESCRIPTION("PC87427 hardware monitoring driver");
963 MODULE_LICENSE("GPL");
965 module_init(pc87427_init);
966 module_exit(pc87427_exit);