From de6d69cc60acae64b35f73be6753ff85545d8221 Mon Sep 17 00:00:00 2001
From: oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Date: Tue, 28 Apr 2009 07:34:43 +0000
Subject: [PATCH] Zach Welch <zw@superlucidity.net> fix gw16012 with
 --enable-parport_ppdev

git-svn-id: svn://svn.berlios.de/openocd/trunk@1553 b42882b7-edfa-0310-969c-e2dbd0fdcd60
---
 src/jtag/gw16012.c | 106 ++++++++++++++++++++++++++++-----------------
 1 file changed, 67 insertions(+), 39 deletions(-)

diff --git a/src/jtag/gw16012.c b/src/jtag/gw16012.c
index 8454c32cf..dd306f962 100644
--- a/src/jtag/gw16012.c
+++ b/src/jtag/gw16012.c
@@ -461,65 +461,83 @@ static int gw16012_get_giveio_access(void)
 }
 #endif
 
-static int gw16012_init(void)
-{
 #if PARPORT_USE_PPDEV == 1
-	char buffer[256];
-	int i = 0;
-#endif
-	u8 status_port;
-
-#if PARPORT_USE_PPDEV == 1
-	if (device_handle>0)
-	{
-		LOG_ERROR("device is already opened");
-		return ERROR_JTAG_INIT_FAILED;
-	}
 
 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
-	LOG_DEBUG("opening /dev/ppi%d...", gw16012_port);
 
-	snprintf(buffer, 256, "/dev/ppi%d", gw16012_port);
-	device_handle = open(buffer, O_WRONLY);
-#else
-	LOG_DEBUG("opening /dev/parport%d...", gw16012_port);
+#define GW16012_PPDEV_NAME	"ppi"
 
-	snprintf(buffer, 256, "/dev/parport%d", gw16012_port);
-	device_handle = open(buffer, O_WRONLY);
-#endif
-	if (device_handle<0)
+static int gw16012_init_ioctls(void)
+{
+	int temp = 0;
+	temp = ioctl(device_handle, PPCLAIM);
+	if (temp < 0)
 	{
-		LOG_ERROR("cannot open device. check it exists and that user read and write rights are set");
+		LOG_ERROR("cannot claim device");
 		return ERROR_JTAG_INIT_FAILED;
 	}
 
-	LOG_DEBUG("...open");
+	temp = PARPORT_MODE_COMPAT;
+	temp = ioctl(device_handle, PPSETMODE, &temp);
+	if (temp < 0)
+	{
+		LOG_ERROR(" cannot set compatible mode to device");
+		return ERROR_JTAG_INIT_FAILED;
+	}
 
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
-	i=ioctl(device_handle, PPCLAIM);
-	if (i<0)
+	temp = IEEE1284_MODE_COMPAT;
+	temp = ioctl(device_handle, PPNEGOT, &temp);
+	if (temp < 0)
 	{
-		LOG_ERROR("cannot claim device");
+		LOG_ERROR("cannot set compatible 1284 mode to device");
 		return ERROR_JTAG_INIT_FAILED;
 	}
+	return ERROR_OK;
+}
+#else
 
-	i = PARPORT_MODE_COMPAT;
-	i= ioctl(device_handle, PPSETMODE, & i);
-	if (i<0)
+#define GW16012_PPDEV_NAME	"parport"
+
+static int gw16012_init_ioctls(void)
+{
+	return ERROR_OK;
+}
+
+#endif // defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+
+static int gw16012_init_device(void)
+{
+	const char *device_name = GW16012_PPDEV_NAME;
+	char buffer[256];
+
+	if (device_handle > 0)
 	{
-		LOG_ERROR(" cannot set compatible mode to device");
+		LOG_ERROR("device is already opened");
 		return ERROR_JTAG_INIT_FAILED;
 	}
 
-	i = IEEE1284_MODE_COMPAT;
-	i = ioctl(device_handle, PPNEGOT, & i);
-	if (i<0)
+	snprintf(buffer, 256, "/dev/%s%d", device_name, gw16012_port);
+	LOG_DEBUG("opening %s...", buffer);
+
+	device_handle = open(buffer, O_WRONLY);
+	if (device_handle<0)
 	{
-		LOG_ERROR("cannot set compatible 1284 mode to device");
+		LOG_ERROR("cannot open device. check it exists and that user read and write rights are set");
 		return ERROR_JTAG_INIT_FAILED;
 	}
-#endif
-#else
+
+	LOG_DEBUG("...open");
+
+	if (gw16012_init_ioctls() != ERROR_OK)
+		return ERROR_JTAG_INIT_FAILED;
+
+	return ERROR_OK;
+}
+
+#else // PARPORT_USE_PPDEV
+
+static int gw16012_init_device(void)
+{
 	if (gw16012_port == 0)
 	{
 		gw16012_port = 0x378;
@@ -544,7 +562,17 @@ static int gw16012_init(void)
 #else
 	outb(0x0, gw16012_port + 2);
 #endif
-#endif /* PARPORT_USE_PPDEV */
+	return ERROR_OK;
+}
+
+#endif // PARPORT_USE_PPDEV
+
+static int gw16012_init(void)
+{
+	u8 status_port;
+
+	if (gw16012_init_device() != ERROR_OK)
+		return ERROR_JTAG_INIT_FAILED;
 
 	gw16012_input(&status_port);
 	gw16012_msb = (status_port & 0x80) ^ 0x80;
-- 
GitLab