brintos

brintos / linux-shallow public Read only

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