power: support LGE battery 2100mAh

Add battery 2100mAh profile and update Battery mornitoring system(BMS)

Change-Id: Iea118f1665241c7e4192a77db791b80426a01b60
diff --git a/arch/arm/mach-msm/bms-batterydata.c b/arch/arm/mach-msm/bms-batterydata.c
index 77e7dab..e381fd4 100644
--- a/arch/arm/mach-msm/bms-batterydata.c
+++ b/arch/arm/mach-msm/bms-batterydata.c
@@ -11,6 +11,111 @@
  */
 
 #include <linux/mfd/pm8xxx/pm8921-bms.h>
+static struct single_row_lut lge_2100_fcc_temp = {
+	.x = {-20, 0, 25, 40, 60 },
+	.y = {2114, 2114, 2115, 2111, 2104 },
+	.cols = 5
+};
+static struct single_row_lut lge_2100_fcc_sf = {
+	.x     = {0 },
+	.y     = {100 },
+	.cols  = 1
+};
+static struct sf_lut lge_2100_rbatt_sf =  {
+	.rows = 28,
+	.cols = 5,
+	.row_entries = {-20, 0, 25, 40, 60 },
+	.percent =  {100, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50,
+			45, 40, 35, 30, 25, 20, 15, 10,
+			9, 8, 7, 6, 5, 4, 3, 2, 1 },
+	.sf = {
+		{950,394,100,65,43},
+		{989,398,110,71,47},
+		{1007,394,116,77,51},
+		{1038,391,119,79,55},
+		{1102,395,122,81,58},
+		{1223,400,123,81,59},
+		{1378,409,124,83,60},
+		{1548,418,118,81,59},
+		{1717,423,111,68,48},
+		{1878,431,115,69,47},
+		{2050,442,123,73,51},
+		{2208,461,132,77,55},
+		{2383,485,143,82,58},
+		{2575,512,153,88,55},
+		{2815,538,163,92,53},
+		{3121,620,170,91,55},
+		{3565,794,170,85,50},
+		{4330,985,212,104,61},
+		{2534,561,184,96,58},
+		{2722,569,189,98,59},
+		{2957,580,195,100,59},
+		{3228,592,202,101,56},
+		{3564,602,206,99,55},
+		{4012,614,211,99,56},
+		{4622,632,223,105,61},
+		{5479,665,243,115,66},
+		{6782,760,270,127,70},
+		{9140,1069,307,141,81},
+	}
+};
+static struct pc_temp_ocv_lut lge_2100_pc_temp_ocv = {
+	.rows = 29,
+	.cols = 5,
+	.temp = {-20, 0, 25, 40, 60 },
+	.percent = {100, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50,
+			45, 40, 35, 30, 25, 20, 15, 10,
+			9, 8, 7, 6, 5, 4, 3, 2, 1, 0 },
+	.ocv = {
+		{4335, 4333, 4329, 4324, 4317 },
+		{4241, 4256, 4259, 4259, 4254 },
+		{4165, 4195, 4201, 4201, 4197 },
+		{4089, 4135, 4145, 4145, 4142 },
+		{4028, 4076, 4092, 4092, 4089 },
+		{3978, 4019, 4042, 4042, 4039 },
+		{3940, 3965, 3993, 3994, 3993 },
+		{3907, 3924, 3953, 3955, 3953 },
+		{3879, 3888, 3906, 3916, 3915 },
+		{3853, 3855, 3862, 3865, 3865 },
+		{3828, 3826, 3831, 3833, 3833 },
+		{3806, 3802, 3808, 3809, 3809 },
+		{3785, 3785, 3791, 3789, 3790 },
+		{3766, 3772, 3777, 3775, 3775 },
+		{3747, 3760, 3767, 3764, 3756 },
+		{3730, 3737, 3755, 3750, 3736 },
+		{3710, 3722, 3733, 3725, 3712 },
+		{3684, 3707, 3694, 3686, 3672 },
+		{3647, 3686, 3677, 3671, 3660 },
+		{3638, 3681, 3674, 3669, 3658 },
+		{3626, 3674, 3670, 3665, 3655 },
+		{3611, 3665, 3663, 3656, 3645 },
+		{3593, 3648, 3643, 3633, 3618 },
+		{3567, 3616, 3605, 3593, 3577 },
+		{3531, 3569, 3551, 3542, 3528 },
+		{3478, 3502, 3485, 3480, 3467 },
+		{3403, 3409, 3405, 3399, 3382 },
+		{3281, 3281, 3284, 3271, 3247 },
+		{3000, 3000, 3000, 3000, 3000 }
+	}
+};
+static struct sf_lut lge_2100_pc_sf = {
+	.rows = 1,
+	.cols = 1,
+	.row_entries = {0 },
+	.percent = {100 },
+	.sf = {
+		{100 }
+	}
+};
+struct pm8921_bms_battery_data lge_2100_mako_data =  {
+	.fcc = 2100,
+	.fcc_temp_lut = &lge_2100_fcc_temp,
+	.fcc_sf_lut = &lge_2100_fcc_sf,
+	.pc_temp_ocv_lut = &lge_2100_pc_temp_ocv,
+	.pc_sf_lut = &lge_2100_pc_sf,
+	.rbatt_sf_lut = &lge_2100_rbatt_sf,
+	.default_rbatt_mohm = 98,
+};
 
 static struct single_row_lut palladium_1500_fcc_temp = {
 	.x	= {-30, -20, -10, 0, 10, 25, 40, 60},
diff --git a/arch/arm/mach-msm/lge/mako/board-mako-pmic.c b/arch/arm/mach-msm/lge/mako/board-mako-pmic.c
index 039ff0b..adaf779 100644
--- a/arch/arm/mach-msm/lge/mako/board-mako-pmic.c
+++ b/arch/arm/mach-msm/lge/mako/board-mako-pmic.c
@@ -365,7 +365,7 @@
 
 static struct pm8921_bms_platform_data
 apq8064_pm8921_bms_pdata __devinitdata = {
-	.battery_type	= BATT_UNKNOWN, //FIXME Define correct type
+	.battery_type		= BATT_LGE,
 	.r_sense		= 10,
 	.i_test			= 834,
 	.v_failure		= 3300,
diff --git a/drivers/power/pm8921-bms.c b/drivers/power/pm8921-bms.c
index b0439bc..aad04cf 100644
--- a/drivers/power/pm8921-bms.c
+++ b/drivers/power/pm8921-bms.c
@@ -140,7 +140,7 @@
 
 static struct pm8921_bms_chip *the_chip;
 
-#define DEFAULT_RBATT_MOHMS		128
+#define DEFAULT_RBATT_MOHMS			200
 #define DEFAULT_OCV_MICROVOLTS		3900000
 #define DEFAULT_CHARGE_CYCLES		0
 
@@ -2201,6 +2201,8 @@
 		goto desay;
 	else if (chip->batt_type == BATT_PALLADIUM)
 		goto palladium;
+	else if (chip->batt_type == BATT_LGE)
+		goto lge;
 
 	battery_id = read_battery_id(chip);
 	if (battery_id < 0) {
@@ -2239,6 +2241,17 @@
 		chip->default_rbatt_mohm = desay_5200_data.default_rbatt_mohm;
 		chip->delta_rbatt_mohm = desay_5200_data.delta_rbatt_mohm;
 		return 0;
+lge:
+		chip->fcc = lge_2100_mako_data.fcc;
+		chip->fcc_temp_lut = lge_2100_mako_data.fcc_temp_lut;
+		chip->fcc_sf_lut = lge_2100_mako_data.fcc_sf_lut;
+		chip->pc_temp_ocv_lut = lge_2100_mako_data.pc_temp_ocv_lut;
+		chip->pc_sf_lut = lge_2100_mako_data.pc_sf_lut;
+		chip->rbatt_sf_lut = lge_2100_mako_data.rbatt_sf_lut;
+		chip->default_rbatt_mohm
+				= lge_2100_mako_data.default_rbatt_mohm;
+		chip->delta_rbatt_mohm = lge_2100_mako_data.delta_rbatt_mohm;
+		return 0;
 }
 
 enum bms_request_operation {
diff --git a/include/linux/mfd/pm8xxx/pm8921-bms.h b/include/linux/mfd/pm8xxx/pm8921-bms.h
index 537e0b5..d232ce7 100644
--- a/include/linux/mfd/pm8xxx/pm8921-bms.h
+++ b/include/linux/mfd/pm8xxx/pm8921-bms.h
@@ -108,6 +108,7 @@
 	BATT_UNKNOWN = 0,
 	BATT_PALLADIUM,
 	BATT_DESAY,
+	BATT_LGE,
 };
 
 /**
@@ -136,6 +137,7 @@
 #if defined(CONFIG_PM8921_BMS) || defined(CONFIG_PM8921_BMS_MODULE)
 extern struct pm8921_bms_battery_data  palladium_1500_data;
 extern struct pm8921_bms_battery_data  desay_5200_data;
+extern struct pm8921_bms_battery_data  lge_2100_mako_data;
 /**
  * pm8921_bms_get_vsense_avg - return the voltage across the sense
  *				resitor in microvolts