diff options
author | André Fabian Silva Delgado <emulatorman@parabola.nu> | 2016-11-23 01:35:55 -0300 |
---|---|---|
committer | André Fabian Silva Delgado <emulatorman@parabola.nu> | 2016-11-23 01:35:55 -0300 |
commit | d26f4ddb48463e2ff798859505af1cc520e75685 (patch) | |
tree | a1268534c14d9a7db61b4758ac72c33a3c7712bb /arch/arc/kernel/time.c | |
parent | 3326a1803802aa4730d32304b003f50720996b31 (diff) |
Linux-libre 4.8.10-gnupck-4.8.10-gnu
Diffstat (limited to 'arch/arc/kernel/time.c')
-rw-r--r-- | arch/arc/kernel/time.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/arch/arc/kernel/time.c b/arch/arc/kernel/time.c index f927b8dc6..c10390d1d 100644 --- a/arch/arc/kernel/time.c +++ b/arch/arc/kernel/time.c @@ -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; } |