|
@@ -152,14 +152,17 @@ static cycle_t arc_read_rtc(struct clocksource *cs)
|
|
|
cycle_t full;
|
|
|
} stamp;
|
|
|
|
|
|
-
|
|
|
- __asm__ __volatile(
|
|
|
- "1: \n"
|
|
|
- " lr %0, [AUX_RTC_LOW] \n"
|
|
|
- " lr %1, [AUX_RTC_HIGH] \n"
|
|
|
- " lr %2, [AUX_RTC_CTRL] \n"
|
|
|
- " bbit0.nt %2, 31, 1b \n"
|
|
|
- : "=r" (stamp.low), "=r" (stamp.high), "=r" (status));
|
|
|
+ /*
|
|
|
+ * hardware has an internal state machine which tracks readout of
|
|
|
+ * low/high and updates the CTRL.status if
|
|
|
+ * - interrupt/exception taken between the two reads
|
|
|
+ * - high increments after low has been read
|
|
|
+ */
|
|
|
+ do {
|
|
|
+ stamp.low = read_aux_reg(AUX_RTC_LOW);
|
|
|
+ stamp.high = read_aux_reg(AUX_RTC_HIGH);
|
|
|
+ status = read_aux_reg(AUX_RTC_CTRL);
|
|
|
+ } while (!(status & _BITUL(31)));
|
|
|
|
|
|
return stamp.full;
|
|
|
}
|