commit: 2f90b68309683f2c5765a1b04ca23d71e51f1494
From: Tony Prisk <[email protected]>
Date: Fri, 4 Jan 2013 15:35:48 -0800
Subject: drivers/rtc/rtc-vt8500.c: fix handling of data passed in struct 
rtc_time

tm_mon is 0..11, whereas vt8500 expects 1..12 for the month field,
causing invalid date errors for January, and causing the day field to
roll over incorrectly.

The century flag is only handled in vt8500_rtc_read_time, but not set in
vt8500_rtc_set_time.  This patch corrects the behaviour of the century
flag.

Signed-off-by: Edgar Toernig <[email protected]>
Signed-off-by: Tony Prisk <[email protected]>
Cc: <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
---
 drivers/rtc/rtc-vt8500.c |    7 ++++---
 1 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/rtc/rtc-vt8500.c b/drivers/rtc/rtc-vt8500.c
index 737addf..00c930f 100644
--- a/drivers/rtc/rtc-vt8500.c
+++ b/drivers/rtc/rtc-vt8500.c
@@ -119,7 +119,7 @@ static int vt8500_rtc_read_time(struct device *dev, struct 
rtc_time *tm)
        tm->tm_min = bcd2bin((time & TIME_MIN_MASK) >> TIME_MIN_S);
        tm->tm_hour = bcd2bin((time & TIME_HOUR_MASK) >> TIME_HOUR_S);
        tm->tm_mday = bcd2bin(date & DATE_DAY_MASK);
-       tm->tm_mon = bcd2bin((date & DATE_MONTH_MASK) >> DATE_MONTH_S);
+       tm->tm_mon = bcd2bin((date & DATE_MONTH_MASK) >> DATE_MONTH_S) - 1;
        tm->tm_year = bcd2bin((date & DATE_YEAR_MASK) >> DATE_YEAR_S)
                        + ((date >> DATE_CENTURY_S) & 1 ? 200 : 100);
        tm->tm_wday = (time & TIME_DOW_MASK) >> TIME_DOW_S;
@@ -138,8 +138,9 @@ static int vt8500_rtc_set_time(struct device *dev, struct 
rtc_time *tm)
        }
 
        writel((bin2bcd(tm->tm_year - 100) << DATE_YEAR_S)
-               | (bin2bcd(tm->tm_mon) << DATE_MONTH_S)
-               | (bin2bcd(tm->tm_mday)),
+               | (bin2bcd(tm->tm_mon + 1) << DATE_MONTH_S)
+               | (bin2bcd(tm->tm_mday))
+               | ((tm->tm_year >= 200) << DATE_CENTURY_S),
                vt8500_rtc->regbase + VT8500_RTC_DS);
        writel((bin2bcd(tm->tm_wday) << TIME_DOW_S)
                | (bin2bcd(tm->tm_hour) << TIME_HOUR_S)
-- 
1.7.3.4
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to