From 37af65e44ed8e28339f14e8f5b5b45e68a9b773d Mon Sep 17 00:00:00 2001
From: Jon Benson <hastarin@gmail.com>
Date: Sun, 5 Dec 2010 14:19:10 +1100
Subject: [PATCH] EXPERIMENTAL: Initial (Alpha) support for extended battery in
 the new driver.  USE AT YOUR OWN RISK!  http://bit.ly/eDLk0g

---
 drivers/power/ds2746_battery.c      |  2 +-
 drivers/power/ds2746_param.c        | 12 +++++++++---
 include/linux/ds2746_param_config.h | 18 ++++++++++++++++--
 3 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/drivers/power/ds2746_battery.c b/drivers/power/ds2746_battery.c
index 931191b4..5f5c77b5 100644
--- a/drivers/power/ds2746_battery.c
+++ b/drivers/power/ds2746_battery.c
@@ -87,7 +87,7 @@ static struct poweralg_config_type debug_config = {0};
 #define CHARGE_FAST	2
 
 #define BATTERY_ID_UNKNOWN 0
-#define HTC_BATTERY_DS2746_DEBUG_ENABLE 0
+#define HTC_BATTERY_DS2746_DEBUG_ENABLE 1
 
 /* DS2746 I2C BUS*/
 #define DS2746_I2C_BUS_ID   	0
diff --git a/drivers/power/ds2746_param.c b/drivers/power/ds2746_param.c
index cfa8dc3e..6cc23271 100644
--- a/drivers/power/ds2746_param.c
+++ b/drivers/power/ds2746_param.c
@@ -52,7 +52,7 @@ build flags
 
 ========================================================================================*/
 
-#define HTC_ENABLE_POWER_DEBUG  		0
+#define HTC_ENABLE_POWER_DEBUG  		1
 #define HTC_ENABLE_DUMMY_BATTERY		0
 
 /*========================================================================================
@@ -661,6 +661,8 @@ static BOOL __battery_param_udpate(struct battery_type *battery)
 	battery->discharge_mA = (battery->discharge_adc * discharge_adc_to_mv_coef / discharge_adc_to_mv_resl);
 	battery->charge_counter_mAh = (battery->charge_counter_adc * acr_adc_to_mv_coef / acr_adc_to_mv_resl) -	charge_counter_zero_base_mAh;
 	battery->current_mA = battery->current_mA - battery->discharge_mA;
+	printk(DRIVER_ZONE " battery.id_adc pre clip: %d\n", battery->id_adc);
+	printk(DRIVER_ZONE " battery.temp_adc pre clip: %d\n", battery->temp_adc);
 	/* prevent from adc out of range*/
 	if (battery->id_adc >= id_adc_resl) {
 		battery->id_adc = id_adc_resl - 1;
@@ -678,11 +680,11 @@ static BOOL __battery_param_udpate(struct battery_type *battery)
 	/* battery ID shall be ready first for temp/kadc calculation*/
 	//   if ( id_conversion ) battery->id_ohm = ((float)id_R_kohm / ((float)id_adc_resl/battery->id_adc - 1)) * 1000;     // kohm -> ohm
 	//   else   			  battery->id_ohm = battery->id_adc;
-	battery->id_ohm = battery->id_adc;
+	battery->id_ohm = battery->temp_adc;
 #if HTC_ENABLE_POWER_DEBUG
 	printk(DRIVER_ZONE " battery.id_ohm pre calibrate: %d\n", battery->id_ohm);
 #endif /* HTC_ENABLE_POWER_DEBUG*/
-	calibrate_id_ohm(battery);
+	//calibrate_id_ohm(battery);
 #if HTC_ENABLE_POWER_DEBUG
 	printk(DRIVER_ZONE " battery.id_ohm post calibrate: %d\n", battery->id_ohm);
 #endif /* HTC_ENABLE_POWER_DEBUG*/
@@ -716,6 +718,10 @@ static BOOL __battery_param_udpate(struct battery_type *battery)
 		}
 	}
 
+	if (batt_id_index == 5)
+	{
+		battery->temp_adc = battery->temp_adc * 7;
+	}
 	/* calculate temperature*/
 	//    battery->temp_01c 			  = get_temp_c((float)temp_R_kohm / ((float)temp_adc_resl/battery->temp_adc - 1))*10;
 	temp_01c = get_temp_01c(battery);
diff --git a/include/linux/ds2746_param_config.h b/include/linux/ds2746_param_config.h
index eea2b3e2..9779340f 100644
--- a/include/linux/ds2746_param_config.h
+++ b/include/linux/ds2746_param_config.h
@@ -36,6 +36,7 @@ enum BATTERY_ID_ENUM {
 	BATTERY_ID_SONY_1300MAH_HTE,
 	BATTERY_ID_SANYO_1300MAH_HTE,
 	BATTERY_ID_SANYO_1300MAH_TWS,
+	BATTERY_ID_HTC_EXTENDED_2300MAH_FORMOSA,
 	BATTERY_ID_NUM /* include unknown battery*/
 };
 
@@ -45,7 +46,8 @@ UINT32 ID_RANGE[] =
   7150, 15500,   /* Sony 1300mAh (Formosa) */    /* 7.1k~15k */
   27500, 49500,   /* Sony 1300mAh (HTE) */  	  /* 28k~49.5k */
   15500, 27500,   /* Sanyo 1300mAh (HTE) */ 	  /* 16k~27k */
-  0, 7150,   /* Samsung 1230mAh */  	 /* 0k~7k */
+  100, 7150,   /* Samsung 1230mAh */  	 /* 1k~7k */
+  0, 100,   /* HTC Extended 2300mAh */  	 /* 0k~1k */
 };
 
 /*This table is calculated according to temp formula for temp mapping.
@@ -105,6 +107,7 @@ UINT32 FL_25[] =
   1280,   /* Sony 1300mAh (HTE) */
   1250,   /* Sanyo 1300mAh (HTE) */
   1230,   /* Samsung 1230mAh */
+  2350,  /* HTC Extended 2300mAh */
 };
 
 UINT32 PD_M_COEF[] =
@@ -115,6 +118,7 @@ UINT32 PD_M_COEF[] =
   24, 	/* Sony 1300mAh (HTE) */
   27, 	/* Sanyo 1300mAh (HTE) */
   30,  /* Samsung 1230mAh */
+  30,  /* HTC Extended 2300mAh */ 
 };
 
 UINT32 PD_M_RESL[] =
@@ -125,6 +129,7 @@ UINT32 PD_M_RESL[] =
   100,	/* Sony 1300mAh (HTE) */
   100,	/* Sanyo 1300mAh (HTE) */
   100,  /* Samsung 1230mAh */
+  100,  /* HTC Extended 2300mAh */ 
 };
 
 UINT32 PD_T_COEF[] =
@@ -135,6 +140,7 @@ UINT32 PD_T_COEF[] =
   140,	/* Sony 1300mAh (HTE) */
   156,	/* Sanyo 1300mAh (HTE) */
   250,	/* Samsung 1230mAh */
+  250,  /* HTC Extended 2300mAh */ 
 };
 
 /*! star_lee 20100426 - update KADC discharge parameter */
@@ -150,6 +156,13 @@ UINT32 M_PARAMETER_Samsung_1230MAH_FORMOSA[] =
   10000, 4135, 7500, 3960, 4700, 3800, 1700, 3727, 900, 3674, 300, 3640, 0, 3420,
 };
 
+UINT32 M_PARAMETER_HTC_2300MAH_FORMOSA[] =
+{
+  /* capacity (in 0.01%) -> voltage (in mV)*/
+  10000, 4196, 7500, 4165, 4700, 3986, 1700, 3879, 900, 3833, 300, 3740, 0, 3420,
+};
+
+
 UINT32 *M_PARAMTER_TABLE[] =
 {
   /* Unknown battery */
@@ -165,7 +178,8 @@ UINT32 *M_PARAMTER_TABLE[] =
   /* same as Sony 1300mAh (Formosa) currently... */
   /* Samsung 1230mAh */
   (UINT32 *) (M_PARAMETER_Samsung_1230MAH_FORMOSA),
-  /* same as Sony 1300mAh (Formosa) currently... */
+  /* HTC Extended 2300mAh */
+  (UINT32 *) (M_PARAMETER_HTC_2300MAH_FORMOSA),
 };
 
 INT32 TEMP_RANGE[] =