Index: linux-2.6.23_em1/arch/arm/mach-mp200/pgpf/gs50/suspend.c
===================================================================
--- linux-2.6.23_em1/arch/arm/mach-mp200/pgpf/gs50/suspend.c	(revision 3347)
+++ linux-2.6.23_em1/arch/arm/mach-mp200/pgpf/gs50/suspend.c	(revision 3924)
@@ -44,6 +44,7 @@
 #define MASK_CHARGE_USB_1_USBEN              (0x1 << 3)
 
 extern void pgpf_usb_low_power_mode_enable(int flag);
+extern void pgpf_usb_phy_enable(int flag);
 
 typedef struct {    
 	unsigned int g00;
@@ -569,6 +570,9 @@
 	/* Enter USB PHY Low Power Mode */
 	pgpf_usb_low_power_mode_enable(1);
 
+	/* Set USB_RESETB to LOW */
+	pgpf_usb_phy_enable(0);
+
 	/* ATLAS Register Setting */
 	atlas_suspend_setting();
 
@@ -603,6 +607,9 @@
 	/* 13 MHz OSC START */
 	outl(0x00000001, CHG_CTRL_OSC);   
 
+	/* Set USB_RESETB to HIGH */
+	pgpf_usb_phy_enable(1);
+
 	/* Get Resume Factor */
 	get_resume_factor();
 
Index: linux-2.6.23_em1/drivers/pgpf/gs50/pm/suspend.c
===================================================================
--- linux-2.6.23_em1/drivers/pgpf/gs50/pm/suspend.c	(revision 3347)
+++ linux-2.6.23_em1/drivers/pgpf/gs50/pm/suspend.c	(revision 3924)
@@ -39,7 +39,6 @@
 
 static void ecompass_suspend(void);
 static void ecompass_resume(void);
-extern void pgpf_usb_phy_enable(int flag);
 
 static void mask_write(unsigned int data, unsigned int mask, unsigned int addr);
 
@@ -113,12 +112,10 @@
 {
 	gps_suspend();
 	ecompass_suspend();
-	pgpf_usb_phy_enable(0);
 
 	/* Kernel Suspend */
     mp200_pm_sleep(PM_SLEEP_MODE_S3);
 
-	pgpf_usb_phy_enable(1);
 	ecompass_resume();
 	gps_resume();
 
Index: linux-2.6.23_em1/drivers/pgpf/gs50/pm/controller.c
===================================================================
--- linux-2.6.23_em1/drivers/pgpf/gs50/pm/controller.c	(revision 3347)
+++ linux-2.6.23_em1/drivers/pgpf/gs50/pm/controller.c	(revision 3924)
@@ -62,6 +62,8 @@
 static int  get_sensor_status(void);
 static int  check_battery_full_to_normal(void);
 static int  check_battery_normal_to_full(void);
+static int  check_battery_trickle_to_normal(void);
+static int  check_battery_normal_to_trickle(void);
 static int  check_charge_timeout(void);
 static int  check_trickle_charge_timeout(void);
 static void get_connection_status(void);
@@ -899,7 +901,7 @@
        switch(controller_status.battery_status){
        case NAVU2PM_BATTERY_TRICKLE:
 
-               if (controller_status.bv >= BATT_V_TRICKLE){
+               if (check_battery_trickle_to_normal()){
                        controller_status.battery_status = NAVU2PM_BATTERY_NORMAL;
                }else if(check_trickle_charge_timeout()){
                        controller_status.battery_status = NAVU2PM_BATTERY_TIMEOUT;
@@ -908,7 +910,7 @@
 
        case NAVU2PM_BATTERY_NORMAL:
 
-               if (controller_status.bv < BATT_V_TRICKLE){
+               if (check_battery_normal_to_trickle()){
                        controller_status.battery_status = NAVU2PM_BATTERY_TRICKLE;
                }else if(check_charge_timeout()){
                        controller_status.battery_status = NAVU2PM_BATTERY_TIMEOUT;
@@ -984,6 +986,31 @@
        return TRUE;
 }
 
+static int check_battery_normal_to_trickle(void)
+{
+
+       if (controller_status.bv >= BATT_V_TRICKLE){
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+static int check_battery_trickle_to_normal(void)
+{
+       if(NAVU2PM_CHARGE_STAT_CHARGE != controller_status.charge_status){
+               return FALSE;
+       }
+
+       if (controller_status.bv < BATT_V_TRICKLE){
+               return FALSE;
+       }
+
+       controller_status.count_trickle_charge_time = 0;
+
+       return TRUE;
+}
+
 static int check_trickle_charge_timeout(void)
 {
        if(NAVU2PM_CHARGE_STAT_CHARGE != controller_status.charge_status){
Index: linux-2.6.23_em1/drivers/pgpf/gs50/pm/controller.h
===================================================================
--- linux-2.6.23_em1/drivers/pgpf/gs50/pm/controller.h	(revision 3347)
+++ linux-2.6.23_em1/drivers/pgpf/gs50/pm/controller.h	(revision 3924)
@@ -41,7 +41,7 @@
 #define T_BOARD_1_L                 47 /* 47 degree C */
 #define T_BOARD_2_L                 53 /* 53 degree C */
 
-#define BATT_V_FULL                  4050 /* 4050 mV */
+#define BATT_V_FULL                  4000 /* 4000 mV */
 #define BATT_V_CHARGE_RESTART        3900 /* 3900 mV */
 #define BATT_V_DISCHARGE_H           3700 /* 3700 mV */
 #define BATT_V_DISCHARGE_L           3600 /* 3600 mV */
@@ -52,10 +52,10 @@
 #define BATT_C_FULL                 (-78) /* -78  mA */
 
 #define TIME_STOP_CHARGE            36000 /* sec (10 hours) */
-#define COUNT_STOP_CHARGE           TIME_STOP_CHARGE / SENSOR_THREAD_SLEEP_TIME * 1000
+#define COUNT_STOP_CHARGE           (TIME_STOP_CHARGE * 1000) / SENSOR_THREAD_SLEEP_TIME
 
 #define TIME_STOP_TRICKLE_CHARGE    1800 /* sec (30 minutes) */
-#define COUNT_STOP_TRICKLE_CHARGE   TIME_STOP_TRICKLE_CHARGE / SENSOR_THREAD_SLEEP_TIME * 1000
+#define COUNT_STOP_TRICKLE_CHARGE   (TIME_STOP_TRICKLE_CHARGE * 1000) / SENSOR_THREAD_SLEEP_TIME
 
 #define SAMPLE_COUNT                5
 
