
If the RTC needs to be cleared, write the U-Boot build date to it. In any case make sure the settings are correct.
Signed-off-by: Simon Glass sjg@chromium.org ---
drivers/rtc/mc146818.c | 49 +++++++++++++++++++++++++++++++++++++++++++++---- include/rtc.h | 7 +++++++ 2 files changed, 52 insertions(+), 4 deletions(-)
diff --git a/drivers/rtc/mc146818.c b/drivers/rtc/mc146818.c index f7cf106..7528044 100644 --- a/drivers/rtc/mc146818.c +++ b/drivers/rtc/mc146818.c @@ -14,6 +14,7 @@ #include <common.h> #include <command.h> #include <rtc.h> +#include <version.h>
#if defined(__I386__) || defined(CONFIG_MALTA) #include <asm/io.h> @@ -42,6 +43,12 @@ static void rtc_write (uchar reg, uchar val); #define RTC_CONFIG_C 0x0C #define RTC_CONFIG_D 0x0D
+#define RTC_CONFIG_A_REF_CLCK_32KHZ (1 << 5) +#define RTC_CONFIG_A_RATE_1024HZ 6 + +#define RTC_CONFIG_B_24H (1 << 1) + +#define RTC_CONFIG_D_VALID_RAM_AND_TIME 0x80
/* ------------------------------------------------------------------------- */
@@ -128,25 +135,59 @@ void rtc_reset (void) */ static uchar rtc_read (uchar reg) { - return(in8(CONFIG_SYS_RTC_REG_BASE_ADDR+reg)); + return in8(CONFIG_SYS_RTC_REG_BASE_ADDR + reg); }
static void rtc_write (uchar reg, uchar val) { - out8(CONFIG_SYS_RTC_REG_BASE_ADDR+reg, val); + out8(CONFIG_SYS_RTC_REG_BASE_ADDR + reg, val); } #else static uchar rtc_read (uchar reg) { out8(RTC_PORT_MC146818,reg); - return(in8(RTC_PORT_MC146818+1)); + return in8(RTC_PORT_MC146818 + 1); }
static void rtc_write (uchar reg, uchar val) { out8(RTC_PORT_MC146818,reg); - out8(RTC_PORT_MC146818+1,val); + out8(RTC_PORT_MC146818+1, val); } #endif
+void rtc_init(bool invalid) +{ + debug("RTC Init\n"); + +#define CLEAR_CMOS 0 +#else +#define CLEAR_CMOS 1 #endif + + if (invalid) { +#if CLEAR_CMOS + int i; + + rtc_write(0x01, 0); + rtc_write(0x03, 0); + rtc_write(0x05, 0); + for (i = 10; i < 128; i++) + rtc_write(i, 0); +#endif + printf("RTC:%s%s\n", + invalid ? " Clear requested" : "", + CLEAR_CMOS ? " zeroing cmos" : ""); + } + + /* Setup the real time clock */ + rtc_write(RTC_CONFIG_B, RTC_CONFIG_B_24H); + /* Setup the frequency it operates at */ + rtc_write(RTC_CONFIG_A, RTC_CONFIG_A_REF_CLCK_32KHZ | + RTC_CONFIG_A_RATE_1024HZ); + /* Ensure all reserved bits are 0 in register D */ + rtc_write(RTC_CONFIG_D, RTC_CONFIG_D_VALID_RAM_AND_TIME); + + /* Clear any pending interrupts */ + rtc_read(RTC_CONFIG_C); +} diff --git a/include/rtc.h b/include/rtc.h index c034966..8be06bb 100644 --- a/include/rtc.h +++ b/include/rtc.h @@ -50,4 +50,11 @@ void to_tm (int, struct rtc_time *); unsigned long mktime (unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int);
+/** + * rtc_init() - Set up the real time clock ready for use + * + * @rtc_failed: true if time was lost (e.g. flat battery), else false + */ +void rtc_init(bool rtc_failed); + #endif /* _RTC_H_ */