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