Thread (5 messages) 5 messages, 4 authors, 2015-05-10

[PATCH] rtc: snvs: improve timeout handling in snvs_rtc_enable()

DORMANTno replies

From: Alexandre Belloni <hidden>
Date: 2015-05-10 21:42:44
Also in: linux-rtc

Hi Shawn, Lothar,

On 18/08/2012 at 15:14:04 +0200, Lothar Wa?mann wrote :
Shawn Guo writes:
quoted
On Sat, Aug 18, 2012 at 10:10:08AM +0200, Lothar Wa?mann wrote:
quoted
If snvs_rtc_enable() happens to be descheduled for a period longer
than the timout period, a timeout may be indicated even if the RTC
status has changed meanwhile. Force a status read at the end of the
timeout period to prevent bogus timeout errors.


Signed-off-by: Lothar Wa?mann <redacted>
---
 drivers/rtc/rtc-snvs.c |   22 +++++++++++++---------
 1 files changed, 13 insertions(+), 9 deletions(-)

 Compile tested only due to lack of HW.
Tested-by: Shawn Guo <redacted>
It seems that patch never made it mainline. Can you check if it is still
needed?

quoted hunk ↗ jump to hunk
quoted
A small nitpick below.
quoted
diff --git a/drivers/rtc/rtc-snvs.c b/drivers/rtc/rtc-snvs.c
index 912f116..dc921b2 100644
--- a/drivers/rtc/rtc-snvs.c
+++ b/drivers/rtc/rtc-snvs.c
@@ -81,6 +81,13 @@ static void rtc_write_sync_lp(void __iomem *ioaddr)
 	}
 }
 
+static int snvs_rtc_enable_done(int enable, void __iomem *addr)
Can we rename parameter "addr" to "ioaddr" and put it before "enable",
also change "enable" to bool?
OK. The resulting assembler code of the patch below is identical to
the previous version of this patch.


Signed-off-by: Lothar Wa?mann <redacted>
Tested-by: Shawn Guo <redacted>
---
 drivers/rtc/rtc-snvs.c |   22 +++++++++++++---------
 1 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/drivers/rtc/rtc-snvs.c b/drivers/rtc/rtc-snvs.c
index 912f116..a757cb9 100644
--- a/drivers/rtc/rtc-snvs.c
+++ b/drivers/rtc/rtc-snvs.c
@@ -81,6 +81,13 @@ static void rtc_write_sync_lp(void __iomem *ioaddr)
 	}
 }
 
+static int snvs_rtc_enable_done(void __iomem *ioaddr, bool enable)
+{
+	u32 lpcr = readl(ioaddr + SNVS_LPCR);
+
+	return enable ^ !(lpcr & SNVS_LPCR_SRTC_ENV);
+}
+
 static int snvs_rtc_enable(struct snvs_rtc_data *data, bool enable)
 {
 	unsigned long timeout = jiffies + msecs_to_jiffies(1);
@@ -99,18 +106,15 @@ static int snvs_rtc_enable(struct snvs_rtc_data *data, bool enable)
 	spin_unlock_irqrestore(&data->lock, flags);
 
 	while (1) {
-		lpcr = readl(data->ioaddr + SNVS_LPCR);
+		if (snvs_rtc_enable_done(data->ioaddr, enable))
+			break;
 
-		if (enable) {
-			if (lpcr & SNVS_LPCR_SRTC_ENV)
-				break;
-		} else {
-			if (!(lpcr & SNVS_LPCR_SRTC_ENV))
+		if (time_after(jiffies, timeout)) {
+			if (snvs_rtc_enable_done(data->ioaddr, enable))
 				break;
+			else
+				return -ETIMEDOUT;
 		}
-
-		if (time_after(jiffies, timeout))
-			return -ETIMEDOUT;
 	}
 
 	return 0;
-- 
Alexandre Belloni, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help