From d38d1406aa8af369b4a636d8001122986edfbc8e Mon Sep 17 00:00:00 2001 From: Shunqing Chen Date: Wed, 30 Sep 2020 15:57:45 +0800 Subject: [PATCH] power: supply: rk816_battery: add power supply property for Android R Signed-off-by: Shunqing Chen Change-Id: I2346a76b5dc866c5e468923786c508aa7f8dc7a2 --- drivers/power/supply/rk816_battery.c | 46 ++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/drivers/power/supply/rk816_battery.c b/drivers/power/supply/rk816_battery.c index 5075680288bd..0a5abc391b9c 100644 --- a/drivers/power/supply/rk816_battery.c +++ b/drivers/power/supply/rk816_battery.c @@ -1082,9 +1082,12 @@ static enum power_supply_property rk816_bat_props[] = { POWER_SUPPLY_PROP_PRESENT, 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 rk816_bat_ac_set_property(struct power_supply *psy, @@ -1127,6 +1130,42 @@ static int rk816_bat_usb_set_property(struct power_supply *psy, return 0; } +static int rk816_get_capacity_leve(struct rk816_battery *di) +{ + if (di->pdata->bat_mode == MODE_VIRTUAL) + return POWER_SUPPLY_CAPACITY_LEVEL_NORMAL; + + if (di->dsoc < 1) + return POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL; + else if (di->dsoc <= 20) + return POWER_SUPPLY_CAPACITY_LEVEL_LOW; + else if (di->dsoc <= 70) + return POWER_SUPPLY_CAPACITY_LEVEL_NORMAL; + else if (di->dsoc <= 90) + return POWER_SUPPLY_CAPACITY_LEVEL_HIGH; + else + return POWER_SUPPLY_CAPACITY_LEVEL_FULL; +} + +static int rk816_battery_time_to_full(struct rk816_battery *di) +{ + int time_sec; + int cap_temp; + + if (di->pdata->bat_mode == MODE_VIRTUAL) { + time_sec = 3600; + } else if (di->voltage_avg > 0) { + cap_temp = di->pdata->design_capacity - di->remain_cap; + if (cap_temp < 0) + cap_temp = 0; + time_sec = (3600 * cap_temp) / di->voltage_avg; + } else { + time_sec = 3600 * 24; /* One day */ + } + + return time_sec; +} + static int rk816_battery_get_property(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val) @@ -1155,6 +1194,9 @@ static int rk816_battery_get_property(struct power_supply *psy, val->intval = VIRTUAL_SOC; DBG("<%s>. report dsoc: %d\n", __func__, val->intval); break; + case POWER_SUPPLY_PROP_CAPACITY_LEVEL: + val->intval = rk816_get_capacity_leve(di); + break; case POWER_SUPPLY_PROP_HEALTH: val->intval = POWER_SUPPLY_HEALTH_GOOD; break; @@ -1174,8 +1216,12 @@ static int rk816_battery_get_property(struct power_supply *psy, val->intval = di->charge_count; break; case POWER_SUPPLY_PROP_CHARGE_FULL: + case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: val->intval = di->pdata->design_capacity * 1000;/* uAh */ break; + case POWER_SUPPLY_PROP_TIME_TO_FULL_NOW: + val->intval = rk816_battery_time_to_full(di); + break; default: return -EINVAL; }