blob: de21142d106c10efbbd3af4858c0c9c140360606 [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
26 w83791d 10 5 3 3 0x71 0x5ca3 yes no
27
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 Spirakis125751cb2006-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
48
49/* Addresses to scan */
Mark M. Hoffman25e9c862008-02-17 22:28:03 -050050static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f,
51 I2C_CLIENT_END };
Charles Spirakis98739642006-04-25 14:21:03 +020052
53/* Insmod parameters */
54I2C_CLIENT_INSMOD_1(w83791d);
55I2C_CLIENT_MODULE_PARM(force_subclients, "List of subclient addresses: "
56 "{bus, clientaddr, subclientaddr1, subclientaddr2}");
57
58static int reset;
59module_param(reset, bool, 0);
60MODULE_PARM_DESC(reset, "Set to one to force a hardware chip reset");
61
62static int init;
63module_param(init, bool, 0);
64MODULE_PARM_DESC(init, "Set to one to force extra software initialization");
65
66/* The W83791D registers */
67static const u8 W83791D_REG_IN[NUMBER_OF_VIN] = {
68 0x20, /* VCOREA in DataSheet */
69 0x21, /* VINR0 in DataSheet */
70 0x22, /* +3.3VIN in DataSheet */
71 0x23, /* VDD5V in DataSheet */
72 0x24, /* +12VIN in DataSheet */
73 0x25, /* -12VIN in DataSheet */
74 0x26, /* -5VIN in DataSheet */
75 0xB0, /* 5VSB in DataSheet */
76 0xB1, /* VBAT in DataSheet */
77 0xB2 /* VINR1 in DataSheet */
78};
79
80static const u8 W83791D_REG_IN_MAX[NUMBER_OF_VIN] = {
81 0x2B, /* VCOREA High Limit in DataSheet */
82 0x2D, /* VINR0 High Limit in DataSheet */
83 0x2F, /* +3.3VIN High Limit in DataSheet */
84 0x31, /* VDD5V High Limit in DataSheet */
85 0x33, /* +12VIN High Limit in DataSheet */
86 0x35, /* -12VIN High Limit in DataSheet */
87 0x37, /* -5VIN High Limit in DataSheet */
88 0xB4, /* 5VSB High Limit in DataSheet */
89 0xB6, /* VBAT High Limit in DataSheet */
90 0xB8 /* VINR1 High Limit in DataSheet */
91};
92static const u8 W83791D_REG_IN_MIN[NUMBER_OF_VIN] = {
93 0x2C, /* VCOREA Low Limit in DataSheet */
94 0x2E, /* VINR0 Low Limit in DataSheet */
95 0x30, /* +3.3VIN Low Limit in DataSheet */
96 0x32, /* VDD5V Low Limit in DataSheet */
97 0x34, /* +12VIN Low Limit in DataSheet */
98 0x36, /* -12VIN Low Limit in DataSheet */
99 0x38, /* -5VIN Low Limit in DataSheet */
100 0xB5, /* 5VSB Low Limit in DataSheet */
101 0xB7, /* VBAT Low Limit in DataSheet */
102 0xB9 /* VINR1 Low Limit in DataSheet */
103};
104static const u8 W83791D_REG_FAN[NUMBER_OF_FANIN] = {
105 0x28, /* FAN 1 Count in DataSheet */
106 0x29, /* FAN 2 Count in DataSheet */
107 0x2A, /* FAN 3 Count in DataSheet */
108 0xBA, /* FAN 4 Count in DataSheet */
109 0xBB, /* FAN 5 Count in DataSheet */
110};
111static const u8 W83791D_REG_FAN_MIN[NUMBER_OF_FANIN] = {
112 0x3B, /* FAN 1 Count Low Limit in DataSheet */
113 0x3C, /* FAN 2 Count Low Limit in DataSheet */
114 0x3D, /* FAN 3 Count Low Limit in DataSheet */
115 0xBC, /* FAN 4 Count Low Limit in DataSheet */
116 0xBD, /* FAN 5 Count Low Limit in DataSheet */
117};
118
119static const u8 W83791D_REG_FAN_CFG[2] = {
120 0x84, /* FAN 1/2 configuration */
121 0x95, /* FAN 3 configuration */
122};
123
124static const u8 W83791D_REG_FAN_DIV[3] = {
125 0x47, /* contains FAN1 and FAN2 Divisor */
126 0x4b, /* contains FAN3 Divisor */
127 0x5C, /* contains FAN4 and FAN5 Divisor */
128};
129
130#define W83791D_REG_BANK 0x4E
131#define W83791D_REG_TEMP2_CONFIG 0xC2
132#define W83791D_REG_TEMP3_CONFIG 0xCA
133
134static const u8 W83791D_REG_TEMP1[3] = {
135 0x27, /* TEMP 1 in DataSheet */
136 0x39, /* TEMP 1 Over in DataSheet */
137 0x3A, /* TEMP 1 Hyst in DataSheet */
138};
139
140static const u8 W83791D_REG_TEMP_ADD[2][6] = {
141 {0xC0, /* TEMP 2 in DataSheet */
142 0xC1, /* TEMP 2(0.5 deg) in DataSheet */
143 0xC5, /* TEMP 2 Over High part in DataSheet */
144 0xC6, /* TEMP 2 Over Low part in DataSheet */
145 0xC3, /* TEMP 2 Thyst High part in DataSheet */
146 0xC4}, /* TEMP 2 Thyst Low part in DataSheet */
147 {0xC8, /* TEMP 3 in DataSheet */
148 0xC9, /* TEMP 3(0.5 deg) in DataSheet */
149 0xCD, /* TEMP 3 Over High part in DataSheet */
150 0xCE, /* TEMP 3 Over Low part in DataSheet */
151 0xCB, /* TEMP 3 Thyst High part in DataSheet */
152 0xCC} /* TEMP 3 Thyst Low part in DataSheet */
153};
154
155#define W83791D_REG_BEEP_CONFIG 0x4D
156
157static const u8 W83791D_REG_BEEP_CTRL[3] = {
158 0x56, /* BEEP Control Register 1 */
159 0x57, /* BEEP Control Register 2 */
160 0xA3, /* BEEP Control Register 3 */
161};
162
163#define W83791D_REG_CONFIG 0x40
164#define W83791D_REG_VID_FANDIV 0x47
165#define W83791D_REG_DID_VID4 0x49
166#define W83791D_REG_WCHIPID 0x58
167#define W83791D_REG_CHIPMAN 0x4F
168#define W83791D_REG_PIN 0x4B
169#define W83791D_REG_I2C_SUBADDR 0x4A
170
171#define W83791D_REG_ALARM1 0xA9 /* realtime status register1 */
172#define W83791D_REG_ALARM2 0xAA /* realtime status register2 */
173#define W83791D_REG_ALARM3 0xAB /* realtime status register3 */
174
175#define W83791D_REG_VBAT 0x5D
176#define W83791D_REG_I2C_ADDR 0x48
177
178/* The SMBus locks itself. The Winbond W83791D has a bank select register
179 (index 0x4e), but the driver only accesses registers in bank 0. Since
180 we don't switch banks, we don't need any special code to handle
181 locking access between bank switches */
182static inline int w83791d_read(struct i2c_client *client, u8 reg)
183{
184 return i2c_smbus_read_byte_data(client, reg);
185}
186
187static inline int w83791d_write(struct i2c_client *client, u8 reg, u8 value)
188{
189 return i2c_smbus_write_byte_data(client, reg, value);
190}
191
192/* The analog voltage inputs have 16mV LSB. Since the sysfs output is
193 in mV as would be measured on the chip input pin, need to just
194 multiply/divide by 16 to translate from/to register values. */
195#define IN_TO_REG(val) (SENSORS_LIMIT((((val) + 8) / 16), 0, 255))
196#define IN_FROM_REG(val) ((val) * 16)
197
198static u8 fan_to_reg(long rpm, int div)
199{
200 if (rpm == 0)
201 return 255;
202 rpm = SENSORS_LIMIT(rpm, 1, 1000000);
203 return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
204}
205
206#define FAN_FROM_REG(val,div) ((val) == 0 ? -1 : \
207 ((val) == 255 ? 0 : \
208 1350000 / ((val) * (div))))
209
210/* for temp1 which is 8-bit resolution, LSB = 1 degree Celsius */
211#define TEMP1_FROM_REG(val) ((val) * 1000)
212#define TEMP1_TO_REG(val) ((val) <= -128000 ? -128 : \
213 (val) >= 127000 ? 127 : \
214 (val) < 0 ? ((val) - 500) / 1000 : \
215 ((val) + 500) / 1000)
216
217/* for temp2 and temp3 which are 9-bit resolution, LSB = 0.5 degree Celsius
218 Assumes the top 8 bits are the integral amount and the bottom 8 bits
219 are the fractional amount. Since we only have 0.5 degree resolution,
220 the bottom 7 bits will always be zero */
221#define TEMP23_FROM_REG(val) ((val) / 128 * 500)
222#define TEMP23_TO_REG(val) ((val) <= -128000 ? 0x8000 : \
223 (val) >= 127500 ? 0x7F80 : \
224 (val) < 0 ? ((val) - 250) / 500 * 128 : \
225 ((val) + 250) / 500 * 128)
226
227
228#define BEEP_MASK_TO_REG(val) ((val) & 0xffffff)
229#define BEEP_MASK_FROM_REG(val) ((val) & 0xffffff)
230
231#define DIV_FROM_REG(val) (1 << (val))
232
233static u8 div_to_reg(int nr, long val)
234{
235 int i;
Charles Spirakis98739642006-04-25 14:21:03 +0200236
Marc Hulsmanad02ad82008-08-06 22:41:04 +0200237 /* fan divisors max out at 128 */
238 val = SENSORS_LIMIT(val, 1, 128) >> 1;
Charles Spirakis98739642006-04-25 14:21:03 +0200239 for (i = 0; i < 7; i++) {
240 if (val == 0)
241 break;
242 val >>= 1;
243 }
244 return (u8) i;
245}
246
247struct w83791d_data {
Tony Jones1beeffe2007-08-20 13:46:20 -0700248 struct device *hwmon_dev;
Charles Spirakis98739642006-04-25 14:21:03 +0200249 struct mutex update_lock;
250
251 char valid; /* !=0 if following fields are valid */
252 unsigned long last_updated; /* In jiffies */
253
254 /* array of 2 pointers to subclients */
255 struct i2c_client *lm75[2];
256
257 /* volts */
258 u8 in[NUMBER_OF_VIN]; /* Register value */
259 u8 in_max[NUMBER_OF_VIN]; /* Register value */
260 u8 in_min[NUMBER_OF_VIN]; /* Register value */
261
262 /* fans */
263 u8 fan[NUMBER_OF_FANIN]; /* Register value */
264 u8 fan_min[NUMBER_OF_FANIN]; /* Register value */
265 u8 fan_div[NUMBER_OF_FANIN]; /* Register encoding, shifted right */
266
267 /* Temperature sensors */
268
269 s8 temp1[3]; /* current, over, thyst */
270 s16 temp_add[2][3]; /* fixed point value. Top 8 bits are the
271 integral part, bottom 8 bits are the
272 fractional part. We only use the top
273 9 bits as the resolution is only
274 to the 0.5 degree C...
275 two sensors with three values
276 (cur, over, hyst) */
277
278 /* Misc */
279 u32 alarms; /* realtime status register encoding,combined */
280 u8 beep_enable; /* Global beep enable */
281 u32 beep_mask; /* Mask off specific beeps */
282 u8 vid; /* Register encoding, combined */
283 u8 vrm; /* hwmon-vid */
284};
285
Jean Delvarecb0c1af2008-07-16 19:30:17 +0200286static int w83791d_probe(struct i2c_client *client,
287 const struct i2c_device_id *id);
288static int w83791d_detect(struct i2c_client *client, int kind,
289 struct i2c_board_info *info);
290static int w83791d_remove(struct i2c_client *client);
Charles Spirakis98739642006-04-25 14:21:03 +0200291
292static int w83791d_read(struct i2c_client *client, u8 register);
293static int w83791d_write(struct i2c_client *client, u8 register, u8 value);
294static struct w83791d_data *w83791d_update_device(struct device *dev);
295
296#ifdef DEBUG
297static void w83791d_print_debug(struct w83791d_data *data, struct device *dev);
298#endif
299
300static void w83791d_init_client(struct i2c_client *client);
301
Jean Delvarecb0c1af2008-07-16 19:30:17 +0200302static const struct i2c_device_id w83791d_id[] = {
303 { "w83791d", w83791d },
304 { }
305};
306MODULE_DEVICE_TABLE(i2c, w83791d_id);
307
Charles Spirakis98739642006-04-25 14:21:03 +0200308static struct i2c_driver w83791d_driver = {
Jean Delvarecb0c1af2008-07-16 19:30:17 +0200309 .class = I2C_CLASS_HWMON,
Charles Spirakis98739642006-04-25 14:21:03 +0200310 .driver = {
311 .name = "w83791d",
312 },
Jean Delvarecb0c1af2008-07-16 19:30:17 +0200313 .probe = w83791d_probe,
314 .remove = w83791d_remove,
315 .id_table = w83791d_id,
316 .detect = w83791d_detect,
317 .address_data = &addr_data,
Charles Spirakis98739642006-04-25 14:21:03 +0200318};
319
320/* following are the sysfs callback functions */
321#define show_in_reg(reg) \
322static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
323 char *buf) \
324{ \
325 struct sensor_device_attribute *sensor_attr = \
326 to_sensor_dev_attr(attr); \
327 struct w83791d_data *data = w83791d_update_device(dev); \
328 int nr = sensor_attr->index; \
329 return sprintf(buf,"%d\n", IN_FROM_REG(data->reg[nr])); \
330}
331
332show_in_reg(in);
333show_in_reg(in_min);
334show_in_reg(in_max);
335
336#define store_in_reg(REG, reg) \
337static ssize_t store_in_##reg(struct device *dev, \
338 struct device_attribute *attr, \
339 const char *buf, size_t count) \
340{ \
341 struct sensor_device_attribute *sensor_attr = \
342 to_sensor_dev_attr(attr); \
343 struct i2c_client *client = to_i2c_client(dev); \
344 struct w83791d_data *data = i2c_get_clientdata(client); \
345 unsigned long val = simple_strtoul(buf, NULL, 10); \
346 int nr = sensor_attr->index; \
347 \
348 mutex_lock(&data->update_lock); \
349 data->in_##reg[nr] = IN_TO_REG(val); \
350 w83791d_write(client, W83791D_REG_IN_##REG[nr], data->in_##reg[nr]); \
351 mutex_unlock(&data->update_lock); \
352 \
353 return count; \
354}
355store_in_reg(MIN, min);
356store_in_reg(MAX, max);
357
358static struct sensor_device_attribute sda_in_input[] = {
359 SENSOR_ATTR(in0_input, S_IRUGO, show_in, NULL, 0),
360 SENSOR_ATTR(in1_input, S_IRUGO, show_in, NULL, 1),
361 SENSOR_ATTR(in2_input, S_IRUGO, show_in, NULL, 2),
362 SENSOR_ATTR(in3_input, S_IRUGO, show_in, NULL, 3),
363 SENSOR_ATTR(in4_input, S_IRUGO, show_in, NULL, 4),
364 SENSOR_ATTR(in5_input, S_IRUGO, show_in, NULL, 5),
365 SENSOR_ATTR(in6_input, S_IRUGO, show_in, NULL, 6),
366 SENSOR_ATTR(in7_input, S_IRUGO, show_in, NULL, 7),
367 SENSOR_ATTR(in8_input, S_IRUGO, show_in, NULL, 8),
368 SENSOR_ATTR(in9_input, S_IRUGO, show_in, NULL, 9),
369};
370
371static struct sensor_device_attribute sda_in_min[] = {
372 SENSOR_ATTR(in0_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 0),
373 SENSOR_ATTR(in1_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 1),
374 SENSOR_ATTR(in2_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 2),
375 SENSOR_ATTR(in3_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 3),
376 SENSOR_ATTR(in4_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 4),
377 SENSOR_ATTR(in5_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 5),
378 SENSOR_ATTR(in6_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 6),
379 SENSOR_ATTR(in7_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 7),
380 SENSOR_ATTR(in8_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 8),
381 SENSOR_ATTR(in9_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 9),
382};
383
384static struct sensor_device_attribute sda_in_max[] = {
385 SENSOR_ATTR(in0_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 0),
386 SENSOR_ATTR(in1_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 1),
387 SENSOR_ATTR(in2_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 2),
388 SENSOR_ATTR(in3_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 3),
389 SENSOR_ATTR(in4_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 4),
390 SENSOR_ATTR(in5_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 5),
391 SENSOR_ATTR(in6_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 6),
392 SENSOR_ATTR(in7_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 7),
393 SENSOR_ATTR(in8_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 8),
394 SENSOR_ATTR(in9_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 9),
395};
396
Charles Spirakis64383122007-09-04 13:31:56 -0700397
398static ssize_t show_beep(struct device *dev, struct device_attribute *attr,
399 char *buf)
400{
401 struct sensor_device_attribute *sensor_attr =
402 to_sensor_dev_attr(attr);
403 struct w83791d_data *data = w83791d_update_device(dev);
404 int bitnr = sensor_attr->index;
405
406 return sprintf(buf, "%d\n", (data->beep_mask >> bitnr) & 1);
407}
408
409static ssize_t store_beep(struct device *dev, struct device_attribute *attr,
410 const char *buf, size_t count)
411{
412 struct sensor_device_attribute *sensor_attr =
413 to_sensor_dev_attr(attr);
414 struct i2c_client *client = to_i2c_client(dev);
415 struct w83791d_data *data = i2c_get_clientdata(client);
416 int bitnr = sensor_attr->index;
417 int bytenr = bitnr / 8;
418 long val = simple_strtol(buf, NULL, 10) ? 1 : 0;
419
420 mutex_lock(&data->update_lock);
421
422 data->beep_mask &= ~(0xff << (bytenr * 8));
423 data->beep_mask |= w83791d_read(client, W83791D_REG_BEEP_CTRL[bytenr])
424 << (bytenr * 8);
425
426 data->beep_mask &= ~(1 << bitnr);
427 data->beep_mask |= val << bitnr;
428
429 w83791d_write(client, W83791D_REG_BEEP_CTRL[bytenr],
430 (data->beep_mask >> (bytenr * 8)) & 0xff);
431
432 mutex_unlock(&data->update_lock);
433
434 return count;
435}
436
437static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
438 char *buf)
439{
440 struct sensor_device_attribute *sensor_attr =
441 to_sensor_dev_attr(attr);
442 struct w83791d_data *data = w83791d_update_device(dev);
443 int bitnr = sensor_attr->index;
444
445 return sprintf(buf, "%d\n", (data->alarms >> bitnr) & 1);
446}
447
448/* Note: The bitmask for the beep enable/disable is different than
449 the bitmask for the alarm. */
450static struct sensor_device_attribute sda_in_beep[] = {
451 SENSOR_ATTR(in0_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 0),
452 SENSOR_ATTR(in1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 13),
453 SENSOR_ATTR(in2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 2),
454 SENSOR_ATTR(in3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 3),
455 SENSOR_ATTR(in4_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 8),
456 SENSOR_ATTR(in5_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 9),
457 SENSOR_ATTR(in6_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 10),
458 SENSOR_ATTR(in7_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 16),
459 SENSOR_ATTR(in8_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 17),
460 SENSOR_ATTR(in9_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 14),
461};
462
463static struct sensor_device_attribute sda_in_alarm[] = {
464 SENSOR_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0),
465 SENSOR_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1),
466 SENSOR_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2),
467 SENSOR_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3),
468 SENSOR_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8),
469 SENSOR_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9),
470 SENSOR_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 10),
471 SENSOR_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 19),
472 SENSOR_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 20),
473 SENSOR_ATTR(in9_alarm, S_IRUGO, show_alarm, NULL, 14),
474};
475
Charles Spirakis98739642006-04-25 14:21:03 +0200476#define show_fan_reg(reg) \
477static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
478 char *buf) \
479{ \
480 struct sensor_device_attribute *sensor_attr = \
481 to_sensor_dev_attr(attr); \
482 struct w83791d_data *data = w83791d_update_device(dev); \
483 int nr = sensor_attr->index; \
484 return sprintf(buf,"%d\n", \
485 FAN_FROM_REG(data->reg[nr], DIV_FROM_REG(data->fan_div[nr]))); \
486}
487
488show_fan_reg(fan);
489show_fan_reg(fan_min);
490
491static ssize_t store_fan_min(struct device *dev, struct device_attribute *attr,
492 const char *buf, size_t count)
493{
494 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
495 struct i2c_client *client = to_i2c_client(dev);
496 struct w83791d_data *data = i2c_get_clientdata(client);
497 unsigned long val = simple_strtoul(buf, NULL, 10);
498 int nr = sensor_attr->index;
499
500 mutex_lock(&data->update_lock);
501 data->fan_min[nr] = fan_to_reg(val, DIV_FROM_REG(data->fan_div[nr]));
502 w83791d_write(client, W83791D_REG_FAN_MIN[nr], data->fan_min[nr]);
503 mutex_unlock(&data->update_lock);
504
505 return count;
506}
507
508static ssize_t show_fan_div(struct device *dev, struct device_attribute *attr,
509 char *buf)
510{
511 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
512 int nr = sensor_attr->index;
513 struct w83791d_data *data = w83791d_update_device(dev);
514 return sprintf(buf, "%u\n", DIV_FROM_REG(data->fan_div[nr]));
515}
516
517/* Note: we save and restore the fan minimum here, because its value is
518 determined in part by the fan divisor. This follows the principle of
519 least suprise; the user doesn't expect the fan minimum to change just
520 because the divisor changed. */
521static ssize_t store_fan_div(struct device *dev, struct device_attribute *attr,
522 const char *buf, size_t count)
523{
524 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
525 struct i2c_client *client = to_i2c_client(dev);
526 struct w83791d_data *data = i2c_get_clientdata(client);
527 int nr = sensor_attr->index;
528 unsigned long min;
529 u8 tmp_fan_div;
530 u8 fan_div_reg;
Marc Hulsmanad02ad82008-08-06 22:41:04 +0200531 u8 vbat_reg;
Charles Spirakis98739642006-04-25 14:21:03 +0200532 int indx = 0;
533 u8 keep_mask = 0;
534 u8 new_shift = 0;
535
536 /* Save fan_min */
537 min = FAN_FROM_REG(data->fan_min[nr], DIV_FROM_REG(data->fan_div[nr]));
538
539 mutex_lock(&data->update_lock);
540 data->fan_div[nr] = div_to_reg(nr, simple_strtoul(buf, NULL, 10));
541
542 switch (nr) {
543 case 0:
544 indx = 0;
545 keep_mask = 0xcf;
546 new_shift = 4;
547 break;
548 case 1:
549 indx = 0;
550 keep_mask = 0x3f;
551 new_shift = 6;
552 break;
553 case 2:
554 indx = 1;
555 keep_mask = 0x3f;
556 new_shift = 6;
557 break;
558 case 3:
559 indx = 2;
560 keep_mask = 0xf8;
561 new_shift = 0;
562 break;
563 case 4:
564 indx = 2;
565 keep_mask = 0x8f;
566 new_shift = 4;
567 break;
568#ifdef DEBUG
569 default:
570 dev_warn(dev, "store_fan_div: Unexpected nr seen: %d\n", nr);
571 count = -EINVAL;
572 goto err_exit;
573#endif
574 }
575
576 fan_div_reg = w83791d_read(client, W83791D_REG_FAN_DIV[indx])
577 & keep_mask;
578 tmp_fan_div = (data->fan_div[nr] << new_shift) & ~keep_mask;
579
580 w83791d_write(client, W83791D_REG_FAN_DIV[indx],
581 fan_div_reg | tmp_fan_div);
582
Marc Hulsmanad02ad82008-08-06 22:41:04 +0200583 /* Bit 2 of fans 0-2 is stored in the vbat register (bits 5-7) */
584 if (nr < 3) {
585 keep_mask = ~(1 << (nr + 5));
586 vbat_reg = w83791d_read(client, W83791D_REG_VBAT)
587 & keep_mask;
588 tmp_fan_div = (data->fan_div[nr] << (3 + nr)) & ~keep_mask;
589 w83791d_write(client, W83791D_REG_VBAT,
590 vbat_reg | tmp_fan_div);
591 }
592
Charles Spirakis98739642006-04-25 14:21:03 +0200593 /* Restore fan_min */
594 data->fan_min[nr] = fan_to_reg(min, DIV_FROM_REG(data->fan_div[nr]));
595 w83791d_write(client, W83791D_REG_FAN_MIN[nr], data->fan_min[nr]);
596
597#ifdef DEBUG
598err_exit:
599#endif
600 mutex_unlock(&data->update_lock);
601
602 return count;
603}
604
605static struct sensor_device_attribute sda_fan_input[] = {
606 SENSOR_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0),
607 SENSOR_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1),
608 SENSOR_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2),
609 SENSOR_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 3),
610 SENSOR_ATTR(fan5_input, S_IRUGO, show_fan, NULL, 4),
611};
612
613static struct sensor_device_attribute sda_fan_min[] = {
614 SENSOR_ATTR(fan1_min, S_IWUSR | S_IRUGO,
615 show_fan_min, store_fan_min, 0),
616 SENSOR_ATTR(fan2_min, S_IWUSR | S_IRUGO,
617 show_fan_min, store_fan_min, 1),
618 SENSOR_ATTR(fan3_min, S_IWUSR | S_IRUGO,
619 show_fan_min, store_fan_min, 2),
620 SENSOR_ATTR(fan4_min, S_IWUSR | S_IRUGO,
621 show_fan_min, store_fan_min, 3),
622 SENSOR_ATTR(fan5_min, S_IWUSR | S_IRUGO,
623 show_fan_min, store_fan_min, 4),
624};
625
626static struct sensor_device_attribute sda_fan_div[] = {
627 SENSOR_ATTR(fan1_div, S_IWUSR | S_IRUGO,
628 show_fan_div, store_fan_div, 0),
629 SENSOR_ATTR(fan2_div, S_IWUSR | S_IRUGO,
630 show_fan_div, store_fan_div, 1),
631 SENSOR_ATTR(fan3_div, S_IWUSR | S_IRUGO,
632 show_fan_div, store_fan_div, 2),
633 SENSOR_ATTR(fan4_div, S_IWUSR | S_IRUGO,
634 show_fan_div, store_fan_div, 3),
635 SENSOR_ATTR(fan5_div, S_IWUSR | S_IRUGO,
636 show_fan_div, store_fan_div, 4),
637};
638
Charles Spirakis64383122007-09-04 13:31:56 -0700639static struct sensor_device_attribute sda_fan_beep[] = {
640 SENSOR_ATTR(fan1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 6),
641 SENSOR_ATTR(fan2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 7),
642 SENSOR_ATTR(fan3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 11),
643 SENSOR_ATTR(fan4_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 21),
644 SENSOR_ATTR(fan5_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 22),
645};
646
647static struct sensor_device_attribute sda_fan_alarm[] = {
648 SENSOR_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6),
649 SENSOR_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7),
650 SENSOR_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 11),
651 SENSOR_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 21),
652 SENSOR_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 22),
653};
654
Charles Spirakis98739642006-04-25 14:21:03 +0200655/* read/write the temperature1, includes measured value and limits */
656static ssize_t show_temp1(struct device *dev, struct device_attribute *devattr,
657 char *buf)
658{
659 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
660 struct w83791d_data *data = w83791d_update_device(dev);
661 return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->temp1[attr->index]));
662}
663
664static ssize_t store_temp1(struct device *dev, struct device_attribute *devattr,
665 const char *buf, size_t count)
666{
667 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
668 struct i2c_client *client = to_i2c_client(dev);
669 struct w83791d_data *data = i2c_get_clientdata(client);
670 long val = simple_strtol(buf, NULL, 10);
671 int nr = attr->index;
672
673 mutex_lock(&data->update_lock);
674 data->temp1[nr] = TEMP1_TO_REG(val);
675 w83791d_write(client, W83791D_REG_TEMP1[nr], data->temp1[nr]);
676 mutex_unlock(&data->update_lock);
677 return count;
678}
679
680/* read/write temperature2-3, includes measured value and limits */
681static ssize_t show_temp23(struct device *dev, struct device_attribute *devattr,
682 char *buf)
683{
684 struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
685 struct w83791d_data *data = w83791d_update_device(dev);
686 int nr = attr->nr;
687 int index = attr->index;
688 return sprintf(buf, "%d\n", TEMP23_FROM_REG(data->temp_add[nr][index]));
689}
690
691static ssize_t store_temp23(struct device *dev,
692 struct device_attribute *devattr,
693 const char *buf, size_t count)
694{
695 struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
696 struct i2c_client *client = to_i2c_client(dev);
697 struct w83791d_data *data = i2c_get_clientdata(client);
698 long val = simple_strtol(buf, NULL, 10);
699 int nr = attr->nr;
700 int index = attr->index;
701
702 mutex_lock(&data->update_lock);
703 data->temp_add[nr][index] = TEMP23_TO_REG(val);
704 w83791d_write(client, W83791D_REG_TEMP_ADD[nr][index * 2],
705 data->temp_add[nr][index] >> 8);
706 w83791d_write(client, W83791D_REG_TEMP_ADD[nr][index * 2 + 1],
707 data->temp_add[nr][index] & 0x80);
708 mutex_unlock(&data->update_lock);
709
710 return count;
711}
712
713static struct sensor_device_attribute_2 sda_temp_input[] = {
714 SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp1, NULL, 0, 0),
715 SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp23, NULL, 0, 0),
716 SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp23, NULL, 1, 0),
717};
718
719static struct sensor_device_attribute_2 sda_temp_max[] = {
720 SENSOR_ATTR_2(temp1_max, S_IRUGO | S_IWUSR,
721 show_temp1, store_temp1, 0, 1),
722 SENSOR_ATTR_2(temp2_max, S_IRUGO | S_IWUSR,
723 show_temp23, store_temp23, 0, 1),
724 SENSOR_ATTR_2(temp3_max, S_IRUGO | S_IWUSR,
725 show_temp23, store_temp23, 1, 1),
726};
727
728static struct sensor_device_attribute_2 sda_temp_max_hyst[] = {
729 SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO | S_IWUSR,
730 show_temp1, store_temp1, 0, 2),
731 SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO | S_IWUSR,
732 show_temp23, store_temp23, 0, 2),
733 SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO | S_IWUSR,
734 show_temp23, store_temp23, 1, 2),
735};
736
Charles Spirakis64383122007-09-04 13:31:56 -0700737/* Note: The bitmask for the beep enable/disable is different than
738 the bitmask for the alarm. */
739static struct sensor_device_attribute sda_temp_beep[] = {
740 SENSOR_ATTR(temp1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 4),
741 SENSOR_ATTR(temp2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 5),
742 SENSOR_ATTR(temp3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 1),
743};
744
745static struct sensor_device_attribute sda_temp_alarm[] = {
746 SENSOR_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4),
747 SENSOR_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5),
748 SENSOR_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13),
749};
Charles Spirakis98739642006-04-25 14:21:03 +0200750
751/* get reatime status of all sensors items: voltage, temp, fan */
752static ssize_t show_alarms_reg(struct device *dev,
753 struct device_attribute *attr, char *buf)
754{
755 struct w83791d_data *data = w83791d_update_device(dev);
756 return sprintf(buf, "%u\n", data->alarms);
757}
758
759static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
760
761/* Beep control */
762
763#define GLOBAL_BEEP_ENABLE_SHIFT 15
764#define GLOBAL_BEEP_ENABLE_MASK (1 << GLOBAL_BEEP_ENABLE_SHIFT)
765
766static ssize_t show_beep_enable(struct device *dev,
767 struct device_attribute *attr, char *buf)
768{
769 struct w83791d_data *data = w83791d_update_device(dev);
770 return sprintf(buf, "%d\n", data->beep_enable);
771}
772
773static ssize_t show_beep_mask(struct device *dev,
774 struct device_attribute *attr, char *buf)
775{
776 struct w83791d_data *data = w83791d_update_device(dev);
777 return sprintf(buf, "%d\n", BEEP_MASK_FROM_REG(data->beep_mask));
778}
779
780
781static ssize_t store_beep_mask(struct device *dev,
782 struct device_attribute *attr,
783 const char *buf, size_t count)
784{
785 struct i2c_client *client = to_i2c_client(dev);
786 struct w83791d_data *data = i2c_get_clientdata(client);
787 long val = simple_strtol(buf, NULL, 10);
788 int i;
789
790 mutex_lock(&data->update_lock);
791
792 /* The beep_enable state overrides any enabling request from
793 the masks */
794 data->beep_mask = BEEP_MASK_TO_REG(val) & ~GLOBAL_BEEP_ENABLE_MASK;
795 data->beep_mask |= (data->beep_enable << GLOBAL_BEEP_ENABLE_SHIFT);
796
797 val = data->beep_mask;
798
799 for (i = 0; i < 3; i++) {
800 w83791d_write(client, W83791D_REG_BEEP_CTRL[i], (val & 0xff));
801 val >>= 8;
802 }
803
804 mutex_unlock(&data->update_lock);
805
806 return count;
807}
808
809static ssize_t store_beep_enable(struct device *dev,
810 struct device_attribute *attr,
811 const char *buf, size_t count)
812{
813 struct i2c_client *client = to_i2c_client(dev);
814 struct w83791d_data *data = i2c_get_clientdata(client);
815 long val = simple_strtol(buf, NULL, 10);
816
817 mutex_lock(&data->update_lock);
818
819 data->beep_enable = val ? 1 : 0;
820
821 /* Keep the full mask value in sync with the current enable */
822 data->beep_mask &= ~GLOBAL_BEEP_ENABLE_MASK;
823 data->beep_mask |= (data->beep_enable << GLOBAL_BEEP_ENABLE_SHIFT);
824
825 /* The global control is in the second beep control register
826 so only need to update that register */
827 val = (data->beep_mask >> 8) & 0xff;
828
829 w83791d_write(client, W83791D_REG_BEEP_CTRL[1], val);
830
831 mutex_unlock(&data->update_lock);
832
833 return count;
834}
835
836static struct sensor_device_attribute sda_beep_ctrl[] = {
837 SENSOR_ATTR(beep_enable, S_IRUGO | S_IWUSR,
838 show_beep_enable, store_beep_enable, 0),
839 SENSOR_ATTR(beep_mask, S_IRUGO | S_IWUSR,
840 show_beep_mask, store_beep_mask, 1)
841};
842
843/* cpu voltage regulation information */
844static ssize_t show_vid_reg(struct device *dev,
845 struct device_attribute *attr, char *buf)
846{
847 struct w83791d_data *data = w83791d_update_device(dev);
848 return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
849}
850
851static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
852
853static ssize_t show_vrm_reg(struct device *dev,
854 struct device_attribute *attr, char *buf)
855{
Jean Delvare90d66192007-10-08 18:24:35 +0200856 struct w83791d_data *data = dev_get_drvdata(dev);
Charles Spirakis98739642006-04-25 14:21:03 +0200857 return sprintf(buf, "%d\n", data->vrm);
858}
859
860static ssize_t store_vrm_reg(struct device *dev,
861 struct device_attribute *attr,
862 const char *buf, size_t count)
863{
Jean Delvare8f74efe2007-12-01 11:25:33 +0100864 struct w83791d_data *data = dev_get_drvdata(dev);
Charles Spirakis98739642006-04-25 14:21:03 +0200865
866 /* No lock needed as vrm is internal to the driver
867 (not read from a chip register) and so is not
868 updated in w83791d_update_device() */
Jean Delvare8f74efe2007-12-01 11:25:33 +0100869 data->vrm = simple_strtoul(buf, NULL, 10);
Charles Spirakis98739642006-04-25 14:21:03 +0200870
871 return count;
872}
873
874static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
875
Jim Cromie34fc9212006-10-08 21:56:29 +0200876#define IN_UNIT_ATTRS(X) \
877 &sda_in_input[X].dev_attr.attr, \
878 &sda_in_min[X].dev_attr.attr, \
Charles Spirakis64383122007-09-04 13:31:56 -0700879 &sda_in_max[X].dev_attr.attr, \
880 &sda_in_beep[X].dev_attr.attr, \
881 &sda_in_alarm[X].dev_attr.attr
Jim Cromie34fc9212006-10-08 21:56:29 +0200882
883#define FAN_UNIT_ATTRS(X) \
884 &sda_fan_input[X].dev_attr.attr, \
885 &sda_fan_min[X].dev_attr.attr, \
Charles Spirakis64383122007-09-04 13:31:56 -0700886 &sda_fan_div[X].dev_attr.attr, \
887 &sda_fan_beep[X].dev_attr.attr, \
888 &sda_fan_alarm[X].dev_attr.attr
Jim Cromie34fc9212006-10-08 21:56:29 +0200889
890#define TEMP_UNIT_ATTRS(X) \
891 &sda_temp_input[X].dev_attr.attr, \
892 &sda_temp_max[X].dev_attr.attr, \
Charles Spirakis64383122007-09-04 13:31:56 -0700893 &sda_temp_max_hyst[X].dev_attr.attr, \
894 &sda_temp_beep[X].dev_attr.attr, \
895 &sda_temp_alarm[X].dev_attr.attr
Jim Cromie34fc9212006-10-08 21:56:29 +0200896
897static struct attribute *w83791d_attributes[] = {
898 IN_UNIT_ATTRS(0),
899 IN_UNIT_ATTRS(1),
900 IN_UNIT_ATTRS(2),
901 IN_UNIT_ATTRS(3),
902 IN_UNIT_ATTRS(4),
903 IN_UNIT_ATTRS(5),
904 IN_UNIT_ATTRS(6),
905 IN_UNIT_ATTRS(7),
906 IN_UNIT_ATTRS(8),
907 IN_UNIT_ATTRS(9),
908 FAN_UNIT_ATTRS(0),
909 FAN_UNIT_ATTRS(1),
910 FAN_UNIT_ATTRS(2),
911 FAN_UNIT_ATTRS(3),
912 FAN_UNIT_ATTRS(4),
913 TEMP_UNIT_ATTRS(0),
914 TEMP_UNIT_ATTRS(1),
915 TEMP_UNIT_ATTRS(2),
916 &dev_attr_alarms.attr,
917 &sda_beep_ctrl[0].dev_attr.attr,
918 &sda_beep_ctrl[1].dev_attr.attr,
919 &dev_attr_cpu0_vid.attr,
920 &dev_attr_vrm.attr,
921 NULL
922};
923
924static const struct attribute_group w83791d_group = {
925 .attrs = w83791d_attributes,
926};
927
Jean Delvarecb0c1af2008-07-16 19:30:17 +0200928
929static int w83791d_detect_subclients(struct i2c_client *client)
Charles Spirakis98739642006-04-25 14:21:03 +0200930{
Jean Delvarecb0c1af2008-07-16 19:30:17 +0200931 struct i2c_adapter *adapter = client->adapter;
Charles Spirakis98739642006-04-25 14:21:03 +0200932 struct w83791d_data *data = i2c_get_clientdata(client);
Jean Delvarecb0c1af2008-07-16 19:30:17 +0200933 int address = client->addr;
Charles Spirakis98739642006-04-25 14:21:03 +0200934 int i, id, err;
935 u8 val;
936
937 id = i2c_adapter_id(adapter);
938 if (force_subclients[0] == id && force_subclients[1] == address) {
939 for (i = 2; i <= 3; i++) {
940 if (force_subclients[i] < 0x48 ||
941 force_subclients[i] > 0x4f) {
942 dev_err(&client->dev,
943 "invalid subclient "
944 "address %d; must be 0x48-0x4f\n",
945 force_subclients[i]);
946 err = -ENODEV;
947 goto error_sc_0;
948 }
949 }
950 w83791d_write(client, W83791D_REG_I2C_SUBADDR,
951 (force_subclients[2] & 0x07) |
952 ((force_subclients[3] & 0x07) << 4));
953 }
954
955 val = w83791d_read(client, W83791D_REG_I2C_SUBADDR);
956 if (!(val & 0x08)) {
Jean Delvarecb0c1af2008-07-16 19:30:17 +0200957 data->lm75[0] = i2c_new_dummy(adapter, 0x48 + (val & 0x7));
Charles Spirakis98739642006-04-25 14:21:03 +0200958 }
959 if (!(val & 0x80)) {
960 if ((data->lm75[0] != NULL) &&
961 ((val & 0x7) == ((val >> 4) & 0x7))) {
962 dev_err(&client->dev,
963 "duplicate addresses 0x%x, "
964 "use force_subclient\n",
965 data->lm75[0]->addr);
966 err = -ENODEV;
967 goto error_sc_1;
968 }
Jean Delvarecb0c1af2008-07-16 19:30:17 +0200969 data->lm75[1] = i2c_new_dummy(adapter,
970 0x48 + ((val >> 4) & 0x7));
Charles Spirakis98739642006-04-25 14:21:03 +0200971 }
972
973 return 0;
974
975/* Undo inits in case of errors */
976
977error_sc_1:
Jean Delvarecb0c1af2008-07-16 19:30:17 +0200978 if (data->lm75[0] != NULL)
979 i2c_unregister_device(data->lm75[0]);
Charles Spirakis98739642006-04-25 14:21:03 +0200980error_sc_0:
981 return err;
982}
983
984
Jean Delvarecb0c1af2008-07-16 19:30:17 +0200985/* Return 0 if detection is successful, -ENODEV otherwise */
986static int w83791d_detect(struct i2c_client *client, int kind,
987 struct i2c_board_info *info)
Charles Spirakis98739642006-04-25 14:21:03 +0200988{
Jean Delvarecb0c1af2008-07-16 19:30:17 +0200989 struct i2c_adapter *adapter = client->adapter;
990 int val1, val2;
991 unsigned short address = client->addr;
Charles Spirakis98739642006-04-25 14:21:03 +0200992
993 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
Jean Delvarecb0c1af2008-07-16 19:30:17 +0200994 return -ENODEV;
Charles Spirakis98739642006-04-25 14:21:03 +0200995 }
996
Charles Spirakis98739642006-04-25 14:21:03 +0200997 /* The w83791d may be stuck in some other bank than bank 0. This may
998 make reading other information impossible. Specify a force=...
999 parameter, and the Winbond will be reset to the right bank. */
1000 if (kind < 0) {
1001 if (w83791d_read(client, W83791D_REG_CONFIG) & 0x80) {
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001002 return -ENODEV;
Charles Spirakis98739642006-04-25 14:21:03 +02001003 }
1004 val1 = w83791d_read(client, W83791D_REG_BANK);
1005 val2 = w83791d_read(client, W83791D_REG_CHIPMAN);
1006 /* Check for Winbond ID if in bank 0 */
1007 if (!(val1 & 0x07)) {
1008 /* yes it is Bank0 */
1009 if (((!(val1 & 0x80)) && (val2 != 0xa3)) ||
1010 ((val1 & 0x80) && (val2 != 0x5c))) {
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001011 return -ENODEV;
Charles Spirakis98739642006-04-25 14:21:03 +02001012 }
1013 }
1014 /* If Winbond chip, address of chip and W83791D_REG_I2C_ADDR
1015 should match */
1016 if (w83791d_read(client, W83791D_REG_I2C_ADDR) != address) {
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001017 return -ENODEV;
Charles Spirakis98739642006-04-25 14:21:03 +02001018 }
1019 }
1020
1021 /* We either have a force parameter or we have reason to
1022 believe it is a Winbond chip. Either way, we want bank 0 and
1023 Vendor ID high byte */
1024 val1 = w83791d_read(client, W83791D_REG_BANK) & 0x78;
1025 w83791d_write(client, W83791D_REG_BANK, val1 | 0x80);
1026
1027 /* Verify it is a Winbond w83791d */
1028 if (kind <= 0) {
1029 /* get vendor ID */
1030 val2 = w83791d_read(client, W83791D_REG_CHIPMAN);
1031 if (val2 != 0x5c) { /* the vendor is NOT Winbond */
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001032 return -ENODEV;
Charles Spirakis98739642006-04-25 14:21:03 +02001033 }
1034 val1 = w83791d_read(client, W83791D_REG_WCHIPID);
1035 if (val1 == 0x71) {
1036 kind = w83791d;
1037 } else {
1038 if (kind == 0)
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001039 dev_warn(&adapter->dev,
Charles Spirakis98739642006-04-25 14:21:03 +02001040 "w83791d: Ignoring 'force' parameter "
1041 "for unknown chip at adapter %d, "
1042 "address 0x%02x\n",
1043 i2c_adapter_id(adapter), address);
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001044 return -ENODEV;
Charles Spirakis98739642006-04-25 14:21:03 +02001045 }
1046 }
1047
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001048 strlcpy(info->type, "w83791d", I2C_NAME_SIZE);
1049
1050 return 0;
1051}
1052
1053static int w83791d_probe(struct i2c_client *client,
1054 const struct i2c_device_id *id)
1055{
1056 struct w83791d_data *data;
1057 struct device *dev = &client->dev;
Michael Borisov16a515f2008-08-15 00:40:32 -07001058 int i, err;
Charles Spirakis98739642006-04-25 14:21:03 +02001059
1060#ifdef DEBUG
Michael Borisov16a515f2008-08-15 00:40:32 -07001061 int val1;
Charles Spirakis98739642006-04-25 14:21:03 +02001062 val1 = w83791d_read(client, W83791D_REG_DID_VID4);
1063 dev_dbg(dev, "Device ID version: %d.%d (0x%02x)\n",
1064 (val1 >> 5) & 0x07, (val1 >> 1) & 0x0f, val1);
1065#endif
1066
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001067 data = kzalloc(sizeof(struct w83791d_data), GFP_KERNEL);
1068 if (!data) {
1069 err = -ENOMEM;
1070 goto error0;
1071 }
Charles Spirakis98739642006-04-25 14:21:03 +02001072
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001073 i2c_set_clientdata(client, data);
1074 mutex_init(&data->update_lock);
1075
1076 err = w83791d_detect_subclients(client);
1077 if (err)
Charles Spirakis98739642006-04-25 14:21:03 +02001078 goto error1;
1079
Charles Spirakis98739642006-04-25 14:21:03 +02001080 /* Initialize the chip */
1081 w83791d_init_client(client);
1082
1083 /* If the fan_div is changed, make sure there is a rational
1084 fan_min in place */
1085 for (i = 0; i < NUMBER_OF_FANIN; i++) {
1086 data->fan_min[i] = w83791d_read(client, W83791D_REG_FAN_MIN[i]);
1087 }
1088
1089 /* Register sysfs hooks */
Jim Cromie34fc9212006-10-08 21:56:29 +02001090 if ((err = sysfs_create_group(&client->dev.kobj, &w83791d_group)))
1091 goto error3;
1092
1093 /* Everything is ready, now register the working device */
Tony Jones1beeffe2007-08-20 13:46:20 -07001094 data->hwmon_dev = hwmon_device_register(dev);
1095 if (IS_ERR(data->hwmon_dev)) {
1096 err = PTR_ERR(data->hwmon_dev);
Jim Cromie34fc9212006-10-08 21:56:29 +02001097 goto error4;
Charles Spirakis98739642006-04-25 14:21:03 +02001098 }
1099
Charles Spirakis98739642006-04-25 14:21:03 +02001100 return 0;
1101
Jim Cromie34fc9212006-10-08 21:56:29 +02001102error4:
1103 sysfs_remove_group(&client->dev.kobj, &w83791d_group);
Charles Spirakis98739642006-04-25 14:21:03 +02001104error3:
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001105 if (data->lm75[0] != NULL)
1106 i2c_unregister_device(data->lm75[0]);
1107 if (data->lm75[1] != NULL)
1108 i2c_unregister_device(data->lm75[1]);
Charles Spirakis98739642006-04-25 14:21:03 +02001109error1:
1110 kfree(data);
1111error0:
1112 return err;
1113}
1114
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001115static int w83791d_remove(struct i2c_client *client)
Charles Spirakis98739642006-04-25 14:21:03 +02001116{
1117 struct w83791d_data *data = i2c_get_clientdata(client);
Charles Spirakis98739642006-04-25 14:21:03 +02001118
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001119 hwmon_device_unregister(data->hwmon_dev);
1120 sysfs_remove_group(&client->dev.kobj, &w83791d_group);
Charles Spirakis98739642006-04-25 14:21:03 +02001121
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001122 if (data->lm75[0] != NULL)
1123 i2c_unregister_device(data->lm75[0]);
1124 if (data->lm75[1] != NULL)
1125 i2c_unregister_device(data->lm75[1]);
Charles Spirakis98739642006-04-25 14:21:03 +02001126
Jean Delvarecb0c1af2008-07-16 19:30:17 +02001127 kfree(data);
Charles Spirakis98739642006-04-25 14:21:03 +02001128 return 0;
1129}
1130
1131static void w83791d_init_client(struct i2c_client *client)
1132{
1133 struct w83791d_data *data = i2c_get_clientdata(client);
1134 u8 tmp;
1135 u8 old_beep;
1136
1137 /* The difference between reset and init is that reset
1138 does a hard reset of the chip via index 0x40, bit 7,
1139 but init simply forces certain registers to have "sane"
1140 values. The hope is that the BIOS has done the right
1141 thing (which is why the default is reset=0, init=0),
1142 but if not, reset is the hard hammer and init
1143 is the soft mallet both of which are trying to whack
1144 things into place...
1145 NOTE: The data sheet makes a distinction between
1146 "power on defaults" and "reset by MR". As far as I can tell,
1147 the hard reset puts everything into a power-on state so I'm
1148 not sure what "reset by MR" means or how it can happen.
1149 */
1150 if (reset || init) {
1151 /* keep some BIOS settings when we... */
1152 old_beep = w83791d_read(client, W83791D_REG_BEEP_CONFIG);
1153
1154 if (reset) {
1155 /* ... reset the chip and ... */
1156 w83791d_write(client, W83791D_REG_CONFIG, 0x80);
1157 }
1158
1159 /* ... disable power-on abnormal beep */
1160 w83791d_write(client, W83791D_REG_BEEP_CONFIG, old_beep | 0x80);
1161
1162 /* disable the global beep (not done by hard reset) */
1163 tmp = w83791d_read(client, W83791D_REG_BEEP_CTRL[1]);
1164 w83791d_write(client, W83791D_REG_BEEP_CTRL[1], tmp & 0xef);
1165
1166 if (init) {
1167 /* Make sure monitoring is turned on for add-ons */
1168 tmp = w83791d_read(client, W83791D_REG_TEMP2_CONFIG);
1169 if (tmp & 1) {
1170 w83791d_write(client, W83791D_REG_TEMP2_CONFIG,
1171 tmp & 0xfe);
1172 }
1173
1174 tmp = w83791d_read(client, W83791D_REG_TEMP3_CONFIG);
1175 if (tmp & 1) {
1176 w83791d_write(client, W83791D_REG_TEMP3_CONFIG,
1177 tmp & 0xfe);
1178 }
1179
1180 /* Start monitoring */
1181 tmp = w83791d_read(client, W83791D_REG_CONFIG) & 0xf7;
1182 w83791d_write(client, W83791D_REG_CONFIG, tmp | 0x01);
1183 }
1184 }
1185
1186 data->vrm = vid_which_vrm();
1187}
1188
1189static struct w83791d_data *w83791d_update_device(struct device *dev)
1190{
1191 struct i2c_client *client = to_i2c_client(dev);
1192 struct w83791d_data *data = i2c_get_clientdata(client);
1193 int i, j;
1194 u8 reg_array_tmp[3];
Marc Hulsmanad02ad82008-08-06 22:41:04 +02001195 u8 vbat_reg;
Charles Spirakis98739642006-04-25 14:21:03 +02001196
1197 mutex_lock(&data->update_lock);
1198
1199 if (time_after(jiffies, data->last_updated + (HZ * 3))
1200 || !data->valid) {
1201 dev_dbg(dev, "Starting w83791d device update\n");
1202
1203 /* Update the voltages measured value and limits */
1204 for (i = 0; i < NUMBER_OF_VIN; i++) {
1205 data->in[i] = w83791d_read(client,
1206 W83791D_REG_IN[i]);
1207 data->in_max[i] = w83791d_read(client,
1208 W83791D_REG_IN_MAX[i]);
1209 data->in_min[i] = w83791d_read(client,
1210 W83791D_REG_IN_MIN[i]);
1211 }
1212
1213 /* Update the fan counts and limits */
1214 for (i = 0; i < NUMBER_OF_FANIN; i++) {
1215 /* Update the Fan measured value and limits */
1216 data->fan[i] = w83791d_read(client,
1217 W83791D_REG_FAN[i]);
1218 data->fan_min[i] = w83791d_read(client,
1219 W83791D_REG_FAN_MIN[i]);
1220 }
1221
1222 /* Update the fan divisor */
1223 for (i = 0; i < 3; i++) {
1224 reg_array_tmp[i] = w83791d_read(client,
1225 W83791D_REG_FAN_DIV[i]);
1226 }
1227 data->fan_div[0] = (reg_array_tmp[0] >> 4) & 0x03;
1228 data->fan_div[1] = (reg_array_tmp[0] >> 6) & 0x03;
1229 data->fan_div[2] = (reg_array_tmp[1] >> 6) & 0x03;
1230 data->fan_div[3] = reg_array_tmp[2] & 0x07;
1231 data->fan_div[4] = (reg_array_tmp[2] >> 4) & 0x07;
1232
Marc Hulsmanad02ad82008-08-06 22:41:04 +02001233 /* The fan divisor for fans 0-2 get bit 2 from
1234 bits 5-7 respectively of vbat register */
1235 vbat_reg = w83791d_read(client, W83791D_REG_VBAT);
1236 for (i = 0; i < 3; i++)
1237 data->fan_div[i] |= (vbat_reg >> (3 + i)) & 0x04;
1238
Charles Spirakis98739642006-04-25 14:21:03 +02001239 /* Update the first temperature sensor */
1240 for (i = 0; i < 3; i++) {
1241 data->temp1[i] = w83791d_read(client,
1242 W83791D_REG_TEMP1[i]);
1243 }
1244
1245 /* Update the rest of the temperature sensors */
1246 for (i = 0; i < 2; i++) {
1247 for (j = 0; j < 3; j++) {
1248 data->temp_add[i][j] =
1249 (w83791d_read(client,
1250 W83791D_REG_TEMP_ADD[i][j * 2]) << 8) |
1251 w83791d_read(client,
1252 W83791D_REG_TEMP_ADD[i][j * 2 + 1]);
1253 }
1254 }
1255
1256 /* Update the realtime status */
1257 data->alarms =
1258 w83791d_read(client, W83791D_REG_ALARM1) +
1259 (w83791d_read(client, W83791D_REG_ALARM2) << 8) +
1260 (w83791d_read(client, W83791D_REG_ALARM3) << 16);
1261
1262 /* Update the beep configuration information */
1263 data->beep_mask =
1264 w83791d_read(client, W83791D_REG_BEEP_CTRL[0]) +
1265 (w83791d_read(client, W83791D_REG_BEEP_CTRL[1]) << 8) +
1266 (w83791d_read(client, W83791D_REG_BEEP_CTRL[2]) << 16);
1267
Charles Spirakis125751cb2006-09-24 20:53:04 +02001268 /* Extract global beep enable flag */
Charles Spirakis98739642006-04-25 14:21:03 +02001269 data->beep_enable =
1270 (data->beep_mask >> GLOBAL_BEEP_ENABLE_SHIFT) & 0x01;
1271
1272 /* Update the cpu voltage information */
1273 i = w83791d_read(client, W83791D_REG_VID_FANDIV);
1274 data->vid = i & 0x0f;
1275 data->vid |= (w83791d_read(client, W83791D_REG_DID_VID4) & 0x01)
1276 << 4;
1277
1278 data->last_updated = jiffies;
1279 data->valid = 1;
1280 }
1281
1282 mutex_unlock(&data->update_lock);
1283
1284#ifdef DEBUG
1285 w83791d_print_debug(data, dev);
1286#endif
1287
1288 return data;
1289}
1290
1291#ifdef DEBUG
1292static void w83791d_print_debug(struct w83791d_data *data, struct device *dev)
1293{
1294 int i = 0, j = 0;
1295
1296 dev_dbg(dev, "======Start of w83791d debug values======\n");
1297 dev_dbg(dev, "%d set of Voltages: ===>\n", NUMBER_OF_VIN);
1298 for (i = 0; i < NUMBER_OF_VIN; i++) {
1299 dev_dbg(dev, "vin[%d] is: 0x%02x\n", i, data->in[i]);
1300 dev_dbg(dev, "vin[%d] min is: 0x%02x\n", i, data->in_min[i]);
1301 dev_dbg(dev, "vin[%d] max is: 0x%02x\n", i, data->in_max[i]);
1302 }
1303 dev_dbg(dev, "%d set of Fan Counts/Divisors: ===>\n", NUMBER_OF_FANIN);
1304 for (i = 0; i < NUMBER_OF_FANIN; i++) {
1305 dev_dbg(dev, "fan[%d] is: 0x%02x\n", i, data->fan[i]);
1306 dev_dbg(dev, "fan[%d] min is: 0x%02x\n", i, data->fan_min[i]);
1307 dev_dbg(dev, "fan_div[%d] is: 0x%02x\n", i, data->fan_div[i]);
1308 }
1309
1310 /* temperature math is signed, but only print out the
1311 bits that matter */
1312 dev_dbg(dev, "%d set of Temperatures: ===>\n", NUMBER_OF_TEMPIN);
1313 for (i = 0; i < 3; i++) {
1314 dev_dbg(dev, "temp1[%d] is: 0x%02x\n", i, (u8) data->temp1[i]);
1315 }
1316 for (i = 0; i < 2; i++) {
1317 for (j = 0; j < 3; j++) {
1318 dev_dbg(dev, "temp_add[%d][%d] is: 0x%04x\n", i, j,
1319 (u16) data->temp_add[i][j]);
1320 }
1321 }
1322
1323 dev_dbg(dev, "Misc Information: ===>\n");
1324 dev_dbg(dev, "alarm is: 0x%08x\n", data->alarms);
1325 dev_dbg(dev, "beep_mask is: 0x%08x\n", data->beep_mask);
1326 dev_dbg(dev, "beep_enable is: %d\n", data->beep_enable);
1327 dev_dbg(dev, "vid is: 0x%02x\n", data->vid);
1328 dev_dbg(dev, "vrm is: 0x%02x\n", data->vrm);
1329 dev_dbg(dev, "=======End of w83791d debug values========\n");
1330 dev_dbg(dev, "\n");
1331}
1332#endif
1333
1334static int __init sensors_w83791d_init(void)
1335{
1336 return i2c_add_driver(&w83791d_driver);
1337}
1338
1339static void __exit sensors_w83791d_exit(void)
1340{
1341 i2c_del_driver(&w83791d_driver);
1342}
1343
1344MODULE_AUTHOR("Charles Spirakis <bezaur@gmail.com>");
1345MODULE_DESCRIPTION("W83791D driver");
1346MODULE_LICENSE("GPL");
1347
1348module_init(sensors_w83791d_init);
1349module_exit(sensors_w83791d_exit);