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>
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
72 superio_outb(int reg, int val)
86 superio_select(int ld)
88 outb(SIO_REG_LDSEL, REG);
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
143 static inline unsigned int
144 fan_from_reg(u8 reg, unsigned int div)
146 if (reg == 0 || reg == 255)
148 return 1350000U / (reg * div);
151 static inline unsigned int
158 temp1_from_reg(s8 reg)
164 temp1_to_reg(int temp)
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;
184 struct mutex update_lock;
185 char valid; /* !=0 if following fields are valid */
186 unsigned long last_updated; /* In jiffies */
188 /* Register values */
192 u8 has_fan; /* some fan inputs can be disabled */
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)
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)
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
327 mutex_lock(&data->update_lock);
329 if (time_after(jiffies, data->last_updated + HZ)
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)
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)))
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
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));
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;
402 mutex_unlock(&data->update_lock);
407 * Sysfs callback functions
410 #define show_fan_reg(reg) \
412 show_##reg(struct device *dev, struct device_attribute *attr, \
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]))); \
423 show_fan_reg(fan_min);
426 show_fan_div(struct device *dev, struct device_attribute *attr,
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]));
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);
447 mutex_lock(&data->update_lock);
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));
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));
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 */
472 while (reg > 192 && new_div < 7) {
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);
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],
495 mutex_unlock(&data->update_lock);
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,
511 SENSOR_ATTR(fan2_min, S_IWUSR | S_IRUGO, show_fan_min,
513 SENSOR_ATTR(fan3_min, S_IWUSR | S_IRUGO, show_fan_min,
515 SENSOR_ATTR(fan4_min, S_IWUSR | S_IRUGO, show_fan_min,
517 SENSOR_ATTR(fan5_min, S_IWUSR | S_IRUGO, show_fan_min,
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) \
538 show_##reg(struct device *dev, struct device_attribute *attr, \
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) \
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); \
564 store_temp1_reg(OVER, max);
565 store_temp1_reg(HYST, max_hyst);
567 #define show_temp_reg(reg) \
569 show_##reg(struct device *dev, struct device_attribute *attr, \
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])); \
579 show_temp_reg(temp_max);
580 show_temp_reg(temp_max_hyst);
582 #define store_temp_reg(REG, reg) \
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], \
597 mutex_unlock(&data->update_lock); \
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,
609 SENSOR_ATTR(temp2_max, S_IRUGO | S_IWUSR, show_temp_max,
611 SENSOR_ATTR(temp3_max, S_IRUGO | S_IWUSR, show_temp_max,
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)
632 /* Start monitoring is needed */
633 tmp = w83627ehf_read_value(client, W83627EHF_REG_CONFIG);
635 w83627ehf_write_value(client, W83627EHF_REG_CONFIG,
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]);
643 w83627ehf_write_value(client,
644 W83627EHF_REG_TEMP_CONFIG[i],
649 static int w83627ehf_detect(struct i2c_adapter *adapter)
651 struct i2c_client *client;
652 struct w83627ehf_data *data;
656 if (!request_region(address + REGION_OFFSET, REGION_LENGTH,
657 w83627ehf_driver.driver.name)) {
662 if (!(data = kzalloc(sizeof(struct w83627ehf_data), GFP_KERNEL))) {
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;
676 strlcpy(client->name, "w83627ehf", I2C_NAME_SIZE);
678 mutex_init(&data->update_lock);
680 /* Tell the i2c layer a new client has arrived */
681 if ((err = i2c_attach_client(client)))
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);
697 data->has_fan |= (1 << 3);
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);
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);
718 i2c_detach_client(client);
722 release_region(address + REGION_OFFSET, REGION_LENGTH);
727 static int w83627ehf_detach_client(struct i2c_client *client)
729 struct w83627ehf_data *data = i2c_get_clientdata(client);
732 hwmon_device_unregister(data->class_dev);
734 if ((err = i2c_detach_client(client)))
736 release_region(client->addr + REGION_OFFSET, REGION_LENGTH);
742 static struct i2c_driver w83627ehf_driver = {
746 .attach_adapter = w83627ehf_detect,
747 .detach_client = w83627ehf_detach_client,
750 static int __init w83627ehf_find(int sioaddr, unsigned short *addr)
758 val = (superio_inb(SIO_REG_DEVID) << 8)
759 | superio_inb(SIO_REG_DEVID + 1);
760 if ((val & SIO_ID_MASK) != SIO_W83627EHF_ID) {
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;
774 /* Activate logical device if needed */
775 val = superio_inb(SIO_REG_ENABLE);
777 superio_outb(SIO_REG_ENABLE, val | 0x01);
783 static int __init sensors_w83627ehf_init(void)
785 if (w83627ehf_find(0x2e, &address)
786 && w83627ehf_find(0x4e, &address))
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);