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;