diff options
author | Vineet Gupta <vgupta@synopsys.com> | 2016-10-31 17:09:52 -0400 |
---|---|---|
committer | Vineet Gupta <vgupta@synopsys.com> | 2016-11-07 14:19:44 -0500 |
commit | 922cc171998ac3dbe74d57011ef7ed57e9b0d7df (patch) | |
tree | f5ed33ca33fba86596ad96abaa4bfaffdb2b11d1 | |
parent | e6e335bf3a400bc3b5a65322a891318a25749769 (diff) |
ARC: timer: rtc: implement read loop in "C" vs. inline asm
The current code doesn't even compile as somehow the inline assembly
can't see the register names defined as ARC_RTC_*
I'm pretty sure It worked when I first got it merged, but the tools were
definitely different then.
So better to write this in "C" anyways.
CC: stable@vger.kernel.org #4.2+
Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
-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 f927b8dc6edd..c10390d1ddb6 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) | |||
152 | cycle_t full; | 152 | cycle_t full; |
153 | } stamp; | 153 | } stamp; |
154 | 154 | ||
155 | 155 | /* | |
156 | __asm__ __volatile( | 156 | * hardware has an internal state machine which tracks readout of |
157 | "1: \n" | 157 | * low/high and updates the CTRL.status if |
158 | " lr %0, [AUX_RTC_LOW] \n" | 158 | * - interrupt/exception taken between the two reads |
159 | " lr %1, [AUX_RTC_HIGH] \n" | 159 | * - high increments after low has been read |
160 | " lr %2, [AUX_RTC_CTRL] \n" | 160 | */ |
161 | " bbit0.nt %2, 31, 1b \n" | 161 | do { |
162 | : "=r" (stamp.low), "=r" (stamp.high), "=r" (status)); | 162 | stamp.low = read_aux_reg(AUX_RTC_LOW); |
163 | stamp.high = read_aux_reg(AUX_RTC_HIGH); | ||
164 | status = read_aux_reg(AUX_RTC_CTRL); | ||
165 | } while (!(status & _BITUL(31))); | ||
163 | 166 | ||
164 | return stamp.full; | 167 | return stamp.full; |
165 | } | 168 | } |