forked from mirrors/linux
		
	hwmon: (adm1026) Fix checkpatch issues
Fixed:
ERROR: do not use assignment in if condition
ERROR: space prohibited after that '~' (ctx:WxW)
ERROR: space required after that ';' (ctx:VxO)
ERROR: space required after that ';' (ctx:VxV)
ERROR: spaces required around that '<' (ctx:VxV)
ERROR: spaces required around that '==' (ctx:VxV)
ERROR: spaces required around that '=' (ctx:VxV)
ERROR: spaces required around that ':' (ctx:VxV)
WARNING: braces {} are not necessary for any arm of this statement
WARNING: braces {} are not necessary for single statement blocks
WARNING: line over 80 characters
WARNING: simple_strtol is obsolete, use kstrtol instead
Modify multi-line comments to follow Documentation/CodingStyle.
Not fixed:
ERROR: Macros with multiple statements should be enclosed in a do - while loop
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
			
			
This commit is contained in:
		
							parent
							
								
									21d2a8f17b
								
							
						
					
					
						commit
						86aa3e2210
					
				
					 1 changed files with 313 additions and 178 deletions
				
			
		|  | @ -1,26 +1,26 @@ | |||
| /*
 | ||||
|     adm1026.c - Part of lm_sensors, Linux kernel modules for hardware | ||||
| 	     monitoring | ||||
|     Copyright (C) 2002, 2003  Philip Pokorny <ppokorny@penguincomputing.com> | ||||
|     Copyright (C) 2004 Justin Thiessen <jthiessen@penguincomputing.com> | ||||
| 
 | ||||
|     Chip details at: | ||||
| 
 | ||||
|     <http://www.onsemi.com/PowerSolutions/product.do?id=ADM1026>
 | ||||
| 
 | ||||
|     This program is free software; you can redistribute it and/or modify | ||||
|     it under the terms of the GNU General Public License as published by | ||||
|     the Free Software Foundation; either version 2 of the License, or | ||||
|     (at your option) any later version. | ||||
| 
 | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU General Public License for more details. | ||||
| 
 | ||||
|     You should have received a copy of the GNU General Public License | ||||
|     along with this program; if not, write to the Free Software | ||||
|     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
|  * adm1026.c - Part of lm_sensors, Linux kernel modules for hardware | ||||
|  *	       monitoring | ||||
|  * Copyright (C) 2002, 2003  Philip Pokorny <ppokorny@penguincomputing.com> | ||||
|  * Copyright (C) 2004 Justin Thiessen <jthiessen@penguincomputing.com> | ||||
|  * | ||||
|  * Chip details at: | ||||
|  * | ||||
|  * <http://www.onsemi.com/PowerSolutions/product.do?id=ADM1026>
 | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, write to the Free Software | ||||
|  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
|  | @ -90,7 +90,8 @@ MODULE_PARM_DESC(gpio_fan, "List of GPIO pins (0-7) to program as fan tachs"); | |||
| #define E2CFG_ROM		0x08 | ||||
| #define E2CFG_CLK_EXT		0x80 | ||||
| 
 | ||||
| /* There are 10 general analog inputs and 7 dedicated inputs
 | ||||
| /*
 | ||||
|  * There are 10 general analog inputs and 7 dedicated inputs | ||||
|  * They are: | ||||
|  *    0 - 9  =  AIN0 - AIN9 | ||||
|  *       10  =  Vbat | ||||
|  | @ -117,7 +118,8 @@ static u16 ADM1026_REG_IN_MAX[] = { | |||
| 		0x43, 0x44, 0x45, 0x46, 0x47 | ||||
| 	}; | ||||
| 
 | ||||
| /* Temperatures are:
 | ||||
| /*
 | ||||
|  * Temperatures are: | ||||
|  *    0 - Internal | ||||
|  *    1 - External 1 | ||||
|  *    2 - External 2 | ||||
|  | @ -170,12 +172,14 @@ static u16 ADM1026_REG_TEMP_OFFSET[] = { 0x1e, 0x6e, 0x6f }; | |||
| #define ADM1026_FAN_CONTROL_TEMP_RANGE	20 | ||||
| #define ADM1026_PWM_MAX			255 | ||||
| 
 | ||||
| /* Conversions. Rounding and limit checking is only done on the TO_REG
 | ||||
| /*
 | ||||
|  * Conversions. Rounding and limit checking is only done on the TO_REG | ||||
|  * variants. Note that you should be a bit careful with which arguments | ||||
|  * these macros are called: arguments may be evaluated more than once. | ||||
|  */ | ||||
| 
 | ||||
| /* IN are scaled according to built-in resistors.  These are the
 | ||||
| /*
 | ||||
|  * IN are scaled according to built-in resistors.  These are the | ||||
|  *   voltages corresponding to 3/4 of full scale (192 or 0xc0) | ||||
|  *   NOTE: The -12V input needs an additional factor to account | ||||
|  *      for the Vref pullup resistor. | ||||
|  | @ -197,23 +201,25 @@ static int adm1026_scaling[] = { /* .001 Volts */ | |||
| 	0, 255)) | ||||
| #define INS_FROM_REG(n, val) (SCALE(val, 192, adm1026_scaling[n])) | ||||
| 
 | ||||
| /* FAN speed is measured using 22.5kHz clock and counts for 2 pulses
 | ||||
| /*
 | ||||
|  * FAN speed is measured using 22.5kHz clock and counts for 2 pulses | ||||
|  *   and we assume a 2 pulse-per-rev fan tach signal | ||||
|  *      22500 kHz * 60 (sec/min) * 2 (pulse) / 2 (pulse/rev) == 1350000 | ||||
|  */ | ||||
| #define FAN_TO_REG(val, div)  ((val) <= 0 ? 0xff : \ | ||||
| 				SENSORS_LIMIT(1350000/((val)*(div)), 1, 254)) | ||||
| 				SENSORS_LIMIT(1350000 / ((val) * (div)), \ | ||||
| 					      1, 254)) | ||||
| #define FAN_FROM_REG(val, div) ((val) == 0 ? -1 : (val) == 0xff ? 0 : \ | ||||
| 				1350000 / ((val) * (div))) | ||||
| #define DIV_FROM_REG(val) (1 << (val)) | ||||
| #define DIV_TO_REG(val) ((val) >= 8 ? 3 : (val) >= 4 ? 2 : (val) >= 2 ? 1 : 0) | ||||
| 
 | ||||
| /* Temperature is reported in 1 degC increments */ | ||||
| #define TEMP_TO_REG(val) (SENSORS_LIMIT(((val)+((val)<0 ? -500 : 500))/1000,\ | ||||
| 	-127, 127)) | ||||
| #define TEMP_TO_REG(val) (SENSORS_LIMIT(((val) + ((val) < 0 ? -500 : 500)) \ | ||||
| 					/ 1000, -127, 127)) | ||||
| #define TEMP_FROM_REG(val) ((val) * 1000) | ||||
| #define OFFSET_TO_REG(val) (SENSORS_LIMIT(((val)+((val)<0 ? -500 : 500))/1000,\ | ||||
| 	-127, 127)) | ||||
| #define OFFSET_TO_REG(val) (SENSORS_LIMIT(((val) + ((val) < 0 ? -500 : 500)) \ | ||||
| 					  / 1000, -127, 127)) | ||||
| #define OFFSET_FROM_REG(val) ((val) * 1000) | ||||
| 
 | ||||
| #define PWM_TO_REG(val) (SENSORS_LIMIT(val, 0, 255)) | ||||
|  | @ -222,14 +228,16 @@ static int adm1026_scaling[] = { /* .001 Volts */ | |||
| #define PWM_MIN_TO_REG(val) ((val) & 0xf0) | ||||
| #define PWM_MIN_FROM_REG(val) (((val) & 0xf0) + ((val) >> 4)) | ||||
| 
 | ||||
| /* Analog output is a voltage, and scaled to millivolts.  The datasheet
 | ||||
| /*
 | ||||
|  * Analog output is a voltage, and scaled to millivolts.  The datasheet | ||||
|  *   indicates that the DAC could be used to drive the fans, but in our | ||||
|  *   example board (Arima HDAMA) it isn't connected to the fans at all. | ||||
|  */ | ||||
| #define DAC_TO_REG(val) (SENSORS_LIMIT(((((val) * 255) + 500) / 2500), 0, 255)) | ||||
| #define DAC_FROM_REG(val) (((val) * 2500) / 255) | ||||
| 
 | ||||
| /* Chip sampling rates
 | ||||
| /*
 | ||||
|  * Chip sampling rates | ||||
|  * | ||||
|  * Some sensors are not updated more frequently than once per second | ||||
|  *    so it doesn't make sense to read them more often than that. | ||||
|  | @ -243,11 +251,13 @@ static int adm1026_scaling[] = { /* .001 Volts */ | |||
| #define ADM1026_DATA_INTERVAL		(1 * HZ) | ||||
| #define ADM1026_CONFIG_INTERVAL		(5 * 60 * HZ) | ||||
| 
 | ||||
| /* We allow for multiple chips in a single system.
 | ||||
| /*
 | ||||
|  * We allow for multiple chips in a single system. | ||||
|  * | ||||
|  * For each registered ADM1026, we need to keep state information | ||||
|  * at client->data. The adm1026_data structure is dynamically | ||||
|  * allocated, when a new client structure is allocated. */ | ||||
|  * allocated, when a new client structure is allocated. | ||||
|  */ | ||||
| 
 | ||||
| struct pwm_data { | ||||
| 	u8 pwm; | ||||
|  | @ -388,11 +398,10 @@ static void adm1026_init_client(struct i2c_client *client) | |||
| 		dev_dbg(&client->dev, "THERM pin enabled.  " | ||||
| 			"GPIO16 disabled.\n"); | ||||
| 	} | ||||
| 	if (data->config3 & CFG3_VREF_250) { | ||||
| 	if (data->config3 & CFG3_VREF_250) | ||||
| 		dev_dbg(&client->dev, "Vref is 2.50 Volts.\n"); | ||||
| 	} else { | ||||
| 	else | ||||
| 		dev_dbg(&client->dev, "Vref is 1.82 Volts.\n"); | ||||
| 	} | ||||
| 	/* Read and pick apart the existing GPIO configuration */ | ||||
| 	value = 0; | ||||
| 	for (i = 0; i <= 15; ++i) { | ||||
|  | @ -408,7 +417,8 @@ static void adm1026_init_client(struct i2c_client *client) | |||
| 	/* ... and then print it */ | ||||
| 	adm1026_print_gpio(client); | ||||
| 
 | ||||
| 	/* If the user asks us to reprogram the GPIO config, then
 | ||||
| 	/*
 | ||||
| 	 * If the user asks us to reprogram the GPIO config, then | ||||
| 	 * do it now. | ||||
| 	 */ | ||||
| 	if (gpio_input[0] != -1 || gpio_output[0] != -1 | ||||
|  | @ -417,7 +427,8 @@ static void adm1026_init_client(struct i2c_client *client) | |||
| 		adm1026_fixup_gpio(client); | ||||
| 	} | ||||
| 
 | ||||
| 	/* WE INTENTIONALLY make no changes to the limits,
 | ||||
| 	/*
 | ||||
| 	 * WE INTENTIONALLY make no changes to the limits, | ||||
| 	 *   offsets, pwms, fans and zones.  If they were | ||||
| 	 *   configured, we don't want to mess with them. | ||||
| 	 *   If they weren't, the default is 100% PWM, no | ||||
|  | @ -485,53 +496,47 @@ static void adm1026_fixup_gpio(struct i2c_client *client) | |||
| 	int value; | ||||
| 
 | ||||
| 	/* Make the changes requested. */ | ||||
| 	/* We may need to unlock/stop monitoring or soft-reset the
 | ||||
| 	/*
 | ||||
| 	 * We may need to unlock/stop monitoring or soft-reset the | ||||
| 	 *    chip before we can make changes.  This hasn't been | ||||
| 	 *    tested much.  FIXME | ||||
| 	 */ | ||||
| 
 | ||||
| 	/* Make outputs */ | ||||
| 	for (i = 0; i <= 16; ++i) { | ||||
| 		if (gpio_output[i] >= 0 && gpio_output[i] <= 16) { | ||||
| 		if (gpio_output[i] >= 0 && gpio_output[i] <= 16) | ||||
| 			data->gpio_config[gpio_output[i]] |= 0x01; | ||||
| 		} | ||||
| 		/* if GPIO0-7 is output, it isn't a FAN tach */ | ||||
| 		if (gpio_output[i] >= 0 && gpio_output[i] <= 7) { | ||||
| 		if (gpio_output[i] >= 0 && gpio_output[i] <= 7) | ||||
| 			data->config2 |= 1 << gpio_output[i]; | ||||
| 	} | ||||
| 	} | ||||
| 
 | ||||
| 	/* Input overrides output */ | ||||
| 	for (i = 0; i <= 16; ++i) { | ||||
| 		if (gpio_input[i] >= 0 && gpio_input[i] <= 16) { | ||||
| 		if (gpio_input[i] >= 0 && gpio_input[i] <= 16) | ||||
| 			data->gpio_config[gpio_input[i]] &= ~0x01; | ||||
| 		} | ||||
| 		/* if GPIO0-7 is input, it isn't a FAN tach */ | ||||
| 		if (gpio_input[i] >= 0 && gpio_input[i] <= 7) { | ||||
| 		if (gpio_input[i] >= 0 && gpio_input[i] <= 7) | ||||
| 			data->config2 |= 1 << gpio_input[i]; | ||||
| 	} | ||||
| 	} | ||||
| 
 | ||||
| 	/* Inverted */ | ||||
| 	for (i = 0; i <= 16; ++i) { | ||||
| 		if (gpio_inverted[i] >= 0 && gpio_inverted[i] <= 16) { | ||||
| 		if (gpio_inverted[i] >= 0 && gpio_inverted[i] <= 16) | ||||
| 			data->gpio_config[gpio_inverted[i]] &= ~0x02; | ||||
| 	} | ||||
| 	} | ||||
| 
 | ||||
| 	/* Normal overrides inverted */ | ||||
| 	for (i = 0; i <= 16; ++i) { | ||||
| 		if (gpio_normal[i] >= 0 && gpio_normal[i] <= 16) { | ||||
| 		if (gpio_normal[i] >= 0 && gpio_normal[i] <= 16) | ||||
| 			data->gpio_config[gpio_normal[i]] |= 0x02; | ||||
| 	} | ||||
| 	} | ||||
| 
 | ||||
| 	/* Fan overrides input and output */ | ||||
| 	for (i = 0; i <= 7; ++i) { | ||||
| 		if (gpio_fan[i] >= 0 && gpio_fan[i] <= 7) { | ||||
| 		if (gpio_fan[i] >= 0 && gpio_fan[i] <= 7) | ||||
| 			data->config2 &= ~(1 << gpio_fan[i]); | ||||
| 	} | ||||
| 	} | ||||
| 
 | ||||
| 	/* Write new configs to registers */ | ||||
| 	adm1026_write_value(client, ADM1026_REG_CONFIG2, data->config2); | ||||
|  | @ -563,7 +568,8 @@ static struct adm1026_data *adm1026_update_device(struct device *dev) | |||
| 
 | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	if (!data->valid | ||||
| 	    || time_after(jiffies, data->last_reading + ADM1026_DATA_INTERVAL)) { | ||||
| 	    || time_after(jiffies, | ||||
| 			  data->last_reading + ADM1026_DATA_INTERVAL)) { | ||||
| 		/* Things that change quickly */ | ||||
| 		dev_dbg(&client->dev, "Reading sensor values\n"); | ||||
| 		for (i = 0; i <= 16; ++i) { | ||||
|  | @ -577,8 +583,10 @@ static struct adm1026_data *adm1026_update_device(struct device *dev) | |||
| 		} | ||||
| 
 | ||||
| 		for (i = 0; i <= 2; ++i) { | ||||
| 			/* NOTE: temp[] is s8 and we assume 2's complement
 | ||||
| 			 *   "conversion" in the assignment */ | ||||
| 			/*
 | ||||
| 			 * NOTE: temp[] is s8 and we assume 2's complement | ||||
| 			 *   "conversion" in the assignment | ||||
| 			 */ | ||||
| 			data->temp[i] = | ||||
| 			    adm1026_read_value(client, ADM1026_REG_TEMP[i]); | ||||
| 		} | ||||
|  | @ -632,7 +640,8 @@ static struct adm1026_data *adm1026_update_device(struct device *dev) | |||
| 		} | ||||
| 
 | ||||
| 		for (i = 0; i <= 2; ++i) { | ||||
| 			/* NOTE: temp_xxx[] are s8 and we assume 2's
 | ||||
| 			/*
 | ||||
| 			 * NOTE: temp_xxx[] are s8 and we assume 2's | ||||
| 			 *    complement "conversion" in the assignment | ||||
| 			 */ | ||||
| 			data->temp_min[i] = adm1026_read_value(client, | ||||
|  | @ -721,7 +730,12 @@ static ssize_t set_in_min(struct device *dev, struct device_attribute *attr, | |||
| 	int nr = sensor_attr->index; | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val = simple_strtol(buf, NULL, 10); | ||||
| 	long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtol(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	data->in_min[nr] = INS_TO_REG(nr, val); | ||||
|  | @ -744,7 +758,12 @@ static ssize_t set_in_max(struct device *dev, struct device_attribute *attr, | |||
| 	int nr = sensor_attr->index; | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val = simple_strtol(buf, NULL, 10); | ||||
| 	long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtol(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	data->in_max[nr] = INS_TO_REG(nr, val); | ||||
|  | @ -779,23 +798,31 @@ in_reg(13); | |||
| in_reg(14); | ||||
| in_reg(15); | ||||
| 
 | ||||
| static ssize_t show_in16(struct device *dev, struct device_attribute *attr, char *buf) | ||||
| static ssize_t show_in16(struct device *dev, struct device_attribute *attr, | ||||
| 			 char *buf) | ||||
| { | ||||
| 	struct adm1026_data *data = adm1026_update_device(dev); | ||||
| 	return sprintf(buf, "%d\n", INS_FROM_REG(16, data->in[16]) - | ||||
| 		NEG12_OFFSET); | ||||
| } | ||||
| static ssize_t show_in16_min(struct device *dev, struct device_attribute *attr, char *buf) | ||||
| static ssize_t show_in16_min(struct device *dev, struct device_attribute *attr, | ||||
| 			     char *buf) | ||||
| { | ||||
| 	struct adm1026_data *data = adm1026_update_device(dev); | ||||
| 	return sprintf(buf, "%d\n", INS_FROM_REG(16, data->in_min[16]) | ||||
| 		- NEG12_OFFSET); | ||||
| } | ||||
| static ssize_t set_in16_min(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) | ||||
| static ssize_t set_in16_min(struct device *dev, struct device_attribute *attr, | ||||
| 			    const char *buf, size_t count) | ||||
| { | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val = simple_strtol(buf, NULL, 10); | ||||
| 	long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtol(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	data->in_min[16] = INS_TO_REG(16, val + NEG12_OFFSET); | ||||
|  | @ -803,17 +830,24 @@ static ssize_t set_in16_min(struct device *dev, struct device_attribute *attr, c | |||
| 	mutex_unlock(&data->update_lock); | ||||
| 	return count; | ||||
| } | ||||
| static ssize_t show_in16_max(struct device *dev, struct device_attribute *attr, char *buf) | ||||
| static ssize_t show_in16_max(struct device *dev, struct device_attribute *attr, | ||||
| 			     char *buf) | ||||
| { | ||||
| 	struct adm1026_data *data = adm1026_update_device(dev); | ||||
| 	return sprintf(buf, "%d\n", INS_FROM_REG(16, data->in_max[16]) | ||||
| 			- NEG12_OFFSET); | ||||
| } | ||||
| static ssize_t set_in16_max(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) | ||||
| static ssize_t set_in16_max(struct device *dev, struct device_attribute *attr, | ||||
| 			    const char *buf, size_t count) | ||||
| { | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val = simple_strtol(buf, NULL, 10); | ||||
| 	long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtol(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	data->in_max[16] = INS_TO_REG(16, val+NEG12_OFFSET); | ||||
|  | @ -823,10 +857,10 @@ static ssize_t set_in16_max(struct device *dev, struct device_attribute *attr, c | |||
| } | ||||
| 
 | ||||
| static SENSOR_DEVICE_ATTR(in16_input, S_IRUGO, show_in16, NULL, 16); | ||||
| static SENSOR_DEVICE_ATTR(in16_min, S_IRUGO | S_IWUSR, show_in16_min, set_in16_min, 16); | ||||
| static SENSOR_DEVICE_ATTR(in16_max, S_IRUGO | S_IWUSR, show_in16_max, set_in16_max, 16); | ||||
| 
 | ||||
| 
 | ||||
| static SENSOR_DEVICE_ATTR(in16_min, S_IRUGO | S_IWUSR, show_in16_min, | ||||
| 			  set_in16_min, 16); | ||||
| static SENSOR_DEVICE_ATTR(in16_max, S_IRUGO | S_IWUSR, show_in16_max, | ||||
| 			  set_in16_max, 16); | ||||
| 
 | ||||
| 
 | ||||
| /* Now add fan read/write functions */ | ||||
|  | @ -856,7 +890,12 @@ static ssize_t set_fan_min(struct device *dev, struct device_attribute *attr, | |||
| 	int nr = sensor_attr->index; | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val = simple_strtol(buf, NULL, 10); | ||||
| 	long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtol(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	data->fan_min[nr] = FAN_TO_REG(val, data->fan_div[nr]); | ||||
|  | @ -890,9 +929,8 @@ static void fixup_fan_min(struct device *dev, int fan, int old_div) | |||
| 	int new_div = data->fan_div[fan]; | ||||
| 
 | ||||
| 	/* 0 and 0xff are special.  Don't adjust them */ | ||||
| 	if (data->fan_min[fan] == 0 || data->fan_min[fan] == 0xff) { | ||||
| 	if (data->fan_min[fan] == 0 || data->fan_min[fan] == 0xff) | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	new_min = data->fan_min[fan] * old_div / new_div; | ||||
| 	new_min = SENSORS_LIMIT(new_min, 1, 254); | ||||
|  | @ -916,9 +954,14 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr, | |||
| 	int nr = sensor_attr->index; | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val, orig_div, new_div; | ||||
| 	long val; | ||||
| 	int orig_div, new_div; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtol(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	val = simple_strtol(buf, NULL, 10); | ||||
| 	new_div = DIV_TO_REG(val); | ||||
| 
 | ||||
| 	mutex_lock(&data->update_lock); | ||||
|  | @ -939,9 +982,9 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr, | |||
| 				    (DIV_TO_REG(data->fan_div[7]) << 6)); | ||||
| 	} | ||||
| 
 | ||||
| 	if (data->fan_div[nr] != orig_div) { | ||||
| 	if (data->fan_div[nr] != orig_div) | ||||
| 		fixup_fan_min(dev, nr, orig_div); | ||||
| 	} | ||||
| 
 | ||||
| 	mutex_unlock(&data->update_lock); | ||||
| 	return count; | ||||
| } | ||||
|  | @ -983,7 +1026,12 @@ static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr, | |||
| 	int nr = sensor_attr->index; | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val = simple_strtol(buf, NULL, 10); | ||||
| 	long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtol(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	data->temp_min[nr] = TEMP_TO_REG(val); | ||||
|  | @ -1007,7 +1055,12 @@ static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr, | |||
| 	int nr = sensor_attr->index; | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val = simple_strtol(buf, NULL, 10); | ||||
| 	long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtol(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	data->temp_max[nr] = TEMP_TO_REG(val); | ||||
|  | @ -1046,7 +1099,12 @@ static ssize_t set_temp_offset(struct device *dev, | |||
| 	int nr = sensor_attr->index; | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val = simple_strtol(buf, NULL, 10); | ||||
| 	long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtol(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	data->temp_offset[nr] = TEMP_TO_REG(val); | ||||
|  | @ -1097,7 +1155,12 @@ static ssize_t set_temp_auto_point1_temp(struct device *dev, | |||
| 	int nr = sensor_attr->index; | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val = simple_strtol(buf, NULL, 10); | ||||
| 	long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtol(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	data->temp_tmin[nr] = TEMP_TO_REG(val); | ||||
|  | @ -1131,15 +1194,21 @@ static ssize_t set_temp_crit_enable(struct device *dev, | |||
| { | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val = simple_strtol(buf, NULL, 10); | ||||
| 	unsigned long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtoul(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	if (val > 1) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if ((val == 1) || (val==0)) { | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	data->config1 = (data->config1 & ~CFG1_THERM_HOT) | (val << 4); | ||||
| 		adm1026_write_value(client, ADM1026_REG_CONFIG1, | ||||
| 			data->config1); | ||||
| 	adm1026_write_value(client, ADM1026_REG_CONFIG1, data->config1); | ||||
| 	mutex_unlock(&data->update_lock); | ||||
| 	} | ||||
| 
 | ||||
| 	return count; | ||||
| } | ||||
| 
 | ||||
|  | @ -1166,7 +1235,12 @@ static ssize_t set_temp_crit(struct device *dev, struct device_attribute *attr, | |||
| 	int nr = sensor_attr->index; | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val = simple_strtol(buf, NULL, 10); | ||||
| 	long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtol(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	data->temp_crit[nr] = TEMP_TO_REG(val); | ||||
|  | @ -1184,17 +1258,24 @@ temp_crit_reg(1); | |||
| temp_crit_reg(2); | ||||
| temp_crit_reg(3); | ||||
| 
 | ||||
| static ssize_t show_analog_out_reg(struct device *dev, struct device_attribute *attr, char *buf) | ||||
| static ssize_t show_analog_out_reg(struct device *dev, | ||||
| 				   struct device_attribute *attr, char *buf) | ||||
| { | ||||
| 	struct adm1026_data *data = adm1026_update_device(dev); | ||||
| 	return sprintf(buf, "%d\n", DAC_FROM_REG(data->analog_out)); | ||||
| } | ||||
| static ssize_t set_analog_out_reg(struct device *dev, struct device_attribute *attr, const char *buf, | ||||
| 		size_t count) | ||||
| static ssize_t set_analog_out_reg(struct device *dev, | ||||
| 				  struct device_attribute *attr, | ||||
| 				  const char *buf, size_t count) | ||||
| { | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val = simple_strtol(buf, NULL, 10); | ||||
| 	long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtol(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	data->analog_out = DAC_TO_REG(val); | ||||
|  | @ -1206,7 +1287,8 @@ static ssize_t set_analog_out_reg(struct device *dev, struct device_attribute *a | |||
| static DEVICE_ATTR(analog_out, S_IRUGO | S_IWUSR, show_analog_out_reg, | ||||
| 	set_analog_out_reg); | ||||
| 
 | ||||
| static ssize_t show_vid_reg(struct device *dev, struct device_attribute *attr, char *buf) | ||||
| static ssize_t show_vid_reg(struct device *dev, struct device_attribute *attr, | ||||
| 			    char *buf) | ||||
| { | ||||
| 	struct adm1026_data *data = adm1026_update_device(dev); | ||||
| 	int vid = (data->gpio >> 11) & 0x1f; | ||||
|  | @ -1214,25 +1296,35 @@ static ssize_t show_vid_reg(struct device *dev, struct device_attribute *attr, c | |||
| 	dev_dbg(dev, "Setting VID from GPIO11-15.\n"); | ||||
| 	return sprintf(buf, "%d\n", vid_from_reg(vid, data->vrm)); | ||||
| } | ||||
| 
 | ||||
| static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL); | ||||
| 
 | ||||
| static ssize_t show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf) | ||||
| static ssize_t show_vrm_reg(struct device *dev, struct device_attribute *attr, | ||||
| 			    char *buf) | ||||
| { | ||||
| 	struct adm1026_data *data = dev_get_drvdata(dev); | ||||
| 	return sprintf(buf, "%d\n", data->vrm); | ||||
| } | ||||
| static ssize_t store_vrm_reg(struct device *dev, struct device_attribute *attr, const char *buf, | ||||
| 		size_t count) | ||||
| 
 | ||||
| static ssize_t store_vrm_reg(struct device *dev, struct device_attribute *attr, | ||||
| 			     const char *buf, size_t count) | ||||
| { | ||||
| 	struct adm1026_data *data = dev_get_drvdata(dev); | ||||
| 	unsigned long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	data->vrm = simple_strtol(buf, NULL, 10); | ||||
| 	err = kstrtoul(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	data->vrm = val; | ||||
| 	return count; | ||||
| } | ||||
| 
 | ||||
| static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg); | ||||
| 
 | ||||
| static ssize_t show_alarms_reg(struct device *dev, struct device_attribute *attr, char *buf) | ||||
| static ssize_t show_alarms_reg(struct device *dev, | ||||
| 			       struct device_attribute *attr, char *buf) | ||||
| { | ||||
| 	struct adm1026_data *data = adm1026_update_device(dev); | ||||
| 	return sprintf(buf, "%ld\n", data->alarms); | ||||
|  | @ -1277,18 +1369,24 @@ static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 24); | |||
| static SENSOR_DEVICE_ATTR(in10_alarm, S_IRUGO, show_alarm, NULL, 25); | ||||
| static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 26); | ||||
| 
 | ||||
| static ssize_t show_alarm_mask(struct device *dev, struct device_attribute *attr, char *buf) | ||||
| static ssize_t show_alarm_mask(struct device *dev, | ||||
| 			       struct device_attribute *attr, char *buf) | ||||
| { | ||||
| 	struct adm1026_data *data = adm1026_update_device(dev); | ||||
| 	return sprintf(buf, "%ld\n", data->alarm_mask); | ||||
| } | ||||
| static ssize_t set_alarm_mask(struct device *dev, struct device_attribute *attr, const char *buf, | ||||
| 		size_t count) | ||||
| static ssize_t set_alarm_mask(struct device *dev, struct device_attribute *attr, | ||||
| 			      const char *buf, size_t count) | ||||
| { | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val = simple_strtol(buf, NULL, 10); | ||||
| 	unsigned long mask; | ||||
| 	long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtol(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	data->alarm_mask = val & 0x7fffffff; | ||||
|  | @ -1313,18 +1411,24 @@ static DEVICE_ATTR(alarm_mask, S_IRUGO | S_IWUSR, show_alarm_mask, | |||
| 	set_alarm_mask); | ||||
| 
 | ||||
| 
 | ||||
| static ssize_t show_gpio(struct device *dev, struct device_attribute *attr, char *buf) | ||||
| static ssize_t show_gpio(struct device *dev, struct device_attribute *attr, | ||||
| 			 char *buf) | ||||
| { | ||||
| 	struct adm1026_data *data = adm1026_update_device(dev); | ||||
| 	return sprintf(buf, "%ld\n", data->gpio); | ||||
| } | ||||
| static ssize_t set_gpio(struct device *dev, struct device_attribute *attr, const char *buf, | ||||
| 		size_t count) | ||||
| static ssize_t set_gpio(struct device *dev, struct device_attribute *attr, | ||||
| 			const char *buf, size_t count) | ||||
| { | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val = simple_strtol(buf, NULL, 10); | ||||
| 	long gpio; | ||||
| 	long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtol(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	data->gpio = val & 0x1ffff; | ||||
|  | @ -1340,19 +1444,24 @@ static ssize_t set_gpio(struct device *dev, struct device_attribute *attr, const | |||
| 
 | ||||
| static DEVICE_ATTR(gpio, S_IRUGO | S_IWUSR, show_gpio, set_gpio); | ||||
| 
 | ||||
| 
 | ||||
| static ssize_t show_gpio_mask(struct device *dev, struct device_attribute *attr, char *buf) | ||||
| static ssize_t show_gpio_mask(struct device *dev, struct device_attribute *attr, | ||||
| 			      char *buf) | ||||
| { | ||||
| 	struct adm1026_data *data = adm1026_update_device(dev); | ||||
| 	return sprintf(buf, "%ld\n", data->gpio_mask); | ||||
| } | ||||
| static ssize_t set_gpio_mask(struct device *dev, struct device_attribute *attr, const char *buf, | ||||
| 		size_t count) | ||||
| static ssize_t set_gpio_mask(struct device *dev, struct device_attribute *attr, | ||||
| 			     const char *buf, size_t count) | ||||
| { | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val = simple_strtol(buf, NULL, 10); | ||||
| 	long mask; | ||||
| 	long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtol(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	data->gpio_mask = val & 0x1ffff; | ||||
|  | @ -1368,19 +1477,26 @@ static ssize_t set_gpio_mask(struct device *dev, struct device_attribute *attr, | |||
| 
 | ||||
| static DEVICE_ATTR(gpio_mask, S_IRUGO | S_IWUSR, show_gpio_mask, set_gpio_mask); | ||||
| 
 | ||||
| static ssize_t show_pwm_reg(struct device *dev, struct device_attribute *attr, char *buf) | ||||
| static ssize_t show_pwm_reg(struct device *dev, struct device_attribute *attr, | ||||
| 			    char *buf) | ||||
| { | ||||
| 	struct adm1026_data *data = adm1026_update_device(dev); | ||||
| 	return sprintf(buf, "%d\n", PWM_FROM_REG(data->pwm1.pwm)); | ||||
| } | ||||
| static ssize_t set_pwm_reg(struct device *dev, struct device_attribute *attr, const char *buf, | ||||
| 		size_t count) | ||||
| 
 | ||||
| static ssize_t set_pwm_reg(struct device *dev, struct device_attribute *attr, | ||||
| 			   const char *buf, size_t count) | ||||
| { | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 
 | ||||
| 	if (data->pwm1.enable == 1) { | ||||
| 		int val = simple_strtol(buf, NULL, 10); | ||||
| 		long val; | ||||
| 		int err; | ||||
| 
 | ||||
| 		err = kstrtol(buf, 10, &val); | ||||
| 		if (err) | ||||
| 			return err; | ||||
| 
 | ||||
| 		mutex_lock(&data->update_lock); | ||||
| 		data->pwm1.pwm = PWM_TO_REG(val); | ||||
|  | @ -1389,17 +1505,26 @@ static ssize_t set_pwm_reg(struct device *dev, struct device_attribute *attr, co | |||
| 	} | ||||
| 	return count; | ||||
| } | ||||
| static ssize_t show_auto_pwm_min(struct device *dev, struct device_attribute *attr, char *buf) | ||||
| 
 | ||||
| static ssize_t show_auto_pwm_min(struct device *dev, | ||||
| 				 struct device_attribute *attr, char *buf) | ||||
| { | ||||
| 	struct adm1026_data *data = adm1026_update_device(dev); | ||||
| 	return sprintf(buf, "%d\n", data->pwm1.auto_pwm_min); | ||||
| } | ||||
| static ssize_t set_auto_pwm_min(struct device *dev, struct device_attribute *attr, const char *buf, | ||||
| 
 | ||||
| static ssize_t set_auto_pwm_min(struct device *dev, | ||||
| 				struct device_attribute *attr, const char *buf, | ||||
| 				size_t count) | ||||
| { | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val = simple_strtol(buf, NULL, 10); | ||||
| 	unsigned long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtoul(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	data->pwm1.auto_pwm_min = SENSORS_LIMIT(val, 0, 255); | ||||
|  | @ -1411,44 +1536,53 @@ static ssize_t set_auto_pwm_min(struct device *dev, struct device_attribute *att | |||
| 	mutex_unlock(&data->update_lock); | ||||
| 	return count; | ||||
| } | ||||
| static ssize_t show_auto_pwm_max(struct device *dev, struct device_attribute *attr, char *buf) | ||||
| 
 | ||||
| static ssize_t show_auto_pwm_max(struct device *dev, | ||||
| 				 struct device_attribute *attr, char *buf) | ||||
| { | ||||
| 	return sprintf(buf, "%d\n", ADM1026_PWM_MAX); | ||||
| } | ||||
| static ssize_t show_pwm_enable(struct device *dev, struct device_attribute *attr, char *buf) | ||||
| 
 | ||||
| static ssize_t show_pwm_enable(struct device *dev, | ||||
| 			       struct device_attribute *attr, char *buf) | ||||
| { | ||||
| 	struct adm1026_data *data = adm1026_update_device(dev); | ||||
| 	return sprintf(buf, "%d\n", data->pwm1.enable); | ||||
| } | ||||
| static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr, const char *buf, | ||||
| 		size_t count) | ||||
| 
 | ||||
| static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr, | ||||
| 			      const char *buf, size_t count) | ||||
| { | ||||
| 	struct i2c_client *client = to_i2c_client(dev); | ||||
| 	struct adm1026_data *data = i2c_get_clientdata(client); | ||||
| 	int val = simple_strtol(buf, NULL, 10); | ||||
| 	int old_enable; | ||||
| 	unsigned long val; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = kstrtoul(buf, 10, &val); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	if (val >= 3) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if ((val >= 0) && (val < 3)) { | ||||
| 	mutex_lock(&data->update_lock); | ||||
| 	old_enable = data->pwm1.enable; | ||||
| 	data->pwm1.enable = val; | ||||
| 	data->config1 = (data->config1 & ~CFG1_PWM_AFC) | ||||
| 			| ((val == 2) ? CFG1_PWM_AFC : 0); | ||||
| 		adm1026_write_value(client, ADM1026_REG_CONFIG1, | ||||
| 			data->config1); | ||||
| 	adm1026_write_value(client, ADM1026_REG_CONFIG1, data->config1); | ||||
| 	if (val == 2) { /* apply pwm1_auto_pwm_min to pwm1 */ | ||||
| 		data->pwm1.pwm = PWM_TO_REG((data->pwm1.pwm & 0x0f) | | ||||
| 			PWM_MIN_TO_REG(data->pwm1.auto_pwm_min)); | ||||
| 			adm1026_write_value(client, ADM1026_REG_PWM, | ||||
| 				data->pwm1.pwm); | ||||
| 		adm1026_write_value(client, ADM1026_REG_PWM, data->pwm1.pwm); | ||||
| 	} else if (!((old_enable == 1) && (val == 1))) { | ||||
| 		/* set pwm to safe value */ | ||||
| 		data->pwm1.pwm = 255; | ||||
| 			adm1026_write_value(client, ADM1026_REG_PWM, | ||||
| 				data->pwm1.pwm); | ||||
| 		adm1026_write_value(client, ADM1026_REG_PWM, data->pwm1.pwm); | ||||
| 	} | ||||
| 	mutex_unlock(&data->update_lock); | ||||
| 	} | ||||
| 
 | ||||
| 	return count; | ||||
| } | ||||
| 
 | ||||
|  | @ -1716,7 +1850,8 @@ static int adm1026_probe(struct i2c_client *client, | |||
| 	adm1026_init_client(client); | ||||
| 
 | ||||
| 	/* Register sysfs hooks */ | ||||
| 	if ((err = sysfs_create_group(&client->dev.kobj, &adm1026_group))) | ||||
| 	err = sysfs_create_group(&client->dev.kobj, &adm1026_group); | ||||
| 	if (err) | ||||
| 		goto exitfree; | ||||
| 	if (data->config1 & CFG1_AIN8_9) | ||||
| 		err = sysfs_create_group(&client->dev.kobj, | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Guenter Roeck
						Guenter Roeck