Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 40d2d968 authored by Vikas Sajjan's avatar Vikas Sajjan Committed by Linus Torvalds
Browse files

drivers/rtc/rtc-s3c.c: fix incorrect way of save/restore of S3C2410_TICNT for TYPE_S3C64XX



On exynos5250, exynos5420 and exynos5260 it was observed that, after 1
cycle of S2R, the rtc-tick occurs at a very fast rate as compared to the
rtc-tick occuring before S2R.

This patch fixes the above issue by correcting the wrong way of
save/restore of S3C2410_TICNT for TYPE_S3C64XX.

Signed-off-by: default avatarVikas Sajjan <vikas.sajjan@samsung.com>
Cc: Grant Likely <grant.likely@linaro.org>
Cc: Rob Herring <robh+dt@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 0f55159d
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -580,10 +580,12 @@ static int s3c_rtc_suspend(struct device *dev)

	clk_enable(rtc_clk);
	/* save TICNT for anyone using periodic interrupts */
	ticnt_save = readb(s3c_rtc_base + S3C2410_TICNT);
	if (s3c_rtc_cpu_type == TYPE_S3C64XX) {
		ticnt_en_save = readw(s3c_rtc_base + S3C2410_RTCCON);
		ticnt_en_save &= S3C64XX_RTCCON_TICEN;
		ticnt_save = readl(s3c_rtc_base + S3C2410_TICNT);
	} else {
		ticnt_save = readb(s3c_rtc_base + S3C2410_TICNT);
	}
	s3c_rtc_enable(pdev, 0);

@@ -605,10 +607,15 @@ static int s3c_rtc_resume(struct device *dev)

	clk_enable(rtc_clk);
	s3c_rtc_enable(pdev, 1);
	writeb(ticnt_save, s3c_rtc_base + S3C2410_TICNT);
	if (s3c_rtc_cpu_type == TYPE_S3C64XX && ticnt_en_save) {
	if (s3c_rtc_cpu_type == TYPE_S3C64XX) {
		writel(ticnt_save, s3c_rtc_base + S3C2410_TICNT);
		if (ticnt_en_save) {
			tmp = readw(s3c_rtc_base + S3C2410_RTCCON);
		writew(tmp | ticnt_en_save, s3c_rtc_base + S3C2410_RTCCON);
			writew(tmp | ticnt_en_save,
					s3c_rtc_base + S3C2410_RTCCON);
		}
	} else {
		writeb(ticnt_save, s3c_rtc_base + S3C2410_TICNT);
	}

	if (device_may_wakeup(dev) && wake_en) {