Linux 2.6.17.7
[linux/fpc-iii.git] / drivers / hwmon / w83627ehf.c
blobb6bd5685fd389dd634ab6318935d4aee94fd362a
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>
6 Shamelessly ripped from the w83627hf driver
7 Copyright (C) 2003 Mark Studebaker
9 Thanks to Leon Moonen, Steve Cliffe and Grant Coady for their help
10 in testing and debugging this driver.
12 This driver also supports the W83627EHG, which is the lead-free
13 version of the W83627EHF.
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.
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.
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.
30 Supports the following chips:
32 Chip #vin #fan #pwm #temp chip_id man_id
33 w83627ehf - 5 - 3 0x88 0x5ca3
35 This is a preliminary version of the driver, only supporting the
36 fan and temperature inputs. The chip does much more than that.
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/hwmon-sysfs.h>
46 #include <linux/err.h>
47 #include <linux/mutex.h>
48 #include <asm/io.h>
49 #include "lm75.h"
51 /* The actual ISA address is read from Super-I/O configuration space */
52 static unsigned short address;
55 * Super-I/O constants and functions
58 static int REG; /* The register to read/write */
59 static int VAL; /* The value to read/write */
61 #define W83627EHF_LD_HWM 0x0b
63 #define SIO_REG_LDSEL 0x07 /* Logical device select */
64 #define SIO_REG_DEVID 0x20 /* Device ID (2 bytes) */
65 #define SIO_REG_ENABLE 0x30 /* Logical device enable */
66 #define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */
68 #define SIO_W83627EHF_ID 0x8840
69 #define SIO_ID_MASK 0xFFC0
71 static inline void
72 superio_outb(int reg, int val)
74 outb(reg, REG);
75 outb(val, VAL);
78 static inline int
79 superio_inb(int reg)
81 outb(reg, REG);
82 return inb(VAL);
85 static inline void
86 superio_select(int ld)
88 outb(SIO_REG_LDSEL, REG);
89 outb(ld, VAL);
92 static inline void
93 superio_enter(void)
95 outb(0x87, REG);
96 outb(0x87, REG);
99 static inline void
100 superio_exit(void)
102 outb(0x02, REG);
103 outb(0x02, VAL);
107 * ISA constants
110 #define REGION_ALIGNMENT ~7
111 #define REGION_OFFSET 5
112 #define REGION_LENGTH 2
113 #define ADDR_REG_OFFSET 5
114 #define DATA_REG_OFFSET 6
116 #define W83627EHF_REG_BANK 0x4E
117 #define W83627EHF_REG_CONFIG 0x40
118 #define W83627EHF_REG_CHIP_ID 0x49
119 #define W83627EHF_REG_MAN_ID 0x4F
121 static const u16 W83627EHF_REG_FAN[] = { 0x28, 0x29, 0x2a, 0x3f, 0x553 };
122 static const u16 W83627EHF_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d, 0x3e, 0x55c };
124 #define W83627EHF_REG_TEMP1 0x27
125 #define W83627EHF_REG_TEMP1_HYST 0x3a
126 #define W83627EHF_REG_TEMP1_OVER 0x39
127 static const u16 W83627EHF_REG_TEMP[] = { 0x150, 0x250 };
128 static const u16 W83627EHF_REG_TEMP_HYST[] = { 0x153, 0x253 };
129 static const u16 W83627EHF_REG_TEMP_OVER[] = { 0x155, 0x255 };
130 static const u16 W83627EHF_REG_TEMP_CONFIG[] = { 0x152, 0x252 };
132 /* Fan clock dividers are spread over the following five registers */
133 #define W83627EHF_REG_FANDIV1 0x47
134 #define W83627EHF_REG_FANDIV2 0x4B
135 #define W83627EHF_REG_VBAT 0x5D
136 #define W83627EHF_REG_DIODE 0x59
137 #define W83627EHF_REG_SMI_OVT 0x4C
140 * Conversions
143 static inline unsigned int
144 fan_from_reg(u8 reg, unsigned int div)
146 if (reg == 0 || reg == 255)
147 return 0;
148 return 1350000U / (reg * div);
151 static inline unsigned int
152 div_from_reg(u8 reg)
154 return 1 << reg;
157 static inline int
158 temp1_from_reg(s8 reg)
160 return reg * 1000;
163 static inline s8
164 temp1_to_reg(int temp)
166 if (temp <= -128000)
167 return -128;
168 if (temp >= 127000)
169 return 127;
170 if (temp < 0)
171 return (temp - 500) / 1000;
172 return (temp + 500) / 1000;
176 * Data structures and manipulation thereof
179 struct w83627ehf_data {
180 struct i2c_client client;
181 struct class_device *class_dev;
182 struct mutex lock;
184 struct mutex update_lock;
185 char valid; /* !=0 if following fields are valid */
186 unsigned long last_updated; /* In jiffies */
188 /* Register values */
189 u8 fan[5];
190 u8 fan_min[5];
191 u8 fan_div[5];
192 u8 has_fan; /* some fan inputs can be disabled */
193 s8 temp1;
194 s8 temp1_max;
195 s8 temp1_max_hyst;
196 s16 temp[2];
197 s16 temp_max[2];
198 s16 temp_max_hyst[2];
201 static inline int is_word_sized(u16 reg)
203 return (((reg & 0xff00) == 0x100
204 || (reg & 0xff00) == 0x200)
205 && ((reg & 0x00ff) == 0x50
206 || (reg & 0x00ff) == 0x53
207 || (reg & 0x00ff) == 0x55));
210 /* We assume that the default bank is 0, thus the following two functions do
211 nothing for registers which live in bank 0. For others, they respectively
212 set the bank register to the correct value (before the register is
213 accessed), and back to 0 (afterwards). */
214 static inline void w83627ehf_set_bank(struct i2c_client *client, u16 reg)
216 if (reg & 0xff00) {
217 outb_p(W83627EHF_REG_BANK, client->addr + ADDR_REG_OFFSET);
218 outb_p(reg >> 8, client->addr + DATA_REG_OFFSET);
222 static inline void w83627ehf_reset_bank(struct i2c_client *client, u16 reg)
224 if (reg & 0xff00) {
225 outb_p(W83627EHF_REG_BANK, client->addr + ADDR_REG_OFFSET);
226 outb_p(0, client->addr + DATA_REG_OFFSET);
230 static u16 w83627ehf_read_value(struct i2c_client *client, u16 reg)
232 struct w83627ehf_data *data = i2c_get_clientdata(client);
233 int res, word_sized = is_word_sized(reg);
235 mutex_lock(&data->lock);
237 w83627ehf_set_bank(client, reg);
238 outb_p(reg & 0xff, client->addr + ADDR_REG_OFFSET);
239 res = inb_p(client->addr + DATA_REG_OFFSET);
240 if (word_sized) {
241 outb_p((reg & 0xff) + 1,
242 client->addr + ADDR_REG_OFFSET);
243 res = (res << 8) + inb_p(client->addr + DATA_REG_OFFSET);
245 w83627ehf_reset_bank(client, reg);
247 mutex_unlock(&data->lock);
249 return res;
252 static int w83627ehf_write_value(struct i2c_client *client, u16 reg, u16 value)
254 struct w83627ehf_data *data = i2c_get_clientdata(client);
255 int word_sized = is_word_sized(reg);
257 mutex_lock(&data->lock);
259 w83627ehf_set_bank(client, reg);
260 outb_p(reg & 0xff, client->addr + ADDR_REG_OFFSET);
261 if (word_sized) {
262 outb_p(value >> 8, client->addr + DATA_REG_OFFSET);
263 outb_p((reg & 0xff) + 1,
264 client->addr + ADDR_REG_OFFSET);
266 outb_p(value & 0xff, client->addr + DATA_REG_OFFSET);
267 w83627ehf_reset_bank(client, reg);
269 mutex_unlock(&data->lock);
270 return 0;
273 /* This function assumes that the caller holds data->update_lock */
274 static void w83627ehf_write_fan_div(struct i2c_client *client, int nr)
276 struct w83627ehf_data *data = i2c_get_clientdata(client);
277 u8 reg;
279 switch (nr) {
280 case 0:
281 reg = (w83627ehf_read_value(client, W83627EHF_REG_FANDIV1) & 0xcf)
282 | ((data->fan_div[0] & 0x03) << 4);
283 w83627ehf_write_value(client, W83627EHF_REG_FANDIV1, reg);
284 reg = (w83627ehf_read_value(client, W83627EHF_REG_VBAT) & 0xdf)
285 | ((data->fan_div[0] & 0x04) << 3);
286 w83627ehf_write_value(client, W83627EHF_REG_VBAT, reg);
287 break;
288 case 1:
289 reg = (w83627ehf_read_value(client, W83627EHF_REG_FANDIV1) & 0x3f)
290 | ((data->fan_div[1] & 0x03) << 6);
291 w83627ehf_write_value(client, W83627EHF_REG_FANDIV1, reg);
292 reg = (w83627ehf_read_value(client, W83627EHF_REG_VBAT) & 0xbf)
293 | ((data->fan_div[1] & 0x04) << 4);
294 w83627ehf_write_value(client, W83627EHF_REG_VBAT, reg);
295 break;
296 case 2:
297 reg = (w83627ehf_read_value(client, W83627EHF_REG_FANDIV2) & 0x3f)
298 | ((data->fan_div[2] & 0x03) << 6);
299 w83627ehf_write_value(client, W83627EHF_REG_FANDIV2, reg);
300 reg = (w83627ehf_read_value(client, W83627EHF_REG_VBAT) & 0x7f)
301 | ((data->fan_div[2] & 0x04) << 5);
302 w83627ehf_write_value(client, W83627EHF_REG_VBAT, reg);
303 break;
304 case 3:
305 reg = (w83627ehf_read_value(client, W83627EHF_REG_DIODE) & 0xfc)
306 | (data->fan_div[3] & 0x03);
307 w83627ehf_write_value(client, W83627EHF_REG_DIODE, reg);
308 reg = (w83627ehf_read_value(client, W83627EHF_REG_SMI_OVT) & 0x7f)
309 | ((data->fan_div[3] & 0x04) << 5);
310 w83627ehf_write_value(client, W83627EHF_REG_SMI_OVT, reg);
311 break;
312 case 4:
313 reg = (w83627ehf_read_value(client, W83627EHF_REG_DIODE) & 0x73)
314 | ((data->fan_div[4] & 0x03) << 3)
315 | ((data->fan_div[4] & 0x04) << 5);
316 w83627ehf_write_value(client, W83627EHF_REG_DIODE, reg);
317 break;
321 static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
323 struct i2c_client *client = to_i2c_client(dev);
324 struct w83627ehf_data *data = i2c_get_clientdata(client);
325 int i;
327 mutex_lock(&data->update_lock);
329 if (time_after(jiffies, data->last_updated + HZ)
330 || !data->valid) {
331 /* Fan clock dividers */
332 i = w83627ehf_read_value(client, W83627EHF_REG_FANDIV1);
333 data->fan_div[0] = (i >> 4) & 0x03;
334 data->fan_div[1] = (i >> 6) & 0x03;
335 i = w83627ehf_read_value(client, W83627EHF_REG_FANDIV2);
336 data->fan_div[2] = (i >> 6) & 0x03;
337 i = w83627ehf_read_value(client, W83627EHF_REG_VBAT);
338 data->fan_div[0] |= (i >> 3) & 0x04;
339 data->fan_div[1] |= (i >> 4) & 0x04;
340 data->fan_div[2] |= (i >> 5) & 0x04;
341 if (data->has_fan & ((1 << 3) | (1 << 4))) {
342 i = w83627ehf_read_value(client, W83627EHF_REG_DIODE);
343 data->fan_div[3] = i & 0x03;
344 data->fan_div[4] = ((i >> 2) & 0x03)
345 | ((i >> 5) & 0x04);
347 if (data->has_fan & (1 << 3)) {
348 i = w83627ehf_read_value(client, W83627EHF_REG_SMI_OVT);
349 data->fan_div[3] |= (i >> 5) & 0x04;
352 /* Measured fan speeds and limits */
353 for (i = 0; i < 5; i++) {
354 if (!(data->has_fan & (1 << i)))
355 continue;
357 data->fan[i] = w83627ehf_read_value(client,
358 W83627EHF_REG_FAN[i]);
359 data->fan_min[i] = w83627ehf_read_value(client,
360 W83627EHF_REG_FAN_MIN[i]);
362 /* If we failed to measure the fan speed and clock
363 divider can be increased, let's try that for next
364 time */
365 if (data->fan[i] == 0xff
366 && data->fan_div[i] < 0x07) {
367 dev_dbg(&client->dev, "Increasing fan %d "
368 "clock divider from %u to %u\n",
369 i, div_from_reg(data->fan_div[i]),
370 div_from_reg(data->fan_div[i] + 1));
371 data->fan_div[i]++;
372 w83627ehf_write_fan_div(client, i);
373 /* Preserve min limit if possible */
374 if (data->fan_min[i] >= 2
375 && data->fan_min[i] != 255)
376 w83627ehf_write_value(client,
377 W83627EHF_REG_FAN_MIN[i],
378 (data->fan_min[i] /= 2));
382 /* Measured temperatures and limits */
383 data->temp1 = w83627ehf_read_value(client,
384 W83627EHF_REG_TEMP1);
385 data->temp1_max = w83627ehf_read_value(client,
386 W83627EHF_REG_TEMP1_OVER);
387 data->temp1_max_hyst = w83627ehf_read_value(client,
388 W83627EHF_REG_TEMP1_HYST);
389 for (i = 0; i < 2; i++) {
390 data->temp[i] = w83627ehf_read_value(client,
391 W83627EHF_REG_TEMP[i]);
392 data->temp_max[i] = w83627ehf_read_value(client,
393 W83627EHF_REG_TEMP_OVER[i]);
394 data->temp_max_hyst[i] = w83627ehf_read_value(client,
395 W83627EHF_REG_TEMP_HYST[i]);
398 data->last_updated = jiffies;
399 data->valid = 1;
402 mutex_unlock(&data->update_lock);
403 return data;
407 * Sysfs callback functions
410 #define show_fan_reg(reg) \
411 static ssize_t \
412 show_##reg(struct device *dev, struct device_attribute *attr, \
413 char *buf) \
415 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
416 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
417 int nr = sensor_attr->index; \
418 return sprintf(buf, "%d\n", \
419 fan_from_reg(data->reg[nr], \
420 div_from_reg(data->fan_div[nr]))); \
422 show_fan_reg(fan);
423 show_fan_reg(fan_min);
425 static ssize_t
426 show_fan_div(struct device *dev, struct device_attribute *attr,
427 char *buf)
429 struct w83627ehf_data *data = w83627ehf_update_device(dev);
430 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
431 int nr = sensor_attr->index;
432 return sprintf(buf, "%u\n", div_from_reg(data->fan_div[nr]));
435 static ssize_t
436 store_fan_min(struct device *dev, struct device_attribute *attr,
437 const char *buf, size_t count)
439 struct i2c_client *client = to_i2c_client(dev);
440 struct w83627ehf_data *data = i2c_get_clientdata(client);
441 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
442 int nr = sensor_attr->index;
443 unsigned int val = simple_strtoul(buf, NULL, 10);
444 unsigned int reg;
445 u8 new_div;
447 mutex_lock(&data->update_lock);
448 if (!val) {
449 /* No min limit, alarm disabled */
450 data->fan_min[nr] = 255;
451 new_div = data->fan_div[nr]; /* No change */
452 dev_info(dev, "fan%u low limit and alarm disabled\n", nr + 1);
453 } else if ((reg = 1350000U / val) >= 128 * 255) {
454 /* Speed below this value cannot possibly be represented,
455 even with the highest divider (128) */
456 data->fan_min[nr] = 254;
457 new_div = 7; /* 128 == (1 << 7) */
458 dev_warn(dev, "fan%u low limit %u below minimum %u, set to "
459 "minimum\n", nr + 1, val, fan_from_reg(254, 128));
460 } else if (!reg) {
461 /* Speed above this value cannot possibly be represented,
462 even with the lowest divider (1) */
463 data->fan_min[nr] = 1;
464 new_div = 0; /* 1 == (1 << 0) */
465 dev_warn(dev, "fan%u low limit %u above maximum %u, set to "
466 "maximum\n", nr + 1, val, fan_from_reg(1, 1));
467 } else {
468 /* Automatically pick the best divider, i.e. the one such
469 that the min limit will correspond to a register value
470 in the 96..192 range */
471 new_div = 0;
472 while (reg > 192 && new_div < 7) {
473 reg >>= 1;
474 new_div++;
476 data->fan_min[nr] = reg;
479 /* Write both the fan clock divider (if it changed) and the new
480 fan min (unconditionally) */
481 if (new_div != data->fan_div[nr]) {
482 if (new_div > data->fan_div[nr])
483 data->fan[nr] >>= (data->fan_div[nr] - new_div);
484 else
485 data->fan[nr] <<= (new_div - data->fan_div[nr]);
487 dev_dbg(dev, "fan%u clock divider changed from %u to %u\n",
488 nr + 1, div_from_reg(data->fan_div[nr]),
489 div_from_reg(new_div));
490 data->fan_div[nr] = new_div;
491 w83627ehf_write_fan_div(client, nr);
493 w83627ehf_write_value(client, W83627EHF_REG_FAN_MIN[nr],
494 data->fan_min[nr]);
495 mutex_unlock(&data->update_lock);
497 return count;
500 static struct sensor_device_attribute sda_fan_input[] = {
501 SENSOR_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0),
502 SENSOR_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1),
503 SENSOR_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2),
504 SENSOR_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 3),
505 SENSOR_ATTR(fan5_input, S_IRUGO, show_fan, NULL, 4),
508 static struct sensor_device_attribute sda_fan_min[] = {
509 SENSOR_ATTR(fan1_min, S_IWUSR | S_IRUGO, show_fan_min,
510 store_fan_min, 0),
511 SENSOR_ATTR(fan2_min, S_IWUSR | S_IRUGO, show_fan_min,
512 store_fan_min, 1),
513 SENSOR_ATTR(fan3_min, S_IWUSR | S_IRUGO, show_fan_min,
514 store_fan_min, 2),
515 SENSOR_ATTR(fan4_min, S_IWUSR | S_IRUGO, show_fan_min,
516 store_fan_min, 3),
517 SENSOR_ATTR(fan5_min, S_IWUSR | S_IRUGO, show_fan_min,
518 store_fan_min, 4),
521 static struct sensor_device_attribute sda_fan_div[] = {
522 SENSOR_ATTR(fan1_div, S_IRUGO, show_fan_div, NULL, 0),
523 SENSOR_ATTR(fan2_div, S_IRUGO, show_fan_div, NULL, 1),
524 SENSOR_ATTR(fan3_div, S_IRUGO, show_fan_div, NULL, 2),
525 SENSOR_ATTR(fan4_div, S_IRUGO, show_fan_div, NULL, 3),
526 SENSOR_ATTR(fan5_div, S_IRUGO, show_fan_div, NULL, 4),
529 static void device_create_file_fan(struct device *dev, int i)
531 device_create_file(dev, &sda_fan_input[i].dev_attr);
532 device_create_file(dev, &sda_fan_div[i].dev_attr);
533 device_create_file(dev, &sda_fan_min[i].dev_attr);
536 #define show_temp1_reg(reg) \
537 static ssize_t \
538 show_##reg(struct device *dev, struct device_attribute *attr, \
539 char *buf) \
541 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
542 return sprintf(buf, "%d\n", temp1_from_reg(data->reg)); \
544 show_temp1_reg(temp1);
545 show_temp1_reg(temp1_max);
546 show_temp1_reg(temp1_max_hyst);
548 #define store_temp1_reg(REG, reg) \
549 static ssize_t \
550 store_temp1_##reg(struct device *dev, struct device_attribute *attr, \
551 const char *buf, size_t count) \
553 struct i2c_client *client = to_i2c_client(dev); \
554 struct w83627ehf_data *data = i2c_get_clientdata(client); \
555 u32 val = simple_strtoul(buf, NULL, 10); \
557 mutex_lock(&data->update_lock); \
558 data->temp1_##reg = temp1_to_reg(val); \
559 w83627ehf_write_value(client, W83627EHF_REG_TEMP1_##REG, \
560 data->temp1_##reg); \
561 mutex_unlock(&data->update_lock); \
562 return count; \
564 store_temp1_reg(OVER, max);
565 store_temp1_reg(HYST, max_hyst);
567 #define show_temp_reg(reg) \
568 static ssize_t \
569 show_##reg(struct device *dev, struct device_attribute *attr, \
570 char *buf) \
572 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
573 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
574 int nr = sensor_attr->index; \
575 return sprintf(buf, "%d\n", \
576 LM75_TEMP_FROM_REG(data->reg[nr])); \
578 show_temp_reg(temp);
579 show_temp_reg(temp_max);
580 show_temp_reg(temp_max_hyst);
582 #define store_temp_reg(REG, reg) \
583 static ssize_t \
584 store_##reg(struct device *dev, struct device_attribute *attr, \
585 const char *buf, size_t count) \
587 struct i2c_client *client = to_i2c_client(dev); \
588 struct w83627ehf_data *data = i2c_get_clientdata(client); \
589 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
590 int nr = sensor_attr->index; \
591 u32 val = simple_strtoul(buf, NULL, 10); \
593 mutex_lock(&data->update_lock); \
594 data->reg[nr] = LM75_TEMP_TO_REG(val); \
595 w83627ehf_write_value(client, W83627EHF_REG_TEMP_##REG[nr], \
596 data->reg[nr]); \
597 mutex_unlock(&data->update_lock); \
598 return count; \
600 store_temp_reg(OVER, temp_max);
601 store_temp_reg(HYST, temp_max_hyst);
603 static struct sensor_device_attribute sda_temp[] = {
604 SENSOR_ATTR(temp1_input, S_IRUGO, show_temp1, NULL, 0),
605 SENSOR_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 0),
606 SENSOR_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 1),
607 SENSOR_ATTR(temp1_max, S_IRUGO | S_IWUSR, show_temp1_max,
608 store_temp1_max, 0),
609 SENSOR_ATTR(temp2_max, S_IRUGO | S_IWUSR, show_temp_max,
610 store_temp_max, 0),
611 SENSOR_ATTR(temp3_max, S_IRUGO | S_IWUSR, show_temp_max,
612 store_temp_max, 1),
613 SENSOR_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR, show_temp1_max_hyst,
614 store_temp1_max_hyst, 0),
615 SENSOR_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
616 store_temp_max_hyst, 0),
617 SENSOR_ATTR(temp3_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
618 store_temp_max_hyst, 1),
622 * Driver and client management
625 static struct i2c_driver w83627ehf_driver;
627 static void w83627ehf_init_client(struct i2c_client *client)
629 int i;
630 u8 tmp;
632 /* Start monitoring is needed */
633 tmp = w83627ehf_read_value(client, W83627EHF_REG_CONFIG);
634 if (!(tmp & 0x01))
635 w83627ehf_write_value(client, W83627EHF_REG_CONFIG,
636 tmp | 0x01);
638 /* Enable temp2 and temp3 if needed */
639 for (i = 0; i < 2; i++) {
640 tmp = w83627ehf_read_value(client,
641 W83627EHF_REG_TEMP_CONFIG[i]);
642 if (tmp & 0x01)
643 w83627ehf_write_value(client,
644 W83627EHF_REG_TEMP_CONFIG[i],
645 tmp & 0xfe);
649 static int w83627ehf_detect(struct i2c_adapter *adapter)
651 struct i2c_client *client;
652 struct w83627ehf_data *data;
653 struct device *dev;
654 int i, err = 0;
656 if (!request_region(address + REGION_OFFSET, REGION_LENGTH,
657 w83627ehf_driver.driver.name)) {
658 err = -EBUSY;
659 goto exit;
662 if (!(data = kzalloc(sizeof(struct w83627ehf_data), GFP_KERNEL))) {
663 err = -ENOMEM;
664 goto exit_release;
667 client = &data->client;
668 i2c_set_clientdata(client, data);
669 client->addr = address;
670 mutex_init(&data->lock);
671 client->adapter = adapter;
672 client->driver = &w83627ehf_driver;
673 client->flags = 0;
674 dev = &client->dev;
676 strlcpy(client->name, "w83627ehf", I2C_NAME_SIZE);
677 data->valid = 0;
678 mutex_init(&data->update_lock);
680 /* Tell the i2c layer a new client has arrived */
681 if ((err = i2c_attach_client(client)))
682 goto exit_free;
684 /* Initialize the chip */
685 w83627ehf_init_client(client);
687 /* A few vars need to be filled upon startup */
688 for (i = 0; i < 5; i++)
689 data->fan_min[i] = w83627ehf_read_value(client,
690 W83627EHF_REG_FAN_MIN[i]);
692 /* It looks like fan4 and fan5 pins can be alternatively used
693 as fan on/off switches */
694 data->has_fan = 0x07; /* fan1, fan2 and fan3 */
695 i = w83627ehf_read_value(client, W83627EHF_REG_FANDIV1);
696 if (i & (1 << 2))
697 data->has_fan |= (1 << 3);
698 if (i & (1 << 0))
699 data->has_fan |= (1 << 4);
701 /* Register sysfs hooks */
702 data->class_dev = hwmon_device_register(dev);
703 if (IS_ERR(data->class_dev)) {
704 err = PTR_ERR(data->class_dev);
705 goto exit_detach;
708 for (i = 0; i < 5; i++) {
709 if (data->has_fan & (1 << i))
710 device_create_file_fan(dev, i);
712 for (i = 0; i < ARRAY_SIZE(sda_temp); i++)
713 device_create_file(dev, &sda_temp[i].dev_attr);
715 return 0;
717 exit_detach:
718 i2c_detach_client(client);
719 exit_free:
720 kfree(data);
721 exit_release:
722 release_region(address + REGION_OFFSET, REGION_LENGTH);
723 exit:
724 return err;
727 static int w83627ehf_detach_client(struct i2c_client *client)
729 struct w83627ehf_data *data = i2c_get_clientdata(client);
730 int err;
732 hwmon_device_unregister(data->class_dev);
734 if ((err = i2c_detach_client(client)))
735 return err;
736 release_region(client->addr + REGION_OFFSET, REGION_LENGTH);
737 kfree(data);
739 return 0;
742 static struct i2c_driver w83627ehf_driver = {
743 .driver = {
744 .name = "w83627ehf",
746 .attach_adapter = w83627ehf_detect,
747 .detach_client = w83627ehf_detach_client,
750 static int __init w83627ehf_find(int sioaddr, unsigned short *addr)
752 u16 val;
754 REG = sioaddr;
755 VAL = sioaddr + 1;
756 superio_enter();
758 val = (superio_inb(SIO_REG_DEVID) << 8)
759 | superio_inb(SIO_REG_DEVID + 1);
760 if ((val & SIO_ID_MASK) != SIO_W83627EHF_ID) {
761 superio_exit();
762 return -ENODEV;
765 superio_select(W83627EHF_LD_HWM);
766 val = (superio_inb(SIO_REG_ADDR) << 8)
767 | superio_inb(SIO_REG_ADDR + 1);
768 *addr = val & REGION_ALIGNMENT;
769 if (*addr == 0) {
770 superio_exit();
771 return -ENODEV;
774 /* Activate logical device if needed */
775 val = superio_inb(SIO_REG_ENABLE);
776 if (!(val & 0x01))
777 superio_outb(SIO_REG_ENABLE, val | 0x01);
779 superio_exit();
780 return 0;
783 static int __init sensors_w83627ehf_init(void)
785 if (w83627ehf_find(0x2e, &address)
786 && w83627ehf_find(0x4e, &address))
787 return -ENODEV;
789 return i2c_isa_add_driver(&w83627ehf_driver);
792 static void __exit sensors_w83627ehf_exit(void)
794 i2c_isa_del_driver(&w83627ehf_driver);
797 MODULE_AUTHOR("Jean Delvare <khali@linux-fr.org>");
798 MODULE_DESCRIPTION("W83627EHF driver");
799 MODULE_LICENSE("GPL");
801 module_init(sensors_w83627ehf_init);
802 module_exit(sensors_w83627ehf_exit);