summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/drivers/pc80/rtc/mc146818rtc.c2
-rw-r--r--src/include/pc80/mc146818rtc.h10
2 files changed, 12 insertions, 0 deletions
diff --git a/src/drivers/pc80/rtc/mc146818rtc.c b/src/drivers/pc80/rtc/mc146818rtc.c
index 5fb9cf695b..c3026a4dbc 100644
--- a/src/drivers/pc80/rtc/mc146818rtc.c
+++ b/src/drivers/pc80/rtc/mc146818rtc.c
@@ -360,6 +360,7 @@ void cmos_check_update_date(void)
u8 year, century;
/* Assume hardware always supports RTC_CLK_ALTCENTURY. */
+ wait_uip();
century = cmos_read(RTC_CLK_ALTCENTURY);
year = cmos_read(RTC_CLK_YEAR);
@@ -388,6 +389,7 @@ int rtc_set(const struct rtc_time *time)
int rtc_get(struct rtc_time *time)
{
+ wait_uip();
time->sec = bcd2bin(cmos_read(RTC_CLK_SECOND));
time->min = bcd2bin(cmos_read(RTC_CLK_MINUTE));
time->hour = bcd2bin(cmos_read(RTC_CLK_HOUR));
diff --git a/src/include/pc80/mc146818rtc.h b/src/include/pc80/mc146818rtc.h
index effc03d2ae..66d5edb4b9 100644
--- a/src/include/pc80/mc146818rtc.h
+++ b/src/include/pc80/mc146818rtc.h
@@ -112,6 +112,16 @@ static inline unsigned char cmos_read(unsigned char addr)
return inb(RTC_BASE_PORT + offs + 1);
}
+/* Upon return the caller is guaranteed 244 microseconds to complete any
+ * RTC operations. wait_uip may be called a single time prior to multiple
+ * accesses, but sequences requiring more time should call wait_uip again.
+ */
+static inline void wait_uip(void)
+{
+ while (cmos_read(RTC_REG_A) & RTC_UIP)
+ ;
+}
+
static inline void cmos_write_inner(unsigned char val, unsigned char addr)
{
int offs = 0;