rtc: suspend()/resume() restores system clock
RTC class suspend/resume support, re-initializing the system clock on resume from the clock used to initialize it at boot time. - The reinit-on-resume is hooked to the existing RTC_HCTOSYS config option, on the grounds that a clock good enough for init must also be good enough for re-init. - Inlining a version of the code used by ARM, to save and restore the delta between a selected RTC and the current system wall-clock time. - Removes calls to that ARM code from AT91, OMAP1, and S3C RTCs. This means that systems using those RTCs across suspend/resume will likely want to change their kernel configs to enable RTC_HCTOSYS. If HCTOSYS isn't using a second RTC (with battery?), this changes the system's initial date from Jan 1970 to the epoch this hardware uses: 1998 for AT91, 2000 for OMAP1 (assuming no split power mode), etc. This goes on top of the patch series removing "struct class_device" usage from the RTC framework. That's all needed for class suspend()/resume(). Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Acked-by: Greg Kroah-Hartman <gregkh@suse.de> Acked-By: Alessandro Zummo <a.zummo@towertech.it> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
cd9662094e
commit
7ca1d488ff
@@ -548,37 +548,15 @@ static int ticnt_save;
|
||||
|
||||
static int s3c_rtc_suspend(struct platform_device *pdev, pm_message_t state)
|
||||
{
|
||||
struct rtc_time tm;
|
||||
struct timespec time;
|
||||
|
||||
time.tv_nsec = 0;
|
||||
|
||||
/* save TICNT for anyone using periodic interrupts */
|
||||
|
||||
ticnt_save = readb(s3c_rtc_base + S3C2410_TICNT);
|
||||
|
||||
/* calculate time delta for suspend */
|
||||
|
||||
s3c_rtc_gettime(&pdev->dev, &tm);
|
||||
rtc_tm_to_time(&tm, &time.tv_sec);
|
||||
save_time_delta(&s3c_rtc_delta, &time);
|
||||
s3c_rtc_enable(pdev, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int s3c_rtc_resume(struct platform_device *pdev)
|
||||
{
|
||||
struct rtc_time tm;
|
||||
struct timespec time;
|
||||
|
||||
time.tv_nsec = 0;
|
||||
|
||||
s3c_rtc_enable(pdev, 1);
|
||||
s3c_rtc_gettime(&pdev->dev, &tm);
|
||||
rtc_tm_to_time(&tm, &time.tv_sec);
|
||||
restore_time_delta(&s3c_rtc_delta, &time);
|
||||
|
||||
writeb(ticnt_save, s3c_rtc_base + S3C2410_TICNT);
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user