2 w83792d.c - Part of lm_sensors, Linux kernel modules for hardware
4 Copyright (C) 2004, 2005 Winbond Electronics Corp.
5 Chunhao Huang <DZShen@Winbond.com.tw>,
6 Rudolf Marek <r.marek@sh.cvut.cz>
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.
23 1. This driver is only for 2.6 kernel, 2.4 kernel need a different driver.
24 2. This driver is only for Winbond W83792D C version device, there
25 are also some motherboards with B version W83792D device. The
26 calculation method to in6-in7(measured value, limits) is a little
27 different between C and B version. C or B version can be identified
32 Supports following chips:
34 Chip #vin #fanin #pwm #temp wchipid vendid i2c ISA
35 w83792d 9 7 7 3 0x7a 0x5ca3 yes no
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/hwmon.h>
44 #include <linux/hwmon-sysfs.h>
45 #include <linux/err.h>
47 /* Addresses to scan */
48 static unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f, I2C_CLIENT_END };
50 /* Insmod parameters */
51 I2C_CLIENT_INSMOD_1(w83792d);
52 I2C_CLIENT_MODULE_PARM(force_subclients, "List of subclient addresses: "
53 "{bus, clientaddr, subclientaddr1, subclientaddr2}");
56 module_param(init, bool, 0);
57 MODULE_PARM_DESC(init, "Set to one to force chip initialization");
59 /* The W83792D registers */
60 static const u8 W83792D_REG_IN[9] = {
61 0x20, /* Vcore A in DataSheet */
62 0x21, /* Vcore B in DataSheet */
63 0x22, /* VIN0 in DataSheet */
64 0x23, /* VIN1 in DataSheet */
65 0x24, /* VIN2 in DataSheet */
66 0x25, /* VIN3 in DataSheet */
67 0x26, /* 5VCC in DataSheet */
68 0xB0, /* 5VSB in DataSheet */
69 0xB1 /* VBAT in DataSheet */
71 #define W83792D_REG_LOW_BITS1 0x3E /* Low Bits I in DataSheet */
72 #define W83792D_REG_LOW_BITS2 0x3F /* Low Bits II in DataSheet */
73 static const u8 W83792D_REG_IN_MAX[9] = {
74 0x2B, /* Vcore A High Limit in DataSheet */
75 0x2D, /* Vcore B High Limit in DataSheet */
76 0x2F, /* VIN0 High Limit in DataSheet */
77 0x31, /* VIN1 High Limit in DataSheet */
78 0x33, /* VIN2 High Limit in DataSheet */
79 0x35, /* VIN3 High Limit in DataSheet */
80 0x37, /* 5VCC High Limit in DataSheet */
81 0xB4, /* 5VSB High Limit in DataSheet */
82 0xB6 /* VBAT High Limit in DataSheet */
84 static const u8 W83792D_REG_IN_MIN[9] = {
85 0x2C, /* Vcore A Low Limit in DataSheet */
86 0x2E, /* Vcore B Low Limit in DataSheet */
87 0x30, /* VIN0 Low Limit in DataSheet */
88 0x32, /* VIN1 Low Limit in DataSheet */
89 0x34, /* VIN2 Low Limit in DataSheet */
90 0x36, /* VIN3 Low Limit in DataSheet */
91 0x38, /* 5VCC Low Limit in DataSheet */
92 0xB5, /* 5VSB Low Limit in DataSheet */
93 0xB7 /* VBAT Low Limit in DataSheet */
95 static const u8 W83792D_REG_FAN[7] = {
96 0x28, /* FAN 1 Count in DataSheet */
97 0x29, /* FAN 2 Count in DataSheet */
98 0x2A, /* FAN 3 Count in DataSheet */
99 0xB8, /* FAN 4 Count in DataSheet */
100 0xB9, /* FAN 5 Count in DataSheet */
101 0xBA, /* FAN 6 Count in DataSheet */
102 0xBE /* FAN 7 Count in DataSheet */
104 static const u8 W83792D_REG_FAN_MIN[7] = {
105 0x3B, /* FAN 1 Count Low Limit in DataSheet */
106 0x3C, /* FAN 2 Count Low Limit in DataSheet */
107 0x3D, /* FAN 3 Count Low Limit in DataSheet */
108 0xBB, /* FAN 4 Count Low Limit in DataSheet */
109 0xBC, /* FAN 5 Count Low Limit in DataSheet */
110 0xBD, /* FAN 6 Count Low Limit in DataSheet */
111 0xBF /* FAN 7 Count Low Limit in DataSheet */
113 #define W83792D_REG_FAN_CFG 0x84 /* FAN Configuration in DataSheet */
114 static const u8 W83792D_REG_FAN_DIV[4] = {
115 0x47, /* contains FAN2 and FAN1 Divisor */
116 0x5B, /* contains FAN4 and FAN3 Divisor */
117 0x5C, /* contains FAN6 and FAN5 Divisor */
118 0x9E /* contains FAN7 Divisor. */
120 static const u8 W83792D_REG_PWM[7] = {
121 0x81, /* FAN 1 Duty Cycle, be used to control */
122 0x83, /* FAN 2 Duty Cycle, be used to control */
123 0x94, /* FAN 3 Duty Cycle, be used to control */
124 0xA3, /* FAN 4 Duty Cycle, be used to control */
125 0xA4, /* FAN 5 Duty Cycle, be used to control */
126 0xA5, /* FAN 6 Duty Cycle, be used to control */
127 0xA6 /* FAN 7 Duty Cycle, be used to control */
129 #define W83792D_REG_BANK 0x4E
130 #define W83792D_REG_TEMP2_CONFIG 0xC2
131 #define W83792D_REG_TEMP3_CONFIG 0xCA
133 static const u8 W83792D_REG_TEMP1[3] = {
134 0x27, /* TEMP 1 in DataSheet */
135 0x39, /* TEMP 1 Over in DataSheet */
136 0x3A, /* TEMP 1 Hyst in DataSheet */
139 static const u8 W83792D_REG_TEMP_ADD[2][6] = {
140 { 0xC0, /* TEMP 2 in DataSheet */
141 0xC1, /* TEMP 2(0.5 deg) in DataSheet */
142 0xC5, /* TEMP 2 Over High part in DataSheet */
143 0xC6, /* TEMP 2 Over Low part in DataSheet */
144 0xC3, /* TEMP 2 Thyst High part in DataSheet */
145 0xC4 }, /* TEMP 2 Thyst Low part in DataSheet */
146 { 0xC8, /* TEMP 3 in DataSheet */
147 0xC9, /* TEMP 3(0.5 deg) in DataSheet */
148 0xCD, /* TEMP 3 Over High part in DataSheet */
149 0xCE, /* TEMP 3 Over Low part in DataSheet */
150 0xCB, /* TEMP 3 Thyst High part in DataSheet */
151 0xCC } /* TEMP 3 Thyst Low part in DataSheet */
154 static const u8 W83792D_REG_THERMAL[3] = {
155 0x85, /* SmartFanI: Fan1 target value */
156 0x86, /* SmartFanI: Fan2 target value */
157 0x96 /* SmartFanI: Fan3 target value */
160 static const u8 W83792D_REG_TOLERANCE[3] = {
161 0x87, /* (bit3-0)SmartFan Fan1 tolerance */
162 0x87, /* (bit7-4)SmartFan Fan2 tolerance */
163 0x97 /* (bit3-0)SmartFan Fan3 tolerance */
166 static const u8 W83792D_REG_POINTS[3][4] = {
167 { 0x85, /* SmartFanII: Fan1 temp point 1 */
168 0xE3, /* SmartFanII: Fan1 temp point 2 */
169 0xE4, /* SmartFanII: Fan1 temp point 3 */
170 0xE5 }, /* SmartFanII: Fan1 temp point 4 */
171 { 0x86, /* SmartFanII: Fan2 temp point 1 */
172 0xE6, /* SmartFanII: Fan2 temp point 2 */
173 0xE7, /* SmartFanII: Fan2 temp point 3 */
174 0xE8 }, /* SmartFanII: Fan2 temp point 4 */
175 { 0x96, /* SmartFanII: Fan3 temp point 1 */
176 0xE9, /* SmartFanII: Fan3 temp point 2 */
177 0xEA, /* SmartFanII: Fan3 temp point 3 */
178 0xEB } /* SmartFanII: Fan3 temp point 4 */
181 static const u8 W83792D_REG_LEVELS[3][4] = {
182 { 0x88, /* (bit3-0) SmartFanII: Fan1 Non-Stop */
183 0x88, /* (bit7-4) SmartFanII: Fan1 Level 1 */
184 0xE0, /* (bit7-4) SmartFanII: Fan1 Level 2 */
185 0xE0 }, /* (bit3-0) SmartFanII: Fan1 Level 3 */
186 { 0x89, /* (bit3-0) SmartFanII: Fan2 Non-Stop */
187 0x89, /* (bit7-4) SmartFanII: Fan2 Level 1 */
188 0xE1, /* (bit7-4) SmartFanII: Fan2 Level 2 */
189 0xE1 }, /* (bit3-0) SmartFanII: Fan2 Level 3 */
190 { 0x98, /* (bit3-0) SmartFanII: Fan3 Non-Stop */
191 0x98, /* (bit7-4) SmartFanII: Fan3 Level 1 */
192 0xE2, /* (bit7-4) SmartFanII: Fan3 Level 2 */
193 0xE2 } /* (bit3-0) SmartFanII: Fan3 Level 3 */
196 #define W83792D_REG_CONFIG 0x40
197 #define W83792D_REG_VID_FANDIV 0x47
198 #define W83792D_REG_CHIPID 0x49
199 #define W83792D_REG_WCHIPID 0x58
200 #define W83792D_REG_CHIPMAN 0x4F
201 #define W83792D_REG_PIN 0x4B
202 #define W83792D_REG_I2C_SUBADDR 0x4A
204 #define W83792D_REG_ALARM1 0xA9 /* realtime status register1 */
205 #define W83792D_REG_ALARM2 0xAA /* realtime status register2 */
206 #define W83792D_REG_ALARM3 0xAB /* realtime status register3 */
207 #define W83792D_REG_CHASSIS 0x42 /* Bit 5: Case Open status bit */
208 #define W83792D_REG_CHASSIS_CLR 0x44 /* Bit 7: Case Open CLR_CHS/Reset bit */
210 /* control in0/in1 's limit modifiability */
211 #define W83792D_REG_VID_IN_B 0x17
213 #define W83792D_REG_VBAT 0x5D
214 #define W83792D_REG_I2C_ADDR 0x48
216 /* Conversions. Rounding and limit checking is only done on the TO_REG
217 variants. Note that you should be a bit careful with which arguments
218 these macros are called: arguments may be evaluated more than once.
219 Fixing this is just not worth it. */
220 #define IN_FROM_REG(nr,val) (((nr)<=1)?(val*2): \
221 ((((nr)==6)||((nr)==7))?(val*6):(val*4)))
222 #define IN_TO_REG(nr,val) (((nr)<=1)?(val/2): \
223 ((((nr)==6)||((nr)==7))?(val/6):(val/4)))
226 FAN_TO_REG(long rpm, int div)
230 rpm = SENSORS_LIMIT(rpm, 1, 1000000);
231 return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
234 #define FAN_FROM_REG(val,div) ((val) == 0 ? -1 : \
235 ((val) == 255 ? 0 : \
236 1350000 / ((val) * (div))))
239 #define TEMP1_TO_REG(val) (SENSORS_LIMIT(((val) < 0 ? (val)+0x100*1000 \
240 : (val)) / 1000, 0, 0xff))
241 #define TEMP1_FROM_REG(val) (((val) & 0x80 ? (val)-0x100 : (val)) * 1000)
242 /* for temp2 and temp3, because they need addtional resolution */
243 #define TEMP_ADD_FROM_REG(val1, val2) \
244 ((((val1) & 0x80 ? (val1)-0x100 \
245 : (val1)) * 1000) + ((val2 & 0x80) ? 500 : 0))
246 #define TEMP_ADD_TO_REG_HIGH(val) \
247 (SENSORS_LIMIT(((val) < 0 ? (val)+0x100*1000 \
248 : (val)) / 1000, 0, 0xff))
249 #define TEMP_ADD_TO_REG_LOW(val) ((val%1000) ? 0x80 : 0x00)
251 #define PWM_FROM_REG(val) (val)
252 #define PWM_TO_REG(val) (SENSORS_LIMIT((val),0,255))
253 #define DIV_FROM_REG(val) (1 << (val))
259 val = SENSORS_LIMIT(val, 1, 128) >> 1;
260 for (i = 0; i < 6; i++) {
268 struct w83792d_data {
269 struct i2c_client client;
270 struct class_device *class_dev;
271 struct semaphore lock;
274 struct semaphore update_lock;
275 char valid; /* !=0 if following fields are valid */
276 unsigned long last_updated; /* In jiffies */
278 /* array of 2 pointers to subclients */
279 struct i2c_client *lm75[2];
281 u8 in[9]; /* Register value */
282 u8 in_max[9]; /* Register value */
283 u8 in_min[9]; /* Register value */
284 u8 low_bits[2]; /* Additional resolution to voltage in0-6 */
285 u8 fan[7]; /* Register value */
286 u8 fan_min[7]; /* Register value */
287 u8 temp1[3]; /* current, over, thyst */
288 u8 temp_add[2][6]; /* Register value */
289 u8 fan_div[7]; /* Register encoding, shifted right */
290 u8 pwm[7]; /* We only consider the first 3 set of pwm,
291 although 792 chip has 7 set of pwm. */
293 u8 pwm_mode[7]; /* indicates PWM or DC mode: 1->PWM; 0->DC */
294 u32 alarms; /* realtime status register encoding,combined */
295 u8 chassis; /* Chassis status */
296 u8 chassis_clear; /* CLR_CHS, clear chassis intrusion detection */
297 u8 thermal_cruise[3]; /* Smart FanI: Fan1,2,3 target value */
298 u8 tolerance[3]; /* Fan1,2,3 tolerance(Smart Fan I/II) */
299 u8 sf2_points[3][4]; /* Smart FanII: Fan1,2,3 temperature points */
300 u8 sf2_levels[3][4]; /* Smart FanII: Fan1,2,3 duty cycle levels */
303 static int w83792d_attach_adapter(struct i2c_adapter *adapter);
304 static int w83792d_detect(struct i2c_adapter *adapter, int address, int kind);
305 static int w83792d_detach_client(struct i2c_client *client);
307 static int w83792d_read_value(struct i2c_client *client, u8 register);
308 static int w83792d_write_value(struct i2c_client *client, u8 register,
310 static struct w83792d_data *w83792d_update_device(struct device *dev);
313 static void w83792d_print_debug(struct w83792d_data *data, struct device *dev);
316 static void w83792d_init_client(struct i2c_client *client);
318 static struct i2c_driver w83792d_driver = {
319 .owner = THIS_MODULE,
321 .flags = I2C_DF_NOTIFY,
322 .attach_adapter = w83792d_attach_adapter,
323 .detach_client = w83792d_detach_client,
326 static long in_count_from_reg(int nr, struct w83792d_data *data)
328 u16 vol_count = data->in[nr];
330 vol_count = (vol_count << 2);
334 low_bits = (data->low_bits[0]) & 0x03;
337 low_bits = ((data->low_bits[0]) & 0x0c) >> 2;
340 low_bits = ((data->low_bits[0]) & 0x30) >> 4;
343 low_bits = ((data->low_bits[0]) & 0xc0) >> 6;
346 low_bits = (data->low_bits[1]) & 0x03;
349 low_bits = ((data->low_bits[1]) & 0x0c) >> 2;
352 low_bits = ((data->low_bits[1]) & 0x30) >> 4;
356 vol_count = vol_count | low_bits;
360 /* following are the sysfs callback functions */
361 static ssize_t show_in(struct device *dev, struct device_attribute *attr,
364 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
365 int nr = sensor_attr->index;
366 struct w83792d_data *data = w83792d_update_device(dev);
367 return sprintf(buf,"%ld\n", IN_FROM_REG(nr,(in_count_from_reg(nr, data))));
370 #define show_in_reg(reg) \
371 static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
374 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
375 int nr = sensor_attr->index; \
376 struct w83792d_data *data = w83792d_update_device(dev); \
377 return sprintf(buf,"%ld\n", (long)(IN_FROM_REG(nr, (data->reg[nr])*4))); \
383 #define store_in_reg(REG, reg) \
384 static ssize_t store_in_##reg (struct device *dev, \
385 struct device_attribute *attr, \
386 const char *buf, size_t count) \
388 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
389 int nr = sensor_attr->index; \
390 struct i2c_client *client = to_i2c_client(dev); \
391 struct w83792d_data *data = i2c_get_clientdata(client); \
394 val = simple_strtoul(buf, NULL, 10); \
395 data->in_##reg[nr] = SENSORS_LIMIT(IN_TO_REG(nr, val)/4, 0, 255); \
396 w83792d_write_value(client, W83792D_REG_IN_##REG[nr], data->in_##reg[nr]); \
400 store_in_reg(MIN, min);
401 store_in_reg(MAX, max);
403 #define sysfs_in_reg(offset) \
404 static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in, \
406 static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
407 show_in_min, store_in_min, offset); \
408 static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
409 show_in_max, store_in_max, offset);
421 #define device_create_file_in(client, offset) \
423 device_create_file(&client->dev, &sensor_dev_attr_in##offset##_input.dev_attr); \
424 device_create_file(&client->dev, &sensor_dev_attr_in##offset##_max.dev_attr); \
425 device_create_file(&client->dev, &sensor_dev_attr_in##offset##_min.dev_attr); \
428 #define show_fan_reg(reg) \
429 static ssize_t show_##reg (struct device *dev, struct device_attribute *attr, \
432 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
433 int nr = sensor_attr->index - 1; \
434 struct w83792d_data *data = w83792d_update_device(dev); \
435 return sprintf(buf,"%d\n", \
436 FAN_FROM_REG(data->reg[nr], DIV_FROM_REG(data->fan_div[nr]))); \
440 show_fan_reg(fan_min);
443 store_fan_min(struct device *dev, struct device_attribute *attr,
444 const char *buf, size_t count)
446 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
447 int nr = sensor_attr->index - 1;
448 struct i2c_client *client = to_i2c_client(dev);
449 struct w83792d_data *data = i2c_get_clientdata(client);
452 val = simple_strtoul(buf, NULL, 10);
453 data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
454 w83792d_write_value(client, W83792D_REG_FAN_MIN[nr],
461 show_fan_div(struct device *dev, struct device_attribute *attr,
464 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
465 int nr = sensor_attr->index;
466 struct w83792d_data *data = w83792d_update_device(dev);
467 return sprintf(buf, "%u\n", DIV_FROM_REG(data->fan_div[nr - 1]));
470 /* Note: we save and restore the fan minimum here, because its value is
471 determined in part by the fan divisor. This follows the principle of
472 least suprise; the user doesn't expect the fan minimum to change just
473 because the divisor changed. */
475 store_fan_div(struct device *dev, struct device_attribute *attr,
476 const char *buf, size_t count)
478 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
479 int nr = sensor_attr->index - 1;
480 struct i2c_client *client = to_i2c_client(dev);
481 struct w83792d_data *data = i2c_get_clientdata(client);
488 min = FAN_FROM_REG(data->fan_min[nr],
489 DIV_FROM_REG(data->fan_div[nr]));
491 data->fan_div[nr] = DIV_TO_REG(simple_strtoul(buf, NULL, 10));
493 fan_div_reg = w83792d_read_value(client, W83792D_REG_FAN_DIV[nr >> 1]);
494 fan_div_reg &= (nr & 0x01) ? 0x8f : 0xf8;
495 tmp_fan_div = (nr & 0x01) ? (((data->fan_div[nr]) << 4) & 0x70)
496 : ((data->fan_div[nr]) & 0x07);
497 w83792d_write_value(client, W83792D_REG_FAN_DIV[nr >> 1],
498 fan_div_reg | tmp_fan_div);
500 /* Restore fan_min */
501 data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
502 w83792d_write_value(client, W83792D_REG_FAN_MIN[nr], data->fan_min[nr]);
507 #define sysfs_fan(offset) \
508 static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan, NULL, \
510 static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
511 show_fan_div, store_fan_div, offset); \
512 static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
513 show_fan_min, store_fan_min, offset);
523 #define device_create_file_fan(client, offset) \
525 device_create_file(&client->dev, &sensor_dev_attr_fan##offset##_input.dev_attr); \
526 device_create_file(&client->dev, &sensor_dev_attr_fan##offset##_div.dev_attr); \
527 device_create_file(&client->dev, &sensor_dev_attr_fan##offset##_min.dev_attr); \
531 /* read/write the temperature1, includes measured value and limits */
533 static ssize_t show_temp1(struct device *dev, struct device_attribute *attr,
536 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
537 int nr = sensor_attr->index;
538 struct w83792d_data *data = w83792d_update_device(dev);
539 return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->temp1[nr]));
542 static ssize_t store_temp1(struct device *dev, struct device_attribute *attr,
543 const char *buf, size_t count)
545 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
546 int nr = sensor_attr->index;
547 struct i2c_client *client = to_i2c_client(dev);
548 struct w83792d_data *data = i2c_get_clientdata(client);
551 val = simple_strtol(buf, NULL, 10);
553 data->temp1[nr] = TEMP1_TO_REG(val);
554 w83792d_write_value(client, W83792D_REG_TEMP1[nr],
561 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp1, NULL, 0);
562 static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR, show_temp1,
564 static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR, show_temp1,
567 #define device_create_file_temp1(client) \
569 device_create_file(&client->dev, &sensor_dev_attr_temp1_input.dev_attr); \
570 device_create_file(&client->dev, &sensor_dev_attr_temp1_max.dev_attr); \
571 device_create_file(&client->dev, &sensor_dev_attr_temp1_max_hyst.dev_attr); \
575 /* read/write the temperature2-3, includes measured value and limits */
577 static ssize_t show_temp23(struct device *dev, struct device_attribute *attr,
580 struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
581 int nr = sensor_attr->nr;
582 int index = sensor_attr->index;
583 struct w83792d_data *data = w83792d_update_device(dev);
584 return sprintf(buf,"%ld\n",
585 (long)TEMP_ADD_FROM_REG(data->temp_add[nr][index],
586 data->temp_add[nr][index+1]));
589 static ssize_t store_temp23(struct device *dev, struct device_attribute *attr,
590 const char *buf, size_t count)
592 struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
593 int nr = sensor_attr->nr;
594 int index = sensor_attr->index;
595 struct i2c_client *client = to_i2c_client(dev);
596 struct w83792d_data *data = i2c_get_clientdata(client);
599 val = simple_strtol(buf, NULL, 10);
601 data->temp_add[nr][index] = TEMP_ADD_TO_REG_HIGH(val);
602 data->temp_add[nr][index+1] = TEMP_ADD_TO_REG_LOW(val);
603 w83792d_write_value(client, W83792D_REG_TEMP_ADD[nr][index],
604 data->temp_add[nr][index]);
605 w83792d_write_value(client, W83792D_REG_TEMP_ADD[nr][index+1],
606 data->temp_add[nr][index+1]);
611 #define sysfs_temp23(name,idx) \
612 static SENSOR_DEVICE_ATTR_2(name##_input, S_IRUGO, show_temp23, NULL, \
614 static SENSOR_DEVICE_ATTR_2(name##_max, S_IRUGO | S_IWUSR, \
615 show_temp23, store_temp23, idx, 2); \
616 static SENSOR_DEVICE_ATTR_2(name##_max_hyst, S_IRUGO | S_IWUSR, \
617 show_temp23, store_temp23, idx, 4);
619 sysfs_temp23(temp2,0)
620 sysfs_temp23(temp3,1)
622 #define device_create_file_temp_add(client, offset) \
624 device_create_file(&client->dev, &sensor_dev_attr_temp##offset##_input.dev_attr); \
625 device_create_file(&client->dev, &sensor_dev_attr_temp##offset##_max.dev_attr); \
626 device_create_file(&client->dev, \
627 &sensor_dev_attr_temp##offset##_max_hyst.dev_attr); \
631 /* get reatime status of all sensors items: voltage, temp, fan */
633 show_alarms_reg(struct device *dev, struct device_attribute *attr, char *buf)
635 struct w83792d_data *data = w83792d_update_device(dev);
636 return sprintf(buf, "%d\n", data->alarms);
640 DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
641 #define device_create_file_alarms(client) \
642 device_create_file(&client->dev, &dev_attr_alarms);
647 show_pwm(struct device *dev, struct device_attribute *attr,
650 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
651 int nr = sensor_attr->index;
652 struct w83792d_data *data = w83792d_update_device(dev);
653 return sprintf(buf, "%ld\n", (long) PWM_FROM_REG(data->pwm[nr-1]));
657 show_pwmenable(struct device *dev, struct device_attribute *attr,
660 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
661 int nr = sensor_attr->index - 1;
662 struct w83792d_data *data = w83792d_update_device(dev);
663 long pwm_enable_tmp = 1;
665 switch (data->pwmenable[nr]) {
667 pwm_enable_tmp = 1; /* manual mode */
670 pwm_enable_tmp = 3; /*thermal cruise/Smart Fan I */
673 pwm_enable_tmp = 2; /* Smart Fan II */
677 return sprintf(buf, "%ld\n", pwm_enable_tmp);
681 store_pwm(struct device *dev, struct device_attribute *attr,
682 const char *buf, size_t count)
684 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
685 int nr = sensor_attr->index - 1;
686 struct i2c_client *client = to_i2c_client(dev);
687 struct w83792d_data *data = i2c_get_clientdata(client);
690 val = simple_strtoul(buf, NULL, 10);
691 data->pwm[nr] = PWM_TO_REG(val);
692 w83792d_write_value(client, W83792D_REG_PWM[nr], data->pwm[nr]);
698 store_pwmenable(struct device *dev, struct device_attribute *attr,
699 const char *buf, size_t count)
701 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
702 int nr = sensor_attr->index - 1;
703 struct i2c_client *client = to_i2c_client(dev);
704 struct w83792d_data *data = i2c_get_clientdata(client);
706 u8 fan_cfg_tmp, cfg1_tmp, cfg2_tmp, cfg3_tmp, cfg4_tmp;
708 val = simple_strtoul(buf, NULL, 10);
711 data->pwmenable[nr] = 0; /* manual mode */
714 data->pwmenable[nr] = 2; /* Smart Fan II */
717 data->pwmenable[nr] = 1; /* thermal cruise/Smart Fan I */
722 cfg1_tmp = data->pwmenable[0];
723 cfg2_tmp = (data->pwmenable[1]) << 2;
724 cfg3_tmp = (data->pwmenable[2]) << 4;
725 cfg4_tmp = w83792d_read_value(client,W83792D_REG_FAN_CFG) & 0xc0;
726 fan_cfg_tmp = ((cfg4_tmp | cfg3_tmp) | cfg2_tmp) | cfg1_tmp;
727 w83792d_write_value(client, W83792D_REG_FAN_CFG, fan_cfg_tmp);
732 #define sysfs_pwm(offset) \
733 static SENSOR_DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \
734 show_pwm, store_pwm, offset); \
735 static SENSOR_DEVICE_ATTR(pwm##offset##_enable, S_IRUGO | S_IWUSR, \
736 show_pwmenable, store_pwmenable, offset); \
743 #define device_create_file_pwm(client, offset) \
745 device_create_file(&client->dev, &sensor_dev_attr_pwm##offset.dev_attr); \
748 #define device_create_file_pwmenable(client, offset) \
750 device_create_file(&client->dev, &sensor_dev_attr_pwm##offset##_enable.dev_attr); \
755 show_pwm_mode(struct device *dev, struct device_attribute *attr,
758 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
759 int nr = sensor_attr->index;
760 struct w83792d_data *data = w83792d_update_device(dev);
761 return sprintf(buf, "%d\n", data->pwm_mode[nr-1]);
765 store_pwm_mode(struct device *dev, struct device_attribute *attr,
766 const char *buf, size_t count)
768 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
769 int nr = sensor_attr->index - 1;
770 struct i2c_client *client = to_i2c_client(dev);
771 struct w83792d_data *data = i2c_get_clientdata(client);
773 u8 pwm_mode_mask = 0;
775 val = simple_strtoul(buf, NULL, 10);
776 data->pwm_mode[nr] = SENSORS_LIMIT(val, 0, 1);
777 pwm_mode_mask = w83792d_read_value(client,
778 W83792D_REG_PWM[nr]) & 0x7f;
779 w83792d_write_value(client, W83792D_REG_PWM[nr],
780 ((data->pwm_mode[nr]) << 7) | pwm_mode_mask);
785 #define sysfs_pwm_mode(offset) \
786 static SENSOR_DEVICE_ATTR(pwm##offset##_mode, S_IRUGO | S_IWUSR, \
787 show_pwm_mode, store_pwm_mode, offset);
793 #define device_create_file_pwm_mode(client, offset) \
795 device_create_file(&client->dev, &sensor_dev_attr_pwm##offset##_mode.dev_attr); \
800 show_regs_chassis(struct device *dev, struct device_attribute *attr,
803 struct w83792d_data *data = w83792d_update_device(dev);
804 return sprintf(buf, "%d\n", data->chassis);
807 static DEVICE_ATTR(chassis, S_IRUGO, show_regs_chassis, NULL);
809 #define device_create_file_chassis(client) \
811 device_create_file(&client->dev, &dev_attr_chassis); \
816 show_chassis_clear(struct device *dev, struct device_attribute *attr, char *buf)
818 struct w83792d_data *data = w83792d_update_device(dev);
819 return sprintf(buf, "%d\n", data->chassis_clear);
823 store_chassis_clear(struct device *dev, struct device_attribute *attr,
824 const char *buf, size_t count)
826 struct i2c_client *client = to_i2c_client(dev);
827 struct w83792d_data *data = i2c_get_clientdata(client);
829 u8 temp1 = 0, temp2 = 0;
831 val = simple_strtoul(buf, NULL, 10);
833 data->chassis_clear = SENSORS_LIMIT(val, 0 ,1);
834 temp1 = ((data->chassis_clear) << 7) & 0x80;
835 temp2 = w83792d_read_value(client,
836 W83792D_REG_CHASSIS_CLR) & 0x7f;
837 w83792d_write_value(client, W83792D_REG_CHASSIS_CLR, temp1 | temp2);
842 static DEVICE_ATTR(chassis_clear, S_IRUGO | S_IWUSR,
843 show_chassis_clear, store_chassis_clear);
845 #define device_create_file_chassis_clear(client) \
847 device_create_file(&client->dev, &dev_attr_chassis_clear); \
852 /* For Smart Fan I / Thermal Cruise */
854 show_thermal_cruise(struct device *dev, struct device_attribute *attr,
857 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
858 int nr = sensor_attr->index;
859 struct w83792d_data *data = w83792d_update_device(dev);
860 return sprintf(buf, "%ld\n", (long)data->thermal_cruise[nr-1]);
864 store_thermal_cruise(struct device *dev, struct device_attribute *attr,
865 const char *buf, size_t count)
867 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
868 int nr = sensor_attr->index - 1;
869 struct i2c_client *client = to_i2c_client(dev);
870 struct w83792d_data *data = i2c_get_clientdata(client);
872 u8 target_tmp=0, target_mask=0;
874 val = simple_strtoul(buf, NULL, 10);
876 target_tmp = target_tmp & 0x7f;
877 target_mask = w83792d_read_value(client, W83792D_REG_THERMAL[nr]) & 0x80;
878 data->thermal_cruise[nr] = SENSORS_LIMIT(target_tmp, 0, 255);
879 w83792d_write_value(client, W83792D_REG_THERMAL[nr],
880 (data->thermal_cruise[nr]) | target_mask);
885 #define sysfs_thermal_cruise(offset) \
886 static SENSOR_DEVICE_ATTR(thermal_cruise##offset, S_IRUGO | S_IWUSR, \
887 show_thermal_cruise, store_thermal_cruise, offset);
889 sysfs_thermal_cruise(1);
890 sysfs_thermal_cruise(2);
891 sysfs_thermal_cruise(3);
893 #define device_create_file_thermal_cruise(client, offset) \
895 device_create_file(&client->dev, \
896 &sensor_dev_attr_thermal_cruise##offset.dev_attr); \
900 /* For Smart Fan I/Thermal Cruise and Smart Fan II */
902 show_tolerance(struct device *dev, struct device_attribute *attr,
905 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
906 int nr = sensor_attr->index;
907 struct w83792d_data *data = w83792d_update_device(dev);
908 return sprintf(buf, "%ld\n", (long)data->tolerance[nr-1]);
912 store_tolerance(struct device *dev, struct device_attribute *attr,
913 const char *buf, size_t count)
915 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
916 int nr = sensor_attr->index - 1;
917 struct i2c_client *client = to_i2c_client(dev);
918 struct w83792d_data *data = i2c_get_clientdata(client);
920 u8 tol_tmp, tol_mask;
922 val = simple_strtoul(buf, NULL, 10);
923 tol_mask = w83792d_read_value(client,
924 W83792D_REG_TOLERANCE[nr]) & ((nr == 1) ? 0x0f : 0xf0);
925 tol_tmp = SENSORS_LIMIT(val, 0, 15);
927 data->tolerance[nr] = tol_tmp;
931 w83792d_write_value(client, W83792D_REG_TOLERANCE[nr],
937 #define sysfs_tolerance(offset) \
938 static SENSOR_DEVICE_ATTR(tolerance##offset, S_IRUGO | S_IWUSR, \
939 show_tolerance, store_tolerance, offset);
945 #define device_create_file_tolerance(client, offset) \
947 device_create_file(&client->dev, &sensor_dev_attr_tolerance##offset.dev_attr); \
951 /* For Smart Fan II */
953 show_sf2_point(struct device *dev, struct device_attribute *attr,
956 struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
957 int nr = sensor_attr->nr;
958 int index = sensor_attr->index;
959 struct w83792d_data *data = w83792d_update_device(dev);
960 return sprintf(buf, "%ld\n", (long)data->sf2_points[index-1][nr-1]);
964 store_sf2_point(struct device *dev, struct device_attribute *attr,
965 const char *buf, size_t count)
967 struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
968 int nr = sensor_attr->nr - 1;
969 int index = sensor_attr->index - 1;
970 struct i2c_client *client = to_i2c_client(dev);
971 struct w83792d_data *data = i2c_get_clientdata(client);
975 val = simple_strtoul(buf, NULL, 10);
976 data->sf2_points[index][nr] = SENSORS_LIMIT(val, 0, 127);
977 mask_tmp = w83792d_read_value(client,
978 W83792D_REG_POINTS[index][nr]) & 0x80;
979 w83792d_write_value(client, W83792D_REG_POINTS[index][nr],
980 mask_tmp|data->sf2_points[index][nr]);
985 #define sysfs_sf2_point(offset, index) \
986 static SENSOR_DEVICE_ATTR_2(sf2_point##offset##_fan##index, S_IRUGO | S_IWUSR, \
987 show_sf2_point, store_sf2_point, offset, index);
989 sysfs_sf2_point(1, 1); /* Fan1 */
990 sysfs_sf2_point(2, 1); /* Fan1 */
991 sysfs_sf2_point(3, 1); /* Fan1 */
992 sysfs_sf2_point(4, 1); /* Fan1 */
993 sysfs_sf2_point(1, 2); /* Fan2 */
994 sysfs_sf2_point(2, 2); /* Fan2 */
995 sysfs_sf2_point(3, 2); /* Fan2 */
996 sysfs_sf2_point(4, 2); /* Fan2 */
997 sysfs_sf2_point(1, 3); /* Fan3 */
998 sysfs_sf2_point(2, 3); /* Fan3 */
999 sysfs_sf2_point(3, 3); /* Fan3 */
1000 sysfs_sf2_point(4, 3); /* Fan3 */
1002 #define device_create_file_sf2_point(client, offset, index) \
1004 device_create_file(&client->dev, \
1005 &sensor_dev_attr_sf2_point##offset##_fan##index.dev_attr); \
1010 show_sf2_level(struct device *dev, struct device_attribute *attr,
1013 struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
1014 int nr = sensor_attr->nr;
1015 int index = sensor_attr->index;
1016 struct w83792d_data *data = w83792d_update_device(dev);
1017 return sprintf(buf, "%d\n",
1018 (((data->sf2_levels[index-1][nr]) * 100) / 15));
1022 store_sf2_level(struct device *dev, struct device_attribute *attr,
1023 const char *buf, size_t count)
1025 struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
1026 int nr = sensor_attr->nr;
1027 int index = sensor_attr->index - 1;
1028 struct i2c_client *client = to_i2c_client(dev);
1029 struct w83792d_data *data = i2c_get_clientdata(client);
1031 u8 mask_tmp=0, level_tmp=0;
1033 val = simple_strtoul(buf, NULL, 10);
1034 data->sf2_levels[index][nr] = SENSORS_LIMIT((val * 15) / 100, 0, 15);
1035 mask_tmp = w83792d_read_value(client, W83792D_REG_LEVELS[index][nr])
1036 & ((nr==3) ? 0xf0 : 0x0f);
1038 level_tmp = data->sf2_levels[index][nr];
1040 level_tmp = data->sf2_levels[index][nr] << 4;
1042 w83792d_write_value(client, W83792D_REG_LEVELS[index][nr], level_tmp | mask_tmp);
1047 #define sysfs_sf2_level(offset, index) \
1048 static SENSOR_DEVICE_ATTR_2(sf2_level##offset##_fan##index, S_IRUGO | S_IWUSR, \
1049 show_sf2_level, store_sf2_level, offset, index);
1051 sysfs_sf2_level(1, 1); /* Fan1 */
1052 sysfs_sf2_level(2, 1); /* Fan1 */
1053 sysfs_sf2_level(3, 1); /* Fan1 */
1054 sysfs_sf2_level(1, 2); /* Fan2 */
1055 sysfs_sf2_level(2, 2); /* Fan2 */
1056 sysfs_sf2_level(3, 2); /* Fan2 */
1057 sysfs_sf2_level(1, 3); /* Fan3 */
1058 sysfs_sf2_level(2, 3); /* Fan3 */
1059 sysfs_sf2_level(3, 3); /* Fan3 */
1061 #define device_create_file_sf2_level(client, offset, index) \
1063 device_create_file(&client->dev, \
1064 &sensor_dev_attr_sf2_level##offset##_fan##index.dev_attr); \
1068 /* This function is called when:
1069 * w83792d_driver is inserted (when this module is loaded), for each
1071 * when a new adapter is inserted (and w83792d_driver is still present) */
1073 w83792d_attach_adapter(struct i2c_adapter *adapter)
1075 if (!(adapter->class & I2C_CLASS_HWMON))
1077 return i2c_probe(adapter, &addr_data, w83792d_detect);
1082 w83792d_create_subclient(struct i2c_adapter *adapter,
1083 struct i2c_client *new_client, int addr,
1084 struct i2c_client **sub_cli)
1087 struct i2c_client *sub_client;
1089 (*sub_cli) = sub_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
1090 if (!(sub_client)) {
1093 sub_client->addr = 0x48 + addr;
1094 i2c_set_clientdata(sub_client, NULL);
1095 sub_client->adapter = adapter;
1096 sub_client->driver = &w83792d_driver;
1097 sub_client->flags = 0;
1098 strlcpy(sub_client->name, "w83792d subclient", I2C_NAME_SIZE);
1099 if ((err = i2c_attach_client(sub_client))) {
1100 dev_err(&new_client->dev, "subclient registration "
1101 "at address 0x%x failed\n", sub_client->addr);
1110 w83792d_detect_subclients(struct i2c_adapter *adapter, int address, int kind,
1111 struct i2c_client *new_client)
1115 struct w83792d_data *data = i2c_get_clientdata(new_client);
1117 id = i2c_adapter_id(adapter);
1118 if (force_subclients[0] == id && force_subclients[1] == address) {
1119 for (i = 2; i <= 3; i++) {
1120 if (force_subclients[i] < 0x48 ||
1121 force_subclients[i] > 0x4f) {
1122 dev_err(&new_client->dev, "invalid subclient "
1123 "address %d; must be 0x48-0x4f\n",
1124 force_subclients[i]);
1129 w83792d_write_value(new_client, W83792D_REG_I2C_SUBADDR,
1130 (force_subclients[2] & 0x07) |
1131 ((force_subclients[3] & 0x07) << 4));
1134 val = w83792d_read_value(new_client, W83792D_REG_I2C_SUBADDR);
1135 if (!(val & 0x08)) {
1136 err = w83792d_create_subclient(adapter, new_client, val & 0x7,
1141 if (!(val & 0x80)) {
1142 if ((data->lm75[0] != NULL) &&
1143 ((val & 0x7) == ((val >> 4) & 0x7))) {
1144 dev_err(&new_client->dev, "duplicate addresses 0x%x, "
1145 "use force_subclient\n", data->lm75[0]->addr);
1149 err = w83792d_create_subclient(adapter, new_client,
1150 (val >> 4) & 0x7, &data->lm75[1]);
1157 /* Undo inits in case of errors */
1160 if (data->lm75[0] != NULL) {
1161 i2c_detach_client(data->lm75[0]);
1162 kfree(data->lm75[0]);
1170 w83792d_detect(struct i2c_adapter *adapter, int address, int kind)
1172 int i = 0, val1 = 0, val2;
1173 struct i2c_client *new_client;
1174 struct w83792d_data *data;
1176 const char *client_name = "";
1178 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1182 /* OK. For now, we presume we have a valid client. We now create the
1183 client structure, even though we cannot fill it completely yet.
1184 But it allows us to access w83792d_{read,write}_value. */
1186 if (!(data = kzalloc(sizeof(struct w83792d_data), GFP_KERNEL))) {
1191 new_client = &data->client;
1192 i2c_set_clientdata(new_client, data);
1193 new_client->addr = address;
1194 init_MUTEX(&data->lock);
1195 new_client->adapter = adapter;
1196 new_client->driver = &w83792d_driver;
1197 new_client->flags = 0;
1199 /* Now, we do the remaining detection. */
1201 /* The w83792d may be stuck in some other bank than bank 0. This may
1202 make reading other information impossible. Specify a force=... or
1203 force_*=... parameter, and the Winbond will be reset to the right
1206 if (w83792d_read_value(new_client, W83792D_REG_CONFIG) & 0x80) {
1207 dev_warn(&new_client->dev, "Detection failed at step "
1211 val1 = w83792d_read_value(new_client, W83792D_REG_BANK);
1212 val2 = w83792d_read_value(new_client, W83792D_REG_CHIPMAN);
1213 /* Check for Winbond ID if in bank 0 */
1214 if (!(val1 & 0x07)) { /* is Bank0 */
1215 if (((!(val1 & 0x80)) && (val2 != 0xa3)) ||
1216 ((val1 & 0x80) && (val2 != 0x5c))) {
1220 /* If Winbond chip, address of chip and W83792D_REG_I2C_ADDR
1222 if (w83792d_read_value(new_client,
1223 W83792D_REG_I2C_ADDR) != address) {
1224 dev_warn(&new_client->dev, "Detection failed "
1230 /* We have either had a force parameter, or we have already detected the
1231 Winbond. Put it now into bank 0 and Vendor ID High Byte */
1232 w83792d_write_value(new_client,
1234 (w83792d_read_value(new_client,
1235 W83792D_REG_BANK) & 0x78) | 0x80);
1237 /* Determine the chip type. */
1240 val2 = w83792d_read_value(new_client, W83792D_REG_CHIPMAN);
1241 if (val2 != 0x5c) { /* the vendor is NOT Winbond */
1244 val1 = w83792d_read_value(new_client, W83792D_REG_WCHIPID);
1245 if (val1 == 0x7a && address >= 0x2c) {
1249 dev_warn(&new_client->dev,
1250 "w83792d: Ignoring 'force' parameter for"
1251 " unknown chip at adapter %d, address"
1252 " 0x%02x\n", i2c_adapter_id(adapter),
1258 if (kind == w83792d) {
1259 client_name = "w83792d";
1261 dev_err(&new_client->dev, "w83792d: Internal error: unknown"
1262 " kind (%d)?!?", kind);
1266 /* Fill in the remaining client fields and put into the global list */
1267 strlcpy(new_client->name, client_name, I2C_NAME_SIZE);
1271 init_MUTEX(&data->update_lock);
1273 /* Tell the I2C layer a new client has arrived */
1274 if ((err = i2c_attach_client(new_client)))
1277 if ((err = w83792d_detect_subclients(adapter, address,
1281 /* Initialize the chip */
1282 w83792d_init_client(new_client);
1284 /* A few vars need to be filled upon startup */
1285 for (i = 1; i <= 7; i++) {
1286 data->fan_min[i - 1] = w83792d_read_value(new_client,
1287 W83792D_REG_FAN_MIN[i]);
1290 /* Register sysfs hooks */
1291 data->class_dev = hwmon_device_register(&new_client->dev);
1292 if (IS_ERR(data->class_dev)) {
1293 err = PTR_ERR(data->class_dev);
1296 device_create_file_in(new_client, 0);
1297 device_create_file_in(new_client, 1);
1298 device_create_file_in(new_client, 2);
1299 device_create_file_in(new_client, 3);
1300 device_create_file_in(new_client, 4);
1301 device_create_file_in(new_client, 5);
1302 device_create_file_in(new_client, 6);
1303 device_create_file_in(new_client, 7);
1304 device_create_file_in(new_client, 8);
1306 device_create_file_fan(new_client, 1);
1307 device_create_file_fan(new_client, 2);
1308 device_create_file_fan(new_client, 3);
1309 device_create_file_fan(new_client, 4);
1310 device_create_file_fan(new_client, 5);
1311 device_create_file_fan(new_client, 6);
1312 device_create_file_fan(new_client, 7);
1314 device_create_file_temp1(new_client); /* Temp1 */
1315 device_create_file_temp_add(new_client, 2); /* Temp2 */
1316 device_create_file_temp_add(new_client, 3); /* Temp3 */
1318 device_create_file_alarms(new_client);
1320 device_create_file_pwm(new_client, 1);
1321 device_create_file_pwm(new_client, 2);
1322 device_create_file_pwm(new_client, 3);
1324 device_create_file_pwmenable(new_client, 1);
1325 device_create_file_pwmenable(new_client, 2);
1326 device_create_file_pwmenable(new_client, 3);
1328 device_create_file_pwm_mode(new_client, 1);
1329 device_create_file_pwm_mode(new_client, 2);
1330 device_create_file_pwm_mode(new_client, 3);
1332 device_create_file_chassis(new_client);
1333 device_create_file_chassis_clear(new_client);
1335 device_create_file_thermal_cruise(new_client, 1);
1336 device_create_file_thermal_cruise(new_client, 2);
1337 device_create_file_thermal_cruise(new_client, 3);
1339 device_create_file_tolerance(new_client, 1);
1340 device_create_file_tolerance(new_client, 2);
1341 device_create_file_tolerance(new_client, 3);
1343 device_create_file_sf2_point(new_client, 1, 1); /* Fan1 */
1344 device_create_file_sf2_point(new_client, 2, 1); /* Fan1 */
1345 device_create_file_sf2_point(new_client, 3, 1); /* Fan1 */
1346 device_create_file_sf2_point(new_client, 4, 1); /* Fan1 */
1347 device_create_file_sf2_point(new_client, 1, 2); /* Fan2 */
1348 device_create_file_sf2_point(new_client, 2, 2); /* Fan2 */
1349 device_create_file_sf2_point(new_client, 3, 2); /* Fan2 */
1350 device_create_file_sf2_point(new_client, 4, 2); /* Fan2 */
1351 device_create_file_sf2_point(new_client, 1, 3); /* Fan3 */
1352 device_create_file_sf2_point(new_client, 2, 3); /* Fan3 */
1353 device_create_file_sf2_point(new_client, 3, 3); /* Fan3 */
1354 device_create_file_sf2_point(new_client, 4, 3); /* Fan3 */
1356 device_create_file_sf2_level(new_client, 1, 1); /* Fan1 */
1357 device_create_file_sf2_level(new_client, 2, 1); /* Fan1 */
1358 device_create_file_sf2_level(new_client, 3, 1); /* Fan1 */
1359 device_create_file_sf2_level(new_client, 1, 2); /* Fan2 */
1360 device_create_file_sf2_level(new_client, 2, 2); /* Fan2 */
1361 device_create_file_sf2_level(new_client, 3, 2); /* Fan2 */
1362 device_create_file_sf2_level(new_client, 1, 3); /* Fan3 */
1363 device_create_file_sf2_level(new_client, 2, 3); /* Fan3 */
1364 device_create_file_sf2_level(new_client, 3, 3); /* Fan3 */
1369 if (data->lm75[0] != NULL) {
1370 i2c_detach_client(data->lm75[0]);
1371 kfree(data->lm75[0]);
1373 if (data->lm75[1] != NULL) {
1374 i2c_detach_client(data->lm75[1]);
1375 kfree(data->lm75[1]);
1378 i2c_detach_client(new_client);
1386 w83792d_detach_client(struct i2c_client *client)
1388 struct w83792d_data *data = i2c_get_clientdata(client);
1393 hwmon_device_unregister(data->class_dev);
1395 if ((err = i2c_detach_client(client)))
1408 /* The SMBus locks itself, usually, but nothing may access the Winbond between
1409 bank switches. ISA access must always be locked explicitly!
1410 We ignore the W83792D BUSY flag at this moment - it could lead to deadlocks,
1411 would slow down the W83792D access and should not be necessary.
1412 There are some ugly typecasts here, but the good news is - they should
1413 nowhere else be necessary! */
1415 w83792d_read_value(struct i2c_client *client, u8 reg)
1418 res = i2c_smbus_read_byte_data(client, reg);
1424 w83792d_write_value(struct i2c_client *client, u8 reg, u8 value)
1426 i2c_smbus_write_byte_data(client, reg, value);
1431 w83792d_init_client(struct i2c_client *client)
1433 u8 temp2_cfg, temp3_cfg, vid_in_b;
1436 w83792d_write_value(client, W83792D_REG_CONFIG, 0x80);
1438 /* Clear the bit6 of W83792D_REG_VID_IN_B(set it into 0):
1439 W83792D_REG_VID_IN_B bit6 = 0: the high/low limit of
1440 vin0/vin1 can be modified by user;
1441 W83792D_REG_VID_IN_B bit6 = 1: the high/low limit of
1442 vin0/vin1 auto-updated, can NOT be modified by user. */
1443 vid_in_b = w83792d_read_value(client, W83792D_REG_VID_IN_B);
1444 w83792d_write_value(client, W83792D_REG_VID_IN_B,
1447 temp2_cfg = w83792d_read_value(client, W83792D_REG_TEMP2_CONFIG);
1448 temp3_cfg = w83792d_read_value(client, W83792D_REG_TEMP3_CONFIG);
1449 w83792d_write_value(client, W83792D_REG_TEMP2_CONFIG,
1451 w83792d_write_value(client, W83792D_REG_TEMP3_CONFIG,
1454 /* Start monitoring */
1455 w83792d_write_value(client, W83792D_REG_CONFIG,
1456 (w83792d_read_value(client,
1457 W83792D_REG_CONFIG) & 0xf7)
1461 static struct w83792d_data *w83792d_update_device(struct device *dev)
1463 struct i2c_client *client = to_i2c_client(dev);
1464 struct w83792d_data *data = i2c_get_clientdata(client);
1466 u8 reg_array_tmp[4], pwm_array_tmp[7], reg_tmp;
1468 down(&data->update_lock);
1471 (jiffies - data->last_updated, (unsigned long) (HZ * 3))
1472 || time_before(jiffies, data->last_updated) || !data->valid) {
1473 dev_dbg(dev, "Starting device update\n");
1475 /* Update the voltages measured value and limits */
1476 for (i = 0; i < 9; i++) {
1477 data->in[i] = w83792d_read_value(client,
1479 data->in_max[i] = w83792d_read_value(client,
1480 W83792D_REG_IN_MAX[i]);
1481 data->in_min[i] = w83792d_read_value(client,
1482 W83792D_REG_IN_MIN[i]);
1484 data->low_bits[0] = w83792d_read_value(client,
1485 W83792D_REG_LOW_BITS1);
1486 data->low_bits[1] = w83792d_read_value(client,
1487 W83792D_REG_LOW_BITS2);
1488 for (i = 0; i < 7; i++) {
1489 /* Update the Fan measured value and limits */
1490 data->fan[i] = w83792d_read_value(client,
1491 W83792D_REG_FAN[i]);
1492 data->fan_min[i] = w83792d_read_value(client,
1493 W83792D_REG_FAN_MIN[i]);
1494 /* Update the PWM/DC Value and PWM/DC flag */
1495 pwm_array_tmp[i] = w83792d_read_value(client,
1496 W83792D_REG_PWM[i]);
1497 data->pwm[i] = pwm_array_tmp[i] & 0x0f;
1498 data->pwm_mode[i] = (pwm_array_tmp[i] >> 7) & 0x01;
1501 reg_tmp = w83792d_read_value(client, W83792D_REG_FAN_CFG);
1502 data->pwmenable[0] = reg_tmp & 0x03;
1503 data->pwmenable[1] = (reg_tmp>>2) & 0x03;
1504 data->pwmenable[2] = (reg_tmp>>4) & 0x03;
1506 for (i = 0; i < 3; i++) {
1507 data->temp1[i] = w83792d_read_value(client,
1508 W83792D_REG_TEMP1[i]);
1510 for (i = 0; i < 2; i++) {
1511 for (j = 0; j < 6; j++) {
1512 data->temp_add[i][j] = w83792d_read_value(
1513 client,W83792D_REG_TEMP_ADD[i][j]);
1517 /* Update the Fan Divisor */
1518 for (i = 0; i < 4; i++) {
1519 reg_array_tmp[i] = w83792d_read_value(client,
1520 W83792D_REG_FAN_DIV[i]);
1522 data->fan_div[0] = reg_array_tmp[0] & 0x07;
1523 data->fan_div[1] = (reg_array_tmp[0] >> 4) & 0x07;
1524 data->fan_div[2] = reg_array_tmp[1] & 0x07;
1525 data->fan_div[3] = (reg_array_tmp[1] >> 4) & 0x07;
1526 data->fan_div[4] = reg_array_tmp[2] & 0x07;
1527 data->fan_div[5] = (reg_array_tmp[2] >> 4) & 0x07;
1528 data->fan_div[6] = reg_array_tmp[3] & 0x07;
1530 /* Update the realtime status */
1531 data->alarms = w83792d_read_value(client, W83792D_REG_ALARM1) +
1532 (w83792d_read_value(client, W83792D_REG_ALARM2) << 8) +
1533 (w83792d_read_value(client, W83792D_REG_ALARM3) << 16);
1535 /* Update CaseOpen status and it's CLR_CHS. */
1536 data->chassis = (w83792d_read_value(client,
1537 W83792D_REG_CHASSIS) >> 5) & 0x01;
1538 data->chassis_clear = (w83792d_read_value(client,
1539 W83792D_REG_CHASSIS_CLR) >> 7) & 0x01;
1541 /* Update Thermal Cruise/Smart Fan I target value */
1542 for (i = 0; i < 3; i++) {
1543 data->thermal_cruise[i] =
1544 w83792d_read_value(client,
1545 W83792D_REG_THERMAL[i]) & 0x7f;
1548 /* Update Smart Fan I/II tolerance */
1549 reg_tmp = w83792d_read_value(client, W83792D_REG_TOLERANCE[0]);
1550 data->tolerance[0] = reg_tmp & 0x0f;
1551 data->tolerance[1] = (reg_tmp >> 4) & 0x0f;
1552 data->tolerance[2] = w83792d_read_value(client,
1553 W83792D_REG_TOLERANCE[2]) & 0x0f;
1555 /* Update Smart Fan II temperature points */
1556 for (i = 0; i < 3; i++) {
1557 for (j = 0; j < 4; j++) {
1558 data->sf2_points[i][j] = w83792d_read_value(
1559 client,W83792D_REG_POINTS[i][j]) & 0x7f;
1563 /* Update Smart Fan II duty cycle levels */
1564 for (i = 0; i < 3; i++) {
1565 reg_tmp = w83792d_read_value(client,
1566 W83792D_REG_LEVELS[i][0]);
1567 data->sf2_levels[i][0] = reg_tmp & 0x0f;
1568 data->sf2_levels[i][1] = (reg_tmp >> 4) & 0x0f;
1569 reg_tmp = w83792d_read_value(client,
1570 W83792D_REG_LEVELS[i][2]);
1571 data->sf2_levels[i][2] = (reg_tmp >> 4) & 0x0f;
1572 data->sf2_levels[i][3] = reg_tmp & 0x0f;
1575 data->last_updated = jiffies;
1579 up(&data->update_lock);
1582 w83792d_print_debug(data, dev);
1589 static void w83792d_print_debug(struct w83792d_data *data, struct device *dev)
1592 dev_dbg(dev, "==========The following is the debug message...========\n");
1593 dev_dbg(dev, "9 set of Voltages: =====>\n");
1594 for (i=0; i<9; i++) {
1595 dev_dbg(dev, "vin[%d] is: 0x%x\n", i, data->in[i]);
1596 dev_dbg(dev, "vin[%d] max is: 0x%x\n", i, data->in_max[i]);
1597 dev_dbg(dev, "vin[%d] min is: 0x%x\n", i, data->in_min[i]);
1599 dev_dbg(dev, "Low Bit1 is: 0x%x\n", data->low_bits[0]);
1600 dev_dbg(dev, "Low Bit2 is: 0x%x\n", data->low_bits[1]);
1601 dev_dbg(dev, "7 set of Fan Counts and Duty Cycles: =====>\n");
1602 for (i=0; i<7; i++) {
1603 dev_dbg(dev, "fan[%d] is: 0x%x\n", i, data->fan[i]);
1604 dev_dbg(dev, "fan[%d] min is: 0x%x\n", i, data->fan_min[i]);
1605 dev_dbg(dev, "pwm[%d] is: 0x%x\n", i, data->pwm[i]);
1606 dev_dbg(dev, "pwm_mode[%d] is: 0x%x\n", i, data->pwm_mode[i]);
1608 dev_dbg(dev, "3 set of Temperatures: =====>\n");
1609 for (i=0; i<3; i++) {
1610 dev_dbg(dev, "temp1[%d] is: 0x%x\n", i, data->temp1[i]);
1613 for (i=0; i<2; i++) {
1614 for (j=0; j<6; j++) {
1615 dev_dbg(dev, "temp_add[%d][%d] is: 0x%x\n", i, j,
1616 data->temp_add[i][j]);
1620 for (i=0; i<7; i++) {
1621 dev_dbg(dev, "fan_div[%d] is: 0x%x\n", i, data->fan_div[i]);
1623 dev_dbg(dev, "==========End of the debug message...==================\n");
1629 sensors_w83792d_init(void)
1631 return i2c_add_driver(&w83792d_driver);
1635 sensors_w83792d_exit(void)
1637 i2c_del_driver(&w83792d_driver);
1640 MODULE_AUTHOR("Chunhao Huang @ Winbond <DZShen@Winbond.com.tw>");
1641 MODULE_DESCRIPTION("W83792AD/D driver for linux-2.6");
1642 MODULE_LICENSE("GPL");
1644 module_init(sensors_w83792d_init);
1645 module_exit(sensors_w83792d_exit);