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: Guenter Roeck <guenter.roeck@ericsson.com>
This commit is contained in:
parent
8677011a5d
commit
9f6ad1ce64
@ -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)
|
|||||||
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,
|
|||||||
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. */
|
||||||
|
Loading…
Reference in New Issue
Block a user