Commit d5aa207e46ff7ee838683a7d95ecf46fe42a9a56

Authored by Russell King
1 parent a6ad57fb4b

[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 };