hwmon/smsc47m1: Get rid of a useless mutex
[linux-2.6/linux-2.6-openrd.git] / drivers / hwmon / smsc47m1.c
blobf219d7c6a98270ab074487e53326f8c47a5632b1
1 /*
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
7 Super-I/O chips.
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>
12 and Jean Delvare
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/i2c.h>
34 #include <linux/i2c-isa.h>
35 #include <linux/hwmon.h>
36 #include <linux/err.h>
37 #include <linux/init.h>
38 #include <linux/mutex.h>
39 #include <linux/sysfs.h>
40 #include <asm/io.h>
42 /* Address is autodetected, there is no default value */
43 static unsigned short address;
44 static u8 devid;
45 enum chips { smsc47m1, smsc47m2 };
47 /* Super-I/0 registers and commands */
49 #define REG 0x2e /* The register to read/write */
50 #define VAL 0x2f /* The value to read/write */
52 static inline void
53 superio_outb(int reg, int val)
55 outb(reg, REG);
56 outb(val, VAL);
59 static inline int
60 superio_inb(int reg)
62 outb(reg, REG);
63 return inb(VAL);
66 /* logical device for fans is 0x0A */
67 #define superio_select() superio_outb(0x07, 0x0A)
69 static inline void
70 superio_enter(void)
72 outb(0x55, REG);
75 static inline void
76 superio_exit(void)
78 outb(0xAA, REG);
81 #define SUPERIO_REG_ACT 0x30
82 #define SUPERIO_REG_BASE 0x60
83 #define SUPERIO_REG_DEVID 0x20
85 /* Logical device registers */
87 #define SMSC_EXTENT 0x80
89 /* nr is 0 or 1 in the macros below */
90 #define SMSC47M1_REG_ALARM 0x04
91 #define SMSC47M1_REG_TPIN(nr) (0x34 - (nr))
92 #define SMSC47M1_REG_PPIN(nr) (0x36 - (nr))
93 #define SMSC47M1_REG_FANDIV 0x58
95 static const u8 SMSC47M1_REG_FAN[3] = { 0x59, 0x5a, 0x6b };
96 static const u8 SMSC47M1_REG_FAN_PRELOAD[3] = { 0x5b, 0x5c, 0x6c };
97 static const u8 SMSC47M1_REG_PWM[3] = { 0x56, 0x57, 0x69 };
99 #define SMSC47M2_REG_ALARM6 0x09
100 #define SMSC47M2_REG_TPIN1 0x38
101 #define SMSC47M2_REG_TPIN2 0x37
102 #define SMSC47M2_REG_TPIN3 0x2d
103 #define SMSC47M2_REG_PPIN3 0x2c
104 #define SMSC47M2_REG_FANDIV3 0x6a
106 #define MIN_FROM_REG(reg,div) ((reg)>=192 ? 0 : \
107 983040/((192-(reg))*(div)))
108 #define FAN_FROM_REG(reg,div,preload) ((reg)<=(preload) || (reg)==255 ? 0 : \
109 983040/(((reg)-(preload))*(div)))
110 #define DIV_FROM_REG(reg) (1 << (reg))
111 #define PWM_FROM_REG(reg) (((reg) & 0x7E) << 1)
112 #define PWM_EN_FROM_REG(reg) ((~(reg)) & 0x01)
113 #define PWM_TO_REG(reg) (((reg) >> 1) & 0x7E)
115 struct smsc47m1_data {
116 struct i2c_client client;
117 enum chips type;
118 struct class_device *class_dev;
120 struct mutex update_lock;
121 unsigned long last_updated; /* In jiffies */
123 u8 fan[3]; /* Register value */
124 u8 fan_preload[3]; /* Register value */
125 u8 fan_div[3]; /* Register encoding, shifted right */
126 u8 alarms; /* Register encoding */
127 u8 pwm[3]; /* Register value (bit 0 is disable) */
131 static int smsc47m1_detect(struct i2c_adapter *adapter);
132 static int smsc47m1_detach_client(struct i2c_client *client);
133 static struct smsc47m1_data *smsc47m1_update_device(struct device *dev,
134 int init);
136 static inline int smsc47m1_read_value(struct i2c_client *client, u8 reg)
138 return inb_p(client->addr + reg);
141 static inline void smsc47m1_write_value(struct i2c_client *client, u8 reg,
142 u8 value)
144 outb_p(value, client->addr + reg);
147 static struct i2c_driver smsc47m1_driver = {
148 .driver = {
149 .owner = THIS_MODULE,
150 .name = "smsc47m1",
152 .attach_adapter = smsc47m1_detect,
153 .detach_client = smsc47m1_detach_client,
156 /* nr is 0 or 1 in the callback functions below */
158 static ssize_t get_fan(struct device *dev, char *buf, int nr)
160 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
161 /* This chip (stupidly) stops monitoring fan speed if PWM is
162 enabled and duty cycle is 0%. This is fine if the monitoring
163 and control concern the same fan, but troublesome if they are
164 not (which could as well happen). */
165 int rpm = (data->pwm[nr] & 0x7F) == 0x00 ? 0 :
166 FAN_FROM_REG(data->fan[nr],
167 DIV_FROM_REG(data->fan_div[nr]),
168 data->fan_preload[nr]);
169 return sprintf(buf, "%d\n", rpm);
172 static ssize_t get_fan_min(struct device *dev, char *buf, int nr)
174 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
175 int rpm = MIN_FROM_REG(data->fan_preload[nr],
176 DIV_FROM_REG(data->fan_div[nr]));
177 return sprintf(buf, "%d\n", rpm);
180 static ssize_t get_fan_div(struct device *dev, char *buf, int nr)
182 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
183 return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr]));
186 static ssize_t get_pwm(struct device *dev, char *buf, int nr)
188 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
189 return sprintf(buf, "%d\n", PWM_FROM_REG(data->pwm[nr]));
192 static ssize_t get_pwm_en(struct device *dev, char *buf, int nr)
194 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
195 return sprintf(buf, "%d\n", PWM_EN_FROM_REG(data->pwm[nr]));
198 static ssize_t get_alarms(struct device *dev, struct device_attribute *attr, char *buf)
200 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
201 return sprintf(buf, "%d\n", data->alarms);
204 static ssize_t set_fan_min(struct device *dev, const char *buf,
205 size_t count, int nr)
207 struct i2c_client *client = to_i2c_client(dev);
208 struct smsc47m1_data *data = i2c_get_clientdata(client);
209 long rpmdiv, val = simple_strtol(buf, NULL, 10);
211 mutex_lock(&data->update_lock);
212 rpmdiv = val * DIV_FROM_REG(data->fan_div[nr]);
214 if (983040 > 192 * rpmdiv || 2 * rpmdiv > 983040) {
215 mutex_unlock(&data->update_lock);
216 return -EINVAL;
219 data->fan_preload[nr] = 192 - ((983040 + rpmdiv / 2) / rpmdiv);
220 smsc47m1_write_value(client, SMSC47M1_REG_FAN_PRELOAD[nr],
221 data->fan_preload[nr]);
222 mutex_unlock(&data->update_lock);
224 return count;
227 /* Note: we save and restore the fan minimum here, because its value is
228 determined in part by the fan clock divider. This follows the principle
229 of least surprise; the user doesn't expect the fan minimum to change just
230 because the divider changed. */
231 static ssize_t set_fan_div(struct device *dev, const char *buf,
232 size_t count, int nr)
234 struct i2c_client *client = to_i2c_client(dev);
235 struct smsc47m1_data *data = i2c_get_clientdata(client);
237 long new_div = simple_strtol(buf, NULL, 10), tmp;
238 u8 old_div = DIV_FROM_REG(data->fan_div[nr]);
240 if (new_div == old_div) /* No change */
241 return count;
243 mutex_lock(&data->update_lock);
244 switch (new_div) {
245 case 1: data->fan_div[nr] = 0; break;
246 case 2: data->fan_div[nr] = 1; break;
247 case 4: data->fan_div[nr] = 2; break;
248 case 8: data->fan_div[nr] = 3; break;
249 default:
250 mutex_unlock(&data->update_lock);
251 return -EINVAL;
254 switch (nr) {
255 case 0:
256 case 1:
257 tmp = smsc47m1_read_value(client, SMSC47M1_REG_FANDIV)
258 & ~(0x03 << (4 + 2 * nr));
259 tmp |= data->fan_div[nr] << (4 + 2 * nr);
260 smsc47m1_write_value(client, SMSC47M1_REG_FANDIV, tmp);
261 break;
262 case 2:
263 tmp = smsc47m1_read_value(client, SMSC47M2_REG_FANDIV3) & 0xCF;
264 tmp |= data->fan_div[2] << 4;
265 smsc47m1_write_value(client, SMSC47M2_REG_FANDIV3, tmp);
266 break;
269 /* Preserve fan min */
270 tmp = 192 - (old_div * (192 - data->fan_preload[nr])
271 + new_div / 2) / new_div;
272 data->fan_preload[nr] = SENSORS_LIMIT(tmp, 0, 191);
273 smsc47m1_write_value(client, SMSC47M1_REG_FAN_PRELOAD[nr],
274 data->fan_preload[nr]);
275 mutex_unlock(&data->update_lock);
277 return count;
280 static ssize_t set_pwm(struct device *dev, const char *buf,
281 size_t count, int nr)
283 struct i2c_client *client = to_i2c_client(dev);
284 struct smsc47m1_data *data = i2c_get_clientdata(client);
286 long val = simple_strtol(buf, NULL, 10);
288 if (val < 0 || val > 255)
289 return -EINVAL;
291 mutex_lock(&data->update_lock);
292 data->pwm[nr] &= 0x81; /* Preserve additional bits */
293 data->pwm[nr] |= PWM_TO_REG(val);
294 smsc47m1_write_value(client, SMSC47M1_REG_PWM[nr],
295 data->pwm[nr]);
296 mutex_unlock(&data->update_lock);
298 return count;
301 static ssize_t set_pwm_en(struct device *dev, const char *buf,
302 size_t count, int nr)
304 struct i2c_client *client = to_i2c_client(dev);
305 struct smsc47m1_data *data = i2c_get_clientdata(client);
307 long val = simple_strtol(buf, NULL, 10);
309 if (val != 0 && val != 1)
310 return -EINVAL;
312 mutex_lock(&data->update_lock);
313 data->pwm[nr] &= 0xFE; /* preserve the other bits */
314 data->pwm[nr] |= !val;
315 smsc47m1_write_value(client, SMSC47M1_REG_PWM[nr],
316 data->pwm[nr]);
317 mutex_unlock(&data->update_lock);
319 return count;
322 #define fan_present(offset) \
323 static ssize_t get_fan##offset (struct device *dev, struct device_attribute *attr, char *buf) \
325 return get_fan(dev, buf, offset - 1); \
327 static ssize_t get_fan##offset##_min (struct device *dev, struct device_attribute *attr, char *buf) \
329 return get_fan_min(dev, buf, offset - 1); \
331 static ssize_t set_fan##offset##_min (struct device *dev, struct device_attribute *attr, \
332 const char *buf, size_t count) \
334 return set_fan_min(dev, buf, count, offset - 1); \
336 static ssize_t get_fan##offset##_div (struct device *dev, struct device_attribute *attr, char *buf) \
338 return get_fan_div(dev, buf, offset - 1); \
340 static ssize_t set_fan##offset##_div (struct device *dev, struct device_attribute *attr, \
341 const char *buf, size_t count) \
343 return set_fan_div(dev, buf, count, offset - 1); \
345 static ssize_t get_pwm##offset (struct device *dev, struct device_attribute *attr, char *buf) \
347 return get_pwm(dev, buf, offset - 1); \
349 static ssize_t set_pwm##offset (struct device *dev, struct device_attribute *attr, \
350 const char *buf, size_t count) \
352 return set_pwm(dev, buf, count, offset - 1); \
354 static ssize_t get_pwm##offset##_en (struct device *dev, struct device_attribute *attr, char *buf) \
356 return get_pwm_en(dev, buf, offset - 1); \
358 static ssize_t set_pwm##offset##_en (struct device *dev, struct device_attribute *attr, \
359 const char *buf, size_t count) \
361 return set_pwm_en(dev, buf, count, offset - 1); \
363 static DEVICE_ATTR(fan##offset##_input, S_IRUGO, get_fan##offset, \
364 NULL); \
365 static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
366 get_fan##offset##_min, set_fan##offset##_min); \
367 static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
368 get_fan##offset##_div, set_fan##offset##_div); \
369 static DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \
370 get_pwm##offset, set_pwm##offset); \
371 static DEVICE_ATTR(pwm##offset##_enable, S_IRUGO | S_IWUSR, \
372 get_pwm##offset##_en, set_pwm##offset##_en);
374 fan_present(1);
375 fan_present(2);
376 fan_present(3);
378 static DEVICE_ATTR(alarms, S_IRUGO, get_alarms, NULL);
380 /* Almost all sysfs files may or may not be created depending on the chip
381 setup so we create them individually. It is still convenient to define a
382 group to remove them all at once. */
383 static struct attribute *smsc47m1_attributes[] = {
384 &dev_attr_fan1_input.attr,
385 &dev_attr_fan1_min.attr,
386 &dev_attr_fan1_div.attr,
387 &dev_attr_fan2_input.attr,
388 &dev_attr_fan2_min.attr,
389 &dev_attr_fan2_div.attr,
390 &dev_attr_fan3_input.attr,
391 &dev_attr_fan3_min.attr,
392 &dev_attr_fan3_div.attr,
394 &dev_attr_pwm1.attr,
395 &dev_attr_pwm1_enable.attr,
396 &dev_attr_pwm2.attr,
397 &dev_attr_pwm2_enable.attr,
398 &dev_attr_pwm3.attr,
399 &dev_attr_pwm3_enable.attr,
401 &dev_attr_alarms.attr,
402 NULL
405 static const struct attribute_group smsc47m1_group = {
406 .attrs = smsc47m1_attributes,
409 static int __init smsc47m1_find(unsigned short *addr)
411 u8 val;
413 superio_enter();
414 devid = superio_inb(SUPERIO_REG_DEVID);
417 * SMSC LPC47M10x/LPC47M112/LPC47M13x (device id 0x59), LPC47M14x
418 * (device id 0x5F) and LPC47B27x (device id 0x51) have fan control.
419 * The LPC47M15x and LPC47M192 chips "with hardware monitoring block"
420 * can do much more besides (device id 0x60).
421 * The LPC47M997 is undocumented, but seems to be compatible with
422 * the LPC47M192, and has the same device id.
423 * The LPC47M292 (device id 0x6B) is somewhat compatible, but it
424 * supports a 3rd fan, and the pin configuration registers are
425 * unfortunately different.
427 switch (devid) {
428 case 0x51:
429 printk(KERN_INFO "smsc47m1: Found SMSC LPC47B27x\n");
430 break;
431 case 0x59:
432 printk(KERN_INFO "smsc47m1: Found SMSC "
433 "LPC47M10x/LPC47M112/LPC47M13x\n");
434 break;
435 case 0x5F:
436 printk(KERN_INFO "smsc47m1: Found SMSC LPC47M14x\n");
437 break;
438 case 0x60:
439 printk(KERN_INFO "smsc47m1: Found SMSC "
440 "LPC47M15x/LPC47M192/LPC47M997\n");
441 break;
442 case 0x6B:
443 printk(KERN_INFO "smsc47m1: Found SMSC LPC47M292\n");
444 break;
445 default:
446 superio_exit();
447 return -ENODEV;
450 superio_select();
451 *addr = (superio_inb(SUPERIO_REG_BASE) << 8)
452 | superio_inb(SUPERIO_REG_BASE + 1);
453 val = superio_inb(SUPERIO_REG_ACT);
454 if (*addr == 0 || (val & 0x01) == 0) {
455 printk(KERN_INFO "smsc47m1: Device is disabled, will not use\n");
456 superio_exit();
457 return -ENODEV;
460 superio_exit();
461 return 0;
464 static int smsc47m1_detect(struct i2c_adapter *adapter)
466 struct i2c_client *new_client;
467 struct smsc47m1_data *data;
468 int err = 0;
469 int fan1, fan2, fan3, pwm1, pwm2, pwm3;
471 if (!request_region(address, SMSC_EXTENT, smsc47m1_driver.driver.name)) {
472 dev_err(&adapter->dev, "Region 0x%x already in use!\n", address);
473 return -EBUSY;
476 if (!(data = kzalloc(sizeof(struct smsc47m1_data), GFP_KERNEL))) {
477 err = -ENOMEM;
478 goto error_release;
481 data->type = devid == 0x6B ? smsc47m2 : smsc47m1;
482 new_client = &data->client;
483 i2c_set_clientdata(new_client, data);
484 new_client->addr = address;
485 new_client->adapter = adapter;
486 new_client->driver = &smsc47m1_driver;
487 new_client->flags = 0;
489 strlcpy(new_client->name,
490 data->type == smsc47m2 ? "smsc47m2" : "smsc47m1",
491 I2C_NAME_SIZE);
492 mutex_init(&data->update_lock);
494 /* If no function is properly configured, there's no point in
495 actually registering the chip. */
496 pwm1 = (smsc47m1_read_value(new_client, SMSC47M1_REG_PPIN(0)) & 0x05)
497 == 0x04;
498 pwm2 = (smsc47m1_read_value(new_client, SMSC47M1_REG_PPIN(1)) & 0x05)
499 == 0x04;
500 if (data->type == smsc47m2) {
501 fan1 = (smsc47m1_read_value(new_client, SMSC47M2_REG_TPIN1)
502 & 0x0d) == 0x09;
503 fan2 = (smsc47m1_read_value(new_client, SMSC47M2_REG_TPIN2)
504 & 0x0d) == 0x09;
505 fan3 = (smsc47m1_read_value(new_client, SMSC47M2_REG_TPIN3)
506 & 0x0d) == 0x0d;
507 pwm3 = (smsc47m1_read_value(new_client, SMSC47M2_REG_PPIN3)
508 & 0x0d) == 0x08;
509 } else {
510 fan1 = (smsc47m1_read_value(new_client, SMSC47M1_REG_TPIN(0))
511 & 0x05) == 0x05;
512 fan2 = (smsc47m1_read_value(new_client, SMSC47M1_REG_TPIN(1))
513 & 0x05) == 0x05;
514 fan3 = 0;
515 pwm3 = 0;
517 if (!(fan1 || fan2 || fan3 || pwm1 || pwm2 || pwm3)) {
518 dev_warn(&adapter->dev, "Device at 0x%x is not configured, "
519 "will not use\n", new_client->addr);
520 err = -ENODEV;
521 goto error_free;
524 if ((err = i2c_attach_client(new_client)))
525 goto error_free;
527 /* Some values (fan min, clock dividers, pwm registers) may be
528 needed before any update is triggered, so we better read them
529 at least once here. We don't usually do it that way, but in
530 this particular case, manually reading 5 registers out of 8
531 doesn't make much sense and we're better using the existing
532 function. */
533 smsc47m1_update_device(&new_client->dev, 1);
535 /* Register sysfs hooks */
536 if (fan1) {
537 if ((err = device_create_file(&new_client->dev,
538 &dev_attr_fan1_input))
539 || (err = device_create_file(&new_client->dev,
540 &dev_attr_fan1_min))
541 || (err = device_create_file(&new_client->dev,
542 &dev_attr_fan1_div)))
543 goto error_remove_files;
544 } else
545 dev_dbg(&new_client->dev, "Fan 1 not enabled by hardware, "
546 "skipping\n");
548 if (fan2) {
549 if ((err = device_create_file(&new_client->dev,
550 &dev_attr_fan2_input))
551 || (err = device_create_file(&new_client->dev,
552 &dev_attr_fan2_min))
553 || (err = device_create_file(&new_client->dev,
554 &dev_attr_fan2_div)))
555 goto error_remove_files;
556 } else
557 dev_dbg(&new_client->dev, "Fan 2 not enabled by hardware, "
558 "skipping\n");
560 if (fan3) {
561 if ((err = device_create_file(&new_client->dev,
562 &dev_attr_fan3_input))
563 || (err = device_create_file(&new_client->dev,
564 &dev_attr_fan3_min))
565 || (err = device_create_file(&new_client->dev,
566 &dev_attr_fan3_div)))
567 goto error_remove_files;
568 } else
569 dev_dbg(&new_client->dev, "Fan 3 not enabled by hardware, "
570 "skipping\n");
572 if (pwm1) {
573 if ((err = device_create_file(&new_client->dev,
574 &dev_attr_pwm1))
575 || (err = device_create_file(&new_client->dev,
576 &dev_attr_pwm1_enable)))
577 goto error_remove_files;
578 } else
579 dev_dbg(&new_client->dev, "PWM 1 not enabled by hardware, "
580 "skipping\n");
582 if (pwm2) {
583 if ((err = device_create_file(&new_client->dev,
584 &dev_attr_pwm2))
585 || (err = device_create_file(&new_client->dev,
586 &dev_attr_pwm2_enable)))
587 goto error_remove_files;
588 } else
589 dev_dbg(&new_client->dev, "PWM 2 not enabled by hardware, "
590 "skipping\n");
592 if (pwm3) {
593 if ((err = device_create_file(&new_client->dev,
594 &dev_attr_pwm3))
595 || (err = device_create_file(&new_client->dev,
596 &dev_attr_pwm3_enable)))
597 goto error_remove_files;
598 } else
599 dev_dbg(&new_client->dev, "PWM 3 not enabled by hardware, "
600 "skipping\n");
602 if ((err = device_create_file(&new_client->dev, &dev_attr_alarms)))
603 goto error_remove_files;
605 data->class_dev = hwmon_device_register(&new_client->dev);
606 if (IS_ERR(data->class_dev)) {
607 err = PTR_ERR(data->class_dev);
608 goto error_remove_files;
611 return 0;
613 error_remove_files:
614 sysfs_remove_group(&new_client->dev.kobj, &smsc47m1_group);
615 i2c_detach_client(new_client);
616 error_free:
617 kfree(data);
618 error_release:
619 release_region(address, SMSC_EXTENT);
620 return err;
623 static int smsc47m1_detach_client(struct i2c_client *client)
625 struct smsc47m1_data *data = i2c_get_clientdata(client);
626 int err;
628 hwmon_device_unregister(data->class_dev);
629 sysfs_remove_group(&client->dev.kobj, &smsc47m1_group);
631 if ((err = i2c_detach_client(client)))
632 return err;
634 release_region(client->addr, SMSC_EXTENT);
635 kfree(data);
637 return 0;
640 static struct smsc47m1_data *smsc47m1_update_device(struct device *dev,
641 int init)
643 struct i2c_client *client = to_i2c_client(dev);
644 struct smsc47m1_data *data = i2c_get_clientdata(client);
646 mutex_lock(&data->update_lock);
648 if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || init) {
649 int i, fan_nr;
650 fan_nr = data->type == smsc47m2 ? 3 : 2;
652 for (i = 0; i < fan_nr; i++) {
653 data->fan[i] = smsc47m1_read_value(client,
654 SMSC47M1_REG_FAN[i]);
655 data->fan_preload[i] = smsc47m1_read_value(client,
656 SMSC47M1_REG_FAN_PRELOAD[i]);
657 data->pwm[i] = smsc47m1_read_value(client,
658 SMSC47M1_REG_PWM[i]);
661 i = smsc47m1_read_value(client, SMSC47M1_REG_FANDIV);
662 data->fan_div[0] = (i >> 4) & 0x03;
663 data->fan_div[1] = i >> 6;
665 data->alarms = smsc47m1_read_value(client,
666 SMSC47M1_REG_ALARM) >> 6;
667 /* Clear alarms if needed */
668 if (data->alarms)
669 smsc47m1_write_value(client, SMSC47M1_REG_ALARM, 0xC0);
671 if (fan_nr >= 3) {
672 data->fan_div[2] = (smsc47m1_read_value(client,
673 SMSC47M2_REG_FANDIV3) >> 4) & 0x03;
674 data->alarms |= (smsc47m1_read_value(client,
675 SMSC47M2_REG_ALARM6) & 0x40) >> 4;
676 /* Clear alarm if needed */
677 if (data->alarms & 0x04)
678 smsc47m1_write_value(client,
679 SMSC47M2_REG_ALARM6,
680 0x40);
683 data->last_updated = jiffies;
686 mutex_unlock(&data->update_lock);
687 return data;
690 static int __init sm_smsc47m1_init(void)
692 if (smsc47m1_find(&address)) {
693 return -ENODEV;
696 return i2c_isa_add_driver(&smsc47m1_driver);
699 static void __exit sm_smsc47m1_exit(void)
701 i2c_isa_del_driver(&smsc47m1_driver);
704 MODULE_AUTHOR("Mark D. Studebaker <mdsxyz123@yahoo.com>");
705 MODULE_DESCRIPTION("SMSC LPC47M1xx fan sensors driver");
706 MODULE_LICENSE("GPL");
708 module_init(sm_smsc47m1_init);
709 module_exit(sm_smsc47m1_exit);