aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorIvan Kokshaysky <ink@jurassic.park.msu.ru>2009-01-15 16:51:19 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-01-15 19:39:40 -0500
commit5f7dc5d75076fd1c1fc6bc09f2467509d20db24a (patch)
treec105f8463607381acd7d02bdda75641b3f497e37 /include
parent2f88d151cb8e73587983d7feccd70672ff6730fe (diff)
alpha: fix RTC on marvel
Unlike other alphas, marvel doesn't have real PC-style CMOS clock hardware - RTC accesses are emulated via PAL calls. Unfortunately, for unknown reason these calls work only on CPU #0. So current implementation for arbitrary CPU makes CMOS_READ/WRITE to be executed on CPU #0 via IPI. However, for obvious reason this doesn't work with standard get/set_rtc_time() functions, where a bunch of CMOS accesses is done with disabled interrupts. Solved by making the IPI calls for entire get/set_rtc_time() functions, not for individual CMOS accesses. Which is also a lot more effective performance-wise. The patch is largely based on the code from Jay Estabrook. My changes: - tweak asm-generic/rtc.h by adding a couple of #defines to avoid a massive code duplication in arch/alpha/include/asm/rtc.h; - sys_marvel.c: fix get/set_rtc_time() return values (Jay's FIXMEs). NOTE: this fixes *only* LIB_RTC drivers. Legacy (CONFIG_RTC) driver wont't work on marvel. Actually I think that we should just disable CONFIG_RTC on alpha (maybe in 2.6.30?), like most other arches - AFAIK, all modern distributions use LIB_RTC anyway. Signed-off-by: Ivan Kokshaysky <ink@jurassic.park.msu.ru> Cc: Richard Henderson <rth@twiddle.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include')
-rw-r--r--include/asm-generic/rtc.h14
1 files changed, 11 insertions, 3 deletions
diff --git a/include/asm-generic/rtc.h b/include/asm-generic/rtc.h
index 89061c1a67d4..763e3b060f43 100644
--- a/include/asm-generic/rtc.h
+++ b/include/asm-generic/rtc.h
@@ -42,7 +42,7 @@ static inline unsigned char rtc_is_updating(void)
42 return uip; 42 return uip;
43} 43}
44 44
45static inline unsigned int get_rtc_time(struct rtc_time *time) 45static inline unsigned int __get_rtc_time(struct rtc_time *time)
46{ 46{
47 unsigned char ctrl; 47 unsigned char ctrl;
48 unsigned long flags; 48 unsigned long flags;
@@ -108,8 +108,12 @@ static inline unsigned int get_rtc_time(struct rtc_time *time)
108 return RTC_24H; 108 return RTC_24H;
109} 109}
110 110
111#ifndef get_rtc_time
112#define get_rtc_time __get_rtc_time
113#endif
114
111/* Set the current date and time in the real time clock. */ 115/* Set the current date and time in the real time clock. */
112static inline int set_rtc_time(struct rtc_time *time) 116static inline int __set_rtc_time(struct rtc_time *time)
113{ 117{
114 unsigned long flags; 118 unsigned long flags;
115 unsigned char mon, day, hrs, min, sec; 119 unsigned char mon, day, hrs, min, sec;
@@ -190,11 +194,15 @@ static inline int set_rtc_time(struct rtc_time *time)
190 return 0; 194 return 0;
191} 195}
192 196
197#ifndef set_rtc_time
198#define set_rtc_time __set_rtc_time
199#endif
200
193static inline unsigned int get_rtc_ss(void) 201static inline unsigned int get_rtc_ss(void)
194{ 202{
195 struct rtc_time h; 203 struct rtc_time h;
196 204
197 get_rtc_time(&h); 205 __get_rtc_time(&h);
198 return h.tm_sec; 206 return h.tm_sec;
199} 207}
200 208