Commit 25fd3303 authored by Linus Walleij's avatar Linus Walleij Committed by Sebastian Reichel
Browse files

power: supply_core: Pass pointer to battery info



The function to retrieve battery info (from the device tree) assumes
we have a static info struct that gets populated by calling into
power_supply_get_battery_info().

This is awkward since I want to support tables of static battery
info by just assigning a pointer to all info based on e.g. a
compatible value in the device tree.

We also have a mixture of static and dynamically allocated
variables here.

Bite the bullet and let power_supply_get_battery_info() allocate
also the memory used for the very top level
struct power_supply_battery_info container. Pass pointers
around and lifecycle this with the psy device just like the
stuff we allocate inside it.

Change all current users over.

As part of the change, initializers need to be added to some
previously uninitialized fields in struct
power_supply_battery_info.

Reviewed-By: default avatarMatti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
parent be2c0d54
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -439,7 +439,7 @@ struct ab8500_bm_charger_parameters {
 * @fg_params		fuel gauge parameters
 */
struct ab8500_bm_data {
	struct power_supply_battery_info bi;
	struct power_supply_battery_info *bi;
	int temp_now;
	int temp_interval_chg;
	int temp_interval_nochg;
+4 −3
Original line number Diff line number Diff line
@@ -167,15 +167,16 @@ struct ab8500_bm_data ab8500_bm_data = {
int ab8500_bm_of_probe(struct power_supply *psy,
		       struct ab8500_bm_data *bm)
{
	struct power_supply_battery_info *bi = &bm->bi;
	struct power_supply_battery_info *bi;
	struct device *dev = &psy->dev;
	int ret;

	ret = power_supply_get_battery_info(psy, bi);
	ret = power_supply_get_battery_info(psy, &bm->bi);
	if (ret) {
		dev_err(dev, "cannot retrieve battery info\n");
		return ret;
	}
	bi = bm->bi;

	/* Fill in defaults for any data missing from the device tree */
	if (bi->charge_full_design_uah < 0)
@@ -240,5 +241,5 @@ int ab8500_bm_of_probe(struct power_supply *psy,
void ab8500_bm_of_remove(struct power_supply *psy,
			 struct ab8500_bm_data *bm)
{
	power_supply_put_battery_info(psy, &bm->bi);
	power_supply_put_battery_info(psy, bm->bi);
}
+7 −3
Original line number Diff line number Diff line
@@ -451,12 +451,13 @@ static int ab8500_btemp_res_to_temp(struct ab8500_btemp *di,
 */
static int ab8500_btemp_measure_temp(struct ab8500_btemp *di)
{
	struct power_supply_battery_info *bi = di->bm->bi;
	int temp, ret;
	static int prev;
	int rbat, rntc, vntc;

	if ((di->bm->adc_therm == AB8500_ADC_THERM_BATCTRL) &&
	    (di->bm->bi.technology == POWER_SUPPLY_TECHNOLOGY_UNKNOWN)) {
	    (bi && (bi->technology == POWER_SUPPLY_TECHNOLOGY_UNKNOWN))) {

		rbat = ab8500_btemp_get_batctrl_res(di);
		if (rbat < 0) {
@@ -540,7 +541,7 @@ static int ab8500_btemp_id(struct ab8500_btemp *di)
	 * that need it.
	 */
	if ((di->bm->adc_therm == AB8500_ADC_THERM_BATCTRL) &&
	    (di->bm->bi.technology == POWER_SUPPLY_TECHNOLOGY_LIPO) &&
	    (di->bm->bi && (di->bm->bi->technology == POWER_SUPPLY_TECHNOLOGY_LIPO)) &&
	    (res <= 53407) && (res >= 12500)) {
		dev_dbg(di->dev, "Set BATCTRL current source to 20uA\n");
		di->curr_source = BTEMP_BATCTRL_CURR_SRC_20UA;
@@ -807,7 +808,10 @@ static int ab8500_btemp_get_property(struct power_supply *psy,
			val->intval = 1;
		break;
	case POWER_SUPPLY_PROP_TECHNOLOGY:
		val->intval = di->bm->bi.technology;
		if (di->bm->bi)
			val->intval = di->bm->bi->technology;
		else
			val->intval = POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
		break;
	case POWER_SUPPLY_PROP_TEMP:
		val->intval = ab8500_btemp_get_temp(di);
+8 −8
Original line number Diff line number Diff line
@@ -352,7 +352,7 @@ static void ab8500_chargalg_state_to(struct ab8500_chargalg *di,

static int ab8500_chargalg_check_charger_enable(struct ab8500_chargalg *di)
{
	struct power_supply_battery_info *bi = &di->bm->bi;
	struct power_supply_battery_info *bi = di->bm->bi;

	switch (di->charge_state) {
	case STATE_NORMAL:
@@ -731,7 +731,7 @@ static void ab8500_chargalg_start_charging(struct ab8500_chargalg *di,
 */
static void ab8500_chargalg_check_temp(struct ab8500_chargalg *di)
{
	struct power_supply_battery_info *bi = &di->bm->bi;
	struct power_supply_battery_info *bi = di->bm->bi;

	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)) {
@@ -802,10 +802,10 @@ static void ab8500_chargalg_end_of_charge(struct ab8500_chargalg *di)
	if (di->charge_status == POWER_SUPPLY_STATUS_CHARGING &&
		di->charge_state == STATE_NORMAL &&
		!di->maintenance_chg && (di->batt_data.volt_uv >=
		di->bm->bi.overvoltage_limit_uv ||
		di->bm->bi->overvoltage_limit_uv ||
		di->events.usb_cv_active || di->events.ac_cv_active) &&
		di->batt_data.avg_curr_ua <
		di->bm->bi.charge_term_current_ua &&
		di->bm->bi->charge_term_current_ua &&
		di->batt_data.avg_curr_ua > 0) {
		if (++di->eoc_cnt >= EOC_COND_CNT) {
			di->eoc_cnt = 0;
@@ -827,7 +827,7 @@ static void ab8500_chargalg_end_of_charge(struct ab8500_chargalg *di)

static void init_maxim_chg_curr(struct ab8500_chargalg *di)
{
	struct power_supply_battery_info *bi = &di->bm->bi;
	struct power_supply_battery_info *bi = di->bm->bi;

	di->ccm.original_iset_ua = bi->constant_charge_current_max_ua;
	di->ccm.current_iset_ua = bi->constant_charge_current_max_ua;
@@ -920,7 +920,7 @@ static enum maxim_ret ab8500_chargalg_chg_curr_maxim(struct ab8500_chargalg *di)

static void handle_maxim_chg_curr(struct ab8500_chargalg *di)
{
	struct power_supply_battery_info *bi = &di->bm->bi;
	struct power_supply_battery_info *bi = di->bm->bi;
	enum maxim_ret ret;
	int result;

@@ -1299,7 +1299,7 @@ static void ab8500_chargalg_external_power_changed(struct power_supply *psy)
 */
static void ab8500_chargalg_algorithm(struct ab8500_chargalg *di)
{
	struct power_supply_battery_info *bi = &di->bm->bi;
	struct power_supply_battery_info *bi = di->bm->bi;
	int charger_status;
	int ret;
	int curr_step_lvl_ua;
@@ -1723,7 +1723,7 @@ static int ab8500_chargalg_get_property(struct power_supply *psy,
		if (di->events.batt_ovv) {
			val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
		} else if (di->events.btemp_underover) {
			if (di->batt_data.temp <= di->bm->bi.temp_min)
			if (di->batt_data.temp <= di->bm->bi->temp_min)
				val->intval = POWER_SUPPLY_HEALTH_COLD;
			else
				val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
+10 −8
Original line number Diff line number Diff line
@@ -852,7 +852,7 @@ static int ab8500_fg_bat_voltage(struct ab8500_fg *di)
 */
static int ab8500_fg_volt_to_capacity(struct ab8500_fg *di, int voltage_uv)
{
	struct power_supply_battery_info *bi = &di->bm->bi;
	struct power_supply_battery_info *bi = di->bm->bi;

	/* Multiply by 10 because the capacity is tracked in per mille */
	return power_supply_batinfo_ocv2cap(bi, voltage_uv, di->bat_temp) *  10;
@@ -881,7 +881,7 @@ static int ab8500_fg_uncomp_volt_to_capacity(struct ab8500_fg *di)
 */
static int ab8500_fg_battery_resistance(struct ab8500_fg *di)
{
	struct power_supply_battery_info *bi = &di->bm->bi;
	struct power_supply_battery_info *bi = di->bm->bi;
	int resistance_percent = 0;
	int resistance;

@@ -2140,11 +2140,13 @@ static int ab8500_fg_get_ext_psy_data(struct device *dev, void *data)
	struct power_supply *ext = dev_get_drvdata(dev);
	const char **supplicants = (const char **)ext->supplied_to;
	struct ab8500_fg *di;
	struct power_supply_battery_info *bi;
	union power_supply_propval ret;
	int j;

	psy = (struct power_supply *)data;
	di = power_supply_get_drvdata(psy);
	bi = di->bm->bi;

	/*
	 * For all psy where the name of your driver
@@ -2207,8 +2209,8 @@ static int ab8500_fg_get_ext_psy_data(struct device *dev, void *data)
			switch (ext->desc->type) {
			case POWER_SUPPLY_TYPE_BATTERY:
				if (!di->flags.batt_id_received &&
				    (di->bm->bi.technology !=
				     POWER_SUPPLY_TECHNOLOGY_UNKNOWN)) {
				    (bi && (bi->technology !=
					    POWER_SUPPLY_TECHNOLOGY_UNKNOWN))) {
					const struct ab8500_battery_type *b;

					b = di->bm->bat_type;
@@ -2216,13 +2218,13 @@ static int ab8500_fg_get_ext_psy_data(struct device *dev, void *data)
					di->flags.batt_id_received = true;

					di->bat_cap.max_mah_design =
						di->bm->bi.charge_full_design_uah;
						di->bm->bi->charge_full_design_uah;

					di->bat_cap.max_mah =
						di->bat_cap.max_mah_design;

					di->vbat_nom_uv =
						di->bm->bi.voltage_max_design_uv;
						di->bm->bi->voltage_max_design_uv;
				}

				if (ret.intval)
@@ -2992,9 +2994,9 @@ static int ab8500_fg_bind(struct device *dev, struct device *master,
		return -ENOMEM;
	}

	di->bat_cap.max_mah_design = di->bm->bi.charge_full_design_uah;
	di->bat_cap.max_mah_design = di->bm->bi->charge_full_design_uah;
	di->bat_cap.max_mah = di->bat_cap.max_mah_design;
	di->vbat_nom_uv = di->bm->bi.voltage_max_design_uv;
	di->vbat_nom_uv = di->bm->bi->voltage_max_design_uv;

	/* Start the coulomb counter */
	ab8500_fg_coulomb_counter(di, true);
Loading