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 = {