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/i2c-vid.h>
44 #include <linux/hwmon.h>
45 #include <linux/hwmon-sysfs.h>
46 #include <linux/err.h>
48 /* Addresses to scan */
49 static unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f, I2C_CLIENT_END };
51 /* Insmod parameters */
52 I2C_CLIENT_INSMOD_1(w83792d);
53 I2C_CLIENT_MODULE_PARM(force_subclients, "List of subclient addresses: "
54 "{bus, clientaddr, subclientaddr1, subclientaddr2}");
57 module_param(init, bool, 0);
58 MODULE_PARM_DESC(init, "Set to one to force chip initialization");
60 /* The W83792D registers */
61 static const u8 W83792D_REG_IN[9] = {
62 0x20, /* Vcore A in DataSheet */
63 0x21, /* Vcore B in DataSheet */
64 0x22, /* VIN0 in DataSheet */
65 0x23, /* VIN1 in DataSheet */
66 0x24, /* VIN2 in DataSheet */
67 0x25, /* VIN3 in DataSheet */
68 0x26, /* 5VCC in DataSheet */
69 0xB0, /* 5VSB in DataSheet */
70 0xB1 /* VBAT in DataSheet */
72 #define W83792D_REG_LOW_BITS1 0x3E /* Low Bits I in DataSheet */
73 #define W83792D_REG_LOW_BITS2 0x3F /* Low Bits II in DataSheet */
74 static const u8 W83792D_REG_IN_MAX[9] = {
75 0x2B, /* Vcore A High Limit in DataSheet */
76 0x2D, /* Vcore B High Limit in DataSheet */
77 0x2F, /* VIN0 High Limit in DataSheet */
78 0x31, /* VIN1 High Limit in DataSheet */
79 0x33, /* VIN2 High Limit in DataSheet */
80 0x35, /* VIN3 High Limit in DataSheet */
81 0x37, /* 5VCC High Limit in DataSheet */
82 0xB4, /* 5VSB High Limit in DataSheet */
83 0xB6 /* VBAT High Limit in DataSheet */
85 static const u8 W83792D_REG_IN_MIN[9] = {
86 0x2C, /* Vcore A Low Limit in DataSheet */
87 0x2E, /* Vcore B Low Limit in DataSheet */
88 0x30, /* VIN0 Low Limit in DataSheet */
89 0x32, /* VIN1 Low Limit in DataSheet */
90 0x34, /* VIN2 Low Limit in DataSheet */
91 0x36, /* VIN3 Low Limit in DataSheet */
92 0x38, /* 5VCC Low Limit in DataSheet */
93 0xB5, /* 5VSB Low Limit in DataSheet */
94 0xB7 /* VBAT Low Limit in DataSheet */
96 static const u8 W83792D_REG_FAN[7] = {
97 0x28, /* FAN 1 Count in DataSheet */
98 0x29, /* FAN 2 Count in DataSheet */
99 0x2A, /* FAN 3 Count in DataSheet */
100 0xB8, /* FAN 4 Count in DataSheet */
101 0xB9, /* FAN 5 Count in DataSheet */
102 0xBA, /* FAN 6 Count in DataSheet */
103 0xBE /* FAN 7 Count in DataSheet */
105 static const u8 W83792D_REG_FAN_MIN[7] = {
106 0x3B, /* FAN 1 Count Low Limit in DataSheet */
107 0x3C, /* FAN 2 Count Low Limit in DataSheet */
108 0x3D, /* FAN 3 Count Low Limit in DataSheet */
109 0xBB, /* FAN 4 Count Low Limit in DataSheet */
110 0xBC, /* FAN 5 Count Low Limit in DataSheet */
111 0xBD, /* FAN 6 Count Low Limit in DataSheet */
112 0xBF /* FAN 7 Count Low Limit in DataSheet */
114 #define W83792D_REG_FAN_CFG 0x84 /* FAN Configuration in DataSheet */
115 static const u8 W83792D_REG_FAN_DIV[4] = {
116 0x47, /* contains FAN2 and FAN1 Divisor */
117 0x5B, /* contains FAN4 and FAN3 Divisor */
118 0x5C, /* contains FAN6 and FAN5 Divisor */
119 0x9E /* contains FAN7 Divisor. */
121 static const u8 W83792D_REG_PWM[7] = {
122 0x81, /* FAN 1 Duty Cycle, be used to control */
123 0x83, /* FAN 2 Duty Cycle, be used to control */
124 0x94, /* FAN 3 Duty Cycle, be used to control */
125 0xA3, /* FAN 4 Duty Cycle, be used to control */
126 0xA4, /* FAN 5 Duty Cycle, be used to control */
127 0xA5, /* FAN 6 Duty Cycle, be used to control */
128 0xA6 /* FAN 7 Duty Cycle, be used to control */
130 #define W83792D_REG_BANK 0x4E
131 #define W83792D_REG_TEMP2_CONFIG 0xC2
132 #define W83792D_REG_TEMP3_CONFIG 0xCA
134 static const u8 W83792D_REG_TEMP1[3] = {
135 0x27, /* TEMP 1 in DataSheet */
136 0x39, /* TEMP 1 Over in DataSheet */
137 0x3A, /* TEMP 1 Hyst in DataSheet */
140 static const u8 W83792D_REG_TEMP_ADD[2][6] = {
141 { 0xC0, /* TEMP 2 in DataSheet */
142 0xC1, /* TEMP 2(0.5 deg) in DataSheet */
143 0xC5, /* TEMP 2 Over High part in DataSheet */
144 0xC6, /* TEMP 2 Over Low part in DataSheet */
145 0xC3, /* TEMP 2 Thyst High part in DataSheet */
146 0xC4 }, /* TEMP 2 Thyst Low part in DataSheet */
147 { 0xC8, /* TEMP 3 in DataSheet */
148 0xC9, /* TEMP 3(0.5 deg) in DataSheet */
149 0xCD, /* TEMP 3 Over High part in DataSheet */
150 0xCE, /* TEMP 3 Over Low part in DataSheet */
151 0xCB, /* TEMP 3 Thyst High part in DataSheet */
152 0xCC } /* TEMP 3 Thyst Low part in DataSheet */
155 static const u8 W83792D_REG_THERMAL[3] = {
156 0x85, /* SmartFanI: Fan1 target value */
157 0x86, /* SmartFanI: Fan2 target value */
158 0x96 /* SmartFanI: Fan3 target value */
161 static const u8 W83792D_REG_TOLERANCE[3] = {
162 0x87, /* (bit3-0)SmartFan Fan1 tolerance */
163 0x87, /* (bit7-4)SmartFan Fan2 tolerance */
164 0x97 /* (bit3-0)SmartFan Fan3 tolerance */
167 static const u8 W83792D_REG_POINTS[3][4] = {
168 { 0x85, /* SmartFanII: Fan1 temp point 1 */
169 0xE3, /* SmartFanII: Fan1 temp point 2 */
170 0xE4, /* SmartFanII: Fan1 temp point 3 */
171 0xE5 }, /* SmartFanII: Fan1 temp point 4 */
172 { 0x86, /* SmartFanII: Fan2 temp point 1 */
173 0xE6, /* SmartFanII: Fan2 temp point 2 */
174 0xE7, /* SmartFanII: Fan2 temp point 3 */
175 0xE8 }, /* SmartFanII: Fan2 temp point 4 */
176 { 0x96, /* SmartFanII: Fan3 temp point 1 */
177 0xE9, /* SmartFanII: Fan3 temp point 2 */
178 0xEA, /* SmartFanII: Fan3 temp point 3 */
179 0xEB } /* SmartFanII: Fan3 temp point 4 */
182 static const u8 W83792D_REG_LEVELS[3][4] = {
183 { 0x88, /* (bit3-0) SmartFanII: Fan1 Non-Stop */
184 0x88, /* (bit7-4) SmartFanII: Fan1 Level 1 */
185 0xE0, /* (bit7-4) SmartFanII: Fan1 Level 2 */
186 0xE0 }, /* (bit3-0) SmartFanII: Fan1 Level 3 */
187 { 0x89, /* (bit3-0) SmartFanII: Fan2 Non-Stop */
188 0x89, /* (bit7-4) SmartFanII: Fan2 Level 1 */
189 0xE1, /* (bit7-4) SmartFanII: Fan2 Level 2 */
190 0xE1 }, /* (bit3-0) SmartFanII: Fan2 Level 3 */
191 { 0x98, /* (bit3-0) SmartFanII: Fan3 Non-Stop */
192 0x98, /* (bit7-4) SmartFanII: Fan3 Level 1 */
193 0xE2, /* (bit7-4) SmartFanII: Fan3 Level 2 */
194 0xE2 } /* (bit3-0) SmartFanII: Fan3 Level 3 */
197 #define W83792D_REG_CONFIG 0x40
198 #define W83792D_REG_VID_FANDIV 0x47
199 #define W83792D_REG_CHIPID 0x49
200 #define W83792D_REG_WCHIPID 0x58
201 #define W83792D_REG_CHIPMAN 0x4F
202 #define W83792D_REG_PIN 0x4B
203 #define W83792D_REG_I2C_SUBADDR 0x4A
205 #define W83792D_REG_ALARM1 0xA9 /* realtime status register1 */
206 #define W83792D_REG_ALARM2 0xAA /* realtime status register2 */
207 #define W83792D_REG_ALARM3 0xAB /* realtime status register3 */
208 #define W83792D_REG_CHASSIS 0x42 /* Bit 5: Case Open status bit */
209 #define W83792D_REG_CHASSIS_CLR 0x44 /* Bit 7: Case Open CLR_CHS/Reset bit */
211 /* control in0/in1 's limit modifiability */
212 #define W83792D_REG_VID_IN_B 0x17
214 #define W83792D_REG_VBAT 0x5D
215 #define W83792D_REG_I2C_ADDR 0x48
217 /* Conversions. Rounding and limit checking is only done on the TO_REG
218 variants. Note that you should be a bit careful with which arguments
219 these macros are called: arguments may be evaluated more than once.
220 Fixing this is just not worth it. */
221 #define IN_FROM_REG(nr,val) (((nr)<=1)?(val*2): \
222 ((((nr)==6)||((nr)==7))?(val*6):(val*4)))
223 #define IN_TO_REG(nr,val) (((nr)<=1)?(val/2): \
224 ((((nr)==6)||((nr)==7))?(val/6):(val/4)))
227 FAN_TO_REG(long rpm, int div)
231 rpm = SENSORS_LIMIT(rpm, 1, 1000000);
232 return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
235 #define FAN_FROM_REG(val,div) ((val) == 0 ? -1 : \
236 ((val) == 255 ? 0 : \
237 1350000 / ((val) * (div))))
240 #define TEMP1_TO_REG(val) (SENSORS_LIMIT(((val) < 0 ? (val)+0x100*1000 \
241 : (val)) / 1000, 0, 0xff))
242 #define TEMP1_FROM_REG(val) (((val) & 0x80 ? (val)-0x100 : (val)) * 1000)
243 /* for temp2 and temp3, because they need addtional resolution */
244 #define TEMP_ADD_FROM_REG(val1, val2) \
245 ((((val1) & 0x80 ? (val1)-0x100 \
246 : (val1)) * 1000) + ((val2 & 0x80) ? 500 : 0))
247 #define TEMP_ADD_TO_REG_HIGH(val) \
248 (SENSORS_LIMIT(((val) < 0 ? (val)+0x100*1000 \
249 : (val)) / 1000, 0, 0xff))
250 #define TEMP_ADD_TO_REG_LOW(val) ((val%1000) ? 0x80 : 0x00)
252 #define PWM_FROM_REG(val) (val)
253 #define PWM_TO_REG(val) (SENSORS_LIMIT((val),0,255))
254 #define DIV_FROM_REG(val) (1 << (val))
260 val = SENSORS_LIMIT(val, 1, 128) >> 1;
261 for (i = 0; i < 6; i++) {
269 struct w83792d_data {
270 struct i2c_client client;
271 struct class_device *class_dev;
272 struct semaphore lock;
275 struct semaphore update_lock;
276 char valid; /* !=0 if following fields are valid */
277 unsigned long last_updated; /* In jiffies */
279 /* array of 2 pointers to subclients */
280 struct i2c_client *lm75[2];
282 u8 in[9]; /* Register value */
283 u8 in_max[9]; /* Register value */
284 u8 in_min[9]; /* Register value */
285 u8 low_bits[2]; /* Additional resolution to voltage in0-6 */
286 u8 fan[7]; /* Register value */
287 u8 fan_min[7]; /* Register value */
288 u8 temp1[3]; /* current, over, thyst */
289 u8 temp_add[2][6]; /* Register value */
290 u8 fan_div[7]; /* Register encoding, shifted right */
291 u8 pwm[7]; /* We only consider the first 3 set of pwm,
292 although 792 chip has 7 set of pwm. */
294 u8 pwm_mode[7]; /* indicates PWM or DC mode: 1->PWM; 0->DC */
295 u32 alarms; /* realtime status register encoding,combined */
296 u8 chassis; /* Chassis status */
297 u8 chassis_clear; /* CLR_CHS, clear chassis intrusion detection */
298 u8 thermal_cruise[3]; /* Smart FanI: Fan1,2,3 target value */
299 u8 tolerance[3]; /* Fan1,2,3 tolerance(Smart Fan I/II) */
300 u8 sf2_points[3][4]; /* Smart FanII: Fan1,2,3 temperature points */
301 u8 sf2_levels[3][4]; /* Smart FanII: Fan1,2,3 duty cycle levels */
304 static int w83792d_attach_adapter(struct i2c_adapter *adapter);
305 static int w83792d_detect(struct i2c_adapter *adapter, int address, int kind);
306 static int w83792d_detach_client(struct i2c_client *client);
308 static int w83792d_read_value(struct i2c_client *client, u8 register);
309 static int w83792d_write_value(struct i2c_client *client, u8 register,
311 static struct w83792d_data *w83792d_update_device(struct device *dev);
314 static void w83792d_print_debug(struct w83792d_data *data, struct device *dev);
317 static void w83792d_init_client(struct i2c_client *client);
319 static struct i2c_driver w83792d_driver = {
320 .owner = THIS_MODULE,
322 .flags = I2C_DF_NOTIFY,
323 .attach_adapter = w83792d_attach_adapter,
324 .detach_client = w83792d_detach_client,
327 static long in_count_from_reg(int nr, struct w83792d_data *data)
329 u16 vol_count = data->in[nr];
331 vol_count = (vol_count << 2);
335 low_bits = (data->low_bits[0]) & 0x03;
338 low_bits = ((data->low_bits[0]) & 0x0c) >> 2;
341 low_bits = ((data->low_bits[0]) & 0x30) >> 4;
344 low_bits = ((data->low_bits[0]) & 0xc0) >> 6;
347 low_bits = (data->low_bits[1]) & 0x03;
350 low_bits = ((data->low_bits[1]) & 0x0c) >> 2;
353 low_bits = ((data->low_bits[1]) & 0x30) >> 4;
357 vol_count = vol_count | low_bits;
361 /* following are the sysfs callback functions */
362 static ssize_t show_in(struct device *dev, struct device_attribute *attr,
365 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
366 int nr = sensor_attr->index;
367 struct w83792d_data *data = w83792d_update_device(dev);
368 return sprintf(buf,"%ld\n", IN_FROM_REG(nr,(in_count_from_reg(nr, data))));
371 #define show_in_reg(reg) \
372 static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
375 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
376 int nr = sensor_attr->index; \
377 struct w83792d_data *data = w83792d_update_device(dev); \
378 return sprintf(buf,"%ld\n", (long)(IN_FROM_REG(nr, (data->reg[nr])*4))); \
384 #define store_in_reg(REG, reg) \
385 static ssize_t store_in_##reg (struct device *dev, \
386 struct device_attribute *attr, \
387 const char *buf, size_t count) \
389 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
390 int nr = sensor_attr->index; \
391 struct i2c_client *client = to_i2c_client(dev); \
392 struct w83792d_data *data = i2c_get_clientdata(client); \
395 val = simple_strtoul(buf, NULL, 10); \
396 data->in_##reg[nr] = SENSORS_LIMIT(IN_TO_REG(nr, val)/4, 0, 255); \
397 w83792d_write_value(client, W83792D_REG_IN_##REG[nr], data->in_##reg[nr]); \
401 store_in_reg(MIN, min);
402 store_in_reg(MAX, max);
404 #define sysfs_in_reg(offset) \
405 static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in, \
407 static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
408 show_in_min, store_in_min, offset); \
409 static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
410 show_in_max, store_in_max, offset);
422 #define device_create_file_in(client, offset) \
424 device_create_file(&client->dev, &sensor_dev_attr_in##offset##_input.dev_attr); \
425 device_create_file(&client->dev, &sensor_dev_attr_in##offset##_max.dev_attr); \
426 device_create_file(&client->dev, &sensor_dev_attr_in##offset##_min.dev_attr); \
429 #define show_fan_reg(reg) \
430 static ssize_t show_##reg (struct device *dev, struct device_attribute *attr, \
433 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
434 int nr = sensor_attr->index - 1; \
435 struct w83792d_data *data = w83792d_update_device(dev); \
436 return sprintf(buf,"%d\n", \
437 FAN_FROM_REG(data->reg[nr], DIV_FROM_REG(data->fan_div[nr]))); \
441 show_fan_reg(fan_min);
444 store_fan_min(struct device *dev, struct device_attribute *attr,
445 const char *buf, size_t count)
447 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
448 int nr = sensor_attr->index - 1;
449 struct i2c_client *client = to_i2c_client(dev);
450 struct w83792d_data *data = i2c_get_clientdata(client);
453 val = simple_strtoul(buf, NULL, 10);
454 data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
455 w83792d_write_value(client, W83792D_REG_FAN_MIN[nr],
462 show_fan_div(struct device *dev, struct device_attribute *attr,
465 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
466 int nr = sensor_attr->index;
467 struct w83792d_data *data = w83792d_update_device(dev);
468 return sprintf(buf, "%u\n", DIV_FROM_REG(data->fan_div[nr - 1]));
471 /* Note: we save and restore the fan minimum here, because its value is
472 determined in part by the fan divisor. This follows the principle of
473 least suprise; the user doesn't expect the fan minimum to change just
474 because the divisor changed. */
476 store_fan_div(struct device *dev, struct device_attribute *attr,
477 const char *buf, size_t count)
479 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
480 int nr = sensor_attr->index - 1;
481 struct i2c_client *client = to_i2c_client(dev);
482 struct w83792d_data *data = i2c_get_clientdata(client);
489 min = FAN_FROM_REG(data->fan_min[nr],
490 DIV_FROM_REG(data->fan_div[nr]));
492 data->fan_div[nr] = DIV_TO_REG(simple_strtoul(buf, NULL, 10));
494 fan_div_reg = w83792d_read_value(client, W83792D_REG_FAN_DIV[nr >> 1]);
495 fan_div_reg &= (nr & 0x01) ? 0x8f : 0xf8;
496 tmp_fan_div = (nr & 0x01) ? (((data->fan_div[nr]) << 4) & 0x70)
497 : ((data->fan_div[nr]) & 0x07);
498 w83792d_write_value(client, W83792D_REG_FAN_DIV[nr >> 1],
499 fan_div_reg | tmp_fan_div);
501 /* Restore fan_min */
502 data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
503 w83792d_write_value(client, W83792D_REG_FAN_MIN[nr], data->fan_min[nr]);
508 #define sysfs_fan(offset) \
509 static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan, NULL, \
511 static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
512 show_fan_div, store_fan_div, offset); \
513 static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
514 show_fan_min, store_fan_min, offset);
524 #define device_create_file_fan(client, offset) \
526 device_create_file(&client->dev, &sensor_dev_attr_fan##offset##_input.dev_attr); \
527 device_create_file(&client->dev, &sensor_dev_attr_fan##offset##_div.dev_attr); \
528 device_create_file(&client->dev, &sensor_dev_attr_fan##offset##_min.dev_attr); \
532 /* read/write the temperature1, includes measured value and limits */
534 static ssize_t show_temp1(struct device *dev, struct device_attribute *attr,
537 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
538 int nr = sensor_attr->index;
539 struct w83792d_data *data = w83792d_update_device(dev);
540 return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->temp1[nr]));
543 static ssize_t store_temp1(struct device *dev, struct device_attribute *attr,
544 const char *buf, size_t count)
546 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
547 int nr = sensor_attr->index;
548 struct i2c_client *client = to_i2c_client(dev);
549 struct w83792d_data *data = i2c_get_clientdata(client);
552 val = simple_strtol(buf, NULL, 10);
554 data->temp1[nr] = TEMP1_TO_REG(val);
555 w83792d_write_value(client, W83792D_REG_TEMP1[nr],
562 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp1, NULL, 0);
563 static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR, show_temp1,
565 static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR, show_temp1,
568 #define device_create_file_temp1(client) \
570 device_create_file(&client->dev, &sensor_dev_attr_temp1_input.dev_attr); \
571 device_create_file(&client->dev, &sensor_dev_attr_temp1_max.dev_attr); \
572 device_create_file(&client->dev, &sensor_dev_attr_temp1_max_hyst.dev_attr); \
576 /* read/write the temperature2-3, includes measured value and limits */
578 static ssize_t show_temp23(struct device *dev, struct device_attribute *attr,
581 struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
582 int nr = sensor_attr->nr;
583 int index = sensor_attr->index;
584 struct w83792d_data *data = w83792d_update_device(dev);
585 return sprintf(buf,"%ld\n",
586 (long)TEMP_ADD_FROM_REG(data->temp_add[nr][index],
587 data->temp_add[nr][index+1]));
590 static ssize_t store_temp23(struct device *dev, struct device_attribute *attr,
591 const char *buf, size_t count)
593 struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
594 int nr = sensor_attr->nr;
595 int index = sensor_attr->index;
596 struct i2c_client *client = to_i2c_client(dev);
597 struct w83792d_data *data = i2c_get_clientdata(client);
600 val = simple_strtol(buf, NULL, 10);
602 data->temp_add[nr][index] = TEMP_ADD_TO_REG_HIGH(val);
603 data->temp_add[nr][index+1] = TEMP_ADD_TO_REG_LOW(val);
604 w83792d_write_value(client, W83792D_REG_TEMP_ADD[nr][index],
605 data->temp_add[nr][index]);
606 w83792d_write_value(client, W83792D_REG_TEMP_ADD[nr][index+1],
607 data->temp_add[nr][index+1]);
612 #define sysfs_temp23(name,idx) \
613 static SENSOR_DEVICE_ATTR_2(name##_input, S_IRUGO, show_temp23, NULL, \
615 static SENSOR_DEVICE_ATTR_2(name##_max, S_IRUGO | S_IWUSR, \
616 show_temp23, store_temp23, idx, 2); \
617 static SENSOR_DEVICE_ATTR_2(name##_max_hyst, S_IRUGO | S_IWUSR, \
618 show_temp23, store_temp23, idx, 4);
620 sysfs_temp23(temp2,0)
621 sysfs_temp23(temp3,1)
623 #define device_create_file_temp_add(client, offset) \
625 device_create_file(&client->dev, &sensor_dev_attr_temp##offset##_input.dev_attr); \
626 device_create_file(&client->dev, &sensor_dev_attr_temp##offset##_max.dev_attr); \
627 device_create_file(&client->dev, \
628 &sensor_dev_attr_temp##offset##_max_hyst.dev_attr); \
632 /* get reatime status of all sensors items: voltage, temp, fan */
634 show_alarms_reg(struct device *dev, struct device_attribute *attr, char *buf)
636 struct w83792d_data *data = w83792d_update_device(dev);
637 return sprintf(buf, "%d\n", data->alarms);
641 DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
642 #define device_create_file_alarms(client) \
643 device_create_file(&client->dev, &dev_attr_alarms);
648 show_pwm(struct device *dev, struct device_attribute *attr,
651 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
652 int nr = sensor_attr->index;
653 struct w83792d_data *data = w83792d_update_device(dev);
654 return sprintf(buf, "%ld\n", (long) PWM_FROM_REG(data->pwm[nr-1]));
658 show_pwmenable(struct device *dev, struct device_attribute *attr,
661 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
662 int nr = sensor_attr->index - 1;
663 struct w83792d_data *data = w83792d_update_device(dev);
664 long pwm_enable_tmp = 1;
666 switch (data->pwmenable[nr]) {
668 pwm_enable_tmp = 1; /* manual mode */
671 pwm_enable_tmp = 3; /*thermal cruise/Smart Fan I */
674 pwm_enable_tmp = 2; /* Smart Fan II */
678 return sprintf(buf, "%ld\n", pwm_enable_tmp);
682 store_pwm(struct device *dev, struct device_attribute *attr,
683 const char *buf, size_t count)
685 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
686 int nr = sensor_attr->index - 1;
687 struct i2c_client *client = to_i2c_client(dev);
688 struct w83792d_data *data = i2c_get_clientdata(client);
691 val = simple_strtoul(buf, NULL, 10);
692 data->pwm[nr] = PWM_TO_REG(val);
693 w83792d_write_value(client, W83792D_REG_PWM[nr], data->pwm[nr]);
699 store_pwmenable(struct device *dev, struct device_attribute *attr,
700 const char *buf, size_t count)
702 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
703 int nr = sensor_attr->index - 1;
704 struct i2c_client *client = to_i2c_client(dev);
705 struct w83792d_data *data = i2c_get_clientdata(client);
707 u8 fan_cfg_tmp, cfg1_tmp, cfg2_tmp, cfg3_tmp, cfg4_tmp;
709 val = simple_strtoul(buf, NULL, 10);
712 data->pwmenable[nr] = 0; /* manual mode */
715 data->pwmenable[nr] = 2; /* Smart Fan II */
718 data->pwmenable[nr] = 1; /* thermal cruise/Smart Fan I */
723 cfg1_tmp = data->pwmenable[0];
724 cfg2_tmp = (data->pwmenable[1]) << 2;
725 cfg3_tmp = (data->pwmenable[2]) << 4;
726 cfg4_tmp = w83792d_read_value(client,W83792D_REG_FAN_CFG) & 0xc0;
727 fan_cfg_tmp = ((cfg4_tmp | cfg3_tmp) | cfg2_tmp) | cfg1_tmp;
728 w83792d_write_value(client, W83792D_REG_FAN_CFG, fan_cfg_tmp);
733 #define sysfs_pwm(offset) \
734 static SENSOR_DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \
735 show_pwm, store_pwm, offset); \
736 static SENSOR_DEVICE_ATTR(pwm##offset##_enable, S_IRUGO | S_IWUSR, \
737 show_pwmenable, store_pwmenable, offset); \
744 #define device_create_file_pwm(client, offset) \
746 device_create_file(&client->dev, &sensor_dev_attr_pwm##offset.dev_attr); \
749 #define device_create_file_pwmenable(client, offset) \
751 device_create_file(&client->dev, &sensor_dev_attr_pwm##offset##_enable.dev_attr); \
756 show_pwm_mode(struct device *dev, struct device_attribute *attr,
759 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
760 int nr = sensor_attr->index;
761 struct w83792d_data *data = w83792d_update_device(dev);
762 return sprintf(buf, "%d\n", data->pwm_mode[nr-1]);
766 store_pwm_mode(struct device *dev, struct device_attribute *attr,
767 const char *buf, size_t count)
769 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
770 int nr = sensor_attr->index - 1;
771 struct i2c_client *client = to_i2c_client(dev);
772 struct w83792d_data *data = i2c_get_clientdata(client);
774 u8 pwm_mode_mask = 0;
776 val = simple_strtoul(buf, NULL, 10);
777 data->pwm_mode[nr] = SENSORS_LIMIT(val, 0, 1);
778 pwm_mode_mask = w83792d_read_value(client,
779 W83792D_REG_PWM[nr]) & 0x7f;
780 w83792d_write_value(client, W83792D_REG_PWM[nr],
781 ((data->pwm_mode[nr]) << 7) | pwm_mode_mask);
786 #define sysfs_pwm_mode(offset) \
787 static SENSOR_DEVICE_ATTR(pwm##offset##_mode, S_IRUGO | S_IWUSR, \
788 show_pwm_mode, store_pwm_mode, offset);
794 #define device_create_file_pwm_mode(client, offset) \
796 device_create_file(&client->dev, &sensor_dev_attr_pwm##offset##_mode.dev_attr); \
801 show_regs_chassis(struct device *dev, struct device_attribute *attr,
804 struct w83792d_data *data = w83792d_update_device(dev);
805 return sprintf(buf, "%d\n", data->chassis);
808 static DEVICE_ATTR(chassis, S_IRUGO, show_regs_chassis, NULL);
810 #define device_create_file_chassis(client) \
812 device_create_file(&client->dev, &dev_attr_chassis); \
817 show_chassis_clear(struct device *dev, struct device_attribute *attr, char *buf)
819 struct w83792d_data *data = w83792d_update_device(dev);
820 return sprintf(buf, "%d\n", data->chassis_clear);
824 store_chassis_clear(struct device *dev, struct device_attribute *attr,
825 const char *buf, size_t count)
827 struct i2c_client *client = to_i2c_client(dev);
828 struct w83792d_data *data = i2c_get_clientdata(client);
830 u8 temp1 = 0, temp2 = 0;
832 val = simple_strtoul(buf, NULL, 10);
834 data->chassis_clear = SENSORS_LIMIT(val, 0 ,1);
835 temp1 = ((data->chassis_clear) << 7) & 0x80;
836 temp2 = w83792d_read_value(client,
837 W83792D_REG_CHASSIS_CLR) & 0x7f;
838 w83792d_write_value(client, W83792D_REG_CHASSIS_CLR, temp1 | temp2);
843 static DEVICE_ATTR(chassis_clear, S_IRUGO | S_IWUSR,
844 show_chassis_clear, store_chassis_clear);
846 #define device_create_file_chassis_clear(client) \
848 device_create_file(&client->dev, &dev_attr_chassis_clear); \
853 /* For Smart Fan I / Thermal Cruise */
855 show_thermal_cruise(struct device *dev, struct device_attribute *attr,
858 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
859 int nr = sensor_attr->index;
860 struct w83792d_data *data = w83792d_update_device(dev);
861 return sprintf(buf, "%ld\n", (long)data->thermal_cruise[nr-1]);
865 store_thermal_cruise(struct device *dev, struct device_attribute *attr,
866 const char *buf, size_t count)
868 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
869 int nr = sensor_attr->index - 1;
870 struct i2c_client *client = to_i2c_client(dev);
871 struct w83792d_data *data = i2c_get_clientdata(client);
873 u8 target_tmp=0, target_mask=0;
875 val = simple_strtoul(buf, NULL, 10);
877 target_tmp = target_tmp & 0x7f;
878 target_mask = w83792d_read_value(client, W83792D_REG_THERMAL[nr]) & 0x80;
879 data->thermal_cruise[nr] = SENSORS_LIMIT(target_tmp, 0, 255);
880 w83792d_write_value(client, W83792D_REG_THERMAL[nr],
881 (data->thermal_cruise[nr]) | target_mask);
886 #define sysfs_thermal_cruise(offset) \
887 static SENSOR_DEVICE_ATTR(thermal_cruise##offset, S_IRUGO | S_IWUSR, \
888 show_thermal_cruise, store_thermal_cruise, offset);
890 sysfs_thermal_cruise(1);
891 sysfs_thermal_cruise(2);
892 sysfs_thermal_cruise(3);
894 #define device_create_file_thermal_cruise(client, offset) \
896 device_create_file(&client->dev, \
897 &sensor_dev_attr_thermal_cruise##offset.dev_attr); \
901 /* For Smart Fan I/Thermal Cruise and Smart Fan II */
903 show_tolerance(struct device *dev, struct device_attribute *attr,
906 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
907 int nr = sensor_attr->index;
908 struct w83792d_data *data = w83792d_update_device(dev);
909 return sprintf(buf, "%ld\n", (long)data->tolerance[nr-1]);
913 store_tolerance(struct device *dev, struct device_attribute *attr,
914 const char *buf, size_t count)
916 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
917 int nr = sensor_attr->index - 1;
918 struct i2c_client *client = to_i2c_client(dev);
919 struct w83792d_data *data = i2c_get_clientdata(client);
921 u8 tol_tmp, tol_mask;
923 val = simple_strtoul(buf, NULL, 10);
924 tol_mask = w83792d_read_value(client,
925 W83792D_REG_TOLERANCE[nr]) & ((nr == 1) ? 0x0f : 0xf0);
926 tol_tmp = SENSORS_LIMIT(val, 0, 15);
928 data->tolerance[nr] = tol_tmp;
932 w83792d_write_value(client, W83792D_REG_TOLERANCE[nr],
938 #define sysfs_tolerance(offset) \
939 static SENSOR_DEVICE_ATTR(tolerance##offset, S_IRUGO | S_IWUSR, \
940 show_tolerance, store_tolerance, offset);
946 #define device_create_file_tolerance(client, offset) \
948 device_create_file(&client->dev, &sensor_dev_attr_tolerance##offset.dev_attr); \
952 /* For Smart Fan II */
954 show_sf2_point(struct device *dev, struct device_attribute *attr,
957 struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
958 int nr = sensor_attr->nr;
959 int index = sensor_attr->index;
960 struct w83792d_data *data = w83792d_update_device(dev);
961 return sprintf(buf, "%ld\n", (long)data->sf2_points[index-1][nr-1]);
965 store_sf2_point(struct device *dev, struct device_attribute *attr,
966 const char *buf, size_t count)
968 struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
969 int nr = sensor_attr->nr - 1;
970 int index = sensor_attr->index - 1;
971 struct i2c_client *client = to_i2c_client(dev);
972 struct w83792d_data *data = i2c_get_clientdata(client);
976 val = simple_strtoul(buf, NULL, 10);
977 data->sf2_points[index][nr] = SENSORS_LIMIT(val, 0, 127);
978 mask_tmp = w83792d_read_value(client,
979 W83792D_REG_POINTS[index][nr]) & 0x80;
980 w83792d_write_value(client, W83792D_REG_POINTS[index][nr],
981 mask_tmp|data->sf2_points[index][nr]);
986 #define sysfs_sf2_point(offset, index) \
987 static SENSOR_DEVICE_ATTR_2(sf2_point##offset##_fan##index, S_IRUGO | S_IWUSR, \
988 show_sf2_point, store_sf2_point, offset, index);
990 sysfs_sf2_point(1, 1); /* Fan1 */
991 sysfs_sf2_point(2, 1); /* Fan1 */
992 sysfs_sf2_point(3, 1); /* Fan1 */
993 sysfs_sf2_point(4, 1); /* Fan1 */
994 sysfs_sf2_point(1, 2); /* Fan2 */
995 sysfs_sf2_point(2, 2); /* Fan2 */
996 sysfs_sf2_point(3, 2); /* Fan2 */
997 sysfs_sf2_point(4, 2); /* Fan2 */
998 sysfs_sf2_point(1, 3); /* Fan3 */
999 sysfs_sf2_point(2, 3); /* Fan3 */
1000 sysfs_sf2_point(3, 3); /* Fan3 */
1001 sysfs_sf2_point(4, 3); /* Fan3 */
1003 #define device_create_file_sf2_point(client, offset, index) \
1005 device_create_file(&client->dev, \
1006 &sensor_dev_attr_sf2_point##offset##_fan##index.dev_attr); \
1011 show_sf2_level(struct device *dev, struct device_attribute *attr,
1014 struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
1015 int nr = sensor_attr->nr;
1016 int index = sensor_attr->index;
1017 struct w83792d_data *data = w83792d_update_device(dev);
1018 return sprintf(buf, "%d\n",
1019 (((data->sf2_levels[index-1][nr]) * 100) / 15));
1023 store_sf2_level(struct device *dev, struct device_attribute *attr,
1024 const char *buf, size_t count)
1026 struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
1027 int nr = sensor_attr->nr;
1028 int index = sensor_attr->index - 1;
1029 struct i2c_client *client = to_i2c_client(dev);
1030 struct w83792d_data *data = i2c_get_clientdata(client);
1032 u8 mask_tmp=0, level_tmp=0;
1034 val = simple_strtoul(buf, NULL, 10);
1035 data->sf2_levels[index][nr] = SENSORS_LIMIT((val * 15) / 100, 0, 15);
1036 mask_tmp = w83792d_read_value(client, W83792D_REG_LEVELS[index][nr])
1037 & ((nr==3) ? 0xf0 : 0x0f);
1039 level_tmp = data->sf2_levels[index][nr];
1041 level_tmp = data->sf2_levels[index][nr] << 4;
1043 w83792d_write_value(client, W83792D_REG_LEVELS[index][nr], level_tmp | mask_tmp);
1048 #define sysfs_sf2_level(offset, index) \
1049 static SENSOR_DEVICE_ATTR_2(sf2_level##offset##_fan##index, S_IRUGO | S_IWUSR, \
1050 show_sf2_level, store_sf2_level, offset, index);
1052 sysfs_sf2_level(1, 1); /* Fan1 */
1053 sysfs_sf2_level(2, 1); /* Fan1 */
1054 sysfs_sf2_level(3, 1); /* Fan1 */
1055 sysfs_sf2_level(1, 2); /* Fan2 */
1056 sysfs_sf2_level(2, 2); /* Fan2 */
1057 sysfs_sf2_level(3, 2); /* Fan2 */
1058 sysfs_sf2_level(1, 3); /* Fan3 */
1059 sysfs_sf2_level(2, 3); /* Fan3 */
1060 sysfs_sf2_level(3, 3); /* Fan3 */
1062 #define device_create_file_sf2_level(client, offset, index) \
1064 device_create_file(&client->dev, \
1065 &sensor_dev_attr_sf2_level##offset##_fan##index.dev_attr); \
1069 /* This function is called when:
1070 * w83792d_driver is inserted (when this module is loaded), for each
1072 * when a new adapter is inserted (and w83792d_driver is still present) */
1074 w83792d_attach_adapter(struct i2c_adapter *adapter)
1076 if (!(adapter->class & I2C_CLASS_HWMON))
1078 return i2c_probe(adapter, &addr_data, w83792d_detect);
1083 w83792d_create_subclient(struct i2c_adapter *adapter,
1084 struct i2c_client *new_client, int addr,
1085 struct i2c_client **sub_cli)
1088 struct i2c_client *sub_client;
1090 (*sub_cli) = sub_client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
1091 if (!(sub_client)) {
1094 memset(sub_client, 0x00, sizeof(struct i2c_client));
1095 sub_client->addr = 0x48 + addr;
1096 i2c_set_clientdata(sub_client, NULL);
1097 sub_client->adapter = adapter;
1098 sub_client->driver = &w83792d_driver;
1099 sub_client->flags = 0;
1100 strlcpy(sub_client->name, "w83792d subclient", I2C_NAME_SIZE);
1101 if ((err = i2c_attach_client(sub_client))) {
1102 dev_err(&new_client->dev, "subclient registration "
1103 "at address 0x%x failed\n", sub_client->addr);
1112 w83792d_detect_subclients(struct i2c_adapter *adapter, int address, int kind,
1113 struct i2c_client *new_client)
1117 struct w83792d_data *data = i2c_get_clientdata(new_client);
1119 id = i2c_adapter_id(adapter);
1120 if (force_subclients[0] == id && force_subclients[1] == address) {
1121 for (i = 2; i <= 3; i++) {
1122 if (force_subclients[i] < 0x48 ||
1123 force_subclients[i] > 0x4f) {
1124 dev_err(&new_client->dev, "invalid subclient "
1125 "address %d; must be 0x48-0x4f\n",
1126 force_subclients[i]);
1131 w83792d_write_value(new_client, W83792D_REG_I2C_SUBADDR,
1132 (force_subclients[2] & 0x07) |
1133 ((force_subclients[3] & 0x07) << 4));
1136 val = w83792d_read_value(new_client, W83792D_REG_I2C_SUBADDR);
1137 if (!(val & 0x08)) {
1138 err = w83792d_create_subclient(adapter, new_client, val & 0x7,
1143 if (!(val & 0x80)) {
1144 if ((data->lm75[0] != NULL) &&
1145 ((val & 0x7) == ((val >> 4) & 0x7))) {
1146 dev_err(&new_client->dev, "duplicate addresses 0x%x, "
1147 "use force_subclient\n", data->lm75[0]->addr);
1151 err = w83792d_create_subclient(adapter, new_client,
1152 (val >> 4) & 0x7, &data->lm75[1]);
1159 /* Undo inits in case of errors */
1162 if (data->lm75[0] != NULL) {
1163 i2c_detach_client(data->lm75[0]);
1164 kfree(data->lm75[0]);
1172 w83792d_detect(struct i2c_adapter *adapter, int address, int kind)
1174 int i = 0, val1 = 0, val2;
1175 struct i2c_client *new_client;
1176 struct w83792d_data *data;
1178 const char *client_name = "";
1180 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1184 /* OK. For now, we presume we have a valid client. We now create the
1185 client structure, even though we cannot fill it completely yet.
1186 But it allows us to access w83792d_{read,write}_value. */
1188 if (!(data = kmalloc(sizeof(struct w83792d_data), GFP_KERNEL))) {
1192 memset(data, 0, sizeof(struct w83792d_data));
1194 new_client = &data->client;
1195 i2c_set_clientdata(new_client, data);
1196 new_client->addr = address;
1197 init_MUTEX(&data->lock);
1198 new_client->adapter = adapter;
1199 new_client->driver = &w83792d_driver;
1200 new_client->flags = 0;
1202 /* Now, we do the remaining detection. */
1204 /* The w83792d may be stuck in some other bank than bank 0. This may
1205 make reading other information impossible. Specify a force=... or
1206 force_*=... parameter, and the Winbond will be reset to the right
1209 if (w83792d_read_value(new_client, W83792D_REG_CONFIG) & 0x80) {
1210 dev_warn(&new_client->dev, "Detection failed at step "
1214 val1 = w83792d_read_value(new_client, W83792D_REG_BANK);
1215 val2 = w83792d_read_value(new_client, W83792D_REG_CHIPMAN);
1216 /* Check for Winbond ID if in bank 0 */
1217 if (!(val1 & 0x07)) { /* is Bank0 */
1218 if (((!(val1 & 0x80)) && (val2 != 0xa3)) ||
1219 ((val1 & 0x80) && (val2 != 0x5c))) {
1223 /* If Winbond chip, address of chip and W83792D_REG_I2C_ADDR
1225 if (w83792d_read_value(new_client,
1226 W83792D_REG_I2C_ADDR) != address) {
1227 dev_warn(&new_client->dev, "Detection failed "
1233 /* We have either had a force parameter, or we have already detected the
1234 Winbond. Put it now into bank 0 and Vendor ID High Byte */
1235 w83792d_write_value(new_client,
1237 (w83792d_read_value(new_client,
1238 W83792D_REG_BANK) & 0x78) | 0x80);
1240 /* Determine the chip type. */
1243 val2 = w83792d_read_value(new_client, W83792D_REG_CHIPMAN);
1244 if (val2 != 0x5c) { /* the vendor is NOT Winbond */
1247 val1 = w83792d_read_value(new_client, W83792D_REG_WCHIPID);
1248 if (val1 == 0x7a && address >= 0x2c) {
1252 dev_warn(&new_client->dev,
1253 "w83792d: Ignoring 'force' parameter for"
1254 " unknown chip at adapter %d, address"
1255 " 0x%02x\n", i2c_adapter_id(adapter),
1261 if (kind == w83792d) {
1262 client_name = "w83792d";
1264 dev_err(&new_client->dev, "w83792d: Internal error: unknown"
1265 " kind (%d)?!?", kind);
1269 /* Fill in the remaining client fields and put into the global list */
1270 strlcpy(new_client->name, client_name, I2C_NAME_SIZE);
1274 init_MUTEX(&data->update_lock);
1276 /* Tell the I2C layer a new client has arrived */
1277 if ((err = i2c_attach_client(new_client)))
1280 if ((err = w83792d_detect_subclients(adapter, address,
1284 /* Initialize the chip */
1285 w83792d_init_client(new_client);
1287 /* A few vars need to be filled upon startup */
1288 for (i = 1; i <= 7; i++) {
1289 data->fan_min[i - 1] = w83792d_read_value(new_client,
1290 W83792D_REG_FAN_MIN[i]);
1293 /* Register sysfs hooks */
1294 data->class_dev = hwmon_device_register(&new_client->dev);
1295 if (IS_ERR(data->class_dev)) {
1296 err = PTR_ERR(data->class_dev);
1299 device_create_file_in(new_client, 0);
1300 device_create_file_in(new_client, 1);
1301 device_create_file_in(new_client, 2);
1302 device_create_file_in(new_client, 3);
1303 device_create_file_in(new_client, 4);
1304 device_create_file_in(new_client, 5);
1305 device_create_file_in(new_client, 6);
1306 device_create_file_in(new_client, 7);
1307 device_create_file_in(new_client, 8);
1309 device_create_file_fan(new_client, 1);
1310 device_create_file_fan(new_client, 2);
1311 device_create_file_fan(new_client, 3);
1312 device_create_file_fan(new_client, 4);
1313 device_create_file_fan(new_client, 5);
1314 device_create_file_fan(new_client, 6);
1315 device_create_file_fan(new_client, 7);
1317 device_create_file_temp1(new_client); /* Temp1 */
1318 device_create_file_temp_add(new_client, 2); /* Temp2 */
1319 device_create_file_temp_add(new_client, 3); /* Temp3 */
1321 device_create_file_alarms(new_client);
1323 device_create_file_pwm(new_client, 1);
1324 device_create_file_pwm(new_client, 2);
1325 device_create_file_pwm(new_client, 3);
1327 device_create_file_pwmenable(new_client, 1);
1328 device_create_file_pwmenable(new_client, 2);
1329 device_create_file_pwmenable(new_client, 3);
1331 device_create_file_pwm_mode(new_client, 1);
1332 device_create_file_pwm_mode(new_client, 2);
1333 device_create_file_pwm_mode(new_client, 3);
1335 device_create_file_chassis(new_client);
1336 device_create_file_chassis_clear(new_client);
1338 device_create_file_thermal_cruise(new_client, 1);
1339 device_create_file_thermal_cruise(new_client, 2);
1340 device_create_file_thermal_cruise(new_client, 3);
1342 device_create_file_tolerance(new_client, 1);
1343 device_create_file_tolerance(new_client, 2);
1344 device_create_file_tolerance(new_client, 3);
1346 device_create_file_sf2_point(new_client, 1, 1); /* Fan1 */
1347 device_create_file_sf2_point(new_client, 2, 1); /* Fan1 */
1348 device_create_file_sf2_point(new_client, 3, 1); /* Fan1 */
1349 device_create_file_sf2_point(new_client, 4, 1); /* Fan1 */
1350 device_create_file_sf2_point(new_client, 1, 2); /* Fan2 */
1351 device_create_file_sf2_point(new_client, 2, 2); /* Fan2 */
1352 device_create_file_sf2_point(new_client, 3, 2); /* Fan2 */
1353 device_create_file_sf2_point(new_client, 4, 2); /* Fan2 */
1354 device_create_file_sf2_point(new_client, 1, 3); /* Fan3 */
1355 device_create_file_sf2_point(new_client, 2, 3); /* Fan3 */
1356 device_create_file_sf2_point(new_client, 3, 3); /* Fan3 */
1357 device_create_file_sf2_point(new_client, 4, 3); /* Fan3 */
1359 device_create_file_sf2_level(new_client, 1, 1); /* Fan1 */
1360 device_create_file_sf2_level(new_client, 2, 1); /* Fan1 */
1361 device_create_file_sf2_level(new_client, 3, 1); /* Fan1 */
1362 device_create_file_sf2_level(new_client, 1, 2); /* Fan2 */
1363 device_create_file_sf2_level(new_client, 2, 2); /* Fan2 */
1364 device_create_file_sf2_level(new_client, 3, 2); /* Fan2 */
1365 device_create_file_sf2_level(new_client, 1, 3); /* Fan3 */
1366 device_create_file_sf2_level(new_client, 2, 3); /* Fan3 */
1367 device_create_file_sf2_level(new_client, 3, 3); /* Fan3 */
1372 if (data->lm75[0] != NULL) {
1373 i2c_detach_client(data->lm75[0]);
1374 kfree(data->lm75[0]);
1376 if (data->lm75[1] != NULL) {
1377 i2c_detach_client(data->lm75[1]);
1378 kfree(data->lm75[1]);
1381 i2c_detach_client(new_client);
1389 w83792d_detach_client(struct i2c_client *client)
1391 struct w83792d_data *data = i2c_get_clientdata(client);
1396 hwmon_device_unregister(data->class_dev);
1398 if ((err = i2c_detach_client(client)))
1411 /* The SMBus locks itself, usually, but nothing may access the Winbond between
1412 bank switches. ISA access must always be locked explicitly!
1413 We ignore the W83792D BUSY flag at this moment - it could lead to deadlocks,
1414 would slow down the W83792D access and should not be necessary.
1415 There are some ugly typecasts here, but the good news is - they should
1416 nowhere else be necessary! */
1418 w83792d_read_value(struct i2c_client *client, u8 reg)
1421 res = i2c_smbus_read_byte_data(client, reg);
1427 w83792d_write_value(struct i2c_client *client, u8 reg, u8 value)
1429 i2c_smbus_write_byte_data(client, reg, value);
1433 /* Called when we have found a new W83792D. It should set limits, etc. */
1435 w83792d_init_client(struct i2c_client *client)
1437 u8 temp2_cfg, temp3_cfg, vid_in_b;
1440 w83792d_write_value(client, W83792D_REG_CONFIG, 0x80);
1442 /* Clear the bit6 of W83792D_REG_VID_IN_B(set it into 0):
1443 W83792D_REG_VID_IN_B bit6 = 0: the high/low limit of
1444 vin0/vin1 can be modified by user;
1445 W83792D_REG_VID_IN_B bit6 = 1: the high/low limit of
1446 vin0/vin1 auto-updated, can NOT be modified by user. */
1447 vid_in_b = w83792d_read_value(client, W83792D_REG_VID_IN_B);
1448 w83792d_write_value(client, W83792D_REG_VID_IN_B,
1451 temp2_cfg = w83792d_read_value(client, W83792D_REG_TEMP2_CONFIG);
1452 temp3_cfg = w83792d_read_value(client, W83792D_REG_TEMP3_CONFIG);
1453 w83792d_write_value(client, W83792D_REG_TEMP2_CONFIG,
1455 w83792d_write_value(client, W83792D_REG_TEMP3_CONFIG,
1458 /* Start monitoring */
1459 w83792d_write_value(client, W83792D_REG_CONFIG,
1460 (w83792d_read_value(client,
1461 W83792D_REG_CONFIG) & 0xf7)
1465 static struct w83792d_data *w83792d_update_device(struct device *dev)
1467 struct i2c_client *client = to_i2c_client(dev);
1468 struct w83792d_data *data = i2c_get_clientdata(client);
1470 u8 reg_array_tmp[4], pwm_array_tmp[7], reg_tmp;
1472 down(&data->update_lock);
1475 (jiffies - data->last_updated, (unsigned long) (HZ * 3))
1476 || time_before(jiffies, data->last_updated) || !data->valid) {
1477 dev_dbg(dev, "Starting device update\n");
1479 /* Update the voltages measured value and limits */
1480 for (i = 0; i < 9; i++) {
1481 data->in[i] = w83792d_read_value(client,
1483 data->in_max[i] = w83792d_read_value(client,
1484 W83792D_REG_IN_MAX[i]);
1485 data->in_min[i] = w83792d_read_value(client,
1486 W83792D_REG_IN_MIN[i]);
1488 data->low_bits[0] = w83792d_read_value(client,
1489 W83792D_REG_LOW_BITS1);
1490 data->low_bits[1] = w83792d_read_value(client,
1491 W83792D_REG_LOW_BITS2);
1492 for (i = 0; i < 7; i++) {
1493 /* Update the Fan measured value and limits */
1494 data->fan[i] = w83792d_read_value(client,
1495 W83792D_REG_FAN[i]);
1496 data->fan_min[i] = w83792d_read_value(client,
1497 W83792D_REG_FAN_MIN[i]);
1498 /* Update the PWM/DC Value and PWM/DC flag */
1499 pwm_array_tmp[i] = w83792d_read_value(client,
1500 W83792D_REG_PWM[i]);
1501 data->pwm[i] = pwm_array_tmp[i] & 0x0f;
1502 data->pwm_mode[i] = (pwm_array_tmp[i] >> 7) & 0x01;
1505 reg_tmp = w83792d_read_value(client, W83792D_REG_FAN_CFG);
1506 data->pwmenable[0] = reg_tmp & 0x03;
1507 data->pwmenable[1] = (reg_tmp>>2) & 0x03;
1508 data->pwmenable[2] = (reg_tmp>>4) & 0x03;
1510 for (i = 0; i < 3; i++) {
1511 data->temp1[i] = w83792d_read_value(client,
1512 W83792D_REG_TEMP1[i]);
1514 for (i = 0; i < 2; i++) {
1515 for (j = 0; j < 6; j++) {
1516 data->temp_add[i][j] = w83792d_read_value(
1517 client,W83792D_REG_TEMP_ADD[i][j]);
1521 /* Update the Fan Divisor */
1522 for (i = 0; i < 4; i++) {
1523 reg_array_tmp[i] = w83792d_read_value(client,
1524 W83792D_REG_FAN_DIV[i]);
1526 data->fan_div[0] = reg_array_tmp[0] & 0x07;
1527 data->fan_div[1] = (reg_array_tmp[0] >> 4) & 0x07;
1528 data->fan_div[2] = reg_array_tmp[1] & 0x07;
1529 data->fan_div[3] = (reg_array_tmp[1] >> 4) & 0x07;
1530 data->fan_div[4] = reg_array_tmp[2] & 0x07;
1531 data->fan_div[5] = (reg_array_tmp[2] >> 4) & 0x07;
1532 data->fan_div[6] = reg_array_tmp[3] & 0x07;
1534 /* Update the realtime status */
1535 data->alarms = w83792d_read_value(client, W83792D_REG_ALARM1) +
1536 (w83792d_read_value(client, W83792D_REG_ALARM2) << 8) +
1537 (w83792d_read_value(client, W83792D_REG_ALARM3) << 16);
1539 /* Update CaseOpen status and it's CLR_CHS. */
1540 data->chassis = (w83792d_read_value(client,
1541 W83792D_REG_CHASSIS) >> 5) & 0x01;
1542 data->chassis_clear = (w83792d_read_value(client,
1543 W83792D_REG_CHASSIS_CLR) >> 7) & 0x01;
1545 /* Update Thermal Cruise/Smart Fan I target value */
1546 for (i = 0; i < 3; i++) {
1547 data->thermal_cruise[i] =
1548 w83792d_read_value(client,
1549 W83792D_REG_THERMAL[i]) & 0x7f;
1552 /* Update Smart Fan I/II tolerance */
1553 reg_tmp = w83792d_read_value(client, W83792D_REG_TOLERANCE[0]);
1554 data->tolerance[0] = reg_tmp & 0x0f;
1555 data->tolerance[1] = (reg_tmp >> 4) & 0x0f;
1556 data->tolerance[2] = w83792d_read_value(client,
1557 W83792D_REG_TOLERANCE[2]) & 0x0f;
1559 /* Update Smart Fan II temperature points */
1560 for (i = 0; i < 3; i++) {
1561 for (j = 0; j < 4; j++) {
1562 data->sf2_points[i][j] = w83792d_read_value(
1563 client,W83792D_REG_POINTS[i][j]) & 0x7f;
1567 /* Update Smart Fan II duty cycle levels */
1568 for (i = 0; i < 3; i++) {
1569 reg_tmp = w83792d_read_value(client,
1570 W83792D_REG_LEVELS[i][0]);
1571 data->sf2_levels[i][0] = reg_tmp & 0x0f;
1572 data->sf2_levels[i][1] = (reg_tmp >> 4) & 0x0f;
1573 reg_tmp = w83792d_read_value(client,
1574 W83792D_REG_LEVELS[i][2]);
1575 data->sf2_levels[i][2] = (reg_tmp >> 4) & 0x0f;
1576 data->sf2_levels[i][3] = reg_tmp & 0x0f;
1579 data->last_updated = jiffies;
1583 up(&data->update_lock);
1586 w83792d_print_debug(data, dev);
1593 static void w83792d_print_debug(struct w83792d_data *data, struct device *dev)
1596 dev_dbg(dev, "==========The following is the debug message...========\n");
1597 dev_dbg(dev, "9 set of Voltages: =====>\n");
1598 for (i=0; i<9; i++) {
1599 dev_dbg(dev, "vin[%d] is: 0x%x\n", i, data->in[i]);
1600 dev_dbg(dev, "vin[%d] max is: 0x%x\n", i, data->in_max[i]);
1601 dev_dbg(dev, "vin[%d] min is: 0x%x\n", i, data->in_min[i]);
1603 dev_dbg(dev, "Low Bit1 is: 0x%x\n", data->low_bits[0]);
1604 dev_dbg(dev, "Low Bit2 is: 0x%x\n", data->low_bits[1]);
1605 dev_dbg(dev, "7 set of Fan Counts and Duty Cycles: =====>\n");
1606 for (i=0; i<7; i++) {
1607 dev_dbg(dev, "fan[%d] is: 0x%x\n", i, data->fan[i]);
1608 dev_dbg(dev, "fan[%d] min is: 0x%x\n", i, data->fan_min[i]);
1609 dev_dbg(dev, "pwm[%d] is: 0x%x\n", i, data->pwm[i]);
1610 dev_dbg(dev, "pwm_mode[%d] is: 0x%x\n", i, data->pwm_mode[i]);
1612 dev_dbg(dev, "3 set of Temperatures: =====>\n");
1613 for (i=0; i<3; i++) {
1614 dev_dbg(dev, "temp1[%d] is: 0x%x\n", i, data->temp1[i]);
1617 for (i=0; i<2; i++) {
1618 for (j=0; j<6; j++) {
1619 dev_dbg(dev, "temp_add[%d][%d] is: 0x%x\n", i, j,
1620 data->temp_add[i][j]);
1624 for (i=0; i<7; i++) {
1625 dev_dbg(dev, "fan_div[%d] is: 0x%x\n", i, data->fan_div[i]);
1627 dev_dbg(dev, "==========End of the debug message...==================\n");
1633 sensors_w83792d_init(void)
1635 return i2c_add_driver(&w83792d_driver);
1639 sensors_w83792d_exit(void)
1641 i2c_del_driver(&w83792d_driver);
1644 MODULE_AUTHOR("Chunhao Huang @ Winbond <DZShen@Winbond.com.tw>");
1645 MODULE_DESCRIPTION("W83792AD/D driver for linux-2.6");
1646 MODULE_LICENSE("GPL");
1648 module_init(sensors_w83792d_init);
1649 module_exit(sensors_w83792d_exit);