power: add battery type selection and check lge battery

lk should support battery check to enable this feature.
if you want to use it, set CONFIG_LGE_PM_BATTERY_ID_CHECKER=y
in defconfig

Change-Id: Ie92c612e197aeede39b8da526332add3fab15a19
diff --git a/arch/arm/mach-msm/include/mach/board_lge.h b/arch/arm/mach-msm/include/mach/board_lge.h
index e95512b..bb691cc 100644
--- a/arch/arm/mach-msm/include/mach/board_lge.h
+++ b/arch/arm/mach-msm/include/mach/board_lge.h
@@ -80,14 +80,12 @@
 #endif
 
 #ifdef CONFIG_LGE_PM_BATTERY_ID_CHECKER
-enum {
-	BATT_UNKNOWN,
-	BATT_DS2704_N = 17,
-	BATT_DS2704_L = 32,
-	BATT_ISL6296_N = 73,
-	BATT_ISL6296_L = 94,
-};
-extern int lge_battery_info;
+bool is_lge_battery(void);
+#else
+static inline bool is_lge_battery(void)
+{
+	return true;
+}
 #endif
 
 #ifdef CONFIG_LGE_KCAL
diff --git a/arch/arm/mach-msm/lge/devices_lge.c b/arch/arm/mach-msm/lge/devices_lge.c
index 49c8225..7679526 100644
--- a/arch/arm/mach-msm/lge/devices_lge.c
+++ b/arch/arm/mach-msm/lge/devices_lge.c
@@ -12,6 +12,7 @@
  */
 
 #include <linux/kernel.h>
+#include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/memory.h>
 
@@ -210,20 +211,39 @@
 #endif
 
 #ifdef CONFIG_LGE_PM_BATTERY_ID_CHECKER
-int lge_battery_info = BATT_UNKNOWN;
+enum {
+	BATT_ID_UNKNOWN,
+	BATT_ID_DS2704_N = 17,
+	BATT_ID_DS2704_L = 32,
+	BATT_ID_ISL6296_N = 73,
+	BATT_ID_ISL6296_L = 94,
+};
+
+static int lge_battery_info = BATT_ID_UNKNOWN;
+
+bool is_lge_battery(void)
+{
+	if (lge_battery_info == BATT_ID_DS2704_N ||
+	    lge_battery_info == BATT_ID_DS2704_L ||
+	    lge_battery_info == BATT_ID_ISL6296_N ||
+	    lge_battery_info == BATT_ID_ISL6296_L)
+		return true;
+	return false;
+}
+EXPORT_SYMBOL(is_lge_battery);
 
 static int __init battery_information_setup(char *batt_info)
 {
         if(!strcmp(batt_info, "ds2704_n"))
-                lge_battery_info = BATT_DS2704_N;
+                lge_battery_info = BATT_ID_DS2704_N;
         else if(!strcmp(batt_info, "ds2704_l"))
-                lge_battery_info = BATT_DS2704_L;
+                lge_battery_info = BATT_ID_DS2704_L;
         else if(!strcmp(batt_info, "isl6296_n"))
-                lge_battery_info = BATT_ISL6296_N;
+                lge_battery_info = BATT_ID_ISL6296_N;
         else if(!strcmp(batt_info, "isl6296_l"))
-                lge_battery_info = BATT_ISL6296_L;
+                lge_battery_info = BATT_ID_ISL6296_L;
         else
-                lge_battery_info = BATT_UNKNOWN;
+                lge_battery_info = BATT_ID_UNKNOWN;
 
         printk(KERN_INFO "Battery : %s %d\n", batt_info, lge_battery_info);
 
diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig
index a263750..8489196 100644
--- a/drivers/power/Kconfig
+++ b/drivers/power/Kconfig
@@ -434,4 +434,10 @@
 	help
 	  Say Y to enable battery temperature measurements using
 	  thermistor connected on BATCTRL ADC.
+
+config LGE_PM_BATTERY_ID_CHECKER
+	default n
+	bool "LGE battery id checker"
+	help
+	  LGE Battery Id Checker Configuration
 endif # POWER_SUPPLY
diff --git a/drivers/power/pm8921-charger.c b/drivers/power/pm8921-charger.c
index c983389..a74459d 100644
--- a/drivers/power/pm8921-charger.c
+++ b/drivers/power/pm8921-charger.c
@@ -31,6 +31,10 @@
 #include <mach/msm_xo.h>
 #include <mach/msm_hsusb.h>
 
+#ifdef CONFIG_LGE_PM_BATTERY_ID_CHECKER
+#include <mach/board_lge.h>
+#endif
+
 #define CHG_BUCK_CLOCK_CTRL	0x14
 
 #define PBL_ACCESS1		0x04
@@ -989,6 +993,7 @@
 	}
 }
 
+#ifndef CONFIG_LGE_PM_BATTERY_ID_CHECKER
 static int64_t read_battery_id(struct pm8921_chg_chip *chip)
 {
 	int rc;
@@ -1004,11 +1009,20 @@
 						result.measurement);
 	return result.physical;
 }
+#endif
 
 static int is_battery_valid(struct pm8921_chg_chip *chip)
 {
+#ifndef CONFIG_LGE_PM_BATTERY_ID_CHECKER
 	int64_t rc;
+#endif
 
+#ifdef CONFIG_LGE_PM_BATTERY_ID_CHECKER
+	if (is_lge_battery())
+		return 1;
+	else
+		return 0;
+#else
 	if (chip->batt_id_min == 0 && chip->batt_id_max == 0)
 		return 1;
 
@@ -1025,6 +1039,7 @@
 		return 0;
 	}
 	return 1;
+#endif
 }
 
 static void check_battery_valid(struct pm8921_chg_chip *chip)
@@ -1289,6 +1304,11 @@
 
 static int get_prop_batt_present(struct pm8921_chg_chip *chip)
 {
+
+#ifdef CONFIG_LGE_PM_BATTERY_ID_CHECKER
+	if (is_lge_battery() == false)
+		return 0;
+#endif
 	return pm_chg_get_rt_status(chip, BATT_INSERTED_IRQ);
 }
 
@@ -1341,6 +1361,11 @@
 {
 	int temp;
 
+#ifdef CONFIG_LGE_PM_BATTERY_ID_CHECKER
+	if (is_lge_battery() == false)
+		return POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
+#endif
+
 	temp = pm_chg_get_rt_status(chip, BATTTEMP_HOT_IRQ);
 	if (temp)
 		return POWER_SUPPLY_HEALTH_OVERHEAT;