2 w83781d.c - Part of lm_sensors, Linux kernel modules for hardware
4 Copyright (c) 1998 - 2001 Frodo Looijaard <frodol@dds.nl>,
5 Philip Edelbrock <phil@netroedge.com>,
6 and Mark Studebaker <mdsxyz123@yahoo.com>
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 Supports following chips:
26 Chip #vin #fanin #pwm #temp wchipid vendid i2c ISA
27 as99127f 7 3 0 3 0x31 0x12c3 yes no
28 as99127f rev.2 (type_name = as99127f) 0x31 0x5ca3 yes no
29 w83781d 7 3 0 3 0x10-1 0x5ca3 yes yes
30 w83627hf 9 3 2 3 0x21 0x5ca3 yes yes(LPC)
31 w83627thf 9 3 2 3 0x90 0x5ca3 no yes(LPC)
32 w83782d 9 3 2-4 3 0x30 0x5ca3 yes yes
33 w83783s 5-6 3 2 1-2 0x40 0x5ca3 yes no
34 w83697hf 8 2 2 2 0x60 0x5ca3 no yes(LPC)
38 #include <linux/config.h>
39 #include <linux/module.h>
40 #include <linux/init.h>
41 #include <linux/slab.h>
42 #include <linux/i2c.h>
43 #include <linux/i2c-sensor.h>
44 #include <linux/i2c-vid.h>
48 /* RT Table support #defined so we can take it out if it gets bothersome */
51 /* Addresses to scan */
52 static unsigned short normal_i2c[] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
53 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
54 0x2c, 0x2d, 0x2e, 0x2f, I2C_CLIENT_END };
55 static unsigned int normal_isa[] = { 0x0290, I2C_CLIENT_ISA_END };
57 /* Insmod parameters */
58 SENSORS_INSMOD_6(w83781d, w83782d, w83783s, w83627hf, as99127f, w83697hf);
59 I2C_CLIENT_MODULE_PARM(force_subclients, "List of subclient addresses: "
60 "{bus, clientaddr, subclientaddr1, subclientaddr2}");
63 module_param(init, bool, 0);
64 MODULE_PARM_DESC(init, "Set to zero to bypass chip initialization");
66 /* Constants specified below */
68 /* Length of ISA address segment */
69 #define W83781D_EXTENT 8
71 /* Where are the ISA address/data registers relative to the base address */
72 #define W83781D_ADDR_REG_OFFSET 5
73 #define W83781D_DATA_REG_OFFSET 6
75 /* The W83781D registers */
76 /* The W83782D registers for nr=7,8 are in bank 5 */
77 #define W83781D_REG_IN_MAX(nr) ((nr < 7) ? (0x2b + (nr) * 2) : \
78 (0x554 + (((nr) - 7) * 2)))
79 #define W83781D_REG_IN_MIN(nr) ((nr < 7) ? (0x2c + (nr) * 2) : \
80 (0x555 + (((nr) - 7) * 2)))
81 #define W83781D_REG_IN(nr) ((nr < 7) ? (0x20 + (nr)) : \
84 #define W83781D_REG_FAN_MIN(nr) (0x3a + (nr))
85 #define W83781D_REG_FAN(nr) (0x27 + (nr))
87 #define W83781D_REG_BANK 0x4E
88 #define W83781D_REG_TEMP2_CONFIG 0x152
89 #define W83781D_REG_TEMP3_CONFIG 0x252
90 #define W83781D_REG_TEMP(nr) ((nr == 3) ? (0x0250) : \
91 ((nr == 2) ? (0x0150) : \
93 #define W83781D_REG_TEMP_HYST(nr) ((nr == 3) ? (0x253) : \
94 ((nr == 2) ? (0x153) : \
96 #define W83781D_REG_TEMP_OVER(nr) ((nr == 3) ? (0x255) : \
97 ((nr == 2) ? (0x155) : \
100 #define W83781D_REG_CONFIG 0x40
101 #define W83781D_REG_ALARM1 0x41
102 #define W83781D_REG_ALARM2 0x42
103 #define W83781D_REG_ALARM3 0x450 /* not on W83781D */
105 #define W83781D_REG_IRQ 0x4C
106 #define W83781D_REG_BEEP_CONFIG 0x4D
107 #define W83781D_REG_BEEP_INTS1 0x56
108 #define W83781D_REG_BEEP_INTS2 0x57
109 #define W83781D_REG_BEEP_INTS3 0x453 /* not on W83781D */
111 #define W83781D_REG_VID_FANDIV 0x47
113 #define W83781D_REG_CHIPID 0x49
114 #define W83781D_REG_WCHIPID 0x58
115 #define W83781D_REG_CHIPMAN 0x4F
116 #define W83781D_REG_PIN 0x4B
119 #define W83781D_REG_VBAT 0x5D
121 /* PWM 782D (1-4) and 783S (1-2) only */
122 #define W83781D_REG_PWM1 0x5B /* 782d and 783s/627hf datasheets disagree */
123 /* on which is which; */
124 #define W83781D_REG_PWM2 0x5A /* We follow the 782d convention here, */
125 /* However 782d is probably wrong. */
126 #define W83781D_REG_PWM3 0x5E
127 #define W83781D_REG_PWM4 0x5F
128 #define W83781D_REG_PWMCLK12 0x5C
129 #define W83781D_REG_PWMCLK34 0x45C
130 static const u8 regpwm[] = { W83781D_REG_PWM1, W83781D_REG_PWM2,
131 W83781D_REG_PWM3, W83781D_REG_PWM4
134 #define W83781D_REG_PWM(nr) (regpwm[(nr) - 1])
136 #define W83781D_REG_I2C_ADDR 0x48
137 #define W83781D_REG_I2C_SUBADDR 0x4A
139 /* The following are undocumented in the data sheets however we
140 received the information in an email from Winbond tech support */
141 /* Sensor selection - not on 781d */
142 #define W83781D_REG_SCFG1 0x5D
143 static const u8 BIT_SCFG1[] = { 0x02, 0x04, 0x08 };
145 #define W83781D_REG_SCFG2 0x59
146 static const u8 BIT_SCFG2[] = { 0x10, 0x20, 0x40 };
148 #define W83781D_DEFAULT_BETA 3435
150 /* RT Table registers */
151 #define W83781D_REG_RT_IDX 0x50
152 #define W83781D_REG_RT_VAL 0x51
154 /* Conversions. Rounding and limit checking is only done on the TO_REG
155 variants. Note that you should be a bit careful with which arguments
156 these macros are called: arguments may be evaluated more than once.
157 Fixing this is just not worth it. */
158 #define IN_TO_REG(val) (SENSORS_LIMIT((((val) * 10 + 8)/16),0,255))
159 #define IN_FROM_REG(val) (((val) * 16) / 10)
162 FAN_TO_REG(long rpm, int div)
166 rpm = SENSORS_LIMIT(rpm, 1, 1000000);
167 return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
170 #define FAN_FROM_REG(val,div) ((val) == 0 ? -1 : \
171 ((val) == 255 ? 0 : \
172 1350000 / ((val) * (div))))
174 #define TEMP_TO_REG(val) (SENSORS_LIMIT(((val) < 0 ? (val)+0x100*1000 \
175 : (val)) / 1000, 0, 0xff))
176 #define TEMP_FROM_REG(val) (((val) & 0x80 ? (val)-0x100 : (val)) * 1000)
178 #define ALARMS_FROM_REG(val) (val)
179 #define PWM_FROM_REG(val) (val)
180 #define PWM_TO_REG(val) (SENSORS_LIMIT((val),0,255))
181 #define BEEP_MASK_FROM_REG(val,type) ((type) == as99127f ? \
182 (val) ^ 0x7fff : (val))
183 #define BEEP_MASK_TO_REG(val,type) ((type) == as99127f ? \
184 (~(val)) & 0x7fff : (val) & 0xffffff)
186 #define BEEP_ENABLE_TO_REG(val) ((val) ? 1 : 0)
187 #define BEEP_ENABLE_FROM_REG(val) ((val) ? 1 : 0)
189 #define DIV_FROM_REG(val) (1 << (val))
192 DIV_TO_REG(long val, enum chips type)
195 val = SENSORS_LIMIT(val, 1,
197 || type == as99127f) ? 8 : 128)) >> 1;
198 for (i = 0; i < 6; i++) {
206 /* There are some complications in a module like this. First off, W83781D chips
207 may be both present on the SMBus and the ISA bus, and we have to handle
208 those cases separately at some places. Second, there might be several
209 W83781D chips available (well, actually, that is probably never done; but
210 it is a clean illustration of how to handle a case like that). Finally,
211 a specific chip may be attached to *both* ISA and SMBus, and we would
212 not like to detect it double. Fortunately, in the case of the W83781D at
213 least, a register tells us what SMBus address we are on, so that helps
214 a bit - except if there could be more than one SMBus. Groan. No solution
217 /* This module may seem overly long and complicated. In fact, it is not so
218 bad. Quite a lot of bookkeeping is done. A real driver can often cut
221 /* For each registered W83781D, we need to keep some data in memory. That
222 data is pointed to by w83781d_list[NR]->data. The structure itself is
223 dynamically allocated, at the same time when a new w83781d client is
225 struct w83781d_data {
226 struct i2c_client client;
227 struct semaphore lock;
230 struct semaphore update_lock;
231 char valid; /* !=0 if following fields are valid */
232 unsigned long last_updated; /* In jiffies */
234 struct i2c_client *lm75[2]; /* for secondary I2C addresses */
235 /* array of 2 pointers to subclients */
237 u8 in[9]; /* Register value - 8 & 9 for 782D only */
238 u8 in_max[9]; /* Register value - 8 & 9 for 782D only */
239 u8 in_min[9]; /* Register value - 8 & 9 for 782D only */
240 u8 fan[3]; /* Register value */
241 u8 fan_min[3]; /* Register value */
243 u8 temp_max; /* Register value */
244 u8 temp_max_hyst; /* Register value */
245 u16 temp_add[2]; /* Register value */
246 u16 temp_max_add[2]; /* Register value */
247 u16 temp_max_hyst_add[2]; /* Register value */
248 u8 fan_div[3]; /* Register encoding, shifted right */
249 u8 vid; /* Register encoding, combined */
250 u32 alarms; /* Register encoding, combined */
251 u32 beep_mask; /* Register encoding, combined */
252 u8 beep_enable; /* Boolean */
253 u8 pwm[4]; /* Register value */
254 u8 pwmenable[4]; /* Boolean */
255 u16 sens[3]; /* 782D/783S only.
256 1 = pentium diode; 2 = 3904 diode;
257 3000-5000 = thermistor beta.
259 Other Betas unimplemented */
261 u8 rt[3][32]; /* Register value */
266 static int w83781d_attach_adapter(struct i2c_adapter *adapter);
267 static int w83781d_detect(struct i2c_adapter *adapter, int address, int kind);
268 static int w83781d_detach_client(struct i2c_client *client);
270 static int w83781d_read_value(struct i2c_client *client, u16 register);
271 static int w83781d_write_value(struct i2c_client *client, u16 register,
273 static struct w83781d_data *w83781d_update_device(struct device *dev);
274 static void w83781d_init_client(struct i2c_client *client);
276 static struct i2c_driver w83781d_driver = {
277 .owner = THIS_MODULE,
279 .id = I2C_DRIVERID_W83781D,
280 .flags = I2C_DF_NOTIFY,
281 .attach_adapter = w83781d_attach_adapter,
282 .detach_client = w83781d_detach_client,
285 /* following are the sysfs callback functions */
286 #define show_in_reg(reg) \
287 static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
289 struct w83781d_data *data = w83781d_update_device(dev); \
290 return sprintf(buf,"%ld\n", (long)IN_FROM_REG(data->reg[nr] * 10)); \
296 #define store_in_reg(REG, reg) \
297 static ssize_t store_in_##reg (struct device *dev, const char *buf, size_t count, int nr) \
299 struct i2c_client *client = to_i2c_client(dev); \
300 struct w83781d_data *data = i2c_get_clientdata(client); \
303 val = simple_strtoul(buf, NULL, 10) / 10; \
304 data->in_##reg[nr] = IN_TO_REG(val); \
305 w83781d_write_value(client, W83781D_REG_IN_##REG(nr), data->in_##reg[nr]); \
309 store_in_reg(MIN, min);
310 store_in_reg(MAX, max);
312 #define sysfs_in_offset(offset) \
314 show_regs_in_##offset (struct device *dev, char *buf) \
316 return show_in(dev, buf, offset); \
318 static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_regs_in_##offset, NULL);
320 #define sysfs_in_reg_offset(reg, offset) \
321 static ssize_t show_regs_in_##reg##offset (struct device *dev, char *buf) \
323 return show_in_##reg (dev, buf, offset); \
325 static ssize_t store_regs_in_##reg##offset (struct device *dev, const char *buf, size_t count) \
327 return store_in_##reg (dev, buf, count, offset); \
329 static DEVICE_ATTR(in##offset##_##reg, S_IRUGO| S_IWUSR, show_regs_in_##reg##offset, store_regs_in_##reg##offset);
331 #define sysfs_in_offsets(offset) \
332 sysfs_in_offset(offset); \
333 sysfs_in_reg_offset(min, offset); \
334 sysfs_in_reg_offset(max, offset);
346 #define device_create_file_in(client, offset) \
348 device_create_file(&client->dev, &dev_attr_in##offset##_input); \
349 device_create_file(&client->dev, &dev_attr_in##offset##_min); \
350 device_create_file(&client->dev, &dev_attr_in##offset##_max); \
353 #define show_fan_reg(reg) \
354 static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
356 struct w83781d_data *data = w83781d_update_device(dev); \
357 return sprintf(buf,"%ld\n", \
358 FAN_FROM_REG(data->reg[nr-1], (long)DIV_FROM_REG(data->fan_div[nr-1]))); \
361 show_fan_reg(fan_min);
364 store_fan_min(struct device *dev, const char *buf, size_t count, int nr)
366 struct i2c_client *client = to_i2c_client(dev);
367 struct w83781d_data *data = i2c_get_clientdata(client);
370 val = simple_strtoul(buf, NULL, 10);
371 data->fan_min[nr - 1] =
372 FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr - 1]));
373 w83781d_write_value(client, W83781D_REG_FAN_MIN(nr),
374 data->fan_min[nr - 1]);
379 #define sysfs_fan_offset(offset) \
380 static ssize_t show_regs_fan_##offset (struct device *dev, char *buf) \
382 return show_fan(dev, buf, offset); \
384 static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_regs_fan_##offset, NULL);
386 #define sysfs_fan_min_offset(offset) \
387 static ssize_t show_regs_fan_min##offset (struct device *dev, char *buf) \
389 return show_fan_min(dev, buf, offset); \
391 static ssize_t store_regs_fan_min##offset (struct device *dev, const char *buf, size_t count) \
393 return store_fan_min(dev, buf, count, offset); \
395 static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, show_regs_fan_min##offset, store_regs_fan_min##offset);
398 sysfs_fan_min_offset(1);
400 sysfs_fan_min_offset(2);
402 sysfs_fan_min_offset(3);
404 #define device_create_file_fan(client, offset) \
406 device_create_file(&client->dev, &dev_attr_fan##offset##_input); \
407 device_create_file(&client->dev, &dev_attr_fan##offset##_min); \
410 #define show_temp_reg(reg) \
411 static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
413 struct w83781d_data *data = w83781d_update_device(dev); \
414 if (nr >= 2) { /* TEMP2 and TEMP3 */ \
415 return sprintf(buf,"%d\n", \
416 LM75_TEMP_FROM_REG(data->reg##_add[nr-2])); \
417 } else { /* TEMP1 */ \
418 return sprintf(buf,"%ld\n", (long)TEMP_FROM_REG(data->reg)); \
422 show_temp_reg(temp_max);
423 show_temp_reg(temp_max_hyst);
425 #define store_temp_reg(REG, reg) \
426 static ssize_t store_temp_##reg (struct device *dev, const char *buf, size_t count, int nr) \
428 struct i2c_client *client = to_i2c_client(dev); \
429 struct w83781d_data *data = i2c_get_clientdata(client); \
432 val = simple_strtol(buf, NULL, 10); \
434 if (nr >= 2) { /* TEMP2 and TEMP3 */ \
435 data->temp_##reg##_add[nr-2] = LM75_TEMP_TO_REG(val); \
436 w83781d_write_value(client, W83781D_REG_TEMP_##REG(nr), \
437 data->temp_##reg##_add[nr-2]); \
438 } else { /* TEMP1 */ \
439 data->temp_##reg = TEMP_TO_REG(val); \
440 w83781d_write_value(client, W83781D_REG_TEMP_##REG(nr), \
446 store_temp_reg(OVER, max);
447 store_temp_reg(HYST, max_hyst);
449 #define sysfs_temp_offset(offset) \
451 show_regs_temp_##offset (struct device *dev, char *buf) \
453 return show_temp(dev, buf, offset); \
455 static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_regs_temp_##offset, NULL);
457 #define sysfs_temp_reg_offset(reg, offset) \
458 static ssize_t show_regs_temp_##reg##offset (struct device *dev, char *buf) \
460 return show_temp_##reg (dev, buf, offset); \
462 static ssize_t store_regs_temp_##reg##offset (struct device *dev, const char *buf, size_t count) \
464 return store_temp_##reg (dev, buf, count, offset); \
466 static DEVICE_ATTR(temp##offset##_##reg, S_IRUGO| S_IWUSR, show_regs_temp_##reg##offset, store_regs_temp_##reg##offset);
468 #define sysfs_temp_offsets(offset) \
469 sysfs_temp_offset(offset); \
470 sysfs_temp_reg_offset(max, offset); \
471 sysfs_temp_reg_offset(max_hyst, offset);
473 sysfs_temp_offsets(1);
474 sysfs_temp_offsets(2);
475 sysfs_temp_offsets(3);
477 #define device_create_file_temp(client, offset) \
479 device_create_file(&client->dev, &dev_attr_temp##offset##_input); \
480 device_create_file(&client->dev, &dev_attr_temp##offset##_max); \
481 device_create_file(&client->dev, &dev_attr_temp##offset##_max_hyst); \
485 show_vid_reg(struct device *dev, char *buf)
487 struct w83781d_data *data = w83781d_update_device(dev);
488 return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
492 DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
493 #define device_create_file_vid(client) \
494 device_create_file(&client->dev, &dev_attr_cpu0_vid);
496 show_vrm_reg(struct device *dev, char *buf)
498 struct w83781d_data *data = w83781d_update_device(dev);
499 return sprintf(buf, "%ld\n", (long) data->vrm);
503 store_vrm_reg(struct device *dev, const char *buf, size_t count)
505 struct i2c_client *client = to_i2c_client(dev);
506 struct w83781d_data *data = i2c_get_clientdata(client);
509 val = simple_strtoul(buf, NULL, 10);
516 DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
517 #define device_create_file_vrm(client) \
518 device_create_file(&client->dev, &dev_attr_vrm);
520 show_alarms_reg(struct device *dev, char *buf)
522 struct w83781d_data *data = w83781d_update_device(dev);
523 return sprintf(buf, "%ld\n", (long) ALARMS_FROM_REG(data->alarms));
527 DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
528 #define device_create_file_alarms(client) \
529 device_create_file(&client->dev, &dev_attr_alarms);
530 static ssize_t show_beep_mask (struct device *dev, char *buf)
532 struct w83781d_data *data = w83781d_update_device(dev);
533 return sprintf(buf, "%ld\n",
534 (long)BEEP_MASK_FROM_REG(data->beep_mask, data->type));
536 static ssize_t show_beep_enable (struct device *dev, char *buf)
538 struct w83781d_data *data = w83781d_update_device(dev);
539 return sprintf(buf, "%ld\n",
540 (long)BEEP_ENABLE_FROM_REG(data->beep_enable));
543 #define BEEP_ENABLE 0 /* Store beep_enable */
544 #define BEEP_MASK 1 /* Store beep_mask */
547 store_beep_reg(struct device *dev, const char *buf, size_t count,
550 struct i2c_client *client = to_i2c_client(dev);
551 struct w83781d_data *data = i2c_get_clientdata(client);
554 val = simple_strtoul(buf, NULL, 10);
556 if (update_mask == BEEP_MASK) { /* We are storing beep_mask */
557 data->beep_mask = BEEP_MASK_TO_REG(val, data->type);
558 w83781d_write_value(client, W83781D_REG_BEEP_INTS1,
559 data->beep_mask & 0xff);
561 if ((data->type != w83781d) && (data->type != as99127f)) {
562 w83781d_write_value(client, W83781D_REG_BEEP_INTS3,
563 ((data->beep_mask) >> 16) & 0xff);
566 val2 = (data->beep_mask >> 8) & 0x7f;
567 } else { /* We are storing beep_enable */
568 val2 = w83781d_read_value(client, W83781D_REG_BEEP_INTS2) & 0x7f;
569 data->beep_enable = BEEP_ENABLE_TO_REG(val);
572 w83781d_write_value(client, W83781D_REG_BEEP_INTS2,
573 val2 | data->beep_enable << 7);
578 #define sysfs_beep(REG, reg) \
579 static ssize_t show_regs_beep_##reg (struct device *dev, char *buf) \
581 return show_beep_##reg(dev, buf); \
583 static ssize_t store_regs_beep_##reg (struct device *dev, const char *buf, size_t count) \
585 return store_beep_reg(dev, buf, count, BEEP_##REG); \
587 static DEVICE_ATTR(beep_##reg, S_IRUGO | S_IWUSR, show_regs_beep_##reg, store_regs_beep_##reg);
589 sysfs_beep(ENABLE, enable);
590 sysfs_beep(MASK, mask);
592 #define device_create_file_beep(client) \
594 device_create_file(&client->dev, &dev_attr_beep_enable); \
595 device_create_file(&client->dev, &dev_attr_beep_mask); \
599 show_fan_div_reg(struct device *dev, char *buf, int nr)
601 struct w83781d_data *data = w83781d_update_device(dev);
602 return sprintf(buf, "%ld\n",
603 (long) DIV_FROM_REG(data->fan_div[nr - 1]));
606 /* Note: we save and restore the fan minimum here, because its value is
607 determined in part by the fan divisor. This follows the principle of
608 least suprise; the user doesn't expect the fan minimum to change just
609 because the divisor changed. */
611 store_fan_div_reg(struct device *dev, const char *buf, size_t count, int nr)
613 struct i2c_client *client = to_i2c_client(dev);
614 struct w83781d_data *data = i2c_get_clientdata(client);
619 min = FAN_FROM_REG(data->fan_min[nr],
620 DIV_FROM_REG(data->fan_div[nr]));
622 data->fan_div[nr] = DIV_TO_REG(simple_strtoul(buf, NULL, 10),
625 reg = (w83781d_read_value(client, nr==2 ? W83781D_REG_PIN : W83781D_REG_VID_FANDIV)
626 & (nr==0 ? 0xcf : 0x3f))
627 | ((data->fan_div[nr] & 0x03) << (nr==0 ? 4 : 6));
628 w83781d_write_value(client, nr==2 ? W83781D_REG_PIN : W83781D_REG_VID_FANDIV, reg);
630 /* w83781d and as99127f don't have extended divisor bits */
631 if (data->type != w83781d && data->type != as99127f) {
632 reg = (w83781d_read_value(client, W83781D_REG_VBAT)
634 | ((data->fan_div[nr] & 0x04) << (3 + nr));
635 w83781d_write_value(client, W83781D_REG_VBAT, reg);
638 /* Restore fan_min */
639 data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
640 w83781d_write_value(client, W83781D_REG_FAN_MIN(nr+1), data->fan_min[nr]);
645 #define sysfs_fan_div(offset) \
646 static ssize_t show_regs_fan_div_##offset (struct device *dev, char *buf) \
648 return show_fan_div_reg(dev, buf, offset); \
650 static ssize_t store_regs_fan_div_##offset (struct device *dev, const char *buf, size_t count) \
652 return store_fan_div_reg(dev, buf, count, offset - 1); \
654 static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, show_regs_fan_div_##offset, store_regs_fan_div_##offset);
660 #define device_create_file_fan_div(client, offset) \
662 device_create_file(&client->dev, &dev_attr_fan##offset##_div); \
666 show_pwm_reg(struct device *dev, char *buf, int nr)
668 struct w83781d_data *data = w83781d_update_device(dev);
669 return sprintf(buf, "%ld\n", (long) PWM_FROM_REG(data->pwm[nr - 1]));
673 show_pwmenable_reg(struct device *dev, char *buf, int nr)
675 struct w83781d_data *data = w83781d_update_device(dev);
676 return sprintf(buf, "%ld\n", (long) data->pwmenable[nr - 1]);
680 store_pwm_reg(struct device *dev, const char *buf, size_t count, int nr)
682 struct i2c_client *client = to_i2c_client(dev);
683 struct w83781d_data *data = i2c_get_clientdata(client);
686 val = simple_strtoul(buf, NULL, 10);
688 data->pwm[nr - 1] = PWM_TO_REG(val);
689 w83781d_write_value(client, W83781D_REG_PWM(nr), data->pwm[nr - 1]);
695 store_pwmenable_reg(struct device *dev, const char *buf, size_t count, int nr)
697 struct i2c_client *client = to_i2c_client(dev);
698 struct w83781d_data *data = i2c_get_clientdata(client);
701 val = simple_strtoul(buf, NULL, 10);
706 reg = w83781d_read_value(client, W83781D_REG_PWMCLK12);
707 w83781d_write_value(client, W83781D_REG_PWMCLK12,
708 (reg & 0xf7) | (val << 3));
710 reg = w83781d_read_value(client, W83781D_REG_BEEP_CONFIG);
711 w83781d_write_value(client, W83781D_REG_BEEP_CONFIG,
712 (reg & 0xef) | (!val << 4));
714 data->pwmenable[nr - 1] = val;
724 #define sysfs_pwm(offset) \
725 static ssize_t show_regs_pwm_##offset (struct device *dev, char *buf) \
727 return show_pwm_reg(dev, buf, offset); \
729 static ssize_t store_regs_pwm_##offset (struct device *dev, \
730 const char *buf, size_t count) \
732 return store_pwm_reg(dev, buf, count, offset); \
734 static DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \
735 show_regs_pwm_##offset, store_regs_pwm_##offset);
737 #define sysfs_pwmenable(offset) \
738 static ssize_t show_regs_pwmenable_##offset (struct device *dev, char *buf) \
740 return show_pwmenable_reg(dev, buf, offset); \
742 static ssize_t store_regs_pwmenable_##offset (struct device *dev, \
743 const char *buf, size_t count) \
745 return store_pwmenable_reg(dev, buf, count, offset); \
747 static DEVICE_ATTR(pwm##offset##_enable, S_IRUGO | S_IWUSR, \
748 show_regs_pwmenable_##offset, store_regs_pwmenable_##offset);
752 sysfs_pwmenable(2); /* only PWM2 can be enabled/disabled */
756 #define device_create_file_pwm(client, offset) \
758 device_create_file(&client->dev, &dev_attr_pwm##offset); \
761 #define device_create_file_pwmenable(client, offset) \
763 device_create_file(&client->dev, &dev_attr_pwm##offset##_enable); \
767 show_sensor_reg(struct device *dev, char *buf, int nr)
769 struct w83781d_data *data = w83781d_update_device(dev);
770 return sprintf(buf, "%ld\n", (long) data->sens[nr - 1]);
774 store_sensor_reg(struct device *dev, const char *buf, size_t count, int nr)
776 struct i2c_client *client = to_i2c_client(dev);
777 struct w83781d_data *data = i2c_get_clientdata(client);
780 val = simple_strtoul(buf, NULL, 10);
783 case 1: /* PII/Celeron diode */
784 tmp = w83781d_read_value(client, W83781D_REG_SCFG1);
785 w83781d_write_value(client, W83781D_REG_SCFG1,
786 tmp | BIT_SCFG1[nr - 1]);
787 tmp = w83781d_read_value(client, W83781D_REG_SCFG2);
788 w83781d_write_value(client, W83781D_REG_SCFG2,
789 tmp | BIT_SCFG2[nr - 1]);
790 data->sens[nr - 1] = val;
793 tmp = w83781d_read_value(client, W83781D_REG_SCFG1);
794 w83781d_write_value(client, W83781D_REG_SCFG1,
795 tmp | BIT_SCFG1[nr - 1]);
796 tmp = w83781d_read_value(client, W83781D_REG_SCFG2);
797 w83781d_write_value(client, W83781D_REG_SCFG2,
798 tmp & ~BIT_SCFG2[nr - 1]);
799 data->sens[nr - 1] = val;
801 case W83781D_DEFAULT_BETA: /* thermistor */
802 tmp = w83781d_read_value(client, W83781D_REG_SCFG1);
803 w83781d_write_value(client, W83781D_REG_SCFG1,
804 tmp & ~BIT_SCFG1[nr - 1]);
805 data->sens[nr - 1] = val;
808 dev_err(dev, "Invalid sensor type %ld; must be 1, 2, or %d\n",
809 (long) val, W83781D_DEFAULT_BETA);
816 #define sysfs_sensor(offset) \
817 static ssize_t show_regs_sensor_##offset (struct device *dev, char *buf) \
819 return show_sensor_reg(dev, buf, offset); \
821 static ssize_t store_regs_sensor_##offset (struct device *dev, const char *buf, size_t count) \
823 return store_sensor_reg(dev, buf, count, offset); \
825 static DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR, show_regs_sensor_##offset, store_regs_sensor_##offset);
831 #define device_create_file_sensor(client, offset) \
833 device_create_file(&client->dev, &dev_attr_temp##offset##_type); \
838 show_rt_reg(struct device *dev, char *buf, int nr)
840 struct w83781d_data *data = w83781d_update_device(dev);
843 for (i = 0; i < 32; i++) {
845 j += sprintf(buf, " %ld", (long) data->rt[nr - 1][i]);
847 j += sprintf(buf, "%ld", (long) data->rt[nr - 1][i]);
849 j += sprintf(buf, "\n");
855 store_rt_reg(struct device *dev, const char *buf, size_t count, int nr)
857 struct i2c_client *client = to_i2c_client(dev);
858 struct w83781d_data *data = i2c_get_clientdata(client);
861 for (i = 0; i < count; i++) {
862 val = simple_strtoul(buf + count, NULL, 10);
864 /* fixme: no bounds checking 0-255 */
865 data->rt[nr - 1][i] = val & 0xff;
866 w83781d_write_value(client, W83781D_REG_RT_IDX, i);
867 w83781d_write_value(client, W83781D_REG_RT_VAL,
868 data->rt[nr - 1][i]);
874 #define sysfs_rt(offset) \
875 static ssize_t show_regs_rt_##offset (struct device *dev, char *buf) \
877 return show_rt_reg(dev, buf, offset); \
879 static ssize_t store_regs_rt_##offset (struct device *dev, const char *buf, size_t count) \
881 return store_rt_reg(dev, buf, count, offset); \
883 static DEVICE_ATTR(rt##offset, S_IRUGO | S_IWUSR, show_regs_rt_##offset, store_regs_rt_##offset);
889 #define device_create_file_rt(client, offset) \
891 device_create_file(&client->dev, &dev_attr_rt##offset); \
894 #endif /* ifdef W83781D_RT */
896 /* This function is called when:
897 * w83781d_driver is inserted (when this module is loaded), for each
899 * when a new adapter is inserted (and w83781d_driver is still present) */
901 w83781d_attach_adapter(struct i2c_adapter *adapter)
903 if (!(adapter->class & I2C_CLASS_HWMON))
905 return i2c_detect(adapter, &addr_data, w83781d_detect);
908 /* Assumes that adapter is of I2C, not ISA variety.
909 * OTHERWISE DON'T CALL THIS
912 w83781d_detect_subclients(struct i2c_adapter *adapter, int address, int kind,
913 struct i2c_client *new_client)
917 const char *client_name = "";
918 struct w83781d_data *data = i2c_get_clientdata(new_client);
920 data->lm75[0] = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
921 if (!(data->lm75[0])) {
925 memset(data->lm75[0], 0x00, sizeof (struct i2c_client));
927 id = i2c_adapter_id(adapter);
929 if (force_subclients[0] == id && force_subclients[1] == address) {
930 for (i = 2; i <= 3; i++) {
931 if (force_subclients[i] < 0x48 ||
932 force_subclients[i] > 0x4f) {
933 dev_err(&new_client->dev, "Invalid subclient "
934 "address %d; must be 0x48-0x4f\n",
935 force_subclients[i]);
940 w83781d_write_value(new_client, W83781D_REG_I2C_SUBADDR,
941 (force_subclients[2] & 0x07) |
942 ((force_subclients[3] & 0x07) << 4));
943 data->lm75[0]->addr = force_subclients[2];
945 val1 = w83781d_read_value(new_client, W83781D_REG_I2C_SUBADDR);
946 data->lm75[0]->addr = 0x48 + (val1 & 0x07);
949 if (kind != w83783s) {
951 data->lm75[1] = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
952 if (!(data->lm75[1])) {
956 memset(data->lm75[1], 0x0, sizeof(struct i2c_client));
958 if (force_subclients[0] == id &&
959 force_subclients[1] == address) {
960 data->lm75[1]->addr = force_subclients[3];
962 data->lm75[1]->addr = 0x48 + ((val1 >> 4) & 0x07);
964 if (data->lm75[0]->addr == data->lm75[1]->addr) {
965 dev_err(&new_client->dev,
966 "Duplicate addresses 0x%x for subclients.\n",
967 data->lm75[0]->addr);
974 client_name = "w83781d subclient";
975 else if (kind == w83782d)
976 client_name = "w83782d subclient";
977 else if (kind == w83783s)
978 client_name = "w83783s subclient";
979 else if (kind == w83627hf)
980 client_name = "w83627hf subclient";
981 else if (kind == as99127f)
982 client_name = "as99127f subclient";
984 for (i = 0; i <= 1; i++) {
985 /* store all data in w83781d */
986 i2c_set_clientdata(data->lm75[i], NULL);
987 data->lm75[i]->adapter = adapter;
988 data->lm75[i]->driver = &w83781d_driver;
989 data->lm75[i]->flags = 0;
990 strlcpy(data->lm75[i]->name, client_name,
992 if ((err = i2c_attach_client(data->lm75[i]))) {
993 dev_err(&new_client->dev, "Subclient %d "
994 "registration at address 0x%x "
995 "failed.\n", i, data->lm75[i]->addr);
1000 if (kind == w83783s)
1006 /* Undo inits in case of errors */
1008 i2c_detach_client(data->lm75[0]);
1010 if (NULL != data->lm75[1])
1011 kfree(data->lm75[1]);
1013 if (NULL != data->lm75[0])
1014 kfree(data->lm75[0]);
1020 w83781d_detect(struct i2c_adapter *adapter, int address, int kind)
1022 int i = 0, val1 = 0, val2;
1023 struct i2c_client *new_client;
1024 struct w83781d_data *data;
1026 const char *client_name = "";
1027 int is_isa = i2c_is_isa_adapter(adapter);
1028 enum vendor { winbond, asus } vendid;
1031 && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1036 /* Prevent users from forcing a kind for a bus it isn't supposed
1037 to possibly be on */
1038 if (is_isa && (kind == as99127f || kind == w83783s)) {
1039 dev_err(&adapter->dev,
1040 "Cannot force I2C-only chip for ISA address 0x%02x.\n",
1045 if (!is_isa && kind == w83697hf) {
1046 dev_err(&adapter->dev,
1047 "Cannot force ISA-only chip for I2C address 0x%02x.\n",
1054 if (!request_region(address, W83781D_EXTENT,
1055 w83781d_driver.name)) {
1056 dev_dbg(&adapter->dev, "Request of region "
1057 "0x%x-0x%x for w83781d failed\n", address,
1058 address + W83781D_EXTENT - 1);
1063 /* Probe whether there is anything available on this address. Already
1064 done for SMBus clients */
1068 #define REALLY_SLOW_IO
1069 /* We need the timeouts for at least some LM78-like
1070 chips. But only if we read 'undefined' registers. */
1071 i = inb_p(address + 1);
1072 if (inb_p(address + 2) != i
1073 || inb_p(address + 3) != i
1074 || inb_p(address + 7) != i) {
1075 dev_dbg(&adapter->dev, "Detection of w83781d "
1076 "chip failed at step 1\n");
1080 #undef REALLY_SLOW_IO
1082 /* Let's just hope nothing breaks here */
1083 i = inb_p(address + 5) & 0x7f;
1084 outb_p(~i & 0x7f, address + 5);
1085 val2 = inb_p(address + 5) & 0x7f;
1086 if (val2 != (~i & 0x7f)) {
1087 outb_p(i, address + 5);
1088 dev_dbg(&adapter->dev, "Detection of w83781d "
1089 "chip failed at step 2 (0x%x != "
1090 "0x%x at 0x%x)\n", val2, ~i & 0x7f,
1098 /* OK. For now, we presume we have a valid client. We now create the
1099 client structure, even though we cannot fill it completely yet.
1100 But it allows us to access w83781d_{read,write}_value. */
1102 if (!(data = kmalloc(sizeof(struct w83781d_data), GFP_KERNEL))) {
1106 memset(data, 0, sizeof(struct w83781d_data));
1108 new_client = &data->client;
1109 i2c_set_clientdata(new_client, data);
1110 new_client->addr = address;
1111 init_MUTEX(&data->lock);
1112 new_client->adapter = adapter;
1113 new_client->driver = &w83781d_driver;
1114 new_client->flags = 0;
1116 /* Now, we do the remaining detection. */
1118 /* The w8378?d may be stuck in some other bank than bank 0. This may
1119 make reading other information impossible. Specify a force=... or
1120 force_*=... parameter, and the Winbond will be reset to the right
1123 if (w83781d_read_value(new_client, W83781D_REG_CONFIG) & 0x80) {
1124 dev_dbg(&new_client->dev, "Detection failed at step "
1129 val1 = w83781d_read_value(new_client, W83781D_REG_BANK);
1130 val2 = w83781d_read_value(new_client, W83781D_REG_CHIPMAN);
1131 /* Check for Winbond or Asus ID if in bank 0 */
1132 if ((!(val1 & 0x07)) &&
1133 (((!(val1 & 0x80)) && (val2 != 0xa3) && (val2 != 0xc3))
1134 || ((val1 & 0x80) && (val2 != 0x5c) && (val2 != 0x12)))) {
1135 dev_dbg(&new_client->dev, "Detection failed at step "
1140 /* If Winbond SMBus, check address at 0x48.
1141 Asus doesn't support, except for as99127f rev.2 */
1142 if ((!is_isa) && (((!(val1 & 0x80)) && (val2 == 0xa3)) ||
1143 ((val1 & 0x80) && (val2 == 0x5c)))) {
1144 if (w83781d_read_value
1145 (new_client, W83781D_REG_I2C_ADDR) != address) {
1146 dev_dbg(&new_client->dev, "Detection failed "
1154 /* We have either had a force parameter, or we have already detected the
1155 Winbond. Put it now into bank 0 and Vendor ID High Byte */
1156 w83781d_write_value(new_client, W83781D_REG_BANK,
1157 (w83781d_read_value(new_client,
1158 W83781D_REG_BANK) & 0x78) |
1161 /* Determine the chip type. */
1164 val2 = w83781d_read_value(new_client, W83781D_REG_CHIPMAN);
1167 else if (val2 == 0x12)
1170 dev_dbg(&new_client->dev, "Chip was made by neither "
1171 "Winbond nor Asus?\n");
1176 val1 = w83781d_read_value(new_client, W83781D_REG_WCHIPID);
1177 if ((val1 == 0x10 || val1 == 0x11) && vendid == winbond)
1179 else if (val1 == 0x30 && vendid == winbond)
1181 else if (val1 == 0x40 && vendid == winbond && !is_isa
1184 else if ((val1 == 0x21 || val1 == 0x90) && vendid == winbond)
1186 else if (val1 == 0x31 && !is_isa && address >= 0x28)
1188 else if (val1 == 0x60 && vendid == winbond && is_isa)
1192 dev_warn(&new_client->dev, "Ignoring 'force' "
1193 "parameter for unknown chip at "
1194 "adapter %d, address 0x%02x\n",
1195 i2c_adapter_id(adapter), address);
1201 if (kind == w83781d) {
1202 client_name = "w83781d";
1203 } else if (kind == w83782d) {
1204 client_name = "w83782d";
1205 } else if (kind == w83783s) {
1206 client_name = "w83783s";
1207 } else if (kind == w83627hf) {
1209 client_name = "w83627thf";
1211 client_name = "w83627hf";
1212 } else if (kind == as99127f) {
1213 client_name = "as99127f";
1214 } else if (kind == w83697hf) {
1215 client_name = "w83697hf";
1218 /* Fill in the remaining client fields and put into the global list */
1219 strlcpy(new_client->name, client_name, I2C_NAME_SIZE);
1223 init_MUTEX(&data->update_lock);
1225 /* Tell the I2C layer a new client has arrived */
1226 if ((err = i2c_attach_client(new_client)))
1229 /* attach secondary i2c lm75-like clients */
1231 if ((err = w83781d_detect_subclients(adapter, address,
1235 data->lm75[0] = NULL;
1236 data->lm75[1] = NULL;
1239 /* Initialize the chip */
1240 w83781d_init_client(new_client);
1242 /* A few vars need to be filled upon startup */
1243 for (i = 1; i <= 3; i++) {
1244 data->fan_min[i - 1] = w83781d_read_value(new_client,
1245 W83781D_REG_FAN_MIN(i));
1247 if (kind != w83781d && kind != as99127f)
1248 for (i = 0; i < 4; i++)
1249 data->pwmenable[i] = 1;
1251 /* Register sysfs hooks */
1252 device_create_file_in(new_client, 0);
1253 if (kind != w83783s && kind != w83697hf)
1254 device_create_file_in(new_client, 1);
1255 device_create_file_in(new_client, 2);
1256 device_create_file_in(new_client, 3);
1257 device_create_file_in(new_client, 4);
1258 device_create_file_in(new_client, 5);
1259 device_create_file_in(new_client, 6);
1260 if (kind != as99127f && kind != w83781d && kind != w83783s) {
1261 device_create_file_in(new_client, 7);
1262 device_create_file_in(new_client, 8);
1265 device_create_file_fan(new_client, 1);
1266 device_create_file_fan(new_client, 2);
1267 if (kind != w83697hf)
1268 device_create_file_fan(new_client, 3);
1270 device_create_file_temp(new_client, 1);
1271 device_create_file_temp(new_client, 2);
1272 if (kind != w83783s && kind != w83697hf)
1273 device_create_file_temp(new_client, 3);
1275 if (kind != w83697hf)
1276 device_create_file_vid(new_client);
1278 if (kind != w83697hf)
1279 device_create_file_vrm(new_client);
1281 device_create_file_fan_div(new_client, 1);
1282 device_create_file_fan_div(new_client, 2);
1283 if (kind != w83697hf)
1284 device_create_file_fan_div(new_client, 3);
1286 device_create_file_alarms(new_client);
1288 device_create_file_beep(new_client);
1290 if (kind != w83781d && kind != as99127f) {
1291 device_create_file_pwm(new_client, 1);
1292 device_create_file_pwm(new_client, 2);
1293 device_create_file_pwmenable(new_client, 2);
1295 if (kind == w83782d && !is_isa) {
1296 device_create_file_pwm(new_client, 3);
1297 device_create_file_pwm(new_client, 4);
1300 if (kind != as99127f && kind != w83781d) {
1301 device_create_file_sensor(new_client, 1);
1302 device_create_file_sensor(new_client, 2);
1303 if (kind != w83783s && kind != w83697hf)
1304 device_create_file_sensor(new_client, 3);
1307 if (kind == w83781d) {
1308 device_create_file_rt(new_client, 1);
1309 device_create_file_rt(new_client, 2);
1310 device_create_file_rt(new_client, 3);
1317 i2c_detach_client(new_client);
1322 release_region(address, W83781D_EXTENT);
1328 w83781d_detach_client(struct i2c_client *client)
1332 if (i2c_is_isa_client(client))
1333 release_region(client->addr, W83781D_EXTENT);
1335 if ((err = i2c_detach_client(client))) {
1336 dev_err(&client->dev,
1337 "Client deregistration failed, client not detached.\n");
1341 if (i2c_get_clientdata(client)==NULL) {
1346 kfree(i2c_get_clientdata(client));
1352 /* The SMBus locks itself, usually, but nothing may access the Winbond between
1353 bank switches. ISA access must always be locked explicitly!
1354 We ignore the W83781D BUSY flag at this moment - it could lead to deadlocks,
1355 would slow down the W83781D access and should not be necessary.
1356 There are some ugly typecasts here, but the good news is - they should
1357 nowhere else be necessary! */
1359 w83781d_read_value(struct i2c_client *client, u16 reg)
1361 struct w83781d_data *data = i2c_get_clientdata(client);
1362 int res, word_sized, bank;
1363 struct i2c_client *cl;
1366 if (i2c_is_isa_client(client)) {
1367 word_sized = (((reg & 0xff00) == 0x100)
1368 || ((reg & 0xff00) == 0x200))
1369 && (((reg & 0x00ff) == 0x50)
1370 || ((reg & 0x00ff) == 0x53)
1371 || ((reg & 0x00ff) == 0x55));
1373 outb_p(W83781D_REG_BANK,
1374 client->addr + W83781D_ADDR_REG_OFFSET);
1376 client->addr + W83781D_DATA_REG_OFFSET);
1378 outb_p(reg & 0xff, client->addr + W83781D_ADDR_REG_OFFSET);
1379 res = inb_p(client->addr + W83781D_DATA_REG_OFFSET);
1381 outb_p((reg & 0xff) + 1,
1382 client->addr + W83781D_ADDR_REG_OFFSET);
1384 (res << 8) + inb_p(client->addr +
1385 W83781D_DATA_REG_OFFSET);
1388 outb_p(W83781D_REG_BANK,
1389 client->addr + W83781D_ADDR_REG_OFFSET);
1390 outb_p(0, client->addr + W83781D_DATA_REG_OFFSET);
1393 bank = (reg >> 8) & 0x0f;
1396 i2c_smbus_write_byte_data(client, W83781D_REG_BANK,
1398 if (bank == 0 || bank > 2) {
1399 res = i2c_smbus_read_byte_data(client, reg & 0xff);
1401 /* switch to subclient */
1402 cl = data->lm75[bank - 1];
1403 /* convert from ISA to LM75 I2C addresses */
1404 switch (reg & 0xff) {
1405 case 0x50: /* TEMP */
1406 res = swab16(i2c_smbus_read_word_data(cl, 0));
1408 case 0x52: /* CONFIG */
1409 res = i2c_smbus_read_byte_data(cl, 1);
1411 case 0x53: /* HYST */
1412 res = swab16(i2c_smbus_read_word_data(cl, 2));
1414 case 0x55: /* OVER */
1416 res = swab16(i2c_smbus_read_word_data(cl, 3));
1421 i2c_smbus_write_byte_data(client, W83781D_REG_BANK, 0);
1428 w83781d_write_value(struct i2c_client *client, u16 reg, u16 value)
1430 struct w83781d_data *data = i2c_get_clientdata(client);
1431 int word_sized, bank;
1432 struct i2c_client *cl;
1435 if (i2c_is_isa_client(client)) {
1436 word_sized = (((reg & 0xff00) == 0x100)
1437 || ((reg & 0xff00) == 0x200))
1438 && (((reg & 0x00ff) == 0x53)
1439 || ((reg & 0x00ff) == 0x55));
1441 outb_p(W83781D_REG_BANK,
1442 client->addr + W83781D_ADDR_REG_OFFSET);
1444 client->addr + W83781D_DATA_REG_OFFSET);
1446 outb_p(reg & 0xff, client->addr + W83781D_ADDR_REG_OFFSET);
1449 client->addr + W83781D_DATA_REG_OFFSET);
1450 outb_p((reg & 0xff) + 1,
1451 client->addr + W83781D_ADDR_REG_OFFSET);
1453 outb_p(value & 0xff, client->addr + W83781D_DATA_REG_OFFSET);
1455 outb_p(W83781D_REG_BANK,
1456 client->addr + W83781D_ADDR_REG_OFFSET);
1457 outb_p(0, client->addr + W83781D_DATA_REG_OFFSET);
1460 bank = (reg >> 8) & 0x0f;
1463 i2c_smbus_write_byte_data(client, W83781D_REG_BANK,
1465 if (bank == 0 || bank > 2) {
1466 i2c_smbus_write_byte_data(client, reg & 0xff,
1469 /* switch to subclient */
1470 cl = data->lm75[bank - 1];
1471 /* convert from ISA to LM75 I2C addresses */
1472 switch (reg & 0xff) {
1473 case 0x52: /* CONFIG */
1474 i2c_smbus_write_byte_data(cl, 1, value & 0xff);
1476 case 0x53: /* HYST */
1477 i2c_smbus_write_word_data(cl, 2, swab16(value));
1479 case 0x55: /* OVER */
1480 i2c_smbus_write_word_data(cl, 3, swab16(value));
1485 i2c_smbus_write_byte_data(client, W83781D_REG_BANK, 0);
1491 /* Called when we have found a new W83781D. It should set limits, etc. */
1493 w83781d_init_client(struct i2c_client *client)
1495 struct w83781d_data *data = i2c_get_clientdata(client);
1497 int type = data->type;
1500 if (init && type != as99127f) { /* this resets registers we don't have
1501 documentation for on the as99127f */
1502 /* save these registers */
1503 i = w83781d_read_value(client, W83781D_REG_BEEP_CONFIG);
1504 p = w83781d_read_value(client, W83781D_REG_PWMCLK12);
1505 /* Reset all except Watchdog values and last conversion values
1506 This sets fan-divs to 2, among others */
1507 w83781d_write_value(client, W83781D_REG_CONFIG, 0x80);
1508 /* Restore the registers and disable power-on abnormal beep.
1509 This saves FAN 1/2/3 input/output values set by BIOS. */
1510 w83781d_write_value(client, W83781D_REG_BEEP_CONFIG, i | 0x80);
1511 w83781d_write_value(client, W83781D_REG_PWMCLK12, p);
1512 /* Disable master beep-enable (reset turns it on).
1513 Individual beep_mask should be reset to off but for some reason
1514 disabling this bit helps some people not get beeped */
1515 w83781d_write_value(client, W83781D_REG_BEEP_INTS2, 0);
1518 data->vrm = i2c_which_vrm();
1520 if ((type != w83781d) && (type != as99127f)) {
1521 tmp = w83781d_read_value(client, W83781D_REG_SCFG1);
1522 for (i = 1; i <= 3; i++) {
1523 if (!(tmp & BIT_SCFG1[i - 1])) {
1524 data->sens[i - 1] = W83781D_DEFAULT_BETA;
1526 if (w83781d_read_value
1528 W83781D_REG_SCFG2) & BIT_SCFG2[i - 1])
1529 data->sens[i - 1] = 1;
1531 data->sens[i - 1] = 2;
1533 if ((type == w83783s || type == w83697hf) && (i == 2))
1539 Fill up the RT Tables.
1540 We assume that they are 32 bytes long, in order for temp 1-3.
1541 Data sheet documentation is sparse.
1542 We also assume that it is only for the 781D although I suspect
1543 that the others support it as well....
1546 if (init && type == w83781d) {
1549 Auto-indexing doesn't seem to work...
1550 w83781d_write_value(client,W83781D_REG_RT_IDX,0);
1552 for (i = 0; i < 3; i++) {
1554 for (j = 0; j < 32; j++) {
1555 w83781d_write_value(client,
1556 W83781D_REG_RT_IDX, k++);
1558 w83781d_read_value(client,
1559 W83781D_REG_RT_VAL);
1563 #endif /* W83781D_RT */
1566 if (type != w83783s && type != w83697hf) {
1567 w83781d_write_value(client, W83781D_REG_TEMP3_CONFIG,
1570 if (type != w83781d) {
1571 /* enable comparator mode for temp2 and temp3 so
1572 alarm indication will work correctly */
1573 i = w83781d_read_value(client, W83781D_REG_IRQ);
1575 w83781d_write_value(client, W83781D_REG_IRQ,
1580 /* Start monitoring */
1581 w83781d_write_value(client, W83781D_REG_CONFIG,
1582 (w83781d_read_value(client,
1583 W83781D_REG_CONFIG) & 0xf7)
1587 static struct w83781d_data *w83781d_update_device(struct device *dev)
1589 struct i2c_client *client = to_i2c_client(dev);
1590 struct w83781d_data *data = i2c_get_clientdata(client);
1593 down(&data->update_lock);
1596 (jiffies - data->last_updated, (unsigned long) (HZ + HZ / 2))
1597 || time_before(jiffies, data->last_updated) || !data->valid) {
1598 dev_dbg(dev, "Starting device update\n");
1600 for (i = 0; i <= 8; i++) {
1601 if ((data->type == w83783s || data->type == w83697hf)
1603 continue; /* 783S has no in1 */
1605 w83781d_read_value(client, W83781D_REG_IN(i));
1607 w83781d_read_value(client, W83781D_REG_IN_MIN(i));
1609 w83781d_read_value(client, W83781D_REG_IN_MAX(i));
1610 if ((data->type != w83782d) && (data->type != w83697hf)
1611 && (data->type != w83627hf) && (i == 6))
1614 for (i = 1; i <= 3; i++) {
1616 w83781d_read_value(client, W83781D_REG_FAN(i));
1617 data->fan_min[i - 1] =
1618 w83781d_read_value(client, W83781D_REG_FAN_MIN(i));
1620 if (data->type != w83781d && data->type != as99127f) {
1621 for (i = 1; i <= 4; i++) {
1623 w83781d_read_value(client,
1624 W83781D_REG_PWM(i));
1625 if ((data->type != w83782d
1626 || i2c_is_isa_client(client))
1630 /* Only PWM2 can be disabled */
1631 data->pwmenable[1] = (w83781d_read_value(client,
1632 W83781D_REG_PWMCLK12) & 0x08) >> 3;
1635 data->temp = w83781d_read_value(client, W83781D_REG_TEMP(1));
1637 w83781d_read_value(client, W83781D_REG_TEMP_OVER(1));
1638 data->temp_max_hyst =
1639 w83781d_read_value(client, W83781D_REG_TEMP_HYST(1));
1641 w83781d_read_value(client, W83781D_REG_TEMP(2));
1642 data->temp_max_add[0] =
1643 w83781d_read_value(client, W83781D_REG_TEMP_OVER(2));
1644 data->temp_max_hyst_add[0] =
1645 w83781d_read_value(client, W83781D_REG_TEMP_HYST(2));
1646 if (data->type != w83783s && data->type != w83697hf) {
1648 w83781d_read_value(client, W83781D_REG_TEMP(3));
1649 data->temp_max_add[1] =
1650 w83781d_read_value(client,
1651 W83781D_REG_TEMP_OVER(3));
1652 data->temp_max_hyst_add[1] =
1653 w83781d_read_value(client,
1654 W83781D_REG_TEMP_HYST(3));
1656 i = w83781d_read_value(client, W83781D_REG_VID_FANDIV);
1657 if (data->type != w83697hf) {
1658 data->vid = i & 0x0f;
1660 (w83781d_read_value(client, W83781D_REG_CHIPID) &
1664 data->fan_div[0] = (i >> 4) & 0x03;
1665 data->fan_div[1] = (i >> 6) & 0x03;
1666 if (data->type != w83697hf) {
1667 data->fan_div[2] = (w83781d_read_value(client,
1671 if ((data->type != w83781d) && (data->type != as99127f)) {
1672 i = w83781d_read_value(client, W83781D_REG_VBAT);
1673 data->fan_div[0] |= (i >> 3) & 0x04;
1674 data->fan_div[1] |= (i >> 4) & 0x04;
1675 if (data->type != w83697hf)
1676 data->fan_div[2] |= (i >> 5) & 0x04;
1679 w83781d_read_value(client,
1680 W83781D_REG_ALARM1) +
1681 (w83781d_read_value(client, W83781D_REG_ALARM2) << 8);
1682 if ((data->type == w83782d) || (data->type == w83627hf)) {
1684 w83781d_read_value(client,
1685 W83781D_REG_ALARM3) << 16;
1687 i = w83781d_read_value(client, W83781D_REG_BEEP_INTS2);
1688 data->beep_enable = i >> 7;
1689 data->beep_mask = ((i & 0x7f) << 8) +
1690 w83781d_read_value(client, W83781D_REG_BEEP_INTS1);
1691 if ((data->type != w83781d) && (data->type != as99127f)) {
1693 w83781d_read_value(client,
1694 W83781D_REG_BEEP_INTS3) << 16;
1696 data->last_updated = jiffies;
1700 up(&data->update_lock);
1706 sensors_w83781d_init(void)
1708 return i2c_add_driver(&w83781d_driver);
1712 sensors_w83781d_exit(void)
1714 i2c_del_driver(&w83781d_driver);
1717 MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>, "
1718 "Philip Edelbrock <phil@netroedge.com>, "
1719 "and Mark Studebaker <mdsxyz123@yahoo.com>");
1720 MODULE_DESCRIPTION("W83781D driver");
1721 MODULE_LICENSE("GPL");
1723 module_init(sensors_w83781d_init);
1724 module_exit(sensors_w83781d_exit);