Commit d5aa207e46ff7ee838683a7d95ecf46fe42a9a56
1 parent
a6ad57fb4b
Exists in
master
and in
7 other branches
[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>
Showing 4 changed files with 35 additions and 23 deletions Side-by-side Diff
arch/arm/common/rtctime.c
... | ... | @@ -141,10 +141,10 @@ |
141 | 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 | 146 | memset(tm, 0, sizeof(struct rtc_time)); |
147 | - ops->read_time(tm); | |
147 | + return ops->read_time(tm); | |
148 | 148 | } |
149 | 149 | |
150 | 150 | static inline int rtc_set_time(struct rtc_ops *ops, struct rtc_time *tm) |
... | ... | @@ -163,8 +163,7 @@ |
163 | 163 | int ret = -EINVAL; |
164 | 164 | if (ops->read_alarm) { |
165 | 165 | memset(alrm, 0, sizeof(struct rtc_wkalrm)); |
166 | - ops->read_alarm(alrm); | |
167 | - ret = 0; | |
166 | + ret = ops->read_alarm(alrm); | |
168 | 167 | } |
169 | 168 | return ret; |
170 | 169 | } |
... | ... | @@ -283,7 +282,9 @@ |
283 | 282 | break; |
284 | 283 | |
285 | 284 | case RTC_RD_TIME: |
286 | - rtc_read_time(ops, &tm); | |
285 | + ret = rtc_read_time(ops, &tm); | |
286 | + if (ret) | |
287 | + break; | |
287 | 288 | ret = copy_to_user(uarg, &tm, sizeof(tm)); |
288 | 289 | if (ret) |
289 | 290 | ret = -EFAULT; |
... | ... | @@ -424,15 +425,15 @@ |
424 | 425 | struct rtc_time tm; |
425 | 426 | char *p = page; |
426 | 427 | |
427 | - rtc_read_time(ops, &tm); | |
428 | - | |
429 | - p += sprintf(p, | |
430 | - "rtc_time\t: %02d:%02d:%02d\n" | |
431 | - "rtc_date\t: %04d-%02d-%02d\n" | |
432 | - "rtc_epoch\t: %04lu\n", | |
433 | - tm.tm_hour, tm.tm_min, tm.tm_sec, | |
434 | - tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, | |
435 | - rtc_epoch); | |
428 | + if (rtc_read_time(ops, &tm) == 0) { | |
429 | + p += sprintf(p, | |
430 | + "rtc_time\t: %02d:%02d:%02d\n" | |
431 | + "rtc_date\t: %04d-%02d-%02d\n" | |
432 | + "rtc_epoch\t: %04lu\n", | |
433 | + tm.tm_hour, tm.tm_min, tm.tm_sec, | |
434 | + tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, | |
435 | + rtc_epoch); | |
436 | + } | |
436 | 437 | |
437 | 438 | if (rtc_read_alarm(ops, &alrm) == 0) { |
438 | 439 | p += sprintf(p, "alrm_time\t: "); |
arch/arm/mach-integrator/time.c
... | ... | @@ -40,25 +40,32 @@ |
40 | 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 | 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 | 51 | unsigned long time; |
51 | 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); | |
54 | 58 | if (ret == 0) |
59 | + ret = rtc_tm_to_time(&alrm->time, &time); | |
60 | + if (ret == 0) | |
55 | 61 | writel(time, rtc_base + RTC_MR); |
56 | 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 | 67 | rtc_time_to_tm(readl(rtc_base + RTC_DR), tm); |
68 | + return 0; | |
62 | 69 | } |
63 | 70 | |
64 | 71 | /* |
... | ... | @@ -69,7 +76,7 @@ |
69 | 76 | * edge of the 1Hz clock, we must write the time one second |
70 | 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 | 81 | unsigned long time; |
75 | 82 | int ret; |
drivers/char/s3c2410-rtc.c
... | ... | @@ -116,7 +116,7 @@ |
116 | 116 | |
117 | 117 | /* Time read/write */ |
118 | 118 | |
119 | -static void s3c2410_rtc_gettime(struct rtc_time *rtc_tm) | |
119 | +static int s3c2410_rtc_gettime(struct rtc_time *rtc_tm) | |
120 | 120 | { |
121 | 121 | unsigned int have_retried = 0; |
122 | 122 | |
... | ... | @@ -151,6 +151,8 @@ |
151 | 151 | |
152 | 152 | rtc_tm->tm_year += 100; |
153 | 153 | rtc_tm->tm_mon -= 1; |
154 | + | |
155 | + return 0; | |
154 | 156 | } |
155 | 157 | |
156 | 158 | |
... | ... | @@ -171,7 +173,7 @@ |
171 | 173 | return 0; |
172 | 174 | } |
173 | 175 | |
174 | -static void s3c2410_rtc_getalarm(struct rtc_wkalrm *alrm) | |
176 | +static int s3c2410_rtc_getalarm(struct rtc_wkalrm *alrm) | |
175 | 177 | { |
176 | 178 | struct rtc_time *alm_tm = &alrm->time; |
177 | 179 | unsigned int alm_en; |
... | ... | @@ -231,6 +233,8 @@ |
231 | 233 | } |
232 | 234 | |
233 | 235 | /* todo - set alrm->enabled ? */ |
236 | + | |
237 | + return 0; | |
234 | 238 | } |
235 | 239 | |
236 | 240 | static int s3c2410_rtc_setalarm(struct rtc_wkalrm *alrm) |
include/asm-arm/rtc.h
... | ... | @@ -18,9 +18,9 @@ |
18 | 18 | void (*release)(void); |
19 | 19 | int (*ioctl)(unsigned int, unsigned long); |
20 | 20 | |
21 | - void (*read_time)(struct rtc_time *); | |
21 | + int (*read_time)(struct rtc_time *); | |
22 | 22 | int (*set_time)(struct rtc_time *); |
23 | - void (*read_alarm)(struct rtc_wkalrm *); | |
23 | + int (*read_alarm)(struct rtc_wkalrm *); | |
24 | 24 | int (*set_alarm)(struct rtc_wkalrm *); |
25 | 25 | int (*proc)(char *buf); |
26 | 26 | }; |