Skip to contentSkip to conversation

Patch "ARC: timer: rtc: implement read loop in "C" vs. inline asm" has been added to the 4.8-stable tree

PATCH [email protected] 1 participant 1 message Nov 15, 2016

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

This is a note to let you know that I've just added the patch titled

ARC: timer: rtc: implement read loop in "C" vs. inline asm

to the 4.8-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
arc-timer-rtc-implement-read-loop-in-c-vs.-inline-asm.patch
and it can be found in the queue-4.8 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From 922cc171998ac3dbe74d57011ef7ed57e9b0d7df Mon Sep 17 00:00:00 2001

From: Vineet Gupta <[email protected]>
Date: Mon, 31 Oct 2016 14:09:52 -0700
Subject: ARC: timer: rtc: implement read loop in "C" vs. inline asm

From: Vineet Gupta <[email protected]>

commit 922cc171998ac3dbe74d57011ef7ed57e9b0d7df upstream.

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.

---
 arch/arc/kernel/time.c |   19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)
arch/arc/kernel/time.c +11 -8
@@ -152,14 +152,17 @@ static cycle_t arc_read_rtc(struct clock
 		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;
 }

Patches currently in stable-queue which might be from [email protected] are

queue-4.8/arc-implement-arch-specific-dma_map_ops.mmap.patch queue-4.8/arc-timer-rtc-implement-read-loop-in-c-vs.-inline-asm.patch