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