/**
  * struct ab8500_bm_data - ab8500 battery management data
- * @temp_under         under this temp, charging is stopped
- * @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
+ * @bi                 battery info from device tree
  * @temp_now           present battery temperature
  * @temp_interval_chg  temperature measurement interval in s when charging
  * @temp_interval_nochg        temperature measurement interval in s when not charging
  * @fg_params          fuel gauge parameters
  */
 struct ab8500_bm_data {
-       int temp_under;
-       int temp_low;
-       int temp_high;
-       int temp_over;
+       struct power_supply_battery_info bi;
        int temp_now;
        int temp_interval_chg;
        int temp_interval_nochg;
 int ab8500_fg_inst_curr_done(struct ab8500_fg *di);
 int ab8500_bm_of_probe(struct power_supply *psy,
                       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_btemp_driver;
 
 
 #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
  * inside of the battery pack.
 };
 
 struct ab8500_bm_data ab8500_bm_data = {
-       .temp_under             = 3,
-       .temp_low               = 8,
-       .temp_high              = 43,
-       .temp_over              = 48,
        .main_safety_tmr_h      = 4,
        .temp_interval_chg      = 20,
        .temp_interval_nochg    = 120,
        .batt_id                = 0,
        .interval_charging      = 5,
        .interval_not_charging  = 120,
-       .temp_hysteresis        = 3,
        .gnd_lift_resistance    = 34,
        .maxi                   = &ab8500_maxi_params,
        .chg_params             = &chg,
                       struct ab8500_bm_data *bm)
 {
        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;
        int ret;
        int i;
 
-       ret = power_supply_get_battery_info(psy, &info);
+       ret = power_supply_get_battery_info(psy, bi);
        if (ret) {
                dev_err(dev, "cannot retrieve battery info\n");
                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->chg_unknown_bat = true;
                bm->bat_type[BATTERY_UNKNOWN].charge_full_design = 2600;
        }
 
        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;
                else
                        tmp_batres_tbl = temp_to_batres_tbl_thermistor;
        for (i = 0; i < bm->n_btypes; ++i)
                bm->bat_type[i].batres_tbl = tmp_batres_tbl;
 
-       power_supply_put_battery_info(psy, &info);
-
        return 0;
 }
+
+void ab8500_bm_of_remove(struct power_supply *psy,
+                        struct ab8500_bm_data *bm)
+{
+       power_supply_put_battery_info(psy, &bm->bi);
+}
 
  */
 static void ab8500_chargalg_check_temp(struct ab8500_chargalg *di)
 {
-       if (di->batt_data.temp > (di->bm->temp_low + di->t_hyst_norm) &&
-               di->batt_data.temp < (di->bm->temp_high - di->t_hyst_norm)) {
+       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)) {
                /* Temp OK! */
                di->events.btemp_underover = false;
                di->events.btemp_lowhigh = false;
                di->t_hyst_norm = 0;
                di->t_hyst_lowhigh = 0;
        } else {
-               if (((di->batt_data.temp >= di->bm->temp_high) &&
+               if (((di->batt_data.temp >= bi->temp_alert_max) &&
                        (di->batt_data.temp <
-                               (di->bm->temp_over - di->t_hyst_lowhigh))) ||
+                               (bi->temp_max - di->t_hyst_lowhigh))) ||
                        ((di->batt_data.temp >
-                               (di->bm->temp_under + di->t_hyst_lowhigh)) &&
-                       (di->batt_data.temp <= di->bm->temp_low))) {
+                               (bi->temp_min + di->t_hyst_lowhigh)) &&
+                       (di->batt_data.temp <= bi->temp_alert_min))) {
                        /* TEMP minor!!!!! */
                        di->events.btemp_underover = false;
                        di->events.btemp_lowhigh = true;
                        di->t_hyst_norm = di->bm->temp_hysteresis;
                        di->t_hyst_lowhigh = 0;
-               } else if (di->batt_data.temp <= di->bm->temp_under ||
-                       di->batt_data.temp >= di->bm->temp_over) {
+               } else if (di->batt_data.temp <= bi->temp_min ||
+                       di->batt_data.temp >= bi->temp_max) {
                        /* TEMP major!!!!! */
                        di->events.btemp_underover = true;
                        di->events.btemp_lowhigh = false;
                if (di->events.batt_ovv) {
                        val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
                } 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;
                        else
                                val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
 
        component_master_del(&pdev->dev, &ab8500_charger_comp_ops);
 
        usb_unregister_notifier(di->usb_phy, &di->nb);
+       ab8500_bm_of_remove(di->usb_chg.psy, di->bm);
        usb_put_phy(di->usb_phy);
        if (!di->ac_chg.enabled)
                blocking_notifier_chain_unregister(