diff options
author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2005-04-30 07:19:28 -0400 |
---|---|---|
committer | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2005-04-30 07:19:28 -0400 |
commit | d5aa207e46ff7ee838683a7d95ecf46fe42a9a56 (patch) | |
tree | 2fe7cf50bb45a3ca94f095695bab5414fa56c1f3 /arch | |
parent | a6ad57fb4b5e9d68553f4440377b99f75588fa88 (diff) |
[PATCH] ARM: RTC: allow driver methods to return error
Allow RTC drivers to return error codes from their read_time
or read_alarm methods.
Signed-off-by: Russell King <rmk@arm.linux.org.uk>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/common/rtctime.c | 29 | ||||
-rw-r--r-- | arch/arm/mach-integrator/time.c | 17 |
2 files changed, 27 insertions, 19 deletions
diff --git a/arch/arm/common/rtctime.c b/arch/arm/common/rtctime.c index c397e71f938d..72b03f201eb9 100644 --- a/arch/arm/common/rtctime.c +++ b/arch/arm/common/rtctime.c | |||
@@ -141,10 +141,10 @@ void rtc_next_alarm_time(struct rtc_time *next, struct rtc_time *now, struct rtc | |||
141 | next->tm_sec = alrm->tm_sec; | 141 | next->tm_sec = alrm->tm_sec; |
142 | } | 142 | } |
143 | 143 | ||
144 | static inline void rtc_read_time(struct rtc_ops *ops, struct rtc_time *tm) | 144 | static inline int rtc_read_time(struct rtc_ops *ops, struct rtc_time *tm) |
145 | { | 145 | { |
146 | memset(tm, 0, sizeof(struct rtc_time)); | 146 | memset(tm, 0, sizeof(struct rtc_time)); |
147 | ops->read_time(tm); | 147 | return ops->read_time(tm); |
148 | } | 148 | } |
149 | 149 | ||
150 | static inline int rtc_set_time(struct rtc_ops *ops, struct rtc_time *tm) | 150 | static inline int rtc_set_time(struct rtc_ops *ops, struct rtc_time *tm) |
@@ -163,8 +163,7 @@ static inline int rtc_read_alarm(struct rtc_ops *ops, struct rtc_wkalrm *alrm) | |||
163 | int ret = -EINVAL; | 163 | int ret = -EINVAL; |
164 | if (ops->read_alarm) { | 164 | if (ops->read_alarm) { |
165 | memset(alrm, 0, sizeof(struct rtc_wkalrm)); | 165 | memset(alrm, 0, sizeof(struct rtc_wkalrm)); |
166 | ops->read_alarm(alrm); | 166 | ret = ops->read_alarm(alrm); |
167 | ret = 0; | ||
168 | } | 167 | } |
169 | return ret; | 168 | return ret; |
170 | } | 169 | } |
@@ -283,7 +282,9 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | |||
283 | break; | 282 | break; |
284 | 283 | ||
285 | case RTC_RD_TIME: | 284 | case RTC_RD_TIME: |
286 | rtc_read_time(ops, &tm); | 285 | ret = rtc_read_time(ops, &tm); |
286 | if (ret) | ||
287 | break; | ||
287 | ret = copy_to_user(uarg, &tm, sizeof(tm)); | 288 | ret = copy_to_user(uarg, &tm, sizeof(tm)); |
288 | if (ret) | 289 | if (ret) |
289 | ret = -EFAULT; | 290 | ret = -EFAULT; |
@@ -424,15 +425,15 @@ static int rtc_read_proc(char *page, char **start, off_t off, int count, int *eo | |||
424 | struct rtc_time tm; | 425 | struct rtc_time tm; |
425 | char *p = page; | 426 | char *p = page; |
426 | 427 | ||
427 | rtc_read_time(ops, &tm); | 428 | if (rtc_read_time(ops, &tm) == 0) { |
428 | 429 | p += sprintf(p, | |
429 | p += sprintf(p, | 430 | "rtc_time\t: %02d:%02d:%02d\n" |
430 | "rtc_time\t: %02d:%02d:%02d\n" | 431 | "rtc_date\t: %04d-%02d-%02d\n" |
431 | "rtc_date\t: %04d-%02d-%02d\n" | 432 | "rtc_epoch\t: %04lu\n", |
432 | "rtc_epoch\t: %04lu\n", | 433 | tm.tm_hour, tm.tm_min, tm.tm_sec, |
433 | tm.tm_hour, tm.tm_min, tm.tm_sec, | 434 | tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, |
434 | tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, | 435 | rtc_epoch); |
435 | rtc_epoch); | 436 | } |
436 | 437 | ||
437 | if (rtc_read_alarm(ops, &alrm) == 0) { | 438 | if (rtc_read_alarm(ops, &alrm) == 0) { |
438 | p += sprintf(p, "alrm_time\t: "); | 439 | p += sprintf(p, "alrm_time\t: "); |
diff --git a/arch/arm/mach-integrator/time.c b/arch/arm/mach-integrator/time.c index 20729de2af28..1a844ca139e0 100644 --- a/arch/arm/mach-integrator/time.c +++ b/arch/arm/mach-integrator/time.c | |||
@@ -40,25 +40,32 @@ static int integrator_set_rtc(void) | |||
40 | return 1; | 40 | return 1; |
41 | } | 41 | } |
42 | 42 | ||
43 | static void rtc_read_alarm(struct rtc_wkalrm *alrm) | 43 | static int rtc_read_alarm(struct rtc_wkalrm *alrm) |
44 | { | 44 | { |
45 | rtc_time_to_tm(readl(rtc_base + RTC_MR), &alrm->time); | 45 | rtc_time_to_tm(readl(rtc_base + RTC_MR), &alrm->time); |
46 | return 0; | ||
46 | } | 47 | } |
47 | 48 | ||
48 | static int rtc_set_alarm(struct rtc_wkalrm *alrm) | 49 | static inline int rtc_set_alarm(struct rtc_wkalrm *alrm) |
49 | { | 50 | { |
50 | unsigned long time; | 51 | unsigned long time; |
51 | int ret; | 52 | int ret; |
52 | 53 | ||
53 | ret = rtc_tm_to_time(&alrm->time, &time); | 54 | /* |
55 | * At the moment, we can only deal with non-wildcarded alarm times. | ||
56 | */ | ||
57 | ret = rtc_valid_tm(&alrm->time); | ||
58 | if (ret == 0) | ||
59 | ret = rtc_tm_to_time(&alrm->time, &time); | ||
54 | if (ret == 0) | 60 | if (ret == 0) |
55 | writel(time, rtc_base + RTC_MR); | 61 | writel(time, rtc_base + RTC_MR); |
56 | return ret; | 62 | return ret; |
57 | } | 63 | } |
58 | 64 | ||
59 | static void rtc_read_time(struct rtc_time *tm) | 65 | static int rtc_read_time(struct rtc_time *tm) |
60 | { | 66 | { |
61 | rtc_time_to_tm(readl(rtc_base + RTC_DR), tm); | 67 | rtc_time_to_tm(readl(rtc_base + RTC_DR), tm); |
68 | return 0; | ||
62 | } | 69 | } |
63 | 70 | ||
64 | /* | 71 | /* |
@@ -69,7 +76,7 @@ static void rtc_read_time(struct rtc_time *tm) | |||
69 | * edge of the 1Hz clock, we must write the time one second | 76 | * edge of the 1Hz clock, we must write the time one second |
70 | * in advance. | 77 | * in advance. |
71 | */ | 78 | */ |
72 | static int rtc_set_time(struct rtc_time *tm) | 79 | static inline int rtc_set_time(struct rtc_time *tm) |
73 | { | 80 | { |
74 | unsigned long time; | 81 | unsigned long time; |
75 | int ret; | 82 | int ret; |