--- linux-2.6.14.orig/arch/sh/boards/landisk/rtc.c	2005-10-10 23:12:38.000000000 +0900
+++ linux-2.6.14/arch/sh/boards/landisk/rtc.c	2005-10-11 00:31:40.000000000 +0900
@@ -15,6 +15,7 @@
 #include <linux/sched.h>
 #include <linux/time.h>
 #include <linux/delay.h>
+#include <linux/spinlock.h>
 
 #ifndef BCD_TO_BIN
 #define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10)
@@ -26,6 +27,7 @@
 
 extern void (*rtc_get_time) (struct timespec *);
 extern int (*rtc_set_time) (const time_t);
+extern spinlock_t rtc_lock;
 
 extern void
 rs5c313_set_cmos_time(unsigned int BCD_yr, unsigned int BCD_mon,
@@ -40,10 +42,13 @@ rs5c313_get_cmos_time(unsigned int *BCD_
 void landisk_rtc_gettimeofday(struct timespec *tv)
 {
 	unsigned int BCD_yr, BCD_mon, BCD_day, BCD_hr, BCD_min, BCD_sec;
+	unsigned long flags;
+
+	spin_lock_irqsave(&rtc_lock, flags);
 	tv->tv_sec = rs5c313_get_cmos_time
 	    (&BCD_yr, &BCD_mon, &BCD_day, &BCD_hr, &BCD_min, &BCD_sec);
-
 	tv->tv_nsec = 0;
+	spin_unlock_irqrestore(&rtc_lock, flags);
 }
 
 int landisk_rtc_settimeofday(const time_t secs)
@@ -54,7 +59,7 @@ int landisk_rtc_settimeofday(const time_
 	unsigned long nowtime = secs;
 	unsigned int BCD_yr, BCD_mon, BCD_day, BCD_hr, BCD_min, BCD_sec;
 
-	local_irq_save(flags);
+	spin_lock_irqsave(&rtc_lock, flags);
 
 	rs5c313_get_cmos_time
 	  (&BCD_yr, &BCD_mon, &BCD_day, &BCD_hr, &BCD_min, &BCD_sec);
@@ -85,7 +90,7 @@ int landisk_rtc_settimeofday(const time_
 		retval = -1;
 	}
 
-	local_irq_restore(flags);
+	spin_unlock_irqrestore(&rtc_lock, flags);
 	return retval;
 }
 
