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