Commit 9f6ad1ce authored by Guenter Roeck's avatar Guenter Roeck

hwmon: (pmbus) Fix LINEAR16 data format

LINEAR16 data format is unsigned, not signed. Impact is that affected
attributes report negative values in the upper half of the supported
value range.
Signed-off-by: default avatarGuenter Roeck <guenter.roeck@ericsson.com>
parent 8677011a
...@@ -359,20 +359,21 @@ static struct pmbus_data *pmbus_update_device(struct device *dev) ...@@ -359,20 +359,21 @@ static struct pmbus_data *pmbus_update_device(struct device *dev)
static int pmbus_reg2data_linear(struct pmbus_data *data, static int pmbus_reg2data_linear(struct pmbus_data *data,
struct pmbus_sensor *sensor) struct pmbus_sensor *sensor)
{ {
s16 exponent, mantissa; s16 exponent;
s32 mantissa;
long val; long val;
if (sensor->class == PSC_VOLTAGE_OUT) { if (sensor->class == PSC_VOLTAGE_OUT) { /* LINEAR16 */
exponent = data->exponent; exponent = data->exponent;
mantissa = (s16) sensor->data; mantissa = (u16) sensor->data;
} else { } else { /* LINEAR11 */
exponent = (sensor->data >> 11) & 0x001f; exponent = (sensor->data >> 11) & 0x001f;
mantissa = sensor->data & 0x07ff; mantissa = sensor->data & 0x07ff;
if (exponent > 0x0f) if (exponent > 0x0f)
exponent |= 0xffe0; /* sign extend exponent */ exponent |= 0xffe0; /* sign extend exponent */
if (mantissa > 0x03ff) if (mantissa > 0x03ff)
mantissa |= 0xf800; /* sign extend mantissa */ mantissa |= 0xfffff800; /* sign extend mantissa */
} }
val = mantissa; val = mantissa;
...@@ -454,19 +455,18 @@ static int pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor) ...@@ -454,19 +455,18 @@ static int pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor)
static u16 pmbus_data2reg_linear(struct pmbus_data *data, static u16 pmbus_data2reg_linear(struct pmbus_data *data,
enum pmbus_sensor_classes class, long val) enum pmbus_sensor_classes class, long val)
{ {
s16 exponent = 0, mantissa = 0; s16 exponent = 0, mantissa;
bool negative = false; bool negative = false;
/* simple case */ /* simple case */
if (val == 0) if (val == 0)
return 0; return 0;
if (val < 0) {
negative = true;
val = -val;
}
if (class == PSC_VOLTAGE_OUT) { if (class == PSC_VOLTAGE_OUT) {
/* LINEAR16 does not support negative voltages */
if (val < 0)
return 0;
/* /*
* For a static exponents, we don't have a choice * For a static exponents, we don't have a choice
* but to adjust the value to it. * but to adjust the value to it.
...@@ -476,9 +476,12 @@ static u16 pmbus_data2reg_linear(struct pmbus_data *data, ...@@ -476,9 +476,12 @@ static u16 pmbus_data2reg_linear(struct pmbus_data *data,
else else
val >>= data->exponent; val >>= data->exponent;
val = DIV_ROUND_CLOSEST(val, 1000); val = DIV_ROUND_CLOSEST(val, 1000);
if (val > 0x7fff) return val & 0xffff;
val = 0x7fff; }
return negative ? -val : val;
if (val < 0) {
negative = true;
val = -val;
} }
/* Power is in uW. Convert to mW before converting. */ /* Power is in uW. Convert to mW before converting. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment