blob: a9c01a6f00571d0f39b9a0d6e2dbf3e483e54c5e [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{
843 struct i2c_client *client = to_i2c_client(dev);
844 struct w83791d_data *data = i2c_get_clientdata(client);
845 unsigned long val = simple_strtoul(buf, NULL, 10);
846
847 /* No lock needed as vrm is internal to the driver
848 (not read from a chip register) and so is not
849 updated in w83791d_update_device() */
850 data->vrm = val;
851
852 return count;
853}
854
855static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
856
Jim Cromie34fc9212006-10-08 21:56:29 +0200857#define IN_UNIT_ATTRS(X) \
858 &sda_in_input[X].dev_attr.attr, \
859 &sda_in_min[X].dev_attr.attr, \
Charles Spirakis64383122007-09-04 13:31:56 -0700860 &sda_in_max[X].dev_attr.attr, \
861 &sda_in_beep[X].dev_attr.attr, \
862 &sda_in_alarm[X].dev_attr.attr
Jim Cromie34fc9212006-10-08 21:56:29 +0200863
864#define FAN_UNIT_ATTRS(X) \
865 &sda_fan_input[X].dev_attr.attr, \
866 &sda_fan_min[X].dev_attr.attr, \
Charles Spirakis64383122007-09-04 13:31:56 -0700867 &sda_fan_div[X].dev_attr.attr, \
868 &sda_fan_beep[X].dev_attr.attr, \
869 &sda_fan_alarm[X].dev_attr.attr
Jim Cromie34fc9212006-10-08 21:56:29 +0200870
871#define TEMP_UNIT_ATTRS(X) \
872 &sda_temp_input[X].dev_attr.attr, \
873 &sda_temp_max[X].dev_attr.attr, \
Charles Spirakis64383122007-09-04 13:31:56 -0700874 &sda_temp_max_hyst[X].dev_attr.attr, \
875 &sda_temp_beep[X].dev_attr.attr, \
876 &sda_temp_alarm[X].dev_attr.attr
Jim Cromie34fc9212006-10-08 21:56:29 +0200877
878static struct attribute *w83791d_attributes[] = {
879 IN_UNIT_ATTRS(0),
880 IN_UNIT_ATTRS(1),
881 IN_UNIT_ATTRS(2),
882 IN_UNIT_ATTRS(3),
883 IN_UNIT_ATTRS(4),
884 IN_UNIT_ATTRS(5),
885 IN_UNIT_ATTRS(6),
886 IN_UNIT_ATTRS(7),
887 IN_UNIT_ATTRS(8),
888 IN_UNIT_ATTRS(9),
889 FAN_UNIT_ATTRS(0),
890 FAN_UNIT_ATTRS(1),
891 FAN_UNIT_ATTRS(2),
892 FAN_UNIT_ATTRS(3),
893 FAN_UNIT_ATTRS(4),
894 TEMP_UNIT_ATTRS(0),
895 TEMP_UNIT_ATTRS(1),
896 TEMP_UNIT_ATTRS(2),
897 &dev_attr_alarms.attr,
898 &sda_beep_ctrl[0].dev_attr.attr,
899 &sda_beep_ctrl[1].dev_attr.attr,
900 &dev_attr_cpu0_vid.attr,
901 &dev_attr_vrm.attr,
902 NULL
903};
904
905static const struct attribute_group w83791d_group = {
906 .attrs = w83791d_attributes,
907};
908
Charles Spirakis98739642006-04-25 14:21:03 +0200909/* This function is called when:
910 * w83791d_driver is inserted (when this module is loaded), for each
911 available adapter
912 * when a new adapter is inserted (and w83791d_driver is still present) */
913static int w83791d_attach_adapter(struct i2c_adapter *adapter)
914{
915 if (!(adapter->class & I2C_CLASS_HWMON))
916 return 0;
917 return i2c_probe(adapter, &addr_data, w83791d_detect);
918}
919
920
921static int w83791d_create_subclient(struct i2c_adapter *adapter,
922 struct i2c_client *client, int addr,
923 struct i2c_client **sub_cli)
924{
925 int err;
926 struct i2c_client *sub_client;
927
928 (*sub_cli) = sub_client =
929 kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
930 if (!(sub_client)) {
931 return -ENOMEM;
932 }
933 sub_client->addr = 0x48 + addr;
934 i2c_set_clientdata(sub_client, NULL);
935 sub_client->adapter = adapter;
936 sub_client->driver = &w83791d_driver;
937 strlcpy(sub_client->name, "w83791d subclient", I2C_NAME_SIZE);
938 if ((err = i2c_attach_client(sub_client))) {
939 dev_err(&client->dev, "subclient registration "
940 "at address 0x%x failed\n", sub_client->addr);
941 kfree(sub_client);
942 return err;
943 }
944 return 0;
945}
946
947
948static int w83791d_detect_subclients(struct i2c_adapter *adapter, int address,
949 int kind, struct i2c_client *client)
950{
951 struct w83791d_data *data = i2c_get_clientdata(client);
952 int i, id, err;
953 u8 val;
954
955 id = i2c_adapter_id(adapter);
956 if (force_subclients[0] == id && force_subclients[1] == address) {
957 for (i = 2; i <= 3; i++) {
958 if (force_subclients[i] < 0x48 ||
959 force_subclients[i] > 0x4f) {
960 dev_err(&client->dev,
961 "invalid subclient "
962 "address %d; must be 0x48-0x4f\n",
963 force_subclients[i]);
964 err = -ENODEV;
965 goto error_sc_0;
966 }
967 }
968 w83791d_write(client, W83791D_REG_I2C_SUBADDR,
969 (force_subclients[2] & 0x07) |
970 ((force_subclients[3] & 0x07) << 4));
971 }
972
973 val = w83791d_read(client, W83791D_REG_I2C_SUBADDR);
974 if (!(val & 0x08)) {
975 err = w83791d_create_subclient(adapter, client,
976 val & 0x7, &data->lm75[0]);
977 if (err < 0)
978 goto error_sc_0;
979 }
980 if (!(val & 0x80)) {
981 if ((data->lm75[0] != NULL) &&
982 ((val & 0x7) == ((val >> 4) & 0x7))) {
983 dev_err(&client->dev,
984 "duplicate addresses 0x%x, "
985 "use force_subclient\n",
986 data->lm75[0]->addr);
987 err = -ENODEV;
988 goto error_sc_1;
989 }
990 err = w83791d_create_subclient(adapter, client,
991 (val >> 4) & 0x7, &data->lm75[1]);
992 if (err < 0)
993 goto error_sc_1;
994 }
995
996 return 0;
997
998/* Undo inits in case of errors */
999
1000error_sc_1:
1001 if (data->lm75[0] != NULL) {
1002 i2c_detach_client(data->lm75[0]);
1003 kfree(data->lm75[0]);
1004 }
1005error_sc_0:
1006 return err;
1007}
1008
1009
1010static int w83791d_detect(struct i2c_adapter *adapter, int address, int kind)
1011{
1012 struct i2c_client *client;
1013 struct device *dev;
1014 struct w83791d_data *data;
1015 int i, val1, val2;
1016 int err = 0;
1017 const char *client_name = "";
1018
1019 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1020 goto error0;
1021 }
1022
1023 /* OK. For now, we presume we have a valid client. We now create the
1024 client structure, even though we cannot fill it completely yet.
1025 But it allows us to access w83791d_{read,write}_value. */
1026 if (!(data = kzalloc(sizeof(struct w83791d_data), GFP_KERNEL))) {
1027 err = -ENOMEM;
1028 goto error0;
1029 }
1030
1031 client = &data->client;
1032 dev = &client->dev;
1033 i2c_set_clientdata(client, data);
1034 client->addr = address;
1035 client->adapter = adapter;
1036 client->driver = &w83791d_driver;
1037 mutex_init(&data->update_lock);
1038
1039 /* Now, we do the remaining detection. */
1040
1041 /* The w83791d may be stuck in some other bank than bank 0. This may
1042 make reading other information impossible. Specify a force=...
1043 parameter, and the Winbond will be reset to the right bank. */
1044 if (kind < 0) {
1045 if (w83791d_read(client, W83791D_REG_CONFIG) & 0x80) {
1046 dev_dbg(dev, "Detection failed at step 1\n");
1047 goto error1;
1048 }
1049 val1 = w83791d_read(client, W83791D_REG_BANK);
1050 val2 = w83791d_read(client, W83791D_REG_CHIPMAN);
1051 /* Check for Winbond ID if in bank 0 */
1052 if (!(val1 & 0x07)) {
1053 /* yes it is Bank0 */
1054 if (((!(val1 & 0x80)) && (val2 != 0xa3)) ||
1055 ((val1 & 0x80) && (val2 != 0x5c))) {
1056 dev_dbg(dev, "Detection failed at step 2\n");
1057 goto error1;
1058 }
1059 }
1060 /* If Winbond chip, address of chip and W83791D_REG_I2C_ADDR
1061 should match */
1062 if (w83791d_read(client, W83791D_REG_I2C_ADDR) != address) {
1063 dev_dbg(dev, "Detection failed at step 3\n");
1064 goto error1;
1065 }
1066 }
1067
1068 /* We either have a force parameter or we have reason to
1069 believe it is a Winbond chip. Either way, we want bank 0 and
1070 Vendor ID high byte */
1071 val1 = w83791d_read(client, W83791D_REG_BANK) & 0x78;
1072 w83791d_write(client, W83791D_REG_BANK, val1 | 0x80);
1073
1074 /* Verify it is a Winbond w83791d */
1075 if (kind <= 0) {
1076 /* get vendor ID */
1077 val2 = w83791d_read(client, W83791D_REG_CHIPMAN);
1078 if (val2 != 0x5c) { /* the vendor is NOT Winbond */
1079 dev_dbg(dev, "Detection failed at step 4\n");
1080 goto error1;
1081 }
1082 val1 = w83791d_read(client, W83791D_REG_WCHIPID);
1083 if (val1 == 0x71) {
1084 kind = w83791d;
1085 } else {
1086 if (kind == 0)
1087 dev_warn(dev,
1088 "w83791d: Ignoring 'force' parameter "
1089 "for unknown chip at adapter %d, "
1090 "address 0x%02x\n",
1091 i2c_adapter_id(adapter), address);
1092 goto error1;
1093 }
1094 }
1095
1096 if (kind == w83791d) {
1097 client_name = "w83791d";
1098 } else {
Joe Perches898eb712007-10-18 03:06:30 -07001099 dev_err(dev, "w83791d: Internal error: unknown kind (%d)?!?\n",
Charles Spirakis98739642006-04-25 14:21:03 +02001100 kind);
1101 goto error1;
1102 }
1103
1104#ifdef DEBUG
1105 val1 = w83791d_read(client, W83791D_REG_DID_VID4);
1106 dev_dbg(dev, "Device ID version: %d.%d (0x%02x)\n",
1107 (val1 >> 5) & 0x07, (val1 >> 1) & 0x0f, val1);
1108#endif
1109
1110 /* Fill in the remaining client fields and put into the global list */
1111 strlcpy(client->name, client_name, I2C_NAME_SIZE);
1112
1113 /* Tell the I2C layer a new client has arrived */
1114 if ((err = i2c_attach_client(client)))
1115 goto error1;
1116
1117 if ((err = w83791d_detect_subclients(adapter, address, kind, client)))
1118 goto error2;
1119
1120 /* Initialize the chip */
1121 w83791d_init_client(client);
1122
1123 /* If the fan_div is changed, make sure there is a rational
1124 fan_min in place */
1125 for (i = 0; i < NUMBER_OF_FANIN; i++) {
1126 data->fan_min[i] = w83791d_read(client, W83791D_REG_FAN_MIN[i]);
1127 }
1128
1129 /* Register sysfs hooks */
Jim Cromie34fc9212006-10-08 21:56:29 +02001130 if ((err = sysfs_create_group(&client->dev.kobj, &w83791d_group)))
1131 goto error3;
1132
1133 /* Everything is ready, now register the working device */
Tony Jones1beeffe2007-08-20 13:46:20 -07001134 data->hwmon_dev = hwmon_device_register(dev);
1135 if (IS_ERR(data->hwmon_dev)) {
1136 err = PTR_ERR(data->hwmon_dev);
Jim Cromie34fc9212006-10-08 21:56:29 +02001137 goto error4;
Charles Spirakis98739642006-04-25 14:21:03 +02001138 }
1139
Charles Spirakis98739642006-04-25 14:21:03 +02001140 return 0;
1141
Jim Cromie34fc9212006-10-08 21:56:29 +02001142error4:
1143 sysfs_remove_group(&client->dev.kobj, &w83791d_group);
Charles Spirakis98739642006-04-25 14:21:03 +02001144error3:
1145 if (data->lm75[0] != NULL) {
1146 i2c_detach_client(data->lm75[0]);
1147 kfree(data->lm75[0]);
1148 }
1149 if (data->lm75[1] != NULL) {
1150 i2c_detach_client(data->lm75[1]);
1151 kfree(data->lm75[1]);
1152 }
1153error2:
1154 i2c_detach_client(client);
1155error1:
1156 kfree(data);
1157error0:
1158 return err;
1159}
1160
1161static int w83791d_detach_client(struct i2c_client *client)
1162{
1163 struct w83791d_data *data = i2c_get_clientdata(client);
1164 int err;
1165
1166 /* main client */
Jim Cromie34fc9212006-10-08 21:56:29 +02001167 if (data) {
Tony Jones1beeffe2007-08-20 13:46:20 -07001168 hwmon_device_unregister(data->hwmon_dev);
Jim Cromie34fc9212006-10-08 21:56:29 +02001169 sysfs_remove_group(&client->dev.kobj, &w83791d_group);
1170 }
Charles Spirakis98739642006-04-25 14:21:03 +02001171
1172 if ((err = i2c_detach_client(client)))
1173 return err;
1174
1175 /* main client */
1176 if (data)
1177 kfree(data);
1178 /* subclient */
1179 else
1180 kfree(client);
1181
1182 return 0;
1183}
1184
1185static void w83791d_init_client(struct i2c_client *client)
1186{
1187 struct w83791d_data *data = i2c_get_clientdata(client);
1188 u8 tmp;
1189 u8 old_beep;
1190
1191 /* The difference between reset and init is that reset
1192 does a hard reset of the chip via index 0x40, bit 7,
1193 but init simply forces certain registers to have "sane"
1194 values. The hope is that the BIOS has done the right
1195 thing (which is why the default is reset=0, init=0),
1196 but if not, reset is the hard hammer and init
1197 is the soft mallet both of which are trying to whack
1198 things into place...
1199 NOTE: The data sheet makes a distinction between
1200 "power on defaults" and "reset by MR". As far as I can tell,
1201 the hard reset puts everything into a power-on state so I'm
1202 not sure what "reset by MR" means or how it can happen.
1203 */
1204 if (reset || init) {
1205 /* keep some BIOS settings when we... */
1206 old_beep = w83791d_read(client, W83791D_REG_BEEP_CONFIG);
1207
1208 if (reset) {
1209 /* ... reset the chip and ... */
1210 w83791d_write(client, W83791D_REG_CONFIG, 0x80);
1211 }
1212
1213 /* ... disable power-on abnormal beep */
1214 w83791d_write(client, W83791D_REG_BEEP_CONFIG, old_beep | 0x80);
1215
1216 /* disable the global beep (not done by hard reset) */
1217 tmp = w83791d_read(client, W83791D_REG_BEEP_CTRL[1]);
1218 w83791d_write(client, W83791D_REG_BEEP_CTRL[1], tmp & 0xef);
1219
1220 if (init) {
1221 /* Make sure monitoring is turned on for add-ons */
1222 tmp = w83791d_read(client, W83791D_REG_TEMP2_CONFIG);
1223 if (tmp & 1) {
1224 w83791d_write(client, W83791D_REG_TEMP2_CONFIG,
1225 tmp & 0xfe);
1226 }
1227
1228 tmp = w83791d_read(client, W83791D_REG_TEMP3_CONFIG);
1229 if (tmp & 1) {
1230 w83791d_write(client, W83791D_REG_TEMP3_CONFIG,
1231 tmp & 0xfe);
1232 }
1233
1234 /* Start monitoring */
1235 tmp = w83791d_read(client, W83791D_REG_CONFIG) & 0xf7;
1236 w83791d_write(client, W83791D_REG_CONFIG, tmp | 0x01);
1237 }
1238 }
1239
1240 data->vrm = vid_which_vrm();
1241}
1242
1243static struct w83791d_data *w83791d_update_device(struct device *dev)
1244{
1245 struct i2c_client *client = to_i2c_client(dev);
1246 struct w83791d_data *data = i2c_get_clientdata(client);
1247 int i, j;
1248 u8 reg_array_tmp[3];
1249
1250 mutex_lock(&data->update_lock);
1251
1252 if (time_after(jiffies, data->last_updated + (HZ * 3))
1253 || !data->valid) {
1254 dev_dbg(dev, "Starting w83791d device update\n");
1255
1256 /* Update the voltages measured value and limits */
1257 for (i = 0; i < NUMBER_OF_VIN; i++) {
1258 data->in[i] = w83791d_read(client,
1259 W83791D_REG_IN[i]);
1260 data->in_max[i] = w83791d_read(client,
1261 W83791D_REG_IN_MAX[i]);
1262 data->in_min[i] = w83791d_read(client,
1263 W83791D_REG_IN_MIN[i]);
1264 }
1265
1266 /* Update the fan counts and limits */
1267 for (i = 0; i < NUMBER_OF_FANIN; i++) {
1268 /* Update the Fan measured value and limits */
1269 data->fan[i] = w83791d_read(client,
1270 W83791D_REG_FAN[i]);
1271 data->fan_min[i] = w83791d_read(client,
1272 W83791D_REG_FAN_MIN[i]);
1273 }
1274
1275 /* Update the fan divisor */
1276 for (i = 0; i < 3; i++) {
1277 reg_array_tmp[i] = w83791d_read(client,
1278 W83791D_REG_FAN_DIV[i]);
1279 }
1280 data->fan_div[0] = (reg_array_tmp[0] >> 4) & 0x03;
1281 data->fan_div[1] = (reg_array_tmp[0] >> 6) & 0x03;
1282 data->fan_div[2] = (reg_array_tmp[1] >> 6) & 0x03;
1283 data->fan_div[3] = reg_array_tmp[2] & 0x07;
1284 data->fan_div[4] = (reg_array_tmp[2] >> 4) & 0x07;
1285
1286 /* Update the first temperature sensor */
1287 for (i = 0; i < 3; i++) {
1288 data->temp1[i] = w83791d_read(client,
1289 W83791D_REG_TEMP1[i]);
1290 }
1291
1292 /* Update the rest of the temperature sensors */
1293 for (i = 0; i < 2; i++) {
1294 for (j = 0; j < 3; j++) {
1295 data->temp_add[i][j] =
1296 (w83791d_read(client,
1297 W83791D_REG_TEMP_ADD[i][j * 2]) << 8) |
1298 w83791d_read(client,
1299 W83791D_REG_TEMP_ADD[i][j * 2 + 1]);
1300 }
1301 }
1302
1303 /* Update the realtime status */
1304 data->alarms =
1305 w83791d_read(client, W83791D_REG_ALARM1) +
1306 (w83791d_read(client, W83791D_REG_ALARM2) << 8) +
1307 (w83791d_read(client, W83791D_REG_ALARM3) << 16);
1308
1309 /* Update the beep configuration information */
1310 data->beep_mask =
1311 w83791d_read(client, W83791D_REG_BEEP_CTRL[0]) +
1312 (w83791d_read(client, W83791D_REG_BEEP_CTRL[1]) << 8) +
1313 (w83791d_read(client, W83791D_REG_BEEP_CTRL[2]) << 16);
1314
Charles Spirakis125751cb2006-09-24 20:53:04 +02001315 /* Extract global beep enable flag */
Charles Spirakis98739642006-04-25 14:21:03 +02001316 data->beep_enable =
1317 (data->beep_mask >> GLOBAL_BEEP_ENABLE_SHIFT) & 0x01;
1318
1319 /* Update the cpu voltage information */
1320 i = w83791d_read(client, W83791D_REG_VID_FANDIV);
1321 data->vid = i & 0x0f;
1322 data->vid |= (w83791d_read(client, W83791D_REG_DID_VID4) & 0x01)
1323 << 4;
1324
1325 data->last_updated = jiffies;
1326 data->valid = 1;
1327 }
1328
1329 mutex_unlock(&data->update_lock);
1330
1331#ifdef DEBUG
1332 w83791d_print_debug(data, dev);
1333#endif
1334
1335 return data;
1336}
1337
1338#ifdef DEBUG
1339static void w83791d_print_debug(struct w83791d_data *data, struct device *dev)
1340{
1341 int i = 0, j = 0;
1342
1343 dev_dbg(dev, "======Start of w83791d debug values======\n");
1344 dev_dbg(dev, "%d set of Voltages: ===>\n", NUMBER_OF_VIN);
1345 for (i = 0; i < NUMBER_OF_VIN; i++) {
1346 dev_dbg(dev, "vin[%d] is: 0x%02x\n", i, data->in[i]);
1347 dev_dbg(dev, "vin[%d] min is: 0x%02x\n", i, data->in_min[i]);
1348 dev_dbg(dev, "vin[%d] max is: 0x%02x\n", i, data->in_max[i]);
1349 }
1350 dev_dbg(dev, "%d set of Fan Counts/Divisors: ===>\n", NUMBER_OF_FANIN);
1351 for (i = 0; i < NUMBER_OF_FANIN; i++) {
1352 dev_dbg(dev, "fan[%d] is: 0x%02x\n", i, data->fan[i]);
1353 dev_dbg(dev, "fan[%d] min is: 0x%02x\n", i, data->fan_min[i]);
1354 dev_dbg(dev, "fan_div[%d] is: 0x%02x\n", i, data->fan_div[i]);
1355 }
1356
1357 /* temperature math is signed, but only print out the
1358 bits that matter */
1359 dev_dbg(dev, "%d set of Temperatures: ===>\n", NUMBER_OF_TEMPIN);
1360 for (i = 0; i < 3; i++) {
1361 dev_dbg(dev, "temp1[%d] is: 0x%02x\n", i, (u8) data->temp1[i]);
1362 }
1363 for (i = 0; i < 2; i++) {
1364 for (j = 0; j < 3; j++) {
1365 dev_dbg(dev, "temp_add[%d][%d] is: 0x%04x\n", i, j,
1366 (u16) data->temp_add[i][j]);
1367 }
1368 }
1369
1370 dev_dbg(dev, "Misc Information: ===>\n");
1371 dev_dbg(dev, "alarm is: 0x%08x\n", data->alarms);
1372 dev_dbg(dev, "beep_mask is: 0x%08x\n", data->beep_mask);
1373 dev_dbg(dev, "beep_enable is: %d\n", data->beep_enable);
1374 dev_dbg(dev, "vid is: 0x%02x\n", data->vid);
1375 dev_dbg(dev, "vrm is: 0x%02x\n", data->vrm);
1376 dev_dbg(dev, "=======End of w83791d debug values========\n");
1377 dev_dbg(dev, "\n");
1378}
1379#endif
1380
1381static int __init sensors_w83791d_init(void)
1382{
1383 return i2c_add_driver(&w83791d_driver);
1384}
1385
1386static void __exit sensors_w83791d_exit(void)
1387{
1388 i2c_del_driver(&w83791d_driver);
1389}
1390
1391MODULE_AUTHOR("Charles Spirakis <bezaur@gmail.com>");
1392MODULE_DESCRIPTION("W83791D driver");
1393MODULE_LICENSE("GPL");
1394
1395module_init(sensors_w83791d_init);
1396module_exit(sensors_w83791d_exit);