From 558f760ff06c499b4525dcb4ba731f585256dacb Mon Sep 17 00:00:00 2001
From: Øyvind Harboe <oyvind.harboe@zylin.com>
Date: Thu, 3 Mar 2011 11:00:14 +0100
Subject: zy1000: add code to check that SRST asserts
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
---
 src/jtag/zy1000/zy1000.c | 76 ++++++++++++++++++++++++++----------------------
 1 file changed, 42 insertions(+), 34 deletions(-)

(limited to 'src')

diff --git a/src/jtag/zy1000/zy1000.c b/src/jtag/zy1000/zy1000.c
index 71ae6f43..f2db47b3 100644
--- a/src/jtag/zy1000/zy1000.c
+++ b/src/jtag/zy1000/zy1000.c
@@ -172,6 +172,45 @@ static int zy1000_power_dropout(int *dropout)
 	return ERROR_OK;
 }
 
+/* Wait for SRST to assert or deassert */
+static void waitSRST(bool asserted)
+{
+	bool first = true;
+	long long start = 0;
+	long total = 0;
+	const char *mode = asserted ? "assert" : "deassert";
+
+	for (;;)
+	{
+		bool srstAsserted = readSRST();
+		if ( (asserted && srstAsserted) || (!asserted && !srstAsserted) )
+		{
+			if (total > 1)
+			{
+				LOG_USER("SRST took %dms to %s", (int)total, mode);
+			}
+			break;
+		}
+
+		if (first)
+		{
+			first = false;
+			start = timeval_ms();
+		}
+
+		total = timeval_ms() - start;
+
+		keep_alive();
+
+		if (total > 5000)
+		{
+			LOG_ERROR("SRST took too long to %s: %dms", mode, (int)total);
+			break;
+		}
+	}
+}
+
+
 void zy1000_reset(int trst, int srst)
 {
 	LOG_DEBUG("zy1000 trst=%d, srst=%d", trst, srst);
@@ -192,6 +231,8 @@ void zy1000_reset(int trst, int srst)
 		 * idle in TAP_IDLE, reset halt on str912 will fail.
 		 */
 		ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x00000001);
+
+		waitSRST(true);
 	}
 
 	if (!trst)
@@ -218,40 +259,7 @@ void zy1000_reset(int trst, int srst)
 	if ((!srst && ((jtag_get_reset_config() & RESET_TRST_PULLS_SRST) == 0))||
 		(!srst && !trst && (jtag_get_reset_config() & RESET_TRST_PULLS_SRST)))
 	{
-		bool first = true;
-		long long start = 0;
-		long total = 0;
-		for (;;)
-		{	
-			// We don't want to sense our own reset, so we clear here.
-			// There is of course a timing hole where we could loose
-			// a "real" reset.
-			if (!readSRST())
-			{
-				if (total > 1)
-				{
-				  LOG_USER("SRST took %dms to deassert", (int)total);
-				}
-				break;
-			}
-
-			if (first)
-			{
-			    first = false;
-			    start = timeval_ms();
-			}
-
-			total = timeval_ms() - start;
-
-			keep_alive();
-
-			if (total > 5000)
-			{
-				LOG_ERROR("SRST took too long to deassert: %dms", (int)total);
-			    break;
-			}
-		}
-
+		waitSRST(false);
 	}
 }
 
-- 
cgit v1.2.3