2 smsc47m1.c - Part of lm_sensors, Linux kernel modules
3 for hardware monitoring
5 Supports the SMSC LPC47B27x, LPC47M10x, LPC47M112, LPC47M13x,
6 LPC47M14x, LPC47M15x, LPC47M192, LPC47M292 and LPC47M997
9 Copyright (C) 2002 Mark D. Studebaker <mdsxyz123@yahoo.com>
10 Copyright (C) 2004-2007 Jean Delvare <khali@linux-fr.org>
11 Ported to Linux 2.6 by Gabriele Gorla <gorlik@yahoo.com>
14 This program is free software; you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation; either version 2 of the License, or
17 (at your option) any later version.
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29 #include <linux/module.h>
30 #include <linux/slab.h>
31 #include <linux/ioport.h>
32 #include <linux/jiffies.h>
33 #include <linux/platform_device.h>
34 #include <linux/hwmon.h>
35 #include <linux/hwmon-sysfs.h>
36 #include <linux/err.h>
37 #include <linux/init.h>
38 #include <linux/mutex.h>
39 #include <linux/sysfs.h>
40 #include <linux/acpi.h>
43 static unsigned short force_id;
44 module_param(force_id, ushort, 0);
45 MODULE_PARM_DESC(force_id, "Override the detected device ID");
47 static struct platform_device *pdev;
49 #define DRVNAME "smsc47m1"
50 enum chips { smsc47m1, smsc47m2 };
52 /* Super-I/0 registers and commands */
54 #define REG 0x2e /* The register to read/write */
55 #define VAL 0x2f /* The value to read/write */
58 superio_outb(int reg, int val)
71 /* logical device for fans is 0x0A */
72 #define superio_select() superio_outb(0x07, 0x0A)
86 #define SUPERIO_REG_ACT 0x30
87 #define SUPERIO_REG_BASE 0x60
88 #define SUPERIO_REG_DEVID 0x20
89 #define SUPERIO_REG_DEVREV 0x21
91 /* Logical device registers */
93 #define SMSC_EXTENT 0x80
95 /* nr is 0 or 1 in the macros below */
96 #define SMSC47M1_REG_ALARM 0x04
97 #define SMSC47M1_REG_TPIN(nr) (0x34 - (nr))
98 #define SMSC47M1_REG_PPIN(nr) (0x36 - (nr))
99 #define SMSC47M1_REG_FANDIV 0x58
101 static const u8 SMSC47M1_REG_FAN[3] = { 0x59, 0x5a, 0x6b };
102 static const u8 SMSC47M1_REG_FAN_PRELOAD[3] = { 0x5b, 0x5c, 0x6c };
103 static const u8 SMSC47M1_REG_PWM[3] = { 0x56, 0x57, 0x69 };
105 #define SMSC47M2_REG_ALARM6 0x09
106 #define SMSC47M2_REG_TPIN1 0x38
107 #define SMSC47M2_REG_TPIN2 0x37
108 #define SMSC47M2_REG_TPIN3 0x2d
109 #define SMSC47M2_REG_PPIN3 0x2c
110 #define SMSC47M2_REG_FANDIV3 0x6a
112 #define MIN_FROM_REG(reg,div) ((reg)>=192 ? 0 : \
113 983040/((192-(reg))*(div)))
114 #define FAN_FROM_REG(reg,div,preload) ((reg)<=(preload) || (reg)==255 ? 0 : \
115 983040/(((reg)-(preload))*(div)))
116 #define DIV_FROM_REG(reg) (1 << (reg))
117 #define PWM_FROM_REG(reg) (((reg) & 0x7E) << 1)
118 #define PWM_EN_FROM_REG(reg) ((~(reg)) & 0x01)
119 #define PWM_TO_REG(reg) (((reg) >> 1) & 0x7E)
121 struct smsc47m1_data {
125 struct device *hwmon_dev;
127 struct mutex update_lock;
128 unsigned long last_updated; /* In jiffies */
130 u8 fan[3]; /* Register value */
131 u8 fan_preload[3]; /* Register value */
132 u8 fan_div[3]; /* Register encoding, shifted right */
133 u8 alarms; /* Register encoding */
134 u8 pwm[3]; /* Register value (bit 0 is disable) */
137 struct smsc47m1_sio_data {
142 static int smsc47m1_probe(struct platform_device *pdev);
143 static int __devexit smsc47m1_remove(struct platform_device *pdev);
144 static struct smsc47m1_data *smsc47m1_update_device(struct device *dev,
147 static inline int smsc47m1_read_value(struct smsc47m1_data *data, u8 reg)
149 return inb_p(data->addr + reg);
152 static inline void smsc47m1_write_value(struct smsc47m1_data *data, u8 reg,
155 outb_p(value, data->addr + reg);
158 static struct platform_driver smsc47m1_driver = {
160 .owner = THIS_MODULE,
163 .probe = smsc47m1_probe,
164 .remove = __devexit_p(smsc47m1_remove),
167 static ssize_t get_fan(struct device *dev, struct device_attribute
170 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
171 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
172 int nr = attr->index;
173 /* This chip (stupidly) stops monitoring fan speed if PWM is
174 enabled and duty cycle is 0%. This is fine if the monitoring
175 and control concern the same fan, but troublesome if they are
176 not (which could as well happen). */
177 int rpm = (data->pwm[nr] & 0x7F) == 0x00 ? 0 :
178 FAN_FROM_REG(data->fan[nr],
179 DIV_FROM_REG(data->fan_div[nr]),
180 data->fan_preload[nr]);
181 return sprintf(buf, "%d\n", rpm);
184 static ssize_t get_fan_min(struct device *dev, struct device_attribute
187 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
188 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
189 int nr = attr->index;
190 int rpm = MIN_FROM_REG(data->fan_preload[nr],
191 DIV_FROM_REG(data->fan_div[nr]));
192 return sprintf(buf, "%d\n", rpm);
195 static ssize_t get_fan_div(struct device *dev, struct device_attribute
198 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
199 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
200 return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[attr->index]));
203 static ssize_t get_fan_alarm(struct device *dev, struct device_attribute
206 int bitnr = to_sensor_dev_attr(devattr)->index;
207 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
208 return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1);
211 static ssize_t get_pwm(struct device *dev, struct device_attribute
214 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
215 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
216 return sprintf(buf, "%d\n", PWM_FROM_REG(data->pwm[attr->index]));
219 static ssize_t get_pwm_en(struct device *dev, struct device_attribute
222 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
223 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
224 return sprintf(buf, "%d\n", PWM_EN_FROM_REG(data->pwm[attr->index]));
227 static ssize_t get_alarms(struct device *dev, struct device_attribute
230 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
231 return sprintf(buf, "%d\n", data->alarms);
234 static ssize_t set_fan_min(struct device *dev, struct device_attribute
235 *devattr, const char *buf, size_t count)
237 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
238 struct smsc47m1_data *data = dev_get_drvdata(dev);
239 int nr = attr->index;
240 long rpmdiv, val = simple_strtol(buf, NULL, 10);
242 mutex_lock(&data->update_lock);
243 rpmdiv = val * DIV_FROM_REG(data->fan_div[nr]);
245 if (983040 > 192 * rpmdiv || 2 * rpmdiv > 983040) {
246 mutex_unlock(&data->update_lock);
250 data->fan_preload[nr] = 192 - ((983040 + rpmdiv / 2) / rpmdiv);
251 smsc47m1_write_value(data, SMSC47M1_REG_FAN_PRELOAD[nr],
252 data->fan_preload[nr]);
253 mutex_unlock(&data->update_lock);
258 /* Note: we save and restore the fan minimum here, because its value is
259 determined in part by the fan clock divider. This follows the principle
260 of least surprise; the user doesn't expect the fan minimum to change just
261 because the divider changed. */
262 static ssize_t set_fan_div(struct device *dev, struct device_attribute
263 *devattr, const char *buf, size_t count)
265 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
266 struct smsc47m1_data *data = dev_get_drvdata(dev);
267 int nr = attr->index;
268 long new_div = simple_strtol(buf, NULL, 10), tmp;
269 u8 old_div = DIV_FROM_REG(data->fan_div[nr]);
271 if (new_div == old_div) /* No change */
274 mutex_lock(&data->update_lock);
276 case 1: data->fan_div[nr] = 0; break;
277 case 2: data->fan_div[nr] = 1; break;
278 case 4: data->fan_div[nr] = 2; break;
279 case 8: data->fan_div[nr] = 3; break;
281 mutex_unlock(&data->update_lock);
288 tmp = smsc47m1_read_value(data, SMSC47M1_REG_FANDIV)
289 & ~(0x03 << (4 + 2 * nr));
290 tmp |= data->fan_div[nr] << (4 + 2 * nr);
291 smsc47m1_write_value(data, SMSC47M1_REG_FANDIV, tmp);
294 tmp = smsc47m1_read_value(data, SMSC47M2_REG_FANDIV3) & 0xCF;
295 tmp |= data->fan_div[2] << 4;
296 smsc47m1_write_value(data, SMSC47M2_REG_FANDIV3, tmp);
300 /* Preserve fan min */
301 tmp = 192 - (old_div * (192 - data->fan_preload[nr])
302 + new_div / 2) / new_div;
303 data->fan_preload[nr] = SENSORS_LIMIT(tmp, 0, 191);
304 smsc47m1_write_value(data, SMSC47M1_REG_FAN_PRELOAD[nr],
305 data->fan_preload[nr]);
306 mutex_unlock(&data->update_lock);
311 static ssize_t set_pwm(struct device *dev, struct device_attribute
312 *devattr, const char *buf, size_t count)
314 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
315 struct smsc47m1_data *data = dev_get_drvdata(dev);
316 int nr = attr->index;
317 long val = simple_strtol(buf, NULL, 10);
319 if (val < 0 || val > 255)
322 mutex_lock(&data->update_lock);
323 data->pwm[nr] &= 0x81; /* Preserve additional bits */
324 data->pwm[nr] |= PWM_TO_REG(val);
325 smsc47m1_write_value(data, SMSC47M1_REG_PWM[nr],
327 mutex_unlock(&data->update_lock);
332 static ssize_t set_pwm_en(struct device *dev, struct device_attribute
333 *devattr, const char *buf, size_t count)
335 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
336 struct smsc47m1_data *data = dev_get_drvdata(dev);
337 int nr = attr->index;
338 long val = simple_strtol(buf, NULL, 10);
340 if (val != 0 && val != 1)
343 mutex_lock(&data->update_lock);
344 data->pwm[nr] &= 0xFE; /* preserve the other bits */
345 data->pwm[nr] |= !val;
346 smsc47m1_write_value(data, SMSC47M1_REG_PWM[nr],
348 mutex_unlock(&data->update_lock);
353 #define fan_present(offset) \
354 static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, get_fan, \
356 static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
357 get_fan_min, set_fan_min, offset - 1); \
358 static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
359 get_fan_div, set_fan_div, offset - 1); \
360 static SENSOR_DEVICE_ATTR(fan##offset##_alarm, S_IRUGO, get_fan_alarm, \
362 static SENSOR_DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \
363 get_pwm, set_pwm, offset - 1); \
364 static SENSOR_DEVICE_ATTR(pwm##offset##_enable, S_IRUGO | S_IWUSR, \
365 get_pwm_en, set_pwm_en, offset - 1)
371 static DEVICE_ATTR(alarms, S_IRUGO, get_alarms, NULL);
373 static ssize_t show_name(struct device *dev, struct device_attribute
376 struct smsc47m1_data *data = dev_get_drvdata(dev);
378 return sprintf(buf, "%s\n", data->name);
380 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
382 /* Almost all sysfs files may or may not be created depending on the chip
383 setup so we create them individually. It is still convenient to define a
384 group to remove them all at once. */
385 static struct attribute *smsc47m1_attributes[] = {
386 &sensor_dev_attr_fan1_input.dev_attr.attr,
387 &sensor_dev_attr_fan1_min.dev_attr.attr,
388 &sensor_dev_attr_fan1_div.dev_attr.attr,
389 &sensor_dev_attr_fan1_alarm.dev_attr.attr,
390 &sensor_dev_attr_fan2_input.dev_attr.attr,
391 &sensor_dev_attr_fan2_min.dev_attr.attr,
392 &sensor_dev_attr_fan2_div.dev_attr.attr,
393 &sensor_dev_attr_fan2_alarm.dev_attr.attr,
394 &sensor_dev_attr_fan3_input.dev_attr.attr,
395 &sensor_dev_attr_fan3_min.dev_attr.attr,
396 &sensor_dev_attr_fan3_div.dev_attr.attr,
397 &sensor_dev_attr_fan3_alarm.dev_attr.attr,
399 &sensor_dev_attr_pwm1.dev_attr.attr,
400 &sensor_dev_attr_pwm1_enable.dev_attr.attr,
401 &sensor_dev_attr_pwm2.dev_attr.attr,
402 &sensor_dev_attr_pwm2_enable.dev_attr.attr,
403 &sensor_dev_attr_pwm3.dev_attr.attr,
404 &sensor_dev_attr_pwm3_enable.dev_attr.attr,
406 &dev_attr_alarms.attr,
411 static const struct attribute_group smsc47m1_group = {
412 .attrs = smsc47m1_attributes,
415 static int __init smsc47m1_find(unsigned short *addr,
416 struct smsc47m1_sio_data *sio_data)
421 val = force_id ? force_id : superio_inb(SUPERIO_REG_DEVID);
424 * SMSC LPC47M10x/LPC47M112/LPC47M13x (device id 0x59), LPC47M14x
425 * (device id 0x5F) and LPC47B27x (device id 0x51) have fan control.
426 * The LPC47M15x and LPC47M192 chips "with hardware monitoring block"
427 * can do much more besides (device id 0x60).
428 * The LPC47M997 is undocumented, but seems to be compatible with
429 * the LPC47M192, and has the same device id.
430 * The LPC47M292 (device id 0x6B) is somewhat compatible, but it
431 * supports a 3rd fan, and the pin configuration registers are
432 * unfortunately different.
433 * The LPC47M233 has the same device id (0x6B) but is not compatible.
434 * We check the high bit of the device revision register to
435 * differentiate them.
439 pr_info(DRVNAME ": Found SMSC LPC47B27x\n");
440 sio_data->type = smsc47m1;
443 pr_info(DRVNAME ": Found SMSC LPC47M10x/LPC47M112/LPC47M13x\n");
444 sio_data->type = smsc47m1;
447 pr_info(DRVNAME ": Found SMSC LPC47M14x\n");
448 sio_data->type = smsc47m1;
451 pr_info(DRVNAME ": Found SMSC LPC47M15x/LPC47M192/LPC47M997\n");
452 sio_data->type = smsc47m1;
455 if (superio_inb(SUPERIO_REG_DEVREV) & 0x80) {
456 pr_debug(DRVNAME ": "
457 "Found SMSC LPC47M233, unsupported\n");
462 pr_info(DRVNAME ": Found SMSC LPC47M292\n");
463 sio_data->type = smsc47m2;
471 *addr = (superio_inb(SUPERIO_REG_BASE) << 8)
472 | superio_inb(SUPERIO_REG_BASE + 1);
473 val = superio_inb(SUPERIO_REG_ACT);
474 if (*addr == 0 || (val & 0x01) == 0) {
475 pr_info(DRVNAME ": Device is disabled, will not use\n");
489 * This function can be used to:
490 * - test for resource conflicts with ACPI
491 * - request the resources
492 * - release the resources
493 * We only allocate the I/O ports we really need, to minimize the risk of
494 * conflicts with ACPI or with other drivers.
496 static int smsc47m1_handle_resources(unsigned short address, enum chips type,
497 int action, struct device *dev)
499 static const u8 ports_m1[] = {
500 /* register, region length */
506 static const u8 ports_m2[] = {
507 /* register, region length */
516 int i, ports_size, err;
523 ports_size = ARRAY_SIZE(ports_m1);
527 ports_size = ARRAY_SIZE(ports_m2);
531 for (i = 0; i + 1 < ports_size; i += 2) {
532 unsigned short start = address + ports[i];
533 unsigned short len = ports[i + 1];
537 /* Only check for conflicts */
538 err = acpi_check_region(start, len, DRVNAME);
543 /* Request the resources */
544 if (!request_region(start, len, DRVNAME)) {
545 dev_err(dev, "Region 0x%hx-0x%hx already in "
546 "use!\n", start, start + len);
548 /* Undo all requests */
549 for (i -= 2; i >= 0; i -= 2)
550 release_region(address + ports[i],
556 /* Release the resources */
557 release_region(start, len);
565 static int __devinit smsc47m1_probe(struct platform_device *pdev)
567 struct device *dev = &pdev->dev;
568 struct smsc47m1_sio_data *sio_data = dev->platform_data;
569 struct smsc47m1_data *data;
570 struct resource *res;
572 int fan1, fan2, fan3, pwm1, pwm2, pwm3;
574 static const char *names[] = {
579 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
580 err = smsc47m1_handle_resources(res->start, sio_data->type,
585 if (!(data = kzalloc(sizeof(struct smsc47m1_data), GFP_KERNEL))) {
590 data->addr = res->start;
591 data->type = sio_data->type;
592 data->name = names[sio_data->type];
593 mutex_init(&data->update_lock);
594 platform_set_drvdata(pdev, data);
596 /* If no function is properly configured, there's no point in
597 actually registering the chip. */
598 pwm1 = (smsc47m1_read_value(data, SMSC47M1_REG_PPIN(0)) & 0x05)
600 pwm2 = (smsc47m1_read_value(data, SMSC47M1_REG_PPIN(1)) & 0x05)
602 if (data->type == smsc47m2) {
603 fan1 = (smsc47m1_read_value(data, SMSC47M2_REG_TPIN1)
605 fan2 = (smsc47m1_read_value(data, SMSC47M2_REG_TPIN2)
607 fan3 = (smsc47m1_read_value(data, SMSC47M2_REG_TPIN3)
609 pwm3 = (smsc47m1_read_value(data, SMSC47M2_REG_PPIN3)
612 fan1 = (smsc47m1_read_value(data, SMSC47M1_REG_TPIN(0))
614 fan2 = (smsc47m1_read_value(data, SMSC47M1_REG_TPIN(1))
619 if (!(fan1 || fan2 || fan3 || pwm1 || pwm2 || pwm3)) {
620 dev_warn(dev, "Device not configured, will not use\n");
625 /* Some values (fan min, clock dividers, pwm registers) may be
626 needed before any update is triggered, so we better read them
627 at least once here. We don't usually do it that way, but in
628 this particular case, manually reading 5 registers out of 8
629 doesn't make much sense and we're better using the existing
631 smsc47m1_update_device(dev, 1);
633 /* Register sysfs hooks */
635 if ((err = device_create_file(dev,
636 &sensor_dev_attr_fan1_input.dev_attr))
637 || (err = device_create_file(dev,
638 &sensor_dev_attr_fan1_min.dev_attr))
639 || (err = device_create_file(dev,
640 &sensor_dev_attr_fan1_div.dev_attr))
641 || (err = device_create_file(dev,
642 &sensor_dev_attr_fan1_alarm.dev_attr)))
643 goto error_remove_files;
645 dev_dbg(dev, "Fan 1 not enabled by hardware, skipping\n");
648 if ((err = device_create_file(dev,
649 &sensor_dev_attr_fan2_input.dev_attr))
650 || (err = device_create_file(dev,
651 &sensor_dev_attr_fan2_min.dev_attr))
652 || (err = device_create_file(dev,
653 &sensor_dev_attr_fan2_div.dev_attr))
654 || (err = device_create_file(dev,
655 &sensor_dev_attr_fan2_alarm.dev_attr)))
656 goto error_remove_files;
658 dev_dbg(dev, "Fan 2 not enabled by hardware, skipping\n");
661 if ((err = device_create_file(dev,
662 &sensor_dev_attr_fan3_input.dev_attr))
663 || (err = device_create_file(dev,
664 &sensor_dev_attr_fan3_min.dev_attr))
665 || (err = device_create_file(dev,
666 &sensor_dev_attr_fan3_div.dev_attr))
667 || (err = device_create_file(dev,
668 &sensor_dev_attr_fan3_alarm.dev_attr)))
669 goto error_remove_files;
670 } else if (data->type == smsc47m2)
671 dev_dbg(dev, "Fan 3 not enabled by hardware, skipping\n");
674 if ((err = device_create_file(dev,
675 &sensor_dev_attr_pwm1.dev_attr))
676 || (err = device_create_file(dev,
677 &sensor_dev_attr_pwm1_enable.dev_attr)))
678 goto error_remove_files;
680 dev_dbg(dev, "PWM 1 not enabled by hardware, skipping\n");
683 if ((err = device_create_file(dev,
684 &sensor_dev_attr_pwm2.dev_attr))
685 || (err = device_create_file(dev,
686 &sensor_dev_attr_pwm2_enable.dev_attr)))
687 goto error_remove_files;
689 dev_dbg(dev, "PWM 2 not enabled by hardware, skipping\n");
692 if ((err = device_create_file(dev,
693 &sensor_dev_attr_pwm3.dev_attr))
694 || (err = device_create_file(dev,
695 &sensor_dev_attr_pwm3_enable.dev_attr)))
696 goto error_remove_files;
697 } else if (data->type == smsc47m2)
698 dev_dbg(dev, "PWM 3 not enabled by hardware, skipping\n");
700 if ((err = device_create_file(dev, &dev_attr_alarms)))
701 goto error_remove_files;
702 if ((err = device_create_file(dev, &dev_attr_name)))
703 goto error_remove_files;
705 data->hwmon_dev = hwmon_device_register(dev);
706 if (IS_ERR(data->hwmon_dev)) {
707 err = PTR_ERR(data->hwmon_dev);
708 goto error_remove_files;
714 sysfs_remove_group(&dev->kobj, &smsc47m1_group);
716 platform_set_drvdata(pdev, NULL);
719 smsc47m1_handle_resources(res->start, sio_data->type, RELEASE, dev);
723 static int __devexit smsc47m1_remove(struct platform_device *pdev)
725 struct smsc47m1_data *data = platform_get_drvdata(pdev);
726 struct resource *res;
728 hwmon_device_unregister(data->hwmon_dev);
729 sysfs_remove_group(&pdev->dev.kobj, &smsc47m1_group);
731 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
732 smsc47m1_handle_resources(res->start, data->type, RELEASE, &pdev->dev);
733 platform_set_drvdata(pdev, NULL);
739 static struct smsc47m1_data *smsc47m1_update_device(struct device *dev,
742 struct smsc47m1_data *data = dev_get_drvdata(dev);
744 mutex_lock(&data->update_lock);
746 if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || init) {
748 fan_nr = data->type == smsc47m2 ? 3 : 2;
750 for (i = 0; i < fan_nr; i++) {
751 data->fan[i] = smsc47m1_read_value(data,
752 SMSC47M1_REG_FAN[i]);
753 data->fan_preload[i] = smsc47m1_read_value(data,
754 SMSC47M1_REG_FAN_PRELOAD[i]);
755 data->pwm[i] = smsc47m1_read_value(data,
756 SMSC47M1_REG_PWM[i]);
759 i = smsc47m1_read_value(data, SMSC47M1_REG_FANDIV);
760 data->fan_div[0] = (i >> 4) & 0x03;
761 data->fan_div[1] = i >> 6;
763 data->alarms = smsc47m1_read_value(data,
764 SMSC47M1_REG_ALARM) >> 6;
765 /* Clear alarms if needed */
767 smsc47m1_write_value(data, SMSC47M1_REG_ALARM, 0xC0);
770 data->fan_div[2] = (smsc47m1_read_value(data,
771 SMSC47M2_REG_FANDIV3) >> 4) & 0x03;
772 data->alarms |= (smsc47m1_read_value(data,
773 SMSC47M2_REG_ALARM6) & 0x40) >> 4;
774 /* Clear alarm if needed */
775 if (data->alarms & 0x04)
776 smsc47m1_write_value(data,
781 data->last_updated = jiffies;
784 mutex_unlock(&data->update_lock);
788 static int __init smsc47m1_device_add(unsigned short address,
789 const struct smsc47m1_sio_data *sio_data)
791 struct resource res = {
793 .end = address + SMSC_EXTENT - 1,
795 .flags = IORESOURCE_IO,
799 err = smsc47m1_handle_resources(address, sio_data->type, CHECK, NULL);
803 pdev = platform_device_alloc(DRVNAME, address);
806 printk(KERN_ERR DRVNAME ": Device allocation failed\n");
810 err = platform_device_add_resources(pdev, &res, 1);
812 printk(KERN_ERR DRVNAME ": Device resource addition failed "
814 goto exit_device_put;
817 err = platform_device_add_data(pdev, sio_data,
818 sizeof(struct smsc47m1_sio_data));
820 printk(KERN_ERR DRVNAME ": Platform data allocation failed\n");
821 goto exit_device_put;
824 err = platform_device_add(pdev);
826 printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n",
828 goto exit_device_put;
834 platform_device_put(pdev);
839 static int __init sm_smsc47m1_init(void)
842 unsigned short address;
843 struct smsc47m1_sio_data sio_data;
845 if (smsc47m1_find(&address, &sio_data))
848 err = platform_driver_register(&smsc47m1_driver);
852 /* Sets global pdev as a side effect */
853 err = smsc47m1_device_add(address, &sio_data);
860 platform_driver_unregister(&smsc47m1_driver);
865 static void __exit sm_smsc47m1_exit(void)
867 platform_device_unregister(pdev);
868 platform_driver_unregister(&smsc47m1_driver);
871 MODULE_AUTHOR("Mark D. Studebaker <mdsxyz123@yahoo.com>");
872 MODULE_DESCRIPTION("SMSC LPC47M1xx fan sensors driver");
873 MODULE_LICENSE("GPL");
875 module_init(sm_smsc47m1_init);
876 module_exit(sm_smsc47m1_exit);