brintos

brintos / linux-shallow public Read only

0
0
Text · 48.9 KiB · ace854b Raw
1658 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * w83791d.c - Part of lm_sensors, Linux kernel modules for hardware4 *	       monitoring5 *6 * Copyright (C) 2006-2007 Charles Spirakis <bezaur@gmail.com>7 */8 9/*10 * Supports following chips:11 *12 * Chip		#vin	#fanin	#pwm	#temp	wchipid	vendid	i2c	ISA13 * w83791d	10	5	5	3	0x71	0x5ca3	yes	no14 *15 * The w83791d chip appears to be part way between the 83781d and the16 * 83792d. Thus, this file is derived from both the w83792d.c and17 * w83781d.c files.18 *19 * The w83791g chip is the same as the w83791d but lead-free.20 */21 22#include <linux/module.h>23#include <linux/init.h>24#include <linux/slab.h>25#include <linux/i2c.h>26#include <linux/hwmon.h>27#include <linux/hwmon-vid.h>28#include <linux/hwmon-sysfs.h>29#include <linux/err.h>30#include <linux/mutex.h>31#include <linux/jiffies.h>32 33#define NUMBER_OF_VIN		1034#define NUMBER_OF_FANIN		535#define NUMBER_OF_TEMPIN	336#define NUMBER_OF_PWM		537 38/* Addresses to scan */39static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f,40						I2C_CLIENT_END };41 42/* Insmod parameters */43 44static unsigned short force_subclients[4];45module_param_array(force_subclients, short, NULL, 0);46MODULE_PARM_DESC(force_subclients,47		 "List of subclient addresses: {bus, clientaddr, subclientaddr1, subclientaddr2}");48 49static bool reset;50module_param(reset, bool, 0);51MODULE_PARM_DESC(reset, "Set to one to force a hardware chip reset");52 53static bool init;54module_param(init, bool, 0);55MODULE_PARM_DESC(init, "Set to one to force extra software initialization");56 57/* The W83791D registers */58static const u8 W83791D_REG_IN[NUMBER_OF_VIN] = {59	0x20,			/* VCOREA in DataSheet */60	0x21,			/* VINR0 in DataSheet */61	0x22,			/* +3.3VIN in DataSheet */62	0x23,			/* VDD5V in DataSheet */63	0x24,			/* +12VIN in DataSheet */64	0x25,			/* -12VIN in DataSheet */65	0x26,			/* -5VIN in DataSheet */66	0xB0,			/* 5VSB in DataSheet */67	0xB1,			/* VBAT in DataSheet */68	0xB2			/* VINR1 in DataSheet */69};70 71static const u8 W83791D_REG_IN_MAX[NUMBER_OF_VIN] = {72	0x2B,			/* VCOREA High Limit in DataSheet */73	0x2D,			/* VINR0 High Limit in DataSheet */74	0x2F,			/* +3.3VIN High Limit in DataSheet */75	0x31,			/* VDD5V High Limit in DataSheet */76	0x33,			/* +12VIN High Limit in DataSheet */77	0x35,			/* -12VIN High Limit in DataSheet */78	0x37,			/* -5VIN High Limit in DataSheet */79	0xB4,			/* 5VSB High Limit in DataSheet */80	0xB6,			/* VBAT High Limit in DataSheet */81	0xB8			/* VINR1 High Limit in DataSheet */82};83static const u8 W83791D_REG_IN_MIN[NUMBER_OF_VIN] = {84	0x2C,			/* VCOREA Low Limit in DataSheet */85	0x2E,			/* VINR0 Low Limit in DataSheet */86	0x30,			/* +3.3VIN Low Limit in DataSheet */87	0x32,			/* VDD5V Low Limit in DataSheet */88	0x34,			/* +12VIN Low Limit in DataSheet */89	0x36,			/* -12VIN Low Limit in DataSheet */90	0x38,			/* -5VIN Low Limit in DataSheet */91	0xB5,			/* 5VSB Low Limit in DataSheet */92	0xB7,			/* VBAT Low Limit in DataSheet */93	0xB9			/* VINR1 Low Limit in DataSheet */94};95static const u8 W83791D_REG_FAN[NUMBER_OF_FANIN] = {96	0x28,			/* FAN 1 Count in DataSheet */97	0x29,			/* FAN 2 Count in DataSheet */98	0x2A,			/* FAN 3 Count in DataSheet */99	0xBA,			/* FAN 4 Count in DataSheet */100	0xBB,			/* FAN 5 Count in DataSheet */101};102static const u8 W83791D_REG_FAN_MIN[NUMBER_OF_FANIN] = {103	0x3B,			/* FAN 1 Count Low Limit in DataSheet */104	0x3C,			/* FAN 2 Count Low Limit in DataSheet */105	0x3D,			/* FAN 3 Count Low Limit in DataSheet */106	0xBC,			/* FAN 4 Count Low Limit in DataSheet */107	0xBD,			/* FAN 5 Count Low Limit in DataSheet */108};109 110static const u8 W83791D_REG_PWM[NUMBER_OF_PWM] = {111	0x81,			/* PWM 1 duty cycle register in DataSheet */112	0x83,			/* PWM 2 duty cycle register in DataSheet */113	0x94,			/* PWM 3 duty cycle register in DataSheet */114	0xA0,			/* PWM 4 duty cycle register in DataSheet */115	0xA1,			/* PWM 5 duty cycle register in DataSheet */116};117 118static const u8 W83791D_REG_TEMP_TARGET[3] = {119	0x85,			/* PWM 1 target temperature for temp 1 */120	0x86,			/* PWM 2 target temperature for temp 2 */121	0x96,			/* PWM 3 target temperature for temp 3 */122};123 124static const u8 W83791D_REG_TEMP_TOL[2] = {125	0x87,			/* PWM 1/2 temperature tolerance */126	0x97,			/* PWM 3 temperature tolerance */127};128 129static const u8 W83791D_REG_FAN_CFG[2] = {130	0x84,			/* FAN 1/2 configuration */131	0x95,			/* FAN 3 configuration */132};133 134static const u8 W83791D_REG_FAN_DIV[3] = {135	0x47,			/* contains FAN1 and FAN2 Divisor */136	0x4b,			/* contains FAN3 Divisor */137	0x5C,			/* contains FAN4 and FAN5 Divisor */138};139 140#define W83791D_REG_BANK		0x4E141#define W83791D_REG_TEMP2_CONFIG	0xC2142#define W83791D_REG_TEMP3_CONFIG	0xCA143 144static const u8 W83791D_REG_TEMP1[3] = {145	0x27,			/* TEMP 1 in DataSheet */146	0x39,			/* TEMP 1 Over in DataSheet */147	0x3A,			/* TEMP 1 Hyst in DataSheet */148};149 150static const u8 W83791D_REG_TEMP_ADD[2][6] = {151	{0xC0,			/* TEMP 2 in DataSheet */152	 0xC1,			/* TEMP 2(0.5 deg) in DataSheet */153	 0xC5,			/* TEMP 2 Over High part in DataSheet */154	 0xC6,			/* TEMP 2 Over Low part in DataSheet */155	 0xC3,			/* TEMP 2 Thyst High part in DataSheet */156	 0xC4},			/* TEMP 2 Thyst Low part in DataSheet */157	{0xC8,			/* TEMP 3 in DataSheet */158	 0xC9,			/* TEMP 3(0.5 deg) in DataSheet */159	 0xCD,			/* TEMP 3 Over High part in DataSheet */160	 0xCE,			/* TEMP 3 Over Low part in DataSheet */161	 0xCB,			/* TEMP 3 Thyst High part in DataSheet */162	 0xCC}			/* TEMP 3 Thyst Low part in DataSheet */163};164 165#define W83791D_REG_BEEP_CONFIG		0x4D166 167static const u8 W83791D_REG_BEEP_CTRL[3] = {168	0x56,			/* BEEP Control Register 1 */169	0x57,			/* BEEP Control Register 2 */170	0xA3,			/* BEEP Control Register 3 */171};172 173#define W83791D_REG_GPIO		0x15174#define W83791D_REG_CONFIG		0x40175#define W83791D_REG_VID_FANDIV		0x47176#define W83791D_REG_DID_VID4		0x49177#define W83791D_REG_WCHIPID		0x58178#define W83791D_REG_CHIPMAN		0x4F179#define W83791D_REG_PIN			0x4B180#define W83791D_REG_I2C_SUBADDR		0x4A181 182#define W83791D_REG_ALARM1 0xA9	/* realtime status register1 */183#define W83791D_REG_ALARM2 0xAA	/* realtime status register2 */184#define W83791D_REG_ALARM3 0xAB	/* realtime status register3 */185 186#define W83791D_REG_VBAT		0x5D187#define W83791D_REG_I2C_ADDR		0x48188 189/*190 * The SMBus locks itself. The Winbond W83791D has a bank select register191 * (index 0x4e), but the driver only accesses registers in bank 0. Since192 * we don't switch banks, we don't need any special code to handle193 * locking access between bank switches194 */195static inline int w83791d_read(struct i2c_client *client, u8 reg)196{197	return i2c_smbus_read_byte_data(client, reg);198}199 200static inline int w83791d_write(struct i2c_client *client, u8 reg, u8 value)201{202	return i2c_smbus_write_byte_data(client, reg, value);203}204 205/*206 * The analog voltage inputs have 16mV LSB. Since the sysfs output is207 * in mV as would be measured on the chip input pin, need to just208 * multiply/divide by 16 to translate from/to register values.209 */210#define IN_TO_REG(val)		(clamp_val((((val) + 8) / 16), 0, 255))211#define IN_FROM_REG(val)	((val) * 16)212 213static u8 fan_to_reg(long rpm, int div)214{215	if (rpm == 0)216		return 255;217	rpm = clamp_val(rpm, 1, 1000000);218	return clamp_val((1350000 + rpm * div / 2) / (rpm * div), 1, 254);219}220 221#define FAN_FROM_REG(val, div)	((val) == 0 ? -1 : \222				((val) == 255 ? 0 : \223					1350000 / ((val) * (div))))224 225/* for temp1 which is 8-bit resolution, LSB = 1 degree Celsius */226#define TEMP1_FROM_REG(val)	((val) * 1000)227#define TEMP1_TO_REG(val)	((val) <= -128000 ? -128 : \228				 (val) >= 127000 ? 127 : \229				 (val) < 0 ? ((val) - 500) / 1000 : \230				 ((val) + 500) / 1000)231 232/*233 * for temp2 and temp3 which are 9-bit resolution, LSB = 0.5 degree Celsius234 * Assumes the top 8 bits are the integral amount and the bottom 8 bits235 * are the fractional amount. Since we only have 0.5 degree resolution,236 * the bottom 7 bits will always be zero237 */238#define TEMP23_FROM_REG(val)	((val) / 128 * 500)239#define TEMP23_TO_REG(val)	(DIV_ROUND_CLOSEST(clamp_val((val), -128000, \240						   127500), 500) * 128)241 242/* for thermal cruise target temp, 7-bits, LSB = 1 degree Celsius */243#define TARGET_TEMP_TO_REG(val)	DIV_ROUND_CLOSEST(clamp_val((val), 0, 127000), \244						  1000)245 246/* for thermal cruise temp tolerance, 4-bits, LSB = 1 degree Celsius */247#define TOL_TEMP_TO_REG(val)	DIV_ROUND_CLOSEST(clamp_val((val), 0, 15000), \248						  1000)249 250#define BEEP_MASK_TO_REG(val)		((val) & 0xffffff)251#define BEEP_MASK_FROM_REG(val)		((val) & 0xffffff)252 253#define DIV_FROM_REG(val)		(1 << (val))254 255static u8 div_to_reg(int nr, long val)256{257	int i;258 259	/* fan divisors max out at 128 */260	val = clamp_val(val, 1, 128) >> 1;261	for (i = 0; i < 7; i++) {262		if (val == 0)263			break;264		val >>= 1;265	}266	return (u8) i;267}268 269struct w83791d_data {270	struct device *hwmon_dev;271	struct mutex update_lock;272 273	bool valid;			/* true if following fields are valid */274	unsigned long last_updated;	/* In jiffies */275 276	/* volts */277	u8 in[NUMBER_OF_VIN];		/* Register value */278	u8 in_max[NUMBER_OF_VIN];	/* Register value */279	u8 in_min[NUMBER_OF_VIN];	/* Register value */280 281	/* fans */282	u8 fan[NUMBER_OF_FANIN];	/* Register value */283	u8 fan_min[NUMBER_OF_FANIN];	/* Register value */284	u8 fan_div[NUMBER_OF_FANIN];	/* Register encoding, shifted right */285 286	/* Temperature sensors */287 288	s8 temp1[3];		/* current, over, thyst */289	s16 temp_add[2][3];	/* fixed point value. Top 8 bits are the290				 * integral part, bottom 8 bits are the291				 * fractional part. We only use the top292				 * 9 bits as the resolution is only293				 * to the 0.5 degree C...294				 * two sensors with three values295				 * (cur, over, hyst)296				 */297 298	/* PWMs */299	u8 pwm[5];		/* pwm duty cycle */300	u8 pwm_enable[3];	/* pwm enable status for fan 1-3301				 * (fan 4-5 only support manual mode)302				 */303 304	u8 temp_target[3];	/* pwm 1-3 target temperature */305	u8 temp_tolerance[3];	/* pwm 1-3 temperature tolerance */306 307	/* Misc */308	u32 alarms;		/* realtime status register encoding,combined */309	u8 beep_enable;		/* Global beep enable */310	u32 beep_mask;		/* Mask off specific beeps */311	u8 vid;			/* Register encoding, combined */312	u8 vrm;			/* hwmon-vid */313};314 315static int w83791d_probe(struct i2c_client *client);316static int w83791d_detect(struct i2c_client *client,317			  struct i2c_board_info *info);318static void w83791d_remove(struct i2c_client *client);319 320static int w83791d_read(struct i2c_client *client, u8 reg);321static int w83791d_write(struct i2c_client *client, u8 reg, u8 value);322static struct w83791d_data *w83791d_update_device(struct device *dev);323 324#ifdef DEBUG325static void w83791d_print_debug(struct w83791d_data *data, struct device *dev);326#endif327 328static void w83791d_init_client(struct i2c_client *client);329 330static const struct i2c_device_id w83791d_id[] = {331	{ "w83791d" },332	{ }333};334MODULE_DEVICE_TABLE(i2c, w83791d_id);335 336static struct i2c_driver w83791d_driver = {337	.class		= I2C_CLASS_HWMON,338	.driver = {339		.name = "w83791d",340	},341	.probe		= w83791d_probe,342	.remove		= w83791d_remove,343	.id_table	= w83791d_id,344	.detect		= w83791d_detect,345	.address_list	= normal_i2c,346};347 348/* following are the sysfs callback functions */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	struct w83791d_data *data = w83791d_update_device(dev); \356	int nr = sensor_attr->index; \357	return sprintf(buf, "%d\n", IN_FROM_REG(data->reg[nr])); \358}359 360show_in_reg(in);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	struct i2c_client *client = to_i2c_client(dev); \372	struct w83791d_data *data = i2c_get_clientdata(client); \373	int nr = sensor_attr->index; \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] = IN_TO_REG(val); \380	w83791d_write(client, W83791D_REG_IN_##REG[nr], data->in_##reg[nr]); \381	mutex_unlock(&data->update_lock); \382	 \383	return count; \384}385store_in_reg(MIN, min);386store_in_reg(MAX, max);387 388static struct sensor_device_attribute sda_in_input[] = {389	SENSOR_ATTR(in0_input, S_IRUGO, show_in, NULL, 0),390	SENSOR_ATTR(in1_input, S_IRUGO, show_in, NULL, 1),391	SENSOR_ATTR(in2_input, S_IRUGO, show_in, NULL, 2),392	SENSOR_ATTR(in3_input, S_IRUGO, show_in, NULL, 3),393	SENSOR_ATTR(in4_input, S_IRUGO, show_in, NULL, 4),394	SENSOR_ATTR(in5_input, S_IRUGO, show_in, NULL, 5),395	SENSOR_ATTR(in6_input, S_IRUGO, show_in, NULL, 6),396	SENSOR_ATTR(in7_input, S_IRUGO, show_in, NULL, 7),397	SENSOR_ATTR(in8_input, S_IRUGO, show_in, NULL, 8),398	SENSOR_ATTR(in9_input, S_IRUGO, show_in, NULL, 9),399};400 401static struct sensor_device_attribute sda_in_min[] = {402	SENSOR_ATTR(in0_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 0),403	SENSOR_ATTR(in1_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 1),404	SENSOR_ATTR(in2_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 2),405	SENSOR_ATTR(in3_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 3),406	SENSOR_ATTR(in4_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 4),407	SENSOR_ATTR(in5_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 5),408	SENSOR_ATTR(in6_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 6),409	SENSOR_ATTR(in7_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 7),410	SENSOR_ATTR(in8_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 8),411	SENSOR_ATTR(in9_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 9),412};413 414static struct sensor_device_attribute sda_in_max[] = {415	SENSOR_ATTR(in0_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 0),416	SENSOR_ATTR(in1_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 1),417	SENSOR_ATTR(in2_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 2),418	SENSOR_ATTR(in3_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 3),419	SENSOR_ATTR(in4_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 4),420	SENSOR_ATTR(in5_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 5),421	SENSOR_ATTR(in6_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 6),422	SENSOR_ATTR(in7_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 7),423	SENSOR_ATTR(in8_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 8),424	SENSOR_ATTR(in9_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 9),425};426 427 428static ssize_t show_beep(struct device *dev, struct device_attribute *attr,429			char *buf)430{431	struct sensor_device_attribute *sensor_attr =432						to_sensor_dev_attr(attr);433	struct w83791d_data *data = w83791d_update_device(dev);434	int bitnr = sensor_attr->index;435 436	return sprintf(buf, "%d\n", (data->beep_mask >> bitnr) & 1);437}438 439static ssize_t store_beep(struct device *dev, struct device_attribute *attr,440			const char *buf, size_t count)441{442	struct sensor_device_attribute *sensor_attr =443						to_sensor_dev_attr(attr);444	struct i2c_client *client = to_i2c_client(dev);445	struct w83791d_data *data = i2c_get_clientdata(client);446	int bitnr = sensor_attr->index;447	int bytenr = bitnr / 8;448	unsigned long val;449	int err;450 451	err = kstrtoul(buf, 10, &val);452	if (err)453		return err;454 455	val = val ? 1 : 0;456 457	mutex_lock(&data->update_lock);458 459	data->beep_mask &= ~(0xff << (bytenr * 8));460	data->beep_mask |= w83791d_read(client, W83791D_REG_BEEP_CTRL[bytenr])461		<< (bytenr * 8);462 463	data->beep_mask &= ~(1 << bitnr);464	data->beep_mask |= val << bitnr;465 466	w83791d_write(client, W83791D_REG_BEEP_CTRL[bytenr],467		(data->beep_mask >> (bytenr * 8)) & 0xff);468 469	mutex_unlock(&data->update_lock);470 471	return count;472}473 474static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,475			char *buf)476{477	struct sensor_device_attribute *sensor_attr =478						to_sensor_dev_attr(attr);479	struct w83791d_data *data = w83791d_update_device(dev);480	int bitnr = sensor_attr->index;481 482	return sprintf(buf, "%d\n", (data->alarms >> bitnr) & 1);483}484 485/*486 * Note: The bitmask for the beep enable/disable is different than487 * the bitmask for the alarm.488 */489static struct sensor_device_attribute sda_in_beep[] = {490	SENSOR_ATTR(in0_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 0),491	SENSOR_ATTR(in1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 13),492	SENSOR_ATTR(in2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 2),493	SENSOR_ATTR(in3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 3),494	SENSOR_ATTR(in4_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 8),495	SENSOR_ATTR(in5_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 9),496	SENSOR_ATTR(in6_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 10),497	SENSOR_ATTR(in7_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 16),498	SENSOR_ATTR(in8_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 17),499	SENSOR_ATTR(in9_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 14),500};501 502static struct sensor_device_attribute sda_in_alarm[] = {503	SENSOR_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0),504	SENSOR_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1),505	SENSOR_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2),506	SENSOR_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3),507	SENSOR_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8),508	SENSOR_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9),509	SENSOR_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 10),510	SENSOR_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 19),511	SENSOR_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 20),512	SENSOR_ATTR(in9_alarm, S_IRUGO, show_alarm, NULL, 14),513};514 515#define show_fan_reg(reg) \516static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \517				char *buf) \518{ \519	struct sensor_device_attribute *sensor_attr = \520						to_sensor_dev_attr(attr); \521	struct w83791d_data *data = w83791d_update_device(dev); \522	int nr = sensor_attr->index; \523	return sprintf(buf, "%d\n", \524		FAN_FROM_REG(data->reg[nr], DIV_FROM_REG(data->fan_div[nr]))); \525}526 527show_fan_reg(fan);528show_fan_reg(fan_min);529 530static ssize_t store_fan_min(struct device *dev, struct device_attribute *attr,531				const char *buf, size_t count)532{533	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);534	struct i2c_client *client = to_i2c_client(dev);535	struct w83791d_data *data = i2c_get_clientdata(client);536	int nr = sensor_attr->index;537	unsigned long val;538	int err;539 540	err = kstrtoul(buf, 10, &val);541	if (err)542		return err;543 544	mutex_lock(&data->update_lock);545	data->fan_min[nr] = fan_to_reg(val, DIV_FROM_REG(data->fan_div[nr]));546	w83791d_write(client, W83791D_REG_FAN_MIN[nr], data->fan_min[nr]);547	mutex_unlock(&data->update_lock);548 549	return count;550}551 552static ssize_t show_fan_div(struct device *dev, struct device_attribute *attr,553				char *buf)554{555	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);556	int nr = sensor_attr->index;557	struct w83791d_data *data = w83791d_update_device(dev);558	return sprintf(buf, "%u\n", DIV_FROM_REG(data->fan_div[nr]));559}560 561/*562 * Note: we save and restore the fan minimum here, because its value is563 * determined in part by the fan divisor.  This follows the principle of564 * least surprise; the user doesn't expect the fan minimum to change just565 * because the divisor changed.566 */567static ssize_t store_fan_div(struct device *dev, struct device_attribute *attr,568				const char *buf, size_t count)569{570	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);571	struct i2c_client *client = to_i2c_client(dev);572	struct w83791d_data *data = i2c_get_clientdata(client);573	int nr = sensor_attr->index;574	unsigned long min;575	u8 tmp_fan_div;576	u8 fan_div_reg;577	u8 vbat_reg;578	int indx = 0;579	u8 keep_mask = 0;580	u8 new_shift = 0;581	unsigned long val;582	int err;583 584	err = kstrtoul(buf, 10, &val);585	if (err)586		return err;587 588	/* Save fan_min */589	min = FAN_FROM_REG(data->fan_min[nr], DIV_FROM_REG(data->fan_div[nr]));590 591	mutex_lock(&data->update_lock);592	data->fan_div[nr] = div_to_reg(nr, val);593 594	switch (nr) {595	case 0:596		indx = 0;597		keep_mask = 0xcf;598		new_shift = 4;599		break;600	case 1:601		indx = 0;602		keep_mask = 0x3f;603		new_shift = 6;604		break;605	case 2:606		indx = 1;607		keep_mask = 0x3f;608		new_shift = 6;609		break;610	case 3:611		indx = 2;612		keep_mask = 0xf8;613		new_shift = 0;614		break;615	case 4:616		indx = 2;617		keep_mask = 0x8f;618		new_shift = 4;619		break;620#ifdef DEBUG621	default:622		dev_warn(dev, "store_fan_div: Unexpected nr seen: %d\n", nr);623		count = -EINVAL;624		goto err_exit;625#endif626	}627 628	fan_div_reg = w83791d_read(client, W83791D_REG_FAN_DIV[indx])629			& keep_mask;630	tmp_fan_div = (data->fan_div[nr] << new_shift) & ~keep_mask;631 632	w83791d_write(client, W83791D_REG_FAN_DIV[indx],633				fan_div_reg | tmp_fan_div);634 635	/* Bit 2 of fans 0-2 is stored in the vbat register (bits 5-7) */636	if (nr < 3) {637		keep_mask = ~(1 << (nr + 5));638		vbat_reg = w83791d_read(client, W83791D_REG_VBAT)639				& keep_mask;640		tmp_fan_div = (data->fan_div[nr] << (3 + nr)) & ~keep_mask;641		w83791d_write(client, W83791D_REG_VBAT,642				vbat_reg | tmp_fan_div);643	}644 645	/* Restore fan_min */646	data->fan_min[nr] = fan_to_reg(min, DIV_FROM_REG(data->fan_div[nr]));647	w83791d_write(client, W83791D_REG_FAN_MIN[nr], data->fan_min[nr]);648 649#ifdef DEBUG650err_exit:651#endif652	mutex_unlock(&data->update_lock);653 654	return count;655}656 657static struct sensor_device_attribute sda_fan_input[] = {658	SENSOR_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0),659	SENSOR_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1),660	SENSOR_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2),661	SENSOR_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 3),662	SENSOR_ATTR(fan5_input, S_IRUGO, show_fan, NULL, 4),663};664 665static struct sensor_device_attribute sda_fan_min[] = {666	SENSOR_ATTR(fan1_min, S_IWUSR | S_IRUGO,667			show_fan_min, store_fan_min, 0),668	SENSOR_ATTR(fan2_min, S_IWUSR | S_IRUGO,669			show_fan_min, store_fan_min, 1),670	SENSOR_ATTR(fan3_min, S_IWUSR | S_IRUGO,671			show_fan_min, store_fan_min, 2),672	SENSOR_ATTR(fan4_min, S_IWUSR | S_IRUGO,673			show_fan_min, store_fan_min, 3),674	SENSOR_ATTR(fan5_min, S_IWUSR | S_IRUGO,675			show_fan_min, store_fan_min, 4),676};677 678static struct sensor_device_attribute sda_fan_div[] = {679	SENSOR_ATTR(fan1_div, S_IWUSR | S_IRUGO,680			show_fan_div, store_fan_div, 0),681	SENSOR_ATTR(fan2_div, S_IWUSR | S_IRUGO,682			show_fan_div, store_fan_div, 1),683	SENSOR_ATTR(fan3_div, S_IWUSR | S_IRUGO,684			show_fan_div, store_fan_div, 2),685	SENSOR_ATTR(fan4_div, S_IWUSR | S_IRUGO,686			show_fan_div, store_fan_div, 3),687	SENSOR_ATTR(fan5_div, S_IWUSR | S_IRUGO,688			show_fan_div, store_fan_div, 4),689};690 691static struct sensor_device_attribute sda_fan_beep[] = {692	SENSOR_ATTR(fan1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 6),693	SENSOR_ATTR(fan2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 7),694	SENSOR_ATTR(fan3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 11),695	SENSOR_ATTR(fan4_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 21),696	SENSOR_ATTR(fan5_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 22),697};698 699static struct sensor_device_attribute sda_fan_alarm[] = {700	SENSOR_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6),701	SENSOR_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7),702	SENSOR_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 11),703	SENSOR_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 21),704	SENSOR_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 22),705};706 707/* read/write PWMs */708static ssize_t show_pwm(struct device *dev, struct device_attribute *attr,709				char *buf)710{711	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);712	int nr = sensor_attr->index;713	struct w83791d_data *data = w83791d_update_device(dev);714	return sprintf(buf, "%u\n", data->pwm[nr]);715}716 717static ssize_t store_pwm(struct device *dev, struct device_attribute *attr,718		const char *buf, size_t count)719{720	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);721	struct i2c_client *client = to_i2c_client(dev);722	struct w83791d_data *data = i2c_get_clientdata(client);723	int nr = sensor_attr->index;724	unsigned long val;725 726	if (kstrtoul(buf, 10, &val))727		return -EINVAL;728 729	mutex_lock(&data->update_lock);730	data->pwm[nr] = clamp_val(val, 0, 255);731	w83791d_write(client, W83791D_REG_PWM[nr], data->pwm[nr]);732	mutex_unlock(&data->update_lock);733	return count;734}735 736static struct sensor_device_attribute sda_pwm[] = {737	SENSOR_ATTR(pwm1, S_IWUSR | S_IRUGO,738			show_pwm, store_pwm, 0),739	SENSOR_ATTR(pwm2, S_IWUSR | S_IRUGO,740			show_pwm, store_pwm, 1),741	SENSOR_ATTR(pwm3, S_IWUSR | S_IRUGO,742			show_pwm, store_pwm, 2),743	SENSOR_ATTR(pwm4, S_IWUSR | S_IRUGO,744			show_pwm, store_pwm, 3),745	SENSOR_ATTR(pwm5, S_IWUSR | S_IRUGO,746			show_pwm, store_pwm, 4),747};748 749static ssize_t show_pwmenable(struct device *dev, struct device_attribute *attr,750				char *buf)751{752	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);753	int nr = sensor_attr->index;754	struct w83791d_data *data = w83791d_update_device(dev);755	return sprintf(buf, "%u\n", data->pwm_enable[nr] + 1);756}757 758static ssize_t store_pwmenable(struct device *dev,759		struct device_attribute *attr, const char *buf, size_t count)760{761	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);762	struct i2c_client *client = to_i2c_client(dev);763	struct w83791d_data *data = i2c_get_clientdata(client);764	int nr = sensor_attr->index;765	unsigned long val;766	u8 reg_cfg_tmp;767	u8 reg_idx = 0;768	u8 val_shift = 0;769	u8 keep_mask = 0;770 771	int ret = kstrtoul(buf, 10, &val);772 773	if (ret || val < 1 || val > 3)774		return -EINVAL;775 776	mutex_lock(&data->update_lock);777	data->pwm_enable[nr] = val - 1;778	switch (nr) {779	case 0:780		reg_idx = 0;781		val_shift = 2;782		keep_mask = 0xf3;783		break;784	case 1:785		reg_idx = 0;786		val_shift = 4;787		keep_mask = 0xcf;788		break;789	case 2:790		reg_idx = 1;791		val_shift = 2;792		keep_mask = 0xf3;793		break;794	}795 796	reg_cfg_tmp = w83791d_read(client, W83791D_REG_FAN_CFG[reg_idx]);797	reg_cfg_tmp = (reg_cfg_tmp & keep_mask) |798					data->pwm_enable[nr] << val_shift;799 800	w83791d_write(client, W83791D_REG_FAN_CFG[reg_idx], reg_cfg_tmp);801	mutex_unlock(&data->update_lock);802 803	return count;804}805static struct sensor_device_attribute sda_pwmenable[] = {806	SENSOR_ATTR(pwm1_enable, S_IWUSR | S_IRUGO,807			show_pwmenable, store_pwmenable, 0),808	SENSOR_ATTR(pwm2_enable, S_IWUSR | S_IRUGO,809			show_pwmenable, store_pwmenable, 1),810	SENSOR_ATTR(pwm3_enable, S_IWUSR | S_IRUGO,811			show_pwmenable, store_pwmenable, 2),812};813 814/* For Smart Fan I / Thermal Cruise */815static ssize_t show_temp_target(struct device *dev,816			struct device_attribute *attr, char *buf)817{818	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);819	struct w83791d_data *data = w83791d_update_device(dev);820	int nr = sensor_attr->index;821	return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->temp_target[nr]));822}823 824static ssize_t store_temp_target(struct device *dev,825		struct device_attribute *attr, const char *buf, size_t count)826{827	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);828	struct i2c_client *client = to_i2c_client(dev);829	struct w83791d_data *data = i2c_get_clientdata(client);830	int nr = sensor_attr->index;831	long val;832	u8 target_mask;833 834	if (kstrtol(buf, 10, &val))835		return -EINVAL;836 837	mutex_lock(&data->update_lock);838	data->temp_target[nr] = TARGET_TEMP_TO_REG(val);839	target_mask = w83791d_read(client,840				W83791D_REG_TEMP_TARGET[nr]) & 0x80;841	w83791d_write(client, W83791D_REG_TEMP_TARGET[nr],842				data->temp_target[nr] | target_mask);843	mutex_unlock(&data->update_lock);844	return count;845}846 847static struct sensor_device_attribute sda_temp_target[] = {848	SENSOR_ATTR(temp1_target, S_IWUSR | S_IRUGO,849			show_temp_target, store_temp_target, 0),850	SENSOR_ATTR(temp2_target, S_IWUSR | S_IRUGO,851			show_temp_target, store_temp_target, 1),852	SENSOR_ATTR(temp3_target, S_IWUSR | S_IRUGO,853			show_temp_target, store_temp_target, 2),854};855 856static ssize_t show_temp_tolerance(struct device *dev,857			struct device_attribute *attr, char *buf)858{859	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);860	struct w83791d_data *data = w83791d_update_device(dev);861	int nr = sensor_attr->index;862	return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->temp_tolerance[nr]));863}864 865static ssize_t store_temp_tolerance(struct device *dev,866		struct device_attribute *attr, const char *buf, size_t count)867{868	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);869	struct i2c_client *client = to_i2c_client(dev);870	struct w83791d_data *data = i2c_get_clientdata(client);871	int nr = sensor_attr->index;872	unsigned long val;873	u8 target_mask;874	u8 reg_idx = 0;875	u8 val_shift = 0;876	u8 keep_mask = 0;877 878	if (kstrtoul(buf, 10, &val))879		return -EINVAL;880 881	switch (nr) {882	case 0:883		reg_idx = 0;884		val_shift = 0;885		keep_mask = 0xf0;886		break;887	case 1:888		reg_idx = 0;889		val_shift = 4;890		keep_mask = 0x0f;891		break;892	case 2:893		reg_idx = 1;894		val_shift = 0;895		keep_mask = 0xf0;896		break;897	}898 899	mutex_lock(&data->update_lock);900	data->temp_tolerance[nr] = TOL_TEMP_TO_REG(val);901	target_mask = w83791d_read(client,902			W83791D_REG_TEMP_TOL[reg_idx]) & keep_mask;903	w83791d_write(client, W83791D_REG_TEMP_TOL[reg_idx],904			(data->temp_tolerance[nr] << val_shift) | target_mask);905	mutex_unlock(&data->update_lock);906	return count;907}908 909static struct sensor_device_attribute sda_temp_tolerance[] = {910	SENSOR_ATTR(temp1_tolerance, S_IWUSR | S_IRUGO,911			show_temp_tolerance, store_temp_tolerance, 0),912	SENSOR_ATTR(temp2_tolerance, S_IWUSR | S_IRUGO,913			show_temp_tolerance, store_temp_tolerance, 1),914	SENSOR_ATTR(temp3_tolerance, S_IWUSR | S_IRUGO,915			show_temp_tolerance, store_temp_tolerance, 2),916};917 918/* read/write the temperature1, includes measured value and limits */919static ssize_t show_temp1(struct device *dev, struct device_attribute *devattr,920				char *buf)921{922	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);923	struct w83791d_data *data = w83791d_update_device(dev);924	return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->temp1[attr->index]));925}926 927static ssize_t store_temp1(struct device *dev, struct device_attribute *devattr,928				const char *buf, size_t count)929{930	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);931	struct i2c_client *client = to_i2c_client(dev);932	struct w83791d_data *data = i2c_get_clientdata(client);933	int nr = attr->index;934	long val;935	int err;936 937	err = kstrtol(buf, 10, &val);938	if (err)939		return err;940 941	mutex_lock(&data->update_lock);942	data->temp1[nr] = TEMP1_TO_REG(val);943	w83791d_write(client, W83791D_REG_TEMP1[nr], data->temp1[nr]);944	mutex_unlock(&data->update_lock);945	return count;946}947 948/* read/write temperature2-3, includes measured value and limits */949static ssize_t show_temp23(struct device *dev, struct device_attribute *devattr,950				char *buf)951{952	struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);953	struct w83791d_data *data = w83791d_update_device(dev);954	int nr = attr->nr;955	int index = attr->index;956	return sprintf(buf, "%d\n", TEMP23_FROM_REG(data->temp_add[nr][index]));957}958 959static ssize_t store_temp23(struct device *dev,960				struct device_attribute *devattr,961				const char *buf, size_t count)962{963	struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);964	struct i2c_client *client = to_i2c_client(dev);965	struct w83791d_data *data = i2c_get_clientdata(client);966	long val;967	int err;968	int nr = attr->nr;969	int index = attr->index;970 971	err = kstrtol(buf, 10, &val);972	if (err)973		return err;974 975	mutex_lock(&data->update_lock);976	data->temp_add[nr][index] = TEMP23_TO_REG(val);977	w83791d_write(client, W83791D_REG_TEMP_ADD[nr][index * 2],978				data->temp_add[nr][index] >> 8);979	w83791d_write(client, W83791D_REG_TEMP_ADD[nr][index * 2 + 1],980				data->temp_add[nr][index] & 0x80);981	mutex_unlock(&data->update_lock);982 983	return count;984}985 986static struct sensor_device_attribute_2 sda_temp_input[] = {987	SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp1, NULL, 0, 0),988	SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp23, NULL, 0, 0),989	SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp23, NULL, 1, 0),990};991 992static struct sensor_device_attribute_2 sda_temp_max[] = {993	SENSOR_ATTR_2(temp1_max, S_IRUGO | S_IWUSR,994			show_temp1, store_temp1, 0, 1),995	SENSOR_ATTR_2(temp2_max, S_IRUGO | S_IWUSR,996			show_temp23, store_temp23, 0, 1),997	SENSOR_ATTR_2(temp3_max, S_IRUGO | S_IWUSR,998			show_temp23, store_temp23, 1, 1),999};1000 1001static struct sensor_device_attribute_2 sda_temp_max_hyst[] = {1002	SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO | S_IWUSR,1003			show_temp1, store_temp1, 0, 2),1004	SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO | S_IWUSR,1005			show_temp23, store_temp23, 0, 2),1006	SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO | S_IWUSR,1007			show_temp23, store_temp23, 1, 2),1008};1009 1010/*1011 * Note: The bitmask for the beep enable/disable is different than1012 * the bitmask for the alarm.1013 */1014static struct sensor_device_attribute sda_temp_beep[] = {1015	SENSOR_ATTR(temp1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 4),1016	SENSOR_ATTR(temp2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 5),1017	SENSOR_ATTR(temp3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 1),1018};1019 1020static struct sensor_device_attribute sda_temp_alarm[] = {1021	SENSOR_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4),1022	SENSOR_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5),1023	SENSOR_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13),1024};1025 1026/* get realtime status of all sensors items: voltage, temp, fan */1027static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,1028			   char *buf)1029{1030	struct w83791d_data *data = w83791d_update_device(dev);1031	return sprintf(buf, "%u\n", data->alarms);1032}1033 1034static DEVICE_ATTR_RO(alarms);1035 1036/* Beep control */1037 1038#define GLOBAL_BEEP_ENABLE_SHIFT	151039#define GLOBAL_BEEP_ENABLE_MASK		(1 << GLOBAL_BEEP_ENABLE_SHIFT)1040 1041static ssize_t show_beep_enable(struct device *dev,1042				struct device_attribute *attr, char *buf)1043{1044	struct w83791d_data *data = w83791d_update_device(dev);1045	return sprintf(buf, "%d\n", data->beep_enable);1046}1047 1048static ssize_t show_beep_mask(struct device *dev,1049				struct device_attribute *attr, char *buf)1050{1051	struct w83791d_data *data = w83791d_update_device(dev);1052	return sprintf(buf, "%d\n", BEEP_MASK_FROM_REG(data->beep_mask));1053}1054 1055 1056static ssize_t store_beep_mask(struct device *dev,1057				struct device_attribute *attr,1058				const char *buf, size_t count)1059{1060	struct i2c_client *client = to_i2c_client(dev);1061	struct w83791d_data *data = i2c_get_clientdata(client);1062	int i;1063	long val;1064	int err;1065 1066	err = kstrtol(buf, 10, &val);1067	if (err)1068		return err;1069 1070	mutex_lock(&data->update_lock);1071 1072	/*1073	 * The beep_enable state overrides any enabling request from1074	 * the masks1075	 */1076	data->beep_mask = BEEP_MASK_TO_REG(val) & ~GLOBAL_BEEP_ENABLE_MASK;1077	data->beep_mask |= (data->beep_enable << GLOBAL_BEEP_ENABLE_SHIFT);1078 1079	val = data->beep_mask;1080 1081	for (i = 0; i < 3; i++) {1082		w83791d_write(client, W83791D_REG_BEEP_CTRL[i], (val & 0xff));1083		val >>= 8;1084	}1085 1086	mutex_unlock(&data->update_lock);1087 1088	return count;1089}1090 1091static ssize_t store_beep_enable(struct device *dev,1092				struct device_attribute *attr,1093				const char *buf, size_t count)1094{1095	struct i2c_client *client = to_i2c_client(dev);1096	struct w83791d_data *data = i2c_get_clientdata(client);1097	long val;1098	int err;1099 1100	err = kstrtol(buf, 10, &val);1101	if (err)1102		return err;1103 1104	mutex_lock(&data->update_lock);1105 1106	data->beep_enable = val ? 1 : 0;1107 1108	/* Keep the full mask value in sync with the current enable */1109	data->beep_mask &= ~GLOBAL_BEEP_ENABLE_MASK;1110	data->beep_mask |= (data->beep_enable << GLOBAL_BEEP_ENABLE_SHIFT);1111 1112	/*1113	 * The global control is in the second beep control register1114	 * so only need to update that register1115	 */1116	val = (data->beep_mask >> 8) & 0xff;1117 1118	w83791d_write(client, W83791D_REG_BEEP_CTRL[1], val);1119 1120	mutex_unlock(&data->update_lock);1121 1122	return count;1123}1124 1125static struct sensor_device_attribute sda_beep_ctrl[] = {1126	SENSOR_ATTR(beep_enable, S_IRUGO | S_IWUSR,1127			show_beep_enable, store_beep_enable, 0),1128	SENSOR_ATTR(beep_mask, S_IRUGO | S_IWUSR,1129			show_beep_mask, store_beep_mask, 1)1130};1131 1132/* cpu voltage regulation information */1133static ssize_t cpu0_vid_show(struct device *dev,1134			     struct device_attribute *attr, char *buf)1135{1136	struct w83791d_data *data = w83791d_update_device(dev);1137	return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));1138}1139 1140static DEVICE_ATTR_RO(cpu0_vid);1141 1142static ssize_t vrm_show(struct device *dev, struct device_attribute *attr,1143			char *buf)1144{1145	struct w83791d_data *data = dev_get_drvdata(dev);1146	return sprintf(buf, "%d\n", data->vrm);1147}1148 1149static ssize_t vrm_store(struct device *dev, struct device_attribute *attr,1150			 const char *buf, size_t count)1151{1152	struct w83791d_data *data = dev_get_drvdata(dev);1153	unsigned long val;1154	int err;1155 1156	/*1157	 * No lock needed as vrm is internal to the driver1158	 * (not read from a chip register) and so is not1159	 * updated in w83791d_update_device()1160	 */1161 1162	err = kstrtoul(buf, 10, &val);1163	if (err)1164		return err;1165 1166	if (val > 255)1167		return -EINVAL;1168 1169	data->vrm = val;1170	return count;1171}1172 1173static DEVICE_ATTR_RW(vrm);1174 1175#define IN_UNIT_ATTRS(X) \1176	&sda_in_input[X].dev_attr.attr,	\1177	&sda_in_min[X].dev_attr.attr,	\1178	&sda_in_max[X].dev_attr.attr,	\1179	&sda_in_beep[X].dev_attr.attr,	\1180	&sda_in_alarm[X].dev_attr.attr1181 1182#define FAN_UNIT_ATTRS(X) \1183	&sda_fan_input[X].dev_attr.attr,	\1184	&sda_fan_min[X].dev_attr.attr,		\1185	&sda_fan_div[X].dev_attr.attr,		\1186	&sda_fan_beep[X].dev_attr.attr,		\1187	&sda_fan_alarm[X].dev_attr.attr1188 1189#define TEMP_UNIT_ATTRS(X) \1190	&sda_temp_input[X].dev_attr.attr,	\1191	&sda_temp_max[X].dev_attr.attr,		\1192	&sda_temp_max_hyst[X].dev_attr.attr,	\1193	&sda_temp_beep[X].dev_attr.attr,	\1194	&sda_temp_alarm[X].dev_attr.attr1195 1196static struct attribute *w83791d_attributes[] = {1197	IN_UNIT_ATTRS(0),1198	IN_UNIT_ATTRS(1),1199	IN_UNIT_ATTRS(2),1200	IN_UNIT_ATTRS(3),1201	IN_UNIT_ATTRS(4),1202	IN_UNIT_ATTRS(5),1203	IN_UNIT_ATTRS(6),1204	IN_UNIT_ATTRS(7),1205	IN_UNIT_ATTRS(8),1206	IN_UNIT_ATTRS(9),1207	FAN_UNIT_ATTRS(0),1208	FAN_UNIT_ATTRS(1),1209	FAN_UNIT_ATTRS(2),1210	TEMP_UNIT_ATTRS(0),1211	TEMP_UNIT_ATTRS(1),1212	TEMP_UNIT_ATTRS(2),1213	&dev_attr_alarms.attr,1214	&sda_beep_ctrl[0].dev_attr.attr,1215	&sda_beep_ctrl[1].dev_attr.attr,1216	&dev_attr_cpu0_vid.attr,1217	&dev_attr_vrm.attr,1218	&sda_pwm[0].dev_attr.attr,1219	&sda_pwm[1].dev_attr.attr,1220	&sda_pwm[2].dev_attr.attr,1221	&sda_pwmenable[0].dev_attr.attr,1222	&sda_pwmenable[1].dev_attr.attr,1223	&sda_pwmenable[2].dev_attr.attr,1224	&sda_temp_target[0].dev_attr.attr,1225	&sda_temp_target[1].dev_attr.attr,1226	&sda_temp_target[2].dev_attr.attr,1227	&sda_temp_tolerance[0].dev_attr.attr,1228	&sda_temp_tolerance[1].dev_attr.attr,1229	&sda_temp_tolerance[2].dev_attr.attr,1230	NULL1231};1232 1233static const struct attribute_group w83791d_group = {1234	.attrs = w83791d_attributes,1235};1236 1237/*1238 * Separate group of attributes for fan/pwm 4-5. Their pins can also be1239 * in use for GPIO in which case their sysfs-interface should not be made1240 * available1241 */1242static struct attribute *w83791d_attributes_fanpwm45[] = {1243	FAN_UNIT_ATTRS(3),1244	FAN_UNIT_ATTRS(4),1245	&sda_pwm[3].dev_attr.attr,1246	&sda_pwm[4].dev_attr.attr,1247	NULL1248};1249 1250static const struct attribute_group w83791d_group_fanpwm45 = {1251	.attrs = w83791d_attributes_fanpwm45,1252};1253 1254static int w83791d_detect_subclients(struct i2c_client *client)1255{1256	struct i2c_adapter *adapter = client->adapter;1257	int address = client->addr;1258	int i, id;1259	u8 val;1260 1261	id = i2c_adapter_id(adapter);1262	if (force_subclients[0] == id && force_subclients[1] == address) {1263		for (i = 2; i <= 3; i++) {1264			if (force_subclients[i] < 0x48 ||1265			    force_subclients[i] > 0x4f) {1266				dev_err(&client->dev,1267					"invalid subclient "1268					"address %d; must be 0x48-0x4f\n",1269					force_subclients[i]);1270				return -ENODEV;1271			}1272		}1273		w83791d_write(client, W83791D_REG_I2C_SUBADDR,1274					(force_subclients[2] & 0x07) |1275					((force_subclients[3] & 0x07) << 4));1276	}1277 1278	val = w83791d_read(client, W83791D_REG_I2C_SUBADDR);1279 1280	if (!(val & 0x88) && (val & 0x7) == ((val >> 4) & 0x7)) {1281		dev_err(&client->dev,1282			"duplicate addresses 0x%x, use force_subclient\n", 0x48 + (val & 0x7));1283		return -ENODEV;1284	}1285 1286	if (!(val & 0x08))1287		devm_i2c_new_dummy_device(&client->dev, adapter, 0x48 + (val & 0x7));1288 1289	if (!(val & 0x80))1290		devm_i2c_new_dummy_device(&client->dev, adapter, 0x48 + ((val >> 4) & 0x7));1291 1292	return 0;1293}1294 1295 1296/* Return 0 if detection is successful, -ENODEV otherwise */1297static int w83791d_detect(struct i2c_client *client,1298			  struct i2c_board_info *info)1299{1300	struct i2c_adapter *adapter = client->adapter;1301	int val1, val2;1302	unsigned short address = client->addr;1303 1304	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))1305		return -ENODEV;1306 1307	if (w83791d_read(client, W83791D_REG_CONFIG) & 0x80)1308		return -ENODEV;1309 1310	val1 = w83791d_read(client, W83791D_REG_BANK);1311	val2 = w83791d_read(client, W83791D_REG_CHIPMAN);1312	/* Check for Winbond ID if in bank 0 */1313	if (!(val1 & 0x07)) {1314		if ((!(val1 & 0x80) && val2 != 0xa3) ||1315		    ((val1 & 0x80) && val2 != 0x5c)) {1316			return -ENODEV;1317		}1318	}1319	/*1320	 * If Winbond chip, address of chip and W83791D_REG_I2C_ADDR1321	 * should match1322	 */1323	if (w83791d_read(client, W83791D_REG_I2C_ADDR) != address)1324		return -ENODEV;1325 1326	/* We want bank 0 and Vendor ID high byte */1327	val1 = w83791d_read(client, W83791D_REG_BANK) & 0x78;1328	w83791d_write(client, W83791D_REG_BANK, val1 | 0x80);1329 1330	/* Verify it is a Winbond w83791d */1331	val1 = w83791d_read(client, W83791D_REG_WCHIPID);1332	val2 = w83791d_read(client, W83791D_REG_CHIPMAN);1333	if (val1 != 0x71 || val2 != 0x5c)1334		return -ENODEV;1335 1336	strscpy(info->type, "w83791d", I2C_NAME_SIZE);1337 1338	return 0;1339}1340 1341static int w83791d_probe(struct i2c_client *client)1342{1343	struct w83791d_data *data;1344	struct device *dev = &client->dev;1345	int i, err;1346	u8 has_fanpwm45;1347 1348#ifdef DEBUG1349	int val1;1350	val1 = w83791d_read(client, W83791D_REG_DID_VID4);1351	dev_dbg(dev, "Device ID version: %d.%d (0x%02x)\n",1352			(val1 >> 5) & 0x07, (val1 >> 1) & 0x0f, val1);1353#endif1354 1355	data = devm_kzalloc(&client->dev, sizeof(struct w83791d_data),1356			    GFP_KERNEL);1357	if (!data)1358		return -ENOMEM;1359 1360	i2c_set_clientdata(client, data);1361	mutex_init(&data->update_lock);1362 1363	err = w83791d_detect_subclients(client);1364	if (err)1365		return err;1366 1367	/* Initialize the chip */1368	w83791d_init_client(client);1369 1370	/*1371	 * If the fan_div is changed, make sure there is a rational1372	 * fan_min in place1373	 */1374	for (i = 0; i < NUMBER_OF_FANIN; i++)1375		data->fan_min[i] = w83791d_read(client, W83791D_REG_FAN_MIN[i]);1376 1377	/* Register sysfs hooks */1378	err = sysfs_create_group(&client->dev.kobj, &w83791d_group);1379	if (err)1380		return err;1381 1382	/* Check if pins of fan/pwm 4-5 are in use as GPIO */1383	has_fanpwm45 = w83791d_read(client, W83791D_REG_GPIO) & 0x10;1384	if (has_fanpwm45) {1385		err = sysfs_create_group(&client->dev.kobj,1386					 &w83791d_group_fanpwm45);1387		if (err)1388			goto error4;1389	}1390 1391	/* Everything is ready, now register the working device */1392	data->hwmon_dev = hwmon_device_register(dev);1393	if (IS_ERR(data->hwmon_dev)) {1394		err = PTR_ERR(data->hwmon_dev);1395		goto error5;1396	}1397 1398	return 0;1399 1400error5:1401	if (has_fanpwm45)1402		sysfs_remove_group(&client->dev.kobj, &w83791d_group_fanpwm45);1403error4:1404	sysfs_remove_group(&client->dev.kobj, &w83791d_group);1405	return err;1406}1407 1408static void w83791d_remove(struct i2c_client *client)1409{1410	struct w83791d_data *data = i2c_get_clientdata(client);1411 1412	hwmon_device_unregister(data->hwmon_dev);1413	sysfs_remove_group(&client->dev.kobj, &w83791d_group);1414}1415 1416static void w83791d_init_client(struct i2c_client *client)1417{1418	struct w83791d_data *data = i2c_get_clientdata(client);1419	u8 tmp;1420	u8 old_beep;1421 1422	/*1423	 * The difference between reset and init is that reset1424	 * does a hard reset of the chip via index 0x40, bit 7,1425	 * but init simply forces certain registers to have "sane"1426	 * values. The hope is that the BIOS has done the right1427	 * thing (which is why the default is reset=0, init=0),1428	 * but if not, reset is the hard hammer and init1429	 * is the soft mallet both of which are trying to whack1430	 * things into place...1431	 * NOTE: The data sheet makes a distinction between1432	 * "power on defaults" and "reset by MR". As far as I can tell,1433	 * the hard reset puts everything into a power-on state so I'm1434	 * not sure what "reset by MR" means or how it can happen.1435	 */1436	if (reset || init) {1437		/* keep some BIOS settings when we... */1438		old_beep = w83791d_read(client, W83791D_REG_BEEP_CONFIG);1439 1440		if (reset) {1441			/* ... reset the chip and ... */1442			w83791d_write(client, W83791D_REG_CONFIG, 0x80);1443		}1444 1445		/* ... disable power-on abnormal beep */1446		w83791d_write(client, W83791D_REG_BEEP_CONFIG, old_beep | 0x80);1447 1448		/* disable the global beep (not done by hard reset) */1449		tmp = w83791d_read(client, W83791D_REG_BEEP_CTRL[1]);1450		w83791d_write(client, W83791D_REG_BEEP_CTRL[1], tmp & 0xef);1451 1452		if (init) {1453			/* Make sure monitoring is turned on for add-ons */1454			tmp = w83791d_read(client, W83791D_REG_TEMP2_CONFIG);1455			if (tmp & 1) {1456				w83791d_write(client, W83791D_REG_TEMP2_CONFIG,1457					tmp & 0xfe);1458			}1459 1460			tmp = w83791d_read(client, W83791D_REG_TEMP3_CONFIG);1461			if (tmp & 1) {1462				w83791d_write(client, W83791D_REG_TEMP3_CONFIG,1463					tmp & 0xfe);1464			}1465 1466			/* Start monitoring */1467			tmp = w83791d_read(client, W83791D_REG_CONFIG) & 0xf7;1468			w83791d_write(client, W83791D_REG_CONFIG, tmp | 0x01);1469		}1470	}1471 1472	data->vrm = vid_which_vrm();1473}1474 1475static struct w83791d_data *w83791d_update_device(struct device *dev)1476{1477	struct i2c_client *client = to_i2c_client(dev);1478	struct w83791d_data *data = i2c_get_clientdata(client);1479	int i, j;1480	u8 reg_array_tmp[3];1481	u8 vbat_reg;1482 1483	mutex_lock(&data->update_lock);1484 1485	if (time_after(jiffies, data->last_updated + (HZ * 3))1486			|| !data->valid) {1487		dev_dbg(dev, "Starting w83791d device update\n");1488 1489		/* Update the voltages measured value and limits */1490		for (i = 0; i < NUMBER_OF_VIN; i++) {1491			data->in[i] = w83791d_read(client,1492						W83791D_REG_IN[i]);1493			data->in_max[i] = w83791d_read(client,1494						W83791D_REG_IN_MAX[i]);1495			data->in_min[i] = w83791d_read(client,1496						W83791D_REG_IN_MIN[i]);1497		}1498 1499		/* Update the fan counts and limits */1500		for (i = 0; i < NUMBER_OF_FANIN; i++) {1501			/* Update the Fan measured value and limits */1502			data->fan[i] = w83791d_read(client,1503						W83791D_REG_FAN[i]);1504			data->fan_min[i] = w83791d_read(client,1505						W83791D_REG_FAN_MIN[i]);1506		}1507 1508		/* Update the fan divisor */1509		for (i = 0; i < 3; i++) {1510			reg_array_tmp[i] = w83791d_read(client,1511						W83791D_REG_FAN_DIV[i]);1512		}1513		data->fan_div[0] = (reg_array_tmp[0] >> 4) & 0x03;1514		data->fan_div[1] = (reg_array_tmp[0] >> 6) & 0x03;1515		data->fan_div[2] = (reg_array_tmp[1] >> 6) & 0x03;1516		data->fan_div[3] = reg_array_tmp[2] & 0x07;1517		data->fan_div[4] = (reg_array_tmp[2] >> 4) & 0x07;1518 1519		/*1520		 * The fan divisor for fans 0-2 get bit 2 from1521		 * bits 5-7 respectively of vbat register1522		 */1523		vbat_reg = w83791d_read(client, W83791D_REG_VBAT);1524		for (i = 0; i < 3; i++)1525			data->fan_div[i] |= (vbat_reg >> (3 + i)) & 0x04;1526 1527		/* Update PWM duty cycle */1528		for (i = 0; i < NUMBER_OF_PWM; i++) {1529			data->pwm[i] =  w83791d_read(client,1530						W83791D_REG_PWM[i]);1531		}1532 1533		/* Update PWM enable status */1534		for (i = 0; i < 2; i++) {1535			reg_array_tmp[i] = w83791d_read(client,1536						W83791D_REG_FAN_CFG[i]);1537		}1538		data->pwm_enable[0] = (reg_array_tmp[0] >> 2) & 0x03;1539		data->pwm_enable[1] = (reg_array_tmp[0] >> 4) & 0x03;1540		data->pwm_enable[2] = (reg_array_tmp[1] >> 2) & 0x03;1541 1542		/* Update PWM target temperature */1543		for (i = 0; i < 3; i++) {1544			data->temp_target[i] = w83791d_read(client,1545				W83791D_REG_TEMP_TARGET[i]) & 0x7f;1546		}1547 1548		/* Update PWM temperature tolerance */1549		for (i = 0; i < 2; i++) {1550			reg_array_tmp[i] = w83791d_read(client,1551					W83791D_REG_TEMP_TOL[i]);1552		}1553		data->temp_tolerance[0] = reg_array_tmp[0] & 0x0f;1554		data->temp_tolerance[1] = (reg_array_tmp[0] >> 4) & 0x0f;1555		data->temp_tolerance[2] = reg_array_tmp[1] & 0x0f;1556 1557		/* Update the first temperature sensor */1558		for (i = 0; i < 3; i++) {1559			data->temp1[i] = w83791d_read(client,1560						W83791D_REG_TEMP1[i]);1561		}1562 1563		/* Update the rest of the temperature sensors */1564		for (i = 0; i < 2; i++) {1565			for (j = 0; j < 3; j++) {1566				data->temp_add[i][j] =1567					(w83791d_read(client,1568					W83791D_REG_TEMP_ADD[i][j * 2]) << 8) |1569					w83791d_read(client,1570					W83791D_REG_TEMP_ADD[i][j * 2 + 1]);1571			}1572		}1573 1574		/* Update the realtime status */1575		data->alarms =1576			w83791d_read(client, W83791D_REG_ALARM1) +1577			(w83791d_read(client, W83791D_REG_ALARM2) << 8) +1578			(w83791d_read(client, W83791D_REG_ALARM3) << 16);1579 1580		/* Update the beep configuration information */1581		data->beep_mask =1582			w83791d_read(client, W83791D_REG_BEEP_CTRL[0]) +1583			(w83791d_read(client, W83791D_REG_BEEP_CTRL[1]) << 8) +1584			(w83791d_read(client, W83791D_REG_BEEP_CTRL[2]) << 16);1585 1586		/* Extract global beep enable flag */1587		data->beep_enable =1588			(data->beep_mask >> GLOBAL_BEEP_ENABLE_SHIFT) & 0x01;1589 1590		/* Update the cpu voltage information */1591		i = w83791d_read(client, W83791D_REG_VID_FANDIV);1592		data->vid = i & 0x0f;1593		data->vid |= (w83791d_read(client, W83791D_REG_DID_VID4) & 0x01)1594				<< 4;1595 1596		data->last_updated = jiffies;1597		data->valid = true;1598	}1599 1600	mutex_unlock(&data->update_lock);1601 1602#ifdef DEBUG1603	w83791d_print_debug(data, dev);1604#endif1605 1606	return data;1607}1608 1609#ifdef DEBUG1610static void w83791d_print_debug(struct w83791d_data *data, struct device *dev)1611{1612	int i = 0, j = 0;1613 1614	dev_dbg(dev, "======Start of w83791d debug values======\n");1615	dev_dbg(dev, "%d set of Voltages: ===>\n", NUMBER_OF_VIN);1616	for (i = 0; i < NUMBER_OF_VIN; i++) {1617		dev_dbg(dev, "vin[%d] is:     0x%02x\n", i, data->in[i]);1618		dev_dbg(dev, "vin[%d] min is: 0x%02x\n", i, data->in_min[i]);1619		dev_dbg(dev, "vin[%d] max is: 0x%02x\n", i, data->in_max[i]);1620	}1621	dev_dbg(dev, "%d set of Fan Counts/Divisors: ===>\n", NUMBER_OF_FANIN);1622	for (i = 0; i < NUMBER_OF_FANIN; i++) {1623		dev_dbg(dev, "fan[%d] is:     0x%02x\n", i, data->fan[i]);1624		dev_dbg(dev, "fan[%d] min is: 0x%02x\n", i, data->fan_min[i]);1625		dev_dbg(dev, "fan_div[%d] is: 0x%02x\n", i, data->fan_div[i]);1626	}1627 1628	/*1629	 * temperature math is signed, but only print out the1630	 * bits that matter1631	 */1632	dev_dbg(dev, "%d set of Temperatures: ===>\n", NUMBER_OF_TEMPIN);1633	for (i = 0; i < 3; i++)1634		dev_dbg(dev, "temp1[%d] is: 0x%02x\n", i, (u8) data->temp1[i]);1635	for (i = 0; i < 2; i++) {1636		for (j = 0; j < 3; j++) {1637			dev_dbg(dev, "temp_add[%d][%d] is: 0x%04x\n", i, j,1638				(u16) data->temp_add[i][j]);1639		}1640	}1641 1642	dev_dbg(dev, "Misc Information: ===>\n");1643	dev_dbg(dev, "alarm is:     0x%08x\n", data->alarms);1644	dev_dbg(dev, "beep_mask is: 0x%08x\n", data->beep_mask);1645	dev_dbg(dev, "beep_enable is: %d\n", data->beep_enable);1646	dev_dbg(dev, "vid is: 0x%02x\n", data->vid);1647	dev_dbg(dev, "vrm is: 0x%02x\n", data->vrm);1648	dev_dbg(dev, "=======End of w83791d debug values========\n");1649	dev_dbg(dev, "\n");1650}1651#endif1652 1653module_i2c_driver(w83791d_driver);1654 1655MODULE_AUTHOR("Charles Spirakis <bezaur@gmail.com>");1656MODULE_DESCRIPTION("W83791D driver");1657MODULE_LICENSE("GPL");1658