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 {
68 unsigned short address[2];
74 * Super-I/O registers and operations
77 #define SIOREG_LDSEL 0x07 /* Logical device select */
78 #define SIOREG_DEVID 0x20 /* Device ID */
79 #define SIOREG_CF2 0x22 /* Configuration 2 */
80 #define SIOREG_CF3 0x23 /* Configuration 3 */
81 #define SIOREG_CF4 0x24 /* Configuration 4 */
82 #define SIOREG_CF5 0x25 /* Configuration 5 */
83 #define SIOREG_CFB 0x2B /* Configuration B */
84 #define SIOREG_CFC 0x2C /* Configuration C */
85 #define SIOREG_CFD 0x2D /* Configuration D */
86 #define SIOREG_ACT 0x30 /* Device activation */
87 #define SIOREG_MAP 0x50 /* I/O or memory mapping */
88 #define SIOREG_IOBASE 0x60 /* I/O base address */
90 static const u8 logdev[2] = { 0x09, 0x14 };
91 static const char *logdev_str[2] = { DRVNAME " FMC", DRVNAME " HMC" };
96 static inline void superio_outb(int sioaddr, int reg, int val)
99 outb(val, sioaddr + 1);
102 static inline int superio_inb(int sioaddr, int reg)
105 return inb(sioaddr + 1);
108 static inline void superio_exit(int sioaddr)
111 outb(0x02, sioaddr + 1);
118 #define REGION_LENGTH 32
119 #define PC87427_REG_BANK 0x0f
120 #define BANK_FM(nr) (nr)
121 #define BANK_FT(nr) (0x08 + (nr))
122 #define BANK_FC(nr) (0x10 + (nr) * 2)
125 * I/O access functions
128 /* ldi is the logical device index */
129 static inline int pc87427_read8(struct pc87427_data *data, u8 ldi, u8 reg)
131 return inb(data->address[ldi] + reg);
134 /* Must be called with data->lock held, except during init */
135 static inline int pc87427_read8_bank(struct pc87427_data *data, u8 ldi,
138 outb(bank, data->address[ldi] + PC87427_REG_BANK);
139 return inb(data->address[ldi] + reg);
142 /* Must be called with data->lock held, except during init */
143 static inline void pc87427_write8_bank(struct pc87427_data *data, u8 ldi,
144 u8 bank, u8 reg, u8 value)
146 outb(bank, data->address[ldi] + PC87427_REG_BANK);
147 outb(value, data->address[ldi] + reg);
151 * Fan registers and conversions
154 /* fan data registers are 16-bit wide */
155 #define PC87427_REG_FAN 0x12
156 #define PC87427_REG_FAN_MIN 0x14
157 #define PC87427_REG_FAN_STATUS 0x10
159 #define FAN_STATUS_STALL (1 << 3)
160 #define FAN_STATUS_LOSPD (1 << 1)
161 #define FAN_STATUS_MONEN (1 << 0)
163 /* Dedicated function to read all registers related to a given fan input.
164 This saves us quite a few locks and bank selections.
165 Must be called with data->lock held.
167 static void pc87427_readall_fan(struct pc87427_data *data, u8 nr)
169 int iobase = data->address[LD_FAN];
171 outb(BANK_FM(nr), iobase + PC87427_REG_BANK);
172 data->fan[nr] = inw(iobase + PC87427_REG_FAN);
173 data->fan_min[nr] = inw(iobase + PC87427_REG_FAN_MIN);
174 data->fan_status[nr] = inb(iobase + PC87427_REG_FAN_STATUS);
175 /* Clear fan alarm bits */
176 outb(data->fan_status[nr], iobase + PC87427_REG_FAN_STATUS);
179 /* The 2 LSB of fan speed registers are used for something different.
180 The actual 2 LSB of the measurements are not available. */
181 static inline unsigned long fan_from_reg(u16 reg)
184 if (reg == 0x0000 || reg == 0xfffc)
186 return 5400000UL / reg;
189 /* The 2 LSB of the fan speed limit registers are not significant. */
190 static inline u16 fan_to_reg(unsigned long val)
194 if (val >= 1350000UL)
196 return ((1350000UL + val / 2) / val) << 2;
200 * PWM registers and conversions
203 #define PC87427_REG_PWM_ENABLE 0x10
204 #define PC87427_REG_PWM_DUTY 0x12
206 #define PWM_ENABLE_MODE_MASK (7 << 4)
207 #define PWM_ENABLE_CTLEN (1 << 0)
209 #define PWM_MODE_MANUAL (0 << 4)
210 #define PWM_MODE_AUTO (1 << 4)
211 #define PWM_MODE_OFF (2 << 4)
212 #define PWM_MODE_ON (7 << 4)
214 /* Dedicated function to read all registers related to a given PWM output.
215 This saves us quite a few locks and bank selections.
216 Must be called with data->lock held.
218 static void pc87427_readall_pwm(struct pc87427_data *data, u8 nr)
220 int iobase = data->address[LD_FAN];
222 outb(BANK_FC(nr), iobase + PC87427_REG_BANK);
223 data->pwm_enable[nr] = inb(iobase + PC87427_REG_PWM_ENABLE);
224 data->pwm[nr] = inb(iobase + PC87427_REG_PWM_DUTY);
227 static inline int pwm_enable_from_reg(u8 reg)
229 switch (reg & PWM_ENABLE_MODE_MASK) {
232 case PWM_MODE_MANUAL:
242 static inline u8 pwm_enable_to_reg(unsigned long val, u8 pwmval)
248 return pwmval ? PWM_MODE_MANUAL : PWM_MODE_OFF;
250 return PWM_MODE_AUTO;
258 static struct pc87427_data *pc87427_update_device(struct device *dev)
260 struct pc87427_data *data = dev_get_drvdata(dev);
263 mutex_lock(&data->lock);
264 if (!time_after(jiffies, data->last_updated + HZ)
265 && data->last_updated)
269 for (i = 0; i < 8; i++) {
270 if (!(data->fan_enabled & (1 << i)))
272 pc87427_readall_fan(data, i);
276 for (i = 0; i < 4; i++) {
277 if (!(data->pwm_enabled & (1 << i)))
279 pc87427_readall_pwm(data, i);
282 data->last_updated = jiffies;
285 mutex_unlock(&data->lock);
289 static ssize_t show_fan_input(struct device *dev, struct device_attribute
292 struct pc87427_data *data = pc87427_update_device(dev);
293 int nr = to_sensor_dev_attr(devattr)->index;
295 return sprintf(buf, "%lu\n", fan_from_reg(data->fan[nr]));
298 static ssize_t show_fan_min(struct device *dev, struct device_attribute
301 struct pc87427_data *data = pc87427_update_device(dev);
302 int nr = to_sensor_dev_attr(devattr)->index;
304 return sprintf(buf, "%lu\n", fan_from_reg(data->fan_min[nr]));
307 static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
310 struct pc87427_data *data = pc87427_update_device(dev);
311 int nr = to_sensor_dev_attr(devattr)->index;
313 return sprintf(buf, "%d\n", !!(data->fan_status[nr]
314 & FAN_STATUS_LOSPD));
317 static ssize_t show_fan_fault(struct device *dev, struct device_attribute
320 struct pc87427_data *data = pc87427_update_device(dev);
321 int nr = to_sensor_dev_attr(devattr)->index;
323 return sprintf(buf, "%d\n", !!(data->fan_status[nr]
324 & FAN_STATUS_STALL));
327 static ssize_t set_fan_min(struct device *dev, struct device_attribute
328 *devattr, const char *buf, size_t count)
330 struct pc87427_data *data = dev_get_drvdata(dev);
331 int nr = to_sensor_dev_attr(devattr)->index;
333 int iobase = data->address[LD_FAN];
335 if (strict_strtoul(buf, 10, &val) < 0)
338 mutex_lock(&data->lock);
339 outb(BANK_FM(nr), iobase + PC87427_REG_BANK);
340 /* The low speed limit registers are read-only while monitoring
341 is enabled, so we have to disable monitoring, then change the
342 limit, and finally enable monitoring again. */
343 outb(0, iobase + PC87427_REG_FAN_STATUS);
344 data->fan_min[nr] = fan_to_reg(val);
345 outw(data->fan_min[nr], iobase + PC87427_REG_FAN_MIN);
346 outb(FAN_STATUS_MONEN, iobase + PC87427_REG_FAN_STATUS);
347 mutex_unlock(&data->lock);
352 static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan_input, NULL, 0);
353 static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan_input, NULL, 1);
354 static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan_input, NULL, 2);
355 static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_fan_input, NULL, 3);
356 static SENSOR_DEVICE_ATTR(fan5_input, S_IRUGO, show_fan_input, NULL, 4);
357 static SENSOR_DEVICE_ATTR(fan6_input, S_IRUGO, show_fan_input, NULL, 5);
358 static SENSOR_DEVICE_ATTR(fan7_input, S_IRUGO, show_fan_input, NULL, 6);
359 static SENSOR_DEVICE_ATTR(fan8_input, S_IRUGO, show_fan_input, NULL, 7);
361 static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO,
362 show_fan_min, set_fan_min, 0);
363 static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO,
364 show_fan_min, set_fan_min, 1);
365 static SENSOR_DEVICE_ATTR(fan3_min, S_IWUSR | S_IRUGO,
366 show_fan_min, set_fan_min, 2);
367 static SENSOR_DEVICE_ATTR(fan4_min, S_IWUSR | S_IRUGO,
368 show_fan_min, set_fan_min, 3);
369 static SENSOR_DEVICE_ATTR(fan5_min, S_IWUSR | S_IRUGO,
370 show_fan_min, set_fan_min, 4);
371 static SENSOR_DEVICE_ATTR(fan6_min, S_IWUSR | S_IRUGO,
372 show_fan_min, set_fan_min, 5);
373 static SENSOR_DEVICE_ATTR(fan7_min, S_IWUSR | S_IRUGO,
374 show_fan_min, set_fan_min, 6);
375 static SENSOR_DEVICE_ATTR(fan8_min, S_IWUSR | S_IRUGO,
376 show_fan_min, set_fan_min, 7);
378 static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_fan_alarm, NULL, 0);
379 static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_fan_alarm, NULL, 1);
380 static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 2);
381 static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 3);
382 static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO, show_fan_alarm, NULL, 4);
383 static SENSOR_DEVICE_ATTR(fan6_alarm, S_IRUGO, show_fan_alarm, NULL, 5);
384 static SENSOR_DEVICE_ATTR(fan7_alarm, S_IRUGO, show_fan_alarm, NULL, 6);
385 static SENSOR_DEVICE_ATTR(fan8_alarm, S_IRUGO, show_fan_alarm, NULL, 7);
387 static SENSOR_DEVICE_ATTR(fan1_fault, S_IRUGO, show_fan_fault, NULL, 0);
388 static SENSOR_DEVICE_ATTR(fan2_fault, S_IRUGO, show_fan_fault, NULL, 1);
389 static SENSOR_DEVICE_ATTR(fan3_fault, S_IRUGO, show_fan_fault, NULL, 2);
390 static SENSOR_DEVICE_ATTR(fan4_fault, S_IRUGO, show_fan_fault, NULL, 3);
391 static SENSOR_DEVICE_ATTR(fan5_fault, S_IRUGO, show_fan_fault, NULL, 4);
392 static SENSOR_DEVICE_ATTR(fan6_fault, S_IRUGO, show_fan_fault, NULL, 5);
393 static SENSOR_DEVICE_ATTR(fan7_fault, S_IRUGO, show_fan_fault, NULL, 6);
394 static SENSOR_DEVICE_ATTR(fan8_fault, S_IRUGO, show_fan_fault, NULL, 7);
396 static struct attribute *pc87427_attributes_fan[8][5] = {
398 &sensor_dev_attr_fan1_input.dev_attr.attr,
399 &sensor_dev_attr_fan1_min.dev_attr.attr,
400 &sensor_dev_attr_fan1_alarm.dev_attr.attr,
401 &sensor_dev_attr_fan1_fault.dev_attr.attr,
404 &sensor_dev_attr_fan2_input.dev_attr.attr,
405 &sensor_dev_attr_fan2_min.dev_attr.attr,
406 &sensor_dev_attr_fan2_alarm.dev_attr.attr,
407 &sensor_dev_attr_fan2_fault.dev_attr.attr,
410 &sensor_dev_attr_fan3_input.dev_attr.attr,
411 &sensor_dev_attr_fan3_min.dev_attr.attr,
412 &sensor_dev_attr_fan3_alarm.dev_attr.attr,
413 &sensor_dev_attr_fan3_fault.dev_attr.attr,
416 &sensor_dev_attr_fan4_input.dev_attr.attr,
417 &sensor_dev_attr_fan4_min.dev_attr.attr,
418 &sensor_dev_attr_fan4_alarm.dev_attr.attr,
419 &sensor_dev_attr_fan4_fault.dev_attr.attr,
422 &sensor_dev_attr_fan5_input.dev_attr.attr,
423 &sensor_dev_attr_fan5_min.dev_attr.attr,
424 &sensor_dev_attr_fan5_alarm.dev_attr.attr,
425 &sensor_dev_attr_fan5_fault.dev_attr.attr,
428 &sensor_dev_attr_fan6_input.dev_attr.attr,
429 &sensor_dev_attr_fan6_min.dev_attr.attr,
430 &sensor_dev_attr_fan6_alarm.dev_attr.attr,
431 &sensor_dev_attr_fan6_fault.dev_attr.attr,
434 &sensor_dev_attr_fan7_input.dev_attr.attr,
435 &sensor_dev_attr_fan7_min.dev_attr.attr,
436 &sensor_dev_attr_fan7_alarm.dev_attr.attr,
437 &sensor_dev_attr_fan7_fault.dev_attr.attr,
440 &sensor_dev_attr_fan8_input.dev_attr.attr,
441 &sensor_dev_attr_fan8_min.dev_attr.attr,
442 &sensor_dev_attr_fan8_alarm.dev_attr.attr,
443 &sensor_dev_attr_fan8_fault.dev_attr.attr,
448 static const struct attribute_group pc87427_group_fan[8] = {
449 { .attrs = pc87427_attributes_fan[0] },
450 { .attrs = pc87427_attributes_fan[1] },
451 { .attrs = pc87427_attributes_fan[2] },
452 { .attrs = pc87427_attributes_fan[3] },
453 { .attrs = pc87427_attributes_fan[4] },
454 { .attrs = pc87427_attributes_fan[5] },
455 { .attrs = pc87427_attributes_fan[6] },
456 { .attrs = pc87427_attributes_fan[7] },
459 /* Must be called with data->lock held and pc87427_readall_pwm() freshly
461 static void update_pwm_enable(struct pc87427_data *data, int nr, u8 mode)
463 int iobase = data->address[LD_FAN];
464 data->pwm_enable[nr] &= ~PWM_ENABLE_MODE_MASK;
465 data->pwm_enable[nr] |= mode;
466 outb(data->pwm_enable[nr], iobase + PC87427_REG_PWM_ENABLE);
469 static ssize_t show_pwm_enable(struct device *dev, struct device_attribute
472 struct pc87427_data *data = pc87427_update_device(dev);
473 int nr = to_sensor_dev_attr(devattr)->index;
476 pwm_enable = pwm_enable_from_reg(data->pwm_enable[nr]);
479 return sprintf(buf, "%d\n", pwm_enable);
482 static ssize_t set_pwm_enable(struct device *dev, struct device_attribute
483 *devattr, const char *buf, size_t count)
485 struct pc87427_data *data = dev_get_drvdata(dev);
486 int nr = to_sensor_dev_attr(devattr)->index;
489 if (strict_strtoul(buf, 10, &val) < 0 || val > 2)
491 /* Can't go to automatic mode if it isn't configured */
492 if (val == 2 && !(data->pwm_auto_ok & (1 << nr)))
495 mutex_lock(&data->lock);
496 pc87427_readall_pwm(data, nr);
497 update_pwm_enable(data, nr, pwm_enable_to_reg(val, data->pwm[nr]));
498 mutex_unlock(&data->lock);
503 static ssize_t show_pwm(struct device *dev, struct device_attribute
506 struct pc87427_data *data = pc87427_update_device(dev);
507 int nr = to_sensor_dev_attr(devattr)->index;
509 return sprintf(buf, "%d\n", (int)data->pwm[nr]);
512 static ssize_t set_pwm(struct device *dev, struct device_attribute
513 *devattr, const char *buf, size_t count)
515 struct pc87427_data *data = dev_get_drvdata(dev);
516 int nr = to_sensor_dev_attr(devattr)->index;
518 int iobase = data->address[LD_FAN];
521 if (strict_strtoul(buf, 10, &val) < 0 || val > 0xff)
524 mutex_lock(&data->lock);
525 pc87427_readall_pwm(data, nr);
526 mode = data->pwm_enable[nr] & PWM_ENABLE_MODE_MASK;
527 if (mode != PWM_MODE_MANUAL && mode != PWM_MODE_OFF) {
528 dev_notice(dev, "Can't set PWM%d duty cycle while not in "
529 "manual mode\n", nr + 1);
530 mutex_unlock(&data->lock);
534 /* We may have to change the mode */
535 if (mode == PWM_MODE_MANUAL && val == 0) {
536 /* Transition from Manual to Off */
537 update_pwm_enable(data, nr, PWM_MODE_OFF);
539 dev_dbg(dev, "Switching PWM%d from %s to %s\n", nr + 1,
541 } else if (mode == PWM_MODE_OFF && val != 0) {
542 /* Transition from Off to Manual */
543 update_pwm_enable(data, nr, PWM_MODE_MANUAL);
544 mode = PWM_MODE_MANUAL;
545 dev_dbg(dev, "Switching PWM%d from %s to %s\n", nr + 1,
550 if (mode == PWM_MODE_MANUAL)
551 outb(val, iobase + PC87427_REG_PWM_DUTY);
552 mutex_unlock(&data->lock);
557 static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO,
558 show_pwm_enable, set_pwm_enable, 0);
559 static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO,
560 show_pwm_enable, set_pwm_enable, 1);
561 static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO,
562 show_pwm_enable, set_pwm_enable, 2);
563 static SENSOR_DEVICE_ATTR(pwm4_enable, S_IWUSR | S_IRUGO,
564 show_pwm_enable, set_pwm_enable, 3);
566 static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 0);
567 static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 1);
568 static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 2);
569 static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 3);
571 static struct attribute *pc87427_attributes_pwm[4][3] = {
573 &sensor_dev_attr_pwm1_enable.dev_attr.attr,
574 &sensor_dev_attr_pwm1.dev_attr.attr,
577 &sensor_dev_attr_pwm2_enable.dev_attr.attr,
578 &sensor_dev_attr_pwm2.dev_attr.attr,
581 &sensor_dev_attr_pwm3_enable.dev_attr.attr,
582 &sensor_dev_attr_pwm3.dev_attr.attr,
585 &sensor_dev_attr_pwm4_enable.dev_attr.attr,
586 &sensor_dev_attr_pwm4.dev_attr.attr,
591 static const struct attribute_group pc87427_group_pwm[4] = {
592 { .attrs = pc87427_attributes_pwm[0] },
593 { .attrs = pc87427_attributes_pwm[1] },
594 { .attrs = pc87427_attributes_pwm[2] },
595 { .attrs = pc87427_attributes_pwm[3] },
598 static ssize_t show_name(struct device *dev, struct device_attribute
601 struct pc87427_data *data = dev_get_drvdata(dev);
603 return sprintf(buf, "%s\n", data->name);
605 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
609 * Device detection, attach and detach
612 static void pc87427_release_regions(struct platform_device *pdev, int count)
614 struct resource *res;
617 for (i = 0; i < count; i++) {
618 res = platform_get_resource(pdev, IORESOURCE_IO, i);
619 release_region(res->start, resource_size(res));
623 static int __devinit pc87427_request_regions(struct platform_device *pdev,
626 struct resource *res;
629 for (i = 0; i < count; i++) {
630 res = platform_get_resource(pdev, IORESOURCE_IO, i);
633 dev_err(&pdev->dev, "Missing resource #%d\n", i);
636 if (!request_region(res->start, resource_size(res), DRVNAME)) {
639 "Failed to request region 0x%lx-0x%lx\n",
640 (unsigned long)res->start,
641 (unsigned long)res->end);
647 pc87427_release_regions(pdev, i);
652 static void __devinit pc87427_init_device(struct device *dev)
654 struct pc87427_sio_data *sio_data = dev->platform_data;
655 struct pc87427_data *data = dev_get_drvdata(dev);
659 /* The FMC module should be ready */
660 reg = pc87427_read8(data, LD_FAN, PC87427_REG_BANK);
662 dev_warn(dev, "FMC module not ready!\n");
664 /* Check which fans are enabled */
665 for (i = 0; i < 8; i++) {
666 if (!(sio_data->has_fanin & (1 << i))) /* Not wired */
668 reg = pc87427_read8_bank(data, LD_FAN, BANK_FM(i),
669 PC87427_REG_FAN_STATUS);
670 if (reg & FAN_STATUS_MONEN)
671 data->fan_enabled |= (1 << i);
674 if (!data->fan_enabled) {
675 dev_dbg(dev, "Enabling monitoring of all fans\n");
676 for (i = 0; i < 8; i++) {
677 if (!(sio_data->has_fanin & (1 << i))) /* Not wired */
679 pc87427_write8_bank(data, LD_FAN, BANK_FM(i),
680 PC87427_REG_FAN_STATUS,
683 data->fan_enabled = sio_data->has_fanin;
686 /* Check which PWM outputs are enabled */
687 for (i = 0; i < 4; i++) {
688 if (!(sio_data->has_fanout & (1 << i))) /* Not wired */
690 reg = pc87427_read8_bank(data, LD_FAN, BANK_FC(i),
691 PC87427_REG_PWM_ENABLE);
692 if (reg & PWM_ENABLE_CTLEN)
693 data->pwm_enabled |= (1 << i);
695 /* We don't expose an interface to reconfigure the automatic
696 fan control mode, so only allow to return to this mode if
697 it was originally set. */
698 if ((reg & PWM_ENABLE_MODE_MASK) == PWM_MODE_AUTO) {
699 dev_dbg(dev, "PWM%d is in automatic control mode\n",
701 data->pwm_auto_ok |= (1 << i);
706 static int __devinit pc87427_probe(struct platform_device *pdev)
708 struct pc87427_sio_data *sio_data = pdev->dev.platform_data;
709 struct pc87427_data *data;
710 int i, err, res_count;
712 data = kzalloc(sizeof(struct pc87427_data), GFP_KERNEL);
715 printk(KERN_ERR DRVNAME ": Out of memory\n");
719 data->address[0] = sio_data->address[0];
720 data->address[1] = sio_data->address[1];
721 res_count = (data->address[0] != 0) + (data->address[1] != 0);
723 err = pc87427_request_regions(pdev, res_count);
727 mutex_init(&data->lock);
728 data->name = "pc87427";
729 platform_set_drvdata(pdev, data);
730 pc87427_init_device(&pdev->dev);
732 /* Register sysfs hooks */
733 err = device_create_file(&pdev->dev, &dev_attr_name);
735 goto exit_release_region;
736 for (i = 0; i < 8; i++) {
737 if (!(data->fan_enabled & (1 << i)))
739 err = sysfs_create_group(&pdev->dev.kobj,
740 &pc87427_group_fan[i]);
742 goto exit_remove_files;
744 for (i = 0; i < 4; i++) {
745 if (!(data->pwm_enabled & (1 << i)))
747 err = sysfs_create_group(&pdev->dev.kobj,
748 &pc87427_group_pwm[i]);
750 goto exit_remove_files;
753 data->hwmon_dev = hwmon_device_register(&pdev->dev);
754 if (IS_ERR(data->hwmon_dev)) {
755 err = PTR_ERR(data->hwmon_dev);
756 dev_err(&pdev->dev, "Class registration failed (%d)\n", err);
757 goto exit_remove_files;
763 for (i = 0; i < 8; i++) {
764 if (!(data->fan_enabled & (1 << i)))
766 sysfs_remove_group(&pdev->dev.kobj, &pc87427_group_fan[i]);
768 for (i = 0; i < 4; i++) {
769 if (!(data->pwm_enabled & (1 << i)))
771 sysfs_remove_group(&pdev->dev.kobj, &pc87427_group_pwm[i]);
774 pc87427_release_regions(pdev, res_count);
776 platform_set_drvdata(pdev, NULL);
782 static int __devexit pc87427_remove(struct platform_device *pdev)
784 struct pc87427_data *data = platform_get_drvdata(pdev);
787 res_count = (data->address[0] != 0) + (data->address[1] != 0);
789 hwmon_device_unregister(data->hwmon_dev);
790 device_remove_file(&pdev->dev, &dev_attr_name);
791 for (i = 0; i < 8; i++) {
792 if (!(data->fan_enabled & (1 << i)))
794 sysfs_remove_group(&pdev->dev.kobj, &pc87427_group_fan[i]);
796 for (i = 0; i < 4; i++) {
797 if (!(data->pwm_enabled & (1 << i)))
799 sysfs_remove_group(&pdev->dev.kobj, &pc87427_group_pwm[i]);
801 platform_set_drvdata(pdev, NULL);
804 pc87427_release_regions(pdev, res_count);
810 static struct platform_driver pc87427_driver = {
812 .owner = THIS_MODULE,
815 .probe = pc87427_probe,
816 .remove = __devexit_p(pc87427_remove),
819 static int __init pc87427_device_add(const struct pc87427_sio_data *sio_data)
821 struct resource res[2] = {
822 { .flags = IORESOURCE_IO },
823 { .flags = IORESOURCE_IO },
825 int err, i, res_count;
828 for (i = 0; i < 2; i++) {
829 if (!sio_data->address[i])
831 res[res_count].start = sio_data->address[i];
832 res[res_count].end = sio_data->address[i] + REGION_LENGTH - 1;
833 res[res_count].name = logdev_str[i];
835 err = acpi_check_resource_conflict(&res[res_count]);
842 pdev = platform_device_alloc(DRVNAME, res[0].start);
845 printk(KERN_ERR DRVNAME ": Device allocation failed\n");
849 err = platform_device_add_resources(pdev, res, res_count);
851 printk(KERN_ERR DRVNAME ": Device resource addition failed "
853 goto exit_device_put;
856 err = platform_device_add_data(pdev, sio_data,
857 sizeof(struct pc87427_sio_data));
859 printk(KERN_ERR DRVNAME ": Platform data allocation failed\n");
860 goto exit_device_put;
863 err = platform_device_add(pdev);
865 printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n",
867 goto exit_device_put;
873 platform_device_put(pdev);
878 static int __init pc87427_find(int sioaddr, struct pc87427_sio_data *sio_data)
884 /* Identify device */
885 val = force_id ? force_id : superio_inb(sioaddr, SIOREG_DEVID);
886 if (val != 0xf2) { /* PC87427 */
891 for (i = 0; i < 2; i++) {
892 sio_data->address[i] = 0;
893 /* Select logical device */
894 superio_outb(sioaddr, SIOREG_LDSEL, logdev[i]);
896 val = superio_inb(sioaddr, SIOREG_ACT);
898 printk(KERN_INFO DRVNAME ": Logical device 0x%02x "
899 "not activated\n", logdev[i]);
903 val = superio_inb(sioaddr, SIOREG_MAP);
905 printk(KERN_WARNING DRVNAME ": Logical device 0x%02x "
906 "is memory-mapped, can't use\n", logdev[i]);
910 val = (superio_inb(sioaddr, SIOREG_IOBASE) << 8)
911 | superio_inb(sioaddr, SIOREG_IOBASE + 1);
913 printk(KERN_INFO DRVNAME ": I/O base address not set "
914 "for logical device 0x%02x\n", logdev[i]);
917 sio_data->address[i] = val;
920 /* No point in loading the driver if everything is disabled */
921 if (!sio_data->address[0] && !sio_data->address[1]) {
926 /* Check which fan inputs are wired */
927 sio_data->has_fanin = (1 << 2) | (1 << 3); /* FANIN2, FANIN3 */
929 cfg = superio_inb(sioaddr, SIOREG_CF2);
930 if (!(cfg & (1 << 3)))
931 sio_data->has_fanin |= (1 << 0); /* FANIN0 */
932 if (!(cfg & (1 << 2)))
933 sio_data->has_fanin |= (1 << 4); /* FANIN4 */
935 cfg = superio_inb(sioaddr, SIOREG_CFD);
936 if (!(cfg & (1 << 0)))
937 sio_data->has_fanin |= (1 << 1); /* FANIN1 */
939 cfg = superio_inb(sioaddr, SIOREG_CF4);
940 if (!(cfg & (1 << 0)))
941 sio_data->has_fanin |= (1 << 7); /* FANIN7 */
942 cfg_b = superio_inb(sioaddr, SIOREG_CFB);
943 if (!(cfg & (1 << 1)) && (cfg_b & (1 << 3)))
944 sio_data->has_fanin |= (1 << 5); /* FANIN5 */
945 cfg = superio_inb(sioaddr, SIOREG_CF3);
946 if ((cfg & (1 << 3)) && !(cfg_b & (1 << 5)))
947 sio_data->has_fanin |= (1 << 6); /* FANIN6 */
949 /* Check which fan outputs are wired */
950 sio_data->has_fanout = (1 << 0); /* FANOUT0 */
951 if (cfg_b & (1 << 0))
952 sio_data->has_fanout |= (1 << 3); /* FANOUT3 */
954 cfg = superio_inb(sioaddr, SIOREG_CFC);
955 if (!(cfg & (1 << 4))) {
956 if (cfg_b & (1 << 1))
957 sio_data->has_fanout |= (1 << 1); /* FANOUT1 */
958 if (cfg_b & (1 << 2))
959 sio_data->has_fanout |= (1 << 2); /* FANOUT2 */
962 /* FANOUT1 and FANOUT2 can each be routed to 2 different pins */
963 cfg = superio_inb(sioaddr, SIOREG_CF5);
965 sio_data->has_fanout |= (1 << 1); /* FANOUT1 */
967 sio_data->has_fanout |= (1 << 2); /* FANOUT2 */
970 superio_exit(sioaddr);
974 static int __init pc87427_init(void)
977 struct pc87427_sio_data sio_data;
979 if (pc87427_find(0x2e, &sio_data)
980 && pc87427_find(0x4e, &sio_data))
983 err = platform_driver_register(&pc87427_driver);
987 /* Sets global pdev as a side effect */
988 err = pc87427_device_add(&sio_data);
995 platform_driver_unregister(&pc87427_driver);
1000 static void __exit pc87427_exit(void)
1002 platform_device_unregister(pdev);
1003 platform_driver_unregister(&pc87427_driver);
1006 MODULE_AUTHOR("Jean Delvare <khali@linux-fr.org>");
1007 MODULE_DESCRIPTION("PC87427 hardware monitoring driver");
1008 MODULE_LICENSE("GPL");
1010 module_init(pc87427_init);
1011 module_exit(pc87427_exit);