diff -r -U8 ./jaunty-arm.orig/drivers/mxc/pmic/mc13892/pmic_battery.c ./jaunty-arm/drivers/mxc/pmic/mc13892/pmic_battery.c
--- ./jaunty-arm.orig/drivers/mxc/pmic/mc13892/pmic_battery.c	2009-09-11 15:50:26.000000000 +0200
+++ ./jaunty-arm/drivers/mxc/pmic/mc13892/pmic_battery.c	2009-10-18 15:11:48.000000000 +0200
@@ -1203,40 +1203,63 @@
         battpollC = 0;
     p = (int *)&(battpoll [battpollC++][0]);
     p [0] = jiffies;
     p [1] = a;
     p [2] = b;
     p [3] = c;
 }
 
+static unsigned int pre_alarm [3];
 /*
  * PMIC alarm set
  */
 static int battery_set_alarm (void)
 {
 	int          rc;
 	unsigned int toda, daya;
+	unsigned int cur_time, cur_day;
+	cur_time = 0x01FFFF;
+	cur_day  = 0x007FFF;
 
 	/*
 	 * wakeup after check interval
 	 */
-	rc = pmic_read_reg (REG_RTC_TIME, &toda, 0x01FFFF);
+	rc = pmic_read_reg (REG_RTC_TIME, &cur_time, 0x01FFFF);
 	if (rc == 0) {
-		rc = pmic_read_reg (REG_RTC_DAY, &daya, 0x007FFF);
+		rc = pmic_read_reg (REG_RTC_DAY, &cur_day, 0x007FFF);
 	}
 	if (rc != 0) {
 		printk ("battery_set_alarm: get TODA/DAYA error %d\n", rc);
 		return -1;
 	}
+	toda = cur_time;
+	daya = cur_day;
+	
 	toda += batt_poll_interval;
 	if ((24 * 60 * 60) <= toda) {
 		toda -= (24 * 60 * 60);
 		daya++;
 	}
+	/* if the previous RTC alarm time and date are before the battery ones,
+	   use them instead of toda and daya.
+	   we add a ten seconds tolerance (hence - 10 below), to avoid the case where
+	   the battery wake the device just before the previous RTC alarm, and then
+	   re-suspend the device after.
+	   */
+	if ((pre_alarm[2] >= cur_day) && (pre_alarm[1] > cur_time)) {
+  	if (daya > pre_alarm[2]) {
+  	  toda = pre_alarm[1];
+  	  daya = pre_alarm[2];
+  	}
+  	else if ((daya == pre_alarm[2]) && (toda > pre_alarm[1] - 10)) {
+  	  toda = pre_alarm[1];
+  	  daya = pre_alarm[2];
+  	}
+  }
 	rc = pmic_write_reg (REG_RTC_ALARM, toda, 0x01FFFF);
 	if (rc == 0) {
 		rc = pmic_write_reg (REG_RTC_DAY_ALARM, daya, 0x007FFF);
 	}
 	if (rc != 0) {
 		printk ("battery_set_alarm: set TODA/DAYA error %d\n", rc);
 		return -1;
 	}
@@ -1256,17 +1285,16 @@
 }
 
 /*
  * Battery low suspend
  *  called by PM(suspend)
  */
 extern int pmic_event_for_suspend (type_event event);
 extern int pmic_event_for_resume (void);
-static unsigned int pre_alarm [3];
 static void battery_low_suspend (void)
 {
 	int  rc;
 	pmic_event_callback_t bat_event_callback;
 
 	battery_poll_statistics [1]++;
 	battery_poll_statistics [6] = 0;
 	LogIn (0x00010000, battery_poll_statistics [1], battery_poll_statistics [0]);
@@ -1356,29 +1384,41 @@
  *   return 1 - wakeup
  */
 extern struct platform_driver pmic_adc_driver_ldm;
 static int battery_low_resume_check (void)
 {
 	extern int is_resume_power_sw (void);
 	int rc, raw;
 	int resume_by_sw = is_resume_power_sw ();
+	unsigned int current_alarm[2];
 
 	battery_poll_statistics [3]++;
 	battery_poll_statistics [6]++;
 	/*
 	 * check resume by Power-SW
 	 */
 	if (resume_by_sw != 0) {
 		battery_low_suspend_cancel ();
 		battery_poll_statistics [4]++;
 		LogIn (0x00070099, (battery_poll_statistics [4]<<16)|(battery_poll_statistics [6]&0xFFFF), resume_by_sw);
 		return 1;		/* wakeup by Power-SW */
 	}
 
+	/*
+	 * check resume by RTC alarm (not the one set by the battery)
+	 */
+	current_alarm [0] = 0x01FFFF;
+	current_alarm [1] = 0x007FFF;
+	pmic_read_reg (REG_RTC_ALARM,     &(current_alarm [0]), 0x01FFFF);
+	pmic_read_reg (REG_RTC_DAY_ALARM, &(current_alarm [1]), 0x007FFF);
+	if ((current_alarm[0] == pre_alarm[1]) && (current_alarm[1] == pre_alarm[2])) {
+	  return 1; /* the RTC wake up alarm that is occurring is not the battery one => wake up */
+	}
+
 	/*
 	 * check BATTERY shutdown voltage
 	 */
 	if (pmic_adc_driver_ldm.resume != 0) {
 		(*pmic_adc_driver_ldm.resume)((struct platform_device *)0);
 	}
 	pmic_event_for_suspend (EVENT_ADCBISDONEI);	/* ONLY enable ADC interrupt */
 	rc = mc13892_battery_sample (1, 0, 1);		/* fake ONLINE/noWAIT/FORCE */
