aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-s3c.c
diff options
context:
space:
mode:
authorHeiko Stuebner <heiko@sntech.de>2011-12-23 20:52:19 -0500
committerKukjin Kim <kgene.kim@samsung.com>2012-02-06 18:03:42 -0500
commit25c1a2466008a75955e80df3cc0698410a0cec72 (patch)
treefe01954187996f69f99e6beb4a5817dd60415b90 /drivers/rtc/rtc-s3c.c
parentd2524caac3e14af0b95bb428084e0ef355514c2f (diff)
rtc-s3c: add variants for S3C2443 and S3C2416
Especially the TICNT registers are different from the two rtc types that currently exists. Signed-off-by: Heiko Stuebner <heiko@sntech.de> Acked-by: Alessandro Zummo <a.zummo@towertech.it> Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
Diffstat (limited to 'drivers/rtc/rtc-s3c.c')
-rw-r--r--drivers/rtc/rtc-s3c.c40
1 files changed, 36 insertions, 4 deletions
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c
index a6f95fb74dd2..78951866f8ab 100644
--- a/drivers/rtc/rtc-s3c.c
+++ b/drivers/rtc/rtc-s3c.c
@@ -35,6 +35,8 @@
35 35
36enum s3c_cpu_type { 36enum s3c_cpu_type {
37 TYPE_S3C2410, 37 TYPE_S3C2410,
38 TYPE_S3C2416,
39 TYPE_S3C2443,
38 TYPE_S3C64XX, 40 TYPE_S3C64XX,
39}; 41};
40 42
@@ -132,6 +134,7 @@ static int s3c_rtc_setfreq(struct device *dev, int freq)
132 struct platform_device *pdev = to_platform_device(dev); 134 struct platform_device *pdev = to_platform_device(dev);
133 struct rtc_device *rtc_dev = platform_get_drvdata(pdev); 135 struct rtc_device *rtc_dev = platform_get_drvdata(pdev);
134 unsigned int tmp = 0; 136 unsigned int tmp = 0;
137 int val;
135 138
136 if (!is_power_of_2(freq)) 139 if (!is_power_of_2(freq))
137 return -EINVAL; 140 return -EINVAL;
@@ -139,12 +142,22 @@ static int s3c_rtc_setfreq(struct device *dev, int freq)
139 clk_enable(rtc_clk); 142 clk_enable(rtc_clk);
140 spin_lock_irq(&s3c_rtc_pie_lock); 143 spin_lock_irq(&s3c_rtc_pie_lock);
141 144
142 if (s3c_rtc_cpu_type == TYPE_S3C2410) { 145 if (s3c_rtc_cpu_type != TYPE_S3C64XX) {
143 tmp = readb(s3c_rtc_base + S3C2410_TICNT); 146 tmp = readb(s3c_rtc_base + S3C2410_TICNT);
144 tmp &= S3C2410_TICNT_ENABLE; 147 tmp &= S3C2410_TICNT_ENABLE;
145 } 148 }
146 149
147 tmp |= (rtc_dev->max_user_freq / freq)-1; 150 val = (rtc_dev->max_user_freq / freq) - 1;
151
152 if (s3c_rtc_cpu_type == TYPE_S3C2416 || s3c_rtc_cpu_type == TYPE_S3C2443) {
153 tmp |= S3C2443_TICNT_PART(val);
154 writel(S3C2443_TICNT1_PART(val), s3c_rtc_base + S3C2443_TICNT1);
155
156 if (s3c_rtc_cpu_type == TYPE_S3C2416)
157 writel(S3C2416_TICNT2_PART(val), s3c_rtc_base + S3C2416_TICNT2);
158 } else {
159 tmp |= val;
160 }
148 161
149 writel(tmp, s3c_rtc_base + S3C2410_TICNT); 162 writel(tmp, s3c_rtc_base + S3C2410_TICNT);
150 spin_unlock_irq(&s3c_rtc_pie_lock); 163 spin_unlock_irq(&s3c_rtc_pie_lock);
@@ -371,7 +384,7 @@ static void s3c_rtc_enable(struct platform_device *pdev, int en)
371 tmp &= ~S3C2410_RTCCON_RTCEN; 384 tmp &= ~S3C2410_RTCCON_RTCEN;
372 writew(tmp, base + S3C2410_RTCCON); 385 writew(tmp, base + S3C2410_RTCCON);
373 386
374 if (s3c_rtc_cpu_type == TYPE_S3C2410) { 387 if (s3c_rtc_cpu_type != TYPE_S3C64XX) {
375 tmp = readb(base + S3C2410_TICNT); 388 tmp = readb(base + S3C2410_TICNT);
376 tmp &= ~S3C2410_TICNT_ENABLE; 389 tmp &= ~S3C2410_TICNT_ENABLE;
377 writeb(tmp, base + S3C2410_TICNT); 390 writeb(tmp, base + S3C2410_TICNT);
@@ -448,6 +461,7 @@ static int __devinit s3c_rtc_probe(struct platform_device *pdev)
448 struct rtc_time rtc_tm; 461 struct rtc_time rtc_tm;
449 struct resource *res; 462 struct resource *res;
450 int ret; 463 int ret;
464 int tmp;
451 465
452 pr_debug("%s: probe=%p\n", __func__, pdev); 466 pr_debug("%s: probe=%p\n", __func__, pdev);
453 467
@@ -541,11 +555,17 @@ static int __devinit s3c_rtc_probe(struct platform_device *pdev)
541 dev_warn(&pdev->dev, "warning: invalid RTC value so initializing it\n"); 555 dev_warn(&pdev->dev, "warning: invalid RTC value so initializing it\n");
542 } 556 }
543 557
544 if (s3c_rtc_cpu_type == TYPE_S3C64XX) 558 if (s3c_rtc_cpu_type != TYPE_S3C2410)
545 rtc->max_user_freq = 32768; 559 rtc->max_user_freq = 32768;
546 else 560 else
547 rtc->max_user_freq = 128; 561 rtc->max_user_freq = 128;
548 562
563 if (s3c_rtc_cpu_type == TYPE_S3C2416 || s3c_rtc_cpu_type == TYPE_S3C2443) {
564 tmp = readw(s3c_rtc_base + S3C2410_RTCCON);
565 tmp |= S3C2443_RTCCON_TICSEL;
566 writew(tmp, s3c_rtc_base + S3C2410_RTCCON);
567 }
568
549 platform_set_drvdata(pdev, rtc); 569 platform_set_drvdata(pdev, rtc);
550 570
551 s3c_rtc_setfreq(&pdev->dev, 1); 571 s3c_rtc_setfreq(&pdev->dev, 1);
@@ -650,6 +670,12 @@ static const struct of_device_id s3c_rtc_dt_match[] = {
650 .compatible = "samsung,s3c2410-rtc" 670 .compatible = "samsung,s3c2410-rtc"
651 .data = TYPE_S3C2410, 671 .data = TYPE_S3C2410,
652 }, { 672 }, {
673 .compatible = "samsung,s3c2416-rtc"
674 .data = TYPE_S3C2416,
675 }, {
676 .compatible = "samsung,s3c2443-rtc"
677 .data = TYPE_S3C2443,
678 }, {
653 .compatible = "samsung,s3c6410-rtc" 679 .compatible = "samsung,s3c6410-rtc"
654 .data = TYPE_S3C64XX, 680 .data = TYPE_S3C64XX,
655 }, 681 },
@@ -665,6 +691,12 @@ static struct platform_device_id s3c_rtc_driver_ids[] = {
665 .name = "s3c2410-rtc", 691 .name = "s3c2410-rtc",
666 .driver_data = TYPE_S3C2410, 692 .driver_data = TYPE_S3C2410,
667 }, { 693 }, {
694 .name = "s3c2416-rtc",
695 .driver_data = TYPE_S3C2416,
696 }, {
697 .name = "s3c2443-rtc",
698 .driver_data = TYPE_S3C2443,
699 }, {
668 .name = "s3c64xx-rtc", 700 .name = "s3c64xx-rtc",
669 .driver_data = TYPE_S3C64XX, 701 .driver_data = TYPE_S3C64XX,
670 }, 702 },