• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/hwmon/
1/*
2    w83792d.c - Part of lm_sensors, Linux kernel modules for hardware
3                monitoring
4    Copyright (C) 2004, 2005 Winbond Electronics Corp.
5                        Chunhao Huang <DZShen@Winbond.com.tw>,
6                        Rudolf Marek <r.marek@assembler.cz>
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21
22    Note:
23    1. This driver is only for 2.6 kernel, 2.4 kernel need a different driver.
24    2. This driver is only for Winbond W83792D C version device, there
25       are also some motherboards with B version W83792D device. The
26       calculation method to in6-in7(measured value, limits) is a little
27       different between C and B version. C or B version can be identified
28       by CR[0x49h].
29*/
30
31/*
32    Supports following chips:
33
34    Chip	#vin	#fanin	#pwm	#temp	wchipid	vendid	i2c	ISA
35    w83792d	9	7	7	3	0x7a	0x5ca3	yes	no
36*/
37
38#include <linux/module.h>
39#include <linux/init.h>
40#include <linux/slab.h>
41#include <linux/i2c.h>
42#include <linux/hwmon.h>
43#include <linux/hwmon-sysfs.h>
44#include <linux/err.h>
45#include <linux/mutex.h>
46#include <linux/sysfs.h>
47
48/* Addresses to scan */
49static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f,
50						I2C_CLIENT_END };
51
52/* Insmod parameters */
53
54static unsigned short force_subclients[4];
55module_param_array(force_subclients, short, NULL, 0);
56MODULE_PARM_DESC(force_subclients, "List of subclient addresses: "
57			"{bus, clientaddr, subclientaddr1, subclientaddr2}");
58
59static int init;
60module_param(init, bool, 0);
61MODULE_PARM_DESC(init, "Set to one to force chip initialization");
62
63/* The W83792D registers */
64static const u8 W83792D_REG_IN[9] = {
65	0x20,	/* Vcore A in DataSheet */
66	0x21,	/* Vcore B in DataSheet */
67	0x22,	/* VIN0 in DataSheet */
68	0x23,	/* VIN1 in DataSheet */
69	0x24,	/* VIN2 in DataSheet */
70	0x25,	/* VIN3 in DataSheet */
71	0x26,	/* 5VCC in DataSheet */
72	0xB0,	/* 5VSB in DataSheet */
73	0xB1	/* VBAT in DataSheet */
74};
75#define W83792D_REG_LOW_BITS1 0x3E  /* Low Bits I in DataSheet */
76#define W83792D_REG_LOW_BITS2 0x3F  /* Low Bits II in DataSheet */
77static const u8 W83792D_REG_IN_MAX[9] = {
78	0x2B,	/* Vcore A High Limit in DataSheet */
79	0x2D,	/* Vcore B High Limit in DataSheet */
80	0x2F,	/* VIN0 High Limit in DataSheet */
81	0x31,	/* VIN1 High Limit in DataSheet */
82	0x33,	/* VIN2 High Limit in DataSheet */
83	0x35,	/* VIN3 High Limit in DataSheet */
84	0x37,	/* 5VCC High Limit in DataSheet */
85	0xB4,	/* 5VSB High Limit in DataSheet */
86	0xB6	/* VBAT High Limit in DataSheet */
87};
88static const u8 W83792D_REG_IN_MIN[9] = {
89	0x2C,	/* Vcore A Low Limit in DataSheet */
90	0x2E,	/* Vcore B Low Limit in DataSheet */
91	0x30,	/* VIN0 Low Limit in DataSheet */
92	0x32,	/* VIN1 Low Limit in DataSheet */
93	0x34,	/* VIN2 Low Limit in DataSheet */
94	0x36,	/* VIN3 Low Limit in DataSheet */
95	0x38,	/* 5VCC Low Limit in DataSheet */
96	0xB5,	/* 5VSB Low Limit in DataSheet */
97	0xB7	/* VBAT Low Limit in DataSheet */
98};
99static const u8 W83792D_REG_FAN[7] = {
100	0x28,	/* FAN 1 Count in DataSheet */
101	0x29,	/* FAN 2 Count in DataSheet */
102	0x2A,	/* FAN 3 Count in DataSheet */
103	0xB8,	/* FAN 4 Count in DataSheet */
104	0xB9,	/* FAN 5 Count in DataSheet */
105	0xBA,	/* FAN 6 Count in DataSheet */
106	0xBE	/* FAN 7 Count in DataSheet */
107};
108static const u8 W83792D_REG_FAN_MIN[7] = {
109	0x3B,	/* FAN 1 Count Low Limit in DataSheet */
110	0x3C,	/* FAN 2 Count Low Limit in DataSheet */
111	0x3D,	/* FAN 3 Count Low Limit in DataSheet */
112	0xBB,	/* FAN 4 Count Low Limit in DataSheet */
113	0xBC,	/* FAN 5 Count Low Limit in DataSheet */
114	0xBD,	/* FAN 6 Count Low Limit in DataSheet */
115	0xBF	/* FAN 7 Count Low Limit in DataSheet */
116};
117#define W83792D_REG_FAN_CFG 0x84	/* FAN Configuration in DataSheet */
118static const u8 W83792D_REG_FAN_DIV[4] = {
119	0x47,	/* contains FAN2 and FAN1 Divisor */
120	0x5B,	/* contains FAN4 and FAN3 Divisor */
121	0x5C,	/* contains FAN6 and FAN5 Divisor */
122	0x9E	/* contains FAN7 Divisor. */
123};
124static const u8 W83792D_REG_PWM[7] = {
125	0x81,	/* FAN 1 Duty Cycle, be used to control */
126	0x83,	/* FAN 2 Duty Cycle, be used to control */
127	0x94,	/* FAN 3 Duty Cycle, be used to control */
128	0xA3,	/* FAN 4 Duty Cycle, be used to control */
129	0xA4,	/* FAN 5 Duty Cycle, be used to control */
130	0xA5,	/* FAN 6 Duty Cycle, be used to control */
131	0xA6	/* FAN 7 Duty Cycle, be used to control */
132};
133#define W83792D_REG_BANK		0x4E
134#define W83792D_REG_TEMP2_CONFIG	0xC2
135#define W83792D_REG_TEMP3_CONFIG	0xCA
136
137static const u8 W83792D_REG_TEMP1[3] = {
138	0x27,	/* TEMP 1 in DataSheet */
139	0x39,	/* TEMP 1 Over in DataSheet */
140	0x3A,	/* TEMP 1 Hyst in DataSheet */
141};
142
143static const u8 W83792D_REG_TEMP_ADD[2][6] = {
144	{ 0xC0,		/* TEMP 2 in DataSheet */
145	  0xC1,		/* TEMP 2(0.5 deg) in DataSheet */
146	  0xC5,		/* TEMP 2 Over High part in DataSheet */
147	  0xC6,		/* TEMP 2 Over Low part in DataSheet */
148	  0xC3,		/* TEMP 2 Thyst High part in DataSheet */
149	  0xC4 },	/* TEMP 2 Thyst Low part in DataSheet */
150	{ 0xC8,		/* TEMP 3 in DataSheet */
151	  0xC9,		/* TEMP 3(0.5 deg) in DataSheet */
152	  0xCD,		/* TEMP 3 Over High part in DataSheet */
153	  0xCE,		/* TEMP 3 Over Low part in DataSheet */
154	  0xCB,		/* TEMP 3 Thyst High part in DataSheet */
155	  0xCC }	/* TEMP 3 Thyst Low part in DataSheet */
156};
157
158static const u8 W83792D_REG_THERMAL[3] = {
159	0x85,	/* SmartFanI: Fan1 target value */
160	0x86,	/* SmartFanI: Fan2 target value */
161	0x96	/* SmartFanI: Fan3 target value */
162};
163
164static const u8 W83792D_REG_TOLERANCE[3] = {
165	0x87,	/* (bit3-0)SmartFan Fan1 tolerance */
166	0x87,	/* (bit7-4)SmartFan Fan2 tolerance */
167	0x97	/* (bit3-0)SmartFan Fan3 tolerance */
168};
169
170static const u8 W83792D_REG_POINTS[3][4] = {
171	{ 0x85,		/* SmartFanII: Fan1 temp point 1 */
172	  0xE3,		/* SmartFanII: Fan1 temp point 2 */
173	  0xE4,		/* SmartFanII: Fan1 temp point 3 */
174	  0xE5 },	/* SmartFanII: Fan1 temp point 4 */
175	{ 0x86,		/* SmartFanII: Fan2 temp point 1 */
176	  0xE6,		/* SmartFanII: Fan2 temp point 2 */
177	  0xE7,		/* SmartFanII: Fan2 temp point 3 */
178	  0xE8 },	/* SmartFanII: Fan2 temp point 4 */
179	{ 0x96,		/* SmartFanII: Fan3 temp point 1 */
180	  0xE9,		/* SmartFanII: Fan3 temp point 2 */
181	  0xEA,		/* SmartFanII: Fan3 temp point 3 */
182	  0xEB }	/* SmartFanII: Fan3 temp point 4 */
183};
184
185static const u8 W83792D_REG_LEVELS[3][4] = {
186	{ 0x88,		/* (bit3-0) SmartFanII: Fan1 Non-Stop */
187	  0x88,		/* (bit7-4) SmartFanII: Fan1 Level 1 */
188	  0xE0,		/* (bit7-4) SmartFanII: Fan1 Level 2 */
189	  0xE0 },	/* (bit3-0) SmartFanII: Fan1 Level 3 */
190	{ 0x89,		/* (bit3-0) SmartFanII: Fan2 Non-Stop */
191	  0x89,		/* (bit7-4) SmartFanII: Fan2 Level 1 */
192	  0xE1,		/* (bit7-4) SmartFanII: Fan2 Level 2 */
193	  0xE1 },	/* (bit3-0) SmartFanII: Fan2 Level 3 */
194	{ 0x98,		/* (bit3-0) SmartFanII: Fan3 Non-Stop */
195	  0x98,		/* (bit7-4) SmartFanII: Fan3 Level 1 */
196	  0xE2,		/* (bit7-4) SmartFanII: Fan3 Level 2 */
197	  0xE2 }	/* (bit3-0) SmartFanII: Fan3 Level 3 */
198};
199
200#define W83792D_REG_GPIO_EN		0x1A
201#define W83792D_REG_CONFIG		0x40
202#define W83792D_REG_VID_FANDIV		0x47
203#define W83792D_REG_CHIPID		0x49
204#define W83792D_REG_WCHIPID		0x58
205#define W83792D_REG_CHIPMAN		0x4F
206#define W83792D_REG_PIN			0x4B
207#define W83792D_REG_I2C_SUBADDR		0x4A
208
209#define W83792D_REG_ALARM1 0xA9		/* realtime status register1 */
210#define W83792D_REG_ALARM2 0xAA		/* realtime status register2 */
211#define W83792D_REG_ALARM3 0xAB		/* realtime status register3 */
212#define W83792D_REG_CHASSIS 0x42	/* Bit 5: Case Open status bit */
213#define W83792D_REG_CHASSIS_CLR 0x44	/* Bit 7: Case Open CLR_CHS/Reset bit */
214
215/* control in0/in1 's limit modifiability */
216#define W83792D_REG_VID_IN_B		0x17
217
218#define W83792D_REG_VBAT		0x5D
219#define W83792D_REG_I2C_ADDR		0x48
220
221/* Conversions. Rounding and limit checking is only done on the TO_REG
222   variants. Note that you should be a bit careful with which arguments
223   these macros are called: arguments may be evaluated more than once.
224   Fixing this is just not worth it. */
225#define IN_FROM_REG(nr,val) (((nr)<=1)?(val*2): \
226				((((nr)==6)||((nr)==7))?(val*6):(val*4)))
227#define IN_TO_REG(nr,val) (((nr)<=1)?(val/2): \
228				((((nr)==6)||((nr)==7))?(val/6):(val/4)))
229
230static inline u8
231FAN_TO_REG(long rpm, int div)
232{
233	if (rpm == 0)
234		return 255;
235	rpm = SENSORS_LIMIT(rpm, 1, 1000000);
236	return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
237}
238
239#define FAN_FROM_REG(val,div)	((val) == 0   ? -1 : \
240				((val) == 255 ? 0 : \
241						1350000 / ((val) * (div))))
242
243/* for temp1 */
244#define TEMP1_TO_REG(val)	(SENSORS_LIMIT(((val) < 0 ? (val)+0x100*1000 \
245					: (val)) / 1000, 0, 0xff))
246#define TEMP1_FROM_REG(val)	(((val) & 0x80 ? (val)-0x100 : (val)) * 1000)
247/* for temp2 and temp3, because they need addtional resolution */
248#define TEMP_ADD_FROM_REG(val1, val2) \
249	((((val1) & 0x80 ? (val1)-0x100 \
250		: (val1)) * 1000) + ((val2 & 0x80) ? 500 : 0))
251#define TEMP_ADD_TO_REG_HIGH(val) \
252	(SENSORS_LIMIT(((val) < 0 ? (val)+0x100*1000 \
253			: (val)) / 1000, 0, 0xff))
254#define TEMP_ADD_TO_REG_LOW(val)	((val%1000) ? 0x80 : 0x00)
255
256#define DIV_FROM_REG(val)		(1 << (val))
257
258static inline u8
259DIV_TO_REG(long val)
260{
261	int i;
262	val = SENSORS_LIMIT(val, 1, 128) >> 1;
263	for (i = 0; i < 7; i++) {
264		if (val == 0)
265			break;
266		val >>= 1;
267	}
268	return ((u8) i);
269}
270
271struct w83792d_data {
272	struct device *hwmon_dev;
273
274	struct mutex update_lock;
275	char valid;		/* !=0 if following fields are valid */
276	unsigned long last_updated;	/* In jiffies */
277
278	/* array of 2 pointers to subclients */
279	struct i2c_client *lm75[2];
280
281	u8 in[9];		/* Register value */
282	u8 in_max[9];		/* Register value */
283	u8 in_min[9];		/* Register value */
284	u16 low_bits;		/* Additional resolution to voltage in6-0 */
285	u8 fan[7];		/* Register value */
286	u8 fan_min[7];		/* Register value */
287	u8 temp1[3];		/* current, over, thyst */
288	u8 temp_add[2][6];	/* Register value */
289	u8 fan_div[7];		/* Register encoding, shifted right */
290	u8 pwm[7];		/* We only consider the first 3 set of pwm,
291				   although 792 chip has 7 set of pwm. */
292	u8 pwmenable[3];
293	u32 alarms;		/* realtime status register encoding,combined */
294	u8 chassis;		/* Chassis status */
295	u8 chassis_clear;	/* CLR_CHS, clear chassis intrusion detection */
296	u8 thermal_cruise[3];	/* Smart FanI: Fan1,2,3 target value */
297	u8 tolerance[3];	/* Fan1,2,3 tolerance(Smart Fan I/II) */
298	u8 sf2_points[3][4];	/* Smart FanII: Fan1,2,3 temperature points */
299	u8 sf2_levels[3][4];	/* Smart FanII: Fan1,2,3 duty cycle levels */
300};
301
302static int w83792d_probe(struct i2c_client *client,
303			 const struct i2c_device_id *id);
304static int w83792d_detect(struct i2c_client *client,
305			  struct i2c_board_info *info);
306static int w83792d_remove(struct i2c_client *client);
307static struct w83792d_data *w83792d_update_device(struct device *dev);
308
309#ifdef DEBUG
310static void w83792d_print_debug(struct w83792d_data *data, struct device *dev);
311#endif
312
313static void w83792d_init_client(struct i2c_client *client);
314
315static const struct i2c_device_id w83792d_id[] = {
316	{ "w83792d", 0 },
317	{ }
318};
319MODULE_DEVICE_TABLE(i2c, w83792d_id);
320
321static struct i2c_driver w83792d_driver = {
322	.class		= I2C_CLASS_HWMON,
323	.driver = {
324		.name = "w83792d",
325	},
326	.probe		= w83792d_probe,
327	.remove		= w83792d_remove,
328	.id_table	= w83792d_id,
329	.detect		= w83792d_detect,
330	.address_list	= normal_i2c,
331};
332
333static inline long in_count_from_reg(int nr, struct w83792d_data *data)
334{
335	/* in7 and in8 do not have low bits, but the formula still works */
336	return ((data->in[nr] << 2) | ((data->low_bits >> (2 * nr)) & 0x03));
337}
338
339/* The SMBus locks itself. The Winbond W83792D chip has a bank register,
340   but the driver only accesses registers in bank 0, so we don't have
341   to switch banks and lock access between switches. */
342static inline int w83792d_read_value(struct i2c_client *client, u8 reg)
343{
344	return i2c_smbus_read_byte_data(client, reg);
345}
346
347static inline int
348w83792d_write_value(struct i2c_client *client, u8 reg, u8 value)
349{
350	return i2c_smbus_write_byte_data(client, reg, value);
351}
352
353/* following are the sysfs callback functions */
354static ssize_t show_in(struct device *dev, struct device_attribute *attr,
355			char *buf)
356{
357	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
358	int nr = sensor_attr->index;
359	struct w83792d_data *data = w83792d_update_device(dev);
360	return sprintf(buf,"%ld\n", IN_FROM_REG(nr,(in_count_from_reg(nr, data))));
361}
362
363#define show_in_reg(reg) \
364static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
365			char *buf) \
366{ \
367	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
368	int nr = sensor_attr->index; \
369	struct w83792d_data *data = w83792d_update_device(dev); \
370	return sprintf(buf,"%ld\n", (long)(IN_FROM_REG(nr, (data->reg[nr])*4))); \
371}
372
373show_in_reg(in_min);
374show_in_reg(in_max);
375
376#define store_in_reg(REG, reg) \
377static ssize_t store_in_##reg (struct device *dev, \
378				struct device_attribute *attr, \
379				const char *buf, size_t count) \
380{ \
381	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
382	int nr = sensor_attr->index; \
383	struct i2c_client *client = to_i2c_client(dev); \
384	struct w83792d_data *data = i2c_get_clientdata(client); \
385	u32 val; \
386	 \
387	val = simple_strtoul(buf, NULL, 10); \
388	mutex_lock(&data->update_lock); \
389	data->in_##reg[nr] = SENSORS_LIMIT(IN_TO_REG(nr, val)/4, 0, 255); \
390	w83792d_write_value(client, W83792D_REG_IN_##REG[nr], data->in_##reg[nr]); \
391	mutex_unlock(&data->update_lock); \
392	 \
393	return count; \
394}
395store_in_reg(MIN, min);
396store_in_reg(MAX, max);
397
398#define show_fan_reg(reg) \
399static ssize_t show_##reg (struct device *dev, struct device_attribute *attr, \
400			char *buf) \
401{ \
402	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
403	int nr = sensor_attr->index - 1; \
404	struct w83792d_data *data = w83792d_update_device(dev); \
405	return sprintf(buf,"%d\n", \
406		FAN_FROM_REG(data->reg[nr], DIV_FROM_REG(data->fan_div[nr]))); \
407}
408
409show_fan_reg(fan);
410show_fan_reg(fan_min);
411
412static ssize_t
413store_fan_min(struct device *dev, struct device_attribute *attr,
414		const char *buf, size_t count)
415{
416	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
417	int nr = sensor_attr->index - 1;
418	struct i2c_client *client = to_i2c_client(dev);
419	struct w83792d_data *data = i2c_get_clientdata(client);
420	u32 val;
421
422	val = simple_strtoul(buf, NULL, 10);
423	mutex_lock(&data->update_lock);
424	data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
425	w83792d_write_value(client, W83792D_REG_FAN_MIN[nr],
426				data->fan_min[nr]);
427	mutex_unlock(&data->update_lock);
428
429	return count;
430}
431
432static ssize_t
433show_fan_div(struct device *dev, struct device_attribute *attr,
434		char *buf)
435{
436	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
437	int nr = sensor_attr->index;
438	struct w83792d_data *data = w83792d_update_device(dev);
439	return sprintf(buf, "%u\n", DIV_FROM_REG(data->fan_div[nr - 1]));
440}
441
442/* Note: we save and restore the fan minimum here, because its value is
443   determined in part by the fan divisor.  This follows the principle of
444   least surprise; the user doesn't expect the fan minimum to change just
445   because the divisor changed. */
446static ssize_t
447store_fan_div(struct device *dev, struct device_attribute *attr,
448		const char *buf, size_t count)
449{
450	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
451	int nr = sensor_attr->index - 1;
452	struct i2c_client *client = to_i2c_client(dev);
453	struct w83792d_data *data = i2c_get_clientdata(client);
454	unsigned long min;
455	/*u8 reg;*/
456	u8 fan_div_reg = 0;
457	u8 tmp_fan_div;
458
459	/* Save fan_min */
460	mutex_lock(&data->update_lock);
461	min = FAN_FROM_REG(data->fan_min[nr],
462			   DIV_FROM_REG(data->fan_div[nr]));
463
464	data->fan_div[nr] = DIV_TO_REG(simple_strtoul(buf, NULL, 10));
465
466	fan_div_reg = w83792d_read_value(client, W83792D_REG_FAN_DIV[nr >> 1]);
467	fan_div_reg &= (nr & 0x01) ? 0x8f : 0xf8;
468	tmp_fan_div = (nr & 0x01) ? (((data->fan_div[nr]) << 4) & 0x70)
469					: ((data->fan_div[nr]) & 0x07);
470	w83792d_write_value(client, W83792D_REG_FAN_DIV[nr >> 1],
471					fan_div_reg | tmp_fan_div);
472
473	/* Restore fan_min */
474	data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
475	w83792d_write_value(client, W83792D_REG_FAN_MIN[nr], data->fan_min[nr]);
476	mutex_unlock(&data->update_lock);
477
478	return count;
479}
480
481/* read/write the temperature1, includes measured value and limits */
482
483static ssize_t show_temp1(struct device *dev, struct device_attribute *attr,
484				char *buf)
485{
486	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
487	int nr = sensor_attr->index;
488	struct w83792d_data *data = w83792d_update_device(dev);
489	return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->temp1[nr]));
490}
491
492static ssize_t store_temp1(struct device *dev, struct device_attribute *attr,
493				const char *buf, size_t count)
494{
495	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
496	int nr = sensor_attr->index;
497	struct i2c_client *client = to_i2c_client(dev);
498	struct w83792d_data *data = i2c_get_clientdata(client);
499	s32 val;
500
501	val = simple_strtol(buf, NULL, 10);
502	mutex_lock(&data->update_lock);
503	data->temp1[nr] = TEMP1_TO_REG(val);
504	w83792d_write_value(client, W83792D_REG_TEMP1[nr],
505		data->temp1[nr]);
506	mutex_unlock(&data->update_lock);
507
508	return count;
509}
510
511/* read/write the temperature2-3, includes measured value and limits */
512
513static ssize_t show_temp23(struct device *dev, struct device_attribute *attr,
514				char *buf)
515{
516	struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
517	int nr = sensor_attr->nr;
518	int index = sensor_attr->index;
519	struct w83792d_data *data = w83792d_update_device(dev);
520	return sprintf(buf,"%ld\n",
521		(long)TEMP_ADD_FROM_REG(data->temp_add[nr][index],
522			data->temp_add[nr][index+1]));
523}
524
525static ssize_t store_temp23(struct device *dev, struct device_attribute *attr,
526				const char *buf, size_t count)
527{
528	struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
529	int nr = sensor_attr->nr;
530	int index = sensor_attr->index;
531	struct i2c_client *client = to_i2c_client(dev);
532	struct w83792d_data *data = i2c_get_clientdata(client);
533	s32 val;
534
535	val = simple_strtol(buf, NULL, 10);
536	mutex_lock(&data->update_lock);
537	data->temp_add[nr][index] = TEMP_ADD_TO_REG_HIGH(val);
538	data->temp_add[nr][index+1] = TEMP_ADD_TO_REG_LOW(val);
539	w83792d_write_value(client, W83792D_REG_TEMP_ADD[nr][index],
540		data->temp_add[nr][index]);
541	w83792d_write_value(client, W83792D_REG_TEMP_ADD[nr][index+1],
542		data->temp_add[nr][index+1]);
543	mutex_unlock(&data->update_lock);
544
545	return count;
546}
547
548/* get reatime status of all sensors items: voltage, temp, fan */
549static ssize_t
550show_alarms_reg(struct device *dev, struct device_attribute *attr, char *buf)
551{
552	struct w83792d_data *data = w83792d_update_device(dev);
553	return sprintf(buf, "%d\n", data->alarms);
554}
555
556static ssize_t show_alarm(struct device *dev,
557			  struct device_attribute *attr, char *buf)
558{
559	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
560	int nr = sensor_attr->index;
561	struct w83792d_data *data = w83792d_update_device(dev);
562	return sprintf(buf, "%d\n", (data->alarms >> nr) & 1);
563}
564
565static ssize_t
566show_pwm(struct device *dev, struct device_attribute *attr,
567		char *buf)
568{
569	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
570	int nr = sensor_attr->index;
571	struct w83792d_data *data = w83792d_update_device(dev);
572	return sprintf(buf, "%d\n", (data->pwm[nr] & 0x0f) << 4);
573}
574
575static ssize_t
576show_pwmenable(struct device *dev, struct device_attribute *attr,
577			char *buf)
578{
579	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
580	int nr = sensor_attr->index - 1;
581	struct w83792d_data *data = w83792d_update_device(dev);
582	long pwm_enable_tmp = 1;
583
584	switch (data->pwmenable[nr]) {
585	case 0:
586		pwm_enable_tmp = 1; /* manual mode */
587		break;
588	case 1:
589		pwm_enable_tmp = 3; /*thermal cruise/Smart Fan I */
590		break;
591	case 2:
592		pwm_enable_tmp = 2; /* Smart Fan II */
593		break;
594	}
595
596	return sprintf(buf, "%ld\n", pwm_enable_tmp);
597}
598
599static ssize_t
600store_pwm(struct device *dev, struct device_attribute *attr,
601		const char *buf, size_t count)
602{
603	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
604	int nr = sensor_attr->index;
605	struct i2c_client *client = to_i2c_client(dev);
606	struct w83792d_data *data = i2c_get_clientdata(client);
607	u8 val = SENSORS_LIMIT(simple_strtoul(buf, NULL, 10), 0, 255) >> 4;
608
609	mutex_lock(&data->update_lock);
610	val |= w83792d_read_value(client, W83792D_REG_PWM[nr]) & 0xf0;
611	data->pwm[nr] = val;
612	w83792d_write_value(client, W83792D_REG_PWM[nr], data->pwm[nr]);
613	mutex_unlock(&data->update_lock);
614
615	return count;
616}
617
618static ssize_t
619store_pwmenable(struct device *dev, struct device_attribute *attr,
620			const char *buf, size_t count)
621{
622	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
623	int nr = sensor_attr->index - 1;
624	struct i2c_client *client = to_i2c_client(dev);
625	struct w83792d_data *data = i2c_get_clientdata(client);
626	u32 val;
627	u8 fan_cfg_tmp, cfg1_tmp, cfg2_tmp, cfg3_tmp, cfg4_tmp;
628
629	val = simple_strtoul(buf, NULL, 10);
630	if (val < 1 || val > 3)
631		return -EINVAL;
632
633	mutex_lock(&data->update_lock);
634	switch (val) {
635	case 1:
636		data->pwmenable[nr] = 0; /* manual mode */
637		break;
638	case 2:
639		data->pwmenable[nr] = 2; /* Smart Fan II */
640		break;
641	case 3:
642		data->pwmenable[nr] = 1; /* thermal cruise/Smart Fan I */
643		break;
644	}
645	cfg1_tmp = data->pwmenable[0];
646	cfg2_tmp = (data->pwmenable[1]) << 2;
647	cfg3_tmp = (data->pwmenable[2]) << 4;
648	cfg4_tmp = w83792d_read_value(client,W83792D_REG_FAN_CFG) & 0xc0;
649	fan_cfg_tmp = ((cfg4_tmp | cfg3_tmp) | cfg2_tmp) | cfg1_tmp;
650	w83792d_write_value(client, W83792D_REG_FAN_CFG, fan_cfg_tmp);
651	mutex_unlock(&data->update_lock);
652
653	return count;
654}
655
656static ssize_t
657show_pwm_mode(struct device *dev, struct device_attribute *attr,
658			char *buf)
659{
660	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
661	int nr = sensor_attr->index;
662	struct w83792d_data *data = w83792d_update_device(dev);
663	return sprintf(buf, "%d\n", data->pwm[nr] >> 7);
664}
665
666static ssize_t
667store_pwm_mode(struct device *dev, struct device_attribute *attr,
668			const char *buf, size_t count)
669{
670	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
671	int nr = sensor_attr->index;
672	struct i2c_client *client = to_i2c_client(dev);
673	struct w83792d_data *data = i2c_get_clientdata(client);
674	u32 val;
675
676	val = simple_strtoul(buf, NULL, 10);
677	if (val != 0 && val != 1)
678		return -EINVAL;
679
680	mutex_lock(&data->update_lock);
681	data->pwm[nr] = w83792d_read_value(client, W83792D_REG_PWM[nr]);
682	if (val) {			/* PWM mode */
683		data->pwm[nr] |= 0x80;
684	} else {			/* DC mode */
685		data->pwm[nr] &= 0x7f;
686	}
687	w83792d_write_value(client, W83792D_REG_PWM[nr], data->pwm[nr]);
688	mutex_unlock(&data->update_lock);
689
690	return count;
691}
692
693static ssize_t
694show_regs_chassis(struct device *dev, struct device_attribute *attr,
695			char *buf)
696{
697	struct w83792d_data *data = w83792d_update_device(dev);
698	return sprintf(buf, "%d\n", data->chassis);
699}
700
701static ssize_t
702show_chassis_clear(struct device *dev, struct device_attribute *attr, char *buf)
703{
704	struct w83792d_data *data = w83792d_update_device(dev);
705	return sprintf(buf, "%d\n", data->chassis_clear);
706}
707
708static ssize_t
709store_chassis_clear(struct device *dev, struct device_attribute *attr,
710			const char *buf, size_t count)
711{
712	struct i2c_client *client = to_i2c_client(dev);
713	struct w83792d_data *data = i2c_get_clientdata(client);
714	u32 val;
715	u8 temp1 = 0, temp2 = 0;
716
717	val = simple_strtoul(buf, NULL, 10);
718	mutex_lock(&data->update_lock);
719	data->chassis_clear = SENSORS_LIMIT(val, 0 ,1);
720	temp1 = ((data->chassis_clear) << 7) & 0x80;
721	temp2 = w83792d_read_value(client,
722		W83792D_REG_CHASSIS_CLR) & 0x7f;
723	w83792d_write_value(client, W83792D_REG_CHASSIS_CLR, temp1 | temp2);
724	mutex_unlock(&data->update_lock);
725
726	return count;
727}
728
729/* For Smart Fan I / Thermal Cruise */
730static ssize_t
731show_thermal_cruise(struct device *dev, struct device_attribute *attr,
732			char *buf)
733{
734	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
735	int nr = sensor_attr->index;
736	struct w83792d_data *data = w83792d_update_device(dev);
737	return sprintf(buf, "%ld\n", (long)data->thermal_cruise[nr-1]);
738}
739
740static ssize_t
741store_thermal_cruise(struct device *dev, struct device_attribute *attr,
742			const char *buf, size_t count)
743{
744	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
745	int nr = sensor_attr->index - 1;
746	struct i2c_client *client = to_i2c_client(dev);
747	struct w83792d_data *data = i2c_get_clientdata(client);
748	u32 val;
749	u8 target_tmp=0, target_mask=0;
750
751	val = simple_strtoul(buf, NULL, 10);
752	target_tmp = val;
753	target_tmp = target_tmp & 0x7f;
754	mutex_lock(&data->update_lock);
755	target_mask = w83792d_read_value(client, W83792D_REG_THERMAL[nr]) & 0x80;
756	data->thermal_cruise[nr] = SENSORS_LIMIT(target_tmp, 0, 255);
757	w83792d_write_value(client, W83792D_REG_THERMAL[nr],
758		(data->thermal_cruise[nr]) | target_mask);
759	mutex_unlock(&data->update_lock);
760
761	return count;
762}
763
764/* For Smart Fan I/Thermal Cruise and Smart Fan II */
765static ssize_t
766show_tolerance(struct device *dev, struct device_attribute *attr,
767		char *buf)
768{
769	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
770	int nr = sensor_attr->index;
771	struct w83792d_data *data = w83792d_update_device(dev);
772	return sprintf(buf, "%ld\n", (long)data->tolerance[nr-1]);
773}
774
775static ssize_t
776store_tolerance(struct device *dev, struct device_attribute *attr,
777		const char *buf, size_t count)
778{
779	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
780	int nr = sensor_attr->index - 1;
781	struct i2c_client *client = to_i2c_client(dev);
782	struct w83792d_data *data = i2c_get_clientdata(client);
783	u32 val;
784	u8 tol_tmp, tol_mask;
785
786	val = simple_strtoul(buf, NULL, 10);
787	mutex_lock(&data->update_lock);
788	tol_mask = w83792d_read_value(client,
789		W83792D_REG_TOLERANCE[nr]) & ((nr == 1) ? 0x0f : 0xf0);
790	tol_tmp = SENSORS_LIMIT(val, 0, 15);
791	tol_tmp &= 0x0f;
792	data->tolerance[nr] = tol_tmp;
793	if (nr == 1) {
794		tol_tmp <<= 4;
795	}
796	w83792d_write_value(client, W83792D_REG_TOLERANCE[nr],
797		tol_mask | tol_tmp);
798	mutex_unlock(&data->update_lock);
799
800	return count;
801}
802
803/* For Smart Fan II */
804static ssize_t
805show_sf2_point(struct device *dev, struct device_attribute *attr,
806		char *buf)
807{
808	struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
809	int nr = sensor_attr->nr;
810	int index = sensor_attr->index;
811	struct w83792d_data *data = w83792d_update_device(dev);
812	return sprintf(buf, "%ld\n", (long)data->sf2_points[index-1][nr-1]);
813}
814
815static ssize_t
816store_sf2_point(struct device *dev, struct device_attribute *attr,
817		const char *buf, size_t count)
818{
819	struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
820	int nr = sensor_attr->nr - 1;
821	int index = sensor_attr->index - 1;
822	struct i2c_client *client = to_i2c_client(dev);
823	struct w83792d_data *data = i2c_get_clientdata(client);
824	u32 val;
825	u8 mask_tmp = 0;
826
827	val = simple_strtoul(buf, NULL, 10);
828	mutex_lock(&data->update_lock);
829	data->sf2_points[index][nr] = SENSORS_LIMIT(val, 0, 127);
830	mask_tmp = w83792d_read_value(client,
831					W83792D_REG_POINTS[index][nr]) & 0x80;
832	w83792d_write_value(client, W83792D_REG_POINTS[index][nr],
833		mask_tmp|data->sf2_points[index][nr]);
834	mutex_unlock(&data->update_lock);
835
836	return count;
837}
838
839static ssize_t
840show_sf2_level(struct device *dev, struct device_attribute *attr,
841		char *buf)
842{
843	struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
844	int nr = sensor_attr->nr;
845	int index = sensor_attr->index;
846	struct w83792d_data *data = w83792d_update_device(dev);
847	return sprintf(buf, "%d\n",
848			(((data->sf2_levels[index-1][nr]) * 100) / 15));
849}
850
851static ssize_t
852store_sf2_level(struct device *dev, struct device_attribute *attr,
853		const char *buf, size_t count)
854{
855	struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
856	int nr = sensor_attr->nr;
857	int index = sensor_attr->index - 1;
858	struct i2c_client *client = to_i2c_client(dev);
859	struct w83792d_data *data = i2c_get_clientdata(client);
860	u32 val;
861	u8 mask_tmp=0, level_tmp=0;
862
863	val = simple_strtoul(buf, NULL, 10);
864	mutex_lock(&data->update_lock);
865	data->sf2_levels[index][nr] = SENSORS_LIMIT((val * 15) / 100, 0, 15);
866	mask_tmp = w83792d_read_value(client, W83792D_REG_LEVELS[index][nr])
867		& ((nr==3) ? 0xf0 : 0x0f);
868	if (nr==3) {
869		level_tmp = data->sf2_levels[index][nr];
870	} else {
871		level_tmp = data->sf2_levels[index][nr] << 4;
872	}
873	w83792d_write_value(client, W83792D_REG_LEVELS[index][nr], level_tmp | mask_tmp);
874	mutex_unlock(&data->update_lock);
875
876	return count;
877}
878
879
880static int
881w83792d_detect_subclients(struct i2c_client *new_client)
882{
883	int i, id, err;
884	int address = new_client->addr;
885	u8 val;
886	struct i2c_adapter *adapter = new_client->adapter;
887	struct w83792d_data *data = i2c_get_clientdata(new_client);
888
889	id = i2c_adapter_id(adapter);
890	if (force_subclients[0] == id && force_subclients[1] == address) {
891		for (i = 2; i <= 3; i++) {
892			if (force_subclients[i] < 0x48 ||
893			    force_subclients[i] > 0x4f) {
894				dev_err(&new_client->dev, "invalid subclient "
895					"address %d; must be 0x48-0x4f\n",
896					force_subclients[i]);
897				err = -ENODEV;
898				goto ERROR_SC_0;
899			}
900		}
901		w83792d_write_value(new_client, W83792D_REG_I2C_SUBADDR,
902					(force_subclients[2] & 0x07) |
903					((force_subclients[3] & 0x07) << 4));
904	}
905
906	val = w83792d_read_value(new_client, W83792D_REG_I2C_SUBADDR);
907	if (!(val & 0x08)) {
908		data->lm75[0] = i2c_new_dummy(adapter, 0x48 + (val & 0x7));
909	}
910	if (!(val & 0x80)) {
911		if ((data->lm75[0] != NULL) &&
912			((val & 0x7) == ((val >> 4) & 0x7))) {
913			dev_err(&new_client->dev, "duplicate addresses 0x%x, "
914				"use force_subclient\n", data->lm75[0]->addr);
915			err = -ENODEV;
916			goto ERROR_SC_1;
917		}
918		data->lm75[1] = i2c_new_dummy(adapter,
919					      0x48 + ((val >> 4) & 0x7));
920	}
921
922	return 0;
923
924/* Undo inits in case of errors */
925
926ERROR_SC_1:
927	if (data->lm75[0] != NULL)
928		i2c_unregister_device(data->lm75[0]);
929ERROR_SC_0:
930	return err;
931}
932
933static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_in, NULL, 0);
934static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_in, NULL, 1);
935static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_in, NULL, 2);
936static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, show_in, NULL, 3);
937static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, show_in, NULL, 4);
938static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, show_in, NULL, 5);
939static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_in, NULL, 6);
940static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, show_in, NULL, 7);
941static SENSOR_DEVICE_ATTR(in8_input, S_IRUGO, show_in, NULL, 8);
942static SENSOR_DEVICE_ATTR(in0_min, S_IWUSR | S_IRUGO,
943			show_in_min, store_in_min, 0);
944static SENSOR_DEVICE_ATTR(in1_min, S_IWUSR | S_IRUGO,
945			show_in_min, store_in_min, 1);
946static SENSOR_DEVICE_ATTR(in2_min, S_IWUSR | S_IRUGO,
947			show_in_min, store_in_min, 2);
948static SENSOR_DEVICE_ATTR(in3_min, S_IWUSR | S_IRUGO,
949			show_in_min, store_in_min, 3);
950static SENSOR_DEVICE_ATTR(in4_min, S_IWUSR | S_IRUGO,
951			show_in_min, store_in_min, 4);
952static SENSOR_DEVICE_ATTR(in5_min, S_IWUSR | S_IRUGO,
953			show_in_min, store_in_min, 5);
954static SENSOR_DEVICE_ATTR(in6_min, S_IWUSR | S_IRUGO,
955			show_in_min, store_in_min, 6);
956static SENSOR_DEVICE_ATTR(in7_min, S_IWUSR | S_IRUGO,
957			show_in_min, store_in_min, 7);
958static SENSOR_DEVICE_ATTR(in8_min, S_IWUSR | S_IRUGO,
959			show_in_min, store_in_min, 8);
960static SENSOR_DEVICE_ATTR(in0_max, S_IWUSR | S_IRUGO,
961			show_in_max, store_in_max, 0);
962static SENSOR_DEVICE_ATTR(in1_max, S_IWUSR | S_IRUGO,
963			show_in_max, store_in_max, 1);
964static SENSOR_DEVICE_ATTR(in2_max, S_IWUSR | S_IRUGO,
965			show_in_max, store_in_max, 2);
966static SENSOR_DEVICE_ATTR(in3_max, S_IWUSR | S_IRUGO,
967			show_in_max, store_in_max, 3);
968static SENSOR_DEVICE_ATTR(in4_max, S_IWUSR | S_IRUGO,
969			show_in_max, store_in_max, 4);
970static SENSOR_DEVICE_ATTR(in5_max, S_IWUSR | S_IRUGO,
971			show_in_max, store_in_max, 5);
972static SENSOR_DEVICE_ATTR(in6_max, S_IWUSR | S_IRUGO,
973			show_in_max, store_in_max, 6);
974static SENSOR_DEVICE_ATTR(in7_max, S_IWUSR | S_IRUGO,
975			show_in_max, store_in_max, 7);
976static SENSOR_DEVICE_ATTR(in8_max, S_IWUSR | S_IRUGO,
977			show_in_max, store_in_max, 8);
978static SENSOR_DEVICE_ATTR_2(temp1_input, S_IRUGO, show_temp1, NULL, 0, 0);
979static SENSOR_DEVICE_ATTR_2(temp2_input, S_IRUGO, show_temp23, NULL, 0, 0);
980static SENSOR_DEVICE_ATTR_2(temp3_input, S_IRUGO, show_temp23, NULL, 1, 0);
981static SENSOR_DEVICE_ATTR_2(temp1_max, S_IRUGO | S_IWUSR,
982			show_temp1, store_temp1, 0, 1);
983static SENSOR_DEVICE_ATTR_2(temp2_max, S_IRUGO | S_IWUSR, show_temp23,
984			store_temp23, 0, 2);
985static SENSOR_DEVICE_ATTR_2(temp3_max, S_IRUGO | S_IWUSR, show_temp23,
986			store_temp23, 1, 2);
987static SENSOR_DEVICE_ATTR_2(temp1_max_hyst, S_IRUGO | S_IWUSR,
988			show_temp1, store_temp1, 0, 2);
989static SENSOR_DEVICE_ATTR_2(temp2_max_hyst, S_IRUGO | S_IWUSR,
990			show_temp23, store_temp23, 0, 4);
991static SENSOR_DEVICE_ATTR_2(temp3_max_hyst, S_IRUGO | S_IWUSR,
992			show_temp23, store_temp23, 1, 4);
993static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
994static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
995static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
996static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 2);
997static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 3);
998static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 4);
999static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 5);
1000static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 6);
1001static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 7);
1002static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 8);
1003static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 9);
1004static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 10);
1005static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 11);
1006static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 12);
1007static SENSOR_DEVICE_ATTR(fan7_alarm, S_IRUGO, show_alarm, NULL, 15);
1008static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 19);
1009static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 20);
1010static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 21);
1011static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 22);
1012static SENSOR_DEVICE_ATTR(fan6_alarm, S_IRUGO, show_alarm, NULL, 23);
1013static DEVICE_ATTR(chassis, S_IRUGO, show_regs_chassis, NULL);
1014static DEVICE_ATTR(chassis_clear, S_IRUGO | S_IWUSR,
1015			show_chassis_clear, store_chassis_clear);
1016static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0);
1017static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 1);
1018static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 2);
1019static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO,
1020			show_pwmenable, store_pwmenable, 1);
1021static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO,
1022			show_pwmenable, store_pwmenable, 2);
1023static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO,
1024			show_pwmenable, store_pwmenable, 3);
1025static SENSOR_DEVICE_ATTR(pwm1_mode, S_IWUSR | S_IRUGO,
1026			show_pwm_mode, store_pwm_mode, 0);
1027static SENSOR_DEVICE_ATTR(pwm2_mode, S_IWUSR | S_IRUGO,
1028			show_pwm_mode, store_pwm_mode, 1);
1029static SENSOR_DEVICE_ATTR(pwm3_mode, S_IWUSR | S_IRUGO,
1030			show_pwm_mode, store_pwm_mode, 2);
1031static SENSOR_DEVICE_ATTR(tolerance1, S_IWUSR | S_IRUGO,
1032			show_tolerance, store_tolerance, 1);
1033static SENSOR_DEVICE_ATTR(tolerance2, S_IWUSR | S_IRUGO,
1034			show_tolerance, store_tolerance, 2);
1035static SENSOR_DEVICE_ATTR(tolerance3, S_IWUSR | S_IRUGO,
1036			show_tolerance, store_tolerance, 3);
1037static SENSOR_DEVICE_ATTR(thermal_cruise1, S_IWUSR | S_IRUGO,
1038			show_thermal_cruise, store_thermal_cruise, 1);
1039static SENSOR_DEVICE_ATTR(thermal_cruise2, S_IWUSR | S_IRUGO,
1040			show_thermal_cruise, store_thermal_cruise, 2);
1041static SENSOR_DEVICE_ATTR(thermal_cruise3, S_IWUSR | S_IRUGO,
1042			show_thermal_cruise, store_thermal_cruise, 3);
1043static SENSOR_DEVICE_ATTR_2(sf2_point1_fan1, S_IRUGO | S_IWUSR,
1044			show_sf2_point, store_sf2_point, 1, 1);
1045static SENSOR_DEVICE_ATTR_2(sf2_point2_fan1, S_IRUGO | S_IWUSR,
1046			show_sf2_point, store_sf2_point, 2, 1);
1047static SENSOR_DEVICE_ATTR_2(sf2_point3_fan1, S_IRUGO | S_IWUSR,
1048			show_sf2_point, store_sf2_point, 3, 1);
1049static SENSOR_DEVICE_ATTR_2(sf2_point4_fan1, S_IRUGO | S_IWUSR,
1050			show_sf2_point, store_sf2_point, 4, 1);
1051static SENSOR_DEVICE_ATTR_2(sf2_point1_fan2, S_IRUGO | S_IWUSR,
1052			show_sf2_point, store_sf2_point, 1, 2);
1053static SENSOR_DEVICE_ATTR_2(sf2_point2_fan2, S_IRUGO | S_IWUSR,
1054			show_sf2_point, store_sf2_point, 2, 2);
1055static SENSOR_DEVICE_ATTR_2(sf2_point3_fan2, S_IRUGO | S_IWUSR,
1056			show_sf2_point, store_sf2_point, 3, 2);
1057static SENSOR_DEVICE_ATTR_2(sf2_point4_fan2, S_IRUGO | S_IWUSR,
1058			show_sf2_point, store_sf2_point, 4, 2);
1059static SENSOR_DEVICE_ATTR_2(sf2_point1_fan3, S_IRUGO | S_IWUSR,
1060			show_sf2_point, store_sf2_point, 1, 3);
1061static SENSOR_DEVICE_ATTR_2(sf2_point2_fan3, S_IRUGO | S_IWUSR,
1062			show_sf2_point, store_sf2_point, 2, 3);
1063static SENSOR_DEVICE_ATTR_2(sf2_point3_fan3, S_IRUGO | S_IWUSR,
1064			show_sf2_point, store_sf2_point, 3, 3);
1065static SENSOR_DEVICE_ATTR_2(sf2_point4_fan3, S_IRUGO | S_IWUSR,
1066			show_sf2_point, store_sf2_point, 4, 3);
1067static SENSOR_DEVICE_ATTR_2(sf2_level1_fan1, S_IRUGO | S_IWUSR,
1068			show_sf2_level, store_sf2_level, 1, 1);
1069static SENSOR_DEVICE_ATTR_2(sf2_level2_fan1, S_IRUGO | S_IWUSR,
1070			show_sf2_level, store_sf2_level, 2, 1);
1071static SENSOR_DEVICE_ATTR_2(sf2_level3_fan1, S_IRUGO | S_IWUSR,
1072			show_sf2_level, store_sf2_level, 3, 1);
1073static SENSOR_DEVICE_ATTR_2(sf2_level1_fan2, S_IRUGO | S_IWUSR,
1074			show_sf2_level, store_sf2_level, 1, 2);
1075static SENSOR_DEVICE_ATTR_2(sf2_level2_fan2, S_IRUGO | S_IWUSR,
1076			show_sf2_level, store_sf2_level, 2, 2);
1077static SENSOR_DEVICE_ATTR_2(sf2_level3_fan2, S_IRUGO | S_IWUSR,
1078			show_sf2_level, store_sf2_level, 3, 2);
1079static SENSOR_DEVICE_ATTR_2(sf2_level1_fan3, S_IRUGO | S_IWUSR,
1080			show_sf2_level, store_sf2_level, 1, 3);
1081static SENSOR_DEVICE_ATTR_2(sf2_level2_fan3, S_IRUGO | S_IWUSR,
1082			show_sf2_level, store_sf2_level, 2, 3);
1083static SENSOR_DEVICE_ATTR_2(sf2_level3_fan3, S_IRUGO | S_IWUSR,
1084			show_sf2_level, store_sf2_level, 3, 3);
1085static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 1);
1086static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 2);
1087static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 3);
1088static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 4);
1089static SENSOR_DEVICE_ATTR(fan5_input, S_IRUGO, show_fan, NULL, 5);
1090static SENSOR_DEVICE_ATTR(fan6_input, S_IRUGO, show_fan, NULL, 6);
1091static SENSOR_DEVICE_ATTR(fan7_input, S_IRUGO, show_fan, NULL, 7);
1092static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO,
1093			show_fan_min, store_fan_min, 1);
1094static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO,
1095			show_fan_min, store_fan_min, 2);
1096static SENSOR_DEVICE_ATTR(fan3_min, S_IWUSR | S_IRUGO,
1097			show_fan_min, store_fan_min, 3);
1098static SENSOR_DEVICE_ATTR(fan4_min, S_IWUSR | S_IRUGO,
1099			show_fan_min, store_fan_min, 4);
1100static SENSOR_DEVICE_ATTR(fan5_min, S_IWUSR | S_IRUGO,
1101			show_fan_min, store_fan_min, 5);
1102static SENSOR_DEVICE_ATTR(fan6_min, S_IWUSR | S_IRUGO,
1103			show_fan_min, store_fan_min, 6);
1104static SENSOR_DEVICE_ATTR(fan7_min, S_IWUSR | S_IRUGO,
1105			show_fan_min, store_fan_min, 7);
1106static SENSOR_DEVICE_ATTR(fan1_div, S_IWUSR | S_IRUGO,
1107			show_fan_div, store_fan_div, 1);
1108static SENSOR_DEVICE_ATTR(fan2_div, S_IWUSR | S_IRUGO,
1109			show_fan_div, store_fan_div, 2);
1110static SENSOR_DEVICE_ATTR(fan3_div, S_IWUSR | S_IRUGO,
1111			show_fan_div, store_fan_div, 3);
1112static SENSOR_DEVICE_ATTR(fan4_div, S_IWUSR | S_IRUGO,
1113			show_fan_div, store_fan_div, 4);
1114static SENSOR_DEVICE_ATTR(fan5_div, S_IWUSR | S_IRUGO,
1115			show_fan_div, store_fan_div, 5);
1116static SENSOR_DEVICE_ATTR(fan6_div, S_IWUSR | S_IRUGO,
1117			show_fan_div, store_fan_div, 6);
1118static SENSOR_DEVICE_ATTR(fan7_div, S_IWUSR | S_IRUGO,
1119			show_fan_div, store_fan_div, 7);
1120
1121static struct attribute *w83792d_attributes_fan[4][5] = {
1122	{
1123		&sensor_dev_attr_fan4_input.dev_attr.attr,
1124		&sensor_dev_attr_fan4_min.dev_attr.attr,
1125		&sensor_dev_attr_fan4_div.dev_attr.attr,
1126		&sensor_dev_attr_fan4_alarm.dev_attr.attr,
1127		NULL
1128	}, {
1129		&sensor_dev_attr_fan5_input.dev_attr.attr,
1130		&sensor_dev_attr_fan5_min.dev_attr.attr,
1131		&sensor_dev_attr_fan5_div.dev_attr.attr,
1132		&sensor_dev_attr_fan5_alarm.dev_attr.attr,
1133		NULL
1134	}, {
1135		&sensor_dev_attr_fan6_input.dev_attr.attr,
1136		&sensor_dev_attr_fan6_min.dev_attr.attr,
1137		&sensor_dev_attr_fan6_div.dev_attr.attr,
1138		&sensor_dev_attr_fan6_alarm.dev_attr.attr,
1139		NULL
1140	}, {
1141		&sensor_dev_attr_fan7_input.dev_attr.attr,
1142		&sensor_dev_attr_fan7_min.dev_attr.attr,
1143		&sensor_dev_attr_fan7_div.dev_attr.attr,
1144		&sensor_dev_attr_fan7_alarm.dev_attr.attr,
1145		NULL
1146	}
1147};
1148
1149static const struct attribute_group w83792d_group_fan[4] = {
1150	{ .attrs = w83792d_attributes_fan[0] },
1151	{ .attrs = w83792d_attributes_fan[1] },
1152	{ .attrs = w83792d_attributes_fan[2] },
1153	{ .attrs = w83792d_attributes_fan[3] },
1154};
1155
1156static struct attribute *w83792d_attributes[] = {
1157	&sensor_dev_attr_in0_input.dev_attr.attr,
1158	&sensor_dev_attr_in0_max.dev_attr.attr,
1159	&sensor_dev_attr_in0_min.dev_attr.attr,
1160	&sensor_dev_attr_in1_input.dev_attr.attr,
1161	&sensor_dev_attr_in1_max.dev_attr.attr,
1162	&sensor_dev_attr_in1_min.dev_attr.attr,
1163	&sensor_dev_attr_in2_input.dev_attr.attr,
1164	&sensor_dev_attr_in2_max.dev_attr.attr,
1165	&sensor_dev_attr_in2_min.dev_attr.attr,
1166	&sensor_dev_attr_in3_input.dev_attr.attr,
1167	&sensor_dev_attr_in3_max.dev_attr.attr,
1168	&sensor_dev_attr_in3_min.dev_attr.attr,
1169	&sensor_dev_attr_in4_input.dev_attr.attr,
1170	&sensor_dev_attr_in4_max.dev_attr.attr,
1171	&sensor_dev_attr_in4_min.dev_attr.attr,
1172	&sensor_dev_attr_in5_input.dev_attr.attr,
1173	&sensor_dev_attr_in5_max.dev_attr.attr,
1174	&sensor_dev_attr_in5_min.dev_attr.attr,
1175	&sensor_dev_attr_in6_input.dev_attr.attr,
1176	&sensor_dev_attr_in6_max.dev_attr.attr,
1177	&sensor_dev_attr_in6_min.dev_attr.attr,
1178	&sensor_dev_attr_in7_input.dev_attr.attr,
1179	&sensor_dev_attr_in7_max.dev_attr.attr,
1180	&sensor_dev_attr_in7_min.dev_attr.attr,
1181	&sensor_dev_attr_in8_input.dev_attr.attr,
1182	&sensor_dev_attr_in8_max.dev_attr.attr,
1183	&sensor_dev_attr_in8_min.dev_attr.attr,
1184	&sensor_dev_attr_in0_alarm.dev_attr.attr,
1185	&sensor_dev_attr_in1_alarm.dev_attr.attr,
1186	&sensor_dev_attr_in2_alarm.dev_attr.attr,
1187	&sensor_dev_attr_in3_alarm.dev_attr.attr,
1188	&sensor_dev_attr_in4_alarm.dev_attr.attr,
1189	&sensor_dev_attr_in5_alarm.dev_attr.attr,
1190	&sensor_dev_attr_in6_alarm.dev_attr.attr,
1191	&sensor_dev_attr_in7_alarm.dev_attr.attr,
1192	&sensor_dev_attr_in8_alarm.dev_attr.attr,
1193	&sensor_dev_attr_temp1_input.dev_attr.attr,
1194	&sensor_dev_attr_temp1_max.dev_attr.attr,
1195	&sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
1196	&sensor_dev_attr_temp2_input.dev_attr.attr,
1197	&sensor_dev_attr_temp2_max.dev_attr.attr,
1198	&sensor_dev_attr_temp2_max_hyst.dev_attr.attr,
1199	&sensor_dev_attr_temp3_input.dev_attr.attr,
1200	&sensor_dev_attr_temp3_max.dev_attr.attr,
1201	&sensor_dev_attr_temp3_max_hyst.dev_attr.attr,
1202	&sensor_dev_attr_temp1_alarm.dev_attr.attr,
1203	&sensor_dev_attr_temp2_alarm.dev_attr.attr,
1204	&sensor_dev_attr_temp3_alarm.dev_attr.attr,
1205	&sensor_dev_attr_pwm1.dev_attr.attr,
1206	&sensor_dev_attr_pwm1_mode.dev_attr.attr,
1207	&sensor_dev_attr_pwm1_enable.dev_attr.attr,
1208	&sensor_dev_attr_pwm2.dev_attr.attr,
1209	&sensor_dev_attr_pwm2_mode.dev_attr.attr,
1210	&sensor_dev_attr_pwm2_enable.dev_attr.attr,
1211	&sensor_dev_attr_pwm3.dev_attr.attr,
1212	&sensor_dev_attr_pwm3_mode.dev_attr.attr,
1213	&sensor_dev_attr_pwm3_enable.dev_attr.attr,
1214	&dev_attr_alarms.attr,
1215	&dev_attr_chassis.attr,
1216	&dev_attr_chassis_clear.attr,
1217	&sensor_dev_attr_tolerance1.dev_attr.attr,
1218	&sensor_dev_attr_thermal_cruise1.dev_attr.attr,
1219	&sensor_dev_attr_tolerance2.dev_attr.attr,
1220	&sensor_dev_attr_thermal_cruise2.dev_attr.attr,
1221	&sensor_dev_attr_tolerance3.dev_attr.attr,
1222	&sensor_dev_attr_thermal_cruise3.dev_attr.attr,
1223	&sensor_dev_attr_sf2_point1_fan1.dev_attr.attr,
1224	&sensor_dev_attr_sf2_point2_fan1.dev_attr.attr,
1225	&sensor_dev_attr_sf2_point3_fan1.dev_attr.attr,
1226	&sensor_dev_attr_sf2_point4_fan1.dev_attr.attr,
1227	&sensor_dev_attr_sf2_point1_fan2.dev_attr.attr,
1228	&sensor_dev_attr_sf2_point2_fan2.dev_attr.attr,
1229	&sensor_dev_attr_sf2_point3_fan2.dev_attr.attr,
1230	&sensor_dev_attr_sf2_point4_fan2.dev_attr.attr,
1231	&sensor_dev_attr_sf2_point1_fan3.dev_attr.attr,
1232	&sensor_dev_attr_sf2_point2_fan3.dev_attr.attr,
1233	&sensor_dev_attr_sf2_point3_fan3.dev_attr.attr,
1234	&sensor_dev_attr_sf2_point4_fan3.dev_attr.attr,
1235	&sensor_dev_attr_sf2_level1_fan1.dev_attr.attr,
1236	&sensor_dev_attr_sf2_level2_fan1.dev_attr.attr,
1237	&sensor_dev_attr_sf2_level3_fan1.dev_attr.attr,
1238	&sensor_dev_attr_sf2_level1_fan2.dev_attr.attr,
1239	&sensor_dev_attr_sf2_level2_fan2.dev_attr.attr,
1240	&sensor_dev_attr_sf2_level3_fan2.dev_attr.attr,
1241	&sensor_dev_attr_sf2_level1_fan3.dev_attr.attr,
1242	&sensor_dev_attr_sf2_level2_fan3.dev_attr.attr,
1243	&sensor_dev_attr_sf2_level3_fan3.dev_attr.attr,
1244	&sensor_dev_attr_fan1_input.dev_attr.attr,
1245	&sensor_dev_attr_fan1_min.dev_attr.attr,
1246	&sensor_dev_attr_fan1_div.dev_attr.attr,
1247	&sensor_dev_attr_fan1_alarm.dev_attr.attr,
1248	&sensor_dev_attr_fan2_input.dev_attr.attr,
1249	&sensor_dev_attr_fan2_min.dev_attr.attr,
1250	&sensor_dev_attr_fan2_div.dev_attr.attr,
1251	&sensor_dev_attr_fan2_alarm.dev_attr.attr,
1252	&sensor_dev_attr_fan3_input.dev_attr.attr,
1253	&sensor_dev_attr_fan3_min.dev_attr.attr,
1254	&sensor_dev_attr_fan3_div.dev_attr.attr,
1255	&sensor_dev_attr_fan3_alarm.dev_attr.attr,
1256	NULL
1257};
1258
1259static const struct attribute_group w83792d_group = {
1260	.attrs = w83792d_attributes,
1261};
1262
1263/* Return 0 if detection is successful, -ENODEV otherwise */
1264static int
1265w83792d_detect(struct i2c_client *client, struct i2c_board_info *info)
1266{
1267	struct i2c_adapter *adapter = client->adapter;
1268	int val1, val2;
1269	unsigned short address = client->addr;
1270
1271	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1272		return -ENODEV;
1273	}
1274
1275	if (w83792d_read_value(client, W83792D_REG_CONFIG) & 0x80)
1276		return -ENODEV;
1277
1278	val1 = w83792d_read_value(client, W83792D_REG_BANK);
1279	val2 = w83792d_read_value(client, W83792D_REG_CHIPMAN);
1280	/* Check for Winbond ID if in bank 0 */
1281	if (!(val1 & 0x07)) {  /* is Bank0 */
1282		if ((!(val1 & 0x80) && val2 != 0xa3) ||
1283		    ( (val1 & 0x80) && val2 != 0x5c))
1284			return -ENODEV;
1285	}
1286	/* If Winbond chip, address of chip and W83792D_REG_I2C_ADDR
1287	   should match */
1288	if (w83792d_read_value(client, W83792D_REG_I2C_ADDR) != address)
1289		return -ENODEV;
1290
1291	/*  Put it now into bank 0 and Vendor ID High Byte */
1292	w83792d_write_value(client,
1293			    W83792D_REG_BANK,
1294			    (w83792d_read_value(client,
1295				W83792D_REG_BANK) & 0x78) | 0x80);
1296
1297	/* Determine the chip type. */
1298	val1 = w83792d_read_value(client, W83792D_REG_WCHIPID);
1299	val2 = w83792d_read_value(client, W83792D_REG_CHIPMAN);
1300	if (val1 != 0x7a || val2 != 0x5c)
1301		return -ENODEV;
1302
1303	strlcpy(info->type, "w83792d", I2C_NAME_SIZE);
1304
1305	return 0;
1306}
1307
1308static int
1309w83792d_probe(struct i2c_client *client, const struct i2c_device_id *id)
1310{
1311	struct w83792d_data *data;
1312	struct device *dev = &client->dev;
1313	int i, val1, err;
1314
1315	data = kzalloc(sizeof(struct w83792d_data), GFP_KERNEL);
1316	if (!data) {
1317		err = -ENOMEM;
1318		goto ERROR0;
1319	}
1320
1321	i2c_set_clientdata(client, data);
1322	data->valid = 0;
1323	mutex_init(&data->update_lock);
1324
1325	err = w83792d_detect_subclients(client);
1326	if (err)
1327		goto ERROR1;
1328
1329	/* Initialize the chip */
1330	w83792d_init_client(client);
1331
1332	/* A few vars need to be filled upon startup */
1333	for (i = 0; i < 7; i++) {
1334		data->fan_min[i] = w83792d_read_value(client,
1335					W83792D_REG_FAN_MIN[i]);
1336	}
1337
1338	/* Register sysfs hooks */
1339	if ((err = sysfs_create_group(&dev->kobj, &w83792d_group)))
1340		goto ERROR3;
1341
1342	/* Read GPIO enable register to check if pins for fan 4,5 are used as
1343	   GPIO */
1344	val1 = w83792d_read_value(client, W83792D_REG_GPIO_EN);
1345
1346	if (!(val1 & 0x40))
1347		if ((err = sysfs_create_group(&dev->kobj,
1348					      &w83792d_group_fan[0])))
1349			goto exit_remove_files;
1350
1351	if (!(val1 & 0x20))
1352		if ((err = sysfs_create_group(&dev->kobj,
1353					      &w83792d_group_fan[1])))
1354			goto exit_remove_files;
1355
1356	val1 = w83792d_read_value(client, W83792D_REG_PIN);
1357	if (val1 & 0x40)
1358		if ((err = sysfs_create_group(&dev->kobj,
1359					      &w83792d_group_fan[2])))
1360			goto exit_remove_files;
1361
1362	if (val1 & 0x04)
1363		if ((err = sysfs_create_group(&dev->kobj,
1364					      &w83792d_group_fan[3])))
1365			goto exit_remove_files;
1366
1367	data->hwmon_dev = hwmon_device_register(dev);
1368	if (IS_ERR(data->hwmon_dev)) {
1369		err = PTR_ERR(data->hwmon_dev);
1370		goto exit_remove_files;
1371	}
1372
1373	return 0;
1374
1375exit_remove_files:
1376	sysfs_remove_group(&dev->kobj, &w83792d_group);
1377	for (i = 0; i < ARRAY_SIZE(w83792d_group_fan); i++)
1378		sysfs_remove_group(&dev->kobj, &w83792d_group_fan[i]);
1379ERROR3:
1380	if (data->lm75[0] != NULL)
1381		i2c_unregister_device(data->lm75[0]);
1382	if (data->lm75[1] != NULL)
1383		i2c_unregister_device(data->lm75[1]);
1384ERROR1:
1385	kfree(data);
1386ERROR0:
1387	return err;
1388}
1389
1390static int
1391w83792d_remove(struct i2c_client *client)
1392{
1393	struct w83792d_data *data = i2c_get_clientdata(client);
1394	int i;
1395
1396	hwmon_device_unregister(data->hwmon_dev);
1397	sysfs_remove_group(&client->dev.kobj, &w83792d_group);
1398	for (i = 0; i < ARRAY_SIZE(w83792d_group_fan); i++)
1399		sysfs_remove_group(&client->dev.kobj,
1400				   &w83792d_group_fan[i]);
1401
1402	if (data->lm75[0] != NULL)
1403		i2c_unregister_device(data->lm75[0]);
1404	if (data->lm75[1] != NULL)
1405		i2c_unregister_device(data->lm75[1]);
1406
1407	kfree(data);
1408	return 0;
1409}
1410
1411static void
1412w83792d_init_client(struct i2c_client *client)
1413{
1414	u8 temp2_cfg, temp3_cfg, vid_in_b;
1415
1416	if (init) {
1417		w83792d_write_value(client, W83792D_REG_CONFIG, 0x80);
1418	}
1419	/* Clear the bit6 of W83792D_REG_VID_IN_B(set it into 0):
1420	   W83792D_REG_VID_IN_B bit6 = 0: the high/low limit of
1421	     vin0/vin1 can be modified by user;
1422	   W83792D_REG_VID_IN_B bit6 = 1: the high/low limit of
1423	     vin0/vin1 auto-updated, can NOT be modified by user. */
1424	vid_in_b = w83792d_read_value(client, W83792D_REG_VID_IN_B);
1425	w83792d_write_value(client, W83792D_REG_VID_IN_B,
1426			    vid_in_b & 0xbf);
1427
1428	temp2_cfg = w83792d_read_value(client, W83792D_REG_TEMP2_CONFIG);
1429	temp3_cfg = w83792d_read_value(client, W83792D_REG_TEMP3_CONFIG);
1430	w83792d_write_value(client, W83792D_REG_TEMP2_CONFIG,
1431				temp2_cfg & 0xe6);
1432	w83792d_write_value(client, W83792D_REG_TEMP3_CONFIG,
1433				temp3_cfg & 0xe6);
1434
1435	/* Start monitoring */
1436	w83792d_write_value(client, W83792D_REG_CONFIG,
1437			    (w83792d_read_value(client,
1438						W83792D_REG_CONFIG) & 0xf7)
1439			    | 0x01);
1440}
1441
1442static struct w83792d_data *w83792d_update_device(struct device *dev)
1443{
1444	struct i2c_client *client = to_i2c_client(dev);
1445	struct w83792d_data *data = i2c_get_clientdata(client);
1446	int i, j;
1447	u8 reg_array_tmp[4], reg_tmp;
1448
1449	mutex_lock(&data->update_lock);
1450
1451	if (time_after
1452	    (jiffies - data->last_updated, (unsigned long) (HZ * 3))
1453	    || time_before(jiffies, data->last_updated) || !data->valid) {
1454		dev_dbg(dev, "Starting device update\n");
1455
1456		/* Update the voltages measured value and limits */
1457		for (i = 0; i < 9; i++) {
1458			data->in[i] = w83792d_read_value(client,
1459						W83792D_REG_IN[i]);
1460			data->in_max[i] = w83792d_read_value(client,
1461						W83792D_REG_IN_MAX[i]);
1462			data->in_min[i] = w83792d_read_value(client,
1463						W83792D_REG_IN_MIN[i]);
1464		}
1465		data->low_bits = w83792d_read_value(client,
1466						W83792D_REG_LOW_BITS1) +
1467				 (w83792d_read_value(client,
1468						W83792D_REG_LOW_BITS2) << 8);
1469		for (i = 0; i < 7; i++) {
1470			/* Update the Fan measured value and limits */
1471			data->fan[i] = w83792d_read_value(client,
1472						W83792D_REG_FAN[i]);
1473			data->fan_min[i] = w83792d_read_value(client,
1474						W83792D_REG_FAN_MIN[i]);
1475			/* Update the PWM/DC Value and PWM/DC flag */
1476			data->pwm[i] = w83792d_read_value(client,
1477						W83792D_REG_PWM[i]);
1478		}
1479
1480		reg_tmp = w83792d_read_value(client, W83792D_REG_FAN_CFG);
1481		data->pwmenable[0] = reg_tmp & 0x03;
1482		data->pwmenable[1] = (reg_tmp>>2) & 0x03;
1483		data->pwmenable[2] = (reg_tmp>>4) & 0x03;
1484
1485		for (i = 0; i < 3; i++) {
1486			data->temp1[i] = w83792d_read_value(client,
1487							W83792D_REG_TEMP1[i]);
1488		}
1489		for (i = 0; i < 2; i++) {
1490			for (j = 0; j < 6; j++) {
1491				data->temp_add[i][j] = w83792d_read_value(
1492					client,W83792D_REG_TEMP_ADD[i][j]);
1493			}
1494		}
1495
1496		/* Update the Fan Divisor */
1497		for (i = 0; i < 4; i++) {
1498			reg_array_tmp[i] = w83792d_read_value(client,
1499							W83792D_REG_FAN_DIV[i]);
1500		}
1501		data->fan_div[0] = reg_array_tmp[0] & 0x07;
1502		data->fan_div[1] = (reg_array_tmp[0] >> 4) & 0x07;
1503		data->fan_div[2] = reg_array_tmp[1] & 0x07;
1504		data->fan_div[3] = (reg_array_tmp[1] >> 4) & 0x07;
1505		data->fan_div[4] = reg_array_tmp[2] & 0x07;
1506		data->fan_div[5] = (reg_array_tmp[2] >> 4) & 0x07;
1507		data->fan_div[6] = reg_array_tmp[3] & 0x07;
1508
1509		/* Update the realtime status */
1510		data->alarms = w83792d_read_value(client, W83792D_REG_ALARM1) +
1511			(w83792d_read_value(client, W83792D_REG_ALARM2) << 8) +
1512			(w83792d_read_value(client, W83792D_REG_ALARM3) << 16);
1513
1514		/* Update CaseOpen status and it's CLR_CHS. */
1515		data->chassis = (w83792d_read_value(client,
1516			W83792D_REG_CHASSIS) >> 5) & 0x01;
1517		data->chassis_clear = (w83792d_read_value(client,
1518			W83792D_REG_CHASSIS_CLR) >> 7) & 0x01;
1519
1520		/* Update Thermal Cruise/Smart Fan I target value */
1521		for (i = 0; i < 3; i++) {
1522			data->thermal_cruise[i] =
1523				w83792d_read_value(client,
1524				W83792D_REG_THERMAL[i]) & 0x7f;
1525		}
1526
1527		/* Update Smart Fan I/II tolerance */
1528		reg_tmp = w83792d_read_value(client, W83792D_REG_TOLERANCE[0]);
1529		data->tolerance[0] = reg_tmp & 0x0f;
1530		data->tolerance[1] = (reg_tmp >> 4) & 0x0f;
1531		data->tolerance[2] = w83792d_read_value(client,
1532					W83792D_REG_TOLERANCE[2]) & 0x0f;
1533
1534		/* Update Smart Fan II temperature points */
1535		for (i = 0; i < 3; i++) {
1536			for (j = 0; j < 4; j++) {
1537				data->sf2_points[i][j] = w83792d_read_value(
1538					client,W83792D_REG_POINTS[i][j]) & 0x7f;
1539			}
1540		}
1541
1542		/* Update Smart Fan II duty cycle levels */
1543		for (i = 0; i < 3; i++) {
1544			reg_tmp = w83792d_read_value(client,
1545						W83792D_REG_LEVELS[i][0]);
1546			data->sf2_levels[i][0] = reg_tmp & 0x0f;
1547			data->sf2_levels[i][1] = (reg_tmp >> 4) & 0x0f;
1548			reg_tmp = w83792d_read_value(client,
1549						W83792D_REG_LEVELS[i][2]);
1550			data->sf2_levels[i][2] = (reg_tmp >> 4) & 0x0f;
1551			data->sf2_levels[i][3] = reg_tmp & 0x0f;
1552		}
1553
1554		data->last_updated = jiffies;
1555		data->valid = 1;
1556	}
1557
1558	mutex_unlock(&data->update_lock);
1559
1560#ifdef DEBUG
1561	w83792d_print_debug(data, dev);
1562#endif
1563
1564	return data;
1565}
1566
1567#ifdef DEBUG
1568static void w83792d_print_debug(struct w83792d_data *data, struct device *dev)
1569{
1570	int i=0, j=0;
1571	dev_dbg(dev, "==========The following is the debug message...========\n");
1572	dev_dbg(dev, "9 set of Voltages: =====>\n");
1573	for (i=0; i<9; i++) {
1574		dev_dbg(dev, "vin[%d] is: 0x%x\n", i, data->in[i]);
1575		dev_dbg(dev, "vin[%d] max is: 0x%x\n", i, data->in_max[i]);
1576		dev_dbg(dev, "vin[%d] min is: 0x%x\n", i, data->in_min[i]);
1577	}
1578	dev_dbg(dev, "Low Bit1 is: 0x%x\n", data->low_bits & 0xff);
1579	dev_dbg(dev, "Low Bit2 is: 0x%x\n", data->low_bits >> 8);
1580	dev_dbg(dev, "7 set of Fan Counts and Duty Cycles: =====>\n");
1581	for (i=0; i<7; i++) {
1582		dev_dbg(dev, "fan[%d] is: 0x%x\n", i, data->fan[i]);
1583		dev_dbg(dev, "fan[%d] min is: 0x%x\n", i, data->fan_min[i]);
1584		dev_dbg(dev, "pwm[%d]     is: 0x%x\n", i, data->pwm[i]);
1585	}
1586	dev_dbg(dev, "3 set of Temperatures: =====>\n");
1587	for (i=0; i<3; i++) {
1588		dev_dbg(dev, "temp1[%d] is: 0x%x\n", i, data->temp1[i]);
1589	}
1590
1591	for (i=0; i<2; i++) {
1592		for (j=0; j<6; j++) {
1593			dev_dbg(dev, "temp_add[%d][%d] is: 0x%x\n", i, j,
1594							data->temp_add[i][j]);
1595		}
1596	}
1597
1598	for (i=0; i<7; i++) {
1599		dev_dbg(dev, "fan_div[%d] is: 0x%x\n", i, data->fan_div[i]);
1600	}
1601	dev_dbg(dev, "==========End of the debug message...==================\n");
1602	dev_dbg(dev, "\n");
1603}
1604#endif
1605
1606static int __init
1607sensors_w83792d_init(void)
1608{
1609	return i2c_add_driver(&w83792d_driver);
1610}
1611
1612static void __exit
1613sensors_w83792d_exit(void)
1614{
1615	i2c_del_driver(&w83792d_driver);
1616}
1617
1618MODULE_AUTHOR("Chunhao Huang @ Winbond <DZShen@Winbond.com.tw>");
1619MODULE_DESCRIPTION("W83792AD/D driver for linux-2.6");
1620MODULE_LICENSE("GPL");
1621
1622module_init(sensors_w83792d_init);
1623module_exit(sensors_w83792d_exit);
1624