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[] = { I2C_CLIENT_END };
53 static unsigned short normal_i2c_range[] = { 0x20, 0x2f, I2C_CLIENT_END };
54 static unsigned int normal_isa[] = { 0x0290, I2C_CLIENT_ISA_END };
55 static unsigned int normal_isa_range[] = { 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_PARM(init, "i");
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 AS99127_TEMP_ADD_TO_REG(val) (SENSORS_LIMIT((((val) < 0 ? (val)+0x10000*250 \
179 : (val)) / 250) << 7, 0, 0xffff))
180 #define AS99127_TEMP_ADD_FROM_REG(val) ((((val) & 0x8000 ? (val)-0x10000 : (val)) \
183 #define ALARMS_FROM_REG(val) (val)
184 #define PWM_FROM_REG(val) (val)
185 #define PWM_TO_REG(val) (SENSORS_LIMIT((val),0,255))
186 #define BEEP_MASK_FROM_REG(val,type) ((type) == as99127f ? \
187 (val) ^ 0x7fff : (val))
188 #define BEEP_MASK_TO_REG(val,type) ((type) == as99127f ? \
189 (~(val)) & 0x7fff : (val) & 0xffffff)
191 #define BEEP_ENABLE_TO_REG(val) ((val) ? 1 : 0)
192 #define BEEP_ENABLE_FROM_REG(val) ((val) ? 1 : 0)
194 #define DIV_FROM_REG(val) (1 << (val))
197 DIV_TO_REG(long val, enum chips type)
200 val = SENSORS_LIMIT(val, 1,
202 || type == as99127f) ? 8 : 128)) >> 1;
203 for (i = 0; i < 6; i++) {
211 /* There are some complications in a module like this. First off, W83781D chips
212 may be both present on the SMBus and the ISA bus, and we have to handle
213 those cases separately at some places. Second, there might be several
214 W83781D chips available (well, actually, that is probably never done; but
215 it is a clean illustration of how to handle a case like that). Finally,
216 a specific chip may be attached to *both* ISA and SMBus, and we would
217 not like to detect it double. Fortunately, in the case of the W83781D at
218 least, a register tells us what SMBus address we are on, so that helps
219 a bit - except if there could be more than one SMBus. Groan. No solution
222 /* This module may seem overly long and complicated. In fact, it is not so
223 bad. Quite a lot of bookkeeping is done. A real driver can often cut
226 /* For each registered W83781D, we need to keep some data in memory. That
227 data is pointed to by w83781d_list[NR]->data. The structure itself is
228 dynamically allocated, at the same time when a new w83781d client is
230 struct w83781d_data {
231 struct i2c_client client;
232 struct semaphore lock;
235 struct semaphore update_lock;
236 char valid; /* !=0 if following fields are valid */
237 unsigned long last_updated; /* In jiffies */
239 struct i2c_client *lm75[2]; /* for secondary I2C addresses */
240 /* array of 2 pointers to subclients */
242 u8 in[9]; /* Register value - 8 & 9 for 782D only */
243 u8 in_max[9]; /* Register value - 8 & 9 for 782D only */
244 u8 in_min[9]; /* Register value - 8 & 9 for 782D only */
245 u8 fan[3]; /* Register value */
246 u8 fan_min[3]; /* Register value */
248 u8 temp_max; /* Register value */
249 u8 temp_max_hyst; /* Register value */
250 u16 temp_add[2]; /* Register value */
251 u16 temp_max_add[2]; /* Register value */
252 u16 temp_max_hyst_add[2]; /* Register value */
253 u8 fan_div[3]; /* Register encoding, shifted right */
254 u8 vid; /* Register encoding, combined */
255 u32 alarms; /* Register encoding, combined */
256 u32 beep_mask; /* Register encoding, combined */
257 u8 beep_enable; /* Boolean */
258 u8 pwm[4]; /* Register value */
259 u8 pwmenable[4]; /* Boolean */
260 u16 sens[3]; /* 782D/783S only.
261 1 = pentium diode; 2 = 3904 diode;
262 3000-5000 = thermistor beta.
264 Other Betas unimplemented */
266 u8 rt[3][32]; /* Register value */
271 static int w83781d_attach_adapter(struct i2c_adapter *adapter);
272 static int w83781d_detect(struct i2c_adapter *adapter, int address, int kind);
273 static int w83781d_detach_client(struct i2c_client *client);
275 static int w83781d_read_value(struct i2c_client *client, u16 register);
276 static int w83781d_write_value(struct i2c_client *client, u16 register,
278 static struct w83781d_data *w83781d_update_device(struct device *dev);
279 static void w83781d_init_client(struct i2c_client *client);
281 static struct i2c_driver w83781d_driver = {
282 .owner = THIS_MODULE,
284 .id = I2C_DRIVERID_W83781D,
285 .flags = I2C_DF_NOTIFY,
286 .attach_adapter = w83781d_attach_adapter,
287 .detach_client = w83781d_detach_client,
290 /* following are the sysfs callback functions */
291 #define show_in_reg(reg) \
292 static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
294 struct w83781d_data *data = w83781d_update_device(dev); \
295 return sprintf(buf,"%ld\n", (long)IN_FROM_REG(data->reg[nr] * 10)); \
301 #define store_in_reg(REG, reg) \
302 static ssize_t store_in_##reg (struct device *dev, const char *buf, size_t count, int nr) \
304 struct i2c_client *client = to_i2c_client(dev); \
305 struct w83781d_data *data = i2c_get_clientdata(client); \
308 val = simple_strtoul(buf, NULL, 10) / 10; \
309 data->in_##reg[nr] = IN_TO_REG(val); \
310 w83781d_write_value(client, W83781D_REG_IN_##REG(nr), data->in_##reg[nr]); \
314 store_in_reg(MIN, min);
315 store_in_reg(MAX, max);
317 #define sysfs_in_offset(offset) \
319 show_regs_in_##offset (struct device *dev, char *buf) \
321 return show_in(dev, buf, 0x##offset); \
323 static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_regs_in_##offset, NULL)
325 #define sysfs_in_reg_offset(reg, offset) \
326 static ssize_t show_regs_in_##reg##offset (struct device *dev, char *buf) \
328 return show_in_##reg (dev, buf, 0x##offset); \
330 static ssize_t store_regs_in_##reg##offset (struct device *dev, const char *buf, size_t count) \
332 return store_in_##reg (dev, buf, count, 0x##offset); \
334 static DEVICE_ATTR(in##offset##_##reg, S_IRUGO| S_IWUSR, show_regs_in_##reg##offset, store_regs_in_##reg##offset)
336 #define sysfs_in_offsets(offset) \
337 sysfs_in_offset(offset); \
338 sysfs_in_reg_offset(min, offset); \
339 sysfs_in_reg_offset(max, offset);
351 #define device_create_file_in(client, offset) \
353 device_create_file(&client->dev, &dev_attr_in##offset##_input); \
354 device_create_file(&client->dev, &dev_attr_in##offset##_min); \
355 device_create_file(&client->dev, &dev_attr_in##offset##_max); \
358 #define show_fan_reg(reg) \
359 static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
361 struct w83781d_data *data = w83781d_update_device(dev); \
362 return sprintf(buf,"%ld\n", \
363 FAN_FROM_REG(data->reg[nr-1], (long)DIV_FROM_REG(data->fan_div[nr-1]))); \
366 show_fan_reg(fan_min);
369 store_fan_min(struct device *dev, const char *buf, size_t count, int nr)
371 struct i2c_client *client = to_i2c_client(dev);
372 struct w83781d_data *data = i2c_get_clientdata(client);
375 val = simple_strtoul(buf, NULL, 10);
376 data->fan_min[nr - 1] =
377 FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr - 1]));
378 w83781d_write_value(client, W83781D_REG_FAN_MIN(nr),
379 data->fan_min[nr - 1]);
384 #define sysfs_fan_offset(offset) \
385 static ssize_t show_regs_fan_##offset (struct device *dev, char *buf) \
387 return show_fan(dev, buf, 0x##offset); \
389 static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_regs_fan_##offset, NULL)
391 #define sysfs_fan_min_offset(offset) \
392 static ssize_t show_regs_fan_min##offset (struct device *dev, char *buf) \
394 return show_fan_min(dev, buf, 0x##offset); \
396 static ssize_t store_regs_fan_min##offset (struct device *dev, const char *buf, size_t count) \
398 return store_fan_min(dev, buf, count, 0x##offset); \
400 static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, show_regs_fan_min##offset, store_regs_fan_min##offset)
403 sysfs_fan_min_offset(1);
405 sysfs_fan_min_offset(2);
407 sysfs_fan_min_offset(3);
409 #define device_create_file_fan(client, offset) \
411 device_create_file(&client->dev, &dev_attr_fan##offset##_input); \
412 device_create_file(&client->dev, &dev_attr_fan##offset##_min); \
415 #define show_temp_reg(reg) \
416 static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
418 struct w83781d_data *data = w83781d_update_device(dev); \
419 if (nr >= 2) { /* TEMP2 and TEMP3 */ \
420 if (data->type == as99127f) { \
421 return sprintf(buf,"%ld\n", \
422 (long)AS99127_TEMP_ADD_FROM_REG(data->reg##_add[nr-2])); \
424 return sprintf(buf,"%d\n", \
425 LM75_TEMP_FROM_REG(data->reg##_add[nr-2])); \
427 } else { /* TEMP1 */ \
428 return sprintf(buf,"%ld\n", (long)TEMP_FROM_REG(data->reg)); \
432 show_temp_reg(temp_max);
433 show_temp_reg(temp_max_hyst);
435 #define store_temp_reg(REG, reg) \
436 static ssize_t store_temp_##reg (struct device *dev, const char *buf, size_t count, int nr) \
438 struct i2c_client *client = to_i2c_client(dev); \
439 struct w83781d_data *data = i2c_get_clientdata(client); \
442 val = simple_strtol(buf, NULL, 10); \
444 if (nr >= 2) { /* TEMP2 and TEMP3 */ \
445 if (data->type == as99127f) \
446 data->temp_##reg##_add[nr-2] = AS99127_TEMP_ADD_TO_REG(val); \
448 data->temp_##reg##_add[nr-2] = LM75_TEMP_TO_REG(val); \
450 w83781d_write_value(client, W83781D_REG_TEMP_##REG(nr), \
451 data->temp_##reg##_add[nr-2]); \
452 } else { /* TEMP1 */ \
453 data->temp_##reg = TEMP_TO_REG(val); \
454 w83781d_write_value(client, W83781D_REG_TEMP_##REG(nr), \
460 store_temp_reg(OVER, max);
461 store_temp_reg(HYST, max_hyst);
463 #define sysfs_temp_offset(offset) \
465 show_regs_temp_##offset (struct device *dev, char *buf) \
467 return show_temp(dev, buf, 0x##offset); \
469 static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_regs_temp_##offset, NULL)
471 #define sysfs_temp_reg_offset(reg, offset) \
472 static ssize_t show_regs_temp_##reg##offset (struct device *dev, char *buf) \
474 return show_temp_##reg (dev, buf, 0x##offset); \
476 static ssize_t store_regs_temp_##reg##offset (struct device *dev, const char *buf, size_t count) \
478 return store_temp_##reg (dev, buf, count, 0x##offset); \
480 static DEVICE_ATTR(temp##offset##_##reg, S_IRUGO| S_IWUSR, show_regs_temp_##reg##offset, store_regs_temp_##reg##offset)
482 #define sysfs_temp_offsets(offset) \
483 sysfs_temp_offset(offset); \
484 sysfs_temp_reg_offset(max, offset); \
485 sysfs_temp_reg_offset(max_hyst, offset);
487 sysfs_temp_offsets(1);
488 sysfs_temp_offsets(2);
489 sysfs_temp_offsets(3);
491 #define device_create_file_temp(client, offset) \
493 device_create_file(&client->dev, &dev_attr_temp##offset##_input); \
494 device_create_file(&client->dev, &dev_attr_temp##offset##_max); \
495 device_create_file(&client->dev, &dev_attr_temp##offset##_max_hyst); \
499 show_vid_reg(struct device *dev, char *buf)
501 struct w83781d_data *data = w83781d_update_device(dev);
502 return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
506 DEVICE_ATTR(in0_ref, S_IRUGO, show_vid_reg, NULL)
507 #define device_create_file_vid(client) \
508 device_create_file(&client->dev, &dev_attr_in0_ref);
510 show_vrm_reg(struct device *dev, char *buf)
512 struct w83781d_data *data = w83781d_update_device(dev);
513 return sprintf(buf, "%ld\n", (long) data->vrm);
517 store_vrm_reg(struct device *dev, const char *buf, size_t count)
519 struct i2c_client *client = to_i2c_client(dev);
520 struct w83781d_data *data = i2c_get_clientdata(client);
523 val = simple_strtoul(buf, NULL, 10);
530 DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg)
531 #define device_create_file_vrm(client) \
532 device_create_file(&client->dev, &dev_attr_vrm);
534 show_alarms_reg(struct device *dev, char *buf)
536 struct w83781d_data *data = w83781d_update_device(dev);
537 return sprintf(buf, "%ld\n", (long) ALARMS_FROM_REG(data->alarms));
541 DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL)
542 #define device_create_file_alarms(client) \
543 device_create_file(&client->dev, &dev_attr_alarms);
544 static ssize_t show_beep_mask (struct device *dev, char *buf)
546 struct w83781d_data *data = w83781d_update_device(dev);
547 return sprintf(buf, "%ld\n",
548 (long)BEEP_MASK_FROM_REG(data->beep_mask, data->type));
550 static ssize_t show_beep_enable (struct device *dev, char *buf)
552 struct w83781d_data *data = w83781d_update_device(dev);
553 return sprintf(buf, "%ld\n",
554 (long)BEEP_ENABLE_FROM_REG(data->beep_enable));
557 #define BEEP_ENABLE 0 /* Store beep_enable */
558 #define BEEP_MASK 1 /* Store beep_mask */
561 store_beep_reg(struct device *dev, const char *buf, size_t count,
564 struct i2c_client *client = to_i2c_client(dev);
565 struct w83781d_data *data = i2c_get_clientdata(client);
568 val = simple_strtoul(buf, NULL, 10);
570 if (update_mask == BEEP_MASK) { /* We are storing beep_mask */
571 data->beep_mask = BEEP_MASK_TO_REG(val, data->type);
572 w83781d_write_value(client, W83781D_REG_BEEP_INTS1,
573 data->beep_mask & 0xff);
575 if ((data->type != w83781d) && (data->type != as99127f)) {
576 w83781d_write_value(client, W83781D_REG_BEEP_INTS3,
577 ((data->beep_mask) >> 16) & 0xff);
580 val2 = (data->beep_mask >> 8) & 0x7f;
581 } else { /* We are storing beep_enable */
582 val2 = w83781d_read_value(client, W83781D_REG_BEEP_INTS2) & 0x7f;
583 data->beep_enable = BEEP_ENABLE_TO_REG(val);
586 w83781d_write_value(client, W83781D_REG_BEEP_INTS2,
587 val2 | data->beep_enable << 7);
592 #define sysfs_beep(REG, reg) \
593 static ssize_t show_regs_beep_##reg (struct device *dev, char *buf) \
595 return show_beep_##reg(dev, buf); \
597 static ssize_t store_regs_beep_##reg (struct device *dev, const char *buf, size_t count) \
599 return store_beep_reg(dev, buf, count, BEEP_##REG); \
601 static DEVICE_ATTR(beep_##reg, S_IRUGO | S_IWUSR, show_regs_beep_##reg, store_regs_beep_##reg)
603 sysfs_beep(ENABLE, enable);
604 sysfs_beep(MASK, mask);
606 #define device_create_file_beep(client) \
608 device_create_file(&client->dev, &dev_attr_beep_enable); \
609 device_create_file(&client->dev, &dev_attr_beep_mask); \
613 show_fan_div_reg(struct device *dev, char *buf, int nr)
615 struct w83781d_data *data = w83781d_update_device(dev);
616 return sprintf(buf, "%ld\n",
617 (long) DIV_FROM_REG(data->fan_div[nr - 1]));
620 /* Note: we save and restore the fan minimum here, because its value is
621 determined in part by the fan divisor. This follows the principle of
622 least suprise; the user doesn't expect the fan minimum to change just
623 because the divisor changed. */
625 store_fan_div_reg(struct device *dev, const char *buf, size_t count, int nr)
627 struct i2c_client *client = to_i2c_client(dev);
628 struct w83781d_data *data = i2c_get_clientdata(client);
633 min = FAN_FROM_REG(data->fan_min[nr],
634 DIV_FROM_REG(data->fan_div[nr]));
636 data->fan_div[nr] = DIV_TO_REG(simple_strtoul(buf, NULL, 10),
639 reg = (w83781d_read_value(client, nr==2 ? W83781D_REG_PIN : W83781D_REG_VID_FANDIV)
640 & (nr==0 ? 0xcf : 0x3f))
641 | ((data->fan_div[nr] & 0x03) << (nr==0 ? 4 : 6));
642 w83781d_write_value(client, nr==2 ? W83781D_REG_PIN : W83781D_REG_VID_FANDIV, reg);
644 /* w83781d and as99127f don't have extended divisor bits */
645 if (data->type != w83781d && data->type != as99127f) {
646 reg = (w83781d_read_value(client, W83781D_REG_VBAT)
648 | ((data->fan_div[nr] & 0x04) << (3 + nr));
649 w83781d_write_value(client, W83781D_REG_VBAT, reg);
652 /* Restore fan_min */
653 data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
654 w83781d_write_value(client, W83781D_REG_FAN_MIN(nr+1), data->fan_min[nr]);
659 #define sysfs_fan_div(offset) \
660 static ssize_t show_regs_fan_div_##offset (struct device *dev, char *buf) \
662 return show_fan_div_reg(dev, buf, offset); \
664 static ssize_t store_regs_fan_div_##offset (struct device *dev, const char *buf, size_t count) \
666 return store_fan_div_reg(dev, buf, count, offset - 1); \
668 static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, show_regs_fan_div_##offset, store_regs_fan_div_##offset)
674 #define device_create_file_fan_div(client, offset) \
676 device_create_file(&client->dev, &dev_attr_fan##offset##_div); \
680 show_pwm_reg(struct device *dev, char *buf, int nr)
682 struct w83781d_data *data = w83781d_update_device(dev);
683 return sprintf(buf, "%ld\n", (long) PWM_FROM_REG(data->pwm[nr - 1]));
687 show_pwmenable_reg(struct device *dev, char *buf, int nr)
689 struct w83781d_data *data = w83781d_update_device(dev);
690 return sprintf(buf, "%ld\n", (long) data->pwmenable[nr - 1]);
694 store_pwm_reg(struct device *dev, const char *buf, size_t count, int nr)
696 struct i2c_client *client = to_i2c_client(dev);
697 struct w83781d_data *data = i2c_get_clientdata(client);
700 val = simple_strtoul(buf, NULL, 10);
702 data->pwm[nr - 1] = PWM_TO_REG(val);
703 w83781d_write_value(client, W83781D_REG_PWM(nr), data->pwm[nr - 1]);
709 store_pwmenable_reg(struct device *dev, const char *buf, size_t count, int nr)
711 struct i2c_client *client = to_i2c_client(dev);
712 struct w83781d_data *data = i2c_get_clientdata(client);
715 val = simple_strtoul(buf, NULL, 10);
720 reg = w83781d_read_value(client, W83781D_REG_PWMCLK12);
721 w83781d_write_value(client, W83781D_REG_PWMCLK12,
722 (reg & 0xf7) | (val << 3));
724 reg = w83781d_read_value(client, W83781D_REG_BEEP_CONFIG);
725 w83781d_write_value(client, W83781D_REG_BEEP_CONFIG,
726 (reg & 0xef) | (!val << 4));
728 data->pwmenable[nr - 1] = val;
738 #define sysfs_pwm(offset) \
739 static ssize_t show_regs_pwm_##offset (struct device *dev, char *buf) \
741 return show_pwm_reg(dev, buf, offset); \
743 static ssize_t store_regs_pwm_##offset (struct device *dev, const char *buf, size_t count) \
745 return store_pwm_reg(dev, buf, count, offset); \
747 static DEVICE_ATTR(fan##offset##_pwm, S_IRUGO | S_IWUSR, show_regs_pwm_##offset, store_regs_pwm_##offset)
749 #define sysfs_pwmenable(offset) \
750 static ssize_t show_regs_pwmenable_##offset (struct device *dev, char *buf) \
752 return show_pwmenable_reg(dev, buf, offset); \
754 static ssize_t store_regs_pwmenable_##offset (struct device *dev, const char *buf, size_t count) \
756 return store_pwmenable_reg(dev, buf, count, offset); \
758 static DEVICE_ATTR(fan##offset##_pwm_enable, S_IRUGO | S_IWUSR, show_regs_pwmenable_##offset, store_regs_pwmenable_##offset)
762 sysfs_pwmenable(2); /* only PWM2 can be enabled/disabled */
766 #define device_create_file_pwm(client, offset) \
768 device_create_file(&client->dev, &dev_attr_fan##offset##_pwm); \
771 #define device_create_file_pwmenable(client, offset) \
773 device_create_file(&client->dev, &dev_attr_fan##offset##_pwm_enable); \
777 show_sensor_reg(struct device *dev, char *buf, int nr)
779 struct w83781d_data *data = w83781d_update_device(dev);
780 return sprintf(buf, "%ld\n", (long) data->sens[nr - 1]);
784 store_sensor_reg(struct device *dev, const char *buf, size_t count, int nr)
786 struct i2c_client *client = to_i2c_client(dev);
787 struct w83781d_data *data = i2c_get_clientdata(client);
790 val = simple_strtoul(buf, NULL, 10);
793 case 1: /* PII/Celeron diode */
794 tmp = w83781d_read_value(client, W83781D_REG_SCFG1);
795 w83781d_write_value(client, W83781D_REG_SCFG1,
796 tmp | BIT_SCFG1[nr - 1]);
797 tmp = w83781d_read_value(client, W83781D_REG_SCFG2);
798 w83781d_write_value(client, W83781D_REG_SCFG2,
799 tmp | BIT_SCFG2[nr - 1]);
800 data->sens[nr - 1] = val;
803 tmp = w83781d_read_value(client, W83781D_REG_SCFG1);
804 w83781d_write_value(client, W83781D_REG_SCFG1,
805 tmp | BIT_SCFG1[nr - 1]);
806 tmp = w83781d_read_value(client, W83781D_REG_SCFG2);
807 w83781d_write_value(client, W83781D_REG_SCFG2,
808 tmp & ~BIT_SCFG2[nr - 1]);
809 data->sens[nr - 1] = val;
811 case W83781D_DEFAULT_BETA: /* thermistor */
812 tmp = w83781d_read_value(client, W83781D_REG_SCFG1);
813 w83781d_write_value(client, W83781D_REG_SCFG1,
814 tmp & ~BIT_SCFG1[nr - 1]);
815 data->sens[nr - 1] = val;
818 dev_err(&client->dev,
819 "Invalid sensor type %ld; must be 1, 2, or %d\n",
820 (long) val, W83781D_DEFAULT_BETA);
827 #define sysfs_sensor(offset) \
828 static ssize_t show_regs_sensor_##offset (struct device *dev, char *buf) \
830 return show_sensor_reg(dev, buf, offset); \
832 static ssize_t store_regs_sensor_##offset (struct device *dev, const char *buf, size_t count) \
834 return store_sensor_reg(dev, buf, count, offset); \
836 static DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR, show_regs_sensor_##offset, store_regs_sensor_##offset)
842 #define device_create_file_sensor(client, offset) \
844 device_create_file(&client->dev, &dev_attr_temp##offset##_type); \
849 show_rt_reg(struct device *dev, char *buf, int nr)
851 struct w83781d_data *data = w83781d_update_device(dev);
854 for (i = 0; i < 32; i++) {
856 j += sprintf(buf, " %ld", (long) data->rt[nr - 1][i]);
858 j += sprintf(buf, "%ld", (long) data->rt[nr - 1][i]);
860 j += sprintf(buf, "\n");
866 store_rt_reg(struct device *dev, const char *buf, size_t count, int nr)
868 struct i2c_client *client = to_i2c_client(dev);
869 struct w83781d_data *data = i2c_get_clientdata(client);
872 for (i = 0; i < count; i++) {
873 val = simple_strtoul(buf + count, NULL, 10);
875 /* fixme: no bounds checking 0-255 */
876 data->rt[nr - 1][i] = val & 0xff;
877 w83781d_write_value(client, W83781D_REG_RT_IDX, i);
878 w83781d_write_value(client, W83781D_REG_RT_VAL,
879 data->rt[nr - 1][i]);
885 #define sysfs_rt(offset) \
886 static ssize_t show_regs_rt_##offset (struct device *dev, char *buf) \
888 return show_rt_reg(dev, buf, offset); \
890 static ssize_t store_regs_rt_##offset (struct device *dev, const char *buf, size_t count) \
892 return store_rt_reg(dev, buf, count, offset); \
894 static DEVICE_ATTR(rt##offset, S_IRUGO | S_IWUSR, show_regs_rt_##offset, store_regs_rt_##offset)
900 #define device_create_file_rt(client, offset) \
902 device_create_file(&client->dev, &dev_attr_rt##offset); \
905 #endif /* ifdef W83781D_RT */
907 /* This function is called when:
908 * w83781d_driver is inserted (when this module is loaded), for each
910 * when a new adapter is inserted (and w83781d_driver is still present) */
912 w83781d_attach_adapter(struct i2c_adapter *adapter)
914 if (!(adapter->class & I2C_CLASS_HWMON))
916 return i2c_detect(adapter, &addr_data, w83781d_detect);
919 /* Assumes that adapter is of I2C, not ISA variety.
920 * OTHERWISE DON'T CALL THIS
923 w83781d_detect_subclients(struct i2c_adapter *adapter, int address, int kind,
924 struct i2c_client *new_client)
928 const char *client_name = "";
929 struct w83781d_data *data = i2c_get_clientdata(new_client);
931 data->lm75[0] = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
932 if (!(data->lm75[0])) {
936 memset(data->lm75[0], 0x00, sizeof (struct i2c_client));
938 id = i2c_adapter_id(adapter);
940 if (force_subclients[0] == id && force_subclients[1] == address) {
941 for (i = 2; i <= 3; i++) {
942 if (force_subclients[i] < 0x48 ||
943 force_subclients[i] > 0x4f) {
944 dev_err(&new_client->dev, "Invalid subclient "
945 "address %d; must be 0x48-0x4f\n",
946 force_subclients[i]);
951 w83781d_write_value(new_client, W83781D_REG_I2C_SUBADDR,
952 (force_subclients[2] & 0x07) |
953 ((force_subclients[3] & 0x07) << 4));
954 data->lm75[0]->addr = force_subclients[2];
956 val1 = w83781d_read_value(new_client, W83781D_REG_I2C_SUBADDR);
957 data->lm75[0]->addr = 0x48 + (val1 & 0x07);
960 if (kind != w83783s) {
962 data->lm75[1] = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
963 if (!(data->lm75[1])) {
967 memset(data->lm75[1], 0x0, sizeof(struct i2c_client));
969 if (force_subclients[0] == id &&
970 force_subclients[1] == address) {
971 data->lm75[1]->addr = force_subclients[3];
973 data->lm75[1]->addr = 0x48 + ((val1 >> 4) & 0x07);
975 if (data->lm75[0]->addr == data->lm75[1]->addr) {
976 dev_err(&new_client->dev,
977 "Duplicate addresses 0x%x for subclients.\n",
978 data->lm75[0]->addr);
985 client_name = "w83781d subclient";
986 else if (kind == w83782d)
987 client_name = "w83782d subclient";
988 else if (kind == w83783s)
989 client_name = "w83783s subclient";
990 else if (kind == w83627hf)
991 client_name = "w83627hf subclient";
992 else if (kind == as99127f)
993 client_name = "as99127f subclient";
995 for (i = 0; i <= 1; i++) {
996 /* store all data in w83781d */
997 i2c_set_clientdata(data->lm75[i], NULL);
998 data->lm75[i]->adapter = adapter;
999 data->lm75[i]->driver = &w83781d_driver;
1000 data->lm75[i]->flags = 0;
1001 strlcpy(data->lm75[i]->name, client_name,
1003 if ((err = i2c_attach_client(data->lm75[i]))) {
1004 dev_err(&new_client->dev, "Subclient %d "
1005 "registration at address 0x%x "
1006 "failed.\n", i, data->lm75[i]->addr);
1011 if (kind == w83783s)
1017 /* Undo inits in case of errors */
1019 i2c_detach_client(data->lm75[0]);
1021 if (NULL != data->lm75[1])
1022 kfree(data->lm75[1]);
1024 if (NULL != data->lm75[0])
1025 kfree(data->lm75[0]);
1031 w83781d_detect(struct i2c_adapter *adapter, int address, int kind)
1033 int i = 0, val1 = 0, val2;
1034 struct i2c_client *new_client;
1035 struct w83781d_data *data;
1037 const char *client_name = "";
1038 int is_isa = i2c_is_isa_adapter(adapter);
1039 enum vendor { winbond, asus } vendid;
1042 && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1047 /* Prevent users from forcing a kind for a bus it isn't supposed
1048 to possibly be on */
1049 if (is_isa && (kind == as99127f || kind == w83783s)) {
1050 dev_err(&adapter->dev,
1051 "Cannot force I2C-only chip for ISA address 0x%02x.\n",
1056 if (!is_isa && kind == w83697hf) {
1057 dev_err(&adapter->dev,
1058 "Cannot force ISA-only chip for I2C address 0x%02x.\n",
1065 if (!request_region(address, W83781D_EXTENT, "w83781d")) {
1070 /* Probe whether there is anything available on this address. Already
1071 done for SMBus clients */
1075 #define REALLY_SLOW_IO
1076 /* We need the timeouts for at least some LM78-like
1077 chips. But only if we read 'undefined' registers. */
1078 i = inb_p(address + 1);
1079 if (inb_p(address + 2) != i) {
1083 if (inb_p(address + 3) != i) {
1087 if (inb_p(address + 7) != i) {
1091 #undef REALLY_SLOW_IO
1093 /* Let's just hope nothing breaks here */
1094 i = inb_p(address + 5) & 0x7f;
1095 outb_p(~i & 0x7f, address + 5);
1096 if ((inb_p(address + 5) & 0x7f) != (~i & 0x7f)) {
1097 outb_p(i, address + 5);
1104 /* OK. For now, we presume we have a valid client. We now create the
1105 client structure, even though we cannot fill it completely yet.
1106 But it allows us to access w83781d_{read,write}_value. */
1108 if (!(data = kmalloc(sizeof(struct w83781d_data), GFP_KERNEL))) {
1112 memset(data, 0, sizeof(struct w83781d_data));
1114 new_client = &data->client;
1115 i2c_set_clientdata(new_client, data);
1116 new_client->addr = address;
1117 init_MUTEX(&data->lock);
1118 new_client->adapter = adapter;
1119 new_client->driver = &w83781d_driver;
1120 new_client->flags = 0;
1122 /* Now, we do the remaining detection. */
1124 /* The w8378?d may be stuck in some other bank than bank 0. This may
1125 make reading other information impossible. Specify a force=... or
1126 force_*=... parameter, and the Winbond will be reset to the right
1129 if (w83781d_read_value(new_client, W83781D_REG_CONFIG) & 0x80){
1133 val1 = w83781d_read_value(new_client, W83781D_REG_BANK);
1134 val2 = w83781d_read_value(new_client, W83781D_REG_CHIPMAN);
1135 /* Check for Winbond or Asus ID if in bank 0 */
1136 if ((!(val1 & 0x07)) &&
1137 (((!(val1 & 0x80)) && (val2 != 0xa3) && (val2 != 0xc3))
1138 || ((val1 & 0x80) && (val2 != 0x5c) && (val2 != 0x12)))) {
1142 /* If Winbond SMBus, check address at 0x48.
1143 Asus doesn't support, except for as99127f rev.2 */
1144 if ((!is_isa) && (((!(val1 & 0x80)) && (val2 == 0xa3)) ||
1145 ((val1 & 0x80) && (val2 == 0x5c)))) {
1146 if (w83781d_read_value
1147 (new_client, W83781D_REG_I2C_ADDR) != address) {
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)
1174 val1 = w83781d_read_value(new_client, W83781D_REG_WCHIPID);
1175 if ((val1 == 0x10 || val1 == 0x11) && vendid == winbond)
1177 else if (val1 == 0x30 && vendid == winbond)
1179 else if (val1 == 0x40 && vendid == winbond && !is_isa
1182 else if ((val1 == 0x21 || val1 == 0x90) && vendid == winbond)
1184 else if (val1 == 0x31 && !is_isa && address >= 0x28)
1186 else if (val1 == 0x60 && vendid == winbond && is_isa)
1190 dev_warn(&new_client->dev,
1191 "Ignoring 'force' parameter for unknown chip at"
1192 "adapter %d, address 0x%02x\n",
1193 i2c_adapter_id(adapter), address);
1199 if (kind == w83781d) {
1200 client_name = "w83781d";
1201 } else if (kind == w83782d) {
1202 client_name = "w83782d";
1203 } else if (kind == w83783s) {
1204 client_name = "w83783s";
1205 } else if (kind == w83627hf) {
1207 client_name = "w83627thf";
1209 client_name = "w83627hf";
1210 } else if (kind == as99127f) {
1211 client_name = "as99127f";
1212 } else if (kind == w83697hf) {
1213 client_name = "w83697hf";
1216 /* Fill in the remaining client fields and put into the global list */
1217 strlcpy(new_client->name, client_name, I2C_NAME_SIZE);
1221 init_MUTEX(&data->update_lock);
1223 /* Tell the I2C layer a new client has arrived */
1224 if ((err = i2c_attach_client(new_client)))
1227 /* attach secondary i2c lm75-like clients */
1229 if ((err = w83781d_detect_subclients(adapter, address,
1233 data->lm75[0] = NULL;
1234 data->lm75[1] = NULL;
1237 /* Initialize the chip */
1238 w83781d_init_client(new_client);
1240 /* A few vars need to be filled upon startup */
1241 for (i = 1; i <= 3; i++) {
1242 data->fan_min[i - 1] = w83781d_read_value(new_client,
1243 W83781D_REG_FAN_MIN(i));
1245 if (kind != w83781d && kind != as99127f)
1246 for (i = 0; i < 4; i++)
1247 data->pwmenable[i] = 1;
1249 /* Register sysfs hooks */
1250 device_create_file_in(new_client, 0);
1251 if (kind != w83783s && kind != w83697hf)
1252 device_create_file_in(new_client, 1);
1253 device_create_file_in(new_client, 2);
1254 device_create_file_in(new_client, 3);
1255 device_create_file_in(new_client, 4);
1256 device_create_file_in(new_client, 5);
1257 device_create_file_in(new_client, 6);
1258 if (kind != as99127f && kind != w83781d && kind != w83783s) {
1259 device_create_file_in(new_client, 7);
1260 device_create_file_in(new_client, 8);
1263 device_create_file_fan(new_client, 1);
1264 device_create_file_fan(new_client, 2);
1265 if (kind != w83697hf)
1266 device_create_file_fan(new_client, 3);
1268 device_create_file_temp(new_client, 1);
1269 device_create_file_temp(new_client, 2);
1270 if (kind != w83783s && kind != w83697hf)
1271 device_create_file_temp(new_client, 3);
1273 if (kind != w83697hf)
1274 device_create_file_vid(new_client);
1276 if (kind != w83697hf)
1277 device_create_file_vrm(new_client);
1279 device_create_file_fan_div(new_client, 1);
1280 device_create_file_fan_div(new_client, 2);
1281 if (kind != w83697hf)
1282 device_create_file_fan_div(new_client, 3);
1284 device_create_file_alarms(new_client);
1286 device_create_file_beep(new_client);
1288 if (kind != w83781d && kind != as99127f) {
1289 device_create_file_pwm(new_client, 1);
1290 device_create_file_pwm(new_client, 2);
1291 device_create_file_pwmenable(new_client, 2);
1293 if (kind == w83782d && !is_isa) {
1294 device_create_file_pwm(new_client, 3);
1295 device_create_file_pwm(new_client, 4);
1298 if (kind != as99127f && kind != w83781d) {
1299 device_create_file_sensor(new_client, 1);
1300 device_create_file_sensor(new_client, 2);
1301 if (kind != w83783s && kind != w83697hf)
1302 device_create_file_sensor(new_client, 3);
1305 if (kind == w83781d) {
1306 device_create_file_rt(new_client, 1);
1307 device_create_file_rt(new_client, 2);
1308 device_create_file_rt(new_client, 3);
1315 i2c_detach_client(new_client);
1320 release_region(address, W83781D_EXTENT);
1326 w83781d_detach_client(struct i2c_client *client)
1330 if (i2c_is_isa_client(client))
1331 release_region(client->addr, W83781D_EXTENT);
1333 if ((err = i2c_detach_client(client))) {
1334 dev_err(&client->dev,
1335 "Client deregistration failed, client not detached.\n");
1339 if (i2c_get_clientdata(client)==NULL) {
1344 kfree(i2c_get_clientdata(client));
1350 /* The SMBus locks itself, usually, but nothing may access the Winbond between
1351 bank switches. ISA access must always be locked explicitly!
1352 We ignore the W83781D BUSY flag at this moment - it could lead to deadlocks,
1353 would slow down the W83781D access and should not be necessary.
1354 There are some ugly typecasts here, but the good news is - they should
1355 nowhere else be necessary! */
1357 w83781d_read_value(struct i2c_client *client, u16 reg)
1359 struct w83781d_data *data = i2c_get_clientdata(client);
1360 int res, word_sized, bank;
1361 struct i2c_client *cl;
1364 if (i2c_is_isa_client(client)) {
1365 word_sized = (((reg & 0xff00) == 0x100)
1366 || ((reg & 0xff00) == 0x200))
1367 && (((reg & 0x00ff) == 0x50)
1368 || ((reg & 0x00ff) == 0x53)
1369 || ((reg & 0x00ff) == 0x55));
1371 outb_p(W83781D_REG_BANK,
1372 client->addr + W83781D_ADDR_REG_OFFSET);
1374 client->addr + W83781D_DATA_REG_OFFSET);
1376 outb_p(reg & 0xff, client->addr + W83781D_ADDR_REG_OFFSET);
1377 res = inb_p(client->addr + W83781D_DATA_REG_OFFSET);
1379 outb_p((reg & 0xff) + 1,
1380 client->addr + W83781D_ADDR_REG_OFFSET);
1382 (res << 8) + inb_p(client->addr +
1383 W83781D_DATA_REG_OFFSET);
1386 outb_p(W83781D_REG_BANK,
1387 client->addr + W83781D_ADDR_REG_OFFSET);
1388 outb_p(0, client->addr + W83781D_DATA_REG_OFFSET);
1391 bank = (reg >> 8) & 0x0f;
1394 i2c_smbus_write_byte_data(client, W83781D_REG_BANK,
1396 if (bank == 0 || bank > 2) {
1397 res = i2c_smbus_read_byte_data(client, reg & 0xff);
1399 /* switch to subclient */
1400 cl = data->lm75[bank - 1];
1401 /* convert from ISA to LM75 I2C addresses */
1402 switch (reg & 0xff) {
1403 case 0x50: /* TEMP */
1404 res = swab16(i2c_smbus_read_word_data(cl, 0));
1406 case 0x52: /* CONFIG */
1407 res = i2c_smbus_read_byte_data(cl, 1);
1409 case 0x53: /* HYST */
1410 res = swab16(i2c_smbus_read_word_data(cl, 2));
1412 case 0x55: /* OVER */
1414 res = swab16(i2c_smbus_read_word_data(cl, 3));
1419 i2c_smbus_write_byte_data(client, W83781D_REG_BANK, 0);
1426 w83781d_write_value(struct i2c_client *client, u16 reg, u16 value)
1428 struct w83781d_data *data = i2c_get_clientdata(client);
1429 int word_sized, bank;
1430 struct i2c_client *cl;
1433 if (i2c_is_isa_client(client)) {
1434 word_sized = (((reg & 0xff00) == 0x100)
1435 || ((reg & 0xff00) == 0x200))
1436 && (((reg & 0x00ff) == 0x53)
1437 || ((reg & 0x00ff) == 0x55));
1439 outb_p(W83781D_REG_BANK,
1440 client->addr + W83781D_ADDR_REG_OFFSET);
1442 client->addr + W83781D_DATA_REG_OFFSET);
1444 outb_p(reg & 0xff, client->addr + W83781D_ADDR_REG_OFFSET);
1447 client->addr + W83781D_DATA_REG_OFFSET);
1448 outb_p((reg & 0xff) + 1,
1449 client->addr + W83781D_ADDR_REG_OFFSET);
1451 outb_p(value & 0xff, client->addr + W83781D_DATA_REG_OFFSET);
1453 outb_p(W83781D_REG_BANK,
1454 client->addr + W83781D_ADDR_REG_OFFSET);
1455 outb_p(0, client->addr + W83781D_DATA_REG_OFFSET);
1458 bank = (reg >> 8) & 0x0f;
1461 i2c_smbus_write_byte_data(client, W83781D_REG_BANK,
1463 if (bank == 0 || bank > 2) {
1464 i2c_smbus_write_byte_data(client, reg & 0xff,
1467 /* switch to subclient */
1468 cl = data->lm75[bank - 1];
1469 /* convert from ISA to LM75 I2C addresses */
1470 switch (reg & 0xff) {
1471 case 0x52: /* CONFIG */
1472 i2c_smbus_write_byte_data(cl, 1, value & 0xff);
1474 case 0x53: /* HYST */
1475 i2c_smbus_write_word_data(cl, 2, swab16(value));
1477 case 0x55: /* OVER */
1478 i2c_smbus_write_word_data(cl, 3, swab16(value));
1483 i2c_smbus_write_byte_data(client, W83781D_REG_BANK, 0);
1489 /* Called when we have found a new W83781D. It should set limits, etc. */
1491 w83781d_init_client(struct i2c_client *client)
1493 struct w83781d_data *data = i2c_get_clientdata(client);
1495 int type = data->type;
1498 if (init && type != as99127f) { /* this resets registers we don't have
1499 documentation for on the as99127f */
1500 /* save these registers */
1501 i = w83781d_read_value(client, W83781D_REG_BEEP_CONFIG);
1502 p = w83781d_read_value(client, W83781D_REG_PWMCLK12);
1503 /* Reset all except Watchdog values and last conversion values
1504 This sets fan-divs to 2, among others */
1505 w83781d_write_value(client, W83781D_REG_CONFIG, 0x80);
1506 /* Restore the registers and disable power-on abnormal beep.
1507 This saves FAN 1/2/3 input/output values set by BIOS. */
1508 w83781d_write_value(client, W83781D_REG_BEEP_CONFIG, i | 0x80);
1509 w83781d_write_value(client, W83781D_REG_PWMCLK12, p);
1510 /* Disable master beep-enable (reset turns it on).
1511 Individual beep_mask should be reset to off but for some reason
1512 disabling this bit helps some people not get beeped */
1513 w83781d_write_value(client, W83781D_REG_BEEP_INTS2, 0);
1516 if (type != w83697hf) {
1517 vid = w83781d_read_value(client, W83781D_REG_VID_FANDIV) & 0x0f;
1519 (w83781d_read_value(client, W83781D_REG_CHIPID) & 0x01) <<
1521 data->vrm = DEFAULT_VRM;
1522 vid = vid_from_reg(vid, data->vrm);
1525 if ((type != w83781d) && (type != as99127f)) {
1526 tmp = w83781d_read_value(client, W83781D_REG_SCFG1);
1527 for (i = 1; i <= 3; i++) {
1528 if (!(tmp & BIT_SCFG1[i - 1])) {
1529 data->sens[i - 1] = W83781D_DEFAULT_BETA;
1531 if (w83781d_read_value
1533 W83781D_REG_SCFG2) & BIT_SCFG2[i - 1])
1534 data->sens[i - 1] = 1;
1536 data->sens[i - 1] = 2;
1538 if ((type == w83783s || type == w83697hf) && (i == 2))
1544 Fill up the RT Tables.
1545 We assume that they are 32 bytes long, in order for temp 1-3.
1546 Data sheet documentation is sparse.
1547 We also assume that it is only for the 781D although I suspect
1548 that the others support it as well....
1551 if (init && type == w83781d) {
1554 Auto-indexing doesn't seem to work...
1555 w83781d_write_value(client,W83781D_REG_RT_IDX,0);
1557 for (i = 0; i < 3; i++) {
1559 for (j = 0; j < 32; j++) {
1560 w83781d_write_value(client,
1561 W83781D_REG_RT_IDX, k++);
1563 w83781d_read_value(client,
1564 W83781D_REG_RT_VAL);
1568 #endif /* W83781D_RT */
1571 if (type != w83783s && type != w83697hf) {
1572 w83781d_write_value(client, W83781D_REG_TEMP3_CONFIG,
1575 if (type != w83781d) {
1576 /* enable comparator mode for temp2 and temp3 so
1577 alarm indication will work correctly */
1578 i = w83781d_read_value(client, W83781D_REG_IRQ);
1580 w83781d_write_value(client, W83781D_REG_IRQ,
1585 /* Start monitoring */
1586 w83781d_write_value(client, W83781D_REG_CONFIG,
1587 (w83781d_read_value(client,
1588 W83781D_REG_CONFIG) & 0xf7)
1592 static struct w83781d_data *w83781d_update_device(struct device *dev)
1594 struct i2c_client *client = to_i2c_client(dev);
1595 struct w83781d_data *data = i2c_get_clientdata(client);
1598 down(&data->update_lock);
1601 (jiffies - data->last_updated, (unsigned long) (HZ + HZ / 2))
1602 || time_before(jiffies, data->last_updated) || !data->valid) {
1603 pr_debug("Starting device update\n");
1605 for (i = 0; i <= 8; i++) {
1606 if ((data->type == w83783s || data->type == w83697hf)
1608 continue; /* 783S has no in1 */
1610 w83781d_read_value(client, W83781D_REG_IN(i));
1612 w83781d_read_value(client, W83781D_REG_IN_MIN(i));
1614 w83781d_read_value(client, W83781D_REG_IN_MAX(i));
1615 if ((data->type != w83782d) && (data->type != w83697hf)
1616 && (data->type != w83627hf) && (i == 6))
1619 for (i = 1; i <= 3; i++) {
1621 w83781d_read_value(client, W83781D_REG_FAN(i));
1622 data->fan_min[i - 1] =
1623 w83781d_read_value(client, W83781D_REG_FAN_MIN(i));
1625 if (data->type != w83781d && data->type != as99127f) {
1626 for (i = 1; i <= 4; i++) {
1628 w83781d_read_value(client,
1629 W83781D_REG_PWM(i));
1630 if ((data->type != w83782d
1631 || i2c_is_isa_client(client))
1635 /* Only PWM2 can be disabled */
1636 data->pwmenable[1] = (w83781d_read_value(client,
1637 W83781D_REG_PWMCLK12) & 0x08) >> 3;
1640 data->temp = w83781d_read_value(client, W83781D_REG_TEMP(1));
1642 w83781d_read_value(client, W83781D_REG_TEMP_OVER(1));
1643 data->temp_max_hyst =
1644 w83781d_read_value(client, W83781D_REG_TEMP_HYST(1));
1646 w83781d_read_value(client, W83781D_REG_TEMP(2));
1647 data->temp_max_add[0] =
1648 w83781d_read_value(client, W83781D_REG_TEMP_OVER(2));
1649 data->temp_max_hyst_add[0] =
1650 w83781d_read_value(client, W83781D_REG_TEMP_HYST(2));
1651 if (data->type != w83783s && data->type != w83697hf) {
1653 w83781d_read_value(client, W83781D_REG_TEMP(3));
1654 data->temp_max_add[1] =
1655 w83781d_read_value(client,
1656 W83781D_REG_TEMP_OVER(3));
1657 data->temp_max_hyst_add[1] =
1658 w83781d_read_value(client,
1659 W83781D_REG_TEMP_HYST(3));
1661 i = w83781d_read_value(client, W83781D_REG_VID_FANDIV);
1662 if (data->type != w83697hf) {
1663 data->vid = i & 0x0f;
1665 (w83781d_read_value(client, W83781D_REG_CHIPID) &
1669 data->fan_div[0] = (i >> 4) & 0x03;
1670 data->fan_div[1] = (i >> 6) & 0x03;
1671 if (data->type != w83697hf) {
1672 data->fan_div[2] = (w83781d_read_value(client,
1676 if ((data->type != w83781d) && (data->type != as99127f)) {
1677 i = w83781d_read_value(client, W83781D_REG_VBAT);
1678 data->fan_div[0] |= (i >> 3) & 0x04;
1679 data->fan_div[1] |= (i >> 4) & 0x04;
1680 if (data->type != w83697hf)
1681 data->fan_div[2] |= (i >> 5) & 0x04;
1684 w83781d_read_value(client,
1685 W83781D_REG_ALARM1) +
1686 (w83781d_read_value(client, W83781D_REG_ALARM2) << 8);
1687 if ((data->type == w83782d) || (data->type == w83627hf)) {
1689 w83781d_read_value(client,
1690 W83781D_REG_ALARM3) << 16;
1692 i = w83781d_read_value(client, W83781D_REG_BEEP_INTS2);
1693 data->beep_enable = i >> 7;
1694 data->beep_mask = ((i & 0x7f) << 8) +
1695 w83781d_read_value(client, W83781D_REG_BEEP_INTS1);
1696 if ((data->type != w83781d) && (data->type != as99127f)) {
1698 w83781d_read_value(client,
1699 W83781D_REG_BEEP_INTS3) << 16;
1701 data->last_updated = jiffies;
1705 up(&data->update_lock);
1711 sensors_w83781d_init(void)
1713 return i2c_add_driver(&w83781d_driver);
1717 sensors_w83781d_exit(void)
1719 i2c_del_driver(&w83781d_driver);
1722 MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>, "
1723 "Philip Edelbrock <phil@netroedge.com>, "
1724 "and Mark Studebaker <mdsxyz123@yahoo.com>");
1725 MODULE_DESCRIPTION("W83781D driver");
1726 MODULE_LICENSE("GPL");
1728 module_init(sensors_w83781d_init);
1729 module_exit(sensors_w83781d_exit);