Skip to content

Commit 0d9f596

Browse files
Wenliang Yangroeck
authored andcommitted
hwmon: (ina238) Modify the calculation formula to adapt to different chips
Modify the calculation formula to adapt to different chips. Signed-off-by: Wenliang Yan <[email protected]> Link: https://lore.kernel.org/r/[email protected] [groeck: Fixed checkpatch issue (space before and after arithmetic operators)] Signed-off-by: Guenter Roeck <[email protected]>
1 parent 6daaf15 commit 0d9f596

File tree

1 file changed

+24
-23
lines changed

1 file changed

+24
-23
lines changed

drivers/hwmon/ina238.c

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -270,10 +270,10 @@ static int ina238_read_in(struct device *dev, u32 attr, int channel,
270270
regval = (s16)regval;
271271
if (channel == 0)
272272
/* gain of 1 -> LSB / 4 */
273-
*val = (regval * INA238_SHUNT_VOLTAGE_LSB) /
274-
(1000 * (4 - data->gain + 1));
273+
*val = (regval * INA238_SHUNT_VOLTAGE_LSB) *
274+
data->gain / (1000 * 4);
275275
else
276-
*val = (regval * INA238_BUS_VOLTAGE_LSB) / 1000;
276+
*val = (regval * data->config->bus_voltage_lsb) / 1000;
277277
break;
278278
case hwmon_in_max_alarm:
279279
case hwmon_in_min_alarm:
@@ -298,8 +298,8 @@ static int ina238_write_in(struct device *dev, u32 attr, int channel,
298298
case 0:
299299
/* signed value, clamp to max range +/-163 mV */
300300
regval = clamp_val(val, -163, 163);
301-
regval = (regval * 1000 * (4 - data->gain + 1)) /
302-
INA238_SHUNT_VOLTAGE_LSB;
301+
regval = (regval * 1000 * 4) /
302+
(INA238_SHUNT_VOLTAGE_LSB * data->gain);
303303
regval = clamp_val(regval, S16_MIN, S16_MAX);
304304

305305
switch (attr) {
@@ -315,7 +315,7 @@ static int ina238_write_in(struct device *dev, u32 attr, int channel,
315315
case 1:
316316
/* signed value, positive values only. Clamp to max 102.396 V */
317317
regval = clamp_val(val, 0, 102396);
318-
regval = (regval * 1000) / INA238_BUS_VOLTAGE_LSB;
318+
regval = (regval * 1000) / data->config->bus_voltage_lsb;
319319
regval = clamp_val(regval, 0, S16_MAX);
320320

321321
switch (attr) {
@@ -370,8 +370,8 @@ static int ina238_read_power(struct device *dev, u32 attr, long *val)
370370
return err;
371371

372372
/* Fixed 1mA lsb, scaled by 1000000 to have result in uW */
373-
power = div_u64(regval * 1000ULL * INA238_FIXED_SHUNT *
374-
data->gain, 20 * data->rshunt);
373+
power = div_u64(regval * 1000ULL * INA238_FIXED_SHUNT * data->gain *
374+
data->config->power_calculate_factor, 4 * 100 * data->rshunt);
375375
/* Clamp value to maximum value of long */
376376
*val = clamp_val(power, 0, LONG_MAX);
377377
break;
@@ -381,8 +381,8 @@ static int ina238_read_power(struct device *dev, u32 attr, long *val)
381381
return err;
382382

383383
/* Fixed 1mA lsb, scaled by 1000000 to have result in uW */
384-
power = div_u64(regval * 1000ULL * INA238_FIXED_SHUNT *
385-
data->gain, 20 * data->rshunt);
384+
power = div_u64(regval * 1000ULL * INA238_FIXED_SHUNT * data->gain *
385+
data->config->power_calculate_factor, 4 * 100 * data->rshunt);
386386
/* Clamp value to maximum value of long */
387387
*val = clamp_val(power, 0, LONG_MAX);
388388
break;
@@ -395,8 +395,8 @@ static int ina238_read_power(struct device *dev, u32 attr, long *val)
395395
* Truncated 24-bit compare register, lower 8-bits are
396396
* truncated. Same conversion to/from uW as POWER register.
397397
*/
398-
power = div_u64((regval << 8) * 1000ULL * INA238_FIXED_SHUNT *
399-
data->gain, 20 * data->rshunt);
398+
power = div_u64((regval << 8) * 1000ULL * INA238_FIXED_SHUNT * data->gain *
399+
data->config->power_calculate_factor, 4 * 100 * data->rshunt);
400400
/* Clamp value to maximum value of long */
401401
*val = clamp_val(power, 0, LONG_MAX);
402402
break;
@@ -428,8 +428,8 @@ static int ina238_write_power(struct device *dev, u32 attr, long val)
428428
* register.
429429
*/
430430
regval = clamp_val(val, 0, LONG_MAX);
431-
regval = div_u64(val * 20ULL * data->rshunt,
432-
1000ULL * INA238_FIXED_SHUNT * data->gain);
431+
regval = div_u64(val * 4 * 100 * data->rshunt, data->config->power_calculate_factor *
432+
1000ULL * INA238_FIXED_SHUNT * data->gain);
433433
regval = clamp_val(regval >> 8, 0, U16_MAX);
434434

435435
return regmap_write(data->regmap, INA238_POWER_LIMIT, regval);
@@ -446,17 +446,17 @@ static int ina238_read_temp(struct device *dev, u32 attr, long *val)
446446
err = regmap_read(data->regmap, INA238_DIE_TEMP, &regval);
447447
if (err)
448448
return err;
449-
450-
/* Signed, bits 15-4 of register, result in mC */
451-
*val = ((s16)regval >> 4) * INA238_DIE_TEMP_LSB;
449+
/* Signed, result in mC */
450+
*val = div_s64(((s64)((s16)regval) >> data->config->temp_shift) *
451+
(s64)data->config->temp_lsb, 10000);
452452
break;
453453
case hwmon_temp_max:
454454
err = regmap_read(data->regmap, INA238_TEMP_LIMIT, &regval);
455455
if (err)
456456
return err;
457-
458-
/* Signed, bits 15-4 of register, result in mC */
459-
*val = ((s16)regval >> 4) * INA238_DIE_TEMP_LSB;
457+
/* Signed, result in mC */
458+
*val = div_s64(((s64)((s16)regval) >> data->config->temp_shift) *
459+
(s64)data->config->temp_lsb, 10000);
460460
break;
461461
case hwmon_temp_max_alarm:
462462
err = regmap_read(data->regmap, INA238_DIAG_ALERT, &regval);
@@ -480,9 +480,10 @@ static int ina238_write_temp(struct device *dev, u32 attr, long val)
480480
if (attr != hwmon_temp_max)
481481
return -EOPNOTSUPP;
482482

483-
/* Signed, bits 15-4 of register */
484-
regval = (val / INA238_DIE_TEMP_LSB) << 4;
485-
regval = clamp_val(regval, S16_MIN, S16_MAX) & 0xfff0;
483+
/* Signed */
484+
regval = clamp_val(val, -40000, 125000);
485+
regval = div_s64(val * 10000, data->config->temp_lsb) << data->config->temp_shift;
486+
regval = clamp_val(regval, S16_MIN, S16_MAX) & (0xffff << data->config->temp_shift);
486487

487488
return regmap_write(data->regmap, INA238_TEMP_LIMIT, regval);
488489
}

0 commit comments

Comments
 (0)