RTC: Skip rtc_init() in S3 resume path

In addition to not clearing the pending interrupts, we also
don't want to reset the RTC control register when booting
with an S3 resume.

On most new systems, when the RTC well is losing power, we
will also lose state that is required to perform a resume,
so we end up in a normal boot anyways. Hence don't do any
RTC initialization in the S3 resume path.

Signed-off-by: Stefan Reinauer <reinauer@google.com>

Change-Id: I73b486082faa741e9dccd15f2b8e3a8399c98f80
Reviewed-on: https://gerrit.chromium.org/gerrit/56826
Reviewed-by: Duncan Laurie <dlaurie@chromium.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-by: Derek Basehore <dbasehore@chromium.org>
Commit-Queue: Stefan Reinauer <reinauer@google.com>
Tested-by: Stefan Reinauer <reinauer@google.com>
Reviewed-on: http://review.coreboot.org/4206
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
This commit is contained in:
Stefan Reinauer 2013-05-28 12:37:08 -07:00 committed by Stefan Reinauer
parent 7ae7fc081b
commit 86ce7f9273
1 changed files with 11 additions and 10 deletions

View File

@ -71,6 +71,17 @@ void rtc_init(int invalid)
unsigned char x; unsigned char x;
#endif #endif
#if CONFIG_HAVE_ACPI_RESUME
/*
* Avoid clearing pending interrupts and resetting the RTC control
* register in the resume path because the Linux kernel relies on
* this to know if it should restart the RTC timer queue if the wake
* was due to the RTC alarm.
*/
if (acpi_slp_type == 3)
return;
#endif
printk(BIOS_DEBUG, "RTC Init\n"); printk(BIOS_DEBUG, "RTC Init\n");
#if CONFIG_USE_OPTION_TABLE #if CONFIG_USE_OPTION_TABLE
@ -128,16 +139,6 @@ void rtc_init(int invalid)
PC_CKS_RANGE_END,PC_CKS_LOC); PC_CKS_RANGE_END,PC_CKS_LOC);
#endif #endif
#if CONFIG_HAVE_ACPI_RESUME
/*
* Avoid clearing pending interrupts in the resume path because
* the Linux kernel relies on this to know if it should restart
* the RTC timer queue if the wake was due to the RTC alarm.
*/
if (acpi_slp_type == 3)
return;
#endif
/* Clear any pending interrupts */ /* Clear any pending interrupts */
(void) cmos_read(RTC_INTR_FLAGS); (void) cmos_read(RTC_INTR_FLAGS);
} }