[PATCH] ARM: RTC: allow driver methods to return error
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Sat, 30 Apr 2005 11:19:28 +0000 (12:19 +0100)
committerRussell King <rmk@dyn-67.arm.linux.org.uk>
Sat, 30 Apr 2005 11:19:28 +0000 (12:19 +0100)
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>
arch/arm/common/rtctime.c
arch/arm/mach-integrator/time.c
drivers/char/s3c2410-rtc.c
include/asm-arm/rtc.h

index c397e71f938d0f79fbcbf29869fbb1d40cf09306..72b03f201eb946f97c9f419090d683ece6ea5bc1 100644 (file)
@@ -141,10 +141,10 @@ void rtc_next_alarm_time(struct rtc_time *next, struct rtc_time *now, struct rtc
        next->tm_sec = alrm->tm_sec;
 }
 
-static inline void rtc_read_time(struct rtc_ops *ops, struct rtc_time *tm)
+static inline int rtc_read_time(struct rtc_ops *ops, struct rtc_time *tm)
 {
        memset(tm, 0, sizeof(struct rtc_time));
-       ops->read_time(tm);
+       return ops->read_time(tm);
 }
 
 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)
        int ret = -EINVAL;
        if (ops->read_alarm) {
                memset(alrm, 0, sizeof(struct rtc_wkalrm));
-               ops->read_alarm(alrm);
-               ret = 0;
+               ret = ops->read_alarm(alrm);
        }
        return ret;
 }
@@ -283,7 +282,9 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
                break;
 
        case RTC_RD_TIME:
-               rtc_read_time(ops, &tm);
+               ret = rtc_read_time(ops, &tm);
+               if (ret)
+                       break;
                ret = copy_to_user(uarg, &tm, sizeof(tm));
                if (ret)
                        ret = -EFAULT;
@@ -424,15 +425,15 @@ static int rtc_read_proc(char *page, char **start, off_t off, int count, int *eo
        struct rtc_time tm;
        char *p = page;
 
-       rtc_read_time(ops, &tm);
-
-       p += sprintf(p,
-               "rtc_time\t: %02d:%02d:%02d\n"
-               "rtc_date\t: %04d-%02d-%02d\n"
-               "rtc_epoch\t: %04lu\n",
-               tm.tm_hour, tm.tm_min, tm.tm_sec,
-               tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
-               rtc_epoch);
+       if (rtc_read_time(ops, &tm) == 0) {
+               p += sprintf(p,
+                       "rtc_time\t: %02d:%02d:%02d\n"
+                       "rtc_date\t: %04d-%02d-%02d\n"
+                       "rtc_epoch\t: %04lu\n",
+                       tm.tm_hour, tm.tm_min, tm.tm_sec,
+                       tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
+                       rtc_epoch);
+       }
 
        if (rtc_read_alarm(ops, &alrm) == 0) {
                p += sprintf(p, "alrm_time\t: ");
index 20729de2af285d62102691ef20942f7caab184af..1a844ca139e0df85e57cee2a67916aa305b1ffcb 100644 (file)
@@ -40,25 +40,32 @@ static int integrator_set_rtc(void)
        return 1;
 }
 
-static void rtc_read_alarm(struct rtc_wkalrm *alrm)
+static int rtc_read_alarm(struct rtc_wkalrm *alrm)
 {
        rtc_time_to_tm(readl(rtc_base + RTC_MR), &alrm->time);
+       return 0;
 }
 
-static int rtc_set_alarm(struct rtc_wkalrm *alrm)
+static inline int rtc_set_alarm(struct rtc_wkalrm *alrm)
 {
        unsigned long time;
        int ret;
 
-       ret = rtc_tm_to_time(&alrm->time, &time);
+       /*
+        * At the moment, we can only deal with non-wildcarded alarm times.
+        */
+       ret = rtc_valid_tm(&alrm->time);
+       if (ret == 0)
+               ret = rtc_tm_to_time(&alrm->time, &time);
        if (ret == 0)
                writel(time, rtc_base + RTC_MR);
        return ret;
 }
 
-static void rtc_read_time(struct rtc_time *tm)
+static int rtc_read_time(struct rtc_time *tm)
 {
        rtc_time_to_tm(readl(rtc_base + RTC_DR), tm);
+       return 0;
 }
 
 /*
@@ -69,7 +76,7 @@ static void rtc_read_time(struct rtc_time *tm)
  * edge of the 1Hz clock, we must write the time one second
  * in advance.
  */
-static int rtc_set_time(struct rtc_time *tm)
+static inline int rtc_set_time(struct rtc_time *tm)
 {
        unsigned long time;
        int ret;
index 8e61be34a1d328c5a948a646504ad65629eaef62..ed867db550a9da16a690a9a122b28d33491ac6f8 100644 (file)
@@ -116,7 +116,7 @@ static void s3c2410_rtc_setfreq(int freq)
 
 /* Time read/write */
 
-static void s3c2410_rtc_gettime(struct rtc_time *rtc_tm)
+static int s3c2410_rtc_gettime(struct rtc_time *rtc_tm)
 {
        unsigned int have_retried = 0;
 
@@ -151,6 +151,8 @@ static void s3c2410_rtc_gettime(struct rtc_time *rtc_tm)
 
        rtc_tm->tm_year += 100;
        rtc_tm->tm_mon -= 1;
+
+       return 0;
 }
 
 
@@ -171,7 +173,7 @@ static int s3c2410_rtc_settime(struct rtc_time *tm)
        return 0;
 }
 
-static void s3c2410_rtc_getalarm(struct rtc_wkalrm *alrm)
+static int s3c2410_rtc_getalarm(struct rtc_wkalrm *alrm)
 {
        struct rtc_time *alm_tm = &alrm->time;
        unsigned int alm_en;
@@ -231,6 +233,8 @@ static void s3c2410_rtc_getalarm(struct rtc_wkalrm *alrm)
        }
 
        /* todo - set alrm->enabled ? */
+
+       return 0;
 }
 
 static int s3c2410_rtc_setalarm(struct rtc_wkalrm *alrm)
index aa7e16b2e2255fbcc0f5aef2cf72c241daf2f81b..370dfe77589d2abd9d8a963772fc79072feba5c0 100644 (file)
@@ -18,9 +18,9 @@ struct rtc_ops {
        void            (*release)(void);
        int             (*ioctl)(unsigned int, unsigned long);
 
-       void            (*read_time)(struct rtc_time *);
+       int             (*read_time)(struct rtc_time *);
        int             (*set_time)(struct rtc_time *);
-       void            (*read_alarm)(struct rtc_wkalrm *);
+       int             (*read_alarm)(struct rtc_wkalrm *);
        int             (*set_alarm)(struct rtc_wkalrm *);
        int             (*proc)(char *buf);
 };