| From 96fc3a45ea073136566f3c2676cad52f8b39a7df Mon Sep 17 00:00:00 2001 |
| From: Joakim Tjernlund <Joakim.Tjernlund@transmode.se> |
| Date: Tue, 29 Jun 2010 15:05:34 -0700 |
| Subject: rtc: fix ds1388 time corruption |
| |
| From: Joakim Tjernlund <Joakim.Tjernlund@transmode.se> |
| |
| commit 96fc3a45ea073136566f3c2676cad52f8b39a7df upstream. |
| |
| The ds1307 driver misreads the ds1388 registers when checking for 12 or 24 |
| hour mode. Instead of checking the hour register it reads the minute |
| register. Therefore the driver thinks minutes >= 40 has the 12HR bit set |
| and resets the minute register by zeroing the high bits. This results in |
| minutes are reset to 0-9, jumping back in time 40 or 50 minutes. The time |
| jump is also written back to the RTC. |
| |
| Signed-off-by: Joakim Tjernlund <Joakim.Tjernlund@transmode.se> |
| Cc: Wan ZongShun <mcuos.com@gmail.com> |
| Cc: Alessandro Zummo <a.zummo@towertech.it> |
| Cc: Paul Gortmaker <p_gortmaker@yahoo.com> |
| 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@suse.de> |
| |
| --- |
| drivers/rtc/rtc-ds1307.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/rtc/rtc-ds1307.c |
| +++ b/drivers/rtc/rtc-ds1307.c |
| @@ -775,7 +775,7 @@ static int __devinit ds1307_probe(struct |
| |
| read_rtc: |
| /* read RTC registers */ |
| - tmp = ds1307->read_block_data(ds1307->client, 0, 8, buf); |
| + tmp = ds1307->read_block_data(ds1307->client, ds1307->offset, 8, buf); |
| if (tmp != 8) { |
| pr_debug("read error %d\n", tmp); |
| err = -EIO; |
| @@ -860,7 +860,7 @@ read_rtc: |
| if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM) |
| tmp += 12; |
| i2c_smbus_write_byte_data(client, |
| - DS1307_REG_HOUR, |
| + ds1307->offset + DS1307_REG_HOUR, |
| bin2bcd(tmp)); |
| } |
| |