Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

power: supply: max17042: consider task period (max77759)

Several (register) values reported by the fuel gauge depend on its
internal task period and it needs to be taken into account when
calculating results. All relevant example formulas in the data sheet
assume the default task period (of 5760) and final results need to be
adjusted based on the task period in effect.

Update the code as and where necessary.

Reviewed-by: Peter Griffin <peter.griffin@linaro.org>
Signed-off-by: André Draszik <andre.draszik@linaro.org>
Link: https://patch.msgid.link/20260302-max77759-fg-v3-10-3c5f01dbda23@linaro.org
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>

authored by

André Draszik and committed by
Sebastian Reichel
83a86e27 2864fb6a

+21
+20
drivers/power/supply/max17042_battery.c
··· 61 61 struct work_struct work; 62 62 int init_complete; 63 63 int irq; 64 + int task_period; 64 65 }; 65 66 66 67 static enum power_supply_property max17042_battery_props[] = { ··· 332 331 return ret; 333 332 334 333 data64 = data * 5000000ll; 334 + data64 *= chip->task_period; 335 + do_div(data64, MAX17042_DEFAULT_TASK_PERIOD); 335 336 do_div(data64, chip->pdata->r_sns); 336 337 val->intval = data64; 337 338 break; ··· 343 340 return ret; 344 341 345 342 data64 = data * 5000000ll; 343 + data64 *= chip->task_period; 344 + do_div(data64, MAX17042_DEFAULT_TASK_PERIOD); 346 345 do_div(data64, chip->pdata->r_sns); 347 346 val->intval = data64; 348 347 break; ··· 354 349 return ret; 355 350 356 351 data64 = data * 5000000ll; 352 + data64 *= chip->task_period; 353 + do_div(data64, MAX17042_DEFAULT_TASK_PERIOD); 357 354 do_div(data64, chip->pdata->r_sns); 358 355 val->intval = data64; 359 356 break; ··· 365 358 return ret; 366 359 367 360 data64 = sign_extend64(data, 15) * 5000000ll; 361 + data64 *= chip->task_period; 362 + data64 = div_s64(data64, MAX17042_DEFAULT_TASK_PERIOD); 368 363 val->intval = div_s64(data64, chip->pdata->r_sns); 369 364 break; 370 365 case POWER_SUPPLY_PROP_TEMP: ··· 1150 1141 regmap_write(chip->regmap, MAX17042_MiscCFG, 0x0003); 1151 1142 regmap_write(chip->regmap, MAX17042_LearnCFG, 0x0007); 1152 1143 } 1144 + 1145 + chip->task_period = MAX17042_DEFAULT_TASK_PERIOD; 1146 + if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX77759) { 1147 + ret = regmap_read(chip->regmap, MAX17042_TaskPeriod, &val); 1148 + if (ret) 1149 + return dev_err_probe(dev, ret, 1150 + "failed to read task period\n"); 1151 + chip->task_period = val; 1152 + } 1153 + dev_dbg(dev, "task period: %#.4x (%d)\n", chip->task_period, 1154 + chip->task_period); 1153 1155 1154 1156 chip->battery = devm_power_supply_register(dev, max17042_desc, 1155 1157 &psy_cfg);
+1
include/linux/power/max17042_battery.h
··· 17 17 #define MAX17042_DEFAULT_VMAX (4500) /* LiHV cell max */ 18 18 #define MAX17042_DEFAULT_TEMP_MIN (0) /* For sys without temp sensor */ 19 19 #define MAX17042_DEFAULT_TEMP_MAX (700) /* 70 degrees Celcius */ 20 + #define MAX17042_DEFAULT_TASK_PERIOD (5760) 20 21 21 22 /* Consider RepCap which is less then 10 units below FullCAP full */ 22 23 #define MAX17042_FULL_THRESHOLD 10