diff -Naur linux-2.6.25.maxim/drivers/rtc/rtc-at91sam9.c linux-2.6.25.at91-20080908/drivers/rtc/rtc-at91sam9.c
--- linux-2.6.25.maxim/drivers/rtc/rtc-at91sam9.c	2008-09-08 12:55:20.000000000 -0500
+++ linux-2.6.25.at91-20080908/drivers/rtc/rtc-at91sam9.c	2008-07-28 11:57:26.000000000 -0500
@@ -367,6 +367,8 @@
 	 * clock, discrete RTC, etc
 	 */
 
+	device_init_wakeup(&pdev->dev, 1);
+
 	if (gpbr_readl(rtc) == 0)
 		dev_warn(&pdev->dev, "%s: SET TIME!\n",
 				rtc->rtcdev->dev.bus_id);
@@ -395,6 +397,8 @@
 
 	platform_set_drvdata(pdev, NULL);
 	kfree(rtc);
+
+	device_init_wakeup(&pdev->dev, 0);
 	return 0;
 }
 
@@ -411,12 +415,21 @@
 
 /* AT91SAM9 RTC Power management control */
 
+static struct timespec at91_rtc_delta;
+
 static int at91_rtc_suspend(struct platform_device *pdev,
 					pm_message_t state)
 {
 	struct sam9_rtc	*rtc = platform_get_drvdata(pdev);
 	u32		mr = rtt_readl(rtc, MR);
 
+	struct timespec time;
+	struct rtc_time tm;
+
+	at91_rtc_readtime(&pdev->dev, &tm);
+	rtc_tm_to_time(&tm, &time.tv_sec);
+	save_time_delta(&at91_rtc_delta, &time);
+	
 	/*
 	 * This IRQ is shared with DBGU and other hardware which isn't
 	 * necessarily a wakeup event source.
@@ -440,6 +453,13 @@
 	struct sam9_rtc	*rtc = platform_get_drvdata(pdev);
 	u32		mr;
 
+	struct timespec time;
+	struct rtc_time tm;
+
+	at91_rtc_readtime(&pdev->dev, &tm);
+	rtc_tm_to_time(&tm, &time.tv_sec);
+	restore_time_delta(&at91_rtc_delta, &time);
+
 	if (rtc->imr) {
 		if (device_may_wakeup(&pdev->dev))
 			disable_irq_wake(AT91_ID_SYS);
