diff options
author | Changhwan Youn <chaos.youn@samsung.com> | 2010-10-27 18:33:10 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-27 21:03:06 -0400 |
commit | e1df962e6cdc431acb6a8da409b6a7d89c4f782e (patch) | |
tree | d56e3cab40e38d99cb671d93b982feb57657355d /drivers/rtc/rtc-s3c.c | |
parent | 30ffc40cf52cd68782b50cb699b5eca076ca23ab (diff) |
rtc: rtc-s3c: fix RTC initialization method
Change RTC initialization method in probe(). The 'rtc_valid_tm(tm)' can
check whether RTC BCD is valid or not. And change the method of checking
because the previous method cannot validate RTC BCD registers properly.
Signed-off-by: Changhwan Youn <chaos.youn@samsung.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
Cc: Ben Dooks <ben-linux@fluff.org>
Cc: Wan ZongShun <mcuos.com@gmail.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/rtc/rtc-s3c.c')
-rw-r--r-- | drivers/rtc/rtc-s3c.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index ead217b1857a..d0498a223f40 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c | |||
@@ -456,8 +456,8 @@ static int __devexit s3c_rtc_remove(struct platform_device *dev) | |||
456 | static int __devinit s3c_rtc_probe(struct platform_device *pdev) | 456 | static int __devinit s3c_rtc_probe(struct platform_device *pdev) |
457 | { | 457 | { |
458 | struct rtc_device *rtc; | 458 | struct rtc_device *rtc; |
459 | struct rtc_time rtc_tm; | ||
459 | struct resource *res; | 460 | struct resource *res; |
460 | unsigned int tmp, i; | ||
461 | int ret; | 461 | int ret; |
462 | 462 | ||
463 | pr_debug("%s: probe=%p\n", __func__, pdev); | 463 | pr_debug("%s: probe=%p\n", __func__, pdev); |
@@ -538,11 +538,19 @@ static int __devinit s3c_rtc_probe(struct platform_device *pdev) | |||
538 | 538 | ||
539 | /* Check RTC Time */ | 539 | /* Check RTC Time */ |
540 | 540 | ||
541 | for (i = S3C2410_RTCSEC; i <= S3C2410_RTCYEAR; i += 0x4) { | 541 | s3c_rtc_gettime(NULL, &rtc_tm); |
542 | tmp = readb(s3c_rtc_base + i); | ||
543 | 542 | ||
544 | if ((tmp & 0xf) > 0x9 || ((tmp >> 4) & 0xf) > 0x9) | 543 | if (rtc_valid_tm(&rtc_tm)) { |
545 | writeb(0, s3c_rtc_base + i); | 544 | rtc_tm.tm_year = 100; |
545 | rtc_tm.tm_mon = 0; | ||
546 | rtc_tm.tm_mday = 1; | ||
547 | rtc_tm.tm_hour = 0; | ||
548 | rtc_tm.tm_min = 0; | ||
549 | rtc_tm.tm_sec = 0; | ||
550 | |||
551 | s3c_rtc_settime(NULL, &rtc_tm); | ||
552 | |||
553 | dev_warn(&pdev->dev, "warning: invalid RTC value so initializing it\n"); | ||
546 | } | 554 | } |
547 | 555 | ||
548 | if (s3c_rtc_cpu_type == TYPE_S3C64XX) | 556 | if (s3c_rtc_cpu_type == TYPE_S3C64XX) |