xref: /linux/drivers/hwmon/f71805f.c (revision c537b994505099b7197e7d3125b942ecbcc51eb6)
1 /*
2  * f71805f.c - driver for the Fintek F71805F/FG and F71872F/FG Super-I/O
3  *             chips integrated hardware monitoring features
4  * Copyright (C) 2005-2006  Jean Delvare <khali@linux-fr.org>
5  *
6  * The F71805F/FG is a LPC Super-I/O chip made by Fintek. It integrates
7  * complete hardware monitoring features: voltage, fan and temperature
8  * sensors, and manual and automatic fan speed control.
9  *
10  * The F71872F/FG is almost the same, with two more voltages monitored,
11  * and 6 VID inputs.
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 2 of the License, or
16  * (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26  */
27 
28 #include <linux/module.h>
29 #include <linux/init.h>
30 #include <linux/slab.h>
31 #include <linux/jiffies.h>
32 #include <linux/platform_device.h>
33 #include <linux/hwmon.h>
34 #include <linux/hwmon-sysfs.h>
35 #include <linux/err.h>
36 #include <linux/mutex.h>
37 #include <linux/sysfs.h>
38 #include <asm/io.h>
39 
40 static struct platform_device *pdev;
41 
42 #define DRVNAME "f71805f"
43 enum kinds { f71805f, f71872f };
44 
45 /*
46  * Super-I/O constants and functions
47  */
48 
49 #define F71805F_LD_HWM		0x04
50 
51 #define SIO_REG_LDSEL		0x07	/* Logical device select */
52 #define SIO_REG_DEVID		0x20	/* Device ID (2 bytes) */
53 #define SIO_REG_DEVREV		0x22	/* Device revision */
54 #define SIO_REG_MANID		0x23	/* Fintek ID (2 bytes) */
55 #define SIO_REG_FNSEL1		0x29	/* Multi Function Select 1 (F71872F) */
56 #define SIO_REG_ENABLE		0x30	/* Logical device enable */
57 #define SIO_REG_ADDR		0x60	/* Logical device address (2 bytes) */
58 
59 #define SIO_FINTEK_ID		0x1934
60 #define SIO_F71805F_ID		0x0406
61 #define SIO_F71872F_ID		0x0341
62 
63 static inline int
64 superio_inb(int base, int reg)
65 {
66 	outb(reg, base);
67 	return inb(base + 1);
68 }
69 
70 static int
71 superio_inw(int base, int reg)
72 {
73 	int val;
74 	outb(reg++, base);
75 	val = inb(base + 1) << 8;
76 	outb(reg, base);
77 	val |= inb(base + 1);
78 	return val;
79 }
80 
81 static inline void
82 superio_select(int base, int ld)
83 {
84 	outb(SIO_REG_LDSEL, base);
85 	outb(ld, base + 1);
86 }
87 
88 static inline void
89 superio_enter(int base)
90 {
91 	outb(0x87, base);
92 	outb(0x87, base);
93 }
94 
95 static inline void
96 superio_exit(int base)
97 {
98 	outb(0xaa, base);
99 }
100 
101 /*
102  * ISA constants
103  */
104 
105 #define REGION_LENGTH		8
106 #define ADDR_REG_OFFSET		5
107 #define DATA_REG_OFFSET		6
108 
109 /*
110  * Registers
111  */
112 
113 /* in nr from 0 to 10 (8-bit values) */
114 #define F71805F_REG_IN(nr)		(0x10 + (nr))
115 #define F71805F_REG_IN_HIGH(nr)		((nr) < 10 ? 0x40 + 2 * (nr) : 0x2E)
116 #define F71805F_REG_IN_LOW(nr)		((nr) < 10 ? 0x41 + 2 * (nr) : 0x2F)
117 /* fan nr from 0 to 2 (12-bit values, two registers) */
118 #define F71805F_REG_FAN(nr)		(0x20 + 2 * (nr))
119 #define F71805F_REG_FAN_LOW(nr)		(0x28 + 2 * (nr))
120 #define F71805F_REG_FAN_TARGET(nr)	(0x69 + 16 * (nr))
121 #define F71805F_REG_FAN_CTRL(nr)	(0x60 + 16 * (nr))
122 #define F71805F_REG_PWM_FREQ(nr)	(0x63 + 16 * (nr))
123 #define F71805F_REG_PWM_DUTY(nr)	(0x6B + 16 * (nr))
124 /* temp nr from 0 to 2 (8-bit values) */
125 #define F71805F_REG_TEMP(nr)		(0x1B + (nr))
126 #define F71805F_REG_TEMP_HIGH(nr)	(0x54 + 2 * (nr))
127 #define F71805F_REG_TEMP_HYST(nr)	(0x55 + 2 * (nr))
128 #define F71805F_REG_TEMP_MODE		0x01
129 
130 #define F71805F_REG_START		0x00
131 /* status nr from 0 to 2 */
132 #define F71805F_REG_STATUS(nr)		(0x36 + (nr))
133 
134 /* individual register bits */
135 #define FAN_CTRL_DC_MODE		0x10
136 #define FAN_CTRL_LATCH_FULL		0x08
137 #define FAN_CTRL_MODE_MASK		0x03
138 #define FAN_CTRL_MODE_SPEED		0x00
139 #define FAN_CTRL_MODE_TEMPERATURE	0x01
140 #define FAN_CTRL_MODE_MANUAL		0x02
141 
142 /*
143  * Data structures and manipulation thereof
144  */
145 
146 struct f71805f_data {
147 	unsigned short addr;
148 	const char *name;
149 	struct class_device *class_dev;
150 
151 	struct mutex update_lock;
152 	char valid;		/* !=0 if following fields are valid */
153 	unsigned long last_updated;	/* In jiffies */
154 	unsigned long last_limits;	/* In jiffies */
155 
156 	/* Register values */
157 	u8 in[11];
158 	u8 in_high[11];
159 	u8 in_low[11];
160 	u16 has_in;
161 	u16 fan[3];
162 	u16 fan_low[3];
163 	u16 fan_target[3];
164 	u8 fan_ctrl[3];
165 	u8 pwm[3];
166 	u8 pwm_freq[3];
167 	u8 temp[3];
168 	u8 temp_high[3];
169 	u8 temp_hyst[3];
170 	u8 temp_mode;
171 	unsigned long alarms;
172 };
173 
174 struct f71805f_sio_data {
175 	enum kinds kind;
176 	u8 fnsel1;
177 };
178 
179 static inline long in_from_reg(u8 reg)
180 {
181 	return (reg * 8);
182 }
183 
184 /* The 2 least significant bits are not used */
185 static inline u8 in_to_reg(long val)
186 {
187 	if (val <= 0)
188 		return 0;
189 	if (val >= 2016)
190 		return 0xfc;
191 	return (((val + 16) / 32) << 2);
192 }
193 
194 /* in0 is downscaled by a factor 2 internally */
195 static inline long in0_from_reg(u8 reg)
196 {
197 	return (reg * 16);
198 }
199 
200 static inline u8 in0_to_reg(long val)
201 {
202 	if (val <= 0)
203 		return 0;
204 	if (val >= 4032)
205 		return 0xfc;
206 	return (((val + 32) / 64) << 2);
207 }
208 
209 /* The 4 most significant bits are not used */
210 static inline long fan_from_reg(u16 reg)
211 {
212 	reg &= 0xfff;
213 	if (!reg || reg == 0xfff)
214 		return 0;
215 	return (1500000 / reg);
216 }
217 
218 static inline u16 fan_to_reg(long rpm)
219 {
220 	/* If the low limit is set below what the chip can measure,
221 	   store the largest possible 12-bit value in the registers,
222 	   so that no alarm will ever trigger. */
223 	if (rpm < 367)
224 		return 0xfff;
225 	return (1500000 / rpm);
226 }
227 
228 static inline unsigned long pwm_freq_from_reg(u8 reg)
229 {
230 	unsigned long clock = (reg & 0x80) ? 48000000UL : 1000000UL;
231 
232 	reg &= 0x7f;
233 	if (reg == 0)
234 		reg++;
235 	return clock / (reg << 8);
236 }
237 
238 static inline u8 pwm_freq_to_reg(unsigned long val)
239 {
240 	if (val >= 187500)	/* The highest we can do */
241 		return 0x80;
242 	if (val >= 1475)	/* Use 48 MHz clock */
243 		return 0x80 | (48000000UL / (val << 8));
244 	if (val < 31)		/* The lowest we can do */
245 		return 0x7f;
246 	else			/* Use 1 MHz clock */
247 		return 1000000UL / (val << 8);
248 }
249 
250 static inline int pwm_mode_from_reg(u8 reg)
251 {
252 	return !(reg & FAN_CTRL_DC_MODE);
253 }
254 
255 static inline long temp_from_reg(u8 reg)
256 {
257 	return (reg * 1000);
258 }
259 
260 static inline u8 temp_to_reg(long val)
261 {
262 	if (val < 0)
263 		val = 0;
264 	else if (val > 1000 * 0xff)
265 		val = 0xff;
266 	return ((val + 500) / 1000);
267 }
268 
269 /*
270  * Device I/O access
271  */
272 
273 /* Must be called with data->update_lock held, except during initialization */
274 static u8 f71805f_read8(struct f71805f_data *data, u8 reg)
275 {
276 	outb(reg, data->addr + ADDR_REG_OFFSET);
277 	return inb(data->addr + DATA_REG_OFFSET);
278 }
279 
280 /* Must be called with data->update_lock held, except during initialization */
281 static void f71805f_write8(struct f71805f_data *data, u8 reg, u8 val)
282 {
283 	outb(reg, data->addr + ADDR_REG_OFFSET);
284 	outb(val, data->addr + DATA_REG_OFFSET);
285 }
286 
287 /* It is important to read the MSB first, because doing so latches the
288    value of the LSB, so we are sure both bytes belong to the same value.
289    Must be called with data->update_lock held, except during initialization */
290 static u16 f71805f_read16(struct f71805f_data *data, u8 reg)
291 {
292 	u16 val;
293 
294 	outb(reg, data->addr + ADDR_REG_OFFSET);
295 	val = inb(data->addr + DATA_REG_OFFSET) << 8;
296 	outb(++reg, data->addr + ADDR_REG_OFFSET);
297 	val |= inb(data->addr + DATA_REG_OFFSET);
298 
299 	return val;
300 }
301 
302 /* Must be called with data->update_lock held, except during initialization */
303 static void f71805f_write16(struct f71805f_data *data, u8 reg, u16 val)
304 {
305 	outb(reg, data->addr + ADDR_REG_OFFSET);
306 	outb(val >> 8, data->addr + DATA_REG_OFFSET);
307 	outb(++reg, data->addr + ADDR_REG_OFFSET);
308 	outb(val & 0xff, data->addr + DATA_REG_OFFSET);
309 }
310 
311 static struct f71805f_data *f71805f_update_device(struct device *dev)
312 {
313 	struct f71805f_data *data = dev_get_drvdata(dev);
314 	int nr;
315 
316 	mutex_lock(&data->update_lock);
317 
318 	/* Limit registers cache is refreshed after 60 seconds */
319 	if (time_after(jiffies, data->last_updated + 60 * HZ)
320 	 || !data->valid) {
321 		for (nr = 0; nr < 11; nr++) {
322 			if (!(data->has_in & (1 << nr)))
323 				continue;
324 			data->in_high[nr] = f71805f_read8(data,
325 					    F71805F_REG_IN_HIGH(nr));
326 			data->in_low[nr] = f71805f_read8(data,
327 					   F71805F_REG_IN_LOW(nr));
328 		}
329 		for (nr = 0; nr < 3; nr++) {
330 			data->fan_low[nr] = f71805f_read16(data,
331 					    F71805F_REG_FAN_LOW(nr));
332 			data->fan_target[nr] = f71805f_read16(data,
333 					       F71805F_REG_FAN_TARGET(nr));
334 			data->pwm_freq[nr] = f71805f_read8(data,
335 					     F71805F_REG_PWM_FREQ(nr));
336 		}
337 		for (nr = 0; nr < 3; nr++) {
338 			data->temp_high[nr] = f71805f_read8(data,
339 					      F71805F_REG_TEMP_HIGH(nr));
340 			data->temp_hyst[nr] = f71805f_read8(data,
341 					      F71805F_REG_TEMP_HYST(nr));
342 		}
343 		data->temp_mode = f71805f_read8(data, F71805F_REG_TEMP_MODE);
344 
345 		data->last_limits = jiffies;
346 	}
347 
348 	/* Measurement registers cache is refreshed after 1 second */
349 	if (time_after(jiffies, data->last_updated + HZ)
350 	 || !data->valid) {
351 		for (nr = 0; nr < 11; nr++) {
352 			if (!(data->has_in & (1 << nr)))
353 				continue;
354 			data->in[nr] = f71805f_read8(data,
355 				       F71805F_REG_IN(nr));
356 		}
357 		for (nr = 0; nr < 3; nr++) {
358 			data->fan[nr] = f71805f_read16(data,
359 					F71805F_REG_FAN(nr));
360 			data->fan_ctrl[nr] = f71805f_read8(data,
361 					     F71805F_REG_FAN_CTRL(nr));
362 			data->pwm[nr] = f71805f_read8(data,
363 					F71805F_REG_PWM_DUTY(nr));
364 		}
365 		for (nr = 0; nr < 3; nr++) {
366 			data->temp[nr] = f71805f_read8(data,
367 					 F71805F_REG_TEMP(nr));
368 		}
369 		data->alarms = f71805f_read8(data, F71805F_REG_STATUS(0))
370 			+ (f71805f_read8(data, F71805F_REG_STATUS(1)) << 8)
371 			+ (f71805f_read8(data, F71805F_REG_STATUS(2)) << 16);
372 
373 		data->last_updated = jiffies;
374 		data->valid = 1;
375 	}
376 
377 	mutex_unlock(&data->update_lock);
378 
379 	return data;
380 }
381 
382 /*
383  * Sysfs interface
384  */
385 
386 static ssize_t show_in0(struct device *dev, struct device_attribute *devattr,
387 			char *buf)
388 {
389 	struct f71805f_data *data = f71805f_update_device(dev);
390 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
391 	int nr = attr->index;
392 
393 	return sprintf(buf, "%ld\n", in0_from_reg(data->in[nr]));
394 }
395 
396 static ssize_t show_in0_max(struct device *dev, struct device_attribute
397 			    *devattr, char *buf)
398 {
399 	struct f71805f_data *data = f71805f_update_device(dev);
400 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
401 	int nr = attr->index;
402 
403 	return sprintf(buf, "%ld\n", in0_from_reg(data->in_high[nr]));
404 }
405 
406 static ssize_t show_in0_min(struct device *dev, struct device_attribute
407 			    *devattr, char *buf)
408 {
409 	struct f71805f_data *data = f71805f_update_device(dev);
410 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
411 	int nr = attr->index;
412 
413 	return sprintf(buf, "%ld\n", in0_from_reg(data->in_low[nr]));
414 }
415 
416 static ssize_t set_in0_max(struct device *dev, struct device_attribute
417 			   *devattr, const char *buf, size_t count)
418 {
419 	struct f71805f_data *data = dev_get_drvdata(dev);
420 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
421 	int nr = attr->index;
422 	long val = simple_strtol(buf, NULL, 10);
423 
424 	mutex_lock(&data->update_lock);
425 	data->in_high[nr] = in0_to_reg(val);
426 	f71805f_write8(data, F71805F_REG_IN_HIGH(nr), data->in_high[nr]);
427 	mutex_unlock(&data->update_lock);
428 
429 	return count;
430 }
431 
432 static ssize_t set_in0_min(struct device *dev, struct device_attribute
433 			   *devattr, const char *buf, size_t count)
434 {
435 	struct f71805f_data *data = dev_get_drvdata(dev);
436 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
437 	int nr = attr->index;
438 	long val = simple_strtol(buf, NULL, 10);
439 
440 	mutex_lock(&data->update_lock);
441 	data->in_low[nr] = in0_to_reg(val);
442 	f71805f_write8(data, F71805F_REG_IN_LOW(nr), data->in_low[nr]);
443 	mutex_unlock(&data->update_lock);
444 
445 	return count;
446 }
447 
448 static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
449 		       char *buf)
450 {
451 	struct f71805f_data *data = f71805f_update_device(dev);
452 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
453 	int nr = attr->index;
454 
455 	return sprintf(buf, "%ld\n", in_from_reg(data->in[nr]));
456 }
457 
458 static ssize_t show_in_max(struct device *dev, struct device_attribute
459 			   *devattr, char *buf)
460 {
461 	struct f71805f_data *data = f71805f_update_device(dev);
462 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
463 	int nr = attr->index;
464 
465 	return sprintf(buf, "%ld\n", in_from_reg(data->in_high[nr]));
466 }
467 
468 static ssize_t show_in_min(struct device *dev, struct device_attribute
469 			   *devattr, char *buf)
470 {
471 	struct f71805f_data *data = f71805f_update_device(dev);
472 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
473 	int nr = attr->index;
474 
475 	return sprintf(buf, "%ld\n", in_from_reg(data->in_low[nr]));
476 }
477 
478 static ssize_t set_in_max(struct device *dev, struct device_attribute
479 			  *devattr, const char *buf, size_t count)
480 {
481 	struct f71805f_data *data = dev_get_drvdata(dev);
482 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
483 	int nr = attr->index;
484 	long val = simple_strtol(buf, NULL, 10);
485 
486 	mutex_lock(&data->update_lock);
487 	data->in_high[nr] = in_to_reg(val);
488 	f71805f_write8(data, F71805F_REG_IN_HIGH(nr), data->in_high[nr]);
489 	mutex_unlock(&data->update_lock);
490 
491 	return count;
492 }
493 
494 static ssize_t set_in_min(struct device *dev, struct device_attribute
495 			  *devattr, const char *buf, size_t count)
496 {
497 	struct f71805f_data *data = dev_get_drvdata(dev);
498 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
499 	int nr = attr->index;
500 	long val = simple_strtol(buf, NULL, 10);
501 
502 	mutex_lock(&data->update_lock);
503 	data->in_low[nr] = in_to_reg(val);
504 	f71805f_write8(data, F71805F_REG_IN_LOW(nr), data->in_low[nr]);
505 	mutex_unlock(&data->update_lock);
506 
507 	return count;
508 }
509 
510 static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
511 			char *buf)
512 {
513 	struct f71805f_data *data = f71805f_update_device(dev);
514 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
515 	int nr = attr->index;
516 
517 	return sprintf(buf, "%ld\n", fan_from_reg(data->fan[nr]));
518 }
519 
520 static ssize_t show_fan_min(struct device *dev, struct device_attribute
521 			    *devattr, char *buf)
522 {
523 	struct f71805f_data *data = f71805f_update_device(dev);
524 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
525 	int nr = attr->index;
526 
527 	return sprintf(buf, "%ld\n", fan_from_reg(data->fan_low[nr]));
528 }
529 
530 static ssize_t show_fan_target(struct device *dev, struct device_attribute
531 			       *devattr, char *buf)
532 {
533 	struct f71805f_data *data = f71805f_update_device(dev);
534 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
535 	int nr = attr->index;
536 
537 	return sprintf(buf, "%ld\n", fan_from_reg(data->fan_target[nr]));
538 }
539 
540 static ssize_t set_fan_min(struct device *dev, struct device_attribute
541 			   *devattr, const char *buf, size_t count)
542 {
543 	struct f71805f_data *data = dev_get_drvdata(dev);
544 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
545 	int nr = attr->index;
546 	long val = simple_strtol(buf, NULL, 10);
547 
548 	mutex_lock(&data->update_lock);
549 	data->fan_low[nr] = fan_to_reg(val);
550 	f71805f_write16(data, F71805F_REG_FAN_LOW(nr), data->fan_low[nr]);
551 	mutex_unlock(&data->update_lock);
552 
553 	return count;
554 }
555 
556 static ssize_t set_fan_target(struct device *dev, struct device_attribute
557 			      *devattr, const char *buf, size_t count)
558 {
559 	struct f71805f_data *data = dev_get_drvdata(dev);
560 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
561 	int nr = attr->index;
562 	long val = simple_strtol(buf, NULL, 10);
563 
564 	mutex_lock(&data->update_lock);
565 	data->fan_target[nr] = fan_to_reg(val);
566 	f71805f_write16(data, F71805F_REG_FAN_TARGET(nr),
567 			data->fan_target[nr]);
568 	mutex_unlock(&data->update_lock);
569 
570 	return count;
571 }
572 
573 static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr,
574 			char *buf)
575 {
576 	struct f71805f_data *data = f71805f_update_device(dev);
577 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
578 	int nr = attr->index;
579 
580 	return sprintf(buf, "%d\n", (int)data->pwm[nr]);
581 }
582 
583 static ssize_t show_pwm_enable(struct device *dev, struct device_attribute
584 			       *devattr, char *buf)
585 {
586 	struct f71805f_data *data = f71805f_update_device(dev);
587 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
588 	int nr = attr->index;
589 	int mode;
590 
591 	switch (data->fan_ctrl[nr] & FAN_CTRL_MODE_MASK) {
592 	case FAN_CTRL_MODE_SPEED:
593 		mode = 3;
594 		break;
595 	case FAN_CTRL_MODE_TEMPERATURE:
596 		mode = 2;
597 		break;
598 	default: /* MANUAL */
599 		mode = 1;
600 	}
601 
602 	return sprintf(buf, "%d\n", mode);
603 }
604 
605 static ssize_t show_pwm_freq(struct device *dev, struct device_attribute
606 			     *devattr, char *buf)
607 {
608 	struct f71805f_data *data = f71805f_update_device(dev);
609 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
610 	int nr = attr->index;
611 
612 	return sprintf(buf, "%lu\n", pwm_freq_from_reg(data->pwm_freq[nr]));
613 }
614 
615 static ssize_t show_pwm_mode(struct device *dev, struct device_attribute
616 			     *devattr, char *buf)
617 {
618 	struct f71805f_data *data = f71805f_update_device(dev);
619 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
620 	int nr = attr->index;
621 
622 	return sprintf(buf, "%d\n", pwm_mode_from_reg(data->fan_ctrl[nr]));
623 }
624 
625 static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr,
626 		       const char *buf, size_t count)
627 {
628 	struct f71805f_data *data = dev_get_drvdata(dev);
629 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
630 	int nr = attr->index;
631 	unsigned long val = simple_strtoul(buf, NULL, 10);
632 
633 	if (val > 255)
634 		return -EINVAL;
635 
636 	mutex_lock(&data->update_lock);
637 	data->pwm[nr] = val;
638 	f71805f_write8(data, F71805F_REG_PWM_DUTY(nr), data->pwm[nr]);
639 	mutex_unlock(&data->update_lock);
640 
641 	return count;
642 }
643 
644 static struct attribute *f71805f_attr_pwm[];
645 
646 static ssize_t set_pwm_enable(struct device *dev, struct device_attribute
647 			      *devattr, const char *buf, size_t count)
648 {
649 	struct f71805f_data *data = dev_get_drvdata(dev);
650 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
651 	int nr = attr->index;
652 	unsigned long val = simple_strtoul(buf, NULL, 10);
653 	u8 reg;
654 
655 	if (val < 1 || val > 3)
656 		return -EINVAL;
657 
658 	if (val > 1) { /* Automatic mode, user can't set PWM value */
659 		if (sysfs_chmod_file(&dev->kobj, f71805f_attr_pwm[nr],
660 				     S_IRUGO))
661 			dev_dbg(dev, "chmod -w pwm%d failed\n", nr + 1);
662 	}
663 
664 	mutex_lock(&data->update_lock);
665 	reg = f71805f_read8(data, F71805F_REG_FAN_CTRL(nr))
666 	    & ~FAN_CTRL_MODE_MASK;
667 	switch (val) {
668 	case 1:
669 		reg |= FAN_CTRL_MODE_MANUAL;
670 		break;
671 	case 2:
672 		reg |= FAN_CTRL_MODE_TEMPERATURE;
673 		break;
674 	case 3:
675 		reg |= FAN_CTRL_MODE_SPEED;
676 		break;
677 	}
678 	data->fan_ctrl[nr] = reg;
679 	f71805f_write8(data, F71805F_REG_FAN_CTRL(nr), reg);
680 	mutex_unlock(&data->update_lock);
681 
682 	if (val == 1) { /* Manual mode, user can set PWM value */
683 		if (sysfs_chmod_file(&dev->kobj, f71805f_attr_pwm[nr],
684 				     S_IRUGO | S_IWUSR))
685 			dev_dbg(dev, "chmod +w pwm%d failed\n", nr + 1);
686 	}
687 
688 	return count;
689 }
690 
691 static ssize_t set_pwm_freq(struct device *dev, struct device_attribute
692 			    *devattr, const char *buf, size_t count)
693 {
694 	struct f71805f_data *data = dev_get_drvdata(dev);
695 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
696 	int nr = attr->index;
697 	unsigned long val = simple_strtoul(buf, NULL, 10);
698 
699 	mutex_lock(&data->update_lock);
700 	data->pwm_freq[nr] = pwm_freq_to_reg(val);
701 	f71805f_write8(data, F71805F_REG_PWM_FREQ(nr), data->pwm_freq[nr]);
702 	mutex_unlock(&data->update_lock);
703 
704 	return count;
705 }
706 
707 static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
708 			 char *buf)
709 {
710 	struct f71805f_data *data = f71805f_update_device(dev);
711 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
712 	int nr = attr->index;
713 
714 	return sprintf(buf, "%ld\n", temp_from_reg(data->temp[nr]));
715 }
716 
717 static ssize_t show_temp_max(struct device *dev, struct device_attribute
718 			     *devattr, char *buf)
719 {
720 	struct f71805f_data *data = f71805f_update_device(dev);
721 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
722 	int nr = attr->index;
723 
724 	return sprintf(buf, "%ld\n", temp_from_reg(data->temp_high[nr]));
725 }
726 
727 static ssize_t show_temp_hyst(struct device *dev, struct device_attribute
728 			      *devattr, char *buf)
729 {
730 	struct f71805f_data *data = f71805f_update_device(dev);
731 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
732 	int nr = attr->index;
733 
734 	return sprintf(buf, "%ld\n", temp_from_reg(data->temp_hyst[nr]));
735 }
736 
737 static ssize_t show_temp_type(struct device *dev, struct device_attribute
738 			      *devattr, char *buf)
739 {
740 	struct f71805f_data *data = f71805f_update_device(dev);
741 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
742 	int nr = attr->index;
743 
744 	/* 3 is diode, 4 is thermistor */
745 	return sprintf(buf, "%u\n", (data->temp_mode & (1 << nr)) ? 3 : 4);
746 }
747 
748 static ssize_t set_temp_max(struct device *dev, struct device_attribute
749 			    *devattr, const char *buf, size_t count)
750 {
751 	struct f71805f_data *data = dev_get_drvdata(dev);
752 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
753 	int nr = attr->index;
754 	long val = simple_strtol(buf, NULL, 10);
755 
756 	mutex_lock(&data->update_lock);
757 	data->temp_high[nr] = temp_to_reg(val);
758 	f71805f_write8(data, F71805F_REG_TEMP_HIGH(nr), data->temp_high[nr]);
759 	mutex_unlock(&data->update_lock);
760 
761 	return count;
762 }
763 
764 static ssize_t set_temp_hyst(struct device *dev, struct device_attribute
765 			     *devattr, const char *buf, size_t count)
766 {
767 	struct f71805f_data *data = dev_get_drvdata(dev);
768 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
769 	int nr = attr->index;
770 	long val = simple_strtol(buf, NULL, 10);
771 
772 	mutex_lock(&data->update_lock);
773 	data->temp_hyst[nr] = temp_to_reg(val);
774 	f71805f_write8(data, F71805F_REG_TEMP_HYST(nr), data->temp_hyst[nr]);
775 	mutex_unlock(&data->update_lock);
776 
777 	return count;
778 }
779 
780 static ssize_t show_alarms_in(struct device *dev, struct device_attribute
781 			      *devattr, char *buf)
782 {
783 	struct f71805f_data *data = f71805f_update_device(dev);
784 
785 	return sprintf(buf, "%lu\n", data->alarms & 0x7ff);
786 }
787 
788 static ssize_t show_alarms_fan(struct device *dev, struct device_attribute
789 			       *devattr, char *buf)
790 {
791 	struct f71805f_data *data = f71805f_update_device(dev);
792 
793 	return sprintf(buf, "%lu\n", (data->alarms >> 16) & 0x07);
794 }
795 
796 static ssize_t show_alarms_temp(struct device *dev, struct device_attribute
797 				*devattr, char *buf)
798 {
799 	struct f71805f_data *data = f71805f_update_device(dev);
800 
801 	return sprintf(buf, "%lu\n", (data->alarms >> 11) & 0x07);
802 }
803 
804 static ssize_t show_alarm(struct device *dev, struct device_attribute
805 			  *devattr, char *buf)
806 {
807 	struct f71805f_data *data = f71805f_update_device(dev);
808 	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
809 	int bitnr = attr->index;
810 
811 	return sprintf(buf, "%lu\n", (data->alarms >> bitnr) & 1);
812 }
813 
814 static ssize_t show_name(struct device *dev, struct device_attribute
815 			 *devattr, char *buf)
816 {
817 	struct f71805f_data *data = dev_get_drvdata(dev);
818 
819 	return sprintf(buf, "%s\n", data->name);
820 }
821 
822 static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_in0, NULL, 0);
823 static SENSOR_DEVICE_ATTR(in0_max, S_IRUGO| S_IWUSR,
824 			  show_in0_max, set_in0_max, 0);
825 static SENSOR_DEVICE_ATTR(in0_min, S_IRUGO| S_IWUSR,
826 			  show_in0_min, set_in0_min, 0);
827 static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_in, NULL, 1);
828 static SENSOR_DEVICE_ATTR(in1_max, S_IRUGO | S_IWUSR,
829 			  show_in_max, set_in_max, 1);
830 static SENSOR_DEVICE_ATTR(in1_min, S_IRUGO | S_IWUSR,
831 			  show_in_min, set_in_min, 1);
832 static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_in, NULL, 2);
833 static SENSOR_DEVICE_ATTR(in2_max, S_IRUGO | S_IWUSR,
834 			  show_in_max, set_in_max, 2);
835 static SENSOR_DEVICE_ATTR(in2_min, S_IRUGO | S_IWUSR,
836 			  show_in_min, set_in_min, 2);
837 static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, show_in, NULL, 3);
838 static SENSOR_DEVICE_ATTR(in3_max, S_IRUGO | S_IWUSR,
839 			  show_in_max, set_in_max, 3);
840 static SENSOR_DEVICE_ATTR(in3_min, S_IRUGO | S_IWUSR,
841 			  show_in_min, set_in_min, 3);
842 static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, show_in, NULL, 4);
843 static SENSOR_DEVICE_ATTR(in4_max, S_IRUGO | S_IWUSR,
844 			  show_in_max, set_in_max, 4);
845 static SENSOR_DEVICE_ATTR(in4_min, S_IRUGO | S_IWUSR,
846 			  show_in_min, set_in_min, 4);
847 static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, show_in, NULL, 5);
848 static SENSOR_DEVICE_ATTR(in5_max, S_IRUGO | S_IWUSR,
849 			  show_in_max, set_in_max, 5);
850 static SENSOR_DEVICE_ATTR(in5_min, S_IRUGO | S_IWUSR,
851 			  show_in_min, set_in_min, 5);
852 static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_in, NULL, 6);
853 static SENSOR_DEVICE_ATTR(in6_max, S_IRUGO | S_IWUSR,
854 			  show_in_max, set_in_max, 6);
855 static SENSOR_DEVICE_ATTR(in6_min, S_IRUGO | S_IWUSR,
856 			  show_in_min, set_in_min, 6);
857 static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, show_in, NULL, 7);
858 static SENSOR_DEVICE_ATTR(in7_max, S_IRUGO | S_IWUSR,
859 			  show_in_max, set_in_max, 7);
860 static SENSOR_DEVICE_ATTR(in7_min, S_IRUGO | S_IWUSR,
861 			  show_in_min, set_in_min, 7);
862 static SENSOR_DEVICE_ATTR(in8_input, S_IRUGO, show_in, NULL, 8);
863 static SENSOR_DEVICE_ATTR(in8_max, S_IRUGO | S_IWUSR,
864 			  show_in_max, set_in_max, 8);
865 static SENSOR_DEVICE_ATTR(in8_min, S_IRUGO | S_IWUSR,
866 			  show_in_min, set_in_min, 8);
867 static SENSOR_DEVICE_ATTR(in9_input, S_IRUGO, show_in0, NULL, 9);
868 static SENSOR_DEVICE_ATTR(in9_max, S_IRUGO | S_IWUSR,
869 			  show_in0_max, set_in0_max, 9);
870 static SENSOR_DEVICE_ATTR(in9_min, S_IRUGO | S_IWUSR,
871 			  show_in0_min, set_in0_min, 9);
872 static SENSOR_DEVICE_ATTR(in10_input, S_IRUGO, show_in0, NULL, 10);
873 static SENSOR_DEVICE_ATTR(in10_max, S_IRUGO | S_IWUSR,
874 			  show_in0_max, set_in0_max, 10);
875 static SENSOR_DEVICE_ATTR(in10_min, S_IRUGO | S_IWUSR,
876 			  show_in0_min, set_in0_min, 10);
877 
878 static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0);
879 static SENSOR_DEVICE_ATTR(fan1_min, S_IRUGO | S_IWUSR,
880 			  show_fan_min, set_fan_min, 0);
881 static SENSOR_DEVICE_ATTR(fan1_target, S_IRUGO | S_IWUSR,
882 			  show_fan_target, set_fan_target, 0);
883 static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1);
884 static SENSOR_DEVICE_ATTR(fan2_min, S_IRUGO | S_IWUSR,
885 			  show_fan_min, set_fan_min, 1);
886 static SENSOR_DEVICE_ATTR(fan2_target, S_IRUGO | S_IWUSR,
887 			  show_fan_target, set_fan_target, 1);
888 static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2);
889 static SENSOR_DEVICE_ATTR(fan3_min, S_IRUGO | S_IWUSR,
890 			  show_fan_min, set_fan_min, 2);
891 static SENSOR_DEVICE_ATTR(fan3_target, S_IRUGO | S_IWUSR,
892 			  show_fan_target, set_fan_target, 2);
893 
894 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0);
895 static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
896 		    show_temp_max, set_temp_max, 0);
897 static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
898 		    show_temp_hyst, set_temp_hyst, 0);
899 static SENSOR_DEVICE_ATTR(temp1_type, S_IRUGO, show_temp_type, NULL, 0);
900 static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1);
901 static SENSOR_DEVICE_ATTR(temp2_max, S_IRUGO | S_IWUSR,
902 		    show_temp_max, set_temp_max, 1);
903 static SENSOR_DEVICE_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR,
904 		    show_temp_hyst, set_temp_hyst, 1);
905 static SENSOR_DEVICE_ATTR(temp2_type, S_IRUGO, show_temp_type, NULL, 1);
906 static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2);
907 static SENSOR_DEVICE_ATTR(temp3_max, S_IRUGO | S_IWUSR,
908 		    show_temp_max, set_temp_max, 2);
909 static SENSOR_DEVICE_ATTR(temp3_max_hyst, S_IRUGO | S_IWUSR,
910 		    show_temp_hyst, set_temp_hyst, 2);
911 static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO, show_temp_type, NULL, 2);
912 
913 /* pwm (value) files are created read-only, write permission is
914    then added or removed dynamically as needed */
915 static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO, show_pwm, set_pwm, 0);
916 static SENSOR_DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR,
917 			  show_pwm_enable, set_pwm_enable, 0);
918 static SENSOR_DEVICE_ATTR(pwm1_freq, S_IRUGO | S_IWUSR,
919 			  show_pwm_freq, set_pwm_freq, 0);
920 static SENSOR_DEVICE_ATTR(pwm1_mode, S_IRUGO, show_pwm_mode, NULL, 0);
921 static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO, show_pwm, set_pwm, 1);
922 static SENSOR_DEVICE_ATTR(pwm2_enable, S_IRUGO | S_IWUSR,
923 			  show_pwm_enable, set_pwm_enable, 1);
924 static SENSOR_DEVICE_ATTR(pwm2_freq, S_IRUGO | S_IWUSR,
925 			  show_pwm_freq, set_pwm_freq, 1);
926 static SENSOR_DEVICE_ATTR(pwm2_mode, S_IRUGO, show_pwm_mode, NULL, 1);
927 static SENSOR_DEVICE_ATTR(pwm3, S_IRUGO, show_pwm, set_pwm, 2);
928 static SENSOR_DEVICE_ATTR(pwm3_enable, S_IRUGO | S_IWUSR,
929 			  show_pwm_enable, set_pwm_enable, 2);
930 static SENSOR_DEVICE_ATTR(pwm3_freq, S_IRUGO | S_IWUSR,
931 			  show_pwm_freq, set_pwm_freq, 2);
932 static SENSOR_DEVICE_ATTR(pwm3_mode, S_IRUGO, show_pwm_mode, NULL, 2);
933 
934 static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
935 static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
936 static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2);
937 static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3);
938 static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 4);
939 static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 5);
940 static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 6);
941 static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 7);
942 static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 8);
943 static SENSOR_DEVICE_ATTR(in9_alarm, S_IRUGO, show_alarm, NULL, 9);
944 static SENSOR_DEVICE_ATTR(in10_alarm, S_IRUGO, show_alarm, NULL, 10);
945 static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 11);
946 static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 12);
947 static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13);
948 static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 16);
949 static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 17);
950 static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 18);
951 static DEVICE_ATTR(alarms_in, S_IRUGO, show_alarms_in, NULL);
952 static DEVICE_ATTR(alarms_fan, S_IRUGO, show_alarms_fan, NULL);
953 static DEVICE_ATTR(alarms_temp, S_IRUGO, show_alarms_temp, NULL);
954 
955 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
956 
957 static struct attribute *f71805f_attributes[] = {
958 	&sensor_dev_attr_in0_input.dev_attr.attr,
959 	&sensor_dev_attr_in0_max.dev_attr.attr,
960 	&sensor_dev_attr_in0_min.dev_attr.attr,
961 	&sensor_dev_attr_in1_input.dev_attr.attr,
962 	&sensor_dev_attr_in1_max.dev_attr.attr,
963 	&sensor_dev_attr_in1_min.dev_attr.attr,
964 	&sensor_dev_attr_in2_input.dev_attr.attr,
965 	&sensor_dev_attr_in2_max.dev_attr.attr,
966 	&sensor_dev_attr_in2_min.dev_attr.attr,
967 	&sensor_dev_attr_in3_input.dev_attr.attr,
968 	&sensor_dev_attr_in3_max.dev_attr.attr,
969 	&sensor_dev_attr_in3_min.dev_attr.attr,
970 	&sensor_dev_attr_in5_input.dev_attr.attr,
971 	&sensor_dev_attr_in5_max.dev_attr.attr,
972 	&sensor_dev_attr_in5_min.dev_attr.attr,
973 	&sensor_dev_attr_in6_input.dev_attr.attr,
974 	&sensor_dev_attr_in6_max.dev_attr.attr,
975 	&sensor_dev_attr_in6_min.dev_attr.attr,
976 	&sensor_dev_attr_in7_input.dev_attr.attr,
977 	&sensor_dev_attr_in7_max.dev_attr.attr,
978 	&sensor_dev_attr_in7_min.dev_attr.attr,
979 
980 	&sensor_dev_attr_fan1_input.dev_attr.attr,
981 	&sensor_dev_attr_fan1_min.dev_attr.attr,
982 	&sensor_dev_attr_fan1_alarm.dev_attr.attr,
983 	&sensor_dev_attr_fan1_target.dev_attr.attr,
984 	&sensor_dev_attr_fan2_input.dev_attr.attr,
985 	&sensor_dev_attr_fan2_min.dev_attr.attr,
986 	&sensor_dev_attr_fan2_alarm.dev_attr.attr,
987 	&sensor_dev_attr_fan2_target.dev_attr.attr,
988 	&sensor_dev_attr_fan3_input.dev_attr.attr,
989 	&sensor_dev_attr_fan3_min.dev_attr.attr,
990 	&sensor_dev_attr_fan3_alarm.dev_attr.attr,
991 	&sensor_dev_attr_fan3_target.dev_attr.attr,
992 
993 	&sensor_dev_attr_pwm1.dev_attr.attr,
994 	&sensor_dev_attr_pwm1_enable.dev_attr.attr,
995 	&sensor_dev_attr_pwm1_mode.dev_attr.attr,
996 	&sensor_dev_attr_pwm2.dev_attr.attr,
997 	&sensor_dev_attr_pwm2_enable.dev_attr.attr,
998 	&sensor_dev_attr_pwm2_mode.dev_attr.attr,
999 	&sensor_dev_attr_pwm3.dev_attr.attr,
1000 	&sensor_dev_attr_pwm3_enable.dev_attr.attr,
1001 	&sensor_dev_attr_pwm3_mode.dev_attr.attr,
1002 
1003 	&sensor_dev_attr_temp1_input.dev_attr.attr,
1004 	&sensor_dev_attr_temp1_max.dev_attr.attr,
1005 	&sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
1006 	&sensor_dev_attr_temp1_type.dev_attr.attr,
1007 	&sensor_dev_attr_temp2_input.dev_attr.attr,
1008 	&sensor_dev_attr_temp2_max.dev_attr.attr,
1009 	&sensor_dev_attr_temp2_max_hyst.dev_attr.attr,
1010 	&sensor_dev_attr_temp2_type.dev_attr.attr,
1011 	&sensor_dev_attr_temp3_input.dev_attr.attr,
1012 	&sensor_dev_attr_temp3_max.dev_attr.attr,
1013 	&sensor_dev_attr_temp3_max_hyst.dev_attr.attr,
1014 	&sensor_dev_attr_temp3_type.dev_attr.attr,
1015 
1016 	&sensor_dev_attr_in0_alarm.dev_attr.attr,
1017 	&sensor_dev_attr_in1_alarm.dev_attr.attr,
1018 	&sensor_dev_attr_in2_alarm.dev_attr.attr,
1019 	&sensor_dev_attr_in3_alarm.dev_attr.attr,
1020 	&sensor_dev_attr_in5_alarm.dev_attr.attr,
1021 	&sensor_dev_attr_in6_alarm.dev_attr.attr,
1022 	&sensor_dev_attr_in7_alarm.dev_attr.attr,
1023 	&dev_attr_alarms_in.attr,
1024 	&sensor_dev_attr_temp1_alarm.dev_attr.attr,
1025 	&sensor_dev_attr_temp2_alarm.dev_attr.attr,
1026 	&sensor_dev_attr_temp3_alarm.dev_attr.attr,
1027 	&dev_attr_alarms_temp.attr,
1028 	&dev_attr_alarms_fan.attr,
1029 
1030 	&dev_attr_name.attr,
1031 	NULL
1032 };
1033 
1034 static const struct attribute_group f71805f_group = {
1035 	.attrs = f71805f_attributes,
1036 };
1037 
1038 static struct attribute *f71805f_attributes_optin[4][5] = {
1039 	{
1040 		&sensor_dev_attr_in4_input.dev_attr.attr,
1041 		&sensor_dev_attr_in4_max.dev_attr.attr,
1042 		&sensor_dev_attr_in4_min.dev_attr.attr,
1043 		&sensor_dev_attr_in4_alarm.dev_attr.attr,
1044 		NULL
1045 	}, {
1046 		&sensor_dev_attr_in8_input.dev_attr.attr,
1047 		&sensor_dev_attr_in8_max.dev_attr.attr,
1048 		&sensor_dev_attr_in8_min.dev_attr.attr,
1049 		&sensor_dev_attr_in8_alarm.dev_attr.attr,
1050 		NULL
1051 	}, {
1052 		&sensor_dev_attr_in9_input.dev_attr.attr,
1053 		&sensor_dev_attr_in9_max.dev_attr.attr,
1054 		&sensor_dev_attr_in9_min.dev_attr.attr,
1055 		&sensor_dev_attr_in9_alarm.dev_attr.attr,
1056 		NULL
1057 	}, {
1058 		&sensor_dev_attr_in10_input.dev_attr.attr,
1059 		&sensor_dev_attr_in10_max.dev_attr.attr,
1060 		&sensor_dev_attr_in10_min.dev_attr.attr,
1061 		&sensor_dev_attr_in10_alarm.dev_attr.attr,
1062 		NULL
1063 	}
1064 };
1065 
1066 static const struct attribute_group f71805f_group_optin[4] = {
1067 	{ .attrs = f71805f_attributes_optin[0] },
1068 	{ .attrs = f71805f_attributes_optin[1] },
1069 	{ .attrs = f71805f_attributes_optin[2] },
1070 	{ .attrs = f71805f_attributes_optin[3] },
1071 };
1072 
1073 /* We don't include pwm_freq files in the arrays above, because they must be
1074    created conditionally (only if pwm_mode is 1 == PWM) */
1075 static struct attribute *f71805f_attributes_pwm_freq[] = {
1076 	&sensor_dev_attr_pwm1_freq.dev_attr.attr,
1077 	&sensor_dev_attr_pwm2_freq.dev_attr.attr,
1078 	&sensor_dev_attr_pwm3_freq.dev_attr.attr,
1079 	NULL
1080 };
1081 
1082 static const struct attribute_group f71805f_group_pwm_freq = {
1083 	.attrs = f71805f_attributes_pwm_freq,
1084 };
1085 
1086 /* We also need an indexed access to pwmN files to toggle writability */
1087 static struct attribute *f71805f_attr_pwm[] = {
1088 	&sensor_dev_attr_pwm1.dev_attr.attr,
1089 	&sensor_dev_attr_pwm2.dev_attr.attr,
1090 	&sensor_dev_attr_pwm3.dev_attr.attr,
1091 };
1092 
1093 /*
1094  * Device registration and initialization
1095  */
1096 
1097 static void __devinit f71805f_init_device(struct f71805f_data *data)
1098 {
1099 	u8 reg;
1100 	int i;
1101 
1102 	reg = f71805f_read8(data, F71805F_REG_START);
1103 	if ((reg & 0x41) != 0x01) {
1104 		printk(KERN_DEBUG DRVNAME ": Starting monitoring "
1105 		       "operations\n");
1106 		f71805f_write8(data, F71805F_REG_START, (reg | 0x01) & ~0x40);
1107 	}
1108 
1109 	/* Fan monitoring can be disabled. If it is, we won't be polling
1110 	   the register values, and won't create the related sysfs files. */
1111 	for (i = 0; i < 3; i++) {
1112 		data->fan_ctrl[i] = f71805f_read8(data,
1113 						  F71805F_REG_FAN_CTRL(i));
1114 		/* Clear latch full bit, else "speed mode" fan speed control
1115 		   doesn't work */
1116 		if (data->fan_ctrl[i] & FAN_CTRL_LATCH_FULL) {
1117 			data->fan_ctrl[i] &= ~FAN_CTRL_LATCH_FULL;
1118 			f71805f_write8(data, F71805F_REG_FAN_CTRL(i),
1119 				       data->fan_ctrl[i]);
1120 		}
1121 	}
1122 }
1123 
1124 static int __devinit f71805f_probe(struct platform_device *pdev)
1125 {
1126 	struct f71805f_sio_data *sio_data = pdev->dev.platform_data;
1127 	struct f71805f_data *data;
1128 	struct resource *res;
1129 	int i, err;
1130 
1131 	static const char *names[] = {
1132 		"f71805f",
1133 		"f71872f",
1134 	};
1135 
1136 	if (!(data = kzalloc(sizeof(struct f71805f_data), GFP_KERNEL))) {
1137 		err = -ENOMEM;
1138 		printk(KERN_ERR DRVNAME ": Out of memory\n");
1139 		goto exit;
1140 	}
1141 
1142 	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1143 	data->addr = res->start;
1144 	data->name = names[sio_data->kind];
1145 	mutex_init(&data->update_lock);
1146 
1147 	platform_set_drvdata(pdev, data);
1148 
1149 	/* Some voltage inputs depend on chip model and configuration */
1150 	switch (sio_data->kind) {
1151 	case f71805f:
1152 		data->has_in = 0x1ff;
1153 		break;
1154 	case f71872f:
1155 		data->has_in = 0x6ef;
1156 		if (sio_data->fnsel1 & 0x01)
1157 			data->has_in |= (1 << 4); /* in4 */
1158 		if (sio_data->fnsel1 & 0x02)
1159 			data->has_in |= (1 << 8); /* in8 */
1160 		break;
1161 	}
1162 
1163 	/* Initialize the F71805F chip */
1164 	f71805f_init_device(data);
1165 
1166 	/* Register sysfs interface files */
1167 	if ((err = sysfs_create_group(&pdev->dev.kobj, &f71805f_group)))
1168 		goto exit_free;
1169 	if (data->has_in & (1 << 4)) { /* in4 */
1170 		if ((err = sysfs_create_group(&pdev->dev.kobj,
1171 					      &f71805f_group_optin[0])))
1172 			goto exit_remove_files;
1173 	}
1174 	if (data->has_in & (1 << 8)) { /* in8 */
1175 		if ((err = sysfs_create_group(&pdev->dev.kobj,
1176 					      &f71805f_group_optin[1])))
1177 			goto exit_remove_files;
1178 	}
1179 	if (data->has_in & (1 << 9)) { /* in9 (F71872F/FG only) */
1180 		if ((err = sysfs_create_group(&pdev->dev.kobj,
1181 					      &f71805f_group_optin[2])))
1182 			goto exit_remove_files;
1183 	}
1184 	if (data->has_in & (1 << 10)) { /* in9 (F71872F/FG only) */
1185 		if ((err = sysfs_create_group(&pdev->dev.kobj,
1186 					      &f71805f_group_optin[3])))
1187 			goto exit_remove_files;
1188 	}
1189 	for (i = 0; i < 3; i++) {
1190 		/* If control mode is PWM, create pwm_freq file */
1191 		if (!(data->fan_ctrl[i] & FAN_CTRL_DC_MODE)) {
1192 			if ((err = sysfs_create_file(&pdev->dev.kobj,
1193 					f71805f_attributes_pwm_freq[i])))
1194 				goto exit_remove_files;
1195 		}
1196 		/* If PWM is in manual mode, add write permission */
1197 		if (data->fan_ctrl[i] & FAN_CTRL_MODE_MANUAL) {
1198 			if ((err = sysfs_chmod_file(&pdev->dev.kobj,
1199 						    f71805f_attr_pwm[i],
1200 						    S_IRUGO | S_IWUSR))) {
1201 				dev_err(&pdev->dev, "chmod +w pwm%d failed\n",
1202 					i + 1);
1203 				goto exit_remove_files;
1204 			}
1205 		}
1206 	}
1207 
1208 	data->class_dev = hwmon_device_register(&pdev->dev);
1209 	if (IS_ERR(data->class_dev)) {
1210 		err = PTR_ERR(data->class_dev);
1211 		dev_err(&pdev->dev, "Class registration failed (%d)\n", err);
1212 		goto exit_remove_files;
1213 	}
1214 
1215 	return 0;
1216 
1217 exit_remove_files:
1218 	sysfs_remove_group(&pdev->dev.kobj, &f71805f_group);
1219 	for (i = 0; i < 4; i++)
1220 		sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_optin[i]);
1221 	sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_pwm_freq);
1222 exit_free:
1223 	platform_set_drvdata(pdev, NULL);
1224 	kfree(data);
1225 exit:
1226 	return err;
1227 }
1228 
1229 static int __devexit f71805f_remove(struct platform_device *pdev)
1230 {
1231 	struct f71805f_data *data = platform_get_drvdata(pdev);
1232 	int i;
1233 
1234 	platform_set_drvdata(pdev, NULL);
1235 	hwmon_device_unregister(data->class_dev);
1236 	sysfs_remove_group(&pdev->dev.kobj, &f71805f_group);
1237 	for (i = 0; i < 4; i++)
1238 		sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_optin[i]);
1239 	sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_pwm_freq);
1240 	kfree(data);
1241 
1242 	return 0;
1243 }
1244 
1245 static struct platform_driver f71805f_driver = {
1246 	.driver = {
1247 		.owner	= THIS_MODULE,
1248 		.name	= DRVNAME,
1249 	},
1250 	.probe		= f71805f_probe,
1251 	.remove		= __devexit_p(f71805f_remove),
1252 };
1253 
1254 static int __init f71805f_device_add(unsigned short address,
1255 				     const struct f71805f_sio_data *sio_data)
1256 {
1257 	struct resource res = {
1258 		.start	= address,
1259 		.end	= address + REGION_LENGTH - 1,
1260 		.flags	= IORESOURCE_IO,
1261 	};
1262 	int err;
1263 
1264 	pdev = platform_device_alloc(DRVNAME, address);
1265 	if (!pdev) {
1266 		err = -ENOMEM;
1267 		printk(KERN_ERR DRVNAME ": Device allocation failed\n");
1268 		goto exit;
1269 	}
1270 
1271 	res.name = pdev->name;
1272 	err = platform_device_add_resources(pdev, &res, 1);
1273 	if (err) {
1274 		printk(KERN_ERR DRVNAME ": Device resource addition failed "
1275 		       "(%d)\n", err);
1276 		goto exit_device_put;
1277 	}
1278 
1279 	pdev->dev.platform_data = kmalloc(sizeof(struct f71805f_sio_data),
1280 					  GFP_KERNEL);
1281 	if (!pdev->dev.platform_data) {
1282 		err = -ENOMEM;
1283 		printk(KERN_ERR DRVNAME ": Platform data allocation failed\n");
1284 		goto exit_device_put;
1285 	}
1286 	memcpy(pdev->dev.platform_data, sio_data,
1287 	       sizeof(struct f71805f_sio_data));
1288 
1289 	err = platform_device_add(pdev);
1290 	if (err) {
1291 		printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n",
1292 		       err);
1293 		goto exit_device_put;
1294 	}
1295 
1296 	return 0;
1297 
1298 exit_device_put:
1299 	platform_device_put(pdev);
1300 exit:
1301 	return err;
1302 }
1303 
1304 static int __init f71805f_find(int sioaddr, unsigned short *address,
1305 			       struct f71805f_sio_data *sio_data)
1306 {
1307 	int err = -ENODEV;
1308 	u16 devid;
1309 
1310 	static const char *names[] = {
1311 		"F71805F/FG",
1312 		"F71872F/FG",
1313 	};
1314 
1315 	superio_enter(sioaddr);
1316 
1317 	devid = superio_inw(sioaddr, SIO_REG_MANID);
1318 	if (devid != SIO_FINTEK_ID)
1319 		goto exit;
1320 
1321 	devid = superio_inw(sioaddr, SIO_REG_DEVID);
1322 	switch (devid) {
1323 	case SIO_F71805F_ID:
1324 		sio_data->kind = f71805f;
1325 		break;
1326 	case SIO_F71872F_ID:
1327 		sio_data->kind = f71872f;
1328 		sio_data->fnsel1 = superio_inb(sioaddr, SIO_REG_FNSEL1);
1329 		break;
1330 	default:
1331 		printk(KERN_INFO DRVNAME ": Unsupported Fintek device, "
1332 		       "skipping\n");
1333 		goto exit;
1334 	}
1335 
1336 	superio_select(sioaddr, F71805F_LD_HWM);
1337 	if (!(superio_inb(sioaddr, SIO_REG_ENABLE) & 0x01)) {
1338 		printk(KERN_WARNING DRVNAME ": Device not activated, "
1339 		       "skipping\n");
1340 		goto exit;
1341 	}
1342 
1343 	*address = superio_inw(sioaddr, SIO_REG_ADDR);
1344 	if (*address == 0) {
1345 		printk(KERN_WARNING DRVNAME ": Base address not set, "
1346 		       "skipping\n");
1347 		goto exit;
1348 	}
1349 	*address &= ~(REGION_LENGTH - 1);	/* Ignore 3 LSB */
1350 
1351 	err = 0;
1352 	printk(KERN_INFO DRVNAME ": Found %s chip at %#x, revision %u\n",
1353 	       names[sio_data->kind], *address,
1354 	       superio_inb(sioaddr, SIO_REG_DEVREV));
1355 
1356 exit:
1357 	superio_exit(sioaddr);
1358 	return err;
1359 }
1360 
1361 static int __init f71805f_init(void)
1362 {
1363 	int err;
1364 	unsigned short address;
1365 	struct f71805f_sio_data sio_data;
1366 
1367 	if (f71805f_find(0x2e, &address, &sio_data)
1368 	 && f71805f_find(0x4e, &address, &sio_data))
1369 		return -ENODEV;
1370 
1371 	err = platform_driver_register(&f71805f_driver);
1372 	if (err)
1373 		goto exit;
1374 
1375 	/* Sets global pdev as a side effect */
1376 	err = f71805f_device_add(address, &sio_data);
1377 	if (err)
1378 		goto exit_driver;
1379 
1380 	return 0;
1381 
1382 exit_driver:
1383 	platform_driver_unregister(&f71805f_driver);
1384 exit:
1385 	return err;
1386 }
1387 
1388 static void __exit f71805f_exit(void)
1389 {
1390 	platform_device_unregister(pdev);
1391 	platform_driver_unregister(&f71805f_driver);
1392 }
1393 
1394 MODULE_AUTHOR("Jean Delvare <khali@linux-fr>");
1395 MODULE_LICENSE("GPL");
1396 MODULE_DESCRIPTION("F71805F/F71872F hardware monitoring driver");
1397 
1398 module_init(f71805f_init);
1399 module_exit(f71805f_exit);
1400