power: supply: ab8500: Standardize operating temperature

Instead of storing the temperature limits in our custom
struct struct ab8500_bm_data, make struct power_supply_battery_info
a member of this and store the min and max temperatures inside
that struct as the temp_min/temp_max and
temp_alert_min/temp_alert_max respectively.

The values can be assigned from the device tree, but if
not present will be set to the same defaults as are currently
in the code.

This way we start to move over to using
struct power_supply_battery_info and make it possible to move
the data over to the device tree and we will move piece by
piece toward using the standard info struct.

Temperature hysteresis is currently not supported by the
standard struct but we move the assignment here as well so
that we have all parameterization in one spot.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
This commit is contained in:
Linus Walleij 2021-11-20 16:53:13 +01:00 committed by Sebastian Reichel
parent 3aca6ecdab
commit 6252c706cd
4 changed files with 48 additions and 28 deletions

View File

@ -460,10 +460,7 @@ struct ab8500_bm_charger_parameters {
/** /**
* struct ab8500_bm_data - ab8500 battery management data * struct ab8500_bm_data - ab8500 battery management data
* @temp_under under this temp, charging is stopped * @bi battery info from device tree
* @temp_low between this temp and temp_under charging is reduced
* @temp_high between this temp and temp_over charging is reduced
* @temp_over over this temp, charging is stopped
* @temp_now present battery temperature * @temp_now present battery temperature
* @temp_interval_chg temperature measurement interval in s when charging * @temp_interval_chg temperature measurement interval in s when charging
* @temp_interval_nochg temperature measurement interval in s when not charging * @temp_interval_nochg temperature measurement interval in s when not charging
@ -491,10 +488,7 @@ struct ab8500_bm_charger_parameters {
* @fg_params fuel gauge parameters * @fg_params fuel gauge parameters
*/ */
struct ab8500_bm_data { struct ab8500_bm_data {
int temp_under; struct power_supply_battery_info bi;
int temp_low;
int temp_high;
int temp_over;
int temp_now; int temp_now;
int temp_interval_chg; int temp_interval_chg;
int temp_interval_nochg; int temp_interval_nochg;
@ -564,6 +558,8 @@ int ab8500_fg_inst_curr_started(struct ab8500_fg *di);
int ab8500_fg_inst_curr_done(struct ab8500_fg *di); int ab8500_fg_inst_curr_done(struct ab8500_fg *di);
int ab8500_bm_of_probe(struct power_supply *psy, int ab8500_bm_of_probe(struct power_supply *psy,
struct ab8500_bm_data *bm); struct ab8500_bm_data *bm);
void ab8500_bm_of_remove(struct power_supply *psy,
struct ab8500_bm_data *bm);
extern struct platform_driver ab8500_fg_driver; extern struct platform_driver ab8500_fg_driver;
extern struct platform_driver ab8500_btemp_driver; extern struct platform_driver ab8500_btemp_driver;

View File

@ -5,6 +5,17 @@
#include "ab8500-bm.h" #include "ab8500-bm.h"
/* Default: under this temperature, charging is stopped */
#define AB8500_TEMP_UNDER 3
/* Default: between this temp and AB8500_TEMP_UNDER charging is reduced */
#define AB8500_TEMP_LOW 8
/* Default: between this temp and AB8500_TEMP_OVER charging is reduced */
#define AB8500_TEMP_HIGH 43
/* Default: over this temp, charging is stopped */
#define AB8500_TEMP_OVER 48
/* Default: temperature hysteresis */
#define AB8500_TEMP_HYSTERESIS 3
/* /*
* These are the defined batteries that uses a NTC and ID resistor placed * These are the defined batteries that uses a NTC and ID resistor placed
* inside of the battery pack. * inside of the battery pack.
@ -437,10 +448,6 @@ static const struct ab8500_bm_charger_parameters chg = {
}; };
struct ab8500_bm_data ab8500_bm_data = { struct ab8500_bm_data ab8500_bm_data = {
.temp_under = 3,
.temp_low = 8,
.temp_high = 43,
.temp_over = 48,
.main_safety_tmr_h = 4, .main_safety_tmr_h = 4,
.temp_interval_chg = 20, .temp_interval_chg = 20,
.temp_interval_nochg = 120, .temp_interval_nochg = 120,
@ -459,7 +466,6 @@ struct ab8500_bm_data ab8500_bm_data = {
.batt_id = 0, .batt_id = 0,
.interval_charging = 5, .interval_charging = 5,
.interval_not_charging = 120, .interval_not_charging = 120,
.temp_hysteresis = 3,
.gnd_lift_resistance = 34, .gnd_lift_resistance = 34,
.maxi = &ab8500_maxi_params, .maxi = &ab8500_maxi_params,
.chg_params = &chg, .chg_params = &chg,
@ -470,18 +476,29 @@ int ab8500_bm_of_probe(struct power_supply *psy,
struct ab8500_bm_data *bm) struct ab8500_bm_data *bm)
{ {
const struct batres_vs_temp *tmp_batres_tbl; const struct batres_vs_temp *tmp_batres_tbl;
struct power_supply_battery_info info; struct power_supply_battery_info *bi = &bm->bi;
struct device *dev = &psy->dev; struct device *dev = &psy->dev;
int ret; int ret;
int i; int i;
ret = power_supply_get_battery_info(psy, &info); ret = power_supply_get_battery_info(psy, bi);
if (ret) { if (ret) {
dev_err(dev, "cannot retrieve battery info\n"); dev_err(dev, "cannot retrieve battery info\n");
return ret; return ret;
} }
if (info.technology == POWER_SUPPLY_TECHNOLOGY_LION) { if (bi->temp_min == INT_MIN)
bi->temp_min = AB8500_TEMP_UNDER;
if (bi->temp_max == INT_MAX)
bi->temp_max = AB8500_TEMP_OVER;
if (bi->temp_alert_min == INT_MIN)
bi->temp_alert_min = AB8500_TEMP_LOW;
if (bi->temp_alert_max == INT_MAX)
bi->temp_alert_max = AB8500_TEMP_HIGH;
bm->temp_hysteresis = AB8500_TEMP_HYSTERESIS;
if (bi->technology == POWER_SUPPLY_TECHNOLOGY_LION) {
bm->no_maintenance = true; bm->no_maintenance = true;
bm->chg_unknown_bat = true; bm->chg_unknown_bat = true;
bm->bat_type[BATTERY_UNKNOWN].charge_full_design = 2600; bm->bat_type[BATTERY_UNKNOWN].charge_full_design = 2600;
@ -492,7 +509,7 @@ int ab8500_bm_of_probe(struct power_supply *psy,
} }
if (of_property_read_bool(psy->of_node, "thermistor-on-batctrl")) { if (of_property_read_bool(psy->of_node, "thermistor-on-batctrl")) {
if (info.technology == POWER_SUPPLY_TECHNOLOGY_LION) if (bi->technology == POWER_SUPPLY_TECHNOLOGY_LION)
tmp_batres_tbl = temp_to_batres_tbl_9100; tmp_batres_tbl = temp_to_batres_tbl_9100;
else else
tmp_batres_tbl = temp_to_batres_tbl_thermistor; tmp_batres_tbl = temp_to_batres_tbl_thermistor;
@ -507,7 +524,11 @@ int ab8500_bm_of_probe(struct power_supply *psy,
for (i = 0; i < bm->n_btypes; ++i) for (i = 0; i < bm->n_btypes; ++i)
bm->bat_type[i].batres_tbl = tmp_batres_tbl; bm->bat_type[i].batres_tbl = tmp_batres_tbl;
power_supply_put_battery_info(psy, &info);
return 0; return 0;
} }
void ab8500_bm_of_remove(struct power_supply *psy,
struct ab8500_bm_data *bm)
{
power_supply_put_battery_info(psy, &bm->bi);
}

View File

@ -722,27 +722,29 @@ static void ab8500_chargalg_start_charging(struct ab8500_chargalg *di,
*/ */
static void ab8500_chargalg_check_temp(struct ab8500_chargalg *di) static void ab8500_chargalg_check_temp(struct ab8500_chargalg *di)
{ {
if (di->batt_data.temp > (di->bm->temp_low + di->t_hyst_norm) && struct power_supply_battery_info *bi = &di->bm->bi;
di->batt_data.temp < (di->bm->temp_high - di->t_hyst_norm)) {
if (di->batt_data.temp > (bi->temp_alert_min + di->t_hyst_norm) &&
di->batt_data.temp < (bi->temp_alert_max - di->t_hyst_norm)) {
/* Temp OK! */ /* Temp OK! */
di->events.btemp_underover = false; di->events.btemp_underover = false;
di->events.btemp_lowhigh = false; di->events.btemp_lowhigh = false;
di->t_hyst_norm = 0; di->t_hyst_norm = 0;
di->t_hyst_lowhigh = 0; di->t_hyst_lowhigh = 0;
} else { } else {
if (((di->batt_data.temp >= di->bm->temp_high) && if (((di->batt_data.temp >= bi->temp_alert_max) &&
(di->batt_data.temp < (di->batt_data.temp <
(di->bm->temp_over - di->t_hyst_lowhigh))) || (bi->temp_max - di->t_hyst_lowhigh))) ||
((di->batt_data.temp > ((di->batt_data.temp >
(di->bm->temp_under + di->t_hyst_lowhigh)) && (bi->temp_min + di->t_hyst_lowhigh)) &&
(di->batt_data.temp <= di->bm->temp_low))) { (di->batt_data.temp <= bi->temp_alert_min))) {
/* TEMP minor!!!!! */ /* TEMP minor!!!!! */
di->events.btemp_underover = false; di->events.btemp_underover = false;
di->events.btemp_lowhigh = true; di->events.btemp_lowhigh = true;
di->t_hyst_norm = di->bm->temp_hysteresis; di->t_hyst_norm = di->bm->temp_hysteresis;
di->t_hyst_lowhigh = 0; di->t_hyst_lowhigh = 0;
} else if (di->batt_data.temp <= di->bm->temp_under || } else if (di->batt_data.temp <= bi->temp_min ||
di->batt_data.temp >= di->bm->temp_over) { di->batt_data.temp >= bi->temp_max) {
/* TEMP major!!!!! */ /* TEMP major!!!!! */
di->events.btemp_underover = true; di->events.btemp_underover = true;
di->events.btemp_lowhigh = false; di->events.btemp_lowhigh = false;
@ -1722,7 +1724,7 @@ static int ab8500_chargalg_get_property(struct power_supply *psy,
if (di->events.batt_ovv) { if (di->events.batt_ovv) {
val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE; val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
} else if (di->events.btemp_underover) { } else if (di->events.btemp_underover) {
if (di->batt_data.temp <= di->bm->temp_under) if (di->batt_data.temp <= di->bm->bi.temp_min)
val->intval = POWER_SUPPLY_HEALTH_COLD; val->intval = POWER_SUPPLY_HEALTH_COLD;
else else
val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;

View File

@ -3709,6 +3709,7 @@ static int ab8500_charger_remove(struct platform_device *pdev)
component_master_del(&pdev->dev, &ab8500_charger_comp_ops); component_master_del(&pdev->dev, &ab8500_charger_comp_ops);
usb_unregister_notifier(di->usb_phy, &di->nb); usb_unregister_notifier(di->usb_phy, &di->nb);
ab8500_bm_of_remove(di->usb_chg.psy, di->bm);
usb_put_phy(di->usb_phy); usb_put_phy(di->usb_phy);
if (!di->ac_chg.enabled) if (!di->ac_chg.enabled)
blocking_notifier_chain_unregister( blocking_notifier_chain_unregister(