blob: 3ba1d6b334730e06a5ac30c7fddd54f4e97f7a78 [file] [log] [blame]
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001/*
2 w83793.c - Linux kernel driver for hardware monitoring
3 Copyright (C) 2006 Winbond Electronics Corp.
4 Yuan Mu
5 Rudolf Marek <r.marek@assembler.cz>
6
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 - version 2.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 USA.
20*/
21
22/*
23 Supports following chips:
24
25 Chip #vin #fanin #pwm #temp wchipid vendid i2c ISA
26 w83793 10 12 8 6 0x7b 0x5ca3 yes no
27*/
28
29#include <linux/module.h>
30#include <linux/init.h>
31#include <linux/slab.h>
32#include <linux/i2c.h>
33#include <linux/hwmon.h>
34#include <linux/hwmon-vid.h>
35#include <linux/hwmon-sysfs.h>
36#include <linux/err.h>
37#include <linux/mutex.h>
38
39/* Addresses to scan */
40static unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f, I2C_CLIENT_END };
41
42/* Insmod parameters */
43I2C_CLIENT_INSMOD_1(w83793);
44I2C_CLIENT_MODULE_PARM(force_subclients, "List of subclient addresses: "
45 "{bus, clientaddr, subclientaddr1, subclientaddr2}");
46
47static int reset;
48module_param(reset, bool, 0);
49MODULE_PARM_DESC(reset, "Set to 1 to reset chip, not recommended");
50
51/*
52 Address 0x00, 0x0d, 0x0e, 0x0f in all three banks are reserved
53 as ID, Bank Select registers
54*/
55#define W83793_REG_BANKSEL 0x00
56#define W83793_REG_VENDORID 0x0d
57#define W83793_REG_CHIPID 0x0e
58#define W83793_REG_DEVICEID 0x0f
59
60#define W83793_REG_CONFIG 0x40
61#define W83793_REG_MFC 0x58
62#define W83793_REG_FANIN_CTRL 0x5c
63#define W83793_REG_FANIN_SEL 0x5d
64#define W83793_REG_I2C_ADDR 0x0b
65#define W83793_REG_I2C_SUBADDR 0x0c
66#define W83793_REG_VID_INA 0x05
67#define W83793_REG_VID_INB 0x06
68#define W83793_REG_VID_LATCHA 0x07
69#define W83793_REG_VID_LATCHB 0x08
70#define W83793_REG_VID_CTRL 0x59
71
72static u16 W83793_REG_TEMP_MODE[2] = { 0x5e, 0x5f };
73
74#define TEMP_READ 0
75#define TEMP_CRIT 1
76#define TEMP_CRIT_HYST 2
77#define TEMP_WARN 3
78#define TEMP_WARN_HYST 4
79/* only crit and crit_hyst affect real-time alarm status
80 current crit crit_hyst warn warn_hyst */
81static u16 W83793_REG_TEMP[][5] = {
82 {0x1c, 0x78, 0x79, 0x7a, 0x7b},
83 {0x1d, 0x7c, 0x7d, 0x7e, 0x7f},
84 {0x1e, 0x80, 0x81, 0x82, 0x83},
85 {0x1f, 0x84, 0x85, 0x86, 0x87},
86 {0x20, 0x88, 0x89, 0x8a, 0x8b},
87 {0x21, 0x8c, 0x8d, 0x8e, 0x8f},
88};
89
90#define W83793_REG_TEMP_LOW_BITS 0x22
91
92#define W83793_REG_BEEP(index) (0x53 + (index))
93#define W83793_REG_ALARM(index) (0x4b + (index))
94
95#define W83793_REG_CLR_CHASSIS 0x4a /* SMI MASK4 */
96#define W83793_REG_IRQ_CTRL 0x50
97#define W83793_REG_OVT_CTRL 0x51
98#define W83793_REG_OVT_BEEP 0x52
99
100#define IN_READ 0
101#define IN_MAX 1
102#define IN_LOW 2
103static const u16 W83793_REG_IN[][3] = {
104 /* Current, High, Low */
105 {0x10, 0x60, 0x61}, /* Vcore A */
106 {0x11, 0x62, 0x63}, /* Vcore B */
107 {0x12, 0x64, 0x65}, /* Vtt */
108 {0x14, 0x6a, 0x6b}, /* VSEN1 */
109 {0x15, 0x6c, 0x6d}, /* VSEN2 */
110 {0x16, 0x6e, 0x6f}, /* +3VSEN */
111 {0x17, 0x70, 0x71}, /* +12VSEN */
112 {0x18, 0x72, 0x73}, /* 5VDD */
113 {0x19, 0x74, 0x75}, /* 5VSB */
114 {0x1a, 0x76, 0x77}, /* VBAT */
115};
116
117/* Low Bits of Vcore A/B Vtt Read/High/Low */
118static const u16 W83793_REG_IN_LOW_BITS[] = { 0x1b, 0x68, 0x69 };
119static u8 scale_in[] = { 2, 2, 2, 16, 16, 16, 8, 24, 24, 16 };
Gong Junddca9332007-01-18 22:14:23 +0100120static u8 scale_in_add[] = { 0, 0, 0, 0, 0, 0, 0, 150, 150, 0 };
Rudolf Marek6800c3d2006-12-12 18:18:30 +0100121
122#define W83793_REG_FAN(index) (0x23 + 2 * (index)) /* High byte */
123#define W83793_REG_FAN_MIN(index) (0x90 + 2 * (index)) /* High byte */
124
125#define W83793_REG_PWM_DEFAULT 0xb2
126#define W83793_REG_PWM_ENABLE 0x207
127#define W83793_REG_PWM_UPTIME 0xc3 /* Unit in 0.1 second */
128#define W83793_REG_PWM_DOWNTIME 0xc4 /* Unit in 0.1 second */
129#define W83793_REG_TEMP_CRITICAL 0xc5
130
131#define PWM_DUTY 0
132#define PWM_START 1
133#define PWM_NONSTOP 2
Nicolas Kaiser5aebefb2007-11-07 13:28:59 +0100134#define PWM_STOP_TIME 3
Rudolf Marek6800c3d2006-12-12 18:18:30 +0100135#define W83793_REG_PWM(index, nr) (((nr) == 0 ? 0xb3 : \
136 (nr) == 1 ? 0x220 : 0x218) + (index))
137
138/* bit field, fan1 is bit0, fan2 is bit1 ... */
139#define W83793_REG_TEMP_FAN_MAP(index) (0x201 + (index))
140#define W83793_REG_TEMP_TOL(index) (0x208 + (index))
141#define W83793_REG_TEMP_CRUISE(index) (0x210 + (index))
142#define W83793_REG_PWM_STOP_TIME(index) (0x228 + (index))
143#define W83793_REG_SF2_TEMP(index, nr) (0x230 + ((index) << 4) + (nr))
144#define W83793_REG_SF2_PWM(index, nr) (0x238 + ((index) << 4) + (nr))
145
146static inline unsigned long FAN_FROM_REG(u16 val)
147{
148 if ((val >= 0xfff) || (val == 0))
149 return 0;
150 return (1350000UL / val);
151}
152
153static inline u16 FAN_TO_REG(long rpm)
154{
155 if (rpm <= 0)
156 return 0x0fff;
157 return SENSORS_LIMIT((1350000 + (rpm >> 1)) / rpm, 1, 0xffe);
158}
159
160static inline unsigned long TIME_FROM_REG(u8 reg)
161{
162 return (reg * 100);
163}
164
165static inline u8 TIME_TO_REG(unsigned long val)
166{
167 return SENSORS_LIMIT((val + 50) / 100, 0, 0xff);
168}
169
170static inline long TEMP_FROM_REG(s8 reg)
171{
172 return (reg * 1000);
173}
174
175static inline s8 TEMP_TO_REG(long val, s8 min, s8 max)
176{
177 return SENSORS_LIMIT((val + (val < 0 ? -500 : 500)) / 1000, min, max);
178}
179
180struct w83793_data {
181 struct i2c_client client;
182 struct i2c_client *lm75[2];
Tony Jones1beeffe2007-08-20 13:46:20 -0700183 struct device *hwmon_dev;
Rudolf Marek6800c3d2006-12-12 18:18:30 +0100184 struct mutex update_lock;
185 char valid; /* !=0 if following fields are valid */
186 unsigned long last_updated; /* In jiffies */
187 unsigned long last_nonvolatile; /* In jiffies, last time we update the
188 nonvolatile registers */
189
190 u8 bank;
191 u8 vrm;
192 u8 vid[2];
193 u8 in[10][3]; /* Register value, read/high/low */
194 u8 in_low_bits[3]; /* Additional resolution for VCore A/B Vtt */
195
196 u16 has_fan; /* Only fan1- fan5 has own pins */
197 u16 fan[12]; /* Register value combine */
198 u16 fan_min[12]; /* Register value combine */
199
200 s8 temp[6][5]; /* current, crit, crit_hyst,warn, warn_hyst */
201 u8 temp_low_bits; /* Additional resolution TD1-TD4 */
202 u8 temp_mode[2]; /* byte 0: Temp D1-D4 mode each has 2 bits
203 byte 1: Temp R1,R2 mode, each has 1 bit */
204 u8 temp_critical; /* If reached all fan will be at full speed */
205 u8 temp_fan_map[6]; /* Temp controls which pwm fan, bit field */
206
207 u8 has_pwm;
Gong Jun46bed4d2007-01-18 22:14:24 +0100208 u8 has_temp;
Gong Junc70a8c32007-01-18 22:14:24 +0100209 u8 has_vid;
Rudolf Marek6800c3d2006-12-12 18:18:30 +0100210 u8 pwm_enable; /* Register value, each Temp has 1 bit */
211 u8 pwm_uptime; /* Register value */
212 u8 pwm_downtime; /* Register value */
213 u8 pwm_default; /* All fan default pwm, next poweron valid */
214 u8 pwm[8][3]; /* Register value */
215 u8 pwm_stop_time[8];
216 u8 temp_cruise[6];
217
218 u8 alarms[5]; /* realtime status registers */
219 u8 beeps[5];
220 u8 beep_enable;
221 u8 tolerance[3]; /* Temp tolerance(Smart Fan I/II) */
222 u8 sf2_pwm[6][7]; /* Smart FanII: Fan duty cycle */
223 u8 sf2_temp[6][7]; /* Smart FanII: Temp level point */
224};
225
226static u8 w83793_read_value(struct i2c_client *client, u16 reg);
227static int w83793_write_value(struct i2c_client *client, u16 reg, u8 value);
228static int w83793_attach_adapter(struct i2c_adapter *adapter);
229static int w83793_detect(struct i2c_adapter *adapter, int address, int kind);
230static int w83793_detach_client(struct i2c_client *client);
231static void w83793_init_client(struct i2c_client *client);
232static void w83793_update_nonvolatile(struct device *dev);
233static struct w83793_data *w83793_update_device(struct device *dev);
234
235static struct i2c_driver w83793_driver = {
236 .driver = {
237 .name = "w83793",
238 },
239 .attach_adapter = w83793_attach_adapter,
240 .detach_client = w83793_detach_client,
241};
242
243static ssize_t
244show_vrm(struct device *dev, struct device_attribute *attr, char *buf)
245{
Jean Delvare8f74efe2007-12-01 11:25:33 +0100246 struct w83793_data *data = dev_get_drvdata(dev);
Rudolf Marek6800c3d2006-12-12 18:18:30 +0100247 return sprintf(buf, "%d\n", data->vrm);
248}
249
250static ssize_t
251show_vid(struct device *dev, struct device_attribute *attr, char *buf)
252{
253 struct w83793_data *data = w83793_update_device(dev);
254 struct sensor_device_attribute_2 *sensor_attr =
255 to_sensor_dev_attr_2(attr);
256 int index = sensor_attr->index;
257
258 return sprintf(buf, "%d\n", vid_from_reg(data->vid[index], data->vrm));
259}
260
261static ssize_t
262store_vrm(struct device *dev, struct device_attribute *attr,
263 const char *buf, size_t count)
264{
Jean Delvare8f74efe2007-12-01 11:25:33 +0100265 struct w83793_data *data = dev_get_drvdata(dev);
Rudolf Marek6800c3d2006-12-12 18:18:30 +0100266 data->vrm = simple_strtoul(buf, NULL, 10);
267 return count;
268}
269
270#define ALARM_STATUS 0
271#define BEEP_ENABLE 1
272static ssize_t
273show_alarm_beep(struct device *dev, struct device_attribute *attr, char *buf)
274{
275 struct w83793_data *data = w83793_update_device(dev);
276 struct sensor_device_attribute_2 *sensor_attr =
277 to_sensor_dev_attr_2(attr);
278 int nr = sensor_attr->nr;
279 int index = sensor_attr->index >> 3;
280 int bit = sensor_attr->index & 0x07;
281 u8 val;
282
283 if (ALARM_STATUS == nr) {
284 val = (data->alarms[index] >> (bit)) & 1;
285 } else { /* BEEP_ENABLE */
286 val = (data->beeps[index] >> (bit)) & 1;
287 }
288
289 return sprintf(buf, "%u\n", val);
290}
291
292static ssize_t
293store_beep(struct device *dev, struct device_attribute *attr,
294 const char *buf, size_t count)
295{
296 struct i2c_client *client = to_i2c_client(dev);
297 struct w83793_data *data = i2c_get_clientdata(client);
298 struct sensor_device_attribute_2 *sensor_attr =
299 to_sensor_dev_attr_2(attr);
300 int index = sensor_attr->index >> 3;
301 int shift = sensor_attr->index & 0x07;
302 u8 beep_bit = 1 << shift;
303 u8 val;
304
305 val = simple_strtoul(buf, NULL, 10);
306 if (val != 0 && val != 1)
307 return -EINVAL;
308
309 mutex_lock(&data->update_lock);
310 data->beeps[index] = w83793_read_value(client, W83793_REG_BEEP(index));
311 data->beeps[index] &= ~beep_bit;
312 data->beeps[index] |= val << shift;
313 w83793_write_value(client, W83793_REG_BEEP(index), data->beeps[index]);
314 mutex_unlock(&data->update_lock);
315
316 return count;
317}
318
319static ssize_t
320show_beep_enable(struct device *dev, struct device_attribute *attr, char *buf)
321{
322 struct w83793_data *data = w83793_update_device(dev);
323 return sprintf(buf, "%u\n", (data->beep_enable >> 1) & 0x01);
324}
325
326static ssize_t
327store_beep_enable(struct device *dev, struct device_attribute *attr,
328 const char *buf, size_t count)
329{
330 struct i2c_client *client = to_i2c_client(dev);
331 struct w83793_data *data = i2c_get_clientdata(client);
332 u8 val = simple_strtoul(buf, NULL, 10);
333
334 if (val != 0 && val != 1)
335 return -EINVAL;
336
337 mutex_lock(&data->update_lock);
338 data->beep_enable = w83793_read_value(client, W83793_REG_OVT_BEEP)
339 & 0xfd;
340 data->beep_enable |= val << 1;
341 w83793_write_value(client, W83793_REG_OVT_BEEP, data->beep_enable);
342 mutex_unlock(&data->update_lock);
343
344 return count;
345}
346
347/* Write any value to clear chassis alarm */
348static ssize_t
349store_chassis_clear(struct device *dev,
350 struct device_attribute *attr, const char *buf,
351 size_t count)
352{
353 struct i2c_client *client = to_i2c_client(dev);
354 struct w83793_data *data = i2c_get_clientdata(client);
355 u8 val;
356
357 mutex_lock(&data->update_lock);
358 val = w83793_read_value(client, W83793_REG_CLR_CHASSIS);
359 val |= 0x80;
360 w83793_write_value(client, W83793_REG_CLR_CHASSIS, val);
361 mutex_unlock(&data->update_lock);
362 return count;
363}
364
365#define FAN_INPUT 0
366#define FAN_MIN 1
367static ssize_t
368show_fan(struct device *dev, struct device_attribute *attr, char *buf)
369{
370 struct sensor_device_attribute_2 *sensor_attr =
371 to_sensor_dev_attr_2(attr);
372 int nr = sensor_attr->nr;
373 int index = sensor_attr->index;
374 struct w83793_data *data = w83793_update_device(dev);
375 u16 val;
376
377 if (FAN_INPUT == nr) {
378 val = data->fan[index] & 0x0fff;
379 } else {
380 val = data->fan_min[index] & 0x0fff;
381 }
382
383 return sprintf(buf, "%lu\n", FAN_FROM_REG(val));
384}
385
386static ssize_t
387store_fan_min(struct device *dev, struct device_attribute *attr,
388 const char *buf, size_t count)
389{
390 struct sensor_device_attribute_2 *sensor_attr =
391 to_sensor_dev_attr_2(attr);
392 int index = sensor_attr->index;
393 struct i2c_client *client = to_i2c_client(dev);
394 struct w83793_data *data = i2c_get_clientdata(client);
395 u16 val = FAN_TO_REG(simple_strtoul(buf, NULL, 10));
396
397 mutex_lock(&data->update_lock);
398 data->fan_min[index] = val;
399 w83793_write_value(client, W83793_REG_FAN_MIN(index),
400 (val >> 8) & 0xff);
401 w83793_write_value(client, W83793_REG_FAN_MIN(index) + 1, val & 0xff);
402 mutex_unlock(&data->update_lock);
403
404 return count;
405}
406
Rudolf Marek6800c3d2006-12-12 18:18:30 +0100407static ssize_t
408show_pwm(struct device *dev, struct device_attribute *attr, char *buf)
409{
410 struct sensor_device_attribute_2 *sensor_attr =
411 to_sensor_dev_attr_2(attr);
412 struct w83793_data *data = w83793_update_device(dev);
413 u16 val;
414 int nr = sensor_attr->nr;
415 int index = sensor_attr->index;
416
417 if (PWM_STOP_TIME == nr)
418 val = TIME_FROM_REG(data->pwm_stop_time[index]);
419 else
420 val = (data->pwm[index][nr] & 0x3f) << 2;
421
422 return sprintf(buf, "%d\n", val);
423}
424
425static ssize_t
426store_pwm(struct device *dev, struct device_attribute *attr,
427 const char *buf, size_t count)
428{
429 struct i2c_client *client = to_i2c_client(dev);
430 struct w83793_data *data = i2c_get_clientdata(client);
431 struct sensor_device_attribute_2 *sensor_attr =
432 to_sensor_dev_attr_2(attr);
433 int nr = sensor_attr->nr;
434 int index = sensor_attr->index;
435 u8 val;
436
437 mutex_lock(&data->update_lock);
438 if (PWM_STOP_TIME == nr) {
439 val = TIME_TO_REG(simple_strtoul(buf, NULL, 10));
440 data->pwm_stop_time[index] = val;
441 w83793_write_value(client, W83793_REG_PWM_STOP_TIME(index),
442 val);
443 } else {
444 val = SENSORS_LIMIT(simple_strtoul(buf, NULL, 10), 0, 0xff)
445 >> 2;
446 data->pwm[index][nr] =
447 w83793_read_value(client, W83793_REG_PWM(index, nr)) & 0xc0;
448 data->pwm[index][nr] |= val;
449 w83793_write_value(client, W83793_REG_PWM(index, nr),
450 data->pwm[index][nr]);
451 }
452
453 mutex_unlock(&data->update_lock);
454 return count;
455}
456
457static ssize_t
458show_temp(struct device *dev, struct device_attribute *attr, char *buf)
459{
460 struct sensor_device_attribute_2 *sensor_attr =
461 to_sensor_dev_attr_2(attr);
462 int nr = sensor_attr->nr;
463 int index = sensor_attr->index;
464 struct w83793_data *data = w83793_update_device(dev);
465 long temp = TEMP_FROM_REG(data->temp[index][nr]);
466
467 if (TEMP_READ == nr && index < 4) { /* Only TD1-TD4 have low bits */
468 int low = ((data->temp_low_bits >> (index * 2)) & 0x03) * 250;
469 temp += temp > 0 ? low : -low;
470 }
471 return sprintf(buf, "%ld\n", temp);
472}
473
474static ssize_t
475store_temp(struct device *dev, struct device_attribute *attr,
476 const char *buf, size_t count)
477{
478 struct sensor_device_attribute_2 *sensor_attr =
479 to_sensor_dev_attr_2(attr);
480 int nr = sensor_attr->nr;
481 int index = sensor_attr->index;
482 struct i2c_client *client = to_i2c_client(dev);
483 struct w83793_data *data = i2c_get_clientdata(client);
484 long tmp = simple_strtol(buf, NULL, 10);
485
486 mutex_lock(&data->update_lock);
487 data->temp[index][nr] = TEMP_TO_REG(tmp, -128, 127);
488 w83793_write_value(client, W83793_REG_TEMP[index][nr],
489 data->temp[index][nr]);
490 mutex_unlock(&data->update_lock);
491 return count;
492}
493
494/*
495 TD1-TD4
496 each has 4 mode:(2 bits)
497 0: Stop monitor
498 1: Use internal temp sensor(default)
Gong Junddca9332007-01-18 22:14:23 +0100499 2: Reserved
Rudolf Marek6800c3d2006-12-12 18:18:30 +0100500 3: Use sensor in Intel CPU and get result by PECI
501
502 TR1-TR2
503 each has 2 mode:(1 bit)
504 0: Disable temp sensor monitor
505 1: To enable temp sensors monitor
506*/
507
Gong Junddca9332007-01-18 22:14:23 +0100508/* 0 disable, 6 PECI */
509static u8 TO_TEMP_MODE[] = { 0, 0, 0, 6 };
Rudolf Marek6800c3d2006-12-12 18:18:30 +0100510
511static ssize_t
512show_temp_mode(struct device *dev, struct device_attribute *attr, char *buf)
513{
514 struct w83793_data *data = w83793_update_device(dev);
515 struct sensor_device_attribute_2 *sensor_attr =
516 to_sensor_dev_attr_2(attr);
517 int index = sensor_attr->index;
518 u8 mask = (index < 4) ? 0x03 : 0x01;
519 u8 shift = (index < 4) ? (2 * index) : (index - 4);
520 u8 tmp;
521 index = (index < 4) ? 0 : 1;
522
523 tmp = (data->temp_mode[index] >> shift) & mask;
524
525 /* for the internal sensor, found out if diode or thermistor */
526 if (tmp == 1) {
527 tmp = index == 0 ? 3 : 4;
528 } else {
529 tmp = TO_TEMP_MODE[tmp];
530 }
531
532 return sprintf(buf, "%d\n", tmp);
533}
534
535static ssize_t
536store_temp_mode(struct device *dev, struct device_attribute *attr,
537 const char *buf, size_t count)
538{
539 struct i2c_client *client = to_i2c_client(dev);
540 struct w83793_data *data = i2c_get_clientdata(client);
541 struct sensor_device_attribute_2 *sensor_attr =
542 to_sensor_dev_attr_2(attr);
543 int index = sensor_attr->index;
544 u8 mask = (index < 4) ? 0x03 : 0x01;
545 u8 shift = (index < 4) ? (2 * index) : (index - 4);
546 u8 val = simple_strtoul(buf, NULL, 10);
547
548 /* transform the sysfs interface values into table above */
Gong Junddca9332007-01-18 22:14:23 +0100549 if ((val == 6) && (index < 4)) {
Rudolf Marek6800c3d2006-12-12 18:18:30 +0100550 val -= 3;
551 } else if ((val == 3 && index < 4)
Gong Jun46bed4d2007-01-18 22:14:24 +0100552 || (val == 4 && index >= 4)) {
Rudolf Marek6800c3d2006-12-12 18:18:30 +0100553 /* transform diode or thermistor into internal enable */
554 val = !!val;
555 } else {
556 return -EINVAL;
557 }
558
559 index = (index < 4) ? 0 : 1;
560 mutex_lock(&data->update_lock);
561 data->temp_mode[index] =
562 w83793_read_value(client, W83793_REG_TEMP_MODE[index]);
563 data->temp_mode[index] &= ~(mask << shift);
564 data->temp_mode[index] |= val << shift;
565 w83793_write_value(client, W83793_REG_TEMP_MODE[index],
566 data->temp_mode[index]);
567 mutex_unlock(&data->update_lock);
568
569 return count;
570}
571
572#define SETUP_PWM_DEFAULT 0
573#define SETUP_PWM_UPTIME 1 /* Unit in 0.1s */
574#define SETUP_PWM_DOWNTIME 2 /* Unit in 0.1s */
575#define SETUP_TEMP_CRITICAL 3
576static ssize_t
577show_sf_setup(struct device *dev, struct device_attribute *attr, char *buf)
578{
579 struct sensor_device_attribute_2 *sensor_attr =
580 to_sensor_dev_attr_2(attr);
581 int nr = sensor_attr->nr;
582 struct w83793_data *data = w83793_update_device(dev);
583 u32 val = 0;
584
585 if (SETUP_PWM_DEFAULT == nr) {
586 val = (data->pwm_default & 0x3f) << 2;
587 } else if (SETUP_PWM_UPTIME == nr) {
588 val = TIME_FROM_REG(data->pwm_uptime);
589 } else if (SETUP_PWM_DOWNTIME == nr) {
590 val = TIME_FROM_REG(data->pwm_downtime);
591 } else if (SETUP_TEMP_CRITICAL == nr) {
592 val = TEMP_FROM_REG(data->temp_critical & 0x7f);
593 }
594
595 return sprintf(buf, "%d\n", val);
596}
597
598static ssize_t
599store_sf_setup(struct device *dev, struct device_attribute *attr,
600 const char *buf, size_t count)
601{
602 struct sensor_device_attribute_2 *sensor_attr =
603 to_sensor_dev_attr_2(attr);
604 int nr = sensor_attr->nr;
605 struct i2c_client *client = to_i2c_client(dev);
606 struct w83793_data *data = i2c_get_clientdata(client);
607
608 mutex_lock(&data->update_lock);
609 if (SETUP_PWM_DEFAULT == nr) {
610 data->pwm_default =
611 w83793_read_value(client, W83793_REG_PWM_DEFAULT) & 0xc0;
612 data->pwm_default |= SENSORS_LIMIT(simple_strtoul(buf, NULL,
613 10),
614 0, 0xff) >> 2;
615 w83793_write_value(client, W83793_REG_PWM_DEFAULT,
616 data->pwm_default);
617 } else if (SETUP_PWM_UPTIME == nr) {
618 data->pwm_uptime = TIME_TO_REG(simple_strtoul(buf, NULL, 10));
619 data->pwm_uptime += data->pwm_uptime == 0 ? 1 : 0;
620 w83793_write_value(client, W83793_REG_PWM_UPTIME,
621 data->pwm_uptime);
622 } else if (SETUP_PWM_DOWNTIME == nr) {
623 data->pwm_downtime = TIME_TO_REG(simple_strtoul(buf, NULL, 10));
624 data->pwm_downtime += data->pwm_downtime == 0 ? 1 : 0;
625 w83793_write_value(client, W83793_REG_PWM_DOWNTIME,
626 data->pwm_downtime);
627 } else { /* SETUP_TEMP_CRITICAL */
628 data->temp_critical =
629 w83793_read_value(client, W83793_REG_TEMP_CRITICAL) & 0x80;
630 data->temp_critical |= TEMP_TO_REG(simple_strtol(buf, NULL, 10),
631 0, 0x7f);
632 w83793_write_value(client, W83793_REG_TEMP_CRITICAL,
633 data->temp_critical);
634 }
635
636 mutex_unlock(&data->update_lock);
637 return count;
638}
639
640/*
641 Temp SmartFan control
642 TEMP_FAN_MAP
643 Temp channel control which pwm fan, bitfield, bit 0 indicate pwm1...
644 It's possible two or more temp channels control the same fan, w83793
645 always prefers to pick the most critical request and applies it to
646 the related Fan.
647 It's possible one fan is not in any mapping of 6 temp channels, this
648 means the fan is manual mode
649
650 TEMP_PWM_ENABLE
651 Each temp channel has its own SmartFan mode, and temp channel
652 control fans that are set by TEMP_FAN_MAP
653 0: SmartFanII mode
654 1: Thermal Cruise Mode
655
656 TEMP_CRUISE
657 Target temperature in thermal cruise mode, w83793 will try to turn
658 fan speed to keep the temperature of target device around this
659 temperature.
660
661 TEMP_TOLERANCE
662 If Temp higher or lower than target with this tolerance, w83793
663 will take actions to speed up or slow down the fan to keep the
664 temperature within the tolerance range.
665*/
666
667#define TEMP_FAN_MAP 0
668#define TEMP_PWM_ENABLE 1
669#define TEMP_CRUISE 2
670#define TEMP_TOLERANCE 3
671static ssize_t
672show_sf_ctrl(struct device *dev, struct device_attribute *attr, char *buf)
673{
674 struct sensor_device_attribute_2 *sensor_attr =
675 to_sensor_dev_attr_2(attr);
676 int nr = sensor_attr->nr;
677 int index = sensor_attr->index;
678 struct w83793_data *data = w83793_update_device(dev);
679 u32 val;
680
681 if (TEMP_FAN_MAP == nr) {
682 val = data->temp_fan_map[index];
683 } else if (TEMP_PWM_ENABLE == nr) {
684 /* +2 to transfrom into 2 and 3 to conform with sysfs intf */
685 val = ((data->pwm_enable >> index) & 0x01) + 2;
686 } else if (TEMP_CRUISE == nr) {
687 val = TEMP_FROM_REG(data->temp_cruise[index] & 0x7f);
688 } else { /* TEMP_TOLERANCE */
689 val = data->tolerance[index >> 1] >> ((index & 0x01) ? 4 : 0);
690 val = TEMP_FROM_REG(val & 0x0f);
691 }
692 return sprintf(buf, "%d\n", val);
693}
694
695static ssize_t
696store_sf_ctrl(struct device *dev, struct device_attribute *attr,
697 const char *buf, size_t count)
698{
699 struct sensor_device_attribute_2 *sensor_attr =
700 to_sensor_dev_attr_2(attr);
701 int nr = sensor_attr->nr;
702 int index = sensor_attr->index;
703 struct i2c_client *client = to_i2c_client(dev);
704 struct w83793_data *data = i2c_get_clientdata(client);
705 u32 val;
706
707 mutex_lock(&data->update_lock);
708 if (TEMP_FAN_MAP == nr) {
709 val = simple_strtoul(buf, NULL, 10) & 0xff;
710 w83793_write_value(client, W83793_REG_TEMP_FAN_MAP(index), val);
711 data->temp_fan_map[index] = val;
712 } else if (TEMP_PWM_ENABLE == nr) {
713 val = simple_strtoul(buf, NULL, 10);
714 if (2 == val || 3 == val) {
715 data->pwm_enable =
716 w83793_read_value(client, W83793_REG_PWM_ENABLE);
717 if (val - 2)
718 data->pwm_enable |= 1 << index;
719 else
720 data->pwm_enable &= ~(1 << index);
721 w83793_write_value(client, W83793_REG_PWM_ENABLE,
722 data->pwm_enable);
723 } else {
724 mutex_unlock(&data->update_lock);
725 return -EINVAL;
726 }
727 } else if (TEMP_CRUISE == nr) {
728 data->temp_cruise[index] =
729 w83793_read_value(client, W83793_REG_TEMP_CRUISE(index));
730 val = TEMP_TO_REG(simple_strtol(buf, NULL, 10), 0, 0x7f);
731 data->temp_cruise[index] &= 0x80;
732 data->temp_cruise[index] |= val;
733
734 w83793_write_value(client, W83793_REG_TEMP_CRUISE(index),
735 data->temp_cruise[index]);
736 } else { /* TEMP_TOLERANCE */
737 int i = index >> 1;
738 u8 shift = (index & 0x01) ? 4 : 0;
739 data->tolerance[i] =
740 w83793_read_value(client, W83793_REG_TEMP_TOL(i));
741
742 val = TEMP_TO_REG(simple_strtol(buf, NULL, 10), 0, 0x0f);
743 data->tolerance[i] &= ~(0x0f << shift);
744 data->tolerance[i] |= val << shift;
745 w83793_write_value(client, W83793_REG_TEMP_TOL(i),
746 data->tolerance[i]);
747 }
748
749 mutex_unlock(&data->update_lock);
750 return count;
751}
752
753static ssize_t
754show_sf2_pwm(struct device *dev, struct device_attribute *attr, char *buf)
755{
756 struct sensor_device_attribute_2 *sensor_attr =
757 to_sensor_dev_attr_2(attr);
758 int nr = sensor_attr->nr;
759 int index = sensor_attr->index;
760 struct w83793_data *data = w83793_update_device(dev);
761
762 return sprintf(buf, "%d\n", (data->sf2_pwm[index][nr] & 0x3f) << 2);
763}
764
765static ssize_t
766store_sf2_pwm(struct device *dev, struct device_attribute *attr,
767 const char *buf, size_t count)
768{
769 struct i2c_client *client = to_i2c_client(dev);
770 struct w83793_data *data = i2c_get_clientdata(client);
771 struct sensor_device_attribute_2 *sensor_attr =
772 to_sensor_dev_attr_2(attr);
773 int nr = sensor_attr->nr;
774 int index = sensor_attr->index;
775 u8 val = SENSORS_LIMIT(simple_strtoul(buf, NULL, 10), 0, 0xff) >> 2;
776
777 mutex_lock(&data->update_lock);
778 data->sf2_pwm[index][nr] =
779 w83793_read_value(client, W83793_REG_SF2_PWM(index, nr)) & 0xc0;
780 data->sf2_pwm[index][nr] |= val;
781 w83793_write_value(client, W83793_REG_SF2_PWM(index, nr),
782 data->sf2_pwm[index][nr]);
783 mutex_unlock(&data->update_lock);
784 return count;
785}
786
787static ssize_t
788show_sf2_temp(struct device *dev, struct device_attribute *attr, char *buf)
789{
790 struct sensor_device_attribute_2 *sensor_attr =
791 to_sensor_dev_attr_2(attr);
792 int nr = sensor_attr->nr;
793 int index = sensor_attr->index;
794 struct w83793_data *data = w83793_update_device(dev);
795
796 return sprintf(buf, "%ld\n",
797 TEMP_FROM_REG(data->sf2_temp[index][nr] & 0x7f));
798}
799
800static ssize_t
801store_sf2_temp(struct device *dev, struct device_attribute *attr,
802 const char *buf, size_t count)
803{
804 struct i2c_client *client = to_i2c_client(dev);
805 struct w83793_data *data = i2c_get_clientdata(client);
806 struct sensor_device_attribute_2 *sensor_attr =
807 to_sensor_dev_attr_2(attr);
808 int nr = sensor_attr->nr;
809 int index = sensor_attr->index;
810 u8 val = TEMP_TO_REG(simple_strtol(buf, NULL, 10), 0, 0x7f);
811
812 mutex_lock(&data->update_lock);
813 data->sf2_temp[index][nr] =
814 w83793_read_value(client, W83793_REG_SF2_TEMP(index, nr)) & 0x80;
815 data->sf2_temp[index][nr] |= val;
816 w83793_write_value(client, W83793_REG_SF2_TEMP(index, nr),
817 data->sf2_temp[index][nr]);
818 mutex_unlock(&data->update_lock);
819 return count;
820}
821
822/* only Vcore A/B and Vtt have additional 2 bits precision */
823static ssize_t
824show_in(struct device *dev, struct device_attribute *attr, char *buf)
825{
826 struct sensor_device_attribute_2 *sensor_attr =
827 to_sensor_dev_attr_2(attr);
828 int nr = sensor_attr->nr;
829 int index = sensor_attr->index;
830 struct w83793_data *data = w83793_update_device(dev);
831 u16 val = data->in[index][nr];
832
833 if (index < 3) {
834 val <<= 2;
835 val += (data->in_low_bits[nr] >> (index * 2)) & 0x3;
836 }
Gong Junddca9332007-01-18 22:14:23 +0100837 /* voltage inputs 5VDD and 5VSB needs 150mV offset */
838 val = val * scale_in[index] + scale_in_add[index];
839 return sprintf(buf, "%d\n", val);
Rudolf Marek6800c3d2006-12-12 18:18:30 +0100840}
841
842static ssize_t
843store_in(struct device *dev, struct device_attribute *attr,
844 const char *buf, size_t count)
845{
846 struct sensor_device_attribute_2 *sensor_attr =
847 to_sensor_dev_attr_2(attr);
848 int nr = sensor_attr->nr;
849 int index = sensor_attr->index;
850 struct i2c_client *client = to_i2c_client(dev);
851 struct w83793_data *data = i2c_get_clientdata(client);
852 u32 val;
853
854 val =
855 (simple_strtoul(buf, NULL, 10) +
856 scale_in[index] / 2) / scale_in[index];
857 mutex_lock(&data->update_lock);
858 if (index > 2) {
Gong Junddca9332007-01-18 22:14:23 +0100859 /* fix the limit values of 5VDD and 5VSB to ALARM mechanism */
860 if (1 == nr || 2 == nr) {
861 val -= scale_in_add[index] / scale_in[index];
862 }
Rudolf Marek6800c3d2006-12-12 18:18:30 +0100863 val = SENSORS_LIMIT(val, 0, 255);
864 } else {
865 val = SENSORS_LIMIT(val, 0, 0x3FF);
866 data->in_low_bits[nr] =
867 w83793_read_value(client, W83793_REG_IN_LOW_BITS[nr]);
868 data->in_low_bits[nr] &= ~(0x03 << (2 * index));
869 data->in_low_bits[nr] |= (val & 0x03) << (2 * index);
870 w83793_write_value(client, W83793_REG_IN_LOW_BITS[nr],
871 data->in_low_bits[nr]);
872 val >>= 2;
873 }
874 data->in[index][nr] = val;
875 w83793_write_value(client, W83793_REG_IN[index][nr],
876 data->in[index][nr]);
877 mutex_unlock(&data->update_lock);
878 return count;
879}
880
881#define NOT_USED -1
882
883#define SENSOR_ATTR_IN(index) \
884 SENSOR_ATTR_2(in##index##_input, S_IRUGO, show_in, NULL, \
885 IN_READ, index), \
886 SENSOR_ATTR_2(in##index##_max, S_IRUGO | S_IWUSR, show_in, \
887 store_in, IN_MAX, index), \
888 SENSOR_ATTR_2(in##index##_min, S_IRUGO | S_IWUSR, show_in, \
889 store_in, IN_LOW, index), \
890 SENSOR_ATTR_2(in##index##_alarm, S_IRUGO, show_alarm_beep, \
891 NULL, ALARM_STATUS, index + ((index > 2) ? 1 : 0)), \
892 SENSOR_ATTR_2(in##index##_beep, S_IWUSR | S_IRUGO, \
893 show_alarm_beep, store_beep, BEEP_ENABLE, \
894 index + ((index > 2) ? 1 : 0))
895
896#define SENSOR_ATTR_FAN(index) \
897 SENSOR_ATTR_2(fan##index##_alarm, S_IRUGO, show_alarm_beep, \
898 NULL, ALARM_STATUS, index + 17), \
899 SENSOR_ATTR_2(fan##index##_beep, S_IWUSR | S_IRUGO, \
900 show_alarm_beep, store_beep, BEEP_ENABLE, index + 17), \
901 SENSOR_ATTR_2(fan##index##_input, S_IRUGO, show_fan, \
902 NULL, FAN_INPUT, index - 1), \
903 SENSOR_ATTR_2(fan##index##_min, S_IWUSR | S_IRUGO, \
904 show_fan, store_fan_min, FAN_MIN, index - 1)
905
906#define SENSOR_ATTR_PWM(index) \
907 SENSOR_ATTR_2(pwm##index, S_IWUSR | S_IRUGO, show_pwm, \
908 store_pwm, PWM_DUTY, index - 1), \
909 SENSOR_ATTR_2(pwm##index##_nonstop, S_IWUSR | S_IRUGO, \
910 show_pwm, store_pwm, PWM_NONSTOP, index - 1), \
911 SENSOR_ATTR_2(pwm##index##_start, S_IWUSR | S_IRUGO, \
912 show_pwm, store_pwm, PWM_START, index - 1), \
913 SENSOR_ATTR_2(pwm##index##_stop_time, S_IWUSR | S_IRUGO, \
914 show_pwm, store_pwm, PWM_STOP_TIME, index - 1)
915
916#define SENSOR_ATTR_TEMP(index) \
917 SENSOR_ATTR_2(temp##index##_type, S_IRUGO | S_IWUSR, \
918 show_temp_mode, store_temp_mode, NOT_USED, index - 1), \
919 SENSOR_ATTR_2(temp##index##_input, S_IRUGO, show_temp, \
920 NULL, TEMP_READ, index - 1), \
921 SENSOR_ATTR_2(temp##index##_max, S_IRUGO | S_IWUSR, show_temp, \
922 store_temp, TEMP_CRIT, index - 1), \
923 SENSOR_ATTR_2(temp##index##_max_hyst, S_IRUGO | S_IWUSR, \
924 show_temp, store_temp, TEMP_CRIT_HYST, index - 1), \
925 SENSOR_ATTR_2(temp##index##_warn, S_IRUGO | S_IWUSR, show_temp, \
926 store_temp, TEMP_WARN, index - 1), \
927 SENSOR_ATTR_2(temp##index##_warn_hyst, S_IRUGO | S_IWUSR, \
928 show_temp, store_temp, TEMP_WARN_HYST, index - 1), \
929 SENSOR_ATTR_2(temp##index##_alarm, S_IRUGO, \
930 show_alarm_beep, NULL, ALARM_STATUS, index + 11), \
931 SENSOR_ATTR_2(temp##index##_beep, S_IWUSR | S_IRUGO, \
932 show_alarm_beep, store_beep, BEEP_ENABLE, index + 11), \
933 SENSOR_ATTR_2(temp##index##_auto_channels_pwm, \
934 S_IRUGO | S_IWUSR, show_sf_ctrl, store_sf_ctrl, \
935 TEMP_FAN_MAP, index - 1), \
936 SENSOR_ATTR_2(temp##index##_pwm_enable, S_IWUSR | S_IRUGO, \
937 show_sf_ctrl, store_sf_ctrl, TEMP_PWM_ENABLE, \
938 index - 1), \
939 SENSOR_ATTR_2(thermal_cruise##index, S_IRUGO | S_IWUSR, \
940 show_sf_ctrl, store_sf_ctrl, TEMP_CRUISE, index - 1), \
941 SENSOR_ATTR_2(tolerance##index, S_IRUGO | S_IWUSR, show_sf_ctrl,\
942 store_sf_ctrl, TEMP_TOLERANCE, index - 1), \
943 SENSOR_ATTR_2(temp##index##_auto_point1_pwm, S_IRUGO | S_IWUSR, \
944 show_sf2_pwm, store_sf2_pwm, 0, index - 1), \
945 SENSOR_ATTR_2(temp##index##_auto_point2_pwm, S_IRUGO | S_IWUSR, \
946 show_sf2_pwm, store_sf2_pwm, 1, index - 1), \
947 SENSOR_ATTR_2(temp##index##_auto_point3_pwm, S_IRUGO | S_IWUSR, \
948 show_sf2_pwm, store_sf2_pwm, 2, index - 1), \
949 SENSOR_ATTR_2(temp##index##_auto_point4_pwm, S_IRUGO | S_IWUSR, \
950 show_sf2_pwm, store_sf2_pwm, 3, index - 1), \
951 SENSOR_ATTR_2(temp##index##_auto_point5_pwm, S_IRUGO | S_IWUSR, \
952 show_sf2_pwm, store_sf2_pwm, 4, index - 1), \
953 SENSOR_ATTR_2(temp##index##_auto_point6_pwm, S_IRUGO | S_IWUSR, \
954 show_sf2_pwm, store_sf2_pwm, 5, index - 1), \
955 SENSOR_ATTR_2(temp##index##_auto_point7_pwm, S_IRUGO | S_IWUSR, \
956 show_sf2_pwm, store_sf2_pwm, 6, index - 1), \
957 SENSOR_ATTR_2(temp##index##_auto_point1_temp, S_IRUGO | S_IWUSR,\
958 show_sf2_temp, store_sf2_temp, 0, index - 1), \
959 SENSOR_ATTR_2(temp##index##_auto_point2_temp, S_IRUGO | S_IWUSR,\
960 show_sf2_temp, store_sf2_temp, 1, index - 1), \
961 SENSOR_ATTR_2(temp##index##_auto_point3_temp, S_IRUGO | S_IWUSR,\
962 show_sf2_temp, store_sf2_temp, 2, index - 1), \
963 SENSOR_ATTR_2(temp##index##_auto_point4_temp, S_IRUGO | S_IWUSR,\
964 show_sf2_temp, store_sf2_temp, 3, index - 1), \
965 SENSOR_ATTR_2(temp##index##_auto_point5_temp, S_IRUGO | S_IWUSR,\
966 show_sf2_temp, store_sf2_temp, 4, index - 1), \
967 SENSOR_ATTR_2(temp##index##_auto_point6_temp, S_IRUGO | S_IWUSR,\
968 show_sf2_temp, store_sf2_temp, 5, index - 1), \
969 SENSOR_ATTR_2(temp##index##_auto_point7_temp, S_IRUGO | S_IWUSR,\
970 show_sf2_temp, store_sf2_temp, 6, index - 1)
971
972static struct sensor_device_attribute_2 w83793_sensor_attr_2[] = {
973 SENSOR_ATTR_IN(0),
974 SENSOR_ATTR_IN(1),
975 SENSOR_ATTR_IN(2),
976 SENSOR_ATTR_IN(3),
977 SENSOR_ATTR_IN(4),
978 SENSOR_ATTR_IN(5),
979 SENSOR_ATTR_IN(6),
980 SENSOR_ATTR_IN(7),
981 SENSOR_ATTR_IN(8),
982 SENSOR_ATTR_IN(9),
Rudolf Marek6800c3d2006-12-12 18:18:30 +0100983 SENSOR_ATTR_FAN(1),
984 SENSOR_ATTR_FAN(2),
985 SENSOR_ATTR_FAN(3),
986 SENSOR_ATTR_FAN(4),
987 SENSOR_ATTR_FAN(5),
988 SENSOR_ATTR_PWM(1),
989 SENSOR_ATTR_PWM(2),
990 SENSOR_ATTR_PWM(3),
991};
992
Gong Jun46bed4d2007-01-18 22:14:24 +0100993static struct sensor_device_attribute_2 w83793_temp[] = {
994 SENSOR_ATTR_TEMP(1),
995 SENSOR_ATTR_TEMP(2),
996 SENSOR_ATTR_TEMP(3),
997 SENSOR_ATTR_TEMP(4),
998 SENSOR_ATTR_TEMP(5),
999 SENSOR_ATTR_TEMP(6),
1000};
1001
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001002/* Fan6-Fan12 */
1003static struct sensor_device_attribute_2 w83793_left_fan[] = {
1004 SENSOR_ATTR_FAN(6),
1005 SENSOR_ATTR_FAN(7),
1006 SENSOR_ATTR_FAN(8),
1007 SENSOR_ATTR_FAN(9),
1008 SENSOR_ATTR_FAN(10),
1009 SENSOR_ATTR_FAN(11),
1010 SENSOR_ATTR_FAN(12),
1011};
1012
1013/* Pwm4-Pwm8 */
1014static struct sensor_device_attribute_2 w83793_left_pwm[] = {
1015 SENSOR_ATTR_PWM(4),
1016 SENSOR_ATTR_PWM(5),
1017 SENSOR_ATTR_PWM(6),
1018 SENSOR_ATTR_PWM(7),
1019 SENSOR_ATTR_PWM(8),
1020};
1021
Gong Junc70a8c32007-01-18 22:14:24 +01001022static struct sensor_device_attribute_2 w83793_vid[] = {
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001023 SENSOR_ATTR_2(cpu0_vid, S_IRUGO, show_vid, NULL, NOT_USED, 0),
1024 SENSOR_ATTR_2(cpu1_vid, S_IRUGO, show_vid, NULL, NOT_USED, 1),
Gong Junc70a8c32007-01-18 22:14:24 +01001025};
1026
1027static struct sensor_device_attribute_2 sda_single_files[] = {
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001028 SENSOR_ATTR_2(vrm, S_IWUSR | S_IRUGO, show_vrm, store_vrm,
1029 NOT_USED, NOT_USED),
1030 SENSOR_ATTR_2(chassis, S_IWUSR | S_IRUGO, show_alarm_beep,
1031 store_chassis_clear, ALARM_STATUS, 30),
1032 SENSOR_ATTR_2(beep_enable, S_IWUSR | S_IRUGO, show_beep_enable,
1033 store_beep_enable, NOT_USED, NOT_USED),
1034 SENSOR_ATTR_2(pwm_default, S_IWUSR | S_IRUGO, show_sf_setup,
1035 store_sf_setup, SETUP_PWM_DEFAULT, NOT_USED),
1036 SENSOR_ATTR_2(pwm_uptime, S_IWUSR | S_IRUGO, show_sf_setup,
1037 store_sf_setup, SETUP_PWM_UPTIME, NOT_USED),
1038 SENSOR_ATTR_2(pwm_downtime, S_IWUSR | S_IRUGO, show_sf_setup,
1039 store_sf_setup, SETUP_PWM_DOWNTIME, NOT_USED),
1040 SENSOR_ATTR_2(temp_critical, S_IWUSR | S_IRUGO, show_sf_setup,
1041 store_sf_setup, SETUP_TEMP_CRITICAL, NOT_USED),
1042};
1043
1044static void w83793_init_client(struct i2c_client *client)
1045{
1046 if (reset) {
1047 w83793_write_value(client, W83793_REG_CONFIG, 0x80);
1048 }
1049
1050 /* Start monitoring */
1051 w83793_write_value(client, W83793_REG_CONFIG,
1052 w83793_read_value(client, W83793_REG_CONFIG) | 0x01);
1053
1054}
1055
1056static int w83793_attach_adapter(struct i2c_adapter *adapter)
1057{
1058 if (!(adapter->class & I2C_CLASS_HWMON))
1059 return 0;
1060 return i2c_probe(adapter, &addr_data, w83793_detect);
1061}
1062
1063static int w83793_detach_client(struct i2c_client *client)
1064{
1065 struct w83793_data *data = i2c_get_clientdata(client);
1066 struct device *dev = &client->dev;
1067 int err, i;
1068
1069 /* main client */
1070 if (data) {
Tony Jones1beeffe2007-08-20 13:46:20 -07001071 hwmon_device_unregister(data->hwmon_dev);
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001072
1073 for (i = 0; i < ARRAY_SIZE(w83793_sensor_attr_2); i++)
1074 device_remove_file(dev,
1075 &w83793_sensor_attr_2[i].dev_attr);
1076
1077 for (i = 0; i < ARRAY_SIZE(sda_single_files); i++)
1078 device_remove_file(dev, &sda_single_files[i].dev_attr);
1079
Gong Junc70a8c32007-01-18 22:14:24 +01001080 for (i = 0; i < ARRAY_SIZE(w83793_vid); i++)
1081 device_remove_file(dev, &w83793_vid[i].dev_attr);
1082
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001083 for (i = 0; i < ARRAY_SIZE(w83793_left_fan); i++)
1084 device_remove_file(dev, &w83793_left_fan[i].dev_attr);
1085
1086 for (i = 0; i < ARRAY_SIZE(w83793_left_pwm); i++)
1087 device_remove_file(dev, &w83793_left_pwm[i].dev_attr);
Gong Jun46bed4d2007-01-18 22:14:24 +01001088
1089 for (i = 0; i < ARRAY_SIZE(w83793_temp); i++)
1090 device_remove_file(dev, &w83793_temp[i].dev_attr);
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001091 }
1092
1093 if ((err = i2c_detach_client(client)))
1094 return err;
1095
1096 /* main client */
1097 if (data)
1098 kfree(data);
1099 /* subclient */
1100 else
1101 kfree(client);
1102
1103 return 0;
1104}
1105
1106static int
1107w83793_create_subclient(struct i2c_adapter *adapter,
1108 struct i2c_client *client, int addr,
1109 struct i2c_client **sub_cli)
1110{
1111 int err = 0;
1112 struct i2c_client *sub_client;
1113
1114 (*sub_cli) = sub_client =
1115 kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
1116 if (!(sub_client)) {
1117 return -ENOMEM;
1118 }
1119 sub_client->addr = 0x48 + addr;
1120 i2c_set_clientdata(sub_client, NULL);
1121 sub_client->adapter = adapter;
1122 sub_client->driver = &w83793_driver;
1123 strlcpy(sub_client->name, "w83793 subclient", I2C_NAME_SIZE);
1124 if ((err = i2c_attach_client(sub_client))) {
1125 dev_err(&client->dev, "subclient registration "
1126 "at address 0x%x failed\n", sub_client->addr);
1127 kfree(sub_client);
1128 }
1129 return err;
1130}
1131
1132static int
1133w83793_detect_subclients(struct i2c_adapter *adapter, int address,
1134 int kind, struct i2c_client *client)
1135{
1136 int i, id, err;
1137 u8 tmp;
1138 struct w83793_data *data = i2c_get_clientdata(client);
1139
1140 id = i2c_adapter_id(adapter);
1141 if (force_subclients[0] == id && force_subclients[1] == address) {
1142 for (i = 2; i <= 3; i++) {
1143 if (force_subclients[i] < 0x48
1144 || force_subclients[i] > 0x4f) {
1145 dev_err(&client->dev,
1146 "invalid subclient "
1147 "address %d; must be 0x48-0x4f\n",
1148 force_subclients[i]);
1149 err = -EINVAL;
1150 goto ERROR_SC_0;
1151 }
1152 }
1153 w83793_write_value(client, W83793_REG_I2C_SUBADDR,
1154 (force_subclients[2] & 0x07) |
1155 ((force_subclients[3] & 0x07) << 4));
1156 }
1157
1158 tmp = w83793_read_value(client, W83793_REG_I2C_SUBADDR);
1159 if (!(tmp & 0x08)) {
1160 err =
1161 w83793_create_subclient(adapter, client, tmp & 0x7,
1162 &data->lm75[0]);
1163 if (err < 0)
1164 goto ERROR_SC_0;
1165 }
1166 if (!(tmp & 0x80)) {
1167 if ((data->lm75[0] != NULL)
1168 && ((tmp & 0x7) == ((tmp >> 4) & 0x7))) {
1169 dev_err(&client->dev,
1170 "duplicate addresses 0x%x, "
1171 "use force_subclients\n", data->lm75[0]->addr);
1172 err = -ENODEV;
1173 goto ERROR_SC_1;
1174 }
1175 err = w83793_create_subclient(adapter, client,
1176 (tmp >> 4) & 0x7, &data->lm75[1]);
1177 if (err < 0)
1178 goto ERROR_SC_1;
1179 }
1180
1181 return 0;
1182
1183 /* Undo inits in case of errors */
1184
1185ERROR_SC_1:
1186 if (data->lm75[0] != NULL) {
1187 i2c_detach_client(data->lm75[0]);
1188 kfree(data->lm75[0]);
1189 }
1190ERROR_SC_0:
1191 return err;
1192}
1193
1194static int w83793_detect(struct i2c_adapter *adapter, int address, int kind)
1195{
1196 int i;
1197 u8 tmp, val;
1198 struct i2c_client *client;
1199 struct device *dev;
1200 struct w83793_data *data;
1201 int files_fan = ARRAY_SIZE(w83793_left_fan) / 7;
1202 int files_pwm = ARRAY_SIZE(w83793_left_pwm) / 5;
Gong Jun46bed4d2007-01-18 22:14:24 +01001203 int files_temp = ARRAY_SIZE(w83793_temp) / 6;
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001204 int err = 0;
1205
1206 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1207 goto exit;
1208 }
1209
1210 /* OK. For now, we presume we have a valid client. We now create the
1211 client structure, even though we cannot fill it completely yet.
1212 But it allows us to access w83793_{read,write}_value. */
1213
1214 if (!(data = kzalloc(sizeof(struct w83793_data), GFP_KERNEL))) {
1215 err = -ENOMEM;
1216 goto exit;
1217 }
1218
1219 client = &data->client;
1220 dev = &client->dev;
1221 i2c_set_clientdata(client, data);
1222 client->addr = address;
1223 client->adapter = adapter;
1224 client->driver = &w83793_driver;
1225
1226 data->bank = i2c_smbus_read_byte_data(client, W83793_REG_BANKSEL);
1227
1228 /* Now, we do the remaining detection. */
1229 if (kind < 0) {
1230 tmp = data->bank & 0x80 ? 0x5c : 0xa3;
1231 /* Check Winbond vendor ID */
1232 if (tmp != i2c_smbus_read_byte_data(client,
1233 W83793_REG_VENDORID)) {
1234 pr_debug("w83793: Detection failed at check "
1235 "vendor id\n");
1236 err = -ENODEV;
1237 goto free_mem;
1238 }
1239
1240 /* If Winbond chip, address of chip and W83793_REG_I2C_ADDR
1241 should match */
1242 if ((data->bank & 0x07) == 0
1243 && i2c_smbus_read_byte_data(client, W83793_REG_I2C_ADDR) !=
1244 (address << 1)) {
1245 pr_debug("w83793: Detection failed at check "
1246 "i2c addr\n");
1247 err = -ENODEV;
1248 goto free_mem;
1249 }
1250
1251 }
1252
1253 /* We have either had a force parameter, or we have already detected the
1254 Winbond. Determine the chip type now */
1255
1256 if (kind <= 0) {
1257 if (0x7b == w83793_read_value(client, W83793_REG_CHIPID)) {
1258 kind = w83793;
1259 } else {
1260 if (kind == 0)
1261 dev_warn(&adapter->dev, "w83793: Ignoring "
1262 "'force' parameter for unknown chip "
1263 "at address 0x%02x\n", address);
1264 err = -ENODEV;
1265 goto free_mem;
1266 }
1267 }
1268
1269 /* Fill in the remaining client fields and put into the global list */
1270 strlcpy(client->name, "w83793", I2C_NAME_SIZE);
1271
1272 mutex_init(&data->update_lock);
1273
1274 /* Tell the I2C layer a new client has arrived */
1275 if ((err = i2c_attach_client(client)))
1276 goto free_mem;
1277
1278 if ((err = w83793_detect_subclients(adapter, address, kind, client)))
1279 goto detach_client;
1280
1281 /* Initialize the chip */
1282 w83793_init_client(client);
1283
1284 data->vrm = vid_which_vrm();
1285 /*
1286 Only fan 1-5 has their own input pins,
1287 Pwm 1-3 has their own pins
1288 */
1289 data->has_fan = 0x1f;
1290 data->has_pwm = 0x07;
1291 tmp = w83793_read_value(client, W83793_REG_MFC);
1292 val = w83793_read_value(client, W83793_REG_FANIN_CTRL);
1293
1294 /* check the function of pins 49-56 */
1295 if (!(tmp & 0x80)) {
1296 data->has_pwm |= 0x18; /* pwm 4,5 */
1297 if (val & 0x01) { /* fan 6 */
1298 data->has_fan |= 0x20;
1299 data->has_pwm |= 0x20;
1300 }
1301 if (val & 0x02) { /* fan 7 */
1302 data->has_fan |= 0x40;
1303 data->has_pwm |= 0x40;
1304 }
1305 if (!(tmp & 0x40) && (val & 0x04)) { /* fan 8 */
1306 data->has_fan |= 0x80;
1307 data->has_pwm |= 0x80;
1308 }
1309 }
1310
1311 if (0x08 == (tmp & 0x0c)) {
1312 if (val & 0x08) /* fan 9 */
1313 data->has_fan |= 0x100;
1314 if (val & 0x10) /* fan 10 */
1315 data->has_fan |= 0x200;
1316 }
1317
1318 if (0x20 == (tmp & 0x30)) {
1319 if (val & 0x20) /* fan 11 */
1320 data->has_fan |= 0x400;
1321 if (val & 0x40) /* fan 12 */
1322 data->has_fan |= 0x800;
1323 }
1324
1325 if ((tmp & 0x01) && (val & 0x04)) { /* fan 8, second location */
1326 data->has_fan |= 0x80;
1327 data->has_pwm |= 0x80;
1328 }
1329
Rudolf Marekc9294312007-01-18 22:14:24 +01001330 tmp = w83793_read_value(client, W83793_REG_FANIN_SEL);
1331 if ((tmp & 0x01) && (val & 0x08)) { /* fan 9, second location */
1332 data->has_fan |= 0x100;
1333 }
1334 if ((tmp & 0x02) && (val & 0x10)) { /* fan 10, second location */
1335 data->has_fan |= 0x200;
1336 }
1337 if ((tmp & 0x04) && (val & 0x20)) { /* fan 11, second location */
1338 data->has_fan |= 0x400;
1339 }
1340 if ((tmp & 0x08) && (val & 0x40)) { /* fan 12, second location */
1341 data->has_fan |= 0x800;
1342 }
1343
Gong Jun46bed4d2007-01-18 22:14:24 +01001344 /* check the temp1-6 mode, ignore former AMDSI selected inputs */
1345 tmp = w83793_read_value(client,W83793_REG_TEMP_MODE[0]);
1346 if (tmp & 0x01)
1347 data->has_temp |= 0x01;
1348 if (tmp & 0x04)
1349 data->has_temp |= 0x02;
1350 if (tmp & 0x10)
1351 data->has_temp |= 0x04;
1352 if (tmp & 0x40)
1353 data->has_temp |= 0x08;
1354
1355 tmp = w83793_read_value(client,W83793_REG_TEMP_MODE[1]);
1356 if (tmp & 0x01)
1357 data->has_temp |= 0x10;
1358 if (tmp & 0x02)
1359 data->has_temp |= 0x20;
1360
Gong Junc70a8c32007-01-18 22:14:24 +01001361 /* Detect the VID usage and ignore unused input */
1362 tmp = w83793_read_value(client, W83793_REG_MFC);
1363 if (!(tmp & 0x29))
1364 data->has_vid |= 0x1; /* has VIDA */
1365 if (tmp & 0x80)
1366 data->has_vid |= 0x2; /* has VIDB */
1367
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001368 /* Register sysfs hooks */
1369 for (i = 0; i < ARRAY_SIZE(w83793_sensor_attr_2); i++) {
1370 err = device_create_file(dev,
1371 &w83793_sensor_attr_2[i].dev_attr);
1372 if (err)
1373 goto exit_remove;
1374 }
1375
Gong Junc70a8c32007-01-18 22:14:24 +01001376 for (i = 0; i < ARRAY_SIZE(w83793_vid); i++) {
1377 if (!(data->has_vid & (1 << i)))
1378 continue;
1379 err = device_create_file(dev, &w83793_vid[i].dev_attr);
1380 if (err)
1381 goto exit_remove;
1382 }
1383
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001384 for (i = 0; i < ARRAY_SIZE(sda_single_files); i++) {
1385 err = device_create_file(dev, &sda_single_files[i].dev_attr);
1386 if (err)
1387 goto exit_remove;
1388
1389 }
1390
Gong Jun46bed4d2007-01-18 22:14:24 +01001391 for (i = 0; i < 6; i++) {
1392 int j;
1393 if (!(data->has_temp & (1 << i)))
1394 continue;
1395 for (j = 0; j < files_temp; j++) {
1396 err = device_create_file(dev,
1397 &w83793_temp[(i) * files_temp
1398 + j].dev_attr);
1399 if (err)
1400 goto exit_remove;
1401 }
1402 }
1403
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001404 for (i = 5; i < 12; i++) {
1405 int j;
1406 if (!(data->has_fan & (1 << i)))
1407 continue;
1408 for (j = 0; j < files_fan; j++) {
1409 err = device_create_file(dev,
1410 &w83793_left_fan[(i - 5) * files_fan
1411 + j].dev_attr);
1412 if (err)
1413 goto exit_remove;
1414 }
1415 }
1416
1417 for (i = 3; i < 8; i++) {
1418 int j;
1419 if (!(data->has_pwm & (1 << i)))
1420 continue;
1421 for (j = 0; j < files_pwm; j++) {
1422 err = device_create_file(dev,
1423 &w83793_left_pwm[(i - 3) * files_pwm
1424 + j].dev_attr);
1425 if (err)
1426 goto exit_remove;
1427 }
1428 }
1429
Tony Jones1beeffe2007-08-20 13:46:20 -07001430 data->hwmon_dev = hwmon_device_register(dev);
1431 if (IS_ERR(data->hwmon_dev)) {
1432 err = PTR_ERR(data->hwmon_dev);
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001433 goto exit_remove;
1434 }
1435
1436 return 0;
1437
1438 /* Unregister sysfs hooks */
1439
1440exit_remove:
1441 for (i = 0; i < ARRAY_SIZE(w83793_sensor_attr_2); i++)
1442 device_remove_file(dev, &w83793_sensor_attr_2[i].dev_attr);
1443
1444 for (i = 0; i < ARRAY_SIZE(sda_single_files); i++)
1445 device_remove_file(dev, &sda_single_files[i].dev_attr);
1446
Gong Junc70a8c32007-01-18 22:14:24 +01001447 for (i = 0; i < ARRAY_SIZE(w83793_vid); i++)
1448 device_remove_file(dev, &w83793_vid[i].dev_attr);
1449
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001450 for (i = 0; i < ARRAY_SIZE(w83793_left_fan); i++)
1451 device_remove_file(dev, &w83793_left_fan[i].dev_attr);
1452
1453 for (i = 0; i < ARRAY_SIZE(w83793_left_pwm); i++)
1454 device_remove_file(dev, &w83793_left_pwm[i].dev_attr);
1455
Gong Jun46bed4d2007-01-18 22:14:24 +01001456 for (i = 0; i < ARRAY_SIZE(w83793_temp); i++)
1457 device_remove_file(dev, &w83793_temp[i].dev_attr);
1458
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001459 if (data->lm75[0] != NULL) {
1460 i2c_detach_client(data->lm75[0]);
1461 kfree(data->lm75[0]);
1462 }
1463 if (data->lm75[1] != NULL) {
1464 i2c_detach_client(data->lm75[1]);
1465 kfree(data->lm75[1]);
1466 }
1467detach_client:
1468 i2c_detach_client(client);
1469free_mem:
1470 kfree(data);
1471exit:
1472 return err;
1473}
1474
1475static void w83793_update_nonvolatile(struct device *dev)
1476{
1477 struct i2c_client *client = to_i2c_client(dev);
1478 struct w83793_data *data = i2c_get_clientdata(client);
1479 int i, j;
1480 /*
1481 They are somewhat "stable" registers, and to update them everytime
1482 takes so much time, it's just not worthy. Update them in a long
1483 interval to avoid exception.
1484 */
1485 if (!(time_after(jiffies, data->last_nonvolatile + HZ * 300)
1486 || !data->valid))
1487 return;
1488 /* update voltage limits */
1489 for (i = 1; i < 3; i++) {
1490 for (j = 0; j < ARRAY_SIZE(data->in); j++) {
1491 data->in[j][i] =
1492 w83793_read_value(client, W83793_REG_IN[j][i]);
1493 }
1494 data->in_low_bits[i] =
1495 w83793_read_value(client, W83793_REG_IN_LOW_BITS[i]);
1496 }
1497
1498 for (i = 0; i < ARRAY_SIZE(data->fan_min); i++) {
1499 /* Update the Fan measured value and limits */
1500 if (!(data->has_fan & (1 << i))) {
1501 continue;
1502 }
1503 data->fan_min[i] =
1504 w83793_read_value(client, W83793_REG_FAN_MIN(i)) << 8;
1505 data->fan_min[i] |=
1506 w83793_read_value(client, W83793_REG_FAN_MIN(i) + 1);
1507 }
1508
1509 for (i = 0; i < ARRAY_SIZE(data->temp_fan_map); i++) {
Gong Jun46bed4d2007-01-18 22:14:24 +01001510 if (!(data->has_temp & (1 << i)))
1511 continue;
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001512 data->temp_fan_map[i] =
1513 w83793_read_value(client, W83793_REG_TEMP_FAN_MAP(i));
1514 for (j = 1; j < 5; j++) {
1515 data->temp[i][j] =
1516 w83793_read_value(client, W83793_REG_TEMP[i][j]);
1517 }
1518 data->temp_cruise[i] =
1519 w83793_read_value(client, W83793_REG_TEMP_CRUISE(i));
1520 for (j = 0; j < 7; j++) {
1521 data->sf2_pwm[i][j] =
1522 w83793_read_value(client, W83793_REG_SF2_PWM(i, j));
1523 data->sf2_temp[i][j] =
1524 w83793_read_value(client,
1525 W83793_REG_SF2_TEMP(i, j));
1526 }
1527 }
1528
1529 for (i = 0; i < ARRAY_SIZE(data->temp_mode); i++)
1530 data->temp_mode[i] =
1531 w83793_read_value(client, W83793_REG_TEMP_MODE[i]);
1532
1533 for (i = 0; i < ARRAY_SIZE(data->tolerance); i++) {
1534 data->tolerance[i] =
1535 w83793_read_value(client, W83793_REG_TEMP_TOL(i));
1536 }
1537
1538 for (i = 0; i < ARRAY_SIZE(data->pwm); i++) {
1539 if (!(data->has_pwm & (1 << i)))
1540 continue;
1541 data->pwm[i][PWM_NONSTOP] =
1542 w83793_read_value(client, W83793_REG_PWM(i, PWM_NONSTOP));
1543 data->pwm[i][PWM_START] =
1544 w83793_read_value(client, W83793_REG_PWM(i, PWM_START));
1545 data->pwm_stop_time[i] =
1546 w83793_read_value(client, W83793_REG_PWM_STOP_TIME(i));
1547 }
1548
1549 data->pwm_default = w83793_read_value(client, W83793_REG_PWM_DEFAULT);
1550 data->pwm_enable = w83793_read_value(client, W83793_REG_PWM_ENABLE);
1551 data->pwm_uptime = w83793_read_value(client, W83793_REG_PWM_UPTIME);
1552 data->pwm_downtime = w83793_read_value(client, W83793_REG_PWM_DOWNTIME);
1553 data->temp_critical =
1554 w83793_read_value(client, W83793_REG_TEMP_CRITICAL);
1555 data->beep_enable = w83793_read_value(client, W83793_REG_OVT_BEEP);
1556
1557 for (i = 0; i < ARRAY_SIZE(data->beeps); i++) {
1558 data->beeps[i] = w83793_read_value(client, W83793_REG_BEEP(i));
1559 }
1560
1561 data->last_nonvolatile = jiffies;
1562}
1563
1564static struct w83793_data *w83793_update_device(struct device *dev)
1565{
1566 struct i2c_client *client = to_i2c_client(dev);
1567 struct w83793_data *data = i2c_get_clientdata(client);
1568 int i;
1569
1570 mutex_lock(&data->update_lock);
1571
1572 if (!(time_after(jiffies, data->last_updated + HZ * 2)
1573 || !data->valid))
1574 goto END;
1575
1576 /* Update the voltages measured value and limits */
1577 for (i = 0; i < ARRAY_SIZE(data->in); i++)
1578 data->in[i][IN_READ] =
1579 w83793_read_value(client, W83793_REG_IN[i][IN_READ]);
1580
1581 data->in_low_bits[IN_READ] =
1582 w83793_read_value(client, W83793_REG_IN_LOW_BITS[IN_READ]);
1583
1584 for (i = 0; i < ARRAY_SIZE(data->fan); i++) {
1585 if (!(data->has_fan & (1 << i))) {
1586 continue;
1587 }
1588 data->fan[i] =
1589 w83793_read_value(client, W83793_REG_FAN(i)) << 8;
1590 data->fan[i] |=
1591 w83793_read_value(client, W83793_REG_FAN(i) + 1);
1592 }
1593
Gong Jun46bed4d2007-01-18 22:14:24 +01001594 for (i = 0; i < ARRAY_SIZE(data->temp); i++) {
1595 if (!(data->has_temp & (1 << i)))
1596 continue;
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001597 data->temp[i][TEMP_READ] =
1598 w83793_read_value(client, W83793_REG_TEMP[i][TEMP_READ]);
Gong Jun46bed4d2007-01-18 22:14:24 +01001599 }
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001600
1601 data->temp_low_bits =
1602 w83793_read_value(client, W83793_REG_TEMP_LOW_BITS);
1603
1604 for (i = 0; i < ARRAY_SIZE(data->pwm); i++) {
1605 if (data->has_pwm & (1 << i))
1606 data->pwm[i][PWM_DUTY] =
1607 w83793_read_value(client,
1608 W83793_REG_PWM(i, PWM_DUTY));
1609 }
1610
1611 for (i = 0; i < ARRAY_SIZE(data->alarms); i++)
1612 data->alarms[i] =
1613 w83793_read_value(client, W83793_REG_ALARM(i));
Gong Junc70a8c32007-01-18 22:14:24 +01001614 if (data->has_vid & 0x01)
1615 data->vid[0] = w83793_read_value(client, W83793_REG_VID_INA);
1616 if (data->has_vid & 0x02)
1617 data->vid[1] = w83793_read_value(client, W83793_REG_VID_INB);
Rudolf Marek6800c3d2006-12-12 18:18:30 +01001618 w83793_update_nonvolatile(dev);
1619 data->last_updated = jiffies;
1620 data->valid = 1;
1621
1622END:
1623 mutex_unlock(&data->update_lock);
1624 return data;
1625}
1626
1627/* Ignore the possibility that somebody change bank outside the driver
1628 Must be called with data->update_lock held, except during initialization */
1629static u8 w83793_read_value(struct i2c_client *client, u16 reg)
1630{
1631 struct w83793_data *data = i2c_get_clientdata(client);
1632 u8 res = 0xff;
1633 u8 new_bank = reg >> 8;
1634
1635 new_bank |= data->bank & 0xfc;
1636 if (data->bank != new_bank) {
1637 if (i2c_smbus_write_byte_data
1638 (client, W83793_REG_BANKSEL, new_bank) >= 0)
1639 data->bank = new_bank;
1640 else {
1641 dev_err(&client->dev,
1642 "set bank to %d failed, fall back "
1643 "to bank %d, read reg 0x%x error\n",
1644 new_bank, data->bank, reg);
1645 res = 0x0; /* read 0x0 from the chip */
1646 goto END;
1647 }
1648 }
1649 res = i2c_smbus_read_byte_data(client, reg & 0xff);
1650END:
1651 return res;
1652}
1653
1654/* Must be called with data->update_lock held, except during initialization */
1655static int w83793_write_value(struct i2c_client *client, u16 reg, u8 value)
1656{
1657 struct w83793_data *data = i2c_get_clientdata(client);
1658 int res;
1659 u8 new_bank = reg >> 8;
1660
1661 new_bank |= data->bank & 0xfc;
1662 if (data->bank != new_bank) {
1663 if ((res = i2c_smbus_write_byte_data
1664 (client, W83793_REG_BANKSEL, new_bank)) >= 0)
1665 data->bank = new_bank;
1666 else {
1667 dev_err(&client->dev,
1668 "set bank to %d failed, fall back "
1669 "to bank %d, write reg 0x%x error\n",
1670 new_bank, data->bank, reg);
1671 goto END;
1672 }
1673 }
1674
1675 res = i2c_smbus_write_byte_data(client, reg & 0xff, value);
1676END:
1677 return res;
1678}
1679
1680static int __init sensors_w83793_init(void)
1681{
1682 return i2c_add_driver(&w83793_driver);
1683}
1684
1685static void __exit sensors_w83793_exit(void)
1686{
1687 i2c_del_driver(&w83793_driver);
1688}
1689
1690MODULE_AUTHOR("Yuan Mu");
1691MODULE_DESCRIPTION("w83793 driver");
1692MODULE_LICENSE("GPL");
1693
1694module_init(sensors_w83793_init);
1695module_exit(sensors_w83793_exit);