mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-08 10:59:46 +00:00
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 <wenliang202407@163.com> Link: https://lore.kernel.org/r/20250506053741.4837-4-wenliang202407@163.com [groeck: Fixed checkpatch issue (space before and after arithmetic operators)] Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
committed by
Guenter Roeck
parent
6daaf15a11
commit
0d9f596b1f
@@ -270,10 +270,10 @@ static int ina238_read_in(struct device *dev, u32 attr, int channel,
|
|||||||
regval = (s16)regval;
|
regval = (s16)regval;
|
||||||
if (channel == 0)
|
if (channel == 0)
|
||||||
/* gain of 1 -> LSB / 4 */
|
/* gain of 1 -> LSB / 4 */
|
||||||
*val = (regval * INA238_SHUNT_VOLTAGE_LSB) /
|
*val = (regval * INA238_SHUNT_VOLTAGE_LSB) *
|
||||||
(1000 * (4 - data->gain + 1));
|
data->gain / (1000 * 4);
|
||||||
else
|
else
|
||||||
*val = (regval * INA238_BUS_VOLTAGE_LSB) / 1000;
|
*val = (regval * data->config->bus_voltage_lsb) / 1000;
|
||||||
break;
|
break;
|
||||||
case hwmon_in_max_alarm:
|
case hwmon_in_max_alarm:
|
||||||
case hwmon_in_min_alarm:
|
case hwmon_in_min_alarm:
|
||||||
@@ -298,8 +298,8 @@ static int ina238_write_in(struct device *dev, u32 attr, int channel,
|
|||||||
case 0:
|
case 0:
|
||||||
/* signed value, clamp to max range +/-163 mV */
|
/* signed value, clamp to max range +/-163 mV */
|
||||||
regval = clamp_val(val, -163, 163);
|
regval = clamp_val(val, -163, 163);
|
||||||
regval = (regval * 1000 * (4 - data->gain + 1)) /
|
regval = (regval * 1000 * 4) /
|
||||||
INA238_SHUNT_VOLTAGE_LSB;
|
(INA238_SHUNT_VOLTAGE_LSB * data->gain);
|
||||||
regval = clamp_val(regval, S16_MIN, S16_MAX);
|
regval = clamp_val(regval, S16_MIN, S16_MAX);
|
||||||
|
|
||||||
switch (attr) {
|
switch (attr) {
|
||||||
@@ -315,7 +315,7 @@ static int ina238_write_in(struct device *dev, u32 attr, int channel,
|
|||||||
case 1:
|
case 1:
|
||||||
/* signed value, positive values only. Clamp to max 102.396 V */
|
/* signed value, positive values only. Clamp to max 102.396 V */
|
||||||
regval = clamp_val(val, 0, 102396);
|
regval = clamp_val(val, 0, 102396);
|
||||||
regval = (regval * 1000) / INA238_BUS_VOLTAGE_LSB;
|
regval = (regval * 1000) / data->config->bus_voltage_lsb;
|
||||||
regval = clamp_val(regval, 0, S16_MAX);
|
regval = clamp_val(regval, 0, S16_MAX);
|
||||||
|
|
||||||
switch (attr) {
|
switch (attr) {
|
||||||
@@ -370,8 +370,8 @@ static int ina238_read_power(struct device *dev, u32 attr, long *val)
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
/* Fixed 1mA lsb, scaled by 1000000 to have result in uW */
|
/* Fixed 1mA lsb, scaled by 1000000 to have result in uW */
|
||||||
power = div_u64(regval * 1000ULL * INA238_FIXED_SHUNT *
|
power = div_u64(regval * 1000ULL * INA238_FIXED_SHUNT * data->gain *
|
||||||
data->gain, 20 * data->rshunt);
|
data->config->power_calculate_factor, 4 * 100 * data->rshunt);
|
||||||
/* Clamp value to maximum value of long */
|
/* Clamp value to maximum value of long */
|
||||||
*val = clamp_val(power, 0, LONG_MAX);
|
*val = clamp_val(power, 0, LONG_MAX);
|
||||||
break;
|
break;
|
||||||
@@ -381,8 +381,8 @@ static int ina238_read_power(struct device *dev, u32 attr, long *val)
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
/* Fixed 1mA lsb, scaled by 1000000 to have result in uW */
|
/* Fixed 1mA lsb, scaled by 1000000 to have result in uW */
|
||||||
power = div_u64(regval * 1000ULL * INA238_FIXED_SHUNT *
|
power = div_u64(regval * 1000ULL * INA238_FIXED_SHUNT * data->gain *
|
||||||
data->gain, 20 * data->rshunt);
|
data->config->power_calculate_factor, 4 * 100 * data->rshunt);
|
||||||
/* Clamp value to maximum value of long */
|
/* Clamp value to maximum value of long */
|
||||||
*val = clamp_val(power, 0, LONG_MAX);
|
*val = clamp_val(power, 0, LONG_MAX);
|
||||||
break;
|
break;
|
||||||
@@ -395,8 +395,8 @@ static int ina238_read_power(struct device *dev, u32 attr, long *val)
|
|||||||
* Truncated 24-bit compare register, lower 8-bits are
|
* Truncated 24-bit compare register, lower 8-bits are
|
||||||
* truncated. Same conversion to/from uW as POWER register.
|
* truncated. Same conversion to/from uW as POWER register.
|
||||||
*/
|
*/
|
||||||
power = div_u64((regval << 8) * 1000ULL * INA238_FIXED_SHUNT *
|
power = div_u64((regval << 8) * 1000ULL * INA238_FIXED_SHUNT * data->gain *
|
||||||
data->gain, 20 * data->rshunt);
|
data->config->power_calculate_factor, 4 * 100 * data->rshunt);
|
||||||
/* Clamp value to maximum value of long */
|
/* Clamp value to maximum value of long */
|
||||||
*val = clamp_val(power, 0, LONG_MAX);
|
*val = clamp_val(power, 0, LONG_MAX);
|
||||||
break;
|
break;
|
||||||
@@ -428,7 +428,7 @@ static int ina238_write_power(struct device *dev, u32 attr, long val)
|
|||||||
* register.
|
* register.
|
||||||
*/
|
*/
|
||||||
regval = clamp_val(val, 0, LONG_MAX);
|
regval = clamp_val(val, 0, LONG_MAX);
|
||||||
regval = div_u64(val * 20ULL * data->rshunt,
|
regval = div_u64(val * 4 * 100 * data->rshunt, data->config->power_calculate_factor *
|
||||||
1000ULL * INA238_FIXED_SHUNT * data->gain);
|
1000ULL * INA238_FIXED_SHUNT * data->gain);
|
||||||
regval = clamp_val(regval >> 8, 0, U16_MAX);
|
regval = clamp_val(regval >> 8, 0, U16_MAX);
|
||||||
|
|
||||||
@@ -446,17 +446,17 @@ static int ina238_read_temp(struct device *dev, u32 attr, long *val)
|
|||||||
err = regmap_read(data->regmap, INA238_DIE_TEMP, ®val);
|
err = regmap_read(data->regmap, INA238_DIE_TEMP, ®val);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
/* Signed, result in mC */
|
||||||
/* Signed, bits 15-4 of register, result in mC */
|
*val = div_s64(((s64)((s16)regval) >> data->config->temp_shift) *
|
||||||
*val = ((s16)regval >> 4) * INA238_DIE_TEMP_LSB;
|
(s64)data->config->temp_lsb, 10000);
|
||||||
break;
|
break;
|
||||||
case hwmon_temp_max:
|
case hwmon_temp_max:
|
||||||
err = regmap_read(data->regmap, INA238_TEMP_LIMIT, ®val);
|
err = regmap_read(data->regmap, INA238_TEMP_LIMIT, ®val);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
/* Signed, result in mC */
|
||||||
/* Signed, bits 15-4 of register, result in mC */
|
*val = div_s64(((s64)((s16)regval) >> data->config->temp_shift) *
|
||||||
*val = ((s16)regval >> 4) * INA238_DIE_TEMP_LSB;
|
(s64)data->config->temp_lsb, 10000);
|
||||||
break;
|
break;
|
||||||
case hwmon_temp_max_alarm:
|
case hwmon_temp_max_alarm:
|
||||||
err = regmap_read(data->regmap, INA238_DIAG_ALERT, ®val);
|
err = regmap_read(data->regmap, INA238_DIAG_ALERT, ®val);
|
||||||
@@ -480,9 +480,10 @@ static int ina238_write_temp(struct device *dev, u32 attr, long val)
|
|||||||
if (attr != hwmon_temp_max)
|
if (attr != hwmon_temp_max)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
/* Signed, bits 15-4 of register */
|
/* Signed */
|
||||||
regval = (val / INA238_DIE_TEMP_LSB) << 4;
|
regval = clamp_val(val, -40000, 125000);
|
||||||
regval = clamp_val(regval, S16_MIN, S16_MAX) & 0xfff0;
|
regval = div_s64(val * 10000, data->config->temp_lsb) << data->config->temp_shift;
|
||||||
|
regval = clamp_val(regval, S16_MIN, S16_MAX) & (0xffff << data->config->temp_shift);
|
||||||
|
|
||||||
return regmap_write(data->regmap, INA238_TEMP_LIMIT, regval);
|
return regmap_write(data->regmap, INA238_TEMP_LIMIT, regval);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user