Merge tag 'rtc-5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux
[linux-2.6-microblaze.git] / drivers / power / supply / max17042_battery.c
index f284547..79d4b59 100644 (file)
@@ -78,6 +78,7 @@ static enum power_supply_property max17042_battery_props[] = {
        POWER_SUPPLY_PROP_CHARGE_FULL,
        POWER_SUPPLY_PROP_CHARGE_NOW,
        POWER_SUPPLY_PROP_CHARGE_COUNTER,
+       POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
        POWER_SUPPLY_PROP_TEMP,
        POWER_SUPPLY_PROP_TEMP_ALERT_MIN,
        POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
@@ -85,9 +86,10 @@ static enum power_supply_property max17042_battery_props[] = {
        POWER_SUPPLY_PROP_TEMP_MAX,
        POWER_SUPPLY_PROP_HEALTH,
        POWER_SUPPLY_PROP_SCOPE,
+       POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
+       // these two have to be at the end on the list
        POWER_SUPPLY_PROP_CURRENT_NOW,
        POWER_SUPPLY_PROP_CURRENT_AVG,
-       POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
 };
 
 static int max17042_get_temperature(struct max17042_chip *chip, int *temp)
@@ -353,7 +355,8 @@ static int max17042_get_property(struct power_supply *psy,
                if (ret < 0)
                        return ret;
 
-               val->intval = data * 1000 / 2;
+               data64 = sign_extend64(data, 15) * 5000000ll;
+               val->intval = div_s64(data64, chip->pdata->r_sns);
                break;
        case POWER_SUPPLY_PROP_TEMP:
                ret = max17042_get_temperature(chip, &val->intval);
@@ -394,8 +397,8 @@ static int max17042_get_property(struct power_supply *psy,
                        if (ret < 0)
                                return ret;
 
-                       val->intval = sign_extend32(data, 15);
-                       val->intval *= 1562500 / chip->pdata->r_sns;
+                       data64 = sign_extend64(data, 15) * 1562500ll;
+                       val->intval = div_s64(data64, chip->pdata->r_sns);
                } else {
                        return -EINVAL;
                }
@@ -406,12 +409,20 @@ static int max17042_get_property(struct power_supply *psy,
                        if (ret < 0)
                                return ret;
 
-                       val->intval = sign_extend32(data, 15);
-                       val->intval *= 1562500 / chip->pdata->r_sns;
+                       data64 = sign_extend64(data, 15) * 1562500ll;
+                       val->intval = div_s64(data64, chip->pdata->r_sns);
                } else {
                        return -EINVAL;
                }
                break;
+       case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
+               ret = regmap_read(map, MAX17042_ICHGTerm, &data);
+               if (ret < 0)
+                       return ret;
+
+               data64 = data * 1562500ll;
+               val->intval = div_s64(data64, chip->pdata->r_sns);
+               break;
        case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW:
                ret = regmap_read(map, MAX17042_TTE, &data);
                if (ret < 0)