--- linux-orig/arch/arm/mach-pxa/sharpsl_battery.c	2004-02-18 23:41:57.000000000 +0300
+++ linux/arch/arm/mach-pxa/sharpsl_battery.c	2004-02-24 06:21:56.000000000 +0300
@@ -197,7 +197,7 @@
 #define SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT	1	// 10msec
 #define SHARPSL_CHECK_BATTERY_WAIT_TIME_JKVAD	1	// 10msec
 #define SHARPSL_CORGI_FATAL_ACIN_VOLT		182	// 3.45V
-#define SHARPSL_CORGI_FATAL_NOACIN_VOLT		179	// 3.40V
+#define SHARPSL_CORGI_FATAL_NOACIN_VOLT		170	// 3.40V
 #define SHARPSL_CORGI_WAIT_CO_TIME		15	// 15 Sec
 							//NOTICE !!  you want to change this value , so you must change
 							//           alarm check mirgin time ( +30 ) in the sharpsl_power.c.
@@ -245,10 +245,17 @@
 BATTERY_THRESH *GetMainLevel( int Volt );
 int sharpsl_get_main_battery(void);
 int suspend_sharpsl_read_Voltage(void);
+int GetMainPercent(int);
 int GetMainChargePercent(int);
 int Get_DAC_Value(int);
 int sharpsl_check_battery(int mode);
 
+// remove warnings
+static int sharpsl_battery_thread_main(void);
+int handle_scancode(int, int);
+int sharpsl_ac_check(void);
+void sharpsl_charge_err_off(void);
+
 /*** extern ***********************************************************************/
 extern u32 apm_wakeup_src_mask;
 #if defined(CONFIG_ARCH_PXA_POODLE) || defined(CONFIG_ARCH_PXA_CORGI)
@@ -269,7 +276,6 @@
 
 /*** variables ********************************************************************/
 
-
 #if defined(CONFIG_ARCH_PXA_POODLE)
 
 BATTERY_THRESH  sharpsl_main_battery_thresh_fl[] = {
@@ -293,20 +299,26 @@
 #elif defined(CONFIG_ARCH_PXA_CORGI)
 
 BATTERY_THRESH  sharpsl_main_battery_thresh_fl[] = {
-    { 194, 100, SHARPSL_BATTERY_STATUS_HIGH},
-    { 188,  75, SHARPSL_BATTERY_STATUS_HIGH},
+    { 999, 100, SHARPSL_BATTERY_STATUS_HIGH},
+    { 210, 100, SHARPSL_BATTERY_STATUS_HIGH},
+    { 194,  90, SHARPSL_BATTERY_STATUS_HIGH},
+    { 188,  70, SHARPSL_BATTERY_STATUS_HIGH},
     { 184,  50, SHARPSL_BATTERY_STATUS_HIGH},
     { 180,  25, SHARPSL_BATTERY_STATUS_LOW},
-    { 171,   5, SHARPSL_BATTERY_STATUS_VERYLOW},
+    { 174,  10, SHARPSL_BATTERY_STATUS_LOW},
+    { 170,   5, SHARPSL_BATTERY_STATUS_VERYLOW},
     {   0,   0, SHARPSL_BATTERY_STATUS_CRITICAL},
 };
 
 BATTERY_THRESH  sharpsl_main_battery_thresh_nofl[] = {
-    { 194, 100, SHARPSL_BATTERY_STATUS_HIGH},
-    { 188,  75, SHARPSL_BATTERY_STATUS_HIGH},
+    { 999, 100, SHARPSL_BATTERY_STATUS_HIGH},
+    { 210, 100, SHARPSL_BATTERY_STATUS_HIGH},
+    { 194,  90, SHARPSL_BATTERY_STATUS_HIGH},
+    { 188,  70, SHARPSL_BATTERY_STATUS_HIGH},
     { 184,  50, SHARPSL_BATTERY_STATUS_HIGH},
     { 180,  25, SHARPSL_BATTERY_STATUS_LOW},
-    { 171,   5, SHARPSL_BATTERY_STATUS_VERYLOW},
+    { 174,  10, SHARPSL_BATTERY_STATUS_LOW},
+    { 170,   5, SHARPSL_BATTERY_STATUS_VERYLOW},
     {   0,   0, SHARPSL_BATTERY_STATUS_CRITICAL},
 };
 #endif
@@ -332,25 +344,36 @@
 #elif defined(CONFIG_ARCH_PXA_CORGI)
 
 BATTERY_THRESH sharpsl_main_battery_thresh_charge_fl[] = {
-    { 200, 100, SHARPSL_BATTERY_STATUS_HIGH},
+    { 999, 100, SHARPSL_BATTERY_STATUS_HIGH},
+    { 210, 100, SHARPSL_BATTERY_STATUS_HIGH},
+    { 200,  95, SHARPSL_BATTERY_STATUS_HIGH},
     { 196,  75, SHARPSL_BATTERY_STATUS_HIGH},
     { 192,  50, SHARPSL_BATTERY_STATUS_HIGH},
     { 187,  25, SHARPSL_BATTERY_STATUS_LOW},
-    { 171,   5, SHARPSL_BATTERY_STATUS_VERYLOW},
+    { 182,  10, SHARPSL_BATTERY_STATUS_LOW},
+    { 170,   5, SHARPSL_BATTERY_STATUS_VERYLOW},
     {   0,   0, SHARPSL_BATTERY_STATUS_CRITICAL},
 };
 
 BATTERY_THRESH sharpsl_main_battery_thresh_charge_nofl[] = {
-    { 200, 100, SHARPSL_BATTERY_STATUS_HIGH},
+    { 999, 100, SHARPSL_BATTERY_STATUS_HIGH},
+    { 210, 100, SHARPSL_BATTERY_STATUS_HIGH},
+    { 200,  95, SHARPSL_BATTERY_STATUS_HIGH},
     { 196,  75, SHARPSL_BATTERY_STATUS_HIGH},
     { 192,  50, SHARPSL_BATTERY_STATUS_HIGH},
     { 187,  25, SHARPSL_BATTERY_STATUS_LOW},
-    { 171,   5, SHARPSL_BATTERY_STATUS_VERYLOW},
+    { 182,  10, SHARPSL_BATTERY_STATUS_LOW},
+    { 170,   5, SHARPSL_BATTERY_STATUS_VERYLOW},
     {   0,   0, SHARPSL_BATTERY_STATUS_CRITICAL},
 };
 
 #endif
 
+//#if defined(CONFIG_ARCH_PXA_CORGI)
+#define MAIN_BATTERY_THRES (sizeof(sharpsl_main_battery_thresh_charge_nofl) / sizeof(BATTERY_THRESH) - 1)
+//#endif
+
+
 #if 1
 static struct file_operations sharpsl_battery_fops = {
 };
@@ -389,6 +412,8 @@
 int sharpsl_main_battery   = SHARPSL_BATTERY_STATUS_HIGH;
 int sharpsl_main_battery_percentage = 100;
 int sharpsl_main_charge_battery = 100;
+int sharpsl_main_battery_voltage = 200;
+
 int sharpsl_ac_status = APM_AC_OFFLINE;
 
 static int MainCntWk = SHARPSL_MAIN_GOOD_COUNT;
@@ -498,7 +523,7 @@
 //          2 : check battery w/  refresh battery status.
 void sharpsl_kick_battery_check(int before_waitms,int after_waitms,int flag)
 {
-  int start;
+  //int start;
 
 
   MainCntWk = MainCnt + 1;
@@ -604,6 +629,7 @@
   }
 #endif
 
+    return 0;
 }
 
 
@@ -920,13 +946,17 @@
 #endif
 
 		voltage = sharpsl_cnv_value(voltage);
-
+		sharpsl_main_battery_voltage = voltage;
+	
 		thresh = GetMainLevel(voltage);
 
+		sharpsl_main_battery = thresh->status;
+		sharpsl_main_battery_percentage = GetMainPercent(voltage);
+		sharpsl_main_charge_battery = GetMainChargePercent(voltage);
+
 		// if battery is low , backlight driver become to save power.
 		if ( ( ( thresh->status == SHARPSL_BATTERY_STATUS_VERYLOW  ) ||
-		       ( thresh->status == SHARPSL_BATTERY_STATUS_CRITICAL ) ||
-		       ( thresh->status == SHARPSL_BATTERY_STATUS_LOW      ) ) &&
+		       ( thresh->status == SHARPSL_BATTERY_STATUS_CRITICAL )) &&
 		       ( !sharpsl_main_bk_flag ) ) {
 		  SHARPSL_LIMIT_CONTRAST(SHARPSL_CAUTION_CONTRAST);
 		}
@@ -934,11 +964,7 @@
 		if ( sharpsl_main_bk_flag == 0 ) {
 		  return sharpsl_main_battery;
 		}
-		sharpsl_main_battery = thresh->status;
-		sharpsl_main_battery_percentage = thresh->percentage;
-		sharpsl_main_charge_battery = GetMainChargePercent(voltage);
-
-		//printk("bat : main battery = %d\n",sharpsl_main_battery);
+		
 
 		if ( sharpsl_debug_flag != 0 ) {
 		  int i;
@@ -946,7 +972,8 @@
 		  sharpsl_main_battery = sharpsl_debug_flag;
 		  for (i = 0; sharpsl_main_battery_thresh_nofl[i].voltage > 0; i++) {
 		    if ( sharpsl_debug_flag == sharpsl_main_battery_thresh_nofl[i].status ) {
-		      sharpsl_main_battery_percentage = sharpsl_main_battery_thresh_nofl[i].percentage;
+		      //sharpsl_main_battery_percentage = sharpsl_main_battery_thresh_nofl[i].percentage;
+		      sharpsl_main_battery_percentage = GetMainPercent(voltage);
 		      break;
 		    }
 		  }
@@ -965,7 +992,7 @@
 		  sharpsl_main_battery_percentage = sharpsl_main_percent_bk;
 		}
 
-		DPRINTK2("charge percent = %d ( at %d ) \n",sharpsl_main_charge_battery,(int)jiffies);
+		//DPRINTK2("charge percent = %d ( at %d ) \n",sharpsl_main_charge_battery,(int)jiffies);
 		DPRINTK(" get Main battery status %d\n",sharpsl_main_battery);
 
 	} else {
@@ -975,40 +1002,79 @@
 	return sharpsl_main_battery;
 }
 
-int GetMainChargePercent( int Volt )
+int GetLevelIndex(BATTERY_THRESH *thresh, int Volt)
+{
+    int i = MAIN_BATTERY_THRES;
+
+    DPRINTK("volt = %d \n", Volt);
+	while (i > 0 && (Volt > thresh[i].voltage))
+		i--;
+		
+	return i;
+}
+
+int GetPercent(BATTERY_THRESH *thresh, int Volt)
+{
+    int i = GetLevelIndex(thresh, Volt);
+    
+	/* i is now between 0 and MAIN_BATTERY_THRES. That means
+	 * we can safely access main_batt_thres[i] and
+	 * main_batt_thres[i+1] */
+	
+	{
+//	    long percentage = thresh[i].percentage;
+	    
+        long deltav = thresh[i].voltage - thresh[i + 1].voltage;
+        long deltap = thresh[i].percentage - thresh[i + 1].percentage;
+    
+    	long percentage = 
+    	   	   thresh[i + 1].percentage + 
+    	   	   deltap * (Volt - thresh[i + 1].voltage) /
+    	   	   deltav; 
+
+        DPRINTK("percentage = %d \n", percentage);
+        return percentage;
+	}
+	
+    return thresh[i].percentage;
+}
+
+int GetMainPercent( int Volt )
 {
-    int i;
     BATTERY_THRESH *thresh;
 
-    DPRINTK("  volt = %d  \n",Volt);
+    if (counter_step_contrast)
+	    thresh = sharpsl_main_battery_thresh_fl;
+    else
+	    thresh = sharpsl_main_battery_thresh_nofl;
+
+    return GetPercent(thresh, Volt);
+}
+
+int GetMainChargePercent( int Volt )
+{
+    BATTERY_THRESH *thresh;
 
     if (counter_step_contrast)
-	thresh = sharpsl_main_battery_thresh_charge_fl;
+	    thresh = sharpsl_main_battery_thresh_charge_fl;
     else
-	thresh = sharpsl_main_battery_thresh_charge_nofl;
-    for (i = 0; thresh[i].voltage > 0; i++) {
-	if (Volt >= thresh[i].voltage)
-	    return thresh[i].percentage;
-    }
-    return thresh[i].percentage;
+	    thresh = sharpsl_main_battery_thresh_charge_nofl;
+
+    return GetPercent(thresh, Volt);
 }
 
 BATTERY_THRESH *GetMainLevel( int Volt )
 {
-    int i;
     BATTERY_THRESH *thresh;
 
     DPRINTK("  volt = %d  \n",Volt);
 
     if (counter_step_contrast)
-	thresh = sharpsl_main_battery_thresh_fl;
+	    thresh = sharpsl_main_battery_thresh_fl;
     else
-	thresh = sharpsl_main_battery_thresh_nofl;
-    for (i = 0; thresh[i].voltage > 0; i++) {
-	if (Volt >= thresh[i].voltage)
-	    return &thresh[i];
-    }
-    return &thresh[i];
+	    thresh = sharpsl_main_battery_thresh_nofl;
+	    
+    return &thresh[GetLevelIndex(thresh, Volt)];
 }
 
 
@@ -1018,7 +1084,7 @@
 int Get_DAC_Value(int channel)
 {
 	unsigned long cmd;
-	unsigned int dummy;
+	unsigned int dummy;
 	int voltage;
 
 #if defined(CONFIG_ARCH_PXA_POODLE)
@@ -1263,7 +1329,7 @@
 //        0: OK
 int sharpsl_ac_check(void)
 {
-	int temp, i, volt;
+	int temp, i; //, volt;
 	int buff[5];
 
 	if ( in_interrupt() ) {
@@ -1835,14 +1901,18 @@
 	int		def_value;
 	char*		name;
 	char*		description;
+	char		readonly;	
 	unsigned short	low_ino;
 } sharpsl_battery_entry_t;
 
 static sharpsl_battery_entry_t sharpsl_battery_params[] = {
 /*  { addr,	def_value,	name,	    description }*/
-  { &msglevel,	0,		"msglevel",    "debug message output level" },
-  { &sharpsl_debug_flag , 0 , "dflag", "debug flag" },
-  { &sharpsl_change_battery_status , 0 , "chg_status", "Change status" }
+  { &msglevel,	0,		"msglevel",    "debug message output level", 0 },
+  { &sharpsl_debug_flag , 0 , "dflag", "debug flag", 0 },
+  { &sharpsl_change_battery_status , 0 , "chg_status", "Change status", 1 },
+  { &sharpsl_main_battery_percentage , 0 , "charge_percentage", "Charge percentage", 1 },
+  { &sharpsl_main_battery_voltage , 0 , "main_voltage", "Main voltage", 1 },                // alias
+  { &sharpsl_main_battery_voltage , 0 , "charge_voltage", "Charge voltage", 1 }
 };
 #define NUM_OF_BATTERY_ENTRY	(sizeof(sharpsl_battery_params)/sizeof(sharpsl_battery_entry_t))
 
@@ -1866,7 +1936,7 @@
 	if (current_param==NULL) {
 		return -EINVAL;
 	}
-	count = sprintf(outputbuf, "0x%08X\n",
+	count = sprintf(outputbuf, "%04i\n",
 			*((volatile Word *) current_param->addr));
 	*ppos += count;
 	if (count>nbytes)	/* Assume output can be read at one time */
@@ -1891,7 +1961,7 @@
 			break;
 		}
 	}
-	if (current_param==NULL) {
+	if (current_param==NULL || current_param->readonly) {
 		return -EINVAL;
 	}