blob: 97851c5ba3a3872caa715e130c3ff12a29c55297 [file] [log] [blame]
Charles Spirakis98739642006-04-25 14:21:03 +02001/*
2 w83791d.c - Part of lm_sensors, Linux kernel modules for hardware
3 monitoring
4
Charles Spirakis64383122007-09-04 13:31:56 -07005 Copyright (C) 2006-2007 Charles Spirakis <bezaur@gmail.com>
Charles Spirakis98739642006-04-25 14:21:03 +02006
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.
11
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.
16
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.
20*/
21
22/*
23 Supports following chips:
24
25 Chip #vin #fanin #pwm #temp wchipid vendid i2c ISA
Marc Hulsman6495ce12008-10-17 17:51:17 +020026 w83791d 10 5 5 3 0x71 0x5ca3 yes no
Charles Spirakis98739642006-04-25 14:21:03 +020027
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
Charles Spirakis125751c2006-09-24 20:53:04 +020030 w83781d.c files.
31
32 The w83791g chip is the same as the w83791d but lead-free.
Charles Spirakis98739642006-04-25 14:21:03 +020033*/
34
Charles Spirakis98739642006-04-25 14:21:03 +020035#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>
44
45#define NUMBER_OF_VIN 10
46#define NUMBER_OF_FANIN 5
47#define NUMBER_OF_TEMPIN 3
Marc Hulsman6495ce12008-10-17 17:51:17 +020048#define NUMBER_OF_PWM 5
Charles Spirakis98739642006-04-25 14:21:03 +020049
50/* Addresses to scan */
Mark M. Hoffman25e9c862008-02-17 22:28:03 -050051static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f,
52 I2C_CLIENT_END };
Charles Spirakis98739642006-04-25 14:21:03 +020053
54/* Insmod parameters */
55I2C_CLIENT_INSMOD_1(w83791d);
Jean Delvare3aed1982009-01-07 16:37:32 +010056
57static unsigned short force_subclients[4];
58module_param_array(force_subclients, short, NULL, 0);
59MODULE_PARM_DESC(force_subclients, "List of subclient addresses: "
Charles Spirakis98739642006-04-25 14:21:03 +020060 "{bus, clientaddr, subclientaddr1, subclientaddr2}");
61
62static int reset;
63module_param(reset, bool, 0);
64MODULE_PARM_DESC(reset, "Set to one to force a hardware chip reset");
65
66static int init;
67module_param(init, bool, 0);
68MODULE_PARM_DESC(init, "Set to one to force extra software initialization");
69
70/* The W83791D registers */
71static const u8 W83791D_REG_IN[NUMBER_OF_VIN] = {
72 0x20, /* VCOREA in DataSheet */
73 0x21, /* VINR0 in DataSheet */
74 0x22, /* +3.3VIN in DataSheet */
75 0x23, /* VDD5V in DataSheet */
76 0x24, /* +12VIN in DataSheet */
77 0x25, /* -12VIN in DataSheet */
78 0x26, /* -5VIN in DataSheet */
79 0xB0, /* 5VSB in DataSheet */
80 0xB1, /* VBAT in DataSheet */
81 0xB2 /* VINR1 in DataSheet */
82};
83
84static const u8 W83791D_REG_IN_MAX[NUMBER_OF_VIN] = {
85 0x2B, /* VCOREA High Limit in DataSheet */
86 0x2D, /* VINR0 High Limit in DataSheet */
87 0x2F, /* +3.3VIN High Limit in DataSheet */
88 0x31, /* VDD5V High Limit in DataSheet */
89 0x33, /* +12VIN High Limit in DataSheet */
90 0x35, /* -12VIN High Limit in DataSheet */
91 0x37, /* -5VIN High Limit in DataSheet */
92 0xB4, /* 5VSB High Limit in DataSheet */
93 0xB6, /* VBAT High Limit in DataSheet */
94 0xB8 /* VINR1 High Limit in DataSheet */
95};
96static const u8 W83791D_REG_IN_MIN[NUMBER_OF_VIN] = {
97 0x2C, /* VCOREA Low Limit in DataSheet */
98 0x2E, /* VINR0 Low Limit in DataSheet */
99 0x30, /* +3.3VIN Low Limit in DataSheet */
100 0x32, /* VDD5V Low Limit in DataSheet */
101 0x34, /* +12VIN Low Limit in DataSheet */
102 0x36, /* -12VIN Low Limit in DataSheet */
103 0x38, /* -5VIN Low Limit in DataSheet */
104 0xB5, /* 5VSB Low Limit in DataSheet */
105 0xB7, /* VBAT Low Limit in DataSheet */
106 0xB9 /* VINR1 Low Limit in DataSheet */
107};
108static const u8 W83791D_REG_FAN[NUMBER_OF_FANIN] = {
109 0x28, /* FAN 1 Count in DataSheet */
110 0x29, /* FAN 2 Count in DataSheet */
111 0x2A, /* FAN 3 Count in DataSheet */
112 0xBA, /* FAN 4 Count in DataSheet */
113 0xBB, /* FAN 5 Count in DataSheet */
114};
115static const u8 W83791D_REG_FAN_MIN[NUMBER_OF_FANIN] = {
116 0x3B, /* FAN 1 Count Low Limit in DataSheet */
117 0x3C, /* FAN 2 Count Low Limit in DataSheet */
118 0x3D, /* FAN 3 Count Low Limit in DataSheet */
119 0xBC, /* FAN 4 Count Low Limit in DataSheet */
120 0xBD, /* FAN 5 Count Low Limit in DataSheet */
121};
122
Marc Hulsman6495ce12008-10-17 17:51:17 +0200123static const u8 W83791D_REG_PWM[NUMBER_OF_PWM] = {
124 0x81, /* PWM 1 duty cycle register in DataSheet */
125 0x83, /* PWM 2 duty cycle register in DataSheet */
126 0x94, /* PWM 3 duty cycle register in DataSheet */
127 0xA0, /* PWM 4 duty cycle register in DataSheet */
128 0xA1, /* PWM 5 duty cycle register in DataSheet */
129};
130
Marc Hulsmana5a45982008-10-17 17:51:17 +0200131static const u8 W83791D_REG_TEMP_TARGET[3] = {
132 0x85, /* PWM 1 target temperature for temp 1 */
133 0x86, /* PWM 2 target temperature for temp 2 */
134 0x96, /* PWM 3 target temperature for temp 3 */
135};
136
137static const u8 W83791D_REG_TEMP_TOL[2] = {
138 0x87, /* PWM 1/2 temperature tolerance */
139 0x97, /* PWM 3 temperature tolerance */
140};
141
Charles Spirakis98739642006-04-25 14:21:03 +0200142static const u8 W83791D_REG_FAN_CFG[2] = {
143 0x84, /* FAN 1/2 configuration */
144 0x95, /* FAN 3 configuration */
145};
146
147static const u8 W83791D_REG_FAN_DIV[3] = {
148 0x47, /* contains FAN1 and FAN2 Divisor */
149 0x4b, /* contains FAN3 Divisor */
150 0x5C, /* contains FAN4 and FAN5 Divisor */
151};
152
153#define W83791D_REG_BANK 0x4E
154#define W83791D_REG_TEMP2_CONFIG 0xC2
155#define W83791D_REG_TEMP3_CONFIG 0xCA
156
157static const u8 W83791D_REG_TEMP1[3] = {
158 0x27, /* TEMP 1 in DataSheet */
159 0x39, /* TEMP 1 Over in DataSheet */
160 0x3A, /* TEMP 1 Hyst in DataSheet */
161};
162
163static const u8 W83791D_REG_TEMP_ADD[2][6] = {
164 {0xC0, /* TEMP 2 in DataSheet */
165 0xC1, /* TEMP 2(0.5 deg) in DataSheet */
166 0xC5, /* TEMP 2 Over High part in DataSheet */
167 0xC6, /* TEMP 2 Over Low part in DataSheet */
168 0xC3, /* TEMP 2 Thyst High part in DataSheet */
169 0xC4}, /* TEMP 2 Thyst Low part in DataSheet */
170 {0xC8, /* TEMP 3 in DataSheet */
171 0xC9, /* TEMP 3(0.5 deg) in DataSheet */
172 0xCD, /* TEMP 3 Over High part in DataSheet */
173 0xCE, /* TEMP 3 Over Low part in DataSheet */
174 0xCB, /* TEMP 3 Thyst High part in DataSheet */
175 0xCC} /* TEMP 3 Thyst Low part in DataSheet */
176};
177
178#define W83791D_REG_BEEP_CONFIG 0x4D
179
180static const u8 W83791D_REG_BEEP_CTRL[3] = {
181 0x56, /* BEEP Control Register 1 */
182 0x57, /* BEEP Control Register 2 */
183 0xA3, /* BEEP Control Register 3 */
184};
185
Marc Hulsman6e1ecd92008-10-17 17:51:16 +0200186#define W83791D_REG_GPIO 0x15
Charles Spirakis98739642006-04-25 14:21:03 +0200187#define W83791D_REG_CONFIG 0x40
188#define W83791D_REG_VID_FANDIV 0x47
189#define W83791D_REG_DID_VID4 0x49
190#define W83791D_REG_WCHIPID 0x58
191#define W83791D_REG_CHIPMAN 0x4F
192#define W83791D_REG_PIN 0x4B
193#define W83791D_REG_I2C_SUBADDR 0x4A
194
195#define W83791D_REG_ALARM1 0xA9 /* realtime status register1 */
196#define W83791D_REG_ALARM2 0xAA /* realtime status register2 */
197#define W83791D_REG_ALARM3 0xAB /* realtime status register3 */
198
199#define W83791D_REG_VBAT 0x5D
200#define W83791D_REG_I2C_ADDR 0x48
201
202/* The SMBus locks itself. The Winbond W83791D has a bank select register
203 (index 0x4e), but the driver only accesses registers in bank 0. Since
204 we don't switch banks, we don't need any special code to handle
205 locking access between bank switches */
206static inline int w83791d_read(struct i2c_client *client, u8 reg)
207{
208 return i2c_smbus_read_byte_data(client, reg);
209}
210
211static inline int w83791d_write(struct i2c_client *client, u8 reg, u8 value)
212{
213 return i2c_smbus_write_byte_data(client, reg, value);
214}
215
216/* The analog voltage inputs have 16mV LSB. Since the sysfs output is
217 in mV as would be measured on the chip input pin, need to just
218 multiply/divide by 16 to translate from/to register values. */
219#define IN_TO_REG(val) (SENSORS_LIMIT((((val) + 8) / 16), 0, 255))
220#define IN_FROM_REG(val) ((val) * 16)
221
222static u8 fan_to_reg(long rpm, int div)
223{
224 if (rpm == 0)
225 return 255;
226 rpm = SENSORS_LIMIT(rpm, 1, 1000000);
227 return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
228}
229
230#define FAN_FROM_REG(val,div) ((val) == 0 ? -1 : \
231 ((val) == 255 ? 0 : \
232 1350000 / ((val) * (div))))
233
234/* for temp1 which is 8-bit resolution, LSB = 1 degree Celsius */
235#define TEMP1_FROM_REG(val) ((val) * 1000)
236#define TEMP1_TO_REG(val) ((val) <= -128000 ? -128 : \
237 (val) >= 127000 ? 127 : \
238 (val) < 0 ? ((val) - 500) / 1000 : \
239 ((val) + 500) / 1000)
240
241/* for temp2 and temp3 which are 9-bit resolution, LSB = 0.5 degree Celsius
242 Assumes the top 8 bits are the integral amount and the bottom 8 bits
243 are the fractional amount. Since we only have 0.5 degree resolution,
244 the bottom 7 bits will always be zero */
245#define TEMP23_FROM_REG(val) ((val) / 128 * 500)
246#define TEMP23_TO_REG(val) ((val) <= -128000 ? 0x8000 : \
247 (val) >= 127500 ? 0x7F80 : \
248 (val) < 0 ? ((val) - 250) / 500 * 128 : \
249 ((val) + 250) / 500 * 128)
250
Marc Hulsmana5a45982008-10-17 17:51:17 +0200251/* for thermal cruise target temp, 7-bits, LSB = 1 degree Celsius */
252#define TARGET_TEMP_TO_REG(val) ((val) < 0 ? 0 : \
253 (val) >= 127000 ? 127 : \
254 ((val) + 500) / 1000)
255
256/* for thermal cruise temp tolerance, 4-bits, LSB = 1 degree Celsius */
257#define TOL_TEMP_TO_REG(val) ((val) < 0 ? 0 : \
258 (val) >= 15000 ? 15 : \
259 ((val) + 500) / 1000)
Charles Spirakis98739642006-04-25 14:21:03 +0200260
261#define BEEP_MASK_TO_REG(val) ((val) & 0xffffff)
262#define BEEP_MASK_FROM_REG(val) ((val) & 0xffffff)
263
264#define DIV_FROM_REG(val) (1 << (val))
265
266static u8 div_to_reg(int nr, long val)
267{
268 int i;
Charles Spirakis98739642006-04-25 14:21:03 +0200269
Marc Hulsmanad02ad82008-08-06 22:41:04 +0200270 /* fan divisors max out at 128 */
271 val = SENSORS_LIMIT(val, 1, 128) >> 1;
Charles Spirakis98739642006-04-25 14:21:03 +0200272 for (i = 0; i < 7; i++) {
273 if (val == 0)
274 break;
275 val >>= 1;
276 }
277 return (u8) i;
278}
279
280struct w83791d_data {
Tony Jones1beeffe2007-08-20 13:46:20 -0700281 struct device *hwmon_dev;
Charles Spirakis98739642006-04-25 14:21:03 +0200282 struct mutex update_lock;
283
284 char valid; /* !=0 if following fields are valid */
285 unsigned long last_updated; /* In jiffies */
286
287 /* array of 2 pointers to subclients */
288 struct i2c_client *lm75[2];
289
290 /* volts */
291 u8 in[NUMBER_OF_VIN]; /* Register value */
292 u8 in_max[NUMBER_OF_VIN]; /* Register value */
293 u8 in_min[NUMBER_OF_VIN]; /* Register value */
294
295 /* fans */
296 u8 fan[NUMBER_OF_FANIN]; /* Register value */
297 u8 fan_min[NUMBER_OF_FANIN]; /* Register value */
298 u8 fan_div[NUMBER_OF_FANIN]; /* Register encoding, shifted right */
299
300 /* Temperature sensors */
301
302 s8 temp1[3]; /* current, over, thyst */
303 s16 temp_add[2][3]; /* fixed point value. Top 8 bits are the
304 integral part, bottom 8 bits are the
305 fractional part. We only use the top
306 9 bits as the resolution is only
307 to the 0.5 degree C...
308 two sensors with three values
309 (cur, over, hyst) */
310
Marc Hulsman6495ce12008-10-17 17:51:17 +0200311 /* PWMs */
312 u8 pwm[5]; /* pwm duty cycle */
Marc Hulsmanb5938f82008-10-17 17:51:17 +0200313 u8 pwm_enable[3]; /* pwm enable status for fan 1-3
314 (fan 4-5 only support manual mode) */
Marc Hulsman6495ce12008-10-17 17:51:17 +0200315
Marc Hulsmana5a45982008-10-17 17:51:17 +0200316 u8 temp_target[3]; /* pwm 1-3 target temperature */
317 u8 temp_tolerance[3]; /* pwm 1-3 temperature tolerance */
318
Charles Spirakis98739642006-04-25 14:21:03 +0200319 /* Misc */
320 u32 alarms; /* realtime status register encoding,combined */
321 u8 beep_enable; /* Global beep enable */
322 u32 beep_mask; /* Mask off specific beeps */
323 u8 vid; /* Register encoding, combined */
324 u8 vrm; /* hwmon-vid */
325};
326
Jean Delvarecb0c1af2008-07-16 19:30:17 +0200327static int w83791d_probe(struct i2c_client *client,
328 const struct i2c_device_id *id);
329static int w83791d_detect(struct i2c_client *client, int kind,
330 struct i2c_board_info *info);
331static int w83791d_remove(struct i2c_client *client);
Charles Spirakis98739642006-04-25 14:21:03 +0200332
333static int w83791d_read(struct i2c_client *client, u8 register);
334static int w83791d_write(struct i2c_client *client, u8 register, u8 value);
335static struct w83791d_data *w83791d_update_device(struct device *dev);
336
337#ifdef DEBUG
338static void w83791d_print_debug(struct w83791d_data *data, struct device *dev);
339#endif
340
341static void w83791d_init_client(struct i2c_client *client);
342
Jean Delvarecb0c1af2008-07-16 19:30:17 +0200343static const struct i2c_device_id w83791d_id[] = {
344 { "w83791d", w83791d },
345 { }
346};
347MODULE_DEVICE_TABLE(i2c, w83791d_id);
348
Charles Spirakis98739642006-04-25 14:21:03 +0200349static struct i2c_driver w83791d_driver = {
Jean Delvarecb0c1af2008-07-16 19:30:17 +0200350 .class = I2C_CLASS_HWMON,
Charles Spirakis98739642006-04-25 14:21:03 +0200351 .driver = {
352 .name = "w83791d",
353 },
Jean Delvarecb0c1af2008-07-16 19:30:17 +0200354 .probe = w83791d_probe,
355 .remove = w83791d_remove,
356 .id_table = w83791d_id,
357 .detect = w83791d_detect,
358 .address_data = &addr_data,
Charles Spirakis98739642006-04-25 14:21:03 +0200359};
360
361/* following are the sysfs callback functions */
362#define show_in_reg(reg) \
363static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
364 char *buf) \
365{ \
366 struct sensor_device_attribute *sensor_attr = \
367 to_sensor_dev_attr(attr); \
368 struct w83791d_data *data = w83791d_update_device(dev); \
369 int nr = sensor_attr->index; \
370 return sprintf(buf,"%d\n", IN_FROM_REG(data->reg[nr])); \
371}
372
373show_in_reg(in);
374show_in_reg(in_min);
375show_in_reg(in_max);
376
377#define store_in_reg(REG, reg) \
378static ssize_t store_in_##reg(struct device *dev, \
379 struct device_attribute *attr, \
380 const char *buf, size_t count) \
381{ \
382 struct sensor_device_attribute *sensor_attr = \
383 to_sensor_dev_attr(attr); \
384 struct i2c_client *client = to_i2c_client(dev); \
385 struct w83791d_data *data = i2c_get_clientdata(client); \
386 unsigned long val = simple_strtoul(buf, NULL, 10); \
387 int nr = sensor_attr->index; \
388 \
389 mutex_lock(&data->update_lock); \
390 data->in_##reg[nr] = IN_TO_REG(val); \
391 w83791d_write(client, W83791D_REG_IN_##REG[nr], data->in_##reg[nr]); \
392 mutex_unlock(&data->update_lock); \
393 \
394 return count; \
395}
396store_in_reg(MIN, min);
397store_in_reg(MAX, max);
398
399static struct sensor_device_attribute sda_in_input[] = {
400 SENSOR_ATTR(in0_input, S_IRUGO, show_in, NULL, 0),
401 SENSOR_ATTR(in1_input, S_IRUGO, show_in, NULL, 1),
402 SENSOR_ATTR(in2_input, S_IRUGO, show_in, NULL, 2),
403 SENSOR_ATTR(in3_input, S_IRUGO, show_in, NULL, 3),
404 SENSOR_ATTR(in4_input, S_IRUGO, show_in, NULL, 4),
405 SENSOR_ATTR(in5_input, S_IRUGO, show_in, NULL, 5),
406 SENSOR_ATTR(in6_input, S_IRUGO, show_in, NULL, 6),
407 SENSOR_ATTR(in7_input, S_IRUGO, show_in, NULL, 7),
408 SENSOR_ATTR(in8_input, S_IRUGO, show_in, NULL, 8),
409 SENSOR_ATTR(in9_input, S_IRUGO, show_in, NULL, 9),
410};
411
412static struct sensor_device_attribute sda_in_min[] = {
413 SENSOR_ATTR(in0_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 0),
414 SENSOR_ATTR(in1_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 1),
415 SENSOR_ATTR(in2_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 2),
416 SENSOR_ATTR(in3_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 3),
417 SENSOR_ATTR(in4_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 4),
418 SENSOR_ATTR(in5_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 5),
419 SENSOR_ATTR(in6_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 6),
420 SENSOR_ATTR(in7_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 7),
421 SENSOR_ATTR(in8_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 8),
422 SENSOR_ATTR(in9_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 9),
423};
424
425static struct sensor_device_attribute sda_in_max[] = {
426 SENSOR_ATTR(in0_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 0),
427 SENSOR_ATTR(in1_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 1),
428 SENSOR_ATTR(in2_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 2),
429 SENSOR_ATTR(in3_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 3),
430 SENSOR_ATTR(in4_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 4),
431 SENSOR_ATTR(in5_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 5),
432 SENSOR_ATTR(in6_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 6),
433 SENSOR_ATTR(in7_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 7),
434 SENSOR_ATTR(in8_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 8),
435 SENSOR_ATTR(in9_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 9),
436};
437
Charles Spirakis64383122007-09-04 13:31:56 -0700438
439static ssize_t show_beep(struct device *dev, struct device_attribute *attr,
440 char *buf)
441{
442 struct sensor_device_attribute *sensor_attr =
443 to_sensor_dev_attr(attr);
444 struct w83791d_data *data = w83791d_update_device(dev);
445 int bitnr = sensor_attr->index;
446
447 return sprintf(buf, "%d\n", (data->beep_mask >> bitnr) & 1);
448}
449
450static ssize_t store_beep(struct device *dev, struct device_attribute *attr,
451 const char *buf, size_t count)
452{
453 struct sensor_device_attribute *sensor_attr =
454 to_sensor_dev_attr(attr);
455 struct i2c_client *client = to_i2c_client(dev);
456 struct w83791d_data *data = i2c_get_clientdata(client);
457 int bitnr = sensor_attr->index;
458 int bytenr = bitnr / 8;
459 long val = simple_strtol(buf, NULL, 10) ? 1 : 0;
460
461 mutex_lock(&data->update_lock);
462
463 data->beep_mask &= ~(0xff << (bytenr * 8));
464 data->beep_mask |= w83791d_read(client, W83791D_REG_BEEP_CTRL[bytenr])
465 << (bytenr * 8);
466
467 data->beep_mask &= ~(1 << bitnr);
468 data->beep_mask |= val << bitnr;
469
470 w83791d_write(client, W83791D_REG_BEEP_CTRL[bytenr],
471 (data->beep_mask >> (bytenr * 8)) & 0xff);
472
473 mutex_unlock(&data->update_lock);
474
475 return count;
476}
477
478static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
479 char *buf)
480{
481 struct sensor_device_attribute *sensor_attr =
482 to_sensor_dev_attr(attr);
483 struct w83791d_data *data = w83791d_update_device(dev);
484 int bitnr = sensor_attr->index;
485
486 return sprintf(buf, "%d\n", (data->alarms >> bitnr) & 1);
487}
488
489/* Note: The bitmask for the beep enable/disable is different than
490 the bitmask for the alarm. */
491static struct sensor_device_attribute sda_in_beep[] = {
492 SENSOR_ATTR(in0_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 0),
493 SENSOR_ATTR(in1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 13),
494 SENSOR_ATTR(in2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 2),
495 SENSOR_ATTR(in3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 3),
496 SENSOR_ATTR(in4_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 8),
497 SENSOR_ATTR(in5_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 9),
498 SENSOR_ATTR(in6_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 10),
499 SENSOR_ATTR(in7_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 16),
500 SENSOR_ATTR(in8_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 17),
501 SENSOR_ATTR(in9_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 14),
502};
503
504static struct sensor_device_attribute sda_in_alarm[] = {
505 SENSOR_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0),
506 SENSOR_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1),
507 SENSOR_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2),
508 SENSOR_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3),
509 SENSOR_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8),
510 SENSOR_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9),
511 SENSOR_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 10),
512 SENSOR_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 19),
513 SENSOR_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 20),
514 SENSOR_ATTR(in9_alarm, S_IRUGO, show_alarm, NULL, 14),
515};
516
Charles Spirakis98739642006-04-25 14:21:03 +0200517#define show_fan_reg(reg) \
518static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
519 char *buf) \
520{ \
521 struct sensor_device_attribute *sensor_attr = \
522 to_sensor_dev_attr(attr); \
523 struct w83791d_data *data = w83791d_update_device(dev); \
524 int nr = sensor_attr->index; \
525 return sprintf(buf,"%d\n", \
526 FAN_FROM_REG(data->reg[nr], DIV_FROM_REG(data->fan_div[nr]))); \
527}
528
529show_fan_reg(fan);
530show_fan_reg(fan_min);
531
532static ssize_t store_fan_min(struct device *dev, struct device_attribute *attr,
533 const char *buf, size_t count)
534{
535 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
536 struct i2c_client *client = to_i2c_client(dev);
537 struct w83791d_data *data = i2c_get_clientdata(client);
538 unsigned long val = simple_strtoul(buf, NULL, 10);
539 int nr = sensor_attr->index;
540
541 mutex_lock(&data->update_lock);
542 data->fan_min[nr] = fan_to_reg(val, DIV_FROM_REG(data->fan_div[nr]));
543 w83791d_write(client, W83791D_REG_FAN_MIN[nr], data->fan_min[nr]);
544 mutex_unlock(&data->update_lock);
545
546 return count;
547}
548
549static ssize_t show_fan_div(struct device *dev, struct device_attribute *attr,
550 char *buf)
551{
552 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
553 int nr = sensor_attr->index;
554 struct w83791d_data *data = w83791d_update_device(dev);
555 return sprintf(buf, "%u\n", DIV_FROM_REG(data->fan_div[nr]));
556}
557
558/* Note: we save and restore the fan minimum here, because its value is
559 determined in part by the fan divisor. This follows the principle of
560 least suprise; the user doesn't expect the fan minimum to change just
561 because the divisor changed. */
562static ssize_t store_fan_div(struct device *dev, struct device_attribute *attr,
563 const char *buf, size_t count)
564{
565 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
566 struct i2c_client *client = to_i2c_client(dev);
567 struct w83791d_data *data = i2c_get_clientdata(client);
568 int nr = sensor_attr->index;
569 unsigned long min;
570 u8 tmp_fan_div;
571 u8 fan_div_reg;
Marc Hulsmanad02ad82008-08-06 22:41:04 +0200572 u8 vbat_reg;
Charles Spirakis98739642006-04-25 14:21:03 +0200573 int indx = 0;
574 u8 keep_mask = 0;
575 u8 new_shift = 0;
576
577 /* Save fan_min */
578 min = FAN_FROM_REG(data->fan_min[nr], DIV_FROM_REG(data->fan_div[nr]));
579
580 mutex_lock(&data->update_lock);
581 data->fan_div[nr] = div_to_reg(nr, simple_strtoul(buf, NULL, 10));
582
583 switch (nr) {
584 case 0:
585 indx = 0;
586 keep_mask = 0xcf;
587 new_shift = 4;
588 break;
589 case 1:
590 indx = 0;
591 keep_mask = 0x3f;
592 new_shift = 6;
593 break;
594 case 2:
595 indx = 1;
596 keep_mask = 0x3f;
597 new_shift = 6;
598 break;
599 case 3:
600 indx = 2;
601 keep_mask = 0xf8;
602 new_shift = 0;
603 break;
604 case 4:
605 indx = 2;
606 keep_mask = 0x8f;
607 new_shift = 4;
608 break;
609#ifdef DEBUG
610 default:
611 dev_warn(dev, "store_fan_div: Unexpected nr seen: %d\n", nr);
612 count = -EINVAL;
613 goto err_exit;
614#endif
615 }
616
617 fan_div_reg = w83791d_read(client, W83791D_REG_FAN_DIV[indx])
618 & keep_mask;
619 tmp_fan_div = (data->fan_div[nr] << new_shift) & ~keep_mask;
620
621 w83791d_write(client, W83791D_REG_FAN_DIV[indx],
622 fan_div_reg | tmp_fan_div);
623
Marc Hulsmanad02ad82008-08-06 22:41:04 +0200624 /* Bit 2 of fans 0-2 is stored in the vbat register (bits 5-7) */
625 if (nr < 3) {
626 keep_mask = ~(1 << (nr + 5));
627 vbat_reg = w83791d_read(client, W83791D_REG_VBAT)
628 & keep_mask;
629 tmp_fan_div = (data->fan_div[nr] << (3 + nr)) & ~keep_mask;
630 w83791d_write(client, W83791D_REG_VBAT,
631 vbat_reg | tmp_fan_div);
632 }
633
Charles Spirakis98739642006-04-25 14:21:03 +0200634 /* Restore fan_min */
635 data->fan_min[nr] = fan_to_reg(min, DIV_FROM_REG(data->fan_div[nr]));
636 w83791d_write(client, W83791D_REG_FAN_MIN[nr], data->fan_min[nr]);
637
638#ifdef DEBUG
639err_exit:
640#endif
641 mutex_unlock(&data->update_lock);
642
643 return count;
644}
645
646static struct sensor_device_attribute sda_fan_input[] = {
647 SENSOR_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0),
648 SENSOR_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1),
649 SENSOR_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2),
650 SENSOR_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 3),
651 SENSOR_ATTR(fan5_input, S_IRUGO, show_fan, NULL, 4),
652};
653
654static struct sensor_device_attribute sda_fan_min[] = {
655 SENSOR_ATTR(fan1_min, S_IWUSR | S_IRUGO,
656 show_fan_min, store_fan_min, 0),
657 SENSOR_ATTR(fan2_min, S_IWUSR | S_IRUGO,
658 show_fan_min, store_fan_min, 1),
659 SENSOR_ATTR(fan3_min, S_IWUSR | S_IRUGO,
660 show_fan_min, store_fan_min, 2),
661 SENSOR_ATTR(fan4_min, S_IWUSR | S_IRUGO,
662 show_fan_min, store_fan_min, 3),
663 SENSOR_ATTR(fan5_min, S_IWUSR | S_IRUGO,
664 show_fan_min, store_fan_min, 4),
665};
666
667static struct sensor_device_attribute sda_fan_div[] = {
668 SENSOR_ATTR(fan1_div, S_IWUSR | S_IRUGO,
669 show_fan_div, store_fan_div, 0),
670 SENSOR_ATTR(fan2_div, S_IWUSR | S_IRUGO,
671 show_fan_div, store_fan_div, 1),
672 SENSOR_ATTR(fan3_div, S_IWUSR | S_IRUGO,
673 show_fan_div, store_fan_div, 2),
674 SENSOR_ATTR(fan4_div, S_IWUSR | S_IRUGO,
675 show_fan_div, store_fan_div, 3),
676 SENSOR_ATTR(fan5_div, S_IWUSR | S_IRUGO,
677 show_fan_div, store_fan_div, 4),
678};
679
Charles Spirakis64383122007-09-04 13:31:56 -0700680static struct sensor_device_attribute sda_fan_beep[] = {
681 SENSOR_ATTR(fan1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 6),
682 SENSOR_ATTR(fan2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 7),
683 SENSOR_ATTR(fan3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 11),
684 SENSOR_ATTR(fan4_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 21),
685 SENSOR_ATTR(fan5_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 22),
686};
687
688static struct sensor_device_attribute sda_fan_alarm[] = {
689 SENSOR_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6),
690 SENSOR_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7),
691 SENSOR_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 11),
692 SENSOR_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 21),
693 SENSOR_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 22),
694};
695
Marc Hulsman6495ce12008-10-17 17:51:17 +0200696/* read/write PWMs */
697static ssize_t show_pwm(struct device *dev, struct device_attribute *attr,
698 char *buf)
699{
700 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
701 int nr = sensor_attr->index;
702 struct w83791d_data *data = w83791d_update_device(dev);
703 return sprintf(buf, "%u\n", data->pwm[nr]);
704}
705
706static ssize_t store_pwm(struct device *dev, struct device_attribute *attr,
707 const char *buf, size_t count)
708{
709 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
710 struct i2c_client *client = to_i2c_client(dev);
711 struct w83791d_data *data = i2c_get_clientdata(client);
712 int nr = sensor_attr->index;
713 unsigned long val;
714
715 if (strict_strtoul(buf, 10, &val))
716 return -EINVAL;
717
718 mutex_lock(&data->update_lock);
719 data->pwm[nr] = SENSORS_LIMIT(val, 0, 255);
720 w83791d_write(client, W83791D_REG_PWM[nr], data->pwm[nr]);
721 mutex_unlock(&data->update_lock);
722 return count;
723}
724
725static struct sensor_device_attribute sda_pwm[] = {
726 SENSOR_ATTR(pwm1, S_IWUSR | S_IRUGO,
727 show_pwm, store_pwm, 0),
728 SENSOR_ATTR(pwm2, S_IWUSR | S_IRUGO,
729 show_pwm, store_pwm, 1),
730 SENSOR_ATTR(pwm3, S_IWUSR | S_IRUGO,
731 show_pwm, store_pwm, 2),
732 SENSOR_ATTR(pwm4, S_IWUSR | S_IRUGO,
733 show_pwm, store_pwm, 3),
734 SENSOR_ATTR(pwm5, S_IWUSR | S_IRUGO,
735 show_pwm, store_pwm, 4),
736};
737
Marc Hulsmanb5938f82008-10-17 17:51:17 +0200738static ssize_t show_pwmenable(struct device *dev, struct device_attribute *attr,
739 char *buf)
740{
741 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
742 int nr = sensor_attr->index;
743 struct w83791d_data *data = w83791d_update_device(dev);
744 return sprintf(buf, "%u\n", data->pwm_enable[nr] + 1);
745}
746
747static ssize_t store_pwmenable(struct device *dev,
748 struct device_attribute *attr, const char *buf, size_t count)
749{
750 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
751 struct i2c_client *client = to_i2c_client(dev);
752 struct w83791d_data *data = i2c_get_clientdata(client);
753 int nr = sensor_attr->index;
754 unsigned long val;
755 u8 reg_cfg_tmp;
756 u8 reg_idx = 0;
757 u8 val_shift = 0;
758 u8 keep_mask = 0;
759
760 int ret = strict_strtoul(buf, 10, &val);
761
762 if (ret || val < 1 || val > 3)
763 return -EINVAL;
764
765 mutex_lock(&data->update_lock);
766 data->pwm_enable[nr] = val - 1;
767 switch (nr) {
768 case 0:
769 reg_idx = 0;
770 val_shift = 2;
771 keep_mask = 0xf3;
772 break;
773 case 1:
774 reg_idx = 0;
775 val_shift = 4;
776 keep_mask = 0xcf;
777 break;
778 case 2:
779 reg_idx = 1;
780 val_shift = 2;
781 keep_mask = 0xf3;
782 break;
783 }
784
785 reg_cfg_tmp = w83791d_read(client, W83791D_REG_FAN_CFG[reg_idx]);
786 reg_cfg_tmp = (reg_cfg_tmp & keep_mask) |
787 data->pwm_enable[nr] << val_shift;
788
789 w83791d_write(client, W83791D_REG_FAN_CFG[reg_idx], reg_cfg_tmp);
790 mutex_unlock(&data->update_lock);
791
792 return count;
793}
794static struct sensor_device_attribute sda_pwmenable[] = {
795 SENSOR_ATTR(pwm1_enable, S_IWUSR | S_IRUGO,
796 show_pwmenable, store_pwmenable, 0),
797 SENSOR_ATTR(pwm2_enable, S_IWUSR | S_IRUGO,
798 show_pwmenable, store_pwmenable, 1),
799 SENSOR_ATTR(pwm3_enable, S_IWUSR | S_IRUGO,
800 show_pwmenable, store_pwmenable, 2),
801};
802
Marc Hulsmana5a45982008-10-17 17:51:17 +0200803/* For Smart Fan I / Thermal Cruise */
804static ssize_t show_temp_target(struct device *dev,
805 struct device_attribute *attr, char *buf)
806{
807 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
808 struct w83791d_data *data = w83791d_update_device(dev);
809 int nr = sensor_attr->index;
810 return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->temp_target[nr]));
811}
812
813static ssize_t store_temp_target(struct device *dev,
814 struct device_attribute *attr, const char *buf, size_t count)
815{
816 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
817 struct i2c_client *client = to_i2c_client(dev);
818 struct w83791d_data *data = i2c_get_clientdata(client);
819 int nr = sensor_attr->index;
820 unsigned long val;
821 u8 target_mask;
822
823 if (strict_strtoul(buf, 10, &val))
824 return -EINVAL;
825
826 mutex_lock(&data->update_lock);
827 data->temp_target[nr] = TARGET_TEMP_TO_REG(val);
828 target_mask = w83791d_read(client,
829 W83791D_REG_TEMP_TARGET[nr]) & 0x80;
830 w83791d_write(client, W83791D_REG_TEMP_TARGET[nr],
831 data->temp_target[nr] | target_mask);
832 mutex_unlock(&data->update_lock);
833 return count;
834}
835
836static struct sensor_device_attribute sda_temp_target[] = {
837 SENSOR_ATTR(temp1_target, S_IWUSR | S_IRUGO,
838 show_temp_target, store_temp_target, 0),
839 SENSOR_ATTR(temp2_target, S_IWUSR | S_IRUGO,
840 show_temp_target, store_temp_target, 1),
841 SENSOR_ATTR(temp3_target, S_IWUSR | S_IRUGO,
842 show_temp_target, store_temp_target, 2),
843};
844
845static ssize_t show_temp_tolerance(struct device *dev,
846 struct device_attribute *attr, char *buf)
847{
848 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
849 struct w83791d_data *data = w83791d_update_device(dev);
850 int nr = sensor_attr->index;
851 return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->temp_tolerance[nr]));
852}
853
854static ssize_t store_temp_tolerance(struct device *dev,
855 struct device_attribute *attr, const char *buf, size_t count)
856{
857 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
858 struct i2c_client *client = to_i2c_client(dev);
859 struct w83791d_data *data = i2c_get_clientdata(client);
860 int nr = sensor_attr->index;
861 unsigned long val;
862 u8 target_mask;
863 u8 reg_idx = 0;
864 u8 val_shift = 0;
865 u8 keep_mask = 0;
866
867 if (strict_strtoul(buf, 10, &val))
868 return -EINVAL;
869
870 switch (nr) {
871 case 0:
872 reg_idx = 0;
873 val_shift = 0;
874 keep_mask = 0xf0;
875 break;
876 case 1:
877 reg_idx = 0;
878 val_shift = 4;
879 keep_mask = 0x0f;
880 break;
881 case 2:
882 reg_idx = 1;
883 val_shift = 0;
884 keep_mask = 0xf0;
885 break;
886 }
887
888 mutex_lock(&data->update_lock);
889 data->temp_tolerance[nr] = TOL_TEMP_TO_REG(val);
890 target_mask = w83791d_read(client,
891 W83791D_REG_TEMP_TOL[reg_idx]) & keep_mask;
892 w83791d_write(client, W83791D_REG_TEMP_TOL[reg_idx],
893 (data->temp_tolerance[nr] << val_shift) | target_mask);
894 mutex_unlock(&data->update_lock);
895 return count;
896}
897
898static struct sensor_device_attribute sda_temp_tolerance[] = {
899 SENSOR_ATTR(temp1_tolerance, S_IWUSR | S_IRUGO,
900 show_temp_tolerance, store_temp_tolerance, 0),
901 SENSOR_ATTR(temp2_tolerance, S_IWUSR | S_IRUGO,
902 show_temp_tolerance, store_temp_tolerance, 1),
903 SENSOR_ATTR(temp3_tolerance, S_IWUSR | S_IRUGO,
904 show_temp_tolerance, store_temp_tolerance, 2),
905};
906
Charles Spirakis98739642006-04-25 14:21:03 +0200907/* read/write the temperature1, includes measured value and limits */
908static ssize_t show_temp1(struct device *dev, struct device_attribute *devattr,
909 char *buf)
910{
911 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
912 struct w83791d_data *data = w83791d_update_device(dev);
913 return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->temp1[attr->index]));
914}
915
916static ssize_t store_temp1(struct device *dev, struct device_attribute *devattr,
917 const char *buf, size_t count)
918{
919 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
920 struct i2c_client *client = to_i2c_client(dev);
921 struct w83791d_data *data = i2c_get_clientdata(client);
922 long val = simple_strtol(buf, NULL, 10);
923 int nr = attr->index;
924
925 mutex_lock(&data->update_lock);
926 data->temp1[nr] = TEMP1_TO_REG(val);
927 w83791d_write(client, W83791D_REG_TEMP1[nr], data->temp1[nr]);
928 mutex_unlock(&data->update_lock);
929 return count;
930}
931
932/* read/write temperature2-3, includes measured value and limits */
933static ssize_t show_temp23(struct device *dev, struct device_attribute *devattr,
934 char *buf)
935{
936 struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
937 struct w83791d_data *data = w83791d_update_device(dev);
938 int nr = attr->nr;
939 int index = attr->index;
940 return sprintf(buf, "%d\n", TEMP23_FROM_REG(data->temp_add[nr][index]));
941}
942
943static ssize_t store_temp23(struct device *dev,
944 struct device_attribute *devattr,
945 const char *buf, size_t count)
946{
947 struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
948 struct i2c_client *client = to_i2c_client(dev);
949 struct w83791d_data *data = i2c_get_clientdata(client);
950 long val = simple_strtol(buf, NULL, 10);
951 int nr = attr->nr;
952 int index = attr->index;
953
954 mutex_lock(&data->update_lock);
955 data->temp_add[nr][index] = TEMP23_TO_REG(val);
956 w83791d_write(client, W83791D_REG_TEMP_ADD[nr][index * 2],
957 data->temp_add[nr][index] >> 8);
958 w83791d_write(client, W83791D_REG_TEMP_ADD[nr][index * 2 + 1],
959 data->temp_add[nr][index] & 0x80);
960 mutex_unlock(&data->update_lock);
961
962 return count;
963}
964
965static struct sensor_device_attribute_2 sda_temp_input[] = {
966 SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp1, NULL, 0, 0),
967 SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp23, NULL, 0, 0),
968 SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp23, NULL, 1, 0),
969};
970
971static struct sensor_device_attribute_2 sda_temp_max[] = {
972 SENSOR_ATTR_2(temp1_max, S_IRUGO | S_IWUSR,
973 show_temp1, store_temp1, 0, 1),
974 SENSOR_ATTR_2(temp2_max, S_IRUGO | S_IWUSR,
975 show_temp23, store_temp23, 0, 1),
976 SENSOR_ATTR_2(temp3_max, S_IRUGO | S_IWUSR,
977 show_temp23, store_temp23, 1, 1),
978};
979
980static struct sensor_device_attribute_2 sda_temp_max_hyst[] = {
981 SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO | S_IWUSR,
982 show_temp1, store_temp1, 0, 2),
983 SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO | S_IWUSR,
984 show_temp23, store_temp23, 0, 2),
985 SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO | S_IWUSR,
986 show_temp23, store_temp23, 1, 2),
987};
988
Charles Spirakis64383122007-09-04 13:31:56 -0700989/* Note: The bitmask for the beep enable/disable is different than
990 the bitmask for the alarm. */
991static struct sensor_device_attribute sda_temp_beep[] = {
992 SENSOR_ATTR(temp1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 4),
993 SENSOR_ATTR(temp2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 5),
994 SENSOR_ATTR(temp3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 1),
995};
996
997static struct sensor_device_attribute sda_temp_alarm[] = {
998 SENSOR_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4),
999 SENSOR_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5),
1000 SENSOR_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13),
1001};
Charles Spirakis98739642006-04-25 14:21:03 +02001002
1003/* get reatime status of all sensors items: voltage, temp, fan */
1004static ssize_t show_alarms_reg(struct device *dev,
1005 struct device_attribute *attr, char *buf)
1006{
1007 struct w83791d_data *data = w83791d_update_device(dev);
1008 return sprintf(buf, "%u\n", data->alarms);
1009}
1010
1011static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
1012
1013/* Beep control */
1014
1015#define GLOBAL_BEEP_ENABLE_SHIFT 15
1016#define GLOBAL_BEEP_ENABLE_MASK (1 << GLOBAL_BEEP_ENABLE_SHIFT)
1017
1018static ssize_t show_beep_enable(struct device *dev,
1019 struct device_attribute *attr, char *buf)
1020{
1021 struct w83791d_data *data = w83791d_update_device(dev);
1022 return sprintf(buf, "%d\n", data->beep_enable);
1023}
1024
1025static ssize_t show_beep_mask(struct device *dev,
1026 struct device_attribute *attr, char *buf)
1027{
1028 struct w83791d_data *data = w83791d_update_device(dev);
1029 return sprintf(buf, "%d\n", BEEP_MASK_FROM_REG(data->beep_mask));
1030}
1031
1032
1033static ssize_t store_beep_mask(struct device *dev,
1034 struct device_attribute *attr,
1035 const char *buf, size_t count)
1036{
1037 struct i2c_client *client = to_i2c_client(dev);
1038 struct w83791d_data *data = i2c_get_clientdata(client);
1039 long val = simple_strtol(buf, NULL, 10);
1040 int i;
1041
1042 mutex_lock(&data->update_lock);
1043
1044 /* The beep_enable state overrides any enabling request from
1045 the masks */
1046 data->beep_mask = BEEP_MASK_TO_REG(val) & ~GLOBAL_BEEP_ENABLE_MASK;
1047 data->beep_mask |= (data->beep_enable << GLOBAL_BEEP_ENABLE_SHIFT);
1048
1049 val = data->beep_mask;
1050
1051 for (i = 0; i < 3; i++) {
1052 w83791d_write(client, W83791D_REG_BEEP_CTRL[i], (val & 0xff));
1053 val >>= 8;
1054 }
1055
1056 mutex_unlock(&data->update_lock);
1057
1058 return count;
1059}
1060
1061static ssize_t store_beep_enable(struct device *dev,
1062 struct device_attribute *attr,
1063 const char *buf, size_t count)
1064{
1065 struct i2c_client *client = to_i2c_client(dev);
1066 struct w83791d_data *data = i2c_get_clientdata(client);
1067 long val = simple_strtol(buf, NULL, 10);
1068
1069 mutex_lock(&data->update_lock);
1070
1071 data->beep_enable = val ? 1 : 0;
1072
1073 /* Keep the full mask value in sync with the current enable */
1074 data->beep_mask &= ~GLOBAL_BEEP_ENABLE_MASK;
1075 data->beep_mask |= (data->beep_enable << GLOBAL_BEEP_ENABLE_SHIFT);
1076
1077 /* The global control is in the second beep control register
1078 so only need to update that register */
1079 val = (data->beep_mask >> 8) & 0xff;
1080
1081 w83791d_write(client, W83791D_REG_BEEP_CTRL[1], val);
1082
1083 mutex_unlock(&data->update_lock);
1084
1085 return count;
1086}
1087
1088static struct sensor_device_attribute sda_beep_ctrl[] = {
1089 SENSOR_ATTR(beep_enable, S_IRUGO | S_IWUSR,
1090 show_beep_enable, store_beep_enable, 0),
1091 SENSOR_ATTR(beep_mask, S_IRUGO | S_IWUSR,
1092 show_beep_mask, store_beep_mask, 1)
1093};
1094
1095/* cpu voltage regulation information */
1096static ssize_t show_vid_reg(struct device *dev,
1097 struct device_attribute *attr, char *buf)
1098{
1099 struct w83791d_data *data = w83791d_update_device(dev);
1100 return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
1101}
1102
1103static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
1104
1105static ssize_t show_vrm_reg(struct device *dev,
1106 struct device_attribute *attr, char *buf)
1107{
Jean Delvare90d66192007-10-08 18:24:35 +02001108 struct w83791d_data *data = dev_get_drvdata(dev);
Charles Spirakis98739642006-04-25 14:21:03 +02001109 return sprintf(buf, "%d\n", data->vrm);
1110}
1111
1112static ssize_t store_vrm_reg(struct device *dev,
1113 struct device_attribute *attr,
1114 const char *buf, size_t count)
1115{
Jean Delvare8f74efe2007-12-01 11:25:33 +01001116 struct w83791d_data *data = dev_get_drvdata(dev);
Charles Spirakis98739642006-04-25 14:21:03 +02001117
1118 /* No lock needed as vrm is internal to the driver
1119 (not read from a chip register) and so is not
1120 updated in w83791d_update_device() */
Jean Delvare8f74efe2007-12-01 11:25:33 +01001121 data->vrm = simple_strtoul(buf, NULL, 10);
Charles Spirakis98739642006-04-25 14:21:03 +02001122
1123 return count;
1124}
1125
1126static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
1127
Jim Cromie34fc9212006-10-08 21:56:29 +02001128#define IN_UNIT_ATTRS(X) \
1129 &sda_in_input[X].dev_attr.attr, \
1130 &sda_in_min[X].dev_attr.attr, \
Charles Spirakis64383122007-09-04 13:31:56 -07001131 &sda_in_max[X].dev_attr.attr, \
1132 &sda_in_beep[X].dev_attr.attr, \
1133 &sda_in_alarm[X].dev_attr.attr
Jim Cromie34fc9212006-10-08 21:56:29 +02001134
1135#define FAN_UNIT_ATTRS(X) \
1136 &sda_fan_input[X].dev_attr.attr, \
1137 &sda_fan_min[X].dev_attr.attr, \
Charles Spirakis64383122007-09-04 13:31:56 -07001138 &sda_fan_div[X].dev_attr.attr, \
1139 &sda_fan_beep[X].dev_attr.attr, \
1140 &sda_fan_alarm[X].dev_attr.attr
Jim Cromie34fc9212006-10-08 21:56:29 +02001141
1142#define TEMP_UNIT_ATTRS(X) \
1143 &sda_temp_input[X].dev_attr.attr, \
1144 &sda_temp_max[X].dev_attr.attr, \
Charles Spirakis64383122007-09-04 13:31:56 -07001145 &sda_temp_max_hyst[X].dev_attr.attr, \
1146 &sda_temp_beep[X].dev_attr.attr, \
1147 &sda_temp_alarm[X].dev_attr.attr
Jim Cromie34fc9212006-10-08 21:56:29 +02001148
1149static struct attribute *w83791d_attributes[] = {
1150 IN_UNIT_ATTRS(0),
1151 IN_UNIT_ATTRS(1),
1152 IN_UNIT_ATTRS(2),
1153 IN_UNIT_ATTRS(3),
1154 IN_UNIT_ATTRS(4),
1155 IN_UNIT_ATTRS(5),
1156 IN_UNIT_ATTRS(6),
1157 IN_UNIT_ATTRS(7),
1158 IN_UNIT_ATTRS(8),
1159 IN_UNIT_ATTRS(9),
1160 FAN_UNIT_ATTRS(0),
1161 FAN_UNIT_ATTRS(1),
1162 FAN_UNIT_ATTRS(2),
Jim Cromie34fc9212006-10-08 21:56:29 +02001163 TEMP_UNIT_ATTRS(0),
1164 TEMP_UNIT_ATTRS(1),
1165 TEMP_UNIT_ATTRS(2),
1166 &dev_attr_alarms.attr,
1167 &sda_beep_ctrl[0].dev_attr.attr,
1168 &sda_beep_ctrl[1].dev_attr.attr,
1169 &dev_attr_cpu0_vid.attr,
1170 &dev_attr_vrm.attr,
Marc Hulsman6495ce12008-10-17 17:51:17 +02001171 &sda_pwm[0].dev_attr.attr,
1172 &sda_pwm[1].dev_attr.attr,
1173 &sda_pwm[2].dev_attr.attr,
Marc Hulsmanb5938f82008-10-17 17:51:17 +02001174 &sda_pwmenable[0].dev_attr.attr,
1175 &sda_pwmenable[1].dev_attr.attr,
1176 &sda_pwmenable[2].dev_attr.attr,
Marc Hulsmana5a45982008-10-17 17:51:17 +02001177 &sda_temp_target[0].dev_attr.attr,
1178 &sda_temp_target[1].dev_attr.attr,
1179 &sda_temp_target[2].dev_attr.attr,
1180 &sda_temp_tolerance[0].dev_attr.attr,
1181 &sda_temp_tolerance[1].dev_attr.attr,
1182 &sda_temp_tolerance[2].dev_attr.attr,
Jim Cromie34fc9212006-10-08 21:56:29 +02001183 NULL
1184};
1185
1186static const struct attribute_group w83791d_group = {
1187 .attrs = w83791d_attributes,
1188};
1189
Marc Hulsman6e1ecd92008-10-17 17:51:16 +02001190/* Separate group of attributes for fan/pwm 4-5. Their pins can also be
1191 in use for GPIO in which case their sysfs-interface should not be made
1192 available */
1193static struct attribute *w83791d_attributes_fanpwm45[] = {
1194 FAN_UNIT_ATTRS(3),
1195 FAN_UNIT_ATTRS(4),
Marc Hulsman6495ce12008-10-17 17:51:17 +02001196 &sda_pwm[3].dev_attr.attr,
1197 &sda_pwm[4].dev_attr.attr,
Marc Hulsman6e1ecd92008-10-17 17:51:16 +02001198 NULL
1199};
1200
1201static const struct attribute_group w83791d_group_fanpwm45 = {
1202 .attrs = w83791d_attributes_fanpwm45,
1203};
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001204
1205static int w83791d_detect_subclients(struct i2c_client *client)
Charles Spirakis98739642006-04-25 14:21:03 +02001206{
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001207 struct i2c_adapter *adapter = client->adapter;
Charles Spirakis98739642006-04-25 14:21:03 +02001208 struct w83791d_data *data = i2c_get_clientdata(client);
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001209 int address = client->addr;
Charles Spirakis98739642006-04-25 14:21:03 +02001210 int i, id, err;
1211 u8 val;
1212
1213 id = i2c_adapter_id(adapter);
1214 if (force_subclients[0] == id && force_subclients[1] == address) {
1215 for (i = 2; i <= 3; i++) {
1216 if (force_subclients[i] < 0x48 ||
1217 force_subclients[i] > 0x4f) {
1218 dev_err(&client->dev,
1219 "invalid subclient "
1220 "address %d; must be 0x48-0x4f\n",
1221 force_subclients[i]);
1222 err = -ENODEV;
1223 goto error_sc_0;
1224 }
1225 }
1226 w83791d_write(client, W83791D_REG_I2C_SUBADDR,
1227 (force_subclients[2] & 0x07) |
1228 ((force_subclients[3] & 0x07) << 4));
1229 }
1230
1231 val = w83791d_read(client, W83791D_REG_I2C_SUBADDR);
1232 if (!(val & 0x08)) {
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001233 data->lm75[0] = i2c_new_dummy(adapter, 0x48 + (val & 0x7));
Charles Spirakis98739642006-04-25 14:21:03 +02001234 }
1235 if (!(val & 0x80)) {
1236 if ((data->lm75[0] != NULL) &&
1237 ((val & 0x7) == ((val >> 4) & 0x7))) {
1238 dev_err(&client->dev,
1239 "duplicate addresses 0x%x, "
1240 "use force_subclient\n",
1241 data->lm75[0]->addr);
1242 err = -ENODEV;
1243 goto error_sc_1;
1244 }
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001245 data->lm75[1] = i2c_new_dummy(adapter,
1246 0x48 + ((val >> 4) & 0x7));
Charles Spirakis98739642006-04-25 14:21:03 +02001247 }
1248
1249 return 0;
1250
1251/* Undo inits in case of errors */
1252
1253error_sc_1:
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001254 if (data->lm75[0] != NULL)
1255 i2c_unregister_device(data->lm75[0]);
Charles Spirakis98739642006-04-25 14:21:03 +02001256error_sc_0:
1257 return err;
1258}
1259
1260
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001261/* Return 0 if detection is successful, -ENODEV otherwise */
1262static int w83791d_detect(struct i2c_client *client, int kind,
1263 struct i2c_board_info *info)
Charles Spirakis98739642006-04-25 14:21:03 +02001264{
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001265 struct i2c_adapter *adapter = client->adapter;
1266 int val1, val2;
1267 unsigned short address = client->addr;
Charles Spirakis98739642006-04-25 14:21:03 +02001268
1269 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001270 return -ENODEV;
Charles Spirakis98739642006-04-25 14:21:03 +02001271 }
1272
Charles Spirakis98739642006-04-25 14:21:03 +02001273 /* The w83791d may be stuck in some other bank than bank 0. This may
1274 make reading other information impossible. Specify a force=...
1275 parameter, and the Winbond will be reset to the right bank. */
1276 if (kind < 0) {
1277 if (w83791d_read(client, W83791D_REG_CONFIG) & 0x80) {
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001278 return -ENODEV;
Charles Spirakis98739642006-04-25 14:21:03 +02001279 }
1280 val1 = w83791d_read(client, W83791D_REG_BANK);
1281 val2 = w83791d_read(client, W83791D_REG_CHIPMAN);
1282 /* Check for Winbond ID if in bank 0 */
1283 if (!(val1 & 0x07)) {
1284 /* yes it is Bank0 */
1285 if (((!(val1 & 0x80)) && (val2 != 0xa3)) ||
1286 ((val1 & 0x80) && (val2 != 0x5c))) {
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001287 return -ENODEV;
Charles Spirakis98739642006-04-25 14:21:03 +02001288 }
1289 }
1290 /* If Winbond chip, address of chip and W83791D_REG_I2C_ADDR
1291 should match */
1292 if (w83791d_read(client, W83791D_REG_I2C_ADDR) != address) {
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001293 return -ENODEV;
Charles Spirakis98739642006-04-25 14:21:03 +02001294 }
1295 }
1296
1297 /* We either have a force parameter or we have reason to
1298 believe it is a Winbond chip. Either way, we want bank 0 and
1299 Vendor ID high byte */
1300 val1 = w83791d_read(client, W83791D_REG_BANK) & 0x78;
1301 w83791d_write(client, W83791D_REG_BANK, val1 | 0x80);
1302
1303 /* Verify it is a Winbond w83791d */
1304 if (kind <= 0) {
1305 /* get vendor ID */
1306 val2 = w83791d_read(client, W83791D_REG_CHIPMAN);
1307 if (val2 != 0x5c) { /* the vendor is NOT Winbond */
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001308 return -ENODEV;
Charles Spirakis98739642006-04-25 14:21:03 +02001309 }
1310 val1 = w83791d_read(client, W83791D_REG_WCHIPID);
1311 if (val1 == 0x71) {
1312 kind = w83791d;
1313 } else {
1314 if (kind == 0)
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001315 dev_warn(&adapter->dev,
Charles Spirakis98739642006-04-25 14:21:03 +02001316 "w83791d: Ignoring 'force' parameter "
1317 "for unknown chip at adapter %d, "
1318 "address 0x%02x\n",
1319 i2c_adapter_id(adapter), address);
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001320 return -ENODEV;
Charles Spirakis98739642006-04-25 14:21:03 +02001321 }
1322 }
1323
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001324 strlcpy(info->type, "w83791d", I2C_NAME_SIZE);
1325
1326 return 0;
1327}
1328
1329static int w83791d_probe(struct i2c_client *client,
1330 const struct i2c_device_id *id)
1331{
1332 struct w83791d_data *data;
1333 struct device *dev = &client->dev;
Michael Borisov16a515f2008-08-15 00:40:32 -07001334 int i, err;
Marc Hulsman6e1ecd92008-10-17 17:51:16 +02001335 u8 has_fanpwm45;
Charles Spirakis98739642006-04-25 14:21:03 +02001336
1337#ifdef DEBUG
Michael Borisov16a515f2008-08-15 00:40:32 -07001338 int val1;
Charles Spirakis98739642006-04-25 14:21:03 +02001339 val1 = w83791d_read(client, W83791D_REG_DID_VID4);
1340 dev_dbg(dev, "Device ID version: %d.%d (0x%02x)\n",
1341 (val1 >> 5) & 0x07, (val1 >> 1) & 0x0f, val1);
1342#endif
1343
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001344 data = kzalloc(sizeof(struct w83791d_data), GFP_KERNEL);
1345 if (!data) {
1346 err = -ENOMEM;
1347 goto error0;
1348 }
Charles Spirakis98739642006-04-25 14:21:03 +02001349
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001350 i2c_set_clientdata(client, data);
1351 mutex_init(&data->update_lock);
1352
1353 err = w83791d_detect_subclients(client);
1354 if (err)
Charles Spirakis98739642006-04-25 14:21:03 +02001355 goto error1;
1356
Charles Spirakis98739642006-04-25 14:21:03 +02001357 /* Initialize the chip */
1358 w83791d_init_client(client);
1359
1360 /* If the fan_div is changed, make sure there is a rational
1361 fan_min in place */
1362 for (i = 0; i < NUMBER_OF_FANIN; i++) {
1363 data->fan_min[i] = w83791d_read(client, W83791D_REG_FAN_MIN[i]);
1364 }
1365
1366 /* Register sysfs hooks */
Jim Cromie34fc9212006-10-08 21:56:29 +02001367 if ((err = sysfs_create_group(&client->dev.kobj, &w83791d_group)))
1368 goto error3;
1369
Marc Hulsman6e1ecd92008-10-17 17:51:16 +02001370 /* Check if pins of fan/pwm 4-5 are in use as GPIO */
1371 has_fanpwm45 = w83791d_read(client, W83791D_REG_GPIO) & 0x10;
1372 if (has_fanpwm45) {
1373 err = sysfs_create_group(&client->dev.kobj,
1374 &w83791d_group_fanpwm45);
1375 if (err)
1376 goto error4;
1377 }
1378
Jim Cromie34fc9212006-10-08 21:56:29 +02001379 /* Everything is ready, now register the working device */
Tony Jones1beeffe2007-08-20 13:46:20 -07001380 data->hwmon_dev = hwmon_device_register(dev);
1381 if (IS_ERR(data->hwmon_dev)) {
1382 err = PTR_ERR(data->hwmon_dev);
Marc Hulsman6e1ecd92008-10-17 17:51:16 +02001383 goto error5;
Charles Spirakis98739642006-04-25 14:21:03 +02001384 }
1385
Charles Spirakis98739642006-04-25 14:21:03 +02001386 return 0;
1387
Marc Hulsman6e1ecd92008-10-17 17:51:16 +02001388error5:
1389 if (has_fanpwm45)
1390 sysfs_remove_group(&client->dev.kobj, &w83791d_group_fanpwm45);
Jim Cromie34fc9212006-10-08 21:56:29 +02001391error4:
1392 sysfs_remove_group(&client->dev.kobj, &w83791d_group);
Charles Spirakis98739642006-04-25 14:21:03 +02001393error3:
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001394 if (data->lm75[0] != NULL)
1395 i2c_unregister_device(data->lm75[0]);
1396 if (data->lm75[1] != NULL)
1397 i2c_unregister_device(data->lm75[1]);
Charles Spirakis98739642006-04-25 14:21:03 +02001398error1:
1399 kfree(data);
1400error0:
1401 return err;
1402}
1403
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001404static int w83791d_remove(struct i2c_client *client)
Charles Spirakis98739642006-04-25 14:21:03 +02001405{
1406 struct w83791d_data *data = i2c_get_clientdata(client);
Charles Spirakis98739642006-04-25 14:21:03 +02001407
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001408 hwmon_device_unregister(data->hwmon_dev);
1409 sysfs_remove_group(&client->dev.kobj, &w83791d_group);
Charles Spirakis98739642006-04-25 14:21:03 +02001410
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001411 if (data->lm75[0] != NULL)
1412 i2c_unregister_device(data->lm75[0]);
1413 if (data->lm75[1] != NULL)
1414 i2c_unregister_device(data->lm75[1]);
Charles Spirakis98739642006-04-25 14:21:03 +02001415
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001416 kfree(data);
Charles Spirakis98739642006-04-25 14:21:03 +02001417 return 0;
1418}
1419
1420static void w83791d_init_client(struct i2c_client *client)
1421{
1422 struct w83791d_data *data = i2c_get_clientdata(client);
1423 u8 tmp;
1424 u8 old_beep;
1425
1426 /* The difference between reset and init is that reset
1427 does a hard reset of the chip via index 0x40, bit 7,
1428 but init simply forces certain registers to have "sane"
1429 values. The hope is that the BIOS has done the right
1430 thing (which is why the default is reset=0, init=0),
1431 but if not, reset is the hard hammer and init
1432 is the soft mallet both of which are trying to whack
1433 things into place...
1434 NOTE: The data sheet makes a distinction between
1435 "power on defaults" and "reset by MR". As far as I can tell,
1436 the hard reset puts everything into a power-on state so I'm
1437 not sure what "reset by MR" means or how it can happen.
1438 */
1439 if (reset || init) {
1440 /* keep some BIOS settings when we... */
1441 old_beep = w83791d_read(client, W83791D_REG_BEEP_CONFIG);
1442
1443 if (reset) {
1444 /* ... reset the chip and ... */
1445 w83791d_write(client, W83791D_REG_CONFIG, 0x80);
1446 }
1447
1448 /* ... disable power-on abnormal beep */
1449 w83791d_write(client, W83791D_REG_BEEP_CONFIG, old_beep | 0x80);
1450
1451 /* disable the global beep (not done by hard reset) */
1452 tmp = w83791d_read(client, W83791D_REG_BEEP_CTRL[1]);
1453 w83791d_write(client, W83791D_REG_BEEP_CTRL[1], tmp & 0xef);
1454
1455 if (init) {
1456 /* Make sure monitoring is turned on for add-ons */
1457 tmp = w83791d_read(client, W83791D_REG_TEMP2_CONFIG);
1458 if (tmp & 1) {
1459 w83791d_write(client, W83791D_REG_TEMP2_CONFIG,
1460 tmp & 0xfe);
1461 }
1462
1463 tmp = w83791d_read(client, W83791D_REG_TEMP3_CONFIG);
1464 if (tmp & 1) {
1465 w83791d_write(client, W83791D_REG_TEMP3_CONFIG,
1466 tmp & 0xfe);
1467 }
1468
1469 /* Start monitoring */
1470 tmp = w83791d_read(client, W83791D_REG_CONFIG) & 0xf7;
1471 w83791d_write(client, W83791D_REG_CONFIG, tmp | 0x01);
1472 }
1473 }
1474
1475 data->vrm = vid_which_vrm();
1476}
1477
1478static struct w83791d_data *w83791d_update_device(struct device *dev)
1479{
1480 struct i2c_client *client = to_i2c_client(dev);
1481 struct w83791d_data *data = i2c_get_clientdata(client);
1482 int i, j;
1483 u8 reg_array_tmp[3];
Marc Hulsmanad02ad82008-08-06 22:41:04 +02001484 u8 vbat_reg;
Charles Spirakis98739642006-04-25 14:21:03 +02001485
1486 mutex_lock(&data->update_lock);
1487
1488 if (time_after(jiffies, data->last_updated + (HZ * 3))
1489 || !data->valid) {
1490 dev_dbg(dev, "Starting w83791d device update\n");
1491
1492 /* Update the voltages measured value and limits */
1493 for (i = 0; i < NUMBER_OF_VIN; i++) {
1494 data->in[i] = w83791d_read(client,
1495 W83791D_REG_IN[i]);
1496 data->in_max[i] = w83791d_read(client,
1497 W83791D_REG_IN_MAX[i]);
1498 data->in_min[i] = w83791d_read(client,
1499 W83791D_REG_IN_MIN[i]);
1500 }
1501
1502 /* Update the fan counts and limits */
1503 for (i = 0; i < NUMBER_OF_FANIN; i++) {
1504 /* Update the Fan measured value and limits */
1505 data->fan[i] = w83791d_read(client,
1506 W83791D_REG_FAN[i]);
1507 data->fan_min[i] = w83791d_read(client,
1508 W83791D_REG_FAN_MIN[i]);
1509 }
1510
1511 /* Update the fan divisor */
1512 for (i = 0; i < 3; i++) {
1513 reg_array_tmp[i] = w83791d_read(client,
1514 W83791D_REG_FAN_DIV[i]);
1515 }
1516 data->fan_div[0] = (reg_array_tmp[0] >> 4) & 0x03;
1517 data->fan_div[1] = (reg_array_tmp[0] >> 6) & 0x03;
1518 data->fan_div[2] = (reg_array_tmp[1] >> 6) & 0x03;
1519 data->fan_div[3] = reg_array_tmp[2] & 0x07;
1520 data->fan_div[4] = (reg_array_tmp[2] >> 4) & 0x07;
1521
Marc Hulsmanad02ad82008-08-06 22:41:04 +02001522 /* The fan divisor for fans 0-2 get bit 2 from
1523 bits 5-7 respectively of vbat register */
1524 vbat_reg = w83791d_read(client, W83791D_REG_VBAT);
1525 for (i = 0; i < 3; i++)
1526 data->fan_div[i] |= (vbat_reg >> (3 + i)) & 0x04;
1527
Marc Hulsman6495ce12008-10-17 17:51:17 +02001528 /* Update PWM duty cycle */
1529 for (i = 0; i < NUMBER_OF_PWM; i++) {
1530 data->pwm[i] = w83791d_read(client,
1531 W83791D_REG_PWM[i]);
1532 }
1533
Marc Hulsmanb5938f82008-10-17 17:51:17 +02001534 /* Update PWM enable status */
1535 for (i = 0; i < 2; i++) {
1536 reg_array_tmp[i] = w83791d_read(client,
1537 W83791D_REG_FAN_CFG[i]);
1538 }
1539 data->pwm_enable[0] = (reg_array_tmp[0] >> 2) & 0x03;
1540 data->pwm_enable[1] = (reg_array_tmp[0] >> 4) & 0x03;
1541 data->pwm_enable[2] = (reg_array_tmp[1] >> 2) & 0x03;
1542
Marc Hulsmana5a45982008-10-17 17:51:17 +02001543 /* Update PWM target temperature */
1544 for (i = 0; i < 3; i++) {
1545 data->temp_target[i] = w83791d_read(client,
1546 W83791D_REG_TEMP_TARGET[i]) & 0x7f;
1547 }
1548
1549 /* Update PWM temperature tolerance */
1550 for (i = 0; i < 2; i++) {
1551 reg_array_tmp[i] = w83791d_read(client,
1552 W83791D_REG_TEMP_TOL[i]);
1553 }
1554 data->temp_tolerance[0] = reg_array_tmp[0] & 0x0f;
1555 data->temp_tolerance[1] = (reg_array_tmp[0] >> 4) & 0x0f;
1556 data->temp_tolerance[2] = reg_array_tmp[1] & 0x0f;
1557
Charles Spirakis98739642006-04-25 14:21:03 +02001558 /* Update the first temperature sensor */
1559 for (i = 0; i < 3; i++) {
1560 data->temp1[i] = w83791d_read(client,
1561 W83791D_REG_TEMP1[i]);
1562 }
1563
1564 /* Update the rest of the temperature sensors */
1565 for (i = 0; i < 2; i++) {
1566 for (j = 0; j < 3; j++) {
1567 data->temp_add[i][j] =
1568 (w83791d_read(client,
1569 W83791D_REG_TEMP_ADD[i][j * 2]) << 8) |
1570 w83791d_read(client,
1571 W83791D_REG_TEMP_ADD[i][j * 2 + 1]);
1572 }
1573 }
1574
1575 /* Update the realtime status */
1576 data->alarms =
1577 w83791d_read(client, W83791D_REG_ALARM1) +
1578 (w83791d_read(client, W83791D_REG_ALARM2) << 8) +
1579 (w83791d_read(client, W83791D_REG_ALARM3) << 16);
1580
1581 /* Update the beep configuration information */
1582 data->beep_mask =
1583 w83791d_read(client, W83791D_REG_BEEP_CTRL[0]) +
1584 (w83791d_read(client, W83791D_REG_BEEP_CTRL[1]) << 8) +
1585 (w83791d_read(client, W83791D_REG_BEEP_CTRL[2]) << 16);
1586
Charles Spirakis125751c2006-09-24 20:53:04 +02001587 /* Extract global beep enable flag */
Charles Spirakis98739642006-04-25 14:21:03 +02001588 data->beep_enable =
1589 (data->beep_mask >> GLOBAL_BEEP_ENABLE_SHIFT) & 0x01;
1590
1591 /* Update the cpu voltage information */
1592 i = w83791d_read(client, W83791D_REG_VID_FANDIV);
1593 data->vid = i & 0x0f;
1594 data->vid |= (w83791d_read(client, W83791D_REG_DID_VID4) & 0x01)
1595 << 4;
1596
1597 data->last_updated = jiffies;
1598 data->valid = 1;
1599 }
1600
1601 mutex_unlock(&data->update_lock);
1602
1603#ifdef DEBUG
1604 w83791d_print_debug(data, dev);
1605#endif
1606
1607 return data;
1608}
1609
1610#ifdef DEBUG
1611static void w83791d_print_debug(struct w83791d_data *data, struct device *dev)
1612{
1613 int i = 0, j = 0;
1614
1615 dev_dbg(dev, "======Start of w83791d debug values======\n");
1616 dev_dbg(dev, "%d set of Voltages: ===>\n", NUMBER_OF_VIN);
1617 for (i = 0; i < NUMBER_OF_VIN; i++) {
1618 dev_dbg(dev, "vin[%d] is: 0x%02x\n", i, data->in[i]);
1619 dev_dbg(dev, "vin[%d] min is: 0x%02x\n", i, data->in_min[i]);
1620 dev_dbg(dev, "vin[%d] max is: 0x%02x\n", i, data->in_max[i]);
1621 }
1622 dev_dbg(dev, "%d set of Fan Counts/Divisors: ===>\n", NUMBER_OF_FANIN);
1623 for (i = 0; i < NUMBER_OF_FANIN; i++) {
1624 dev_dbg(dev, "fan[%d] is: 0x%02x\n", i, data->fan[i]);
1625 dev_dbg(dev, "fan[%d] min is: 0x%02x\n", i, data->fan_min[i]);
1626 dev_dbg(dev, "fan_div[%d] is: 0x%02x\n", i, data->fan_div[i]);
1627 }
1628
1629 /* temperature math is signed, but only print out the
1630 bits that matter */
1631 dev_dbg(dev, "%d set of Temperatures: ===>\n", NUMBER_OF_TEMPIN);
1632 for (i = 0; i < 3; i++) {
1633 dev_dbg(dev, "temp1[%d] is: 0x%02x\n", i, (u8) data->temp1[i]);
1634 }
1635 for (i = 0; i < 2; i++) {
1636 for (j = 0; j < 3; j++) {
1637 dev_dbg(dev, "temp_add[%d][%d] is: 0x%04x\n", i, j,
1638 (u16) data->temp_add[i][j]);
1639 }
1640 }
1641
1642 dev_dbg(dev, "Misc Information: ===>\n");
1643 dev_dbg(dev, "alarm is: 0x%08x\n", data->alarms);
1644 dev_dbg(dev, "beep_mask is: 0x%08x\n", data->beep_mask);
1645 dev_dbg(dev, "beep_enable is: %d\n", data->beep_enable);
1646 dev_dbg(dev, "vid is: 0x%02x\n", data->vid);
1647 dev_dbg(dev, "vrm is: 0x%02x\n", data->vrm);
1648 dev_dbg(dev, "=======End of w83791d debug values========\n");
1649 dev_dbg(dev, "\n");
1650}
1651#endif
1652
1653static int __init sensors_w83791d_init(void)
1654{
1655 return i2c_add_driver(&w83791d_driver);
1656}
1657
1658static void __exit sensors_w83791d_exit(void)
1659{
1660 i2c_del_driver(&w83791d_driver);
1661}
1662
1663MODULE_AUTHOR("Charles Spirakis <bezaur@gmail.com>");
1664MODULE_DESCRIPTION("W83791D driver");
1665MODULE_LICENSE("GPL");
1666
1667module_init(sensors_w83791d_init);
1668module_exit(sensors_w83791d_exit);