xref: /linux/drivers/hwmon/w83627ehf.c (revision 858259cf7d1c443c836a2022b78cb281f0a9b95e)
1 /*
2     w83627ehf - Driver for the hardware monitoring functionality of
3                 the Winbond W83627EHF Super-I/O chip
4     Copyright (C) 2005  Jean Delvare <khali@linux-fr.org>
5 
6     Shamelessly ripped from the w83627hf driver
7     Copyright (C) 2003  Mark Studebaker
8 
9     Thanks to Leon Moonen, Steve Cliffe and Grant Coady for their help
10     in testing and debugging this driver.
11 
12     This driver also supports the W83627EHG, which is the lead-free
13     version of the W83627EHF.
14 
15     This program is free software; you can redistribute it and/or modify
16     it under the terms of the GNU General Public License as published by
17     the Free Software Foundation; either version 2 of the License, or
18     (at your option) any later version.
19 
20     This program is distributed in the hope that it will be useful,
21     but WITHOUT ANY WARRANTY; without even the implied warranty of
22     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     GNU General Public License for more details.
24 
25     You should have received a copy of the GNU General Public License
26     along with this program; if not, write to the Free Software
27     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 
29 
30     Supports the following chips:
31 
32     Chip        #vin    #fan    #pwm    #temp   chip_id man_id
33     w83627ehf   -       5       -       3       0x88    0x5ca3
34 
35     This is a preliminary version of the driver, only supporting the
36     fan and temperature inputs. The chip does much more than that.
37 */
38 
39 #include <linux/module.h>
40 #include <linux/init.h>
41 #include <linux/slab.h>
42 #include <linux/i2c.h>
43 #include <linux/i2c-isa.h>
44 #include <linux/hwmon.h>
45 #include <linux/err.h>
46 #include <asm/io.h>
47 #include "lm75.h"
48 
49 /* The actual ISA address is read from Super-I/O configuration space */
50 static unsigned short address;
51 
52 /*
53  * Super-I/O constants and functions
54  */
55 
56 static int REG;		/* The register to read/write */
57 static int VAL;		/* The value to read/write */
58 
59 #define W83627EHF_LD_HWM	0x0b
60 
61 #define SIO_REG_LDSEL		0x07	/* Logical device select */
62 #define SIO_REG_DEVID		0x20	/* Device ID (2 bytes) */
63 #define SIO_REG_ENABLE		0x30	/* Logical device enable */
64 #define SIO_REG_ADDR		0x60	/* Logical device address (2 bytes) */
65 
66 #define SIO_W83627EHF_ID	0x8840
67 #define SIO_ID_MASK		0xFFC0
68 
69 static inline void
70 superio_outb(int reg, int val)
71 {
72 	outb(reg, REG);
73 	outb(val, VAL);
74 }
75 
76 static inline int
77 superio_inb(int reg)
78 {
79 	outb(reg, REG);
80 	return inb(VAL);
81 }
82 
83 static inline void
84 superio_select(int ld)
85 {
86 	outb(SIO_REG_LDSEL, REG);
87 	outb(ld, VAL);
88 }
89 
90 static inline void
91 superio_enter(void)
92 {
93 	outb(0x87, REG);
94 	outb(0x87, REG);
95 }
96 
97 static inline void
98 superio_exit(void)
99 {
100 	outb(0x02, REG);
101 	outb(0x02, VAL);
102 }
103 
104 /*
105  * ISA constants
106  */
107 
108 #define REGION_ALIGNMENT	~7
109 #define REGION_OFFSET		5
110 #define REGION_LENGTH		2
111 #define ADDR_REG_OFFSET		5
112 #define DATA_REG_OFFSET		6
113 
114 #define W83627EHF_REG_BANK		0x4E
115 #define W83627EHF_REG_CONFIG		0x40
116 #define W83627EHF_REG_CHIP_ID		0x49
117 #define W83627EHF_REG_MAN_ID		0x4F
118 
119 static const u16 W83627EHF_REG_FAN[] = { 0x28, 0x29, 0x2a, 0x3f, 0x553 };
120 static const u16 W83627EHF_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d, 0x3e, 0x55c };
121 
122 #define W83627EHF_REG_TEMP1		0x27
123 #define W83627EHF_REG_TEMP1_HYST	0x3a
124 #define W83627EHF_REG_TEMP1_OVER	0x39
125 static const u16 W83627EHF_REG_TEMP[] = { 0x150, 0x250 };
126 static const u16 W83627EHF_REG_TEMP_HYST[] = { 0x153, 0x253 };
127 static const u16 W83627EHF_REG_TEMP_OVER[] = { 0x155, 0x255 };
128 static const u16 W83627EHF_REG_TEMP_CONFIG[] = { 0x152, 0x252 };
129 
130 /* Fan clock dividers are spread over the following five registers */
131 #define W83627EHF_REG_FANDIV1		0x47
132 #define W83627EHF_REG_FANDIV2		0x4B
133 #define W83627EHF_REG_VBAT		0x5D
134 #define W83627EHF_REG_DIODE		0x59
135 #define W83627EHF_REG_SMI_OVT		0x4C
136 
137 /*
138  * Conversions
139  */
140 
141 static inline unsigned int
142 fan_from_reg(u8 reg, unsigned int div)
143 {
144 	if (reg == 0 || reg == 255)
145 		return 0;
146 	return 1350000U / (reg * div);
147 }
148 
149 static inline unsigned int
150 div_from_reg(u8 reg)
151 {
152 	return 1 << reg;
153 }
154 
155 static inline int
156 temp1_from_reg(s8 reg)
157 {
158 	return reg * 1000;
159 }
160 
161 static inline s8
162 temp1_to_reg(int temp)
163 {
164 	if (temp <= -128000)
165 		return -128;
166 	if (temp >= 127000)
167 		return 127;
168 	if (temp < 0)
169 		return (temp - 500) / 1000;
170 	return (temp + 500) / 1000;
171 }
172 
173 /*
174  * Data structures and manipulation thereof
175  */
176 
177 struct w83627ehf_data {
178 	struct i2c_client client;
179 	struct class_device *class_dev;
180 	struct semaphore lock;
181 
182 	struct semaphore update_lock;
183 	char valid;		/* !=0 if following fields are valid */
184 	unsigned long last_updated;	/* In jiffies */
185 
186 	/* Register values */
187 	u8 fan[5];
188 	u8 fan_min[5];
189 	u8 fan_div[5];
190 	u8 has_fan;		/* some fan inputs can be disabled */
191 	s8 temp1;
192 	s8 temp1_max;
193 	s8 temp1_max_hyst;
194 	s16 temp[2];
195 	s16 temp_max[2];
196 	s16 temp_max_hyst[2];
197 };
198 
199 static inline int is_word_sized(u16 reg)
200 {
201 	return (((reg & 0xff00) == 0x100
202 	      || (reg & 0xff00) == 0x200)
203 	     && ((reg & 0x00ff) == 0x50
204 	      || (reg & 0x00ff) == 0x53
205 	      || (reg & 0x00ff) == 0x55));
206 }
207 
208 /* We assume that the default bank is 0, thus the following two functions do
209    nothing for registers which live in bank 0. For others, they respectively
210    set the bank register to the correct value (before the register is
211    accessed), and back to 0 (afterwards). */
212 static inline void w83627ehf_set_bank(struct i2c_client *client, u16 reg)
213 {
214 	if (reg & 0xff00) {
215 		outb_p(W83627EHF_REG_BANK, client->addr + ADDR_REG_OFFSET);
216 		outb_p(reg >> 8, client->addr + DATA_REG_OFFSET);
217 	}
218 }
219 
220 static inline void w83627ehf_reset_bank(struct i2c_client *client, u16 reg)
221 {
222 	if (reg & 0xff00) {
223 		outb_p(W83627EHF_REG_BANK, client->addr + ADDR_REG_OFFSET);
224 		outb_p(0, client->addr + DATA_REG_OFFSET);
225 	}
226 }
227 
228 static u16 w83627ehf_read_value(struct i2c_client *client, u16 reg)
229 {
230 	struct w83627ehf_data *data = i2c_get_clientdata(client);
231 	int res, word_sized = is_word_sized(reg);
232 
233 	down(&data->lock);
234 
235 	w83627ehf_set_bank(client, reg);
236 	outb_p(reg & 0xff, client->addr + ADDR_REG_OFFSET);
237 	res = inb_p(client->addr + DATA_REG_OFFSET);
238 	if (word_sized) {
239 		outb_p((reg & 0xff) + 1,
240 		       client->addr + ADDR_REG_OFFSET);
241 		res = (res << 8) + inb_p(client->addr + DATA_REG_OFFSET);
242 	}
243 	w83627ehf_reset_bank(client, reg);
244 
245 	up(&data->lock);
246 
247 	return res;
248 }
249 
250 static int w83627ehf_write_value(struct i2c_client *client, u16 reg, u16 value)
251 {
252 	struct w83627ehf_data *data = i2c_get_clientdata(client);
253 	int word_sized = is_word_sized(reg);
254 
255 	down(&data->lock);
256 
257 	w83627ehf_set_bank(client, reg);
258 	outb_p(reg & 0xff, client->addr + ADDR_REG_OFFSET);
259 	if (word_sized) {
260 		outb_p(value >> 8, client->addr + DATA_REG_OFFSET);
261 		outb_p((reg & 0xff) + 1,
262 		       client->addr + ADDR_REG_OFFSET);
263 	}
264 	outb_p(value & 0xff, client->addr + DATA_REG_OFFSET);
265 	w83627ehf_reset_bank(client, reg);
266 
267 	up(&data->lock);
268 	return 0;
269 }
270 
271 /* This function assumes that the caller holds data->update_lock */
272 static void w83627ehf_write_fan_div(struct i2c_client *client, int nr)
273 {
274 	struct w83627ehf_data *data = i2c_get_clientdata(client);
275 	u8 reg;
276 
277 	switch (nr) {
278 	case 0:
279 		reg = (w83627ehf_read_value(client, W83627EHF_REG_FANDIV1) & 0xcf)
280 		    | ((data->fan_div[0] & 0x03) << 4);
281 		w83627ehf_write_value(client, W83627EHF_REG_FANDIV1, reg);
282 		reg = (w83627ehf_read_value(client, W83627EHF_REG_VBAT) & 0xdf)
283 		    | ((data->fan_div[0] & 0x04) << 3);
284 		w83627ehf_write_value(client, W83627EHF_REG_VBAT, reg);
285 		break;
286 	case 1:
287 		reg = (w83627ehf_read_value(client, W83627EHF_REG_FANDIV1) & 0x3f)
288 		    | ((data->fan_div[1] & 0x03) << 6);
289 		w83627ehf_write_value(client, W83627EHF_REG_FANDIV1, reg);
290 		reg = (w83627ehf_read_value(client, W83627EHF_REG_VBAT) & 0xbf)
291 		    | ((data->fan_div[1] & 0x04) << 4);
292 		w83627ehf_write_value(client, W83627EHF_REG_VBAT, reg);
293 		break;
294 	case 2:
295 		reg = (w83627ehf_read_value(client, W83627EHF_REG_FANDIV2) & 0x3f)
296 		    | ((data->fan_div[2] & 0x03) << 6);
297 		w83627ehf_write_value(client, W83627EHF_REG_FANDIV2, reg);
298 		reg = (w83627ehf_read_value(client, W83627EHF_REG_VBAT) & 0x7f)
299 		    | ((data->fan_div[2] & 0x04) << 5);
300 		w83627ehf_write_value(client, W83627EHF_REG_VBAT, reg);
301 		break;
302 	case 3:
303 		reg = (w83627ehf_read_value(client, W83627EHF_REG_DIODE) & 0xfc)
304 		    | (data->fan_div[3] & 0x03);
305 		w83627ehf_write_value(client, W83627EHF_REG_DIODE, reg);
306 		reg = (w83627ehf_read_value(client, W83627EHF_REG_SMI_OVT) & 0x7f)
307 		    | ((data->fan_div[3] & 0x04) << 5);
308 		w83627ehf_write_value(client, W83627EHF_REG_SMI_OVT, reg);
309 		break;
310 	case 4:
311 		reg = (w83627ehf_read_value(client, W83627EHF_REG_DIODE) & 0x73)
312 		    | ((data->fan_div[4] & 0x03) << 3)
313 		    | ((data->fan_div[4] & 0x04) << 5);
314 		w83627ehf_write_value(client, W83627EHF_REG_DIODE, reg);
315 		break;
316 	}
317 }
318 
319 static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
320 {
321 	struct i2c_client *client = to_i2c_client(dev);
322 	struct w83627ehf_data *data = i2c_get_clientdata(client);
323 	int i;
324 
325 	down(&data->update_lock);
326 
327 	if (time_after(jiffies, data->last_updated + HZ)
328 	 || !data->valid) {
329 		/* Fan clock dividers */
330 		i = w83627ehf_read_value(client, W83627EHF_REG_FANDIV1);
331 		data->fan_div[0] = (i >> 4) & 0x03;
332 		data->fan_div[1] = (i >> 6) & 0x03;
333 		i = w83627ehf_read_value(client, W83627EHF_REG_FANDIV2);
334 		data->fan_div[2] = (i >> 6) & 0x03;
335 		i = w83627ehf_read_value(client, W83627EHF_REG_VBAT);
336 		data->fan_div[0] |= (i >> 3) & 0x04;
337 		data->fan_div[1] |= (i >> 4) & 0x04;
338 		data->fan_div[2] |= (i >> 5) & 0x04;
339 		if (data->has_fan & ((1 << 3) | (1 << 4))) {
340 			i = w83627ehf_read_value(client, W83627EHF_REG_DIODE);
341 			data->fan_div[3] = i & 0x03;
342 			data->fan_div[4] = ((i >> 2) & 0x03)
343 					 | ((i >> 5) & 0x04);
344 		}
345 		if (data->has_fan & (1 << 3)) {
346 			i = w83627ehf_read_value(client, W83627EHF_REG_SMI_OVT);
347 			data->fan_div[3] |= (i >> 5) & 0x04;
348 		}
349 
350 		/* Measured fan speeds and limits */
351 		for (i = 0; i < 5; i++) {
352 			if (!(data->has_fan & (1 << i)))
353 				continue;
354 
355 			data->fan[i] = w83627ehf_read_value(client,
356 				       W83627EHF_REG_FAN[i]);
357 			data->fan_min[i] = w83627ehf_read_value(client,
358 					   W83627EHF_REG_FAN_MIN[i]);
359 
360 			/* If we failed to measure the fan speed and clock
361 			   divider can be increased, let's try that for next
362 			   time */
363 			if (data->fan[i] == 0xff
364 			 && data->fan_div[i] < 0x07) {
365 			 	dev_dbg(&client->dev, "Increasing fan %d "
366 					"clock divider from %u to %u\n",
367 					i, div_from_reg(data->fan_div[i]),
368 					div_from_reg(data->fan_div[i] + 1));
369 				data->fan_div[i]++;
370 				w83627ehf_write_fan_div(client, i);
371 				/* Preserve min limit if possible */
372 				if (data->fan_min[i] >= 2
373 				 && data->fan_min[i] != 255)
374 					w83627ehf_write_value(client,
375 						W83627EHF_REG_FAN_MIN[i],
376 						(data->fan_min[i] /= 2));
377 			}
378 		}
379 
380 		/* Measured temperatures and limits */
381 		data->temp1 = w83627ehf_read_value(client,
382 			      W83627EHF_REG_TEMP1);
383 		data->temp1_max = w83627ehf_read_value(client,
384 				  W83627EHF_REG_TEMP1_OVER);
385 		data->temp1_max_hyst = w83627ehf_read_value(client,
386 				       W83627EHF_REG_TEMP1_HYST);
387 		for (i = 0; i < 2; i++) {
388 			data->temp[i] = w83627ehf_read_value(client,
389 					W83627EHF_REG_TEMP[i]);
390 			data->temp_max[i] = w83627ehf_read_value(client,
391 					    W83627EHF_REG_TEMP_OVER[i]);
392 			data->temp_max_hyst[i] = w83627ehf_read_value(client,
393 						 W83627EHF_REG_TEMP_HYST[i]);
394 		}
395 
396 		data->last_updated = jiffies;
397 		data->valid = 1;
398 	}
399 
400 	up(&data->update_lock);
401 	return data;
402 }
403 
404 /*
405  * Sysfs callback functions
406  */
407 
408 #define show_fan_reg(reg) \
409 static ssize_t \
410 show_##reg(struct device *dev, char *buf, int nr) \
411 { \
412 	struct w83627ehf_data *data = w83627ehf_update_device(dev); \
413 	return sprintf(buf, "%d\n", \
414 		       fan_from_reg(data->reg[nr], \
415 				    div_from_reg(data->fan_div[nr]))); \
416 }
417 show_fan_reg(fan);
418 show_fan_reg(fan_min);
419 
420 static ssize_t
421 show_fan_div(struct device *dev, char *buf, int nr)
422 {
423 	struct w83627ehf_data *data = w83627ehf_update_device(dev);
424 	return sprintf(buf, "%u\n",
425 		       div_from_reg(data->fan_div[nr]));
426 }
427 
428 static ssize_t
429 store_fan_min(struct device *dev, const char *buf, size_t count, int nr)
430 {
431 	struct i2c_client *client = to_i2c_client(dev);
432 	struct w83627ehf_data *data = i2c_get_clientdata(client);
433 	unsigned int val = simple_strtoul(buf, NULL, 10);
434 	unsigned int reg;
435 	u8 new_div;
436 
437 	down(&data->update_lock);
438 	if (!val) {
439 		/* No min limit, alarm disabled */
440 		data->fan_min[nr] = 255;
441 		new_div = data->fan_div[nr]; /* No change */
442 		dev_info(dev, "fan%u low limit and alarm disabled\n", nr + 1);
443 	} else if ((reg = 1350000U / val) >= 128 * 255) {
444 		/* Speed below this value cannot possibly be represented,
445 		   even with the highest divider (128) */
446 		data->fan_min[nr] = 254;
447 		new_div = 7; /* 128 == (1 << 7) */
448 		dev_warn(dev, "fan%u low limit %u below minimum %u, set to "
449 			 "minimum\n", nr + 1, val, fan_from_reg(254, 128));
450 	} else if (!reg) {
451 		/* Speed above this value cannot possibly be represented,
452 		   even with the lowest divider (1) */
453 		data->fan_min[nr] = 1;
454 		new_div = 0; /* 1 == (1 << 0) */
455 		dev_warn(dev, "fan%u low limit %u above maximum %u, set to "
456 			 "maximum\n", nr + 1, val, fan_from_reg(1, 1));
457 	} else {
458 		/* Automatically pick the best divider, i.e. the one such
459 		   that the min limit will correspond to a register value
460 		   in the 96..192 range */
461 		new_div = 0;
462 		while (reg > 192 && new_div < 7) {
463 			reg >>= 1;
464 			new_div++;
465 		}
466 		data->fan_min[nr] = reg;
467 	}
468 
469 	/* Write both the fan clock divider (if it changed) and the new
470 	   fan min (unconditionally) */
471 	if (new_div != data->fan_div[nr]) {
472 		if (new_div > data->fan_div[nr])
473 			data->fan[nr] >>= (data->fan_div[nr] - new_div);
474 		else
475 			data->fan[nr] <<= (new_div - data->fan_div[nr]);
476 
477 		dev_dbg(dev, "fan%u clock divider changed from %u to %u\n",
478 			nr + 1, div_from_reg(data->fan_div[nr]),
479 			div_from_reg(new_div));
480 		data->fan_div[nr] = new_div;
481 		w83627ehf_write_fan_div(client, nr);
482 	}
483 	w83627ehf_write_value(client, W83627EHF_REG_FAN_MIN[nr],
484 			      data->fan_min[nr]);
485 	up(&data->update_lock);
486 
487 	return count;
488 }
489 
490 #define sysfs_fan_offset(offset) \
491 static ssize_t \
492 show_reg_fan_##offset(struct device *dev, struct device_attribute *attr, \
493 		      char *buf) \
494 { \
495 	return show_fan(dev, buf, offset-1); \
496 } \
497 static DEVICE_ATTR(fan##offset##_input, S_IRUGO, \
498 		   show_reg_fan_##offset, NULL);
499 
500 #define sysfs_fan_min_offset(offset) \
501 static ssize_t \
502 show_reg_fan##offset##_min(struct device *dev, struct device_attribute *attr, \
503 			   char *buf) \
504 { \
505 	return show_fan_min(dev, buf, offset-1); \
506 } \
507 static ssize_t \
508 store_reg_fan##offset##_min(struct device *dev, struct device_attribute *attr, \
509 			    const char *buf, size_t count) \
510 { \
511 	return store_fan_min(dev, buf, count, offset-1); \
512 } \
513 static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
514 		   show_reg_fan##offset##_min, \
515 		   store_reg_fan##offset##_min);
516 
517 #define sysfs_fan_div_offset(offset) \
518 static ssize_t \
519 show_reg_fan##offset##_div(struct device *dev, struct device_attribute *attr, \
520 			   char *buf) \
521 { \
522 	return show_fan_div(dev, buf, offset - 1); \
523 } \
524 static DEVICE_ATTR(fan##offset##_div, S_IRUGO, \
525 		   show_reg_fan##offset##_div, NULL);
526 
527 sysfs_fan_offset(1);
528 sysfs_fan_min_offset(1);
529 sysfs_fan_div_offset(1);
530 sysfs_fan_offset(2);
531 sysfs_fan_min_offset(2);
532 sysfs_fan_div_offset(2);
533 sysfs_fan_offset(3);
534 sysfs_fan_min_offset(3);
535 sysfs_fan_div_offset(3);
536 sysfs_fan_offset(4);
537 sysfs_fan_min_offset(4);
538 sysfs_fan_div_offset(4);
539 sysfs_fan_offset(5);
540 sysfs_fan_min_offset(5);
541 sysfs_fan_div_offset(5);
542 
543 #define show_temp1_reg(reg) \
544 static ssize_t \
545 show_##reg(struct device *dev, struct device_attribute *attr, \
546 	   char *buf) \
547 { \
548 	struct w83627ehf_data *data = w83627ehf_update_device(dev); \
549 	return sprintf(buf, "%d\n", temp1_from_reg(data->reg)); \
550 }
551 show_temp1_reg(temp1);
552 show_temp1_reg(temp1_max);
553 show_temp1_reg(temp1_max_hyst);
554 
555 #define store_temp1_reg(REG, reg) \
556 static ssize_t \
557 store_temp1_##reg(struct device *dev, struct device_attribute *attr, \
558 		  const char *buf, size_t count) \
559 { \
560 	struct i2c_client *client = to_i2c_client(dev); \
561 	struct w83627ehf_data *data = i2c_get_clientdata(client); \
562 	u32 val = simple_strtoul(buf, NULL, 10); \
563  \
564 	down(&data->update_lock); \
565 	data->temp1_##reg = temp1_to_reg(val); \
566 	w83627ehf_write_value(client, W83627EHF_REG_TEMP1_##REG, \
567 			      data->temp1_##reg); \
568 	up(&data->update_lock); \
569 	return count; \
570 }
571 store_temp1_reg(OVER, max);
572 store_temp1_reg(HYST, max_hyst);
573 
574 static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp1, NULL);
575 static DEVICE_ATTR(temp1_max, S_IRUGO| S_IWUSR,
576 		   show_temp1_max, store_temp1_max);
577 static DEVICE_ATTR(temp1_max_hyst, S_IRUGO| S_IWUSR,
578 		   show_temp1_max_hyst, store_temp1_max_hyst);
579 
580 #define show_temp_reg(reg) \
581 static ssize_t \
582 show_##reg (struct device *dev, char *buf, int nr) \
583 { \
584 	struct w83627ehf_data *data = w83627ehf_update_device(dev); \
585 	return sprintf(buf, "%d\n", \
586 		       LM75_TEMP_FROM_REG(data->reg[nr])); \
587 }
588 show_temp_reg(temp);
589 show_temp_reg(temp_max);
590 show_temp_reg(temp_max_hyst);
591 
592 #define store_temp_reg(REG, reg) \
593 static ssize_t \
594 store_##reg (struct device *dev, const char *buf, size_t count, int nr) \
595 { \
596 	struct i2c_client *client = to_i2c_client(dev); \
597 	struct w83627ehf_data *data = i2c_get_clientdata(client); \
598 	u32 val = simple_strtoul(buf, NULL, 10); \
599  \
600 	down(&data->update_lock); \
601 	data->reg[nr] = LM75_TEMP_TO_REG(val); \
602 	w83627ehf_write_value(client, W83627EHF_REG_TEMP_##REG[nr], \
603 			      data->reg[nr]); \
604 	up(&data->update_lock); \
605 	return count; \
606 }
607 store_temp_reg(OVER, temp_max);
608 store_temp_reg(HYST, temp_max_hyst);
609 
610 #define sysfs_temp_offset(offset) \
611 static ssize_t \
612 show_reg_temp##offset (struct device *dev, struct device_attribute *attr, \
613 		       char *buf) \
614 { \
615 	return show_temp(dev, buf, offset - 2); \
616 } \
617 static DEVICE_ATTR(temp##offset##_input, S_IRUGO, \
618 		   show_reg_temp##offset, NULL);
619 
620 #define sysfs_temp_reg_offset(reg, offset) \
621 static ssize_t \
622 show_reg_temp##offset##_##reg(struct device *dev, struct device_attribute *attr, \
623 			      char *buf) \
624 { \
625 	return show_temp_##reg(dev, buf, offset - 2); \
626 } \
627 static ssize_t \
628 store_reg_temp##offset##_##reg(struct device *dev, struct device_attribute *attr, \
629 			       const char *buf, size_t count) \
630 { \
631 	return store_temp_##reg(dev, buf, count, offset - 2); \
632 } \
633 static DEVICE_ATTR(temp##offset##_##reg, S_IRUGO| S_IWUSR, \
634 		   show_reg_temp##offset##_##reg, \
635 		   store_reg_temp##offset##_##reg);
636 
637 sysfs_temp_offset(2);
638 sysfs_temp_reg_offset(max, 2);
639 sysfs_temp_reg_offset(max_hyst, 2);
640 sysfs_temp_offset(3);
641 sysfs_temp_reg_offset(max, 3);
642 sysfs_temp_reg_offset(max_hyst, 3);
643 
644 /*
645  * Driver and client management
646  */
647 
648 static struct i2c_driver w83627ehf_driver;
649 
650 static void w83627ehf_init_client(struct i2c_client *client)
651 {
652 	int i;
653 	u8 tmp;
654 
655 	/* Start monitoring is needed */
656 	tmp = w83627ehf_read_value(client, W83627EHF_REG_CONFIG);
657 	if (!(tmp & 0x01))
658 		w83627ehf_write_value(client, W83627EHF_REG_CONFIG,
659 				      tmp | 0x01);
660 
661 	/* Enable temp2 and temp3 if needed */
662 	for (i = 0; i < 2; i++) {
663 		tmp = w83627ehf_read_value(client,
664 					   W83627EHF_REG_TEMP_CONFIG[i]);
665 		if (tmp & 0x01)
666 			w83627ehf_write_value(client,
667 					      W83627EHF_REG_TEMP_CONFIG[i],
668 					      tmp & 0xfe);
669 	}
670 }
671 
672 static int w83627ehf_detect(struct i2c_adapter *adapter)
673 {
674 	struct i2c_client *client;
675 	struct w83627ehf_data *data;
676 	int i, err = 0;
677 
678 	if (!request_region(address + REGION_OFFSET, REGION_LENGTH,
679 	                    w83627ehf_driver.name)) {
680 		err = -EBUSY;
681 		goto exit;
682 	}
683 
684 	if (!(data = kzalloc(sizeof(struct w83627ehf_data), GFP_KERNEL))) {
685 		err = -ENOMEM;
686 		goto exit_release;
687 	}
688 
689 	client = &data->client;
690 	i2c_set_clientdata(client, data);
691 	client->addr = address;
692 	init_MUTEX(&data->lock);
693 	client->adapter = adapter;
694 	client->driver = &w83627ehf_driver;
695 	client->flags = 0;
696 
697 	strlcpy(client->name, "w83627ehf", I2C_NAME_SIZE);
698 	data->valid = 0;
699 	init_MUTEX(&data->update_lock);
700 
701 	/* Tell the i2c layer a new client has arrived */
702 	if ((err = i2c_attach_client(client)))
703 		goto exit_free;
704 
705 	/* Initialize the chip */
706 	w83627ehf_init_client(client);
707 
708 	/* A few vars need to be filled upon startup */
709 	for (i = 0; i < 5; i++)
710 		data->fan_min[i] = w83627ehf_read_value(client,
711 				   W83627EHF_REG_FAN_MIN[i]);
712 
713 	/* It looks like fan4 and fan5 pins can be alternatively used
714 	   as fan on/off switches */
715 	data->has_fan = 0x07; /* fan1, fan2 and fan3 */
716 	i = w83627ehf_read_value(client, W83627EHF_REG_FANDIV1);
717 	if (i & (1 << 2))
718 		data->has_fan |= (1 << 3);
719 	if (i & (1 << 0))
720 		data->has_fan |= (1 << 4);
721 
722 	/* Register sysfs hooks */
723 	data->class_dev = hwmon_device_register(&client->dev);
724 	if (IS_ERR(data->class_dev)) {
725 		err = PTR_ERR(data->class_dev);
726 		goto exit_detach;
727 	}
728 
729 	device_create_file(&client->dev, &dev_attr_fan1_input);
730 	device_create_file(&client->dev, &dev_attr_fan1_min);
731 	device_create_file(&client->dev, &dev_attr_fan1_div);
732 	device_create_file(&client->dev, &dev_attr_fan2_input);
733 	device_create_file(&client->dev, &dev_attr_fan2_min);
734 	device_create_file(&client->dev, &dev_attr_fan2_div);
735 	device_create_file(&client->dev, &dev_attr_fan3_input);
736 	device_create_file(&client->dev, &dev_attr_fan3_min);
737 	device_create_file(&client->dev, &dev_attr_fan3_div);
738 
739 	if (data->has_fan & (1 << 3)) {
740 		device_create_file(&client->dev, &dev_attr_fan4_input);
741 		device_create_file(&client->dev, &dev_attr_fan4_min);
742 		device_create_file(&client->dev, &dev_attr_fan4_div);
743 	}
744 	if (data->has_fan & (1 << 4)) {
745 		device_create_file(&client->dev, &dev_attr_fan5_input);
746 		device_create_file(&client->dev, &dev_attr_fan5_min);
747 		device_create_file(&client->dev, &dev_attr_fan5_div);
748 	}
749 
750 	device_create_file(&client->dev, &dev_attr_temp1_input);
751 	device_create_file(&client->dev, &dev_attr_temp1_max);
752 	device_create_file(&client->dev, &dev_attr_temp1_max_hyst);
753 	device_create_file(&client->dev, &dev_attr_temp2_input);
754 	device_create_file(&client->dev, &dev_attr_temp2_max);
755 	device_create_file(&client->dev, &dev_attr_temp2_max_hyst);
756 	device_create_file(&client->dev, &dev_attr_temp3_input);
757 	device_create_file(&client->dev, &dev_attr_temp3_max);
758 	device_create_file(&client->dev, &dev_attr_temp3_max_hyst);
759 
760 	return 0;
761 
762 exit_detach:
763 	i2c_detach_client(client);
764 exit_free:
765 	kfree(data);
766 exit_release:
767 	release_region(address + REGION_OFFSET, REGION_LENGTH);
768 exit:
769 	return err;
770 }
771 
772 static int w83627ehf_detach_client(struct i2c_client *client)
773 {
774 	struct w83627ehf_data *data = i2c_get_clientdata(client);
775 	int err;
776 
777 	hwmon_device_unregister(data->class_dev);
778 
779 	if ((err = i2c_detach_client(client)))
780 		return err;
781 	release_region(client->addr + REGION_OFFSET, REGION_LENGTH);
782 	kfree(data);
783 
784 	return 0;
785 }
786 
787 static struct i2c_driver w83627ehf_driver = {
788 	.owner		= THIS_MODULE,
789 	.name		= "w83627ehf",
790 	.attach_adapter	= w83627ehf_detect,
791 	.detach_client	= w83627ehf_detach_client,
792 };
793 
794 static int __init w83627ehf_find(int sioaddr, unsigned short *addr)
795 {
796 	u16 val;
797 
798 	REG = sioaddr;
799 	VAL = sioaddr + 1;
800 	superio_enter();
801 
802 	val = (superio_inb(SIO_REG_DEVID) << 8)
803 	    | superio_inb(SIO_REG_DEVID + 1);
804 	if ((val & SIO_ID_MASK) != SIO_W83627EHF_ID) {
805 		superio_exit();
806 		return -ENODEV;
807 	}
808 
809 	superio_select(W83627EHF_LD_HWM);
810 	val = (superio_inb(SIO_REG_ADDR) << 8)
811 	    | superio_inb(SIO_REG_ADDR + 1);
812 	*addr = val & REGION_ALIGNMENT;
813 	if (*addr == 0) {
814 		superio_exit();
815 		return -ENODEV;
816 	}
817 
818 	/* Activate logical device if needed */
819 	val = superio_inb(SIO_REG_ENABLE);
820 	if (!(val & 0x01))
821 		superio_outb(SIO_REG_ENABLE, val | 0x01);
822 
823 	superio_exit();
824 	return 0;
825 }
826 
827 static int __init sensors_w83627ehf_init(void)
828 {
829 	if (w83627ehf_find(0x2e, &address)
830 	 && w83627ehf_find(0x4e, &address))
831 		return -ENODEV;
832 
833 	return i2c_isa_add_driver(&w83627ehf_driver);
834 }
835 
836 static void __exit sensors_w83627ehf_exit(void)
837 {
838 	i2c_isa_del_driver(&w83627ehf_driver);
839 }
840 
841 MODULE_AUTHOR("Jean Delvare <khali@linux-fr.org>");
842 MODULE_DESCRIPTION("W83627EHF driver");
843 MODULE_LICENSE("GPL");
844 
845 module_init(sensors_w83627ehf_init);
846 module_exit(sensors_w83627ehf_exit);
847