Index: linux-2.6.21.7/arch/arm/mach-at91/at91rm9200_devices.c
===================================================================
--- linux-2.6.21.7.orig/arch/arm/mach-at91/at91rm9200_devices.c
+++ linux-2.6.21.7/arch/arm/mach-at91/at91rm9200_devices.c
@@ -840,9 +840,9 @@ static inline void configure_usart3_pins
 	at91_set_B_periph(AT91_PIN_PA6, 0);		/* RXD3 */
 	at91_set_B_periph(AT91_PIN_PB0, 0);   /* RTS3 */
 	at91_set_B_periph(AT91_PIN_PB1, 0);   /* CTS3 */
-	at91_set_gpio_output(AT91_PIN_PB29, 1); /* DTR0 */
-	at91_set_gpio_output(AT91_PIN_PB2, 1);  /* RI0 */
-	at91_set_gpio_input(AT91_PIN_PA24, 1);  /* DCD0 */
+	at91_set_gpio_output(AT91_PIN_PB29, 1); /* DTR3 */
+	at91_set_gpio_output(AT91_PIN_PB2, 1);  /* RI3 */
+	at91_set_gpio_input(AT91_PIN_PA24, 1);  /* DCD3 */
 	at91_set_deglitch(AT91_PIN_PA24, 1);
 }
 
Index: linux-2.6.21.7/arch/arm/mach-at91/board-vlink.c
===================================================================
--- linux-2.6.21.7.orig/arch/arm/mach-at91/board-vlink.c
+++ linux-2.6.21.7/arch/arm/mach-at91/board-vlink.c
@@ -126,6 +126,7 @@ static struct spi_board_info vlink_spi_d
 
 static void __init vlink_board_init(void)
 {
+	int v100;
 	/* Serial */
 	at91_add_device_serial();
 	/* Ethernet */
@@ -147,6 +148,10 @@ static void __init vlink_board_init(void
 //	at91_set_gpio_output(AT91_PIN_PB22, 1);	/* this MMC card slot can optionally use SPI signaling (CS3). */
 	at91_add_device_mmc(0, &vlink_mmc_data);
 #endif
+// Set VLink version PIN as an input with pull up (V1.5 = GND)
+	at91_set_gpio_input(AT91_PIN_PC2, 1);  
+	v100 = at91_get_gpio_value(AT91_PIN_PC2);
+
 	/* LEDs */
 //	at91_gpio_leds(vlink_leds, ARRAY_SIZE(vlink_leds));
 
@@ -164,10 +169,16 @@ static void __init vlink_board_init(void
 	/* SIM Cards */
 	if (at91_get_gpio_value(AT91_PIN_PB8)) {
 		at91_set_gpio_output(AT91_PIN_PB11, 0);
-		at91_set_gpio_output(AT91_PIN_PB9, 1);
+		if (v100)
+			at91_set_gpio_output(AT91_PIN_PB9, 1);
+		else
+			at91_set_gpio_output(AT91_PIN_PC13, 1);
 	} else {
 		at91_set_gpio_output(AT91_PIN_PB11, 1);
-		at91_set_gpio_output(AT91_PIN_PB9, 0);
+		if (v100)
+			at91_set_gpio_output(AT91_PIN_PB9, 0);
+		else
+			at91_set_gpio_output(AT91_PIN_PC13, 0);
 	}
 
 	at91_set_gpio_output(AT91_PIN_PB10, 1); // ENBSC2
@@ -182,7 +193,18 @@ static void __init vlink_board_init(void
 	at91_set_gpio_input(AT91_PIN_PB27, 1);  // UDB_CNX
 	at91_set_gpio_output(AT91_PIN_PB28, 1); // UDB_PUP
 	at91_set_multi_drive(AT91_PIN_PB28, 1); // Set to multi-drive
-
+	
+	if (v100)
+	{	// V100
+		at91_set_gpio_input (AT91_PIN_PC12, 1);   // SD Card present
+	}
+	else
+	{	// DO special things for V1.5
+		at91_set_gpio_output(AT91_PIN_PB9 , 0);   // USB suspend
+		at91_set_gpio_input (AT91_PIN_PC10, 1);   // SD Card present
+		at91_set_gpio_output(AT91_PIN_PC11, 0);   // USB Vin CTRL for modules onboard 
+		at91_set_gpio_output(AT91_PIN_PC12, 0);   // SIM control 
+	}
 }
 
 MACHINE_START(VLINK, "FDL VersaLink")
Index: linux-2.6.21.7/drivers/char/vlink_giu.c
===================================================================
--- linux-2.6.21.7.orig/drivers/char/vlink_giu.c
+++ linux-2.6.21.7/drivers/char/vlink_giu.c
@@ -41,8 +41,7 @@ static int major;	/* default is dynamic 
 module_param(major, int, 0);
 MODULE_PARM_DESC(major, "Major device number");
 
-#define VIO_NR_DEVS 96
-
+#define VIO_NR_DEVS   96
 struct vio_dev {
 	struct cdev cdev;
 };
@@ -50,6 +49,53 @@ struct vio_dev {
 struct vio_dev *vio_devices;
 static struct class *vio_class;
 
+// KWJ + AJE
+#define MAX_VIO_NAMES 24
+typedef struct
+{
+	char port;
+	char pin;
+	char name100[10];
+	char name150[10];
+} VIO_NAMES;
+
+VIO_NAMES VioName[MAX_VIO_NAMES] = {  //Port,PIN, V100     , V150
+										{'A',19,"port1DTR" ,"port1DTR"},
+										{'A',24,"port2DTR" ,"port2DTR"},
+										{'B',8, "jigOn"    ,"jigOn"} ,
+										{'B',9, "enbSC3"   ,"usbSUSPND"},
+										{'B',10,"enbSC2"   ,"enbSC2"},
+										{'B',11,"enbSC1"   ,"enbSC1"},
+										{'B',12,"gsmONOFF" ,"gsmONOFF"},
+										{'B',14,"ledBAP1"  ,"ledBAP1"},
+										{'B',15,"ledBBP1"  ,"ledBBP1"},
+										{'B',16,"ledBAP2"  ,"ledBAP2"},
+										{'B',17,"ledBBP2"  ,"ledBBP2"},
+										{'B',27,"udpCNX"   ,"udpCNX"},
+										{'B',28,"udpPUP"   ,"udpPUP"},
+										{'B',29,"port2DCD" ,"port2DCD"},
+										{'C',2, "vlVer100" ,"vlVer150"},
+										{'C',7, "ledFAP1"  ,"ledFAP1"},
+										{'C',8, "ledFBP1"  ,"ledFBP1"},
+										{'C',10,"vioC10"   ,"sdCardON"},
+										{'C',11,"vioC11"   ,"vusbCTRL"},
+										{'C',12,"sdCardON" ,"simCTRL"},
+										{'C',13,"vioC13"   ,"enbSC3"},
+										{'C',14,"ledFBP2"  ,"ledFBP2"},
+										{'C',15,"ledFAP2"  ,"ledFAP2"},
+										{0,0,"",""}
+								   };
+/*										{'B',18,"gsmRIO"  ,"gsmRIO"},
+										{'B',20,"gsmTX"   ,"gsmTX"},
+										{'B',21,"gsmRX"   ,"gsmRX"},
+										{'B',22,"gsmPIND" ,"gsmPIND"},
+										{'B',23,"gsmDCD"  ,"gsmDCD"},
+										{'B',24,"gsmCTS"  ,"gsmCTS"},
+										{'B',25,"gsmDSR"  ,"gsmDSR"},
+										{'B',26,"gsmRTS"  ,"gsmRTS"},*/
+static void lookupPINName(char version100, char *devName, char port, char pin);
+// EOF KWJ + AJE
+
 static ssize_t gpio_read(struct file *file, char __user *buf, size_t len,
                          loff_t *ppos)
 {
@@ -160,6 +206,8 @@ static int vio_probe(struct platform_dev
 {
 	int retval, i, j;
 	dev_t vdev = 0;
+	char devName[30];
+	int  vlinkV100;
 
 	if (major) {
 		vdev = MKDEV(major, 0);
@@ -185,6 +233,7 @@ static int vio_probe(struct platform_dev
 		vio_remove(dev);
 		return PTR_ERR(vio_class);
 	}
+    vlinkV100 = at91_get_gpio_value(AT91_PIN_PC2);		// Denotes V1.5 if ground
 
 	vio_devices = kmalloc(VIO_NR_DEVS * sizeof(struct vio_dev), GFP_KERNEL);
 	if (!vio_devices) {
@@ -198,8 +247,10 @@ static int vio_probe(struct platform_dev
 			int iodev = at91_is_pin_gpio(PIN_BASE + i*32 + j);
 			if (iodev) {
 				vio_setup_cdev(&vio_devices[i*32 + j], i*32 + j);
-				class_device_create(vio_class, NULL, MKDEV(major, i*32 + j), NULL,
-					"vio%c%d", i + 'A', j);
+				// Lookup name of vio to create
+				lookupPINName(vlinkV100, devName, i, j);
+				class_device_create(vio_class, NULL, MKDEV(major, i*32 + j), NULL, devName);
+//					"vio%c%d", i + 'A', j);
 			}
 		}
 
@@ -212,6 +263,29 @@ fail:
 	return retval;
 }
 
+static void lookupPINName(char version100, char *devName, char port, char pin)
+{
+	int i = -1;
+	char found = 0;
+	while (!found)
+	{
+		i++;
+		if (i >= MAX_VIO_NAMES)
+			break;
+		if (VioName[i].port == port+'A' && VioName[i].pin == pin)
+		{
+			printk(KERN_ERR "vio++: %c%d=%s\n",VioName[i].port,VioName[i].pin,VioName[i].name150);
+			if (version100)
+				strcpy(devName, VioName[i].name100);
+			else
+				strcpy(devName, VioName[i].name150);
+			found = 1;
+		}
+	}
+	if (!found)
+		sprintf(devName, "vio%c%d", port + 'A', pin);
+}
+
 static struct platform_device *vio_platform_device;
 
 static struct platform_driver vio_driver = {