summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/drivers/pc80/rtc/Kconfig7
-rw-r--r--src/drivers/pc80/rtc/mc146818rtc.c19
2 files changed, 19 insertions, 7 deletions
diff --git a/src/drivers/pc80/rtc/Kconfig b/src/drivers/pc80/rtc/Kconfig
index 350863e99a..0d064571e6 100644
--- a/src/drivers/pc80/rtc/Kconfig
+++ b/src/drivers/pc80/rtc/Kconfig
@@ -2,3 +2,10 @@ config DRIVERS_MC146818
bool
default y if ARCH_X86
depends on PC80_SYSTEM
+
+config USE_PC_CMOS_ALTCENTURY
+ bool "Use legacy-BIOS alt-century byte in CMOS"
+ default y if !USE_OPTION_TABLE
+ depends on DRIVERS_MC146818
+ help
+ May be useful for legacy OSes that assume its presence.
diff --git a/src/drivers/pc80/rtc/mc146818rtc.c b/src/drivers/pc80/rtc/mc146818rtc.c
index 42671a94a0..9153a03fd0 100644
--- a/src/drivers/pc80/rtc/mc146818rtc.c
+++ b/src/drivers/pc80/rtc/mc146818rtc.c
@@ -191,11 +191,11 @@ static int cmos_date_invalid(void)
*/
void cmos_check_update_date(void)
{
- u8 year, century;
+ u8 year, century = 0;
- /* Assume hardware always supports RTC_CLK_ALTCENTURY. */
wait_uip();
- century = cmos_read(RTC_CLK_ALTCENTURY);
+ if (CONFIG(USE_PC_CMOS_ALTCENTURY))
+ century = cmos_read(RTC_CLK_ALTCENTURY);
year = cmos_read(RTC_CLK_YEAR);
/*
@@ -215,8 +215,8 @@ int rtc_set(const struct rtc_time *time)
cmos_write(bin2bcd(time->mday), RTC_CLK_DAYOFMONTH);
cmos_write(bin2bcd(time->mon), RTC_CLK_MONTH);
cmos_write(bin2bcd(time->year % 100), RTC_CLK_YEAR);
- /* Same assumption as above: We always have RTC_CLK_ALTCENTURY */
- cmos_write(bin2bcd(time->year / 100), RTC_CLK_ALTCENTURY);
+ if (CONFIG(USE_PC_CMOS_ALTCENTURY))
+ cmos_write(bin2bcd(time->year / 100), RTC_CLK_ALTCENTURY);
cmos_write(bin2bcd(time->wday + 1), RTC_CLK_DAYOFWEEK);
return 0;
}
@@ -230,8 +230,13 @@ int rtc_get(struct rtc_time *time)
time->mday = bcd2bin(cmos_read(RTC_CLK_DAYOFMONTH));
time->mon = bcd2bin(cmos_read(RTC_CLK_MONTH));
time->year = bcd2bin(cmos_read(RTC_CLK_YEAR));
- /* Same assumption as above: We always have RTC_CLK_ALTCENTURY */
- time->year += bcd2bin(cmos_read(RTC_CLK_ALTCENTURY)) * 100;
+ if (CONFIG(USE_PC_CMOS_ALTCENTURY)) {
+ time->year += bcd2bin(cmos_read(RTC_CLK_ALTCENTURY)) * 100;
+ } else {
+ time->year += 1900;
+ if (time->year < 1970)
+ time->year += 100;
+ }
time->wday = bcd2bin(cmos_read(RTC_CLK_DAYOFWEEK)) - 1;
return 0;
}