| From 2f90b68309683f2c5765a1b04ca23d71e51f1494 Mon Sep 17 00:00:00 2001 |
| From: Tony Prisk <linux@prisktech.co.nz> |
| Date: Fri, 4 Jan 2013 15:35:48 -0800 |
| Subject: drivers/rtc/rtc-vt8500.c: fix handling of data passed in struct rtc_time |
| |
| From: Tony Prisk <linux@prisktech.co.nz> |
| |
| commit 2f90b68309683f2c5765a1b04ca23d71e51f1494 upstream. |
| |
| 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 <froese@gmx.de> |
| Signed-off-by: Tony Prisk <linux@prisktech.co.nz> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/rtc/rtc-vt8500.c | 7 ++++--- |
| 1 file changed, 4 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/rtc/rtc-vt8500.c |
| +++ b/drivers/rtc/rtc-vt8500.c |
| @@ -119,7 +119,7 @@ static int vt8500_rtc_read_time(struct d |
| 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 de |
| } |
| |
| 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) |