@@ -270,10 +270,10 @@ static int ina238_read_in(struct device *dev, u32 attr, int channel,
270
270
regval = (s16 )regval ;
271
271
if (channel == 0 )
272
272
/* 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 );
275
275
else
276
- * val = (regval * INA238_BUS_VOLTAGE_LSB ) / 1000 ;
276
+ * val = (regval * data -> config -> bus_voltage_lsb ) / 1000 ;
277
277
break ;
278
278
case hwmon_in_max_alarm :
279
279
case hwmon_in_min_alarm :
@@ -298,8 +298,8 @@ static int ina238_write_in(struct device *dev, u32 attr, int channel,
298
298
case 0 :
299
299
/* signed value, clamp to max range +/-163 mV */
300
300
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 ) ;
303
303
regval = clamp_val (regval , S16_MIN , S16_MAX );
304
304
305
305
switch (attr ) {
@@ -315,7 +315,7 @@ static int ina238_write_in(struct device *dev, u32 attr, int channel,
315
315
case 1 :
316
316
/* signed value, positive values only. Clamp to max 102.396 V */
317
317
regval = clamp_val (val , 0 , 102396 );
318
- regval = (regval * 1000 ) / INA238_BUS_VOLTAGE_LSB ;
318
+ regval = (regval * 1000 ) / data -> config -> bus_voltage_lsb ;
319
319
regval = clamp_val (regval , 0 , S16_MAX );
320
320
321
321
switch (attr ) {
@@ -370,8 +370,8 @@ static int ina238_read_power(struct device *dev, u32 attr, long *val)
370
370
return err ;
371
371
372
372
/* 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 );
375
375
/* Clamp value to maximum value of long */
376
376
* val = clamp_val (power , 0 , LONG_MAX );
377
377
break ;
@@ -381,8 +381,8 @@ static int ina238_read_power(struct device *dev, u32 attr, long *val)
381
381
return err ;
382
382
383
383
/* 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 );
386
386
/* Clamp value to maximum value of long */
387
387
* val = clamp_val (power , 0 , LONG_MAX );
388
388
break ;
@@ -395,8 +395,8 @@ static int ina238_read_power(struct device *dev, u32 attr, long *val)
395
395
* Truncated 24-bit compare register, lower 8-bits are
396
396
* truncated. Same conversion to/from uW as POWER register.
397
397
*/
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 );
400
400
/* Clamp value to maximum value of long */
401
401
* val = clamp_val (power , 0 , LONG_MAX );
402
402
break ;
@@ -428,8 +428,8 @@ static int ina238_write_power(struct device *dev, u32 attr, long val)
428
428
* register.
429
429
*/
430
430
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 );
433
433
regval = clamp_val (regval >> 8 , 0 , U16_MAX );
434
434
435
435
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)
446
446
err = regmap_read (data -> regmap , INA238_DIE_TEMP , & regval );
447
447
if (err )
448
448
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 ) ;
452
452
break ;
453
453
case hwmon_temp_max :
454
454
err = regmap_read (data -> regmap , INA238_TEMP_LIMIT , & regval );
455
455
if (err )
456
456
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 ) ;
460
460
break ;
461
461
case hwmon_temp_max_alarm :
462
462
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)
480
480
if (attr != hwmon_temp_max )
481
481
return - EOPNOTSUPP ;
482
482
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 );
486
487
487
488
return regmap_write (data -> regmap , INA238_TEMP_LIMIT , regval );
488
489
}
0 commit comments