forked from mirrors/linux
		
	hwmon: (tmp513) Use SI constants from units.h
MILLI and MICRO may be used in the driver to make code more robust against possible miscalculations. Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Link: https://lore.kernel.org/r/20231128180654.395692-4-andriy.shevchenko@linux.intel.com Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
		
							parent
							
								
									df989762bc
								
							
						
					
					
						commit
						f07f9d2467
					
				
					 1 changed files with 10 additions and 11 deletions
				
			
		|  | @ -32,6 +32,7 @@ | |||
| #include <linux/regmap.h> | ||||
| #include <linux/slab.h> | ||||
| #include <linux/types.h> | ||||
| #include <linux/units.h> | ||||
| 
 | ||||
| // Common register definition
 | ||||
| #define TMP51X_SHUNT_CONFIG		0x00 | ||||
|  | @ -101,8 +102,8 @@ | |||
| #define TMP51X_REMOTE_TEMP_LIMIT_2_POS		8 | ||||
| #define TMP513_REMOTE_TEMP_LIMIT_3_POS		7 | ||||
| 
 | ||||
| #define TMP51X_VBUS_RANGE_32V		32000000 | ||||
| #define TMP51X_VBUS_RANGE_16V		16000000 | ||||
| #define TMP51X_VBUS_RANGE_32V		(32 * MICRO) | ||||
| #define TMP51X_VBUS_RANGE_16V		(16 * MICRO) | ||||
| 
 | ||||
| // Max and Min value
 | ||||
| #define MAX_BUS_VOLTAGE_32_LIMIT	32764 | ||||
|  | @ -204,7 +205,7 @@ static int tmp51x_get_value(struct tmp51x_data *data, u8 reg, u8 pos, | |||
| 		 * on the pga gain setting. 1lsb = 10uV | ||||
| 		 */ | ||||
| 		*val = sign_extend32(regval, 17 - tmp51x_get_pga_shift(data)); | ||||
| 		*val = DIV_ROUND_CLOSEST(*val * 10000, data->shunt_uohms); | ||||
| 		*val = DIV_ROUND_CLOSEST(*val * 10 * MILLI, data->shunt_uohms); | ||||
| 		break; | ||||
| 	case TMP51X_BUS_VOLTAGE_RESULT: | ||||
| 	case TMP51X_BUS_VOLTAGE_H_LIMIT: | ||||
|  | @ -220,7 +221,7 @@ static int tmp51x_get_value(struct tmp51x_data *data, u8 reg, u8 pos, | |||
| 	case TMP51X_BUS_CURRENT_RESULT: | ||||
| 		// Current = (ShuntVoltage * CalibrationRegister) / 4096
 | ||||
| 		*val = sign_extend32(regval, 16) * data->curr_lsb_ua; | ||||
| 		*val = DIV_ROUND_CLOSEST(*val, 1000); | ||||
| 		*val = DIV_ROUND_CLOSEST(*val, MILLI); | ||||
| 		break; | ||||
| 	case TMP51X_LOCAL_TEMP_RESULT: | ||||
| 	case TMP51X_REMOTE_TEMP_RESULT_1: | ||||
|  | @ -260,7 +261,7 @@ static int tmp51x_set_value(struct tmp51x_data *data, u8 reg, long val) | |||
| 		 * The user enter current value and we convert it to | ||||
| 		 * voltage. 1lsb = 10uV | ||||
| 		 */ | ||||
| 		val = DIV_ROUND_CLOSEST(val * data->shunt_uohms, 10000); | ||||
| 		val = DIV_ROUND_CLOSEST(val * data->shunt_uohms, 10 * MILLI); | ||||
| 		max_val = U16_MAX >> tmp51x_get_pga_shift(data); | ||||
| 		regval = clamp_val(val, -max_val, max_val); | ||||
| 		break; | ||||
|  | @ -550,18 +551,16 @@ static int tmp51x_calibrate(struct tmp51x_data *data) | |||
| 	if (data->shunt_uohms == 0) | ||||
| 		return regmap_write(data->regmap, TMP51X_SHUNT_CALIBRATION, 0); | ||||
| 
 | ||||
| 	max_curr_ma = DIV_ROUND_CLOSEST_ULL(vshunt_max * 1000 * 1000, | ||||
| 					    data->shunt_uohms); | ||||
| 	max_curr_ma = DIV_ROUND_CLOSEST_ULL(vshunt_max * MICRO, data->shunt_uohms); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Calculate the minimal bit resolution for the current and the power. | ||||
| 	 * Those values will be used during register interpretation. | ||||
| 	 */ | ||||
| 	data->curr_lsb_ua = DIV_ROUND_CLOSEST_ULL(max_curr_ma * 1000, 32767); | ||||
| 	data->curr_lsb_ua = DIV_ROUND_CLOSEST_ULL(max_curr_ma * MILLI, 32767); | ||||
| 	data->pwr_lsb_uw = 20 * data->curr_lsb_ua; | ||||
| 
 | ||||
| 	div = DIV_ROUND_CLOSEST_ULL(data->curr_lsb_ua * data->shunt_uohms, | ||||
| 				    1000 * 1000); | ||||
| 	div = DIV_ROUND_CLOSEST_ULL(data->curr_lsb_ua * data->shunt_uohms, MICRO); | ||||
| 
 | ||||
| 	return regmap_write(data->regmap, TMP51X_SHUNT_CALIBRATION, | ||||
| 			    DIV_ROUND_CLOSEST(40960, div)); | ||||
|  | @ -678,7 +677,7 @@ static int tmp51x_read_properties(struct device *dev, struct tmp51x_data *data) | |||
| 				       data->max_channels - 1); | ||||
| 
 | ||||
| 	// Check if shunt value is compatible with pga-gain
 | ||||
| 	if (data->shunt_uohms > data->pga_gain * 40 * 1000 * 1000) { | ||||
| 	if (data->shunt_uohms > data->pga_gain * 40 * MICRO) { | ||||
| 		return dev_err_probe(dev, -EINVAL, | ||||
| 				     "shunt-resistor: %u too big for pga_gain: %u\n", | ||||
| 				     data->shunt_uohms, data->pga_gain); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Andy Shevchenko
						Andy Shevchenko