Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23a04f9f authored by Lee Jones's avatar Lee Jones
Browse files

ab8500_bm: Always send platform specific battery information via pdata



Currently the AB8500 battery management subsystem receives platform
specific information via two different means depending on how the
platform is booted. If DT is not enabled, a reference to a *_bm_data
data structure containing each platform specific attribute is passed
though platform_data. However, if DT is enabled, then platform_data
is empty and the reference is gained though a DT specific probe
function. There are two issues here 1) the same reference is
being collected each time and 2) the DT way doesn't allow any
provisions to select different platform specific attributes, which
kind of defeats the object.

Cc: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
parent b0284de0
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -1044,40 +1044,32 @@ static struct mfd_cell __devinitdata ab8500_bm_devs[] = {
		.of_compatible = "stericsson,ab8500-charger",
		.num_resources = ARRAY_SIZE(ab8500_charger_resources),
		.resources = ab8500_charger_resources,
#ifndef CONFIG_OF
		.platform_data = &ab8500_bm_data,
		.pdata_size = sizeof(ab8500_bm_data),
#endif
	},
	{
		.name = "ab8500-btemp",
		.of_compatible = "stericsson,ab8500-btemp",
		.num_resources = ARRAY_SIZE(ab8500_btemp_resources),
		.resources = ab8500_btemp_resources,
#ifndef CONFIG_OF
		.platform_data = &ab8500_bm_data,
		.pdata_size = sizeof(ab8500_bm_data),
#endif
	},
	{
		.name = "ab8500-fg",
		.of_compatible = "stericsson,ab8500-fg",
		.num_resources = ARRAY_SIZE(ab8500_fg_resources),
		.resources = ab8500_fg_resources,
#ifndef CONFIG_OF
		.platform_data = &ab8500_bm_data,
		.pdata_size = sizeof(ab8500_bm_data),
#endif
	},
	{
		.name = "ab8500-chargalg",
		.of_compatible = "stericsson,ab8500-chargalg",
		.num_resources = ARRAY_SIZE(ab8500_chargalg_resources),
		.resources = ab8500_chargalg_resources,
#ifndef CONFIG_OF
		.platform_data = &ab8500_bm_data,
		.pdata_size = sizeof(ab8500_bm_data),
#endif
	},
};

+14 −19
Original line number Diff line number Diff line
@@ -454,16 +454,13 @@ struct abx500_bm_data ab8500_bm_data = {

int __devinit ab8500_bm_of_probe(struct device *dev,
				 struct device_node *np,
				 struct abx500_bm_data **battery)
				 struct abx500_bm_data *bm)
{
	struct batres_vs_temp *tmp_batres_tbl;
	struct device_node *np_bat_supply;
	struct abx500_bm_data *bat;
	const char *btech;
	int i;

	*battery = &ab8500_bm_data;

	/* get phandle to 'battery-info' node */
	np_bat_supply = of_parse_phandle(np, "battery", 0);
	if (!np_bat_supply) {
@@ -477,16 +474,14 @@ int __devinit ab8500_bm_of_probe(struct device *dev,
		return -EINVAL;
	}

	bat = *battery;

	if (strncmp(btech, "LION", 4) == 0) {
		bat->no_maintenance  = true;
		bat->chg_unknown_bat = true;
		bat->bat_type[BATTERY_UNKNOWN].charge_full_design = 2600;
		bat->bat_type[BATTERY_UNKNOWN].termination_vol    = 4150;
		bat->bat_type[BATTERY_UNKNOWN].recharge_vol	  = 4130;
		bat->bat_type[BATTERY_UNKNOWN].normal_cur_lvl	  = 520;
		bat->bat_type[BATTERY_UNKNOWN].normal_vol_lvl	  = 4200;
		bm->no_maintenance  = true;
		bm->chg_unknown_bat = true;
		bm->bat_type[BATTERY_UNKNOWN].charge_full_design = 2600;
		bm->bat_type[BATTERY_UNKNOWN].termination_vol    = 4150;
		bm->bat_type[BATTERY_UNKNOWN].recharge_vol       = 4130;
		bm->bat_type[BATTERY_UNKNOWN].normal_cur_lvl     = 520;
		bm->bat_type[BATTERY_UNKNOWN].normal_vol_lvl     = 4200;
	}

	if (of_property_read_bool(np_bat_supply, "thermistor-on-batctrl")) {
@@ -495,15 +490,15 @@ int __devinit ab8500_bm_of_probe(struct device *dev,
		else
			tmp_batres_tbl = temp_to_batres_tbl_thermistor;
	} else {
		bat->n_btypes   = 4;
		bat->bat_type   = bat_type_ext_thermistor;
		bat->adc_therm  = ABx500_ADC_THERM_BATTEMP;
		bm->n_btypes   = 4;
		bm->bat_type   = bat_type_ext_thermistor;
		bm->adc_therm  = ABx500_ADC_THERM_BATTEMP;
		tmp_batres_tbl = temp_to_batres_tbl_ext_thermistor;
	}

	/* select the battery resolution table */
	for (i = 0; i < bat->n_btypes; ++i)
		bat->bat_type[i]->batres_tbl = tmp_batres_tbl;
	for (i = 0; i < bm->n_btypes; ++i)
		bm->bat_type[i].batres_tbl = tmp_batres_tbl;

	of_node_put(np_bat_supply);

+1 −1
Original line number Diff line number Diff line
@@ -988,7 +988,7 @@ static int __devinit ab8500_btemp_probe(struct platform_device *pdev)
	di->bm = pdev->mfd_cell->platform_data;
	if (!di->bm) {
		if (np) {
			ret = ab8500_bm_of_probe(&pdev->dev, np, &di->bm);
			ret = ab8500_bm_of_probe(&pdev->dev, np, di->bm);
			if (ret) {
				dev_err(&pdev->dev,
					"failed to get battery information\n");
+1 −1
Original line number Diff line number Diff line
@@ -2647,7 +2647,7 @@ static int __devinit ab8500_charger_probe(struct platform_device *pdev)
	di->bm = pdev->mfd_cell->platform_data;
	if (!di->bm) {
		if (np) {
			ret = ab8500_bm_of_probe(&pdev->dev, np, &di->bm);
			ret = ab8500_bm_of_probe(&pdev->dev, np, di->bm);
			if (ret) {
				dev_err(&pdev->dev,
					"failed to get battery information\n");
+1 −1
Original line number Diff line number Diff line
@@ -2460,7 +2460,7 @@ static int __devinit ab8500_fg_probe(struct platform_device *pdev)
	di->bm = pdev->mfd_cell->platform_data;
	if (!di->bm) {
		if (np) {
			ret = ab8500_bm_of_probe(&pdev->dev, np, &di->bm);
			ret = ab8500_bm_of_probe(&pdev->dev, np, di->bm);
			if (ret) {
				dev_err(&pdev->dev,
					"failed to get battery information\n");
Loading