]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
power: supply: max17042: consider task period (max77759)
authorAndré Draszik <andre.draszik@linaro.org>
Mon, 2 Mar 2026 13:32:09 +0000 (13:32 +0000)
committerSebastian Reichel <sebastian.reichel@collabora.com>
Tue, 3 Mar 2026 22:58:07 +0000 (23:58 +0100)
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>
drivers/power/supply/max17042_battery.c
include/linux/power/max17042_battery.h

index b9a21cef2cc61988b52ae6e0e0db261aff906b75..bafbf87060559787c528416784022c50fc555841 100644 (file)
@@ -61,6 +61,7 @@ struct max17042_chip {
        struct work_struct work;
        int    init_complete;
        int    irq;
+       int    task_period;
 };
 
 static enum power_supply_property max17042_battery_props[] = {
@@ -331,6 +332,8 @@ static int max17042_get_property(struct power_supply *psy,
                        return ret;
 
                data64 = data * 5000000ll;
+               data64 *= chip->task_period;
+               do_div(data64, MAX17042_DEFAULT_TASK_PERIOD);
                do_div(data64, chip->pdata->r_sns);
                val->intval = data64;
                break;
@@ -340,6 +343,8 @@ static int max17042_get_property(struct power_supply *psy,
                        return ret;
 
                data64 = data * 5000000ll;
+               data64 *= chip->task_period;
+               do_div(data64, MAX17042_DEFAULT_TASK_PERIOD);
                do_div(data64, chip->pdata->r_sns);
                val->intval = data64;
                break;
@@ -349,6 +354,8 @@ static int max17042_get_property(struct power_supply *psy,
                        return ret;
 
                data64 = data * 5000000ll;
+               data64 *= chip->task_period;
+               do_div(data64, MAX17042_DEFAULT_TASK_PERIOD);
                do_div(data64, chip->pdata->r_sns);
                val->intval = data64;
                break;
@@ -358,6 +365,8 @@ static int max17042_get_property(struct power_supply *psy,
                        return ret;
 
                data64 = sign_extend64(data, 15) * 5000000ll;
+               data64 *= chip->task_period;
+               data64 = div_s64(data64, MAX17042_DEFAULT_TASK_PERIOD);
                val->intval = div_s64(data64, chip->pdata->r_sns);
                break;
        case POWER_SUPPLY_PROP_TEMP:
@@ -1142,6 +1151,17 @@ static int max17042_probe(struct i2c_client *client, struct device *dev, int irq
                regmap_write(chip->regmap, MAX17042_LearnCFG, 0x0007);
        }
 
+       chip->task_period = MAX17042_DEFAULT_TASK_PERIOD;
+       if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX77759) {
+               ret = regmap_read(chip->regmap, MAX17042_TaskPeriod, &val);
+               if (ret)
+                       return dev_err_probe(dev, ret,
+                                            "failed to read task period\n");
+               chip->task_period = val;
+       }
+       dev_dbg(dev, "task period: %#.4x (%d)\n", chip->task_period,
+               chip->task_period);
+
        chip->battery = devm_power_supply_register(dev, max17042_desc,
                                                   &psy_cfg);
        if (IS_ERR(chip->battery))
index 05097f08ea36a8c97628fddba8a3bbce29fb6a98..d5b08313cf11328dc0e4d5cdaf242beecc5b88a8 100644 (file)
@@ -17,6 +17,7 @@
 #define MAX17042_DEFAULT_VMAX          (4500) /* LiHV cell max */
 #define MAX17042_DEFAULT_TEMP_MIN      (0)    /* For sys without temp sensor */
 #define MAX17042_DEFAULT_TEMP_MAX      (700)  /* 70 degrees Celcius */
+#define MAX17042_DEFAULT_TASK_PERIOD   (5760)
 
 /* Consider RepCap which is less then 10 units below FullCAP full */
 #define MAX17042_FULL_THRESHOLD                10