diff options
Diffstat (limited to 'drivers/hwmon/tmp513.c')
| -rw-r--r-- | drivers/hwmon/tmp513.c | 17 | 
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/hwmon/tmp513.c b/drivers/hwmon/tmp513.c index 926d28cd3fab..5acbfd7d088d 100644 --- a/drivers/hwmon/tmp513.c +++ b/drivers/hwmon/tmp513.c @@ -182,7 +182,7 @@ struct tmp51x_data {  	struct regmap *regmap;  }; -// Set the shift based on the gain 8=4, 4=3, 2=2, 1=1 +// Set the shift based on the gain: 8 -> 1, 4 -> 2, 2 -> 3, 1 -> 4  static inline u8 tmp51x_get_pga_shift(struct tmp51x_data *data)  {  	return 5 - ffs(data->pga_gain); @@ -204,8 +204,11 @@ static int tmp51x_get_value(struct tmp51x_data *data, u8 reg, u8 pos,  		 * 2's complement number shifted by one to four depending  		 * on the pga gain setting. 1lsb = 10uV  		 */ -		*val = sign_extend32(regval, 17 - tmp51x_get_pga_shift(data)); -		*val = DIV_ROUND_CLOSEST(*val * 10 * MILLI, data->shunt_uohms); +		*val = sign_extend32(regval, +				     reg == TMP51X_SHUNT_CURRENT_RESULT ? +				     16 - tmp51x_get_pga_shift(data) : 15); +		*val = DIV_ROUND_CLOSEST(*val * 10 * (long)MILLI, (long)data->shunt_uohms); +  		break;  	case TMP51X_BUS_VOLTAGE_RESULT:  	case TMP51X_BUS_VOLTAGE_H_LIMIT: @@ -220,8 +223,8 @@ static int tmp51x_get_value(struct tmp51x_data *data, u8 reg, u8 pos,  		break;  	case TMP51X_BUS_CURRENT_RESULT:  		// Current = (ShuntVoltage * CalibrationRegister) / 4096 -		*val = sign_extend32(regval, 16) * data->curr_lsb_ua; -		*val = DIV_ROUND_CLOSEST(*val, MILLI); +		*val = sign_extend32(regval, 15) * (long)data->curr_lsb_ua; +		*val = DIV_ROUND_CLOSEST(*val, (long)MILLI);  		break;  	case TMP51X_LOCAL_TEMP_RESULT:  	case TMP51X_REMOTE_TEMP_RESULT_1: @@ -232,7 +235,7 @@ static int tmp51x_get_value(struct tmp51x_data *data, u8 reg, u8 pos,  	case TMP51X_REMOTE_TEMP_LIMIT_2:  	case TMP513_REMOTE_TEMP_LIMIT_3:  		// 1lsb = 0.0625 degrees centigrade -		*val = sign_extend32(regval, 16) >> TMP51X_TEMP_SHIFT; +		*val = sign_extend32(regval, 15) >> TMP51X_TEMP_SHIFT;  		*val = DIV_ROUND_CLOSEST(*val * 625, 10);  		break;  	case TMP51X_N_FACTOR_AND_HYST_1: @@ -261,7 +264,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, 10 * MILLI); +		val = DIV_ROUND_CLOSEST(val * (long)data->shunt_uohms, 10 * (long)MILLI);  		max_val = U16_MAX >> tmp51x_get_pga_shift(data);  		regval = clamp_val(val, -max_val, max_val);  		break;  | 
