]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - drivers/hwmon/smsc47m1.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[mirror_ubuntu-jammy-kernel.git] / drivers / hwmon / smsc47m1.c
1 /*
2 smsc47m1.c - Part of lm_sensors, Linux kernel modules
3 for hardware monitoring
4
5 Supports the SMSC LPC47B27x, LPC47M10x, LPC47M112, LPC47M13x,
6 LPC47M14x, LPC47M15x, LPC47M192, LPC47M292 and LPC47M997
7 Super-I/O chips.
8
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
13
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.
18
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.
23
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.
27 */
28
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 <asm/io.h>
41
42 static unsigned short force_id;
43 module_param(force_id, ushort, 0);
44 MODULE_PARM_DESC(force_id, "Override the detected device ID");
45
46 static struct platform_device *pdev;
47
48 #define DRVNAME "smsc47m1"
49 enum chips { smsc47m1, smsc47m2 };
50
51 /* Super-I/0 registers and commands */
52
53 #define REG 0x2e /* The register to read/write */
54 #define VAL 0x2f /* The value to read/write */
55
56 static inline void
57 superio_outb(int reg, int val)
58 {
59 outb(reg, REG);
60 outb(val, VAL);
61 }
62
63 static inline int
64 superio_inb(int reg)
65 {
66 outb(reg, REG);
67 return inb(VAL);
68 }
69
70 /* logical device for fans is 0x0A */
71 #define superio_select() superio_outb(0x07, 0x0A)
72
73 static inline void
74 superio_enter(void)
75 {
76 outb(0x55, REG);
77 }
78
79 static inline void
80 superio_exit(void)
81 {
82 outb(0xAA, REG);
83 }
84
85 #define SUPERIO_REG_ACT 0x30
86 #define SUPERIO_REG_BASE 0x60
87 #define SUPERIO_REG_DEVID 0x20
88
89 /* Logical device registers */
90
91 #define SMSC_EXTENT 0x80
92
93 /* nr is 0 or 1 in the macros below */
94 #define SMSC47M1_REG_ALARM 0x04
95 #define SMSC47M1_REG_TPIN(nr) (0x34 - (nr))
96 #define SMSC47M1_REG_PPIN(nr) (0x36 - (nr))
97 #define SMSC47M1_REG_FANDIV 0x58
98
99 static const u8 SMSC47M1_REG_FAN[3] = { 0x59, 0x5a, 0x6b };
100 static const u8 SMSC47M1_REG_FAN_PRELOAD[3] = { 0x5b, 0x5c, 0x6c };
101 static const u8 SMSC47M1_REG_PWM[3] = { 0x56, 0x57, 0x69 };
102
103 #define SMSC47M2_REG_ALARM6 0x09
104 #define SMSC47M2_REG_TPIN1 0x38
105 #define SMSC47M2_REG_TPIN2 0x37
106 #define SMSC47M2_REG_TPIN3 0x2d
107 #define SMSC47M2_REG_PPIN3 0x2c
108 #define SMSC47M2_REG_FANDIV3 0x6a
109
110 #define MIN_FROM_REG(reg,div) ((reg)>=192 ? 0 : \
111 983040/((192-(reg))*(div)))
112 #define FAN_FROM_REG(reg,div,preload) ((reg)<=(preload) || (reg)==255 ? 0 : \
113 983040/(((reg)-(preload))*(div)))
114 #define DIV_FROM_REG(reg) (1 << (reg))
115 #define PWM_FROM_REG(reg) (((reg) & 0x7E) << 1)
116 #define PWM_EN_FROM_REG(reg) ((~(reg)) & 0x01)
117 #define PWM_TO_REG(reg) (((reg) >> 1) & 0x7E)
118
119 struct smsc47m1_data {
120 unsigned short addr;
121 const char *name;
122 enum chips type;
123 struct device *hwmon_dev;
124
125 struct mutex update_lock;
126 unsigned long last_updated; /* In jiffies */
127
128 u8 fan[3]; /* Register value */
129 u8 fan_preload[3]; /* Register value */
130 u8 fan_div[3]; /* Register encoding, shifted right */
131 u8 alarms; /* Register encoding */
132 u8 pwm[3]; /* Register value (bit 0 is disable) */
133 };
134
135 struct smsc47m1_sio_data {
136 enum chips type;
137 };
138
139
140 static int smsc47m1_probe(struct platform_device *pdev);
141 static int __devexit smsc47m1_remove(struct platform_device *pdev);
142 static struct smsc47m1_data *smsc47m1_update_device(struct device *dev,
143 int init);
144
145 static inline int smsc47m1_read_value(struct smsc47m1_data *data, u8 reg)
146 {
147 return inb_p(data->addr + reg);
148 }
149
150 static inline void smsc47m1_write_value(struct smsc47m1_data *data, u8 reg,
151 u8 value)
152 {
153 outb_p(value, data->addr + reg);
154 }
155
156 static struct platform_driver smsc47m1_driver = {
157 .driver = {
158 .owner = THIS_MODULE,
159 .name = DRVNAME,
160 },
161 .probe = smsc47m1_probe,
162 .remove = __devexit_p(smsc47m1_remove),
163 };
164
165 static ssize_t get_fan(struct device *dev, struct device_attribute
166 *devattr, char *buf)
167 {
168 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
169 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
170 int nr = attr->index;
171 /* This chip (stupidly) stops monitoring fan speed if PWM is
172 enabled and duty cycle is 0%. This is fine if the monitoring
173 and control concern the same fan, but troublesome if they are
174 not (which could as well happen). */
175 int rpm = (data->pwm[nr] & 0x7F) == 0x00 ? 0 :
176 FAN_FROM_REG(data->fan[nr],
177 DIV_FROM_REG(data->fan_div[nr]),
178 data->fan_preload[nr]);
179 return sprintf(buf, "%d\n", rpm);
180 }
181
182 static ssize_t get_fan_min(struct device *dev, struct device_attribute
183 *devattr, char *buf)
184 {
185 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
186 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
187 int nr = attr->index;
188 int rpm = MIN_FROM_REG(data->fan_preload[nr],
189 DIV_FROM_REG(data->fan_div[nr]));
190 return sprintf(buf, "%d\n", rpm);
191 }
192
193 static ssize_t get_fan_div(struct device *dev, struct device_attribute
194 *devattr, char *buf)
195 {
196 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
197 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
198 return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[attr->index]));
199 }
200
201 static ssize_t get_pwm(struct device *dev, struct device_attribute
202 *devattr, char *buf)
203 {
204 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
205 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
206 return sprintf(buf, "%d\n", PWM_FROM_REG(data->pwm[attr->index]));
207 }
208
209 static ssize_t get_pwm_en(struct device *dev, struct device_attribute
210 *devattr, char *buf)
211 {
212 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
213 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
214 return sprintf(buf, "%d\n", PWM_EN_FROM_REG(data->pwm[attr->index]));
215 }
216
217 static ssize_t get_alarms(struct device *dev, struct device_attribute
218 *devattr, char *buf)
219 {
220 struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
221 return sprintf(buf, "%d\n", data->alarms);
222 }
223
224 static ssize_t set_fan_min(struct device *dev, struct device_attribute
225 *devattr, const char *buf, size_t count)
226 {
227 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
228 struct smsc47m1_data *data = dev_get_drvdata(dev);
229 int nr = attr->index;
230 long rpmdiv, val = simple_strtol(buf, NULL, 10);
231
232 mutex_lock(&data->update_lock);
233 rpmdiv = val * DIV_FROM_REG(data->fan_div[nr]);
234
235 if (983040 > 192 * rpmdiv || 2 * rpmdiv > 983040) {
236 mutex_unlock(&data->update_lock);
237 return -EINVAL;
238 }
239
240 data->fan_preload[nr] = 192 - ((983040 + rpmdiv / 2) / rpmdiv);
241 smsc47m1_write_value(data, SMSC47M1_REG_FAN_PRELOAD[nr],
242 data->fan_preload[nr]);
243 mutex_unlock(&data->update_lock);
244
245 return count;
246 }
247
248 /* Note: we save and restore the fan minimum here, because its value is
249 determined in part by the fan clock divider. This follows the principle
250 of least surprise; the user doesn't expect the fan minimum to change just
251 because the divider changed. */
252 static ssize_t set_fan_div(struct device *dev, struct device_attribute
253 *devattr, const char *buf, size_t count)
254 {
255 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
256 struct smsc47m1_data *data = dev_get_drvdata(dev);
257 int nr = attr->index;
258 long new_div = simple_strtol(buf, NULL, 10), tmp;
259 u8 old_div = DIV_FROM_REG(data->fan_div[nr]);
260
261 if (new_div == old_div) /* No change */
262 return count;
263
264 mutex_lock(&data->update_lock);
265 switch (new_div) {
266 case 1: data->fan_div[nr] = 0; break;
267 case 2: data->fan_div[nr] = 1; break;
268 case 4: data->fan_div[nr] = 2; break;
269 case 8: data->fan_div[nr] = 3; break;
270 default:
271 mutex_unlock(&data->update_lock);
272 return -EINVAL;
273 }
274
275 switch (nr) {
276 case 0:
277 case 1:
278 tmp = smsc47m1_read_value(data, SMSC47M1_REG_FANDIV)
279 & ~(0x03 << (4 + 2 * nr));
280 tmp |= data->fan_div[nr] << (4 + 2 * nr);
281 smsc47m1_write_value(data, SMSC47M1_REG_FANDIV, tmp);
282 break;
283 case 2:
284 tmp = smsc47m1_read_value(data, SMSC47M2_REG_FANDIV3) & 0xCF;
285 tmp |= data->fan_div[2] << 4;
286 smsc47m1_write_value(data, SMSC47M2_REG_FANDIV3, tmp);
287 break;
288 }
289
290 /* Preserve fan min */
291 tmp = 192 - (old_div * (192 - data->fan_preload[nr])
292 + new_div / 2) / new_div;
293 data->fan_preload[nr] = SENSORS_LIMIT(tmp, 0, 191);
294 smsc47m1_write_value(data, SMSC47M1_REG_FAN_PRELOAD[nr],
295 data->fan_preload[nr]);
296 mutex_unlock(&data->update_lock);
297
298 return count;
299 }
300
301 static ssize_t set_pwm(struct device *dev, struct device_attribute
302 *devattr, const char *buf, size_t count)
303 {
304 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
305 struct smsc47m1_data *data = dev_get_drvdata(dev);
306 int nr = attr->index;
307 long val = simple_strtol(buf, NULL, 10);
308
309 if (val < 0 || val > 255)
310 return -EINVAL;
311
312 mutex_lock(&data->update_lock);
313 data->pwm[nr] &= 0x81; /* Preserve additional bits */
314 data->pwm[nr] |= PWM_TO_REG(val);
315 smsc47m1_write_value(data, SMSC47M1_REG_PWM[nr],
316 data->pwm[nr]);
317 mutex_unlock(&data->update_lock);
318
319 return count;
320 }
321
322 static ssize_t set_pwm_en(struct device *dev, struct device_attribute
323 *devattr, const char *buf, size_t count)
324 {
325 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
326 struct smsc47m1_data *data = dev_get_drvdata(dev);
327 int nr = attr->index;
328 long val = simple_strtol(buf, NULL, 10);
329
330 if (val != 0 && val != 1)
331 return -EINVAL;
332
333 mutex_lock(&data->update_lock);
334 data->pwm[nr] &= 0xFE; /* preserve the other bits */
335 data->pwm[nr] |= !val;
336 smsc47m1_write_value(data, SMSC47M1_REG_PWM[nr],
337 data->pwm[nr]);
338 mutex_unlock(&data->update_lock);
339
340 return count;
341 }
342
343 #define fan_present(offset) \
344 static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, get_fan, \
345 NULL, offset - 1); \
346 static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
347 get_fan_min, set_fan_min, offset - 1); \
348 static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
349 get_fan_div, set_fan_div, offset - 1); \
350 static SENSOR_DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \
351 get_pwm, set_pwm, offset - 1); \
352 static SENSOR_DEVICE_ATTR(pwm##offset##_enable, S_IRUGO | S_IWUSR, \
353 get_pwm_en, set_pwm_en, offset - 1)
354
355 fan_present(1);
356 fan_present(2);
357 fan_present(3);
358
359 static DEVICE_ATTR(alarms, S_IRUGO, get_alarms, NULL);
360
361 static ssize_t show_name(struct device *dev, struct device_attribute
362 *devattr, char *buf)
363 {
364 struct smsc47m1_data *data = dev_get_drvdata(dev);
365
366 return sprintf(buf, "%s\n", data->name);
367 }
368 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
369
370 /* Almost all sysfs files may or may not be created depending on the chip
371 setup so we create them individually. It is still convenient to define a
372 group to remove them all at once. */
373 static struct attribute *smsc47m1_attributes[] = {
374 &sensor_dev_attr_fan1_input.dev_attr.attr,
375 &sensor_dev_attr_fan1_min.dev_attr.attr,
376 &sensor_dev_attr_fan1_div.dev_attr.attr,
377 &sensor_dev_attr_fan2_input.dev_attr.attr,
378 &sensor_dev_attr_fan2_min.dev_attr.attr,
379 &sensor_dev_attr_fan2_div.dev_attr.attr,
380 &sensor_dev_attr_fan3_input.dev_attr.attr,
381 &sensor_dev_attr_fan3_min.dev_attr.attr,
382 &sensor_dev_attr_fan3_div.dev_attr.attr,
383
384 &sensor_dev_attr_pwm1.dev_attr.attr,
385 &sensor_dev_attr_pwm1_enable.dev_attr.attr,
386 &sensor_dev_attr_pwm2.dev_attr.attr,
387 &sensor_dev_attr_pwm2_enable.dev_attr.attr,
388 &sensor_dev_attr_pwm3.dev_attr.attr,
389 &sensor_dev_attr_pwm3_enable.dev_attr.attr,
390
391 &dev_attr_alarms.attr,
392 &dev_attr_name.attr,
393 NULL
394 };
395
396 static const struct attribute_group smsc47m1_group = {
397 .attrs = smsc47m1_attributes,
398 };
399
400 static int __init smsc47m1_find(unsigned short *addr,
401 struct smsc47m1_sio_data *sio_data)
402 {
403 u8 val;
404
405 superio_enter();
406 val = force_id ? force_id : superio_inb(SUPERIO_REG_DEVID);
407
408 /*
409 * SMSC LPC47M10x/LPC47M112/LPC47M13x (device id 0x59), LPC47M14x
410 * (device id 0x5F) and LPC47B27x (device id 0x51) have fan control.
411 * The LPC47M15x and LPC47M192 chips "with hardware monitoring block"
412 * can do much more besides (device id 0x60).
413 * The LPC47M997 is undocumented, but seems to be compatible with
414 * the LPC47M192, and has the same device id.
415 * The LPC47M292 (device id 0x6B) is somewhat compatible, but it
416 * supports a 3rd fan, and the pin configuration registers are
417 * unfortunately different.
418 */
419 switch (val) {
420 case 0x51:
421 pr_info(DRVNAME ": Found SMSC LPC47B27x\n");
422 sio_data->type = smsc47m1;
423 break;
424 case 0x59:
425 pr_info(DRVNAME ": Found SMSC LPC47M10x/LPC47M112/LPC47M13x\n");
426 sio_data->type = smsc47m1;
427 break;
428 case 0x5F:
429 pr_info(DRVNAME ": Found SMSC LPC47M14x\n");
430 sio_data->type = smsc47m1;
431 break;
432 case 0x60:
433 pr_info(DRVNAME ": Found SMSC LPC47M15x/LPC47M192/LPC47M997\n");
434 sio_data->type = smsc47m1;
435 break;
436 case 0x6B:
437 pr_info(DRVNAME ": Found SMSC LPC47M292\n");
438 sio_data->type = smsc47m2;
439 break;
440 default:
441 superio_exit();
442 return -ENODEV;
443 }
444
445 superio_select();
446 *addr = (superio_inb(SUPERIO_REG_BASE) << 8)
447 | superio_inb(SUPERIO_REG_BASE + 1);
448 val = superio_inb(SUPERIO_REG_ACT);
449 if (*addr == 0 || (val & 0x01) == 0) {
450 pr_info(DRVNAME ": Device is disabled, will not use\n");
451 superio_exit();
452 return -ENODEV;
453 }
454
455 superio_exit();
456 return 0;
457 }
458
459 static int __devinit smsc47m1_probe(struct platform_device *pdev)
460 {
461 struct device *dev = &pdev->dev;
462 struct smsc47m1_sio_data *sio_data = dev->platform_data;
463 struct smsc47m1_data *data;
464 struct resource *res;
465 int err = 0;
466 int fan1, fan2, fan3, pwm1, pwm2, pwm3;
467
468 static const char *names[] = {
469 "smsc47m1",
470 "smsc47m2",
471 };
472
473 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
474 if (!request_region(res->start, SMSC_EXTENT, DRVNAME)) {
475 dev_err(dev, "Region 0x%lx-0x%lx already in use!\n",
476 (unsigned long)res->start,
477 (unsigned long)res->end);
478 return -EBUSY;
479 }
480
481 if (!(data = kzalloc(sizeof(struct smsc47m1_data), GFP_KERNEL))) {
482 err = -ENOMEM;
483 goto error_release;
484 }
485
486 data->addr = res->start;
487 data->type = sio_data->type;
488 data->name = names[sio_data->type];
489 mutex_init(&data->update_lock);
490 platform_set_drvdata(pdev, data);
491
492 /* If no function is properly configured, there's no point in
493 actually registering the chip. */
494 pwm1 = (smsc47m1_read_value(data, SMSC47M1_REG_PPIN(0)) & 0x05)
495 == 0x04;
496 pwm2 = (smsc47m1_read_value(data, SMSC47M1_REG_PPIN(1)) & 0x05)
497 == 0x04;
498 if (data->type == smsc47m2) {
499 fan1 = (smsc47m1_read_value(data, SMSC47M2_REG_TPIN1)
500 & 0x0d) == 0x09;
501 fan2 = (smsc47m1_read_value(data, SMSC47M2_REG_TPIN2)
502 & 0x0d) == 0x09;
503 fan3 = (smsc47m1_read_value(data, SMSC47M2_REG_TPIN3)
504 & 0x0d) == 0x0d;
505 pwm3 = (smsc47m1_read_value(data, SMSC47M2_REG_PPIN3)
506 & 0x0d) == 0x08;
507 } else {
508 fan1 = (smsc47m1_read_value(data, SMSC47M1_REG_TPIN(0))
509 & 0x05) == 0x05;
510 fan2 = (smsc47m1_read_value(data, SMSC47M1_REG_TPIN(1))
511 & 0x05) == 0x05;
512 fan3 = 0;
513 pwm3 = 0;
514 }
515 if (!(fan1 || fan2 || fan3 || pwm1 || pwm2 || pwm3)) {
516 dev_warn(dev, "Device not configured, will not use\n");
517 err = -ENODEV;
518 goto error_free;
519 }
520
521 /* Some values (fan min, clock dividers, pwm registers) may be
522 needed before any update is triggered, so we better read them
523 at least once here. We don't usually do it that way, but in
524 this particular case, manually reading 5 registers out of 8
525 doesn't make much sense and we're better using the existing
526 function. */
527 smsc47m1_update_device(dev, 1);
528
529 /* Register sysfs hooks */
530 if (fan1) {
531 if ((err = device_create_file(dev,
532 &sensor_dev_attr_fan1_input.dev_attr))
533 || (err = device_create_file(dev,
534 &sensor_dev_attr_fan1_min.dev_attr))
535 || (err = device_create_file(dev,
536 &sensor_dev_attr_fan1_div.dev_attr)))
537 goto error_remove_files;
538 } else
539 dev_dbg(dev, "Fan 1 not enabled by hardware, skipping\n");
540
541 if (fan2) {
542 if ((err = device_create_file(dev,
543 &sensor_dev_attr_fan2_input.dev_attr))
544 || (err = device_create_file(dev,
545 &sensor_dev_attr_fan2_min.dev_attr))
546 || (err = device_create_file(dev,
547 &sensor_dev_attr_fan2_div.dev_attr)))
548 goto error_remove_files;
549 } else
550 dev_dbg(dev, "Fan 2 not enabled by hardware, skipping\n");
551
552 if (fan3) {
553 if ((err = device_create_file(dev,
554 &sensor_dev_attr_fan3_input.dev_attr))
555 || (err = device_create_file(dev,
556 &sensor_dev_attr_fan3_min.dev_attr))
557 || (err = device_create_file(dev,
558 &sensor_dev_attr_fan3_div.dev_attr)))
559 goto error_remove_files;
560 } else if (data->type == smsc47m2)
561 dev_dbg(dev, "Fan 3 not enabled by hardware, skipping\n");
562
563 if (pwm1) {
564 if ((err = device_create_file(dev,
565 &sensor_dev_attr_pwm1.dev_attr))
566 || (err = device_create_file(dev,
567 &sensor_dev_attr_pwm1_enable.dev_attr)))
568 goto error_remove_files;
569 } else
570 dev_dbg(dev, "PWM 1 not enabled by hardware, skipping\n");
571
572 if (pwm2) {
573 if ((err = device_create_file(dev,
574 &sensor_dev_attr_pwm2.dev_attr))
575 || (err = device_create_file(dev,
576 &sensor_dev_attr_pwm2_enable.dev_attr)))
577 goto error_remove_files;
578 } else
579 dev_dbg(dev, "PWM 2 not enabled by hardware, skipping\n");
580
581 if (pwm3) {
582 if ((err = device_create_file(dev,
583 &sensor_dev_attr_pwm3.dev_attr))
584 || (err = device_create_file(dev,
585 &sensor_dev_attr_pwm3_enable.dev_attr)))
586 goto error_remove_files;
587 } else if (data->type == smsc47m2)
588 dev_dbg(dev, "PWM 3 not enabled by hardware, skipping\n");
589
590 if ((err = device_create_file(dev, &dev_attr_alarms)))
591 goto error_remove_files;
592 if ((err = device_create_file(dev, &dev_attr_name)))
593 goto error_remove_files;
594
595 data->hwmon_dev = hwmon_device_register(dev);
596 if (IS_ERR(data->hwmon_dev)) {
597 err = PTR_ERR(data->hwmon_dev);
598 goto error_remove_files;
599 }
600
601 return 0;
602
603 error_remove_files:
604 sysfs_remove_group(&dev->kobj, &smsc47m1_group);
605 error_free:
606 platform_set_drvdata(pdev, NULL);
607 kfree(data);
608 error_release:
609 release_region(res->start, SMSC_EXTENT);
610 return err;
611 }
612
613 static int __devexit smsc47m1_remove(struct platform_device *pdev)
614 {
615 struct smsc47m1_data *data = platform_get_drvdata(pdev);
616 struct resource *res;
617
618 hwmon_device_unregister(data->hwmon_dev);
619 sysfs_remove_group(&pdev->dev.kobj, &smsc47m1_group);
620
621 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
622 release_region(res->start, SMSC_EXTENT);
623 platform_set_drvdata(pdev, NULL);
624 kfree(data);
625
626 return 0;
627 }
628
629 static struct smsc47m1_data *smsc47m1_update_device(struct device *dev,
630 int init)
631 {
632 struct smsc47m1_data *data = dev_get_drvdata(dev);
633
634 mutex_lock(&data->update_lock);
635
636 if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || init) {
637 int i, fan_nr;
638 fan_nr = data->type == smsc47m2 ? 3 : 2;
639
640 for (i = 0; i < fan_nr; i++) {
641 data->fan[i] = smsc47m1_read_value(data,
642 SMSC47M1_REG_FAN[i]);
643 data->fan_preload[i] = smsc47m1_read_value(data,
644 SMSC47M1_REG_FAN_PRELOAD[i]);
645 data->pwm[i] = smsc47m1_read_value(data,
646 SMSC47M1_REG_PWM[i]);
647 }
648
649 i = smsc47m1_read_value(data, SMSC47M1_REG_FANDIV);
650 data->fan_div[0] = (i >> 4) & 0x03;
651 data->fan_div[1] = i >> 6;
652
653 data->alarms = smsc47m1_read_value(data,
654 SMSC47M1_REG_ALARM) >> 6;
655 /* Clear alarms if needed */
656 if (data->alarms)
657 smsc47m1_write_value(data, SMSC47M1_REG_ALARM, 0xC0);
658
659 if (fan_nr >= 3) {
660 data->fan_div[2] = (smsc47m1_read_value(data,
661 SMSC47M2_REG_FANDIV3) >> 4) & 0x03;
662 data->alarms |= (smsc47m1_read_value(data,
663 SMSC47M2_REG_ALARM6) & 0x40) >> 4;
664 /* Clear alarm if needed */
665 if (data->alarms & 0x04)
666 smsc47m1_write_value(data,
667 SMSC47M2_REG_ALARM6,
668 0x40);
669 }
670
671 data->last_updated = jiffies;
672 }
673
674 mutex_unlock(&data->update_lock);
675 return data;
676 }
677
678 static int __init smsc47m1_device_add(unsigned short address,
679 const struct smsc47m1_sio_data *sio_data)
680 {
681 struct resource res = {
682 .start = address,
683 .end = address + SMSC_EXTENT - 1,
684 .name = DRVNAME,
685 .flags = IORESOURCE_IO,
686 };
687 int err;
688
689 pdev = platform_device_alloc(DRVNAME, address);
690 if (!pdev) {
691 err = -ENOMEM;
692 printk(KERN_ERR DRVNAME ": Device allocation failed\n");
693 goto exit;
694 }
695
696 err = platform_device_add_resources(pdev, &res, 1);
697 if (err) {
698 printk(KERN_ERR DRVNAME ": Device resource addition failed "
699 "(%d)\n", err);
700 goto exit_device_put;
701 }
702
703 err = platform_device_add_data(pdev, sio_data,
704 sizeof(struct smsc47m1_sio_data));
705 if (err) {
706 printk(KERN_ERR DRVNAME ": Platform data allocation failed\n");
707 goto exit_device_put;
708 }
709
710 err = platform_device_add(pdev);
711 if (err) {
712 printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n",
713 err);
714 goto exit_device_put;
715 }
716
717 return 0;
718
719 exit_device_put:
720 platform_device_put(pdev);
721 exit:
722 return err;
723 }
724
725 static int __init sm_smsc47m1_init(void)
726 {
727 int err;
728 unsigned short address;
729 struct smsc47m1_sio_data sio_data;
730
731 if (smsc47m1_find(&address, &sio_data))
732 return -ENODEV;
733
734 err = platform_driver_register(&smsc47m1_driver);
735 if (err)
736 goto exit;
737
738 /* Sets global pdev as a side effect */
739 err = smsc47m1_device_add(address, &sio_data);
740 if (err)
741 goto exit_driver;
742
743 return 0;
744
745 exit_driver:
746 platform_driver_unregister(&smsc47m1_driver);
747 exit:
748 return err;
749 }
750
751 static void __exit sm_smsc47m1_exit(void)
752 {
753 platform_device_unregister(pdev);
754 platform_driver_unregister(&smsc47m1_driver);
755 }
756
757 MODULE_AUTHOR("Mark D. Studebaker <mdsxyz123@yahoo.com>");
758 MODULE_DESCRIPTION("SMSC LPC47M1xx fan sensors driver");
759 MODULE_LICENSE("GPL");
760
761 module_init(sm_smsc47m1_init);
762 module_exit(sm_smsc47m1_exit);