@@ -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