diff --git a/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.c b/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.c index ff1b019ce2..5505f6da2e 100644 --- a/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.c +++ b/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.c @@ -561,6 +561,7 @@ PcRtcSetTime ( { EFI_STATUS Status; EFI_TIME RtcTime; + RTC_REGISTER_A RegisterA; RTC_REGISTER_B RegisterB; UINT32 TimerVar; @@ -638,6 +639,11 @@ PcRtcSetTime ( RegisterB.Bits.Set = 1; RtcWrite (RTC_ADDRESS_REGISTER_B, RegisterB.Data); + RegisterA.Data = RtcRead (RTC_ADDRESS_REGISTER_A); + // + // Set Divider in Reset status, RTC stops + // + RtcWrite (RTC_ADDRESS_REGISTER_A, RegisterA.Data | RTC_DIV_RESET); // // Store the century value to RTC before converting to BCD format. // @@ -660,6 +666,10 @@ PcRtcSetTime ( RegisterB.Bits.Set = 0; RtcWrite (RTC_ADDRESS_REGISTER_B, RegisterB.Data); + // + // Restore Divider status + // + RtcWrite (RTC_ADDRESS_REGISTER_A, RegisterA.Data); // // Release RTC Lock. // diff --git a/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.h b/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.h index 7e0e98fbcc..cff624f96d 100644 --- a/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.h +++ b/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.h @@ -70,6 +70,7 @@ extern PC_RTC_MODULE_GLOBALS mModuleGlobal; // // Register A // +#define RTC_DIV_RESET 0x70 typedef struct { UINT8 Rs : 4; // Rate Selection Bits UINT8 Dv : 3; // Divisor