cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

w83792d.c (55539B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * w83792d.c - Part of lm_sensors, Linux kernel modules for hardware
      4 *	       monitoring
      5 * 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, there
     12 *     are also some motherboards with B version W83792D device. The
     13 *     calculation method to in6-in7(measured value, limits) is a little
     14 *     different between C and B version. C or B version can be identified
     15 *     by CR[0x49h].
     16 */
     17
     18/*
     19 * Supports following chips:
     20 *
     21 * Chip		#vin	#fanin	#pwm	#temp	wchipid	vendid	i2c	ISA
     22 * w83792d	9	7	7	3	0x7a	0x5ca3	yes	no
     23 */
     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		0x4E
    122#define W83792D_REG_TEMP2_CONFIG	0xC2
    123#define W83792D_REG_TEMP3_CONFIG	0xCA
    124
    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		0x1A
    189#define W83792D_REG_CONFIG		0x40
    190#define W83792D_REG_VID_FANDIV		0x47
    191#define W83792D_REG_CHIPID		0x49
    192#define W83792D_REG_WCHIPID		0x58
    193#define W83792D_REG_CHIPMAN		0x4F
    194#define W83792D_REG_PIN			0x4B
    195#define W83792D_REG_I2C_SUBADDR		0x4A
    196
    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		0x17
    205
    206#define W83792D_REG_VBAT		0x5D
    207#define W83792D_REG_I2C_ADDR		0x48
    208
    209/*
    210 * Conversions. Rounding and limit checking is only done on the TO_REG
    211 * variants. Note that you should be a bit careful with which arguments
    212 * 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 u8
    221FAN_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 u8
    248DIV_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 int w83792d_remove(struct i2c_client *client);
    290static struct w83792d_data *w83792d_update_device(struct device *dev);
    291
    292#ifdef DEBUG
    293static void w83792d_print_debug(struct w83792d_data *data, struct device *dev);
    294#endif
    295
    296static void w83792d_init_client(struct i2c_client *client);
    297
    298static const struct i2c_device_id w83792d_id[] = {
    299	{ "w83792d", 0 },
    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_new	= 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 have
    325 * 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 int
    333w83792d_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_t
    405store_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_t
    429show_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 is
    440 * determined in part by the fan divisor.  This follows the principle of
    441 * least surprise; the user doesn't expect the fan minimum to change just
    442 * because the divisor changed.
    443 */
    444static ssize_t
    445store_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_attr
    525	  = 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_attr
    538	  = 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_t
    564alarms_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_t
    580show_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_t
    590show_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_t
    614store_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_t
    639store_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_t
    681show_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_t
    691store_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_t
    721intrusion0_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_t
    729intrusion0_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_t
    751show_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_t
    761store_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_t
    791show_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_t
    801store_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_t
    833show_sf2_point(struct device *dev, struct device_attribute *attr,
    834		char *buf)
    835{
    836	struct sensor_device_attribute_2 *sensor_attr
    837	  = 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_t
    845store_sf2_point(struct device *dev, struct device_attribute *attr,
    846		const char *buf, size_t count)
    847{
    848	struct sensor_device_attribute_2 *sensor_attr
    849	  = 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_t
    874show_sf2_level(struct device *dev, struct device_attribute *attr,
    875		char *buf)
    876{
    877	struct sensor_device_attribute_2 *sensor_attr
    878	  = 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_t
    887store_sf2_level(struct device *dev, struct device_attribute *attr,
    888		const char *buf, size_t count)
    889{
    890	struct sensor_device_attribute_2 *sensor_attr
    891	  = 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	else
    911		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 int
    921w83792d_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		NULL
   1168	}, {
   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		NULL
   1176	}, {
   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		NULL
   1184	}, {
   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		NULL
   1192	}
   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	NULL
   1302};
   1303
   1304static const struct attribute_group w83792d_group = {
   1305	.attrs = w83792d_attributes,
   1306};
   1307
   1308/* Return 0 if detection is successful, -ENODEV otherwise */
   1309static int
   1310w83792d_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_ADDR
   1332	 * should match
   1333	 */
   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	strlcpy(info->type, "w83792d", I2C_NAME_SIZE);
   1350
   1351	return 0;
   1352}
   1353
   1354static int
   1355w83792d_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 as
   1388	 * GPIO
   1389	 */
   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 int
   1433w83792d_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	return 0;
   1445}
   1446
   1447static void
   1448w83792d_init_client(struct i2c_client *client)
   1449{
   1450	u8 temp2_cfg, temp3_cfg, vid_in_b;
   1451
   1452	if (init)
   1453		w83792d_write_value(client, W83792D_REG_CONFIG, 0x80);
   1454
   1455	/*
   1456	 * Clear the bit6 of W83792D_REG_VID_IN_B(set it into 0):
   1457	 * W83792D_REG_VID_IN_B bit6 = 0: the high/low limit of
   1458	 * vin0/vin1 can be modified by user;
   1459	 * W83792D_REG_VID_IN_B bit6 = 1: the high/low limit of
   1460	 * vin0/vin1 auto-updated, can NOT be modified by user.
   1461	 */
   1462	vid_in_b = w83792d_read_value(client, W83792D_REG_VID_IN_B);
   1463	w83792d_write_value(client, W83792D_REG_VID_IN_B,
   1464			    vid_in_b & 0xbf);
   1465
   1466	temp2_cfg = w83792d_read_value(client, W83792D_REG_TEMP2_CONFIG);
   1467	temp3_cfg = w83792d_read_value(client, W83792D_REG_TEMP3_CONFIG);
   1468	w83792d_write_value(client, W83792D_REG_TEMP2_CONFIG,
   1469				temp2_cfg & 0xe6);
   1470	w83792d_write_value(client, W83792D_REG_TEMP3_CONFIG,
   1471				temp3_cfg & 0xe6);
   1472
   1473	/* Start monitoring */
   1474	w83792d_write_value(client, W83792D_REG_CONFIG,
   1475			    (w83792d_read_value(client,
   1476						W83792D_REG_CONFIG) & 0xf7)
   1477			    | 0x01);
   1478}
   1479
   1480static struct w83792d_data *w83792d_update_device(struct device *dev)
   1481{
   1482	struct i2c_client *client = to_i2c_client(dev);
   1483	struct w83792d_data *data = i2c_get_clientdata(client);
   1484	int i, j;
   1485	u8 reg_array_tmp[4], reg_tmp;
   1486
   1487	mutex_lock(&data->update_lock);
   1488
   1489	if (time_after
   1490	    (jiffies - data->last_updated, (unsigned long) (HZ * 3))
   1491	    || time_before(jiffies, data->last_updated) || !data->valid) {
   1492		dev_dbg(dev, "Starting device update\n");
   1493
   1494		/* Update the voltages measured value and limits */
   1495		for (i = 0; i < 9; i++) {
   1496			data->in[i] = w83792d_read_value(client,
   1497						W83792D_REG_IN[i]);
   1498			data->in_max[i] = w83792d_read_value(client,
   1499						W83792D_REG_IN_MAX[i]);
   1500			data->in_min[i] = w83792d_read_value(client,
   1501						W83792D_REG_IN_MIN[i]);
   1502		}
   1503		data->low_bits = w83792d_read_value(client,
   1504						W83792D_REG_LOW_BITS1) +
   1505				 (w83792d_read_value(client,
   1506						W83792D_REG_LOW_BITS2) << 8);
   1507		for (i = 0; i < 7; i++) {
   1508			/* Update the Fan measured value and limits */
   1509			data->fan[i] = w83792d_read_value(client,
   1510						W83792D_REG_FAN[i]);
   1511			data->fan_min[i] = w83792d_read_value(client,
   1512						W83792D_REG_FAN_MIN[i]);
   1513			/* Update the PWM/DC Value and PWM/DC flag */
   1514			data->pwm[i] = w83792d_read_value(client,
   1515						W83792D_REG_PWM[i]);
   1516		}
   1517
   1518		reg_tmp = w83792d_read_value(client, W83792D_REG_FAN_CFG);
   1519		data->pwmenable[0] = reg_tmp & 0x03;
   1520		data->pwmenable[1] = (reg_tmp>>2) & 0x03;
   1521		data->pwmenable[2] = (reg_tmp>>4) & 0x03;
   1522
   1523		for (i = 0; i < 3; i++) {
   1524			data->temp1[i] = w83792d_read_value(client,
   1525							W83792D_REG_TEMP1[i]);
   1526		}
   1527		for (i = 0; i < 2; i++) {
   1528			for (j = 0; j < 6; j++) {
   1529				data->temp_add[i][j] = w83792d_read_value(
   1530					client, W83792D_REG_TEMP_ADD[i][j]);
   1531			}
   1532		}
   1533
   1534		/* Update the Fan Divisor */
   1535		for (i = 0; i < 4; i++) {
   1536			reg_array_tmp[i] = w83792d_read_value(client,
   1537							W83792D_REG_FAN_DIV[i]);
   1538		}
   1539		data->fan_div[0] = reg_array_tmp[0] & 0x07;
   1540		data->fan_div[1] = (reg_array_tmp[0] >> 4) & 0x07;
   1541		data->fan_div[2] = reg_array_tmp[1] & 0x07;
   1542		data->fan_div[3] = (reg_array_tmp[1] >> 4) & 0x07;
   1543		data->fan_div[4] = reg_array_tmp[2] & 0x07;
   1544		data->fan_div[5] = (reg_array_tmp[2] >> 4) & 0x07;
   1545		data->fan_div[6] = reg_array_tmp[3] & 0x07;
   1546
   1547		/* Update the realtime status */
   1548		data->alarms = w83792d_read_value(client, W83792D_REG_ALARM1) +
   1549			(w83792d_read_value(client, W83792D_REG_ALARM2) << 8) +
   1550			(w83792d_read_value(client, W83792D_REG_ALARM3) << 16);
   1551
   1552		/* Update CaseOpen status and it's CLR_CHS. */
   1553		data->chassis = (w83792d_read_value(client,
   1554			W83792D_REG_CHASSIS) >> 5) & 0x01;
   1555
   1556		/* Update Thermal Cruise/Smart Fan I target value */
   1557		for (i = 0; i < 3; i++) {
   1558			data->thermal_cruise[i] =
   1559				w83792d_read_value(client,
   1560				W83792D_REG_THERMAL[i]) & 0x7f;
   1561		}
   1562
   1563		/* Update Smart Fan I/II tolerance */
   1564		reg_tmp = w83792d_read_value(client, W83792D_REG_TOLERANCE[0]);
   1565		data->tolerance[0] = reg_tmp & 0x0f;
   1566		data->tolerance[1] = (reg_tmp >> 4) & 0x0f;
   1567		data->tolerance[2] = w83792d_read_value(client,
   1568					W83792D_REG_TOLERANCE[2]) & 0x0f;
   1569
   1570		/* Update Smart Fan II temperature points */
   1571		for (i = 0; i < 3; i++) {
   1572			for (j = 0; j < 4; j++) {
   1573				data->sf2_points[i][j]
   1574				  = w83792d_read_value(client,
   1575					W83792D_REG_POINTS[i][j]) & 0x7f;
   1576			}
   1577		}
   1578
   1579		/* Update Smart Fan II duty cycle levels */
   1580		for (i = 0; i < 3; i++) {
   1581			reg_tmp = w83792d_read_value(client,
   1582						W83792D_REG_LEVELS[i][0]);
   1583			data->sf2_levels[i][0] = reg_tmp & 0x0f;
   1584			data->sf2_levels[i][1] = (reg_tmp >> 4) & 0x0f;
   1585			reg_tmp = w83792d_read_value(client,
   1586						W83792D_REG_LEVELS[i][2]);
   1587			data->sf2_levels[i][2] = (reg_tmp >> 4) & 0x0f;
   1588			data->sf2_levels[i][3] = reg_tmp & 0x0f;
   1589		}
   1590
   1591		data->last_updated = jiffies;
   1592		data->valid = true;
   1593	}
   1594
   1595	mutex_unlock(&data->update_lock);
   1596
   1597#ifdef DEBUG
   1598	w83792d_print_debug(data, dev);
   1599#endif
   1600
   1601	return data;
   1602}
   1603
   1604#ifdef DEBUG
   1605static void w83792d_print_debug(struct w83792d_data *data, struct device *dev)
   1606{
   1607	int i = 0, j = 0;
   1608	dev_dbg(dev, "==========The following is the debug message...========\n");
   1609	dev_dbg(dev, "9 set of Voltages: =====>\n");
   1610	for (i = 0; i < 9; i++) {
   1611		dev_dbg(dev, "vin[%d] is: 0x%x\n", i, data->in[i]);
   1612		dev_dbg(dev, "vin[%d] max is: 0x%x\n", i, data->in_max[i]);
   1613		dev_dbg(dev, "vin[%d] min is: 0x%x\n", i, data->in_min[i]);
   1614	}
   1615	dev_dbg(dev, "Low Bit1 is: 0x%x\n", data->low_bits & 0xff);
   1616	dev_dbg(dev, "Low Bit2 is: 0x%x\n", data->low_bits >> 8);
   1617	dev_dbg(dev, "7 set of Fan Counts and Duty Cycles: =====>\n");
   1618	for (i = 0; i < 7; i++) {
   1619		dev_dbg(dev, "fan[%d] is: 0x%x\n", i, data->fan[i]);
   1620		dev_dbg(dev, "fan[%d] min is: 0x%x\n", i, data->fan_min[i]);
   1621		dev_dbg(dev, "pwm[%d]     is: 0x%x\n", i, data->pwm[i]);
   1622	}
   1623	dev_dbg(dev, "3 set of Temperatures: =====>\n");
   1624	for (i = 0; i < 3; i++)
   1625		dev_dbg(dev, "temp1[%d] is: 0x%x\n", i, data->temp1[i]);
   1626
   1627	for (i = 0; i < 2; i++) {
   1628		for (j = 0; j < 6; j++) {
   1629			dev_dbg(dev, "temp_add[%d][%d] is: 0x%x\n", i, j,
   1630							data->temp_add[i][j]);
   1631		}
   1632	}
   1633
   1634	for (i = 0; i < 7; i++)
   1635		dev_dbg(dev, "fan_div[%d] is: 0x%x\n", i, data->fan_div[i]);
   1636
   1637	dev_dbg(dev, "==========End of the debug message...================\n");
   1638	dev_dbg(dev, "\n");
   1639}
   1640#endif
   1641
   1642module_i2c_driver(w83792d_driver);
   1643
   1644MODULE_AUTHOR("Shane Huang (Winbond)");
   1645MODULE_DESCRIPTION("W83792AD/D driver for linux-2.6");
   1646MODULE_LICENSE("GPL");