diff --git a/Documentation/devicetree/bindings/power_supply/ab8500/ab8500-btemp.txt b/Documentation/devicetree/bindings/power_supply/ab8500/ab8500-btemp.txt
new file mode 100644
index 0000000..9908934
--- /dev/null
+++ b/Documentation/devicetree/bindings/power_supply/ab8500/ab8500-btemp.txt
@@ -0,0 +1,209 @@
+* St-Ericsson AB8500 Power Management Integrated Circuit (PMIC)
+
+	battery temperature monitor:
+
+* Required properties:
+- compatible: "stericsson,ab8500-btemp"
+
+* Sub-node:
+- ab8500_bm_data:
+
+example:
+   ab8500-btemp {
+       compatible = "stericsson,ab8500-btemp";
+		...
+		...
+       bat = <&ab8500_bm_data>;
+   };
+
+ab8500_bm_data:
+	Contain the battery management/monitor node with the following
+	information to support different battery types.
+
+{
+	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
+	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
+	main_safety_tmr_h	safety timer for main charger
+	usb_safety_tmr_h	safety timer for usb charger
+	bkup_bat_v			voltage which we charge the backup battery with
+	bkup_bat_i			current which we charge the backup battery with
+	no_maintenance		indicates that maintenance charging is disabled
+	abx500_adc_therm	placement of thermistor, batctrl or battemp adc
+	chg_unknown_bat		flag to enable charging of unknown batteries
+	enable_overshoot	flag to enable VBAT overshoot control
+	auto_trig			flag to enable auto adc trigger
+	fg_res				resistance of FG resistor in 0.1mOhm
+	n_btypes			number of elements in array bat_type
+	batt_id				index of the identified battery in array bat_type
+	interval_charging	charge alg cycle period time when charging (sec)
+	interval_not_charging charge alg cycle period time when not charging (sec)
+	temp_hysteresis		temperature hysteresis
+	gnd_lift_resistance	Battery ground to phone ground resistance (mOhm)
+}
+e.g:
+	ab8500_bm_data: bm_data {
+		temp_under		 = <3>;
+		temp_low		 = <8>;
+		temp_high		 = <43>;
+		temp_over		 = <48>;
+		temp_now		 = <0>;
+		temp_interval_chg   = <20>;
+		temp_interval_nochg = <120>;
+		main_safety_tmr_h	= <4>;
+		usb_safety_tmr_h	= <4>;
+		bkup_bat_v		= <1>; /* BUP_VCH_SEL_2P6V */
+		bkup_bat_i		= <4>; /* BUP_ICH_SEL_150UA */
+		no_maintenance	= <0>;
+		chg_unknown_bat	= <0>;
+		enable_overshoot = <0>;
+		auto_trig		 = <0>;
+		adc_therm		 = <0>;
+		fg_res			 = <100>;
+		batt_id		   	 = <0>;
+		interval_charging	  = <5>;
+		interval_not_charging = <120>;
+		temp_hysteresis	   	  = <3>;
+		gnd_lift_resistance   = <34>;
+	};
+
+* subnodes for the node 'ab8500_bm_data':
+	- maxi		: maximization parameters
+	- cap_levels: capacity in percent for the different capacity levels
+	- bat_type	: table of supported battery types
+	- chg_params: charger parameters
+	- fg_params	: fuel gauge parameters
+
+example:
+ab8500_bm_data: bm_data {
+	...
+	...
+	n_btypes	= <3>; /* number of battery types */
+	...
+	maxi        = <&ab8500_bm_data_maxim_parameters>;
+	cap_levels  = <&ab8500_bm_data_cap_levels>;
+	bat_type    = <&ab8500_battery_type_0 &ab8500_battery_type_1 &ab8500_battery_type_2>;
+	chg_params  = <&ab8500_bm_data_charger_parameters>;
+	fg_params   = <&ab8500_bm_data_fuel_guage_parameters>;
+
+};
+
+bx500_battery_type:
+	prepare battery type information from individual battery specification as:
+	{
+		name				: battery technology
+		resis_high			: battery upper resistance limit
+		resis_low			: battery lower resistance limit
+		charge_full_design  : Maximum battery capacity in mAh
+		nominal_voltage		: Nominal voltage of the battery in mV
+		termination_vol		: max voltage upto which battery can be charged
+		termination_curr	: battery charging termination current in mA
+		recharge_vol		: battery voltage limit that will trigger a new
+								full charging cycle in the case where maintenance
+								charging has been disabled
+		normal_cur_lvl		: charger current in normal state in mA
+		normal_vol_lvl		: charger voltage in normal state in mV
+		maint_a_cur_lvl		: charger current in maintenance A state in mA
+		maint_a_vol_lvl		: charger voltage in maintenance A state in mV
+		maint_a_chg_timer_h	: charge time in maintenance A state
+		maint_b_cur_lvl		: charger current in maintenance B state in mA
+		maint_b_vol_lvl		: charger voltage in maintenance B state in mV
+		maint_b_chg_timer_h	: charge time in maintenance B state
+		low_high_cur_lvl	: charger current in temp low/high state in mA
+		low_high_vol_lvl	: charger voltage in temp low/high state in mV'
+		battery_resistance	: battery inner resistance in mOhm.
+		n_r_t_tbl_elements 	: number of elements in r_to_t_tbl
+		r_to_t_tbl			: table containing resistance to temp points
+		n_v_cap_tbl_elements:	number of elements in v_to_cap_tbl
+		v_to_cap_tbl		: Voltage to capacity (in %) table
+		n_batres_tbl_elements: number of elements in the batres_tbl
+		batres_tbl			: battery internal resistance vs temperature table
+	}
+
+	Note:
+		Selected battery shall adhere to the specification provided in:
+		http://www.giga-concept.fr/media/uploads/products/documents/2008/09/9100.pdf
+
+-example:
+
+    ab8500_battery_type_1: ab8500_battery_therm_on_batctrl {
+        bat_name             = <3>;
+        resis_high           = <53407>;
+        resis_low            = <12500>;
+        charge_full_design   = <900>;
+        nominal_voltage      = <3600>;
+        termination_vol      = <4150>;
+        termination_curr     = <80>;
+        recharge_vol         = <4130>;
+        normal_cur_lvl       = <700>;
+        normal_vol_lvl       = <4200>;
+        maint_a_cur_lvl      = <600>;
+        maint_a_vol_lvl      = <4150>;
+        maint_a_chg_timer_h  = <60>;
+        maint_b_cur_lvl      = <600>;
+        maint_b_vol_lvl      = <4100>;
+        maint_b_chg_timer_h  = <200>;
+        low_high_cur_lvl     = <300>;
+        low_high_vol_lvl     = <4000>;
+        battery_resistance   = <300>;
+
+        n_temp_tbl_elements =     <15>;
+
+		r_to_t_tbl - defines one point in a temp to res curve. To be used
+			in battery packs that combines the identification resistor
+			with a NTC resistor.
+
+        r_to_t_tbl = <
+                0xfffffffb 53407 /* -5 */
+                 0 48594	'battery pack temperature in Celcius' 'NTC resistor net total resistance'
+                 5 43804
+                10 39188
+                15 34870
+                20 30933
+                25 27422
+                30 24347
+                35 21694
+                40 19431
+                45 17517
+                50 15908
+                55 14561
+                60 13437
+                65 12500>;
+
+        n_v_cap_tbl_elements = <20>;
+        v_to_cap_tbl = <	/* Table for translating voltage to capacity */
+                4171  100	'Voltage in mV'	'Capacity in percent'
+                4114   95
+                4009   83
+                3947   74
+                3907   67
+                3863   59
+                3830   56
+                3813   53
+                3791   46
+                3771   33
+                3754   25
+                3735   20
+                3717   17
+                3681   13
+                3664    8
+                3651    6
+                3635    5
+                3560    3
+                3408    1
+                3247    0>;
+
+        n_batres_tbl_elements = <7>; /* ARRAY_SIZE(batres_tbl), */
+        batres_tbl = <	/* defines one point in a temp vs battery internal resistance curve. */
+                40 120	'battery pack temperature in Celcius' 'battery internal reistance in mOhm'
+                30 135
+                20 165
+                10 230
+                00 325
+                0xfffffff6 445 /* -10 */
+                0xffffffec 595>; /* -20 */
+    };
diff --git a/Documentation/devicetree/bindings/power_supply/ab8500/ab8500-fg.txt b/Documentation/devicetree/bindings/power_supply/ab8500/ab8500-fg.txt
new file mode 100644
index 0000000..5e84852
--- /dev/null
+++ b/Documentation/devicetree/bindings/power_supply/ab8500/ab8500-fg.txt
@@ -0,0 +1,51 @@
+* St-Ericsson AB8500 Power Management Integrated Circuit (PMIC)
+	fuel guage:
+
+* Required properties:
+- compatible: "stericsson,ab8500-fg"
+
+* Sub-node:
+- ab8500_bm_data:
+
+example:
+   ab8500-btemp {
+       compatible = "stericsson,ab8500-fg";
+		...
+		...
+       bat = <&ab8500_bm_data>;
+   };
+
+Refer:
+	Documentation/devicetree/bindings/power_supply/ab8500/ab8500-btemp.txt for
+	information on 'ab8500_bm_data'
+
+* subnode for the node 'ab8500_bm_data':
+	- fg_params	: fuel gauge parameters
+
+example:
+
+ab8500_bm_data: bm_data {
+	...
+	...
+	...
+	fg_params = <&ab8500_bm_data_fuel_guage_parameters>;
+}
+
+	/* Fuel gauge algorithm parameters, in seconds */
+	ab8500_bm_data_fuel_guage_parameters: bm_data_fuel_guage_parameters {
+		recovery_sleep_timer   = <10>;	/* Time between measurements while recovering */
+		recovery_total_time    = <100>; /* Total recovery time */
+		init_timer             = <1>;   /* Measurement interval during startup */
+		init_discard_time      = <5>;   /* Time we discard voltage measurement at startup */
+		init_total_time        = <40>;  /* Total init time during startup */
+		high_curr_time         = <60>;  /* Time current has to be high to go to recovery */
+		accu_charging          = <30>;  /* FG accumulation time while charging */
+		accu_high_curr         = <30>;  /* FG accumulation time in high current mode */
+		high_curr_threshold    = <50>;  /* High current threshold, in mA */
+		lowbat_threshold       = <3100>;/* Low battery threshold, in mV */
+		battok_falling_th_sel0 = <2860>;/* Over battery threshold, in mV */
+		battok_raising_th_sel1 = <2860>;/* Threshold in mV for battOk signal sel0 Resolution in 50 mV step. */
+		user_cap_limit         = <15>;  /* Threshold in mV for battOk signal sel1 Resolution in 50 mV step. */
+		maint_thres            = <97>;  /* Capacity reported from user must be within this limit to be considered as sane, in percentage points.
+	};                                   * This is the threshold where we stop reporting battery full while in maintenance, in per cent 
+										 */
diff --git a/arch/arm/boot/dts/db8500.dtsi b/arch/arm/boot/dts/db8500.dtsi
index 26f895f..6f3b5df 100644
--- a/arch/arm/boot/dts/db8500.dtsi
+++ b/arch/arm/boot/dts/db8500.dtsi
@@ -330,6 +330,333 @@
 					vddadc-supply = <&ab8500_ldo_tvout_reg>;
 				};
 
+                ab8500-fg {
+                    compatible = "stericsson,ab8500-fg";
+                    interrupts = <24 0x4
+                                  8 0x4
+                                  28 0x4
+                                  27 0x4
+                                  26 0x4>;
+                    interrupt-names = "NCONV_ACCU",
+									  "BATT_OVV",
+									  "LOW_BAT_F",
+									  "CC_INT_CALIB",
+									  "CCEOC";
+                    supplied_to = "ab8500_chargalg", "ab8500_usb";
+                    num_supplicants = <2>;
+                    bat = <&ab8500_bm_data>;
+                };
+
+                ab8500-btemp {
+                    compatible = "stericsson,ab8500-btemp";
+                    interrupts = <20 0x04
+                                  80 0x04
+                                  81 0x04
+                                  82 0x04
+                                  83 0x04>;
+                    interrupt-names = "BAT_CTRL_INDB",
+									  "BTEMP_LOW",
+									  "BTEMP_HIGH",
+									  "BTEMP_LOW_MEDIUM",
+									  "BTEMP_MEDIUM_HIGH";
+                    supplied_to = "ab8500_chargalg", "ab8500_fg";
+                    num_supplicants = <2>;
+                    bat = <&ab8500_bm_data>;
+                };
+
+                ab8500_battery_type_0: ab8500_battery_unknown {
+                    bat_name            =     <0>;
+                    resis_high          =     <0>;
+                    resis_low           =     <0>;
+                    charge_full_design  =     <612>;
+                    nominal_voltage     =     <3700>;
+                    termination_vol     =     <4050>;
+                    termination_curr    =     <200>;
+                    recharge_vol        =     <3990>;
+                    normal_cur_lvl      =     <400>;
+                    normal_vol_lvl      =     <4100>;
+                    maint_a_cur_lvl     =     <400>;
+                    maint_a_vol_lvl     =     <4050>;
+                    maint_a_chg_timer_h =     <60>;
+                    maint_b_cur_lvl     =     <400>;
+                    maint_b_vol_lvl     =     <4000>;
+                    maint_b_chg_timer_h =     <200>;
+                    low_high_cur_lvl    =     <300>;
+                    low_high_vol_lvl    =     <4000>;
+                    battery_resistance  =     <300>;
+
+                    n_temp_tbl_elements =     <15>;
+                    r_to_t_tbl = <
+                            0xfffffffb 214834 /* -5 */
+                            0 162943
+                            5 124820
+                            10  96520
+                            15  75306
+                            20  59254
+                            25  47000
+                            30  37566
+                            35  30245
+                            40  24520
+                            45  20010
+                            50  16432
+                            55  13576
+                            60  11280
+                            65  9425>;
+
+                    n_v_cap_tbl_elements = <24>;
+                    v_to_cap_tbl = <
+                            4186  100
+                            4163   99
+                            4114   95
+                            4068   90
+                            3990   80
+                            3926   70
+                            3898   65
+                            3866   60
+                            3833   55
+                            3812   50
+                            3787   40
+                            3768   30
+                            3747   25
+                            3730   20
+                            3705   15
+                            3699   14
+                            3684   12
+                            3672    9
+                            3657    7
+                            3638    6
+                            3556    4
+                            3424    2
+                            3317    1
+                            3094    0>;
+
+                    n_batres_tbl_elements = <7>;
+                    batres_tbl = <
+                            40 120
+                            30 135
+                            20 165
+                            10 230
+                            00 325
+                            0xfffffff6 445 /* -10 */
+                            0xffffffec 595>; /* -20 */
+                };
+
+                ab8500_battery_type_1: ab8500_battery_therm_on_batctrl {
+                    bat_name             = <3>;
+                    resis_high           = <53407>;
+                    resis_low            = <12500>;
+                    charge_full_design   = <900>;
+                    nominal_voltage      = <3600>;
+                    termination_vol      = <4150>;
+                    termination_curr     = <80>;
+                    recharge_vol         = <4130>;
+                    normal_cur_lvl       = <700>;
+                    normal_vol_lvl       = <4200>;
+                    maint_a_cur_lvl      = <600>;
+                    maint_a_vol_lvl      = <4150>;
+                    maint_a_chg_timer_h  = <60>;
+                    maint_b_cur_lvl      = <600>;
+                    maint_b_vol_lvl      = <4100>;
+                    maint_b_chg_timer_h  = <200>;
+                    low_high_cur_lvl     = <300>;
+                    low_high_vol_lvl     = <4000>;
+                    battery_resistance   = <300>;
+
+                    n_temp_tbl_elements =     <15>;
+                    r_to_t_tbl = <
+                            0xfffffffb 53407 /* -5 */
+                             0 48594
+                             5 43804
+                            10 39188
+                            15 34870
+                            20 30933
+                            25 27422
+                            30 24347
+                            35 21694
+                            40 19431
+                            45 17517
+                            50 15908
+                            55 14561
+                            60 13437
+                            65 12500>;
+
+                    n_v_cap_tbl_elements = <20>;
+                    v_to_cap_tbl = <
+                            4171  100
+                            4114   95
+                            4009   83
+                            3947   74
+                            3907   67
+                            3863   59
+                            3830   56
+                            3813   53
+                            3791   46
+                            3771   33
+                            3754   25
+                            3735   20
+                            3717   17
+                            3681   13
+                            3664    8
+                            3651    6
+                            3635    5
+                            3560    3
+                            3408    1
+                            3247    0>;
+
+                    n_batres_tbl_elements = <7>; /* ARRAY_SIZE(batres_tbl), */
+                    batres_tbl = <
+                            40 120
+                            30 135
+                            20 165
+                            10 230
+                            00 325
+                            0xfffffff6 445 /* -10 */
+                            0xffffffec 595>; /* -20 */
+                };
+
+                ab8500_battery_type_2: ab8500_battery_therm_on_batctrl_1 {
+                    bat_name            = <3>;
+                    resis_high          = <165418>;
+                    resis_low           = <82869>;
+                    charge_full_design  = <900>;
+                    nominal_voltage     = <3600>;
+                    termination_vol     = <4150>;
+                    termination_curr    = <80>;
+                    recharge_vol        = <4130>;
+                    normal_cur_lvl      = <700>;
+                    normal_vol_lvl      = <4200>;
+                    maint_a_cur_lvl     = <600>;
+                    maint_a_vol_lvl     = <4150>;
+                    maint_a_chg_timer_h = <60>;
+                    maint_b_cur_lvl     = <600>;
+                    maint_b_vol_lvl     = <4100>;
+                    maint_b_chg_timer_h = <200>;
+                    low_high_cur_lvl    = <300>;
+                    low_high_vol_lvl    = <4000>;
+                    battery_resistance  = <300>;
+
+                    n_temp_tbl_elements = <15>;
+                    r_to_t_tbl = <
+                               0xfffffffb  165418
+                             0 159024
+                             5 151921
+                            10 144300
+                            15 136424
+                            20 128565
+                            25 120978
+                            30 113875
+                            35 107397
+                            40 101629
+                            45  96592
+                            50  92253
+                            55  88569
+                            60  85461
+                            65  82869>;
+
+                    n_v_cap_tbl_elements = <20>;
+                    v_to_cap_tbl = <
+                            4161   100
+                            4124   98
+                            4044   90
+                            4003   85
+                            3966   80
+                            3933   75
+                            3888   67
+                            3849   60
+                            3813   55
+                            3787   47
+                            3772   30
+                            3751   25
+                            3718   20
+                            3681   16
+                            3660   14
+                            3589   10
+                            3546    7
+                            3495    4
+                            3404    2
+                            3250    0>;
+
+                    n_batres_tbl_elements = <7>; /* ARRAY_SIZE(batres_tbl), */
+                    batres_tbl = <
+                            40 120
+                            30 135
+                            20 165
+                            10 230
+                            00 325
+                            0xfffffff6 445 /* -10 */
+                            0xffffffec 595>; /* -20 */
+                };
+
+                ab8500_bm_data_cap_levels: bm_data_cap_levels {
+                    critical   = <2>;
+                    low        = <10>;
+                    normal     = <70>;
+                    high       = <95>;
+                    full       = <100>;
+                };
+
+                ab8500_bm_data_maxim_parameters: bm_data_maxim_parameters {
+                    ena_maxi     = <1>;
+                    chg_curr     = <910>;
+                    wait_cycles = <10>;
+                    charger_curr_step = <100>;
+                };
+
+                ab8500_bm_data_charger_parameters: bm_data_charger_parameters {
+                    usb_volt_max = <5500>;
+                    usb_curr_max = <1500>;
+                    ac_volt_max  = <7500>;
+                    ac_curr_max  = <1500>;
+                };
+
+                ab8500_bm_data_fuel_guage_parameters: bm_data_fuel_guage_parameters {
+                    recovery_sleep_timer   = <10>;
+                    recovery_total_time    = <100>;
+                    init_timer             = <1>;
+                    init_discard_time      = <5>;
+                    init_total_time        = <40>;
+                    high_curr_time         = <60>;
+                    accu_charging          = <30>;
+                    accu_high_curr         = <30>;
+                    high_curr_threshold    = <50>;
+                    lowbat_threshold       = <3100>;
+                    battok_falling_th_sel0 = <2860>;
+                    battok_raising_th_sel1 = <2860>;
+                    user_cap_limit         = <15>;
+                    maint_thres            = <97>;
+                };
+
+                ab8500_bm_data: bm_data {
+                    temp_under            = <3>;
+                    temp_low              = <8>;
+                    temp_high             = <43>;
+                    temp_over             = <48>;
+                    temp_now              = <0>;
+                    temp_interval_chg     = <20>;
+                    temp_interval_nochg   = <120>;
+                    main_safety_tmr_h     = <4>;
+                    usb_safety_tmr_h      = <4>;
+                    bkup_bat_v            = <1>; /* BUP_VCH_SEL_2P6V */
+                    bkup_bat_i            = <4>; /* BUP_ICH_SEL_150UA */
+                    no_maintenance        = <0>; /* CONFIG_AB8500_9100_LI_ION_BATTERY not considered */
+                    chg_unknown_bat       = <0>; /* CONFIG_AB8500_9100_LI_ION_BATTERY not considered */
+                    enable_overshoot      = <0>;
+                    auto_trig             = <0>;
+                    adc_therm             = <0>;
+                    fg_res                = <100>;
+                    n_btypes              = <3>;
+                    batt_id               = <0>;
+                    interval_charging     = <5>;
+                    interval_not_charging = <120>;
+                    temp_hysteresis       = <3>;
+                    gnd_lift_resistance   = <34>;
+                    maxi                  = <&ab8500_bm_data_maxim_parameters>;
+                    cap_levels            = <&ab8500_bm_data_cap_levels>;
+                    bat_type              = <&ab8500_battery_type_0 &ab8500_battery_type_1 &ab8500_battery_type_2>;
+                    chg_params            = <&ab8500_bm_data_charger_parameters>;
+                    fg_params             = <&ab8500_bm_data_fuel_guage_parameters>;
+                };
+
 				ab8500-usb {
 					compatible = "stericsson,ab8500-usb";
 					interrupts = < 90 0x4
diff --git a/drivers/mfd/ab8500-core.c b/drivers/mfd/ab8500-core.c
index 6d613e8..837488b 100644
--- a/drivers/mfd/ab8500-core.c
+++ b/drivers/mfd/ab8500-core.c
@@ -1419,15 +1419,15 @@ static int __devinit ab8500_probe(struct platform_device *pdev)
 					ab8500->irq_base);
 		if (ret)
 			goto out_freeirq;
-	}
 
-	if (!no_bm) {
-		/* Add battery management devices */
-		ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs,
-				      ARRAY_SIZE(ab8500_bm_devs), NULL,
-				      ab8500->irq_base);
-		if (ret)
-			dev_err(ab8500->dev, "error adding bm devices\n");
+		if (!no_bm) {
+			/* Add battery management devices */
+			ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs,
+				ARRAY_SIZE(ab8500_bm_devs), NULL,
+				ab8500->irq_base);
+			if (ret)
+				dev_err(ab8500->dev, "error adding bm devices\n");
+		}
 	}
 
 	if (is_ab9540(ab8500))
diff --git a/drivers/power/ab8500_btemp.c b/drivers/power/ab8500_btemp.c
index bba3cca..04da929 100644
--- a/drivers/power/ab8500_btemp.c
+++ b/drivers/power/ab8500_btemp.c
@@ -20,6 +20,7 @@
 #include <linux/power_supply.h>
 #include <linux/completion.h>
 #include <linux/workqueue.h>
+#include <linux/of.h>
 #include <linux/mfd/abx500/ab8500.h>
 #include <linux/mfd/abx500.h>
 #include <linux/mfd/abx500/ab8500-bm.h>
@@ -480,7 +481,7 @@ static int ab8500_btemp_measure_temp(struct ab8500_btemp *di)
 		vntc = ab8500_gpadc_convert(di->gpadc, BTEMP_BALL);
 		if (vntc < 0) {
 			dev_err(di->dev,
-				"%s gpadc conversion failed,"
+				"%s gpadc conversion failed, "
 				" using previous value\n", __func__);
 			return prev;
 		}
@@ -960,15 +961,249 @@ static int __devexit ab8500_btemp_remove(struct platform_device *pdev)
 	return 0;
 }
 
+int populate_abx8500_bm_data(struct device *dev,
+		struct abx500_bm_data *bm_data,
+		struct device_node *np)
+{
+	int i, plen, itbl, ret = 0;
+	phandle *temp_phandle;
+	struct abx500_battery_type *temp_bat_type;
+	struct property *pbat_type;
+	struct device_node *np_bat;
+	const __be32 *p;
+	u32 u;
+
+#define get_bm_data_property(node_p, prop_name)\
+	be32_to_cpup(of_get_property(node_p, prop_name, NULL));
+
+	temp_phandle = (phandle *)of_get_property(np, "bat", NULL);
+	BUG_ON(!temp_phandle);
+	np_bat = of_find_node_by_phandle(be32_to_cpup(temp_phandle));
+	BUG_ON(!np_bat);
+
+	bm_data->temp_under = get_bm_data_property(np_bat, "temp_under");
+	bm_data->temp_low = get_bm_data_property(np_bat, "temp_low");
+	bm_data->temp_high = get_bm_data_property(np_bat, "temp_high");
+	bm_data->temp_over = get_bm_data_property(np_bat, "temp_over");
+	bm_data->temp_now = get_bm_data_property(np_bat, "temp_now");
+	bm_data->temp_interval_chg =
+		get_bm_data_property(np_bat, "temp_interval_chg");
+	bm_data->temp_interval_nochg =
+		 get_bm_data_property(np_bat, "temp_interval_nochg");
+	bm_data->main_safety_tmr_h =
+		 get_bm_data_property(np_bat, "main_safety_tmr_h");
+	bm_data->usb_safety_tmr_h =
+		 get_bm_data_property(np_bat, "usb_safety_tmr_h");
+	bm_data->bkup_bat_v =
+		 get_bm_data_property(np_bat, "bkup_bat_v");
+	bm_data->bkup_bat_i =
+		 get_bm_data_property(np_bat, "bkup_bat_i");
+	bm_data->no_maintenance =
+		 get_bm_data_property(np_bat, "no_maintenance");
+	bm_data->chg_unknown_bat =
+		 get_bm_data_property(np_bat, "chg_unknown_bat");
+	bm_data->enable_overshoot =
+		 get_bm_data_property(np_bat, "enable_overshoot");
+	bm_data->auto_trig =
+		 get_bm_data_property(np_bat, "auto_trig");
+	bm_data->adc_therm =
+		 get_bm_data_property(np_bat, "adc_therm");
+	bm_data->fg_res =
+		 get_bm_data_property(np_bat, "fg_res");
+	bm_data->n_btypes =
+		 get_bm_data_property(np_bat, "n_btypes");
+	bm_data->batt_id =
+		 get_bm_data_property(np_bat, "batt_id");
+	bm_data->interval_charging =
+		 get_bm_data_property(np_bat, "interval_charging");
+	bm_data->interval_not_charging =
+		get_bm_data_property(np_bat, "interval_not_charging");
+	bm_data->temp_hysteresis =
+		get_bm_data_property(np_bat, "temp_hysteresis");
+	bm_data->gnd_lift_resistance =
+		get_bm_data_property(np_bat, "gnd_lift_resistance");
+
+	temp_phandle = (phandle *)of_get_property(np_bat, "bat_type", &plen);
+	if (temp_phandle == NULL) {
+		dev_warn(dev, "battery type not found\n");
+		return -EINVAL;
+	}
+
+	plen = plen/sizeof(u32);
+
+	if (bm_data->n_btypes != plen) {
+		dev_crit(dev, "Invalid number of battery types\n");
+		return -EINVAL;
+	}
+
+	bm_data->bat_type =
+		kzalloc(plen * sizeof(struct abx500_battery_type), GFP_KERNEL);
+	if (bm_data->bat_type == NULL) {
+		dev_crit(dev, "no mem for bm_data->bat_type\n");
+		return -ENOMEM;
+	}
+
+	of_node_put(np_bat);
+
+	/*
+	 * traverse 'plen' times in 'allnext' for battery types and
+	 * fillup bm_data->bat_type
+	 */
+	i = 0;
+	for_each_node_by_phandle(np_bat, plen, temp_phandle)
+	{
+		temp_bat_type = (struct abx500_battery_type *)
+				(bm_data->bat_type + i++);
+		temp_bat_type->name	=
+		 get_bm_data_property(np_bat, "bat_name");
+		temp_bat_type->resis_high =
+		 get_bm_data_property(np_bat, "resis_high");
+		temp_bat_type->resis_low =
+		 get_bm_data_property(np_bat, "resis_low");
+		temp_bat_type->charge_full_design =
+		 get_bm_data_property(np_bat, "charge_full_design");
+		temp_bat_type->nominal_voltage =
+		 get_bm_data_property(np_bat, "nominal_voltage");
+		temp_bat_type->termination_vol =
+		 get_bm_data_property(np_bat, "termination_vol");
+		temp_bat_type->termination_curr =
+		 get_bm_data_property(np_bat, "termination_curr");
+		temp_bat_type->recharge_vol	=
+		 get_bm_data_property(np_bat, "recharge_vol");
+		temp_bat_type->normal_cur_lvl =
+		 get_bm_data_property(np_bat, "normal_cur_lvl");
+		temp_bat_type->normal_vol_lvl =
+		 get_bm_data_property(np_bat, "normal_vol_lvl");
+		temp_bat_type->maint_a_cur_lvl =
+		 get_bm_data_property(np_bat, "maint_a_cur_lvl");
+		temp_bat_type->maint_a_vol_lvl =
+		 get_bm_data_property(np_bat, "maint_a_vol_lvl");
+		temp_bat_type->maint_a_chg_timer_h =
+		 get_bm_data_property(np_bat, "maint_a_chg_timer_h");
+		temp_bat_type->maint_b_cur_lvl =
+		 get_bm_data_property(np_bat, "maint_b_cur_lvl");
+		temp_bat_type->maint_b_vol_lvl =
+		 get_bm_data_property(np_bat, "maint_b_vol_lvl");
+		temp_bat_type->maint_b_chg_timer_h =
+		 get_bm_data_property(np_bat, "maint_b_chg_timer_h");
+		temp_bat_type->low_high_cur_lvl =
+		 get_bm_data_property(np_bat, "low_high_cur_lvl");
+		temp_bat_type->low_high_vol_lvl =
+		 get_bm_data_property(np_bat, "low_high_vol_lvl");
+		temp_bat_type->battery_resistance =
+		 get_bm_data_property(np_bat, "battery_resistance");
+
+		temp_bat_type->n_temp_tbl_elements =
+			get_bm_data_property(np_bat, "n_temp_tbl_elements");
+		temp_bat_type->r_to_t_tbl = (struct abx500_res_to_temp *)
+			kzalloc(sizeof(struct abx500_res_to_temp) *
+			temp_bat_type->n_temp_tbl_elements, GFP_KERNEL);
+		if (temp_bat_type->r_to_t_tbl == NULL) {
+			dev_crit(dev, "no mem for r_to_t_tbl\n");
+			kfree(bm_data->bat_type);
+			return -ENOMEM;
+		}
+		itbl = 0;
+		of_property_for_each_u32(np_bat, "r_to_t_tbl", pbat_type, p, u)
+			*((int *)(temp_bat_type->r_to_t_tbl) + itbl++) = (int)u;
+
+		temp_bat_type->n_v_cap_tbl_elements =
+			get_bm_data_property(np_bat, "n_v_cap_tbl_elements");
+		temp_bat_type->v_to_cap_tbl = (struct abx500_v_to_cap *)
+			kzalloc(sizeof(struct abx500_v_to_cap) *
+			temp_bat_type->n_v_cap_tbl_elements, GFP_KERNEL);
+		if (temp_bat_type->v_to_cap_tbl == NULL) {
+			ret = -ENOMEM;
+			dev_crit(dev, "no mem for v_to_cap_tbl\n");
+			goto out_free_mem1;
+		}
+		itbl = 0;
+		of_property_for_each_u32(np_bat,
+			"v_to_cap_tbl", pbat_type, p, u)
+			*((int *)(temp_bat_type->v_to_cap_tbl) + itbl++) =
+				(int)u;
+
+		temp_bat_type->n_batres_tbl_elements =
+			get_bm_data_property(np_bat, "n_batres_tbl_elements");
+		temp_bat_type->batres_tbl = (struct batres_vs_temp *)
+			kzalloc(sizeof(struct batres_vs_temp) *
+			temp_bat_type->n_temp_tbl_elements, GFP_KERNEL);
+		if (temp_bat_type->batres_tbl == NULL) {
+			ret = -ENOMEM;
+			dev_crit(dev, "no mem for batres_tbl\n");
+			goto out_free_mem2;
+		}
+		itbl = 0;
+		of_property_for_each_u32(np_bat, "batres_tbl", pbat_type, p, u)
+			*((int *)(temp_bat_type->batres_tbl) + itbl++) = (int)u;
+	}
+
+	of_node_put(np_bat);
+
+	bm_data->chg_params = (struct abx500_bm_charger_parameters *)
+		kzalloc(sizeof(struct abx500_bm_charger_parameters),
+			GFP_KERNEL);
+	if (bm_data->chg_params == NULL) {
+		dev_crit(dev, "Failed to alloc memory for chg_params\n");
+		ret = -ENOMEM;
+		goto out_free_mem3;
+	}
+	itbl = 0;
+	of_property_for_each_u32(np_bat, "chg_params", pbat_type, p, u)
+		*((int *)(bm_data->chg_params) + itbl++) = (int)u;
+
+	bm_data->fg_params = (struct abx500_fg_parameters *)
+		kzalloc(sizeof(struct abx500_fg_parameters), GFP_KERNEL);
+	if (bm_data->fg_params == NULL) {
+		dev_crit(dev, "Failed to alloc memory for fg_params\n");
+		ret = -ENOMEM;
+		goto out_free_mem4;
+	}
+	itbl = 0;
+	of_property_for_each_u32(np_bat, "fg_params", pbat_type, p, u)
+		*((int *)(bm_data->fg_params) + itbl++) = (int)u;
+
+	return ret;
+
+out_free_mem1:
+	kfree(bm_data->bat_type);
+	kfree(temp_bat_type->r_to_t_tbl);
+	return ret;
+
+out_free_mem2:
+	kfree(bm_data->bat_type);
+	kfree(temp_bat_type->r_to_t_tbl);
+	kfree(temp_bat_type->v_to_cap_tbl);
+	return ret;
+
+out_free_mem3:
+	kfree(bm_data->bat_type);
+	kfree(temp_bat_type->r_to_t_tbl);
+	kfree(temp_bat_type->v_to_cap_tbl);
+	kfree(temp_bat_type->batres_tbl);
+	return ret;
+
+out_free_mem4:
+	kfree(bm_data->bat_type);
+	kfree(temp_bat_type->r_to_t_tbl);
+	kfree(temp_bat_type->v_to_cap_tbl);
+	kfree(temp_bat_type->batres_tbl);
+	kfree(bm_data->chg_params);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(populate_abx8500_bm_data);
+
 static int __devinit ab8500_btemp_probe(struct platform_device *pdev)
 {
 	int irq, i, ret = 0;
 	u8 val;
-	struct abx500_bm_plat_data *plat_data = pdev->dev.platform_data;
+	struct device_node *np = pdev->dev.of_node;
 	struct ab8500_btemp *di;
+	const unsigned int *btemp_p_val;
+	const char *pvalue = NULL;
 
-	if (!plat_data) {
-		dev_err(&pdev->dev, "No platform data\n");
+	if (!np) {
+		dev_err(&pdev->dev, "No platform data or DT found\n");
 		return -EINVAL;
 	}
 
@@ -982,20 +1217,46 @@ static int __devinit ab8500_btemp_probe(struct platform_device *pdev)
 	di->gpadc = ab8500_gpadc_get("ab8500-gpadc.0");
 
 	/* get btemp specific platform data */
-	di->pdata = plat_data->btemp;
-	if (!di->pdata) {
-		dev_err(di->dev, "no btemp platform data supplied\n");
-		ret = -EINVAL;
-		goto free_device_info;
+	btemp_p_val = of_get_property(np, "num_supplicants", NULL);
+	BUG_ON(!btemp_p_val);
+
+	di->pdata =
+		kzalloc(sizeof(struct abx500_btemp_platform_data), GFP_KERNEL);
+	if (di->pdata == NULL) {
+		kfree(di);
+		return -ENOMEM;
 	}
 
-	/* get battery specific platform data */
-	di->bat = plat_data->battery;
+	di->pdata->num_supplicants = be32_to_cpup(btemp_p_val);
+	di->pdata->supplied_to =
+		kzalloc(di->pdata->num_supplicants *
+			sizeof(const char *), GFP_KERNEL);
+	if (di->pdata->supplied_to == NULL) {
+		kfree(di);
+		kfree(di->pdata);
+		return -ENOMEM;
+	}
+
+	for (val = 0; val < di->pdata->num_supplicants; ++val)
+		if (of_property_read_string_index
+			(np, "supplied_to", val, &pvalue) == 0)
+			*(di->pdata->supplied_to + val) = (char *)pvalue;
+		else {
+			dev_warn(di->dev, "insufficient number of supplied_to data found\n");
+			goto free_device_info;
+		}
+	dev_dbg(di->dev, "getting DT battery information\n");
+	di->bat = kzalloc(sizeof(struct abx500_bm_data), GFP_KERNEL);
 	if (!di->bat) {
-		dev_err(di->dev, "no battery platform data supplied\n");
-		ret = -EINVAL;
+		kfree(di);
+		kfree(di->pdata);
+		return -ENOMEM;
+	}
+	if (populate_abx8500_bm_data(di->dev, di->bat, np) < 0) {
+		dev_warn(di->dev, "Failed to bind DT\n");
 		goto free_device_info;
 	}
+	dev_dbg(di->dev, "getting DT battery information...done\n");
 
 	/* BTEMP supply */
 	di->btemp_psy.name = "ab8500_btemp";
@@ -1008,7 +1269,6 @@ static int __devinit ab8500_btemp_probe(struct platform_device *pdev)
 	di->btemp_psy.external_power_changed =
 		ab8500_btemp_external_power_changed;
 
-
 	/* Create a work queue for the btemp */
 	di->btemp_wq =
 		create_singlethread_workqueue("ab8500_btemp_wq");
@@ -1016,7 +1276,6 @@ static int __devinit ab8500_btemp_probe(struct platform_device *pdev)
 		dev_err(di->dev, "failed to create work queue\n");
 		goto free_device_info;
 	}
-
 	/* Init work for measuring temperature periodically */
 	INIT_DELAYED_WORK_DEFERRABLE(&di->btemp_periodic_work,
 		ab8500_btemp_periodic_work);
@@ -1090,14 +1349,23 @@ free_irq:
 		irq = platform_get_irq_byname(pdev, ab8500_btemp_irq[i].name);
 		free_irq(irq, di);
 	}
+
 free_btemp_wq:
 	destroy_workqueue(di->btemp_wq);
+
 free_device_info:
 	kfree(di);
+	kfree(di->pdata);
+	kfree(di->bat);
 
 	return ret;
 }
 
+static const struct of_device_id ab8500_btemp_match[] = {
+	{.compatible = "stericsson,ab8500-btemp",},
+	{},
+};
+
 static struct platform_driver ab8500_btemp_driver = {
 	.probe = ab8500_btemp_probe,
 	.remove = __devexit_p(ab8500_btemp_remove),
@@ -1106,6 +1374,7 @@ static struct platform_driver ab8500_btemp_driver = {
 	.driver = {
 		.name = "ab8500-btemp",
 		.owner = THIS_MODULE,
+		.of_match_table = ab8500_btemp_match,
 	},
 };
 
diff --git a/drivers/power/ab8500_fg.c b/drivers/power/ab8500_fg.c
index bf02225..1d0e32a 100644
--- a/drivers/power/ab8500_fg.c
+++ b/drivers/power/ab8500_fg.c
@@ -31,6 +31,7 @@
 #include <linux/mfd/abx500.h>
 #include <linux/time.h>
 #include <linux/completion.h>
+#include <linux/of.h>
 
 #define MILLI_TO_MICRO			1000
 #define FG_LSB_IN_MA			1627
@@ -2446,11 +2447,12 @@ static int __devinit ab8500_fg_probe(struct platform_device *pdev)
 {
 	int i, irq;
 	int ret = 0;
-	struct abx500_bm_plat_data *plat_data = pdev->dev.platform_data;
+	const char *fg_p_val;
+	struct device_node *np = pdev->dev.of_node;
 	struct ab8500_fg *di;
 
-	if (!plat_data) {
-		dev_err(&pdev->dev, "No platform data\n");
+	if (!np) {
+		dev_err(&pdev->dev, "No DT node for platform data available\n");
 		return -EINVAL;
 	}
 
@@ -2464,20 +2466,42 @@ static int __devinit ab8500_fg_probe(struct platform_device *pdev)
 	di->dev = &pdev->dev;
 	di->parent = dev_get_drvdata(pdev->dev.parent);
 	di->gpadc = ab8500_gpadc_get("ab8500-gpadc.0");
-
-	/* get fg specific platform data */
-	di->pdata = plat_data->fg;
-	if (!di->pdata) {
-		dev_err(di->dev, "no fg platform data supplied\n");
-		ret = -EINVAL;
-		goto free_device_info;
+	di->pdata =
+		kzalloc(sizeof(struct abx500_btemp_platform_data), GFP_KERNEL);
+	if (di->pdata == NULL) {
+		kfree(di);
+		return -ENOMEM;
+	}
+	di->pdata->num_supplicants =
+		be32_to_cpup(of_get_property(np, "num_supplicants", NULL));
+	di->pdata->supplied_to =
+		kzalloc(di->pdata->num_supplicants *
+			sizeof(const char *), GFP_KERNEL);
+	if (di->pdata->supplied_to == NULL) {
+		kfree(di);
+		kfree(di->pdata);
+		return -ENOMEM;
 	}
 
+	for (i = 0; i < di->pdata->num_supplicants; ++i)
+		if (of_property_read_string_index
+			(np, "supplied_to", i, &fg_p_val) == 0)
+			*(di->pdata->supplied_to + i) = (char *)fg_p_val;
+		else {
+				dev_warn(di->dev, "insufficient number of supplied_to data found\n");
+				goto free_device_info;
+			}
+
 	/* get battery specific platform data */
-	di->bat = plat_data->battery;
+	di->bat = kzalloc(sizeof(struct abx500_bm_data), GFP_KERNEL);
 	if (!di->bat) {
-		dev_err(di->dev, "no battery platform data supplied\n");
-		ret = -EINVAL;
+		kfree(di);
+		kfree(di->pdata);
+		return -ENOMEM;
+	}
+	ret = populate_abx8500_bm_data(di->dev, di->bat, np);
+	if (ret < 0) {
+		dev_warn(di->dev, "Failed to bind DT\n");
 		goto free_device_info;
 	}
 
@@ -2607,10 +2631,15 @@ free_inst_curr_wq:
 	destroy_workqueue(di->fg_wq);
 free_device_info:
 	kfree(di);
+	kfree(di->pdata);
 
 	return ret;
 }
 
+static const struct of_device_id ab8500_fg_match[] = {
+	{.compatible = "stericsson,ab8500-fg",},
+	{},
+};
 static struct platform_driver ab8500_fg_driver = {
 	.probe = ab8500_fg_probe,
 	.remove = __devexit_p(ab8500_fg_remove),
@@ -2619,6 +2648,7 @@ static struct platform_driver ab8500_fg_driver = {
 	.driver = {
 		.name = "ab8500-fg",
 		.owner = THIS_MODULE,
+		.of_match_table = ab8500_fg_match,
 	},
 };
 
@@ -2632,7 +2662,7 @@ static void __exit ab8500_fg_exit(void)
 	platform_driver_unregister(&ab8500_fg_driver);
 }
 
-subsys_initcall_sync(ab8500_fg_init);
+subsys_initcall(ab8500_fg_init);
 module_exit(ab8500_fg_exit);
 
 MODULE_LICENSE("GPL v2");
diff --git a/include/linux/mfd/abx500.h b/include/linux/mfd/abx500.h
index 1318ca6..9dbc4d1 100644
--- a/include/linux/mfd/abx500.h
+++ b/include/linux/mfd/abx500.h
@@ -113,13 +113,13 @@ struct ab3100 {
  * struct ab3100_platform_data
  * Data supplied to initialize board connections to the AB3100
  * @reg_constraints: regulator constraints for target board
- *     the order of these constraints are: LDO A, C, D, E,
- *     F, G, H, K, EXT and BUCK.
+ *	 the order of these constraints are: LDO A, C, D, E,
+ *	 F, G, H, K, EXT and BUCK.
  * @reg_initvals: initial values for the regulator registers
- *     plus two sleep settings for LDO E and the BUCK converter.
- *     exactly AB3100_NUM_REGULATORS+2 values must be sent in.
- *     Order: LDO A, C, E, E sleep, F, G, H, K, EXT, BUCK,
- *     BUCK sleep, LDO D. (LDO D need to be initialized last.)
+ *	 plus two sleep settings for LDO E and the BUCK converter.
+ *	 exactly AB3100_NUM_REGULATORS+2 values must be sent in.
+ *	 Order: LDO A, C, E, E sleep, F, G, H, K, EXT, BUCK,
+ *	 BUCK sleep, LDO D. (LDO D need to be initialized last.)
  * @external_voltage: voltage level of the external regulator.
  */
 struct ab3100_platform_data {
@@ -131,7 +131,7 @@ struct ab3100_platform_data {
 int ab3100_event_register(struct ab3100 *ab3100,
 			  struct notifier_block *nb);
 int ab3100_event_unregister(struct ab3100 *ab3100,
-			    struct notifier_block *nb);
+				struct notifier_block *nb);
 
 /**
  * struct abx500_init_setting
@@ -387,6 +387,9 @@ struct abx500_bm_data {
 	const struct abx500_fg_parameters *fg_params;
 };
 
+int populate_abx8500_bm_data(struct device *, struct abx500_bm_data *,
+						struct device_node *);
+
 struct abx500_chargalg_platform_data {
 	char **supplied_to;
 	size_t num_supplicants;
diff --git a/include/linux/of.h b/include/linux/of.h
index 2ec1083..61b4ac8 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -183,6 +183,39 @@ extern struct device_node *of_find_matching_node(struct device_node *from,
 #define for_each_matching_node(dn, matches) \
 	for (dn = of_find_matching_node(NULL, matches); dn; \
 	     dn = of_find_matching_node(dn, matches))
+
+/*
+ * syntax: for_each_node_by_phandle(np, len, phandle);
+ * @np : pointer to node to start in the list
+ * @len: number of nodes expected
+ * @phandle: current phandle which is obtained through of_get_property(...)
+ *
+ * e.g:
+ *	 node_a: <> {
+ *		...
+ *	 };
+ *	 node_b: <> {
+ *		...
+ *	 };
+ *	 node_c: <> {
+ *		...
+ *	 };
+ *
+ *	 node_x: <> {
+ *		p1 = <v1>;
+ *		p2 = <v2>;
+ *		n_nodes = <3>
+ *		p3 = <&node_a &node_b &node_c ....>;
+ *	 };
+ *
+ * Note:
+ *	 - invoke of_node_put(...) as it uses of_find_node_by_phandle(...)
+ */
+#define for_each_node_by_phandle(np, len, phandle) \
+	for (np = of_find_node_by_phandle(be32_to_cpup(phandle));\
+		(len--);\
+		np = np->allnext)
+
 extern struct device_node *of_find_node_by_path(const char *path);
 extern struct device_node *of_find_node_by_phandle(phandle handle);
 extern struct device_node *of_get_parent(const struct device_node *node);
