diff --git a/drivers/power/supply/rk817_battery.c b/drivers/power/supply/rk817_battery.c index 84de6eafce66..e119402a7532 100644 --- a/drivers/power/supply/rk817_battery.c +++ b/drivers/power/supply/rk817_battery.c @@ -1942,9 +1942,12 @@ static enum power_supply_property rk817_bat_props[] = { POWER_SUPPLY_PROP_VOLTAGE_NOW, POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_PROP_CAPACITY, + POWER_SUPPLY_PROP_CAPACITY_LEVEL, POWER_SUPPLY_PROP_TEMP, POWER_SUPPLY_PROP_CHARGE_COUNTER, POWER_SUPPLY_PROP_CHARGE_FULL, + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, + POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, }; static int rk817_bat_get_usb_psy(struct device *dev, void *data) @@ -2014,6 +2017,45 @@ static int rk817_bat_get_charge_state(struct rk817_battery_device *battery) return (battery->usb_in || battery->ac_in); } +static int rk817_get_capacity_leve(struct rk817_battery_device *battery) +{ + int dsoc; + + if (battery->pdata->bat_mode == MODE_VIRTUAL) + return POWER_SUPPLY_CAPACITY_LEVEL_NORMAL; + + dsoc = (battery->dsoc + 500) / 1000; + if (dsoc < 1) + return POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL; + else if (dsoc <= 20) + return POWER_SUPPLY_CAPACITY_LEVEL_LOW; + else if (dsoc <= 70) + return POWER_SUPPLY_CAPACITY_LEVEL_NORMAL; + else if (dsoc <= 90) + return POWER_SUPPLY_CAPACITY_LEVEL_HIGH; + else + return POWER_SUPPLY_CAPACITY_LEVEL_FULL; +} + +static int rk817_battery_time_to_full(struct rk817_battery_device *battery) +{ + int time_sec; + int cap_temp; + + if (battery->pdata->bat_mode == MODE_VIRTUAL) { + time_sec = 3600; + } else if (battery->voltage_avg > 0) { + cap_temp = battery->design_cap - (battery->remain_cap / 1000); + if (cap_temp < 0) + cap_temp = 0; + time_sec = (3600 * cap_temp) / battery->voltage_avg; + } else { + time_sec = 3600 * 24; /* One day */ + } + + return time_sec; +} + static int rk817_battery_get_property(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val) @@ -2036,6 +2078,9 @@ static int rk817_battery_get_property(struct power_supply *psy, if (battery->pdata->bat_mode == MODE_VIRTUAL) val->intval = VIRTUAL_SOC; break; + case POWER_SUPPLY_PROP_CAPACITY_LEVEL: + val->intval = rk817_get_capacity_leve(battery); + break; case POWER_SUPPLY_PROP_HEALTH: val->intval = POWER_SUPPLY_HEALTH_GOOD; break; @@ -2064,8 +2109,12 @@ static int rk817_battery_get_property(struct power_supply *psy, val->intval = battery->charge_count; break; case POWER_SUPPLY_PROP_CHARGE_FULL: + case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: val->intval = battery->pdata->design_capacity * 1000;/* uAh */ break; + case POWER_SUPPLY_PROP_TIME_TO_FULL_NOW: + val->intval = rk817_battery_time_to_full(battery); + break; case POWER_SUPPLY_PROP_VOLTAGE_MAX: val->intval = 4500 * 1000; break;