118 lines
3.8 KiB
Diff
118 lines
3.8 KiB
Diff
|
From 3450b9ce5d4fa3cb76adb5fdeaf090e48591a68d Mon Sep 17 00:00:00 2001
|
||
|
From: Samuel Holland <samuel@sholland.org>
|
||
|
Date: Sat, 29 Feb 2020 01:04:33 -0600
|
||
|
Subject: [PATCH 275/351] power: supply: axp20x_battery: Monitor battery health
|
||
|
|
||
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||
|
---
|
||
|
drivers/power/supply/axp20x_battery.c | 58 ++++++++++++++++++++++++++-
|
||
|
1 file changed, 56 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/power/supply/axp20x_battery.c b/drivers/power/supply/axp20x_battery.c
|
||
|
index d0ea5cbd63ce..f6c849bd15e3 100644
|
||
|
--- a/drivers/power/supply/axp20x_battery.c
|
||
|
+++ b/drivers/power/supply/axp20x_battery.c
|
||
|
@@ -81,6 +81,7 @@ struct axp20x_batt_ps {
|
||
|
struct iio_channel *batt_chrg_i;
|
||
|
struct iio_channel *batt_dischrg_i;
|
||
|
struct iio_channel *batt_v;
|
||
|
+ int health;
|
||
|
/* Maximum constant charge current */
|
||
|
unsigned int max_ccc;
|
||
|
const struct axp_data *data;
|
||
|
@@ -275,7 +276,7 @@ static int axp20x_battery_get_prop(struct power_supply *psy,
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
- val->intval = POWER_SUPPLY_HEALTH_GOOD;
|
||
|
+ val->intval = axp20x_batt->health;
|
||
|
break;
|
||
|
|
||
|
case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
|
||
|
@@ -573,6 +574,39 @@ static irqreturn_t axp20x_battery_changed_irq(int irq, void *devid)
|
||
|
return IRQ_HANDLED;
|
||
|
}
|
||
|
|
||
|
+static irqreturn_t axp20x_battery_temp_cold_irq(int irq, void *devid)
|
||
|
+{
|
||
|
+ struct axp20x_batt_ps *axp20x_batt = devid;
|
||
|
+
|
||
|
+ axp20x_batt->health = POWER_SUPPLY_HEALTH_COLD;
|
||
|
+
|
||
|
+ power_supply_changed(axp20x_batt->batt);
|
||
|
+
|
||
|
+ return IRQ_HANDLED;
|
||
|
+}
|
||
|
+
|
||
|
+static irqreturn_t axp20x_battery_temp_hot_irq(int irq, void *devid)
|
||
|
+{
|
||
|
+ struct axp20x_batt_ps *axp20x_batt = devid;
|
||
|
+
|
||
|
+ axp20x_batt->health = POWER_SUPPLY_HEALTH_OVERHEAT;
|
||
|
+
|
||
|
+ power_supply_changed(axp20x_batt->batt);
|
||
|
+
|
||
|
+ return IRQ_HANDLED;
|
||
|
+}
|
||
|
+
|
||
|
+static irqreturn_t axp20x_battery_temp_normal_irq(int irq, void *devid)
|
||
|
+{
|
||
|
+ struct axp20x_batt_ps *axp20x_batt = devid;
|
||
|
+
|
||
|
+ axp20x_batt->health = POWER_SUPPLY_HEALTH_GOOD;
|
||
|
+
|
||
|
+ power_supply_changed(axp20x_batt->batt);
|
||
|
+
|
||
|
+ return IRQ_HANDLED;
|
||
|
+}
|
||
|
+
|
||
|
static const struct axp_irq_data axp20x_irqs[] = {
|
||
|
{ "BATT_PLUGIN", axp20x_battery_changed_irq },
|
||
|
{ "BATT_REMOVAL", axp20x_battery_changed_irq },
|
||
|
@@ -583,6 +617,24 @@ static const struct axp_irq_data axp20x_irqs[] = {
|
||
|
{}
|
||
|
};
|
||
|
|
||
|
+static const struct axp_irq_data axp813_irqs[] = {
|
||
|
+ { "BATT_PLUGIN", axp20x_battery_changed_irq },
|
||
|
+ { "BATT_REMOVAL", axp20x_battery_changed_irq },
|
||
|
+ { "BATT_HEALTH_DEAD", axp20x_battery_changed_irq },
|
||
|
+ { "BATT_HEALTH_GOOD", axp20x_battery_changed_irq },
|
||
|
+ { "BATT_CHARGING", axp20x_battery_changed_irq },
|
||
|
+ { "BATT_CHARGING_DONE", axp20x_battery_changed_irq },
|
||
|
+ { "BATT_CHG_TEMP_HIGH", axp20x_battery_temp_hot_irq },
|
||
|
+ { "BATT_CHG_TEMP_HIGH_END", axp20x_battery_temp_normal_irq },
|
||
|
+ { "BATT_CHG_TEMP_LOW", axp20x_battery_temp_cold_irq },
|
||
|
+ { "BATT_CHG_TEMP_LOW_END", axp20x_battery_temp_normal_irq },
|
||
|
+ { "BATT_ACT_TEMP_HIGH", axp20x_battery_temp_hot_irq },
|
||
|
+ { "BATT_ACT_TEMP_HIGH_END", axp20x_battery_temp_normal_irq },
|
||
|
+ { "BATT_ACT_TEMP_LOW", axp20x_battery_temp_cold_irq },
|
||
|
+ { "BATT_ACT_TEMP_LOW_END", axp20x_battery_temp_normal_irq },
|
||
|
+ {}
|
||
|
+};
|
||
|
+
|
||
|
static const struct axp_data axp209_data = {
|
||
|
.ccc_scale = 100000,
|
||
|
.ccc_offset = 300000,
|
||
|
@@ -606,7 +658,7 @@ static const struct axp_data axp813_data = {
|
||
|
.has_fg_valid = true,
|
||
|
.get_max_voltage = axp813_battery_get_max_voltage,
|
||
|
.set_max_voltage = axp20x_battery_set_max_voltage,
|
||
|
- .irqs = axp20x_irqs,
|
||
|
+ .irqs = axp813_irqs,
|
||
|
};
|
||
|
|
||
|
static const struct of_device_id axp20x_battery_ps_id[] = {
|
||
|
@@ -700,6 +752,8 @@ static int axp20x_power_probe(struct platform_device *pdev)
|
||
|
return PTR_ERR(axp20x_batt->batt);
|
||
|
}
|
||
|
|
||
|
+ axp20x_batt->health = POWER_SUPPLY_HEALTH_GOOD;
|
||
|
+
|
||
|
if (!power_supply_get_battery_info(axp20x_batt->batt, info)) {
|
||
|
int vmin = info->voltage_min_design_uv;
|
||
|
int ccc = info->constant_charge_current_max_ua;
|
||
|
--
|
||
|
2.34.0
|
||
|
|