From 02edb9eda7b8010adaaf0f6b910a1b008c870ba6 Mon Sep 17 00:00:00 2001 From: hcg Date: Thu, 13 Mar 2008 16:00:39 +0000 Subject: [PATCH] at91: added new sim enable code as well as detection code to differentiate between v1.0 and v1.5 hardware revisions git-svn-id: svn://svn.openwrt.org/openwrt/trunk@10600 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../at91/patches-2.6.21/015-simenable.patch | 58 +++++ .../patches-2.6.21/016-v1-15-detect.patch | 204 ++++++++++++++++++ 2 files changed, 262 insertions(+) create mode 100644 target/linux/at91/patches-2.6.21/015-simenable.patch create mode 100644 target/linux/at91/patches-2.6.21/016-v1-15-detect.patch diff --git a/target/linux/at91/patches-2.6.21/015-simenable.patch b/target/linux/at91/patches-2.6.21/015-simenable.patch new file mode 100644 index 000000000..64ee4663f --- /dev/null +++ b/target/linux/at91/patches-2.6.21/015-simenable.patch @@ -0,0 +1,58 @@ +diff -urN linux-2.6.21.5.old/arch/arm/mach-at91/board-vlink.c linux-2.6.21.5/arch/arm/mach-at91/board-vlink.c +--- linux-2.6.21.5.old/arch/arm/mach-at91/board-vlink.c 2007-07-26 12:43:11.000000000 +0200 ++++ linux-2.6.21.5/arch/arm/mach-at91/board-vlink.c 2007-08-20 16:56:56.000000000 +0200 +@@ -151,31 +151,37 @@ + // at91_gpio_leds(vlink_leds, ARRAY_SIZE(vlink_leds)); + + /* Other LED's */ +- at91_set_gpio_output(AT91_PIN_PC7, 1); // LED FRONT AP1 +- at91_set_gpio_output(AT91_PIN_PC8, 1); // LED FRONT BP1 +- at91_set_gpio_output(AT91_PIN_PB14, 1); // LED BACK AP1 +- at91_set_gpio_output(AT91_PIN_PB15, 1); // LED BACK BP1 +- at91_set_gpio_output(AT91_PIN_PB16, 1); // LED BACK AP2 +- at91_set_gpio_output(AT91_PIN_PB17, 1); // LED BACK BP2 ++ at91_set_gpio_output(AT91_PIN_PC7, 1); // LED FRONT AP1 ++ at91_set_gpio_output(AT91_PIN_PC8, 1); // LED FRONT BP1 ++ at91_set_gpio_output(AT91_PIN_PB14, 1); // LED BACK AP1 ++ at91_set_gpio_output(AT91_PIN_PB15, 1); // LED BACK BP1 ++ at91_set_gpio_output(AT91_PIN_PB16, 1); // LED BACK AP2 ++ at91_set_gpio_output(AT91_PIN_PB17, 1); // LED BACK BP2 ++ ++/* Test jig presence detection */ ++ at91_set_gpio_input(AT91_PIN_PB8, 1); // JIGPRESENT + + /* SIM Cards */ +- at91_set_gpio_output(AT91_PIN_PB9, 1); // ENBSC3 +- at91_set_gpio_output(AT91_PIN_PB10, 1); // ENBSC2 +- at91_set_gpio_output(AT91_PIN_PB11, 1); // ENBSC1 ++ if (at91_get_gpio_value(AT91_PIN_PB8)) { ++ at91_set_gpio_output(AT91_PIN_PB11, 0); ++ at91_set_gpio_output(AT91_PIN_PB9, 1); ++ } else { ++ at91_set_gpio_output(AT91_PIN_PB11, 1); ++ at91_set_gpio_output(AT91_PIN_PB9, 0); ++ } ++ ++ at91_set_gpio_output(AT91_PIN_PB10, 1); // ENBSC2 + + /* GSM Module Control */ +- at91_set_gpio_output(AT91_PIN_PB12, 1); // GSMONOFF +- +-/* Test jig presence detection */ +- at91_set_gpio_input(AT91_PIN_PB8, 1); // JIGPRESENT ++ at91_set_gpio_output(AT91_PIN_PB12, 1); // GSMONOFF + + /* Power indicator */ +- at91_set_gpio_input(AT91_PIN_PB22, 1); // PWR_IND ++ at91_set_gpio_input(AT91_PIN_PB22, 1); // PWR_IND + + /* USB Device control */ +- 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 ++ 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 + + } + diff --git a/target/linux/at91/patches-2.6.21/016-v1-15-detect.patch b/target/linux/at91/patches-2.6.21/016-v1-15-detect.patch new file mode 100644 index 000000000..0778d6a02 --- /dev/null +++ b/target/linux/at91/patches-2.6.21/016-v1-15-detect.patch @@ -0,0 +1,204 @@ +diff -urN linux-2.6.21.5.old/arch/arm/mach-at91/at91rm9200_devices.c linux-2.6.21.5/arch/arm/mach-at91/at91rm9200_devices.c +--- linux-2.6.21.5.old/arch/arm/mach-at91/at91rm9200_devices.c 2008-03-13 16:24:18.000000000 +0100 ++++ linux-2.6.21.5/arch/arm/mach-at91/at91rm9200_devices.c 2008-03-13 16:34:43.000000000 +0100 +@@ -840,9 +840,9 @@ + 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); + } + +diff -urN linux-2.6.21.5.old/arch/arm/mach-at91/board-vlink.c linux-2.6.21.5/arch/arm/mach-at91/board-vlink.c +--- linux-2.6.21.5.old/arch/arm/mach-at91/board-vlink.c 2008-03-13 16:24:18.000000000 +0100 ++++ linux-2.6.21.5/arch/arm/mach-at91/board-vlink.c 2008-03-13 16:35:05.000000000 +0100 +@@ -126,6 +126,7 @@ + + static void __init vlink_board_init(void) + { ++ int v100; + /* Serial */ + at91_add_device_serial(); + /* Ethernet */ +@@ -147,6 +148,10 @@ + // 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 @@ + /* 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 @@ + 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") +diff -urN linux-2.6.21.5.old/drivers/char/vlink_giu.c linux-2.6.21.5/drivers/char/vlink_giu.c +--- linux-2.6.21.5.old/drivers/char/vlink_giu.c 2008-03-13 16:24:18.000000000 +0100 ++++ linux-2.6.21.5/drivers/char/vlink_giu.c 2008-03-13 16:37:06.000000000 +0100 +@@ -41,8 +41,7 @@ + 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 *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 @@ + { + int retval, i, j; + dev_t vdev = 0; ++ char devName[30]; ++ int vlinkV100; + + if (major) { + vdev = MKDEV(major, 0); +@@ -185,6 +233,7 @@ + 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 @@ + 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 @@ + 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 = { -- 2.20.1