2 w83791d.c - Part of lm_sensors, Linux kernel modules for hardware
5 Copyright (C) 2006-2007 Charles Spirakis <bezaur@gmail.com>
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 Supports following chips:
25 Chip #vin #fanin #pwm #temp wchipid vendid i2c ISA
26 w83791d 10 5 3 3 0x71 0x5ca3 yes no
28 The w83791d chip appears to be part way between the 83781d and the
29 83792d. Thus, this file is derived from both the w83792d.c and
32 The w83791g chip is the same as the w83791d but lead-free.
35 #include <linux/module.h>
36 #include <linux/init.h>
37 #include <linux/slab.h>
38 #include <linux/i2c.h>
39 #include <linux/hwmon.h>
40 #include <linux/hwmon-vid.h>
41 #include <linux/hwmon-sysfs.h>
42 #include <linux/err.h>
43 #include <linux/mutex.h>
45 #define NUMBER_OF_VIN 10
46 #define NUMBER_OF_FANIN 5
47 #define NUMBER_OF_TEMPIN 3
49 /* Addresses to scan */
50 static unsigned short normal_i2c
[] = { 0x2c, 0x2d, 0x2e, 0x2f, I2C_CLIENT_END
};
52 /* Insmod parameters */
53 I2C_CLIENT_INSMOD_1(w83791d
);
54 I2C_CLIENT_MODULE_PARM(force_subclients
, "List of subclient addresses: "
55 "{bus, clientaddr, subclientaddr1, subclientaddr2}");
58 module_param(reset
, bool, 0);
59 MODULE_PARM_DESC(reset
, "Set to one to force a hardware chip reset");
62 module_param(init
, bool, 0);
63 MODULE_PARM_DESC(init
, "Set to one to force extra software initialization");
65 /* The W83791D registers */
66 static const u8 W83791D_REG_IN
[NUMBER_OF_VIN
] = {
67 0x20, /* VCOREA in DataSheet */
68 0x21, /* VINR0 in DataSheet */
69 0x22, /* +3.3VIN in DataSheet */
70 0x23, /* VDD5V in DataSheet */
71 0x24, /* +12VIN in DataSheet */
72 0x25, /* -12VIN in DataSheet */
73 0x26, /* -5VIN in DataSheet */
74 0xB0, /* 5VSB in DataSheet */
75 0xB1, /* VBAT in DataSheet */
76 0xB2 /* VINR1 in DataSheet */
79 static const u8 W83791D_REG_IN_MAX
[NUMBER_OF_VIN
] = {
80 0x2B, /* VCOREA High Limit in DataSheet */
81 0x2D, /* VINR0 High Limit in DataSheet */
82 0x2F, /* +3.3VIN High Limit in DataSheet */
83 0x31, /* VDD5V High Limit in DataSheet */
84 0x33, /* +12VIN High Limit in DataSheet */
85 0x35, /* -12VIN High Limit in DataSheet */
86 0x37, /* -5VIN High Limit in DataSheet */
87 0xB4, /* 5VSB High Limit in DataSheet */
88 0xB6, /* VBAT High Limit in DataSheet */
89 0xB8 /* VINR1 High Limit in DataSheet */
91 static const u8 W83791D_REG_IN_MIN
[NUMBER_OF_VIN
] = {
92 0x2C, /* VCOREA Low Limit in DataSheet */
93 0x2E, /* VINR0 Low Limit in DataSheet */
94 0x30, /* +3.3VIN Low Limit in DataSheet */
95 0x32, /* VDD5V Low Limit in DataSheet */
96 0x34, /* +12VIN Low Limit in DataSheet */
97 0x36, /* -12VIN Low Limit in DataSheet */
98 0x38, /* -5VIN Low Limit in DataSheet */
99 0xB5, /* 5VSB Low Limit in DataSheet */
100 0xB7, /* VBAT Low Limit in DataSheet */
101 0xB9 /* VINR1 Low Limit in DataSheet */
103 static const u8 W83791D_REG_FAN
[NUMBER_OF_FANIN
] = {
104 0x28, /* FAN 1 Count in DataSheet */
105 0x29, /* FAN 2 Count in DataSheet */
106 0x2A, /* FAN 3 Count in DataSheet */
107 0xBA, /* FAN 4 Count in DataSheet */
108 0xBB, /* FAN 5 Count in DataSheet */
110 static const u8 W83791D_REG_FAN_MIN
[NUMBER_OF_FANIN
] = {
111 0x3B, /* FAN 1 Count Low Limit in DataSheet */
112 0x3C, /* FAN 2 Count Low Limit in DataSheet */
113 0x3D, /* FAN 3 Count Low Limit in DataSheet */
114 0xBC, /* FAN 4 Count Low Limit in DataSheet */
115 0xBD, /* FAN 5 Count Low Limit in DataSheet */
118 static const u8 W83791D_REG_FAN_CFG
[2] = {
119 0x84, /* FAN 1/2 configuration */
120 0x95, /* FAN 3 configuration */
123 static const u8 W83791D_REG_FAN_DIV
[3] = {
124 0x47, /* contains FAN1 and FAN2 Divisor */
125 0x4b, /* contains FAN3 Divisor */
126 0x5C, /* contains FAN4 and FAN5 Divisor */
129 #define W83791D_REG_BANK 0x4E
130 #define W83791D_REG_TEMP2_CONFIG 0xC2
131 #define W83791D_REG_TEMP3_CONFIG 0xCA
133 static const u8 W83791D_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 W83791D_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 #define W83791D_REG_BEEP_CONFIG 0x4D
156 static const u8 W83791D_REG_BEEP_CTRL
[3] = {
157 0x56, /* BEEP Control Register 1 */
158 0x57, /* BEEP Control Register 2 */
159 0xA3, /* BEEP Control Register 3 */
162 #define W83791D_REG_CONFIG 0x40
163 #define W83791D_REG_VID_FANDIV 0x47
164 #define W83791D_REG_DID_VID4 0x49
165 #define W83791D_REG_WCHIPID 0x58
166 #define W83791D_REG_CHIPMAN 0x4F
167 #define W83791D_REG_PIN 0x4B
168 #define W83791D_REG_I2C_SUBADDR 0x4A
170 #define W83791D_REG_ALARM1 0xA9 /* realtime status register1 */
171 #define W83791D_REG_ALARM2 0xAA /* realtime status register2 */
172 #define W83791D_REG_ALARM3 0xAB /* realtime status register3 */
174 #define W83791D_REG_VBAT 0x5D
175 #define W83791D_REG_I2C_ADDR 0x48
177 /* The SMBus locks itself. The Winbond W83791D has a bank select register
178 (index 0x4e), but the driver only accesses registers in bank 0. Since
179 we don't switch banks, we don't need any special code to handle
180 locking access between bank switches */
181 static inline int w83791d_read(struct i2c_client
*client
, u8 reg
)
183 return i2c_smbus_read_byte_data(client
, reg
);
186 static inline int w83791d_write(struct i2c_client
*client
, u8 reg
, u8 value
)
188 return i2c_smbus_write_byte_data(client
, reg
, value
);
191 /* The analog voltage inputs have 16mV LSB. Since the sysfs output is
192 in mV as would be measured on the chip input pin, need to just
193 multiply/divide by 16 to translate from/to register values. */
194 #define IN_TO_REG(val) (SENSORS_LIMIT((((val) + 8) / 16), 0, 255))
195 #define IN_FROM_REG(val) ((val) * 16)
197 static u8
fan_to_reg(long rpm
, int div
)
201 rpm
= SENSORS_LIMIT(rpm
, 1, 1000000);
202 return SENSORS_LIMIT((1350000 + rpm
* div
/ 2) / (rpm
* div
), 1, 254);
205 #define FAN_FROM_REG(val,div) ((val) == 0 ? -1 : \
206 ((val) == 255 ? 0 : \
207 1350000 / ((val) * (div))))
209 /* for temp1 which is 8-bit resolution, LSB = 1 degree Celsius */
210 #define TEMP1_FROM_REG(val) ((val) * 1000)
211 #define TEMP1_TO_REG(val) ((val) <= -128000 ? -128 : \
212 (val) >= 127000 ? 127 : \
213 (val) < 0 ? ((val) - 500) / 1000 : \
214 ((val) + 500) / 1000)
216 /* for temp2 and temp3 which are 9-bit resolution, LSB = 0.5 degree Celsius
217 Assumes the top 8 bits are the integral amount and the bottom 8 bits
218 are the fractional amount. Since we only have 0.5 degree resolution,
219 the bottom 7 bits will always be zero */
220 #define TEMP23_FROM_REG(val) ((val) / 128 * 500)
221 #define TEMP23_TO_REG(val) ((val) <= -128000 ? 0x8000 : \
222 (val) >= 127500 ? 0x7F80 : \
223 (val) < 0 ? ((val) - 250) / 500 * 128 : \
224 ((val) + 250) / 500 * 128)
227 #define BEEP_MASK_TO_REG(val) ((val) & 0xffffff)
228 #define BEEP_MASK_FROM_REG(val) ((val) & 0xffffff)
230 #define DIV_FROM_REG(val) (1 << (val))
232 static u8
div_to_reg(int nr
, long val
)
237 /* first three fan's divisor max out at 8, rest max out at 128 */
238 max
= (nr
< 3) ? 8 : 128;
239 val
= SENSORS_LIMIT(val
, 1, max
) >> 1;
240 for (i
= 0; i
< 7; i
++) {
248 struct w83791d_data
{
249 struct i2c_client client
;
250 struct device
*hwmon_dev
;
251 struct mutex update_lock
;
253 char valid
; /* !=0 if following fields are valid */
254 unsigned long last_updated
; /* In jiffies */
256 /* array of 2 pointers to subclients */
257 struct i2c_client
*lm75
[2];
260 u8 in
[NUMBER_OF_VIN
]; /* Register value */
261 u8 in_max
[NUMBER_OF_VIN
]; /* Register value */
262 u8 in_min
[NUMBER_OF_VIN
]; /* Register value */
265 u8 fan
[NUMBER_OF_FANIN
]; /* Register value */
266 u8 fan_min
[NUMBER_OF_FANIN
]; /* Register value */
267 u8 fan_div
[NUMBER_OF_FANIN
]; /* Register encoding, shifted right */
269 /* Temperature sensors */
271 s8 temp1
[3]; /* current, over, thyst */
272 s16 temp_add
[2][3]; /* fixed point value. Top 8 bits are the
273 integral part, bottom 8 bits are the
274 fractional part. We only use the top
275 9 bits as the resolution is only
276 to the 0.5 degree C...
277 two sensors with three values
281 u32 alarms
; /* realtime status register encoding,combined */
282 u8 beep_enable
; /* Global beep enable */
283 u32 beep_mask
; /* Mask off specific beeps */
284 u8 vid
; /* Register encoding, combined */
285 u8 vrm
; /* hwmon-vid */
288 static int w83791d_attach_adapter(struct i2c_adapter
*adapter
);
289 static int w83791d_detect(struct i2c_adapter
*adapter
, int address
, int kind
);
290 static int w83791d_detach_client(struct i2c_client
*client
);
292 static int w83791d_read(struct i2c_client
*client
, u8
register);
293 static int w83791d_write(struct i2c_client
*client
, u8
register, u8 value
);
294 static struct w83791d_data
*w83791d_update_device(struct device
*dev
);
297 static void w83791d_print_debug(struct w83791d_data
*data
, struct device
*dev
);
300 static void w83791d_init_client(struct i2c_client
*client
);
302 static struct i2c_driver w83791d_driver
= {
306 .attach_adapter
= w83791d_attach_adapter
,
307 .detach_client
= w83791d_detach_client
,
310 /* following are the sysfs callback functions */
311 #define show_in_reg(reg) \
312 static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
315 struct sensor_device_attribute *sensor_attr = \
316 to_sensor_dev_attr(attr); \
317 struct w83791d_data *data = w83791d_update_device(dev); \
318 int nr = sensor_attr->index; \
319 return sprintf(buf,"%d\n", IN_FROM_REG(data->reg[nr])); \
326 #define store_in_reg(REG, reg) \
327 static ssize_t store_in_##reg(struct device *dev, \
328 struct device_attribute *attr, \
329 const char *buf, size_t count) \
331 struct sensor_device_attribute *sensor_attr = \
332 to_sensor_dev_attr(attr); \
333 struct i2c_client *client = to_i2c_client(dev); \
334 struct w83791d_data *data = i2c_get_clientdata(client); \
335 unsigned long val = simple_strtoul(buf, NULL, 10); \
336 int nr = sensor_attr->index; \
338 mutex_lock(&data->update_lock); \
339 data->in_##reg[nr] = IN_TO_REG(val); \
340 w83791d_write(client, W83791D_REG_IN_##REG[nr], data->in_##reg[nr]); \
341 mutex_unlock(&data->update_lock); \
345 store_in_reg(MIN
, min
);
346 store_in_reg(MAX
, max
);
348 static struct sensor_device_attribute sda_in_input
[] = {
349 SENSOR_ATTR(in0_input
, S_IRUGO
, show_in
, NULL
, 0),
350 SENSOR_ATTR(in1_input
, S_IRUGO
, show_in
, NULL
, 1),
351 SENSOR_ATTR(in2_input
, S_IRUGO
, show_in
, NULL
, 2),
352 SENSOR_ATTR(in3_input
, S_IRUGO
, show_in
, NULL
, 3),
353 SENSOR_ATTR(in4_input
, S_IRUGO
, show_in
, NULL
, 4),
354 SENSOR_ATTR(in5_input
, S_IRUGO
, show_in
, NULL
, 5),
355 SENSOR_ATTR(in6_input
, S_IRUGO
, show_in
, NULL
, 6),
356 SENSOR_ATTR(in7_input
, S_IRUGO
, show_in
, NULL
, 7),
357 SENSOR_ATTR(in8_input
, S_IRUGO
, show_in
, NULL
, 8),
358 SENSOR_ATTR(in9_input
, S_IRUGO
, show_in
, NULL
, 9),
361 static struct sensor_device_attribute sda_in_min
[] = {
362 SENSOR_ATTR(in0_min
, S_IWUSR
| S_IRUGO
, show_in_min
, store_in_min
, 0),
363 SENSOR_ATTR(in1_min
, S_IWUSR
| S_IRUGO
, show_in_min
, store_in_min
, 1),
364 SENSOR_ATTR(in2_min
, S_IWUSR
| S_IRUGO
, show_in_min
, store_in_min
, 2),
365 SENSOR_ATTR(in3_min
, S_IWUSR
| S_IRUGO
, show_in_min
, store_in_min
, 3),
366 SENSOR_ATTR(in4_min
, S_IWUSR
| S_IRUGO
, show_in_min
, store_in_min
, 4),
367 SENSOR_ATTR(in5_min
, S_IWUSR
| S_IRUGO
, show_in_min
, store_in_min
, 5),
368 SENSOR_ATTR(in6_min
, S_IWUSR
| S_IRUGO
, show_in_min
, store_in_min
, 6),
369 SENSOR_ATTR(in7_min
, S_IWUSR
| S_IRUGO
, show_in_min
, store_in_min
, 7),
370 SENSOR_ATTR(in8_min
, S_IWUSR
| S_IRUGO
, show_in_min
, store_in_min
, 8),
371 SENSOR_ATTR(in9_min
, S_IWUSR
| S_IRUGO
, show_in_min
, store_in_min
, 9),
374 static struct sensor_device_attribute sda_in_max
[] = {
375 SENSOR_ATTR(in0_max
, S_IWUSR
| S_IRUGO
, show_in_max
, store_in_max
, 0),
376 SENSOR_ATTR(in1_max
, S_IWUSR
| S_IRUGO
, show_in_max
, store_in_max
, 1),
377 SENSOR_ATTR(in2_max
, S_IWUSR
| S_IRUGO
, show_in_max
, store_in_max
, 2),
378 SENSOR_ATTR(in3_max
, S_IWUSR
| S_IRUGO
, show_in_max
, store_in_max
, 3),
379 SENSOR_ATTR(in4_max
, S_IWUSR
| S_IRUGO
, show_in_max
, store_in_max
, 4),
380 SENSOR_ATTR(in5_max
, S_IWUSR
| S_IRUGO
, show_in_max
, store_in_max
, 5),
381 SENSOR_ATTR(in6_max
, S_IWUSR
| S_IRUGO
, show_in_max
, store_in_max
, 6),
382 SENSOR_ATTR(in7_max
, S_IWUSR
| S_IRUGO
, show_in_max
, store_in_max
, 7),
383 SENSOR_ATTR(in8_max
, S_IWUSR
| S_IRUGO
, show_in_max
, store_in_max
, 8),
384 SENSOR_ATTR(in9_max
, S_IWUSR
| S_IRUGO
, show_in_max
, store_in_max
, 9),
388 static ssize_t
show_beep(struct device
*dev
, struct device_attribute
*attr
,
391 struct sensor_device_attribute
*sensor_attr
=
392 to_sensor_dev_attr(attr
);
393 struct w83791d_data
*data
= w83791d_update_device(dev
);
394 int bitnr
= sensor_attr
->index
;
396 return sprintf(buf
, "%d\n", (data
->beep_mask
>> bitnr
) & 1);
399 static ssize_t
store_beep(struct device
*dev
, struct device_attribute
*attr
,
400 const char *buf
, size_t count
)
402 struct sensor_device_attribute
*sensor_attr
=
403 to_sensor_dev_attr(attr
);
404 struct i2c_client
*client
= to_i2c_client(dev
);
405 struct w83791d_data
*data
= i2c_get_clientdata(client
);
406 int bitnr
= sensor_attr
->index
;
407 int bytenr
= bitnr
/ 8;
408 long val
= simple_strtol(buf
, NULL
, 10) ? 1 : 0;
410 mutex_lock(&data
->update_lock
);
412 data
->beep_mask
&= ~(0xff << (bytenr
* 8));
413 data
->beep_mask
|= w83791d_read(client
, W83791D_REG_BEEP_CTRL
[bytenr
])
416 data
->beep_mask
&= ~(1 << bitnr
);
417 data
->beep_mask
|= val
<< bitnr
;
419 w83791d_write(client
, W83791D_REG_BEEP_CTRL
[bytenr
],
420 (data
->beep_mask
>> (bytenr
* 8)) & 0xff);
422 mutex_unlock(&data
->update_lock
);
427 static ssize_t
show_alarm(struct device
*dev
, struct device_attribute
*attr
,
430 struct sensor_device_attribute
*sensor_attr
=
431 to_sensor_dev_attr(attr
);
432 struct w83791d_data
*data
= w83791d_update_device(dev
);
433 int bitnr
= sensor_attr
->index
;
435 return sprintf(buf
, "%d\n", (data
->alarms
>> bitnr
) & 1);
438 /* Note: The bitmask for the beep enable/disable is different than
439 the bitmask for the alarm. */
440 static struct sensor_device_attribute sda_in_beep
[] = {
441 SENSOR_ATTR(in0_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 0),
442 SENSOR_ATTR(in1_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 13),
443 SENSOR_ATTR(in2_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 2),
444 SENSOR_ATTR(in3_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 3),
445 SENSOR_ATTR(in4_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 8),
446 SENSOR_ATTR(in5_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 9),
447 SENSOR_ATTR(in6_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 10),
448 SENSOR_ATTR(in7_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 16),
449 SENSOR_ATTR(in8_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 17),
450 SENSOR_ATTR(in9_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 14),
453 static struct sensor_device_attribute sda_in_alarm
[] = {
454 SENSOR_ATTR(in0_alarm
, S_IRUGO
, show_alarm
, NULL
, 0),
455 SENSOR_ATTR(in1_alarm
, S_IRUGO
, show_alarm
, NULL
, 1),
456 SENSOR_ATTR(in2_alarm
, S_IRUGO
, show_alarm
, NULL
, 2),
457 SENSOR_ATTR(in3_alarm
, S_IRUGO
, show_alarm
, NULL
, 3),
458 SENSOR_ATTR(in4_alarm
, S_IRUGO
, show_alarm
, NULL
, 8),
459 SENSOR_ATTR(in5_alarm
, S_IRUGO
, show_alarm
, NULL
, 9),
460 SENSOR_ATTR(in6_alarm
, S_IRUGO
, show_alarm
, NULL
, 10),
461 SENSOR_ATTR(in7_alarm
, S_IRUGO
, show_alarm
, NULL
, 19),
462 SENSOR_ATTR(in8_alarm
, S_IRUGO
, show_alarm
, NULL
, 20),
463 SENSOR_ATTR(in9_alarm
, S_IRUGO
, show_alarm
, NULL
, 14),
466 #define show_fan_reg(reg) \
467 static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
470 struct sensor_device_attribute *sensor_attr = \
471 to_sensor_dev_attr(attr); \
472 struct w83791d_data *data = w83791d_update_device(dev); \
473 int nr = sensor_attr->index; \
474 return sprintf(buf,"%d\n", \
475 FAN_FROM_REG(data->reg[nr], DIV_FROM_REG(data->fan_div[nr]))); \
479 show_fan_reg(fan_min
);
481 static ssize_t
store_fan_min(struct device
*dev
, struct device_attribute
*attr
,
482 const char *buf
, size_t count
)
484 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
485 struct i2c_client
*client
= to_i2c_client(dev
);
486 struct w83791d_data
*data
= i2c_get_clientdata(client
);
487 unsigned long val
= simple_strtoul(buf
, NULL
, 10);
488 int nr
= sensor_attr
->index
;
490 mutex_lock(&data
->update_lock
);
491 data
->fan_min
[nr
] = fan_to_reg(val
, DIV_FROM_REG(data
->fan_div
[nr
]));
492 w83791d_write(client
, W83791D_REG_FAN_MIN
[nr
], data
->fan_min
[nr
]);
493 mutex_unlock(&data
->update_lock
);
498 static ssize_t
show_fan_div(struct device
*dev
, struct device_attribute
*attr
,
501 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
502 int nr
= sensor_attr
->index
;
503 struct w83791d_data
*data
= w83791d_update_device(dev
);
504 return sprintf(buf
, "%u\n", DIV_FROM_REG(data
->fan_div
[nr
]));
507 /* Note: we save and restore the fan minimum here, because its value is
508 determined in part by the fan divisor. This follows the principle of
509 least suprise; the user doesn't expect the fan minimum to change just
510 because the divisor changed. */
511 static ssize_t
store_fan_div(struct device
*dev
, struct device_attribute
*attr
,
512 const char *buf
, size_t count
)
514 struct sensor_device_attribute
*sensor_attr
= to_sensor_dev_attr(attr
);
515 struct i2c_client
*client
= to_i2c_client(dev
);
516 struct w83791d_data
*data
= i2c_get_clientdata(client
);
517 int nr
= sensor_attr
->index
;
526 min
= FAN_FROM_REG(data
->fan_min
[nr
], DIV_FROM_REG(data
->fan_div
[nr
]));
528 mutex_lock(&data
->update_lock
);
529 data
->fan_div
[nr
] = div_to_reg(nr
, simple_strtoul(buf
, NULL
, 10));
559 dev_warn(dev
, "store_fan_div: Unexpected nr seen: %d\n", nr
);
565 fan_div_reg
= w83791d_read(client
, W83791D_REG_FAN_DIV
[indx
])
567 tmp_fan_div
= (data
->fan_div
[nr
] << new_shift
) & ~keep_mask
;
569 w83791d_write(client
, W83791D_REG_FAN_DIV
[indx
],
570 fan_div_reg
| tmp_fan_div
);
572 /* Restore fan_min */
573 data
->fan_min
[nr
] = fan_to_reg(min
, DIV_FROM_REG(data
->fan_div
[nr
]));
574 w83791d_write(client
, W83791D_REG_FAN_MIN
[nr
], data
->fan_min
[nr
]);
579 mutex_unlock(&data
->update_lock
);
584 static struct sensor_device_attribute sda_fan_input
[] = {
585 SENSOR_ATTR(fan1_input
, S_IRUGO
, show_fan
, NULL
, 0),
586 SENSOR_ATTR(fan2_input
, S_IRUGO
, show_fan
, NULL
, 1),
587 SENSOR_ATTR(fan3_input
, S_IRUGO
, show_fan
, NULL
, 2),
588 SENSOR_ATTR(fan4_input
, S_IRUGO
, show_fan
, NULL
, 3),
589 SENSOR_ATTR(fan5_input
, S_IRUGO
, show_fan
, NULL
, 4),
592 static struct sensor_device_attribute sda_fan_min
[] = {
593 SENSOR_ATTR(fan1_min
, S_IWUSR
| S_IRUGO
,
594 show_fan_min
, store_fan_min
, 0),
595 SENSOR_ATTR(fan2_min
, S_IWUSR
| S_IRUGO
,
596 show_fan_min
, store_fan_min
, 1),
597 SENSOR_ATTR(fan3_min
, S_IWUSR
| S_IRUGO
,
598 show_fan_min
, store_fan_min
, 2),
599 SENSOR_ATTR(fan4_min
, S_IWUSR
| S_IRUGO
,
600 show_fan_min
, store_fan_min
, 3),
601 SENSOR_ATTR(fan5_min
, S_IWUSR
| S_IRUGO
,
602 show_fan_min
, store_fan_min
, 4),
605 static struct sensor_device_attribute sda_fan_div
[] = {
606 SENSOR_ATTR(fan1_div
, S_IWUSR
| S_IRUGO
,
607 show_fan_div
, store_fan_div
, 0),
608 SENSOR_ATTR(fan2_div
, S_IWUSR
| S_IRUGO
,
609 show_fan_div
, store_fan_div
, 1),
610 SENSOR_ATTR(fan3_div
, S_IWUSR
| S_IRUGO
,
611 show_fan_div
, store_fan_div
, 2),
612 SENSOR_ATTR(fan4_div
, S_IWUSR
| S_IRUGO
,
613 show_fan_div
, store_fan_div
, 3),
614 SENSOR_ATTR(fan5_div
, S_IWUSR
| S_IRUGO
,
615 show_fan_div
, store_fan_div
, 4),
618 static struct sensor_device_attribute sda_fan_beep
[] = {
619 SENSOR_ATTR(fan1_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 6),
620 SENSOR_ATTR(fan2_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 7),
621 SENSOR_ATTR(fan3_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 11),
622 SENSOR_ATTR(fan4_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 21),
623 SENSOR_ATTR(fan5_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 22),
626 static struct sensor_device_attribute sda_fan_alarm
[] = {
627 SENSOR_ATTR(fan1_alarm
, S_IRUGO
, show_alarm
, NULL
, 6),
628 SENSOR_ATTR(fan2_alarm
, S_IRUGO
, show_alarm
, NULL
, 7),
629 SENSOR_ATTR(fan3_alarm
, S_IRUGO
, show_alarm
, NULL
, 11),
630 SENSOR_ATTR(fan4_alarm
, S_IRUGO
, show_alarm
, NULL
, 21),
631 SENSOR_ATTR(fan5_alarm
, S_IRUGO
, show_alarm
, NULL
, 22),
634 /* read/write the temperature1, includes measured value and limits */
635 static ssize_t
show_temp1(struct device
*dev
, struct device_attribute
*devattr
,
638 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
639 struct w83791d_data
*data
= w83791d_update_device(dev
);
640 return sprintf(buf
, "%d\n", TEMP1_FROM_REG(data
->temp1
[attr
->index
]));
643 static ssize_t
store_temp1(struct device
*dev
, struct device_attribute
*devattr
,
644 const char *buf
, size_t count
)
646 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
647 struct i2c_client
*client
= to_i2c_client(dev
);
648 struct w83791d_data
*data
= i2c_get_clientdata(client
);
649 long val
= simple_strtol(buf
, NULL
, 10);
650 int nr
= attr
->index
;
652 mutex_lock(&data
->update_lock
);
653 data
->temp1
[nr
] = TEMP1_TO_REG(val
);
654 w83791d_write(client
, W83791D_REG_TEMP1
[nr
], data
->temp1
[nr
]);
655 mutex_unlock(&data
->update_lock
);
659 /* read/write temperature2-3, includes measured value and limits */
660 static ssize_t
show_temp23(struct device
*dev
, struct device_attribute
*devattr
,
663 struct sensor_device_attribute_2
*attr
= to_sensor_dev_attr_2(devattr
);
664 struct w83791d_data
*data
= w83791d_update_device(dev
);
666 int index
= attr
->index
;
667 return sprintf(buf
, "%d\n", TEMP23_FROM_REG(data
->temp_add
[nr
][index
]));
670 static ssize_t
store_temp23(struct device
*dev
,
671 struct device_attribute
*devattr
,
672 const char *buf
, size_t count
)
674 struct sensor_device_attribute_2
*attr
= to_sensor_dev_attr_2(devattr
);
675 struct i2c_client
*client
= to_i2c_client(dev
);
676 struct w83791d_data
*data
= i2c_get_clientdata(client
);
677 long val
= simple_strtol(buf
, NULL
, 10);
679 int index
= attr
->index
;
681 mutex_lock(&data
->update_lock
);
682 data
->temp_add
[nr
][index
] = TEMP23_TO_REG(val
);
683 w83791d_write(client
, W83791D_REG_TEMP_ADD
[nr
][index
* 2],
684 data
->temp_add
[nr
][index
] >> 8);
685 w83791d_write(client
, W83791D_REG_TEMP_ADD
[nr
][index
* 2 + 1],
686 data
->temp_add
[nr
][index
] & 0x80);
687 mutex_unlock(&data
->update_lock
);
692 static struct sensor_device_attribute_2 sda_temp_input
[] = {
693 SENSOR_ATTR_2(temp1_input
, S_IRUGO
, show_temp1
, NULL
, 0, 0),
694 SENSOR_ATTR_2(temp2_input
, S_IRUGO
, show_temp23
, NULL
, 0, 0),
695 SENSOR_ATTR_2(temp3_input
, S_IRUGO
, show_temp23
, NULL
, 1, 0),
698 static struct sensor_device_attribute_2 sda_temp_max
[] = {
699 SENSOR_ATTR_2(temp1_max
, S_IRUGO
| S_IWUSR
,
700 show_temp1
, store_temp1
, 0, 1),
701 SENSOR_ATTR_2(temp2_max
, S_IRUGO
| S_IWUSR
,
702 show_temp23
, store_temp23
, 0, 1),
703 SENSOR_ATTR_2(temp3_max
, S_IRUGO
| S_IWUSR
,
704 show_temp23
, store_temp23
, 1, 1),
707 static struct sensor_device_attribute_2 sda_temp_max_hyst
[] = {
708 SENSOR_ATTR_2(temp1_max_hyst
, S_IRUGO
| S_IWUSR
,
709 show_temp1
, store_temp1
, 0, 2),
710 SENSOR_ATTR_2(temp2_max_hyst
, S_IRUGO
| S_IWUSR
,
711 show_temp23
, store_temp23
, 0, 2),
712 SENSOR_ATTR_2(temp3_max_hyst
, S_IRUGO
| S_IWUSR
,
713 show_temp23
, store_temp23
, 1, 2),
716 /* Note: The bitmask for the beep enable/disable is different than
717 the bitmask for the alarm. */
718 static struct sensor_device_attribute sda_temp_beep
[] = {
719 SENSOR_ATTR(temp1_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 4),
720 SENSOR_ATTR(temp2_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 5),
721 SENSOR_ATTR(temp3_beep
, S_IWUSR
| S_IRUGO
, show_beep
, store_beep
, 1),
724 static struct sensor_device_attribute sda_temp_alarm
[] = {
725 SENSOR_ATTR(temp1_alarm
, S_IRUGO
, show_alarm
, NULL
, 4),
726 SENSOR_ATTR(temp2_alarm
, S_IRUGO
, show_alarm
, NULL
, 5),
727 SENSOR_ATTR(temp3_alarm
, S_IRUGO
, show_alarm
, NULL
, 13),
730 /* get reatime status of all sensors items: voltage, temp, fan */
731 static ssize_t
show_alarms_reg(struct device
*dev
,
732 struct device_attribute
*attr
, char *buf
)
734 struct w83791d_data
*data
= w83791d_update_device(dev
);
735 return sprintf(buf
, "%u\n", data
->alarms
);
738 static DEVICE_ATTR(alarms
, S_IRUGO
, show_alarms_reg
, NULL
);
742 #define GLOBAL_BEEP_ENABLE_SHIFT 15
743 #define GLOBAL_BEEP_ENABLE_MASK (1 << GLOBAL_BEEP_ENABLE_SHIFT)
745 static ssize_t
show_beep_enable(struct device
*dev
,
746 struct device_attribute
*attr
, char *buf
)
748 struct w83791d_data
*data
= w83791d_update_device(dev
);
749 return sprintf(buf
, "%d\n", data
->beep_enable
);
752 static ssize_t
show_beep_mask(struct device
*dev
,
753 struct device_attribute
*attr
, char *buf
)
755 struct w83791d_data
*data
= w83791d_update_device(dev
);
756 return sprintf(buf
, "%d\n", BEEP_MASK_FROM_REG(data
->beep_mask
));
760 static ssize_t
store_beep_mask(struct device
*dev
,
761 struct device_attribute
*attr
,
762 const char *buf
, size_t count
)
764 struct i2c_client
*client
= to_i2c_client(dev
);
765 struct w83791d_data
*data
= i2c_get_clientdata(client
);
766 long val
= simple_strtol(buf
, NULL
, 10);
769 mutex_lock(&data
->update_lock
);
771 /* The beep_enable state overrides any enabling request from
773 data
->beep_mask
= BEEP_MASK_TO_REG(val
) & ~GLOBAL_BEEP_ENABLE_MASK
;
774 data
->beep_mask
|= (data
->beep_enable
<< GLOBAL_BEEP_ENABLE_SHIFT
);
776 val
= data
->beep_mask
;
778 for (i
= 0; i
< 3; i
++) {
779 w83791d_write(client
, W83791D_REG_BEEP_CTRL
[i
], (val
& 0xff));
783 mutex_unlock(&data
->update_lock
);
788 static ssize_t
store_beep_enable(struct device
*dev
,
789 struct device_attribute
*attr
,
790 const char *buf
, size_t count
)
792 struct i2c_client
*client
= to_i2c_client(dev
);
793 struct w83791d_data
*data
= i2c_get_clientdata(client
);
794 long val
= simple_strtol(buf
, NULL
, 10);
796 mutex_lock(&data
->update_lock
);
798 data
->beep_enable
= val
? 1 : 0;
800 /* Keep the full mask value in sync with the current enable */
801 data
->beep_mask
&= ~GLOBAL_BEEP_ENABLE_MASK
;
802 data
->beep_mask
|= (data
->beep_enable
<< GLOBAL_BEEP_ENABLE_SHIFT
);
804 /* The global control is in the second beep control register
805 so only need to update that register */
806 val
= (data
->beep_mask
>> 8) & 0xff;
808 w83791d_write(client
, W83791D_REG_BEEP_CTRL
[1], val
);
810 mutex_unlock(&data
->update_lock
);
815 static struct sensor_device_attribute sda_beep_ctrl
[] = {
816 SENSOR_ATTR(beep_enable
, S_IRUGO
| S_IWUSR
,
817 show_beep_enable
, store_beep_enable
, 0),
818 SENSOR_ATTR(beep_mask
, S_IRUGO
| S_IWUSR
,
819 show_beep_mask
, store_beep_mask
, 1)
822 /* cpu voltage regulation information */
823 static ssize_t
show_vid_reg(struct device
*dev
,
824 struct device_attribute
*attr
, char *buf
)
826 struct w83791d_data
*data
= w83791d_update_device(dev
);
827 return sprintf(buf
, "%d\n", vid_from_reg(data
->vid
, data
->vrm
));
830 static DEVICE_ATTR(cpu0_vid
, S_IRUGO
, show_vid_reg
, NULL
);
832 static ssize_t
show_vrm_reg(struct device
*dev
,
833 struct device_attribute
*attr
, char *buf
)
835 struct w83791d_data
*data
= dev_get_drvdata(dev
);
836 return sprintf(buf
, "%d\n", data
->vrm
);
839 static ssize_t
store_vrm_reg(struct device
*dev
,
840 struct device_attribute
*attr
,
841 const char *buf
, size_t count
)
843 struct i2c_client
*client
= to_i2c_client(dev
);
844 struct w83791d_data
*data
= i2c_get_clientdata(client
);
845 unsigned long val
= simple_strtoul(buf
, NULL
, 10);
847 /* No lock needed as vrm is internal to the driver
848 (not read from a chip register) and so is not
849 updated in w83791d_update_device() */
855 static DEVICE_ATTR(vrm
, S_IRUGO
| S_IWUSR
, show_vrm_reg
, store_vrm_reg
);
857 #define IN_UNIT_ATTRS(X) \
858 &sda_in_input[X].dev_attr.attr, \
859 &sda_in_min[X].dev_attr.attr, \
860 &sda_in_max[X].dev_attr.attr, \
861 &sda_in_beep[X].dev_attr.attr, \
862 &sda_in_alarm[X].dev_attr.attr
864 #define FAN_UNIT_ATTRS(X) \
865 &sda_fan_input[X].dev_attr.attr, \
866 &sda_fan_min[X].dev_attr.attr, \
867 &sda_fan_div[X].dev_attr.attr, \
868 &sda_fan_beep[X].dev_attr.attr, \
869 &sda_fan_alarm[X].dev_attr.attr
871 #define TEMP_UNIT_ATTRS(X) \
872 &sda_temp_input[X].dev_attr.attr, \
873 &sda_temp_max[X].dev_attr.attr, \
874 &sda_temp_max_hyst[X].dev_attr.attr, \
875 &sda_temp_beep[X].dev_attr.attr, \
876 &sda_temp_alarm[X].dev_attr.attr
878 static struct attribute
*w83791d_attributes
[] = {
897 &dev_attr_alarms
.attr
,
898 &sda_beep_ctrl
[0].dev_attr
.attr
,
899 &sda_beep_ctrl
[1].dev_attr
.attr
,
900 &dev_attr_cpu0_vid
.attr
,
905 static const struct attribute_group w83791d_group
= {
906 .attrs
= w83791d_attributes
,
909 /* This function is called when:
910 * w83791d_driver is inserted (when this module is loaded), for each
912 * when a new adapter is inserted (and w83791d_driver is still present) */
913 static int w83791d_attach_adapter(struct i2c_adapter
*adapter
)
915 if (!(adapter
->class & I2C_CLASS_HWMON
))
917 return i2c_probe(adapter
, &addr_data
, w83791d_detect
);
921 static int w83791d_create_subclient(struct i2c_adapter
*adapter
,
922 struct i2c_client
*client
, int addr
,
923 struct i2c_client
**sub_cli
)
926 struct i2c_client
*sub_client
;
928 (*sub_cli
) = sub_client
=
929 kzalloc(sizeof(struct i2c_client
), GFP_KERNEL
);
933 sub_client
->addr
= 0x48 + addr
;
934 i2c_set_clientdata(sub_client
, NULL
);
935 sub_client
->adapter
= adapter
;
936 sub_client
->driver
= &w83791d_driver
;
937 strlcpy(sub_client
->name
, "w83791d subclient", I2C_NAME_SIZE
);
938 if ((err
= i2c_attach_client(sub_client
))) {
939 dev_err(&client
->dev
, "subclient registration "
940 "at address 0x%x failed\n", sub_client
->addr
);
948 static int w83791d_detect_subclients(struct i2c_adapter
*adapter
, int address
,
949 int kind
, struct i2c_client
*client
)
951 struct w83791d_data
*data
= i2c_get_clientdata(client
);
955 id
= i2c_adapter_id(adapter
);
956 if (force_subclients
[0] == id
&& force_subclients
[1] == address
) {
957 for (i
= 2; i
<= 3; i
++) {
958 if (force_subclients
[i
] < 0x48 ||
959 force_subclients
[i
] > 0x4f) {
960 dev_err(&client
->dev
,
962 "address %d; must be 0x48-0x4f\n",
963 force_subclients
[i
]);
968 w83791d_write(client
, W83791D_REG_I2C_SUBADDR
,
969 (force_subclients
[2] & 0x07) |
970 ((force_subclients
[3] & 0x07) << 4));
973 val
= w83791d_read(client
, W83791D_REG_I2C_SUBADDR
);
975 err
= w83791d_create_subclient(adapter
, client
,
976 val
& 0x7, &data
->lm75
[0]);
981 if ((data
->lm75
[0] != NULL
) &&
982 ((val
& 0x7) == ((val
>> 4) & 0x7))) {
983 dev_err(&client
->dev
,
984 "duplicate addresses 0x%x, "
985 "use force_subclient\n",
986 data
->lm75
[0]->addr
);
990 err
= w83791d_create_subclient(adapter
, client
,
991 (val
>> 4) & 0x7, &data
->lm75
[1]);
998 /* Undo inits in case of errors */
1001 if (data
->lm75
[0] != NULL
) {
1002 i2c_detach_client(data
->lm75
[0]);
1003 kfree(data
->lm75
[0]);
1010 static int w83791d_detect(struct i2c_adapter
*adapter
, int address
, int kind
)
1012 struct i2c_client
*client
;
1014 struct w83791d_data
*data
;
1017 const char *client_name
= "";
1019 if (!i2c_check_functionality(adapter
, I2C_FUNC_SMBUS_BYTE_DATA
)) {
1023 /* OK. For now, we presume we have a valid client. We now create the
1024 client structure, even though we cannot fill it completely yet.
1025 But it allows us to access w83791d_{read,write}_value. */
1026 if (!(data
= kzalloc(sizeof(struct w83791d_data
), GFP_KERNEL
))) {
1031 client
= &data
->client
;
1033 i2c_set_clientdata(client
, data
);
1034 client
->addr
= address
;
1035 client
->adapter
= adapter
;
1036 client
->driver
= &w83791d_driver
;
1037 mutex_init(&data
->update_lock
);
1039 /* Now, we do the remaining detection. */
1041 /* The w83791d may be stuck in some other bank than bank 0. This may
1042 make reading other information impossible. Specify a force=...
1043 parameter, and the Winbond will be reset to the right bank. */
1045 if (w83791d_read(client
, W83791D_REG_CONFIG
) & 0x80) {
1046 dev_dbg(dev
, "Detection failed at step 1\n");
1049 val1
= w83791d_read(client
, W83791D_REG_BANK
);
1050 val2
= w83791d_read(client
, W83791D_REG_CHIPMAN
);
1051 /* Check for Winbond ID if in bank 0 */
1052 if (!(val1
& 0x07)) {
1053 /* yes it is Bank0 */
1054 if (((!(val1
& 0x80)) && (val2
!= 0xa3)) ||
1055 ((val1
& 0x80) && (val2
!= 0x5c))) {
1056 dev_dbg(dev
, "Detection failed at step 2\n");
1060 /* If Winbond chip, address of chip and W83791D_REG_I2C_ADDR
1062 if (w83791d_read(client
, W83791D_REG_I2C_ADDR
) != address
) {
1063 dev_dbg(dev
, "Detection failed at step 3\n");
1068 /* We either have a force parameter or we have reason to
1069 believe it is a Winbond chip. Either way, we want bank 0 and
1070 Vendor ID high byte */
1071 val1
= w83791d_read(client
, W83791D_REG_BANK
) & 0x78;
1072 w83791d_write(client
, W83791D_REG_BANK
, val1
| 0x80);
1074 /* Verify it is a Winbond w83791d */
1077 val2
= w83791d_read(client
, W83791D_REG_CHIPMAN
);
1078 if (val2
!= 0x5c) { /* the vendor is NOT Winbond */
1079 dev_dbg(dev
, "Detection failed at step 4\n");
1082 val1
= w83791d_read(client
, W83791D_REG_WCHIPID
);
1088 "w83791d: Ignoring 'force' parameter "
1089 "for unknown chip at adapter %d, "
1091 i2c_adapter_id(adapter
), address
);
1096 if (kind
== w83791d
) {
1097 client_name
= "w83791d";
1099 dev_err(dev
, "w83791d: Internal error: unknown kind (%d)?!?\n",
1105 val1
= w83791d_read(client
, W83791D_REG_DID_VID4
);
1106 dev_dbg(dev
, "Device ID version: %d.%d (0x%02x)\n",
1107 (val1
>> 5) & 0x07, (val1
>> 1) & 0x0f, val1
);
1110 /* Fill in the remaining client fields and put into the global list */
1111 strlcpy(client
->name
, client_name
, I2C_NAME_SIZE
);
1113 /* Tell the I2C layer a new client has arrived */
1114 if ((err
= i2c_attach_client(client
)))
1117 if ((err
= w83791d_detect_subclients(adapter
, address
, kind
, client
)))
1120 /* Initialize the chip */
1121 w83791d_init_client(client
);
1123 /* If the fan_div is changed, make sure there is a rational
1125 for (i
= 0; i
< NUMBER_OF_FANIN
; i
++) {
1126 data
->fan_min
[i
] = w83791d_read(client
, W83791D_REG_FAN_MIN
[i
]);
1129 /* Register sysfs hooks */
1130 if ((err
= sysfs_create_group(&client
->dev
.kobj
, &w83791d_group
)))
1133 /* Everything is ready, now register the working device */
1134 data
->hwmon_dev
= hwmon_device_register(dev
);
1135 if (IS_ERR(data
->hwmon_dev
)) {
1136 err
= PTR_ERR(data
->hwmon_dev
);
1143 sysfs_remove_group(&client
->dev
.kobj
, &w83791d_group
);
1145 if (data
->lm75
[0] != NULL
) {
1146 i2c_detach_client(data
->lm75
[0]);
1147 kfree(data
->lm75
[0]);
1149 if (data
->lm75
[1] != NULL
) {
1150 i2c_detach_client(data
->lm75
[1]);
1151 kfree(data
->lm75
[1]);
1154 i2c_detach_client(client
);
1161 static int w83791d_detach_client(struct i2c_client
*client
)
1163 struct w83791d_data
*data
= i2c_get_clientdata(client
);
1168 hwmon_device_unregister(data
->hwmon_dev
);
1169 sysfs_remove_group(&client
->dev
.kobj
, &w83791d_group
);
1172 if ((err
= i2c_detach_client(client
)))
1185 static void w83791d_init_client(struct i2c_client
*client
)
1187 struct w83791d_data
*data
= i2c_get_clientdata(client
);
1191 /* The difference between reset and init is that reset
1192 does a hard reset of the chip via index 0x40, bit 7,
1193 but init simply forces certain registers to have "sane"
1194 values. The hope is that the BIOS has done the right
1195 thing (which is why the default is reset=0, init=0),
1196 but if not, reset is the hard hammer and init
1197 is the soft mallet both of which are trying to whack
1198 things into place...
1199 NOTE: The data sheet makes a distinction between
1200 "power on defaults" and "reset by MR". As far as I can tell,
1201 the hard reset puts everything into a power-on state so I'm
1202 not sure what "reset by MR" means or how it can happen.
1204 if (reset
|| init
) {
1205 /* keep some BIOS settings when we... */
1206 old_beep
= w83791d_read(client
, W83791D_REG_BEEP_CONFIG
);
1209 /* ... reset the chip and ... */
1210 w83791d_write(client
, W83791D_REG_CONFIG
, 0x80);
1213 /* ... disable power-on abnormal beep */
1214 w83791d_write(client
, W83791D_REG_BEEP_CONFIG
, old_beep
| 0x80);
1216 /* disable the global beep (not done by hard reset) */
1217 tmp
= w83791d_read(client
, W83791D_REG_BEEP_CTRL
[1]);
1218 w83791d_write(client
, W83791D_REG_BEEP_CTRL
[1], tmp
& 0xef);
1221 /* Make sure monitoring is turned on for add-ons */
1222 tmp
= w83791d_read(client
, W83791D_REG_TEMP2_CONFIG
);
1224 w83791d_write(client
, W83791D_REG_TEMP2_CONFIG
,
1228 tmp
= w83791d_read(client
, W83791D_REG_TEMP3_CONFIG
);
1230 w83791d_write(client
, W83791D_REG_TEMP3_CONFIG
,
1234 /* Start monitoring */
1235 tmp
= w83791d_read(client
, W83791D_REG_CONFIG
) & 0xf7;
1236 w83791d_write(client
, W83791D_REG_CONFIG
, tmp
| 0x01);
1240 data
->vrm
= vid_which_vrm();
1243 static struct w83791d_data
*w83791d_update_device(struct device
*dev
)
1245 struct i2c_client
*client
= to_i2c_client(dev
);
1246 struct w83791d_data
*data
= i2c_get_clientdata(client
);
1248 u8 reg_array_tmp
[3];
1250 mutex_lock(&data
->update_lock
);
1252 if (time_after(jiffies
, data
->last_updated
+ (HZ
* 3))
1254 dev_dbg(dev
, "Starting w83791d device update\n");
1256 /* Update the voltages measured value and limits */
1257 for (i
= 0; i
< NUMBER_OF_VIN
; i
++) {
1258 data
->in
[i
] = w83791d_read(client
,
1260 data
->in_max
[i
] = w83791d_read(client
,
1261 W83791D_REG_IN_MAX
[i
]);
1262 data
->in_min
[i
] = w83791d_read(client
,
1263 W83791D_REG_IN_MIN
[i
]);
1266 /* Update the fan counts and limits */
1267 for (i
= 0; i
< NUMBER_OF_FANIN
; i
++) {
1268 /* Update the Fan measured value and limits */
1269 data
->fan
[i
] = w83791d_read(client
,
1270 W83791D_REG_FAN
[i
]);
1271 data
->fan_min
[i
] = w83791d_read(client
,
1272 W83791D_REG_FAN_MIN
[i
]);
1275 /* Update the fan divisor */
1276 for (i
= 0; i
< 3; i
++) {
1277 reg_array_tmp
[i
] = w83791d_read(client
,
1278 W83791D_REG_FAN_DIV
[i
]);
1280 data
->fan_div
[0] = (reg_array_tmp
[0] >> 4) & 0x03;
1281 data
->fan_div
[1] = (reg_array_tmp
[0] >> 6) & 0x03;
1282 data
->fan_div
[2] = (reg_array_tmp
[1] >> 6) & 0x03;
1283 data
->fan_div
[3] = reg_array_tmp
[2] & 0x07;
1284 data
->fan_div
[4] = (reg_array_tmp
[2] >> 4) & 0x07;
1286 /* Update the first temperature sensor */
1287 for (i
= 0; i
< 3; i
++) {
1288 data
->temp1
[i
] = w83791d_read(client
,
1289 W83791D_REG_TEMP1
[i
]);
1292 /* Update the rest of the temperature sensors */
1293 for (i
= 0; i
< 2; i
++) {
1294 for (j
= 0; j
< 3; j
++) {
1295 data
->temp_add
[i
][j
] =
1296 (w83791d_read(client
,
1297 W83791D_REG_TEMP_ADD
[i
][j
* 2]) << 8) |
1298 w83791d_read(client
,
1299 W83791D_REG_TEMP_ADD
[i
][j
* 2 + 1]);
1303 /* Update the realtime status */
1305 w83791d_read(client
, W83791D_REG_ALARM1
) +
1306 (w83791d_read(client
, W83791D_REG_ALARM2
) << 8) +
1307 (w83791d_read(client
, W83791D_REG_ALARM3
) << 16);
1309 /* Update the beep configuration information */
1311 w83791d_read(client
, W83791D_REG_BEEP_CTRL
[0]) +
1312 (w83791d_read(client
, W83791D_REG_BEEP_CTRL
[1]) << 8) +
1313 (w83791d_read(client
, W83791D_REG_BEEP_CTRL
[2]) << 16);
1315 /* Extract global beep enable flag */
1317 (data
->beep_mask
>> GLOBAL_BEEP_ENABLE_SHIFT
) & 0x01;
1319 /* Update the cpu voltage information */
1320 i
= w83791d_read(client
, W83791D_REG_VID_FANDIV
);
1321 data
->vid
= i
& 0x0f;
1322 data
->vid
|= (w83791d_read(client
, W83791D_REG_DID_VID4
) & 0x01)
1325 data
->last_updated
= jiffies
;
1329 mutex_unlock(&data
->update_lock
);
1332 w83791d_print_debug(data
, dev
);
1339 static void w83791d_print_debug(struct w83791d_data
*data
, struct device
*dev
)
1343 dev_dbg(dev
, "======Start of w83791d debug values======\n");
1344 dev_dbg(dev
, "%d set of Voltages: ===>\n", NUMBER_OF_VIN
);
1345 for (i
= 0; i
< NUMBER_OF_VIN
; i
++) {
1346 dev_dbg(dev
, "vin[%d] is: 0x%02x\n", i
, data
->in
[i
]);
1347 dev_dbg(dev
, "vin[%d] min is: 0x%02x\n", i
, data
->in_min
[i
]);
1348 dev_dbg(dev
, "vin[%d] max is: 0x%02x\n", i
, data
->in_max
[i
]);
1350 dev_dbg(dev
, "%d set of Fan Counts/Divisors: ===>\n", NUMBER_OF_FANIN
);
1351 for (i
= 0; i
< NUMBER_OF_FANIN
; i
++) {
1352 dev_dbg(dev
, "fan[%d] is: 0x%02x\n", i
, data
->fan
[i
]);
1353 dev_dbg(dev
, "fan[%d] min is: 0x%02x\n", i
, data
->fan_min
[i
]);
1354 dev_dbg(dev
, "fan_div[%d] is: 0x%02x\n", i
, data
->fan_div
[i
]);
1357 /* temperature math is signed, but only print out the
1359 dev_dbg(dev
, "%d set of Temperatures: ===>\n", NUMBER_OF_TEMPIN
);
1360 for (i
= 0; i
< 3; i
++) {
1361 dev_dbg(dev
, "temp1[%d] is: 0x%02x\n", i
, (u8
) data
->temp1
[i
]);
1363 for (i
= 0; i
< 2; i
++) {
1364 for (j
= 0; j
< 3; j
++) {
1365 dev_dbg(dev
, "temp_add[%d][%d] is: 0x%04x\n", i
, j
,
1366 (u16
) data
->temp_add
[i
][j
]);
1370 dev_dbg(dev
, "Misc Information: ===>\n");
1371 dev_dbg(dev
, "alarm is: 0x%08x\n", data
->alarms
);
1372 dev_dbg(dev
, "beep_mask is: 0x%08x\n", data
->beep_mask
);
1373 dev_dbg(dev
, "beep_enable is: %d\n", data
->beep_enable
);
1374 dev_dbg(dev
, "vid is: 0x%02x\n", data
->vid
);
1375 dev_dbg(dev
, "vrm is: 0x%02x\n", data
->vrm
);
1376 dev_dbg(dev
, "=======End of w83791d debug values========\n");
1381 static int __init
sensors_w83791d_init(void)
1383 return i2c_add_driver(&w83791d_driver
);
1386 static void __exit
sensors_w83791d_exit(void)
1388 i2c_del_driver(&w83791d_driver
);
1391 MODULE_AUTHOR("Charles Spirakis <bezaur@gmail.com>");
1392 MODULE_DESCRIPTION("W83791D driver");
1393 MODULE_LICENSE("GPL");
1395 module_init(sensors_w83791d_init
);
1396 module_exit(sensors_w83791d_exit
);