aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/drivers/power
diff options
context:
space:
mode:
authorJonathan Bakker <xc-racer2@live.ca>2020-05-16 15:35:44 -0700
committerSebastian Reichel <sebastian.reichel@collabora.com>2020-06-19 19:58:23 +0200
commit5d809cb28056221e1b13459f7a2ddfa28305b74f (patch)
tree8ab46d68da71f6d57622ed98aba6fd71451cf363 /drivers/power
parentpower: supply: bq24190_charger: Fix runtime PM imbalance on error (diff)
downloadwireguard-linux-5d809cb28056221e1b13459f7a2ddfa28305b74f.tar.xz
wireguard-linux-5d809cb28056221e1b13459f7a2ddfa28305b74f.zip
power: supply: max8998_charger: Correct ONLINE and add STATUS props
The ONLINE prop should be when the charger is present (ie able to charge), however, it was for when it was actually charging or not. Instead, add the STATUS prop to show whether charging is actually going on or not. The magic numbers have been ported from a downstream kernel for the SGH-T959V. Signed-off-by: Jonathan Bakker <xc-racer2@live.ca> Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/supply/max8998_charger.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/drivers/power/supply/max8998_charger.c b/drivers/power/supply/max8998_charger.c
index 9a926c7c0f22..c26023b19f26 100644
--- a/drivers/power/supply/max8998_charger.c
+++ b/drivers/power/supply/max8998_charger.c
@@ -23,6 +23,7 @@ struct max8998_battery_data {
static enum power_supply_property max8998_battery_props[] = {
POWER_SUPPLY_PROP_PRESENT, /* the presence of battery */
POWER_SUPPLY_PROP_ONLINE, /* charger is active or not */
+ POWER_SUPPLY_PROP_STATUS, /* charger is charging/discharging/full */
};
/* Note that the charger control is done by a current regulator "CHARGER" */
@@ -49,10 +50,28 @@ static int max8998_battery_get_property(struct power_supply *psy,
ret = max8998_read_reg(i2c, MAX8998_REG_STATUS2, &reg);
if (ret)
return ret;
- if (reg & (1 << 3))
- val->intval = 0;
- else
+
+ if (reg & (1 << 5))
val->intval = 1;
+ else
+ val->intval = 0;
+
+ break;
+ case POWER_SUPPLY_PROP_STATUS:
+ ret = max8998_read_reg(i2c, MAX8998_REG_STATUS2, &reg);
+ if (ret)
+ return ret;
+
+ if (!(reg & (1 << 5))) {
+ val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
+ } else {
+ if (reg & (1 << 6))
+ val->intval = POWER_SUPPLY_STATUS_FULL;
+ else if (reg & (1 << 3))
+ val->intval = POWER_SUPPLY_STATUS_CHARGING;
+ else
+ val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
+ }
break;
default:
return -EINVAL;