Skip to content

Commit

Permalink
ab8500_bm: Always send platform specific battery information via pdata
Browse files Browse the repository at this point in the history
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: Lee Jones <lee.jones@linaro.org>
  • Loading branch information
Lee Jones committed Dec 11, 2012
1 parent b0284de commit 23a04f9
Show file tree
Hide file tree
Showing 7 changed files with 19 additions and 32 deletions.
8 changes: 0 additions & 8 deletions drivers/mfd/ab8500-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
},
};

Expand Down
33 changes: 14 additions & 19 deletions drivers/power/ab8500_bmdata.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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")) {
Expand All @@ -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;
tmp_batres_tbl = temp_to_batres_tbl_ext_thermistor;
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);

Expand Down
2 changes: 1 addition & 1 deletion drivers/power/ab8500_btemp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
2 changes: 1 addition & 1 deletion drivers/power/ab8500_charger.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
2 changes: 1 addition & 1 deletion drivers/power/ab8500_fg.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
2 changes: 1 addition & 1 deletion drivers/power/abx500_chargalg.c
Original file line number Diff line number Diff line change
Expand Up @@ -1817,7 +1817,7 @@ static int __devinit abx500_chargalg_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");
Expand Down
2 changes: 1 addition & 1 deletion include/linux/mfd/abx500.h
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ enum {

int ab8500_bm_of_probe(struct device *dev,
struct device_node *np,
struct abx500_bm_data **battery);
struct abx500_bm_data *bm);

int abx500_set_register_interruptible(struct device *dev, u8 bank, u8 reg,
u8 value);
Expand Down

0 comments on commit 23a04f9

Please sign in to comment.