diff options
author | Hauke Mehrtens <hauke@hauke-m.de> | 2014-07-18 20:45:49 +0000 |
---|---|---|
committer | Hauke Mehrtens <hauke@hauke-m.de> | 2014-07-18 20:45:49 +0000 |
commit | 6f6b8feae6d38ecf958095f909d78ca3863f34e6 (patch) | |
tree | b012a1289ac6e30534bd1443b8984dea0a823896 /target/linux/pxa/patches-3.10 | |
parent | 5a331a91aab9fe37b4f1947d70abb8d5877ea1df (diff) | |
download | upstream-6f6b8feae6d38ecf958095f909d78ca3863f34e6.tar.gz upstream-6f6b8feae6d38ecf958095f909d78ca3863f34e6.tar.bz2 upstream-6f6b8feae6d38ecf958095f909d78ca3863f34e6.zip |
pxa: add support for kernel 3.10
This is compile tested only, please run test and report back.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
SVN-Revision: 41737
Diffstat (limited to 'target/linux/pxa/patches-3.10')
6 files changed, 1489 insertions, 0 deletions
diff --git a/target/linux/pxa/patches-3.10/001-gumstix_verdex_pro_arch_support.patch b/target/linux/pxa/patches-3.10/001-gumstix_verdex_pro_arch_support.patch new file mode 100644 index 0000000000..531d60d89b --- /dev/null +++ b/target/linux/pxa/patches-3.10/001-gumstix_verdex_pro_arch_support.patch @@ -0,0 +1,882 @@ +From 4f4bb58cba3a6c44e9f9f113609287d9d50be9c4 Mon Sep 17 00:00:00 2001 +From: Joseph Kortje <jpktech@rogers.com> +Date: Wed, 28 Oct 2009 21:11:28 -0400 +Subject: [PATCH] [ARM] Gumstix Verdex Pro arch support + +add an option for Verdex Pro when ARCH_GUMSTIX is selected, and +factor earlier Gumstix support into a seperate option + +Signed-off-by: Bobby Powers <bobbypowers@gmail.com> +--- + arch/arm/mach-pxa/Kconfig | 29 +- + arch/arm/mach-pxa/Makefile | 3 +- + arch/arm/mach-pxa/gumstix-verdex.c | 749 +++++++++++++++++++++++++++ + arch/arm/mach-pxa/include/mach/mfp-pxa27x.h | 1 + + 4 files changed, 772 insertions(+), 10 deletions(-) + create mode 100644 arch/arm/mach-pxa/gumstix-verdex.c + +--- a/arch/arm/mach-pxa/Kconfig ++++ b/arch/arm/mach-pxa/Kconfig +@@ -129,23 +129,34 @@ config MACH_CAPC7117 + select PXA3xx + + config ARCH_GUMSTIX +- bool "Gumstix XScale 255 boards" +- select PXA25x ++ bool "Gumstix boards" + help +- Say Y here if you intend to run this kernel on +- Basix, Connex, ws-200ax, ws-400ax systems ++ Say Y here if you intend to run this kernel on a ++ gumstix computer. + +-choice +- prompt "Gumstix Carrier/Expansion Board" + depends on ARCH_GUMSTIX + +-config GUMSTIX_AM200EPD ++config MACH_GUMSTIX_F ++ bool "Gumstix Basix/Connex ..." ++ depends on ARCH_GUMSTIX ++ select PXA25x ++ ++ choice ++ prompt "Gumstix Carrier/Expansion Board" ++ depends on MACH_GUMSTIX_F ++ ++ config GUMSTIX_AM200EPD + bool "Enable AM200EPD board support" + +-config GUMSTIX_AM300EPD ++ config GUMSTIX_AM300EPD + bool "Enable AM300EPD board support" + +-endchoice ++ endchoice ++ ++config MACH_GUMSTIX_VERDEX ++ bool "Gumstix VERDEX ..." ++ depends on ARCH_GUMSTIX ++ select PXA27x + + config MACH_INTELMOTE2 + bool "Intel Mote 2 Platform" +--- a/arch/arm/mach-pxa/Makefile ++++ b/arch/arm/mach-pxa/Makefile +@@ -45,7 +45,8 @@ endif + obj-$(CONFIG_MACH_EM_X270) += em-x270.o + obj-$(CONFIG_MACH_CM_X300) += cm-x300.o + obj-$(CONFIG_MACH_CAPC7117) += capc7117.o mxm8x10.o +-obj-$(CONFIG_ARCH_GUMSTIX) += gumstix.o ++obj-$(CONFIG_MACH_GUMSTIX_F) += gumstix.o ++obj-$(CONFIG_MACH_GUMSTIX_VERDEX) += gumstix-verdex.o + obj-$(CONFIG_GUMSTIX_AM200EPD) += am200epd.o + obj-$(CONFIG_GUMSTIX_AM300EPD) += am300epd.o + obj-$(CONFIG_MACH_INTELMOTE2) += stargate2.o +--- /dev/null ++++ b/arch/arm/mach-pxa/gumstix-verdex.c +@@ -0,0 +1,794 @@ ++/* ++ * linux/arch/arm/mach-pxa/gumstix-verdex.c ++ * ++ * Support for the Gumstix verdex motherboard. ++ * ++ * Original Author: Craig Hughes ++ * Created: Feb 14, 2008 ++ * Copyright: Craig Hughes ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * Implemented based on lubbock.c by Nicolas Pitre and code from Craig ++ * Hughes ++ */ ++ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/init.h> ++#include <linux/platform_device.h> ++#include <linux/interrupt.h> ++#include <linux/mtd/mtd.h> ++#include <linux/mtd/partitions.h> ++#include <linux/i2c/tsc2007.h> ++#include <linux/i2c/pxa-i2c.h> ++#include <linux/gpio.h> ++#include <linux/gpio-pxa.h> ++ ++#include <asm/setup.h> ++#include <asm/memory.h> ++#include <asm/mach-types.h> ++#include <asm/irq.h> ++#include <asm/sizes.h> ++#include <asm/io.h> ++ ++#include <asm/mach/arch.h> ++#include <asm/mach/map.h> ++#include <asm/mach/irq.h> ++#include <asm/mach/flash.h> ++ ++#include <linux/platform_data/mmc-pxamci.h> ++#include <mach/udc.h> ++#include <linux/platform_data/video-pxafb.h> ++#include <linux/platform_data/usb-ohci-pxa27x.h> ++#include <mach/pxa27x.h> ++#include <mach/pxa27x-udc.h> ++#include <mach/gpio.h> ++ ++#include <mach/gumstix.h> ++ ++#include "generic.h" ++ ++#include <linux/delay.h> ++ ++static struct resource flash_resource = { ++ .start = 0x00000000, ++ .end = SZ_64M - 1, ++ .flags = IORESOURCE_MEM, ++}; ++ ++static struct mtd_partition gumstix_partitions[] = { ++ { ++ .name = "u-boot", ++ .size = 0x00040000, ++ .offset = 0, ++ .mask_flags = MTD_WRITEABLE /* force read-only */ ++ } , { ++ .name = "rootfs", ++ .size = 0x01ec0000, ++ .offset = 0x00040000 ++ } , { ++ .name = "kernel", ++ .size = 0x00100000, ++ .offset = 0x01f00000 ++ } ++}; ++ ++static struct flash_platform_data gumstix_flash_data = { ++ .map_name = "cfi_probe", ++ .parts = gumstix_partitions, ++ .nr_parts = ARRAY_SIZE(gumstix_partitions), ++ .width = 2, ++}; ++ ++static struct platform_device gumstix_flash_device = { ++ .name = "pxa2xx-flash", ++ .id = 0, ++ .dev = { ++ .platform_data = &gumstix_flash_data, ++ }, ++ .resource = &flash_resource, ++ .num_resources = 1, ++}; ++ ++#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) \ ++ || defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE) ++ ++#include <linux/smsc911x.h> ++ ++static struct resource verdex_smsc911x_resources[] = { ++ [0] = { ++ .name = "smsc911x-memory", ++ .start = PXA_CS1_PHYS, ++ .end = PXA_CS1_PHYS + 0x000fffff, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = PXA_GPIO_TO_IRQ(GPIO_GUMSTIX_ETH0), ++ .end = PXA_GPIO_TO_IRQ(GPIO_GUMSTIX_ETH0), ++ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE, ++ }, ++}; ++ ++static struct smsc911x_platform_config verdex_smsc911x_config = { ++ .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, ++ .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, ++ .flags = SMSC911X_USE_16BIT | SMSC911X_SAVE_MAC_ADDRESS, ++ .phy_interface = PHY_INTERFACE_MODE_MII, ++}; ++ ++static struct platform_device verdex_smsc911x_device = { ++ .name = "smsc911x", ++ .id = -1, ++ .num_resources = ARRAY_SIZE(verdex_smsc911x_resources), ++ .resource = verdex_smsc911x_resources, ++ .dev = { ++ .platform_data = &verdex_smsc911x_config, ++ }, ++}; ++#endif ++ ++#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) ++static void __init verdex_init_smsc911x(void) ++{ ++ ++ printk(KERN_INFO "Initializing Gumstix verdex smsc911x\n"); ++ ++ if (gpio_request(GPIO_GUMSTIX_ETH0_RST, "SMSC911x_ETH0_RST") != 0) { ++ printk(KERN_ERR "could not obtain gpio for SMSC911x_ETH0_RST\n"); ++ goto err_request_gpio_eth0_rst; ++ } ++ ++ if (gpio_request(GPIO_GUMSTIX_ETH0, "SMSC911x_ETH0_IRQ") != 0) { ++ printk(KERN_ERR "could not obtain gpio for SMSC911x_ETH0_IRQ\n"); ++ goto err_request_gpio_eth0_irq; ++ } ++ ++ if (gpio_direction_output(GPIO_GUMSTIX_ETH0_RST, 0) != 0) { ++ printk(KERN_ERR "could not set SMSC911x_ETH0_RST pin to output\n"); ++ goto err_dir; ++ } ++ ++ gpio_set_value(GPIO_GUMSTIX_ETH0_RST, 0); ++ ++ msleep(500); // Hold RESET for at least 200ms ++ ++ gpio_set_value(GPIO_GUMSTIX_ETH0_RST, 1); ++ ++ msleep(50); ++ ++ if (gpio_direction_input(GPIO_GUMSTIX_ETH0) != 0) { ++ printk(KERN_ERR "could not set SMSC911x_ETH0_IRQ pin to input\n"); ++ goto err_dir; ++ } ++ ++ gpio_export(GPIO_GUMSTIX_ETH0, 0); ++ platform_device_register(&verdex_smsc911x_device); ++ return; ++ ++err_dir: ++ gpio_free(GPIO_GUMSTIX_ETH0_RST); ++ ++err_request_gpio_eth0_irq: ++ gpio_free(GPIO_GUMSTIX_ETH0); ++ ++err_request_gpio_eth0_rst: ++ return; ++} ++ ++#else ++static void __init verdex_init_smsc911x(void) { return; } ++#endif ++ ++static unsigned long verdex_pin_config[] = { ++ /* MMC */ ++ GPIO32_MMC_CLK, ++ GPIO112_MMC_CMD, ++ GPIO92_MMC_DAT_0, ++ GPIO109_MMC_DAT_1, ++ GPIO110_MMC_DAT_2, ++ GPIO111_MMC_DAT_3, ++ ++ /* BTUART */ ++ GPIO42_BTUART_RXD, ++ GPIO43_BTUART_TXD, ++ GPIO44_BTUART_CTS, ++ GPIO45_BTUART_RTS, ++ ++ /* STUART */ ++ GPIO46_STUART_RXD, ++ GPIO47_STUART_TXD, ++ ++ /* FFUART */ ++ GPIO34_FFUART_RXD, ++ GPIO39_FFUART_TXD, ++ ++ /* SSP 2 */ ++ GPIO19_SSP2_SCLK, ++ GPIO14_SSP2_SFRM, ++ GPIO13_SSP2_TXD, ++ GPIO11_SSP2_RXD, ++ ++ /* SDRAM and local bus */ ++ GPIO49_nPWE, ++ GPIO15_nCS_1, ++ ++ /* I2C */ ++ GPIO117_I2C_SCL, ++ GPIO118_I2C_SDA, ++ ++ /* PWM 0 */ ++ GPIO16_PWM0_OUT, ++ ++ /* BRIGHTNESS */ ++ GPIO17_PWM1_OUT, ++ ++ /* LCD */ ++ GPIO58_LCD_LDD_0, ++ GPIO59_LCD_LDD_1, ++ GPIO60_LCD_LDD_2, ++ GPIO61_LCD_LDD_3, ++ GPIO62_LCD_LDD_4, ++ GPIO63_LCD_LDD_5, ++ GPIO64_LCD_LDD_6, ++ GPIO65_LCD_LDD_7, ++ GPIO66_LCD_LDD_8, ++ GPIO67_LCD_LDD_9, ++ GPIO68_LCD_LDD_10, ++ GPIO69_LCD_LDD_11, ++ GPIO70_LCD_LDD_12, ++ GPIO71_LCD_LDD_13, ++ GPIO72_LCD_LDD_14, ++ GPIO73_LCD_LDD_15, ++ GPIO74_LCD_FCLK, ++ GPIO75_LCD_LCLK, ++ GPIO76_LCD_PCLK, ++#ifdef CONFIG_FB_PXA_SHARP_LQ043_PSP ++ /* DISP must be always high while screen is on */ ++ /* Done below in verdex_init */ ++#else ++ GPIO77_LCD_BIAS, ++#endif ++}; ++ ++#if defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE) ++ ++static unsigned long gpio_ntschg_0[] = { ++ GPIO104_GPIO, // pxa_gpio_mode(GPIO_GUMSTIX_nCD_0_MD); ++}; ++ ++static unsigned long gpio_ntschg_1[] = { ++ GPIO18_GPIO, // pxa_gpio_mode(GPIO_GUMSTIX_nSTSCHG_1_MD); ++ GPIO36_GPIO, // pxa_gpio_mode(GPIO_GUMSTIX_nCD_1_MD); ++ GPIO27_GPIO, // pxa_gpio_mode(GPIO_GUMSTIX_PRDY_nBSY_1_MD); ++}; ++ ++static unsigned long gpio_prdy_nbsy_old[] = { ++ GPIO111_GPIO, // pxa_gpio_mode(GPIO_GUMSTIX_nSTSCHG_0_MD); ++ GPIO109_GPIO, // pxa_gpio_mode(GPIO_GUMSTIX_PRDY_nBSY_0_OLD_MD); ++}; ++ ++static unsigned long gpio_prdy_nbsy[] = { ++ GPIO96_GPIO, // pxa_gpio_mode(GPIO_GUMSTIX_PRDY_nBSY_0_MD); ++}; ++ ++static unsigned long gpio_nhw_init[] = { ++ GPIO48_nPOE, // pxa_gpio_mode(GPIO_GUMSTIX_nPOE_MD); ++ GPIO102_nPCE_1, // pxa_gpio_mode(GPIO_GUMSTIX_nPCE_1_MD); ++ GPIO105_nPCE_2, // pxa_gpio_mode(GPIO_GUMSTIX_nPCE_2_MD); ++ GPIO104_GPIO, // pxa_gpio_mode(GPIO_GUMSTIX_nCD_0_MD); ++ ++ GPIO49_nPWE, // pxa_gpio_mode(GPIO_GUMSTIX_nPWE_MD); ++ GPIO50_nPIOR, // pxa_gpio_mode(GPIO_GUMSTIX_nPIOR_MD); ++ GPIO51_nPIOW, // pxa_gpio_mode(GPIO_GUMSTIX_nPIOW_MD); ++ GPIO79_PSKTSEL, // pxa_gpio_mode(GPIO_GUMSTIX_pSKTSEL_MD); ++ GPIO55_nPREG, // pxa_gpio_mode(GPIO_GUMSTIX_nPREG_MD); ++ GPIO56_nPWAIT, // pxa_gpio_mode(GPIO_GUMSTIX_nPWAIT_MD); ++ GPIO57_nIOIS16, // pxa_gpio_mode(GPIO_GUMSTIX_nIOIS16_MD); ++}; ++ ++static int net_cf_vx_mode = 0; ++static int pcmcia_cf_nr = 2; ++ ++inline void __init gumstix_pcmcia_cpld_clk(void) ++{ ++ gpio_set_value(GPIO_GUMSTIX_nPOE, 0); ++ gpio_set_value(GPIO_GUMSTIX_nPOE, 1); ++} ++ ++inline unsigned char __init gumstix_pcmcia_cpld_read_bits(int bits) ++{ ++ unsigned char result = 0; ++ unsigned int shift = 0; ++ while(bits--) ++ { ++ result |= !!(gpio_get_value(GPIO_GUMSTIX_nCD_0) & GPIO_bit(GPIO_GUMSTIX_nCD_0)) << shift; ++ shift ++; ++ gumstix_pcmcia_cpld_clk(); ++ } ++ printk("CPLD responded with: %02x\n",result); ++ return result; ++} ++ ++/* We use the CPLD on the CF-CF card to read a value from a shift register. If we can read that ++ * magic sequence, then we have 2 CF cards; otherwise we assume just one ++ * The CPLD will send the value of the shift register on GPIO11 (the CD line for slot 0) ++ * when RESET is held in reset. We use GPIO48 (nPOE) as a clock signal, ++ * GPIO52/53 (card enable for both cards) to control read/write to the shift register ++ */ ++static void __init gumstix_count_cards(void) ++{ ++ if ((gpio_request(GPIO_GUMSTIX_nPOE, "GPIO_GUMSTIX_nPOE") == 0) && ++ (gpio_direction_output(GPIO_GUMSTIX_nPOE, 1) == 0)) ++ gpio_export(GPIO_GUMSTIX_nPOE, 0); ++ else ++ printk(KERN_ERR "could not obtain gpio for GPIO_GUMSTIX_nPOE\n"); ++ ++ if ((gpio_request(GPIO_GUMSTIX_nPCE_1, "GPIO_GUMSTIX_nPCE_1") == 0) && ++ (gpio_direction_output(GPIO_GUMSTIX_nPCE_1, 1) == 0)) ++ gpio_export(GPIO_GUMSTIX_nPCE_1, 0); ++ else ++ printk(KERN_ERR "could not obtain gpio for GPIO_GUMSTIX_nPCE_1\n"); ++ ++ if ((gpio_request(GPIO_GUMSTIX_nPCE_2, "GPIO_GUMSTIX_nPCE_2") == 0) && ++ (gpio_direction_output(GPIO_GUMSTIX_nPCE_2, 1) == 0)) ++ gpio_export(GPIO_GUMSTIX_nPCE_2, 0); ++ else ++ printk(KERN_ERR "could not obtain gpio for GPIO_GUMSTIX_nPCE_2\n"); ++ ++ if ((gpio_request(GPIO_GUMSTIX_nCD_0, "GPIO_GUMSTIX_nCD_0") == 0) && ++ (gpio_direction_input(GPIO_GUMSTIX_nCD_0) == 0)) ++ gpio_export(GPIO_GUMSTIX_nCD_0, 0); ++ else ++ printk(KERN_ERR "could not obtain gpio for GPIO_GUMSTIX_nCD_0\n"); ++ ++ if (net_cf_vx_mode) { ++ if ((gpio_request(GPIO_GUMSTIX_CF_OLD_RESET, "GPIO_GUMSTIX_CF_OLD_RESET") == 0) && ++ (gpio_direction_output(GPIO_GUMSTIX_CF_OLD_RESET, 1) == 0)) { ++ gpio_export(GPIO_GUMSTIX_CF_OLD_RESET, 0); ++ } else { ++ printk(KERN_ERR "could not obtain gpio for GPIO_GUMSTIX_CF_OLD_RESET\n"); ++ } ++ } else { ++ if ((gpio_request(GPIO_GUMSTIX_CF_RESET, "GPIO_GUMSTIX_CF_RESET") == 0) && ++ (gpio_direction_output(GPIO_GUMSTIX_CF_RESET, 1) == 0)) { ++ gpio_export(GPIO_GUMSTIX_CF_RESET, 0); ++ } else { ++ printk(KERN_ERR "could not obtain gpio for GPIO_GUMSTIX_CF_RESET\n"); ++ } ++ } ++ ++ // Setup the shift register ++ gpio_set_value(GPIO_GUMSTIX_nPCE_1, 1); ++ gpio_set_value(GPIO_GUMSTIX_nPCE_2, 0); ++ ++ // Tick the clock to program the shift register ++ gumstix_pcmcia_cpld_clk(); ++ ++ // Now set shift register into read mode ++ gpio_set_value(GPIO_GUMSTIX_nPCE_1, 0); ++ gpio_set_value(GPIO_GUMSTIX_nPCE_2, 1); ++ ++ // We can read the bits now -- 0xC2 means "Dual compact flash" ++ if(gumstix_pcmcia_cpld_read_bits(8) != 0xC2) ++ { ++ // We do not have 2 CF slots ++ pcmcia_cf_nr = 1; ++ } ++ ++ udelay(50); ++ ++ if (net_cf_vx_mode) { ++ gpio_set_value(GPIO_GUMSTIX_CF_OLD_RESET, 0); ++ gpio_free(GPIO_GUMSTIX_CF_OLD_RESET); ++ } else { ++ gpio_set_value(GPIO_GUMSTIX_CF_RESET, 0); ++ gpio_free(GPIO_GUMSTIX_CF_RESET); ++ } ++ ++ printk(KERN_INFO "found %d CF slots\n", pcmcia_cf_nr); ++ ++ gpio_free(GPIO_GUMSTIX_nPCE_2); ++ gpio_free(GPIO_GUMSTIX_nPCE_1); ++ gpio_free(GPIO_GUMSTIX_nPOE); ++ return; ++} ++ ++#define SMC_IO_EXTENT 16 ++#define BANK_SELECT 14 ++ ++static void __init verdex_pcmcia_pin_config(void) ++{ ++ struct resource *res; ++ void *network_controller_memory; ++ struct platform_device *pdev = &verdex_smsc911x_device; ++ ++ printk(KERN_INFO "Initializing Gumstix verdex pcmcia\n"); ++ ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (res == NULL) { ++ printk(KERN_ERR "no memory resource defined\n"); ++ goto err_done; ++ } ++ ++ res = request_mem_region(res->start, SMC_IO_EXTENT, "smc91x probe"); ++ if (res == NULL) { ++ printk(KERN_ERR "failed to request memory resource\n"); ++ goto err_done; ++ } ++ ++ // We check for the possibility of SMSC91c111 (reg base offset 0x300 from CS1 base) ++ network_controller_memory = ioremap(res->start + 0x300, SMC_IO_EXTENT); ++ if (network_controller_memory == NULL) { ++ printk(KERN_ERR "failed to ioremap() registers\n"); ++ goto err_free_mem; ++ } ++ ++ // Look for the special 91c111 value in the bank select register ++ if((0xff00 & readw(network_controller_memory+BANK_SELECT)) == 0x3300) { ++ printk(KERN_INFO "Detected netCF-vx board: pcmcia using older GPIO configuration\n"); ++ net_cf_vx_mode = 1; ++ } else { ++ printk(KERN_INFO "Not netCF-vx board: pcmcia using newer GPIO configuration\n"); ++ net_cf_vx_mode = 0; ++ } ++ ++ iounmap(network_controller_memory); ++err_free_mem: ++ release_mem_region(res->start, SMC_IO_EXTENT); ++err_done: ++ ++ gumstix_count_cards(); // this can update pcmcia_cf_nr ++ ++ // If pcmcia_cf_nr is 1 then we do not have 2 CF slots ++ // Note: logic sequence was altered from previous kernel revs ++ // so that this works as intended now. ++ if (pcmcia_cf_nr != 0) ++ { ++ pxa2xx_mfp_config(ARRAY_AND_SIZE(gpio_ntschg_0)); ++ ++ if(net_cf_vx_mode) ++ pxa2xx_mfp_config(gpio_prdy_nbsy_old, 1); ++ else ++ pxa2xx_mfp_config(gpio_prdy_nbsy, 1); ++ ++ } else { ++ // Note: this reconfigures pin GPIO18 to be GPIO-IN so make ++ // sure that this only gets done for the old dual slot board ++ // since that pin is an active AF1 out-mode signal (RDY) on ++ // newer boards and changing the pin mode on the newer boards ++ // would result in memory corruption for the NIC (and hang during ++ // PHY test). ++ pxa2xx_mfp_config(ARRAY_AND_SIZE(gpio_ntschg_1)); ++ } ++ ++ pxa2xx_mfp_config(ARRAY_AND_SIZE(gpio_nhw_init)); ++ return; ++} ++ ++int __init gumstix_get_cf_cards(void) ++{ ++ return pcmcia_cf_nr; ++} ++EXPORT_SYMBOL(gumstix_get_cf_cards); ++ ++#ifdef CONFIG_MACH_GUMSTIX_VERDEX ++int __init gumstix_check_if_netCF_vx(void) ++{ ++ return net_cf_vx_mode; ++} ++EXPORT_SYMBOL(gumstix_check_if_netCF_vx); ++#endif ++ ++#endif ++ ++#if defined(CONFIG_FB_PXA_SHARP_LQ043_PSP) || defined(CONFIG_FB_PXA_SAMSUNG_LTE430WQ_F0C) ++static void gumstix_lcd_backlight(int on_or_off) ++{ ++ int err; ++ err = gpio_request(17, "LCD BACKLIGHT"); ++ if (err) { ++ //pr_warning("Gumstix Verdex: Failed to request LCD Backlight gpio\n"); ++ return; ++ } ++ ++ if(on_or_off) { ++ gpio_direction_input(17); ++ } else { ++ gpio_set_value(17, 0); ++ gpio_direction_output(17, 0); ++ gpio_set_value(17, 0); ++ } ++ ++ return; ++} ++#endif ++ ++#ifdef CONFIG_FB_PXA_ALPS_CDOLLAR ++static struct pxafb_mode_info gumstix_fb_mode = { ++ .pixclock = 300000, ++ .xres = 240, ++ .yres = 320, ++ .bpp = 16, ++ .hsync_len = 2, ++ .left_margin = 1, ++ .right_margin = 1, ++ .vsync_len = 3, ++ .upper_margin = 0, ++ .lower_margin = 0, ++ .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, ++}; ++ ++static struct pxafb_mach_info gumstix_fb_info = { ++ .modes = &gumstix_fb_mode, ++ .num_modes = 1, ++ .lccr0 = LCCR0_Pas | LCCR0_Sngl | LCCR0_Color, ++ .lccr3 = LCCR3_PixFlEdg, ++}; ++#elif defined(CONFIG_FB_PXA_SHARP_LQ043_PSP) ++static struct pxafb_mode_info gumstix_fb_mode = { ++ .pixclock = 110000, ++ .xres = 480, ++ .yres = 272, ++ .bpp = 16, ++ .hsync_len = 41, ++ .left_margin = 2, ++ .right_margin = 2, ++ .vsync_len = 10, ++ .upper_margin = 2, ++ .lower_margin = 2, ++ .sync = 0, // Hsync and Vsync both active low ++}; ++ ++static struct pxafb_mach_info gumstix_fb_info = { ++ .modes = &gumstix_fb_mode, ++ .num_modes = 1, ++ .lccr0 = LCCR0_Act | LCCR0_Sngl | LCCR0_Color, ++ .lccr3 = LCCR3_OutEnH | LCCR3_PixFlEdg | (0 << 30), ++ .pxafb_backlight_power = &gumstix_lcd_backlight, ++}; ++#elif defined(CONFIG_FB_PXA_SAMSUNG_LTE430WQ_F0C) ++static struct pxafb_mode_info gumstix_fb_mode = { ++ .pixclock = 108696, // 9.2MHz typical DOTCLK from datasheet ++ .xres = 480, ++ .hsync_len = 41, // HLW from datasheet: 41 typ ++ .left_margin = 4, // HBP - HLW from datasheet: 45 - 41 = 4 ++ .right_margin = 8, // HFP from datasheet: 8 typ ++ .yres = 272, ++ .vsync_len = 10, // VLW from datasheet: 10 typ ++ .upper_margin = 2, // VBP - VLW from datasheet: 12 - 10 = 2 ++ .lower_margin = 4, // VFP from datasheet: 4 typ ++ .bpp = 16, ++ .sync = 0, // Hsync and Vsync both active low ++}; ++ ++static struct pxafb_mach_info gumstix_fb_info = { ++ .modes = &gumstix_fb_mode, ++ .num_modes = 1, ++ .lccr0 = LCCR0_Act | LCCR0_Sngl | LCCR0_Color, ++ .lccr3 = LCCR3_OutEnH | LCCR3_PixFlEdg | (0 << 30), ++ .pxafb_backlight_power = &gumstix_lcd_backlight, ++}; ++#endif ++ ++static struct platform_device verdex_audio_device = { ++ .name = "pxa2xx-ac97", ++ .id = -1, ++}; ++ ++static struct platform_device *devices[] __initdata = { ++ &gumstix_flash_device, ++ &verdex_audio_device, ++}; ++ ++/* PXA27x OHCI controller setup */ ++#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) ++static int ohci_verdex_init(struct device *dev) ++{ ++ // Turn on port 2 in host mode ++ UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE; ++ ++ /* See drivers/usb/host/ohci-pxa27x.c for further details but ++ ENABLE_PORT_ALL flag is equivalent to using this old sequence: ++ UHCHR = (UHCHR) & ++ ~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSEP3 | UHCHR_SSE); ++ */ ++ return 0; ++} ++ ++static struct pxaohci_platform_data verdex_ohci_platform_data = { ++ .port_mode = PMM_PERPORT_MODE, ++ .flags = ENABLE_PORT_ALL, ++ .init = ohci_verdex_init, ++}; ++ ++static void __init verdex_ohci_init(void) ++{ ++ pxa_set_ohci_info(&verdex_ohci_platform_data); ++} ++#else ++static void __init verdex_ohci_init(void) { ++ printk(KERN_INFO "Gumstix verdex host usb ohci is disabled\n"); ++} ++#endif ++ ++ ++#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE) ++static struct pxamci_platform_data verdex_mci_platform_data; ++ ++static int verdex_mci_init(struct device *dev, irq_handler_t detect_int, ++ void *data) ++{ ++ /* GPIO setup for MMC on the 120-pin connector is done in verdex_init. ++ * There is no card detect on a uSD connector so no interrupt to ++ * register. There is no WP detect GPIO line either. ++ */ ++ ++ return 0; ++} ++ ++static struct pxamci_platform_data verdex_mci_platform_data = { ++ .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, ++ .init = verdex_mci_init, ++ .gpio_card_detect = -1, ++ .gpio_card_ro = -1, ++ .gpio_power = -1, ++}; ++ ++static void __init verdex_mmc_init(void) ++{ ++ pxa_set_mci_info(&verdex_mci_platform_data); ++} ++#else ++static void __init verdex_mmc_init(void) ++{ ++ printk(KERN_INFO "Gumstix verdex mmc disabled\n"); ++} ++#endif ++ ++#if defined(CONFIG_USB_GADGET_PXA2XX) || defined(CONFIG_USB_GADGET_PXA2XX_MODULE) ++static struct pxa2xx_udc_mach_info verdex_udc_info __initdata = { ++ .gpio_vbus = GPIO35, ++ .gpio_pullup = GPIO41, ++}; ++ ++static void __init verdex_udc_init(void) ++{ ++ pxa_set_udc_info(&verdex_udc_info); ++} ++#else ++static void __init verdex_udc_init(void) ++{ ++ printk(KERN_INFO "Gumstix verdex udc is disabled\n"); ++} ++#endif ++ ++#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) ++ ++#if defined(CONFIG_TOUCHSCREEN_TSC2003) || defined(CONFIG_TOUCHSCREEN_TSC2003_MODULE) ++ ++#define VERDEX_GPIO_PENDOWN 16 ++ ++static int tsc2003_init_platform_hw(void) ++{ ++ return 0; ++} ++ ++static void tsc2003_exit_platform_hw(void) ++{ ++ return; ++} ++ ++static void tsc2003_clear_penirq(void) ++{ ++ return; ++} ++ ++static int tsc2003_get_pendown_state(void) ++{ ++ return !gpio_get_value(VERDEX_GPIO_PENDOWN); ++} ++ ++static struct tsc2007_platform_data tsc2003_config = { ++ .model = 2003, ++ .x_plate_ohms = 100, ++ .get_pendown_state = tsc2003_get_pendown_state, ++ .clear_penirq = tsc2003_clear_penirq, ++ .init_platform_hw = tsc2003_init_platform_hw, ++ .exit_platform_hw = tsc2003_exit_platform_hw, ++}; ++#endif ++ ++static struct i2c_board_info __initdata verdex_i2c_board_info[] = { ++#if defined(CONFIG_RTC_DRV_DS1307) || defined(CONFIG_RTC_DRV_DS1307_MODULE) ++ { ++ I2C_BOARD_INFO("rtc-ds1307", 0x68), ++ }, ++#endif ++#if defined(CONFIG_TOUCHSCREEN_TSC2003) || defined(CONFIG_TOUCHSCREEN_TSC2003_MODULE) ++ { ++ I2C_BOARD_INFO("tsc2003", 0x48), ++ .platform_data = &tsc2003_config, ++ .irq = IRQ_GPIO(VERDEX_GPIO_PENDOWN), ++ }, ++#endif ++}; ++ ++static struct i2c_pxa_platform_data verdex_i2c_pwr_info = { ++ .fast_mode = 1, ++}; ++ ++static struct i2c_pxa_platform_data verdex_i2c_info = { ++ .fast_mode = 1, ++}; ++ ++static void __init verdex_i2c_init(void) ++{ ++ printk(KERN_INFO "Initializing Gumstix verdex i2c\n"); ++ ++#if defined(CONFIG_TOUCHSCREEN_TSC2003) || defined(CONFIG_TOUCHSCREEN_TSC2003_MODULE) ++ if ((gpio_request(VERDEX_GPIO_PENDOWN, "TSC2003_PENDOWN") == 0) && ++ (gpio_direction_input(VERDEX_GPIO_PENDOWN) == 0)) { ++ gpio_export(VERDEX_GPIO_PENDOWN, 0); ++ } else { ++ printk(KERN_ERR "could not obtain gpio for TSC2003_PENDOWN\n"); ++ return; ++ } ++#endif ++ ++ i2c_register_board_info(0, verdex_i2c_board_info, ++ ARRAY_SIZE(verdex_i2c_board_info)); ++ pxa_set_i2c_info(&verdex_i2c_info); ++ pxa27x_set_i2c_power_info(&verdex_i2c_pwr_info); ++} ++#else ++static inline void verdex_i2c_init(void) {} ++#endif ++ ++#if defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE) ++static void __init verdex_pcmcia_init(void) ++{ ++ verdex_pcmcia_pin_config(); ++} ++#else ++static void __init verdex_pcmcia_init(void) { ++ printk(KERN_INFO "Gumstix verdex pcmcia is disabled\n"); ++} ++#endif ++ ++ ++static void __init verdex_init(void) ++{ ++ pxa2xx_mfp_config(ARRAY_AND_SIZE(verdex_pin_config)); ++ ++#ifdef CONFIG_FB_PXA_SHARP_LQ043_PSP ++ /* DISP must be always high while screen is on */ ++ gpio_direction_output(GPIO77, 0); ++ gpio_set_value(GPIO77, 1); ++#endif ++ verdex_udc_init(); ++ verdex_mmc_init(); ++ verdex_ohci_init(); ++ verdex_i2c_init(); ++ verdex_init_smsc911x(); ++ verdex_pcmcia_init(); ++ ++#if defined(CONFIG_FB_PXA_ALPS_CDOLLAR) || defined(CONFIG_FB_PXA_SHARP_LQ043_PSP) || defined(CONFIG_FB_PXA_SAMSUNG_LTE430WQ_F0C) ++ printk(KERN_INFO "Initializing Gumstix verdex FB info\n"); ++ set_pxa_fb_info(&gumstix_fb_info); ++#endif ++ printk(KERN_INFO "Initializing Gumstix platform_add_devices\n"); ++ (void) platform_add_devices(devices, ARRAY_SIZE(devices)); ++} ++ ++MACHINE_START(GUMSTIX, "Gumstix verdex") ++ .atag_offset = 0x100, /* match u-boot bi_boot_params */ ++ .map_io = pxa27x_map_io, ++ .init_irq = pxa27x_init_irq, ++ .handle_irq = pxa27x_handle_irq, ++ .init_time = pxa_timer_init, ++ .init_machine = verdex_init, ++ .restart = pxa_restart, ++MACHINE_END +--- a/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h ++++ b/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h +@@ -109,6 +109,7 @@ + #define GPIO54_nPCE_2 MFP_CFG_OUT(GPIO54, AF2, DRIVE_HIGH) + #define GPIO78_nPCE_2 MFP_CFG_OUT(GPIO78, AF1, DRIVE_HIGH) + #define GPIO87_nPCE_2 MFP_CFG_IN(GPIO87, AF1) ++#define GPIO105_nPCE_2 MFP_CFG_OUT(GPIO105, AF1, DRIVE_HIGH) + #define GPIO55_nPREG MFP_CFG_OUT(GPIO55, AF2, DRIVE_HIGH) + #define GPIO50_nPIOR MFP_CFG_OUT(GPIO50, AF2, DRIVE_HIGH) + #define GPIO51_nPIOW MFP_CFG_OUT(GPIO51, AF2, DRIVE_HIGH) diff --git a/target/linux/pxa/patches-3.10/002-verdex_lcd_support.patch b/target/linux/pxa/patches-3.10/002-verdex_lcd_support.patch new file mode 100644 index 0000000000..bfba17e0cb --- /dev/null +++ b/target/linux/pxa/patches-3.10/002-verdex_lcd_support.patch @@ -0,0 +1,52 @@ +From eb92a178eceae4e5d18bbb442b8e44cb88457d60 Mon Sep 17 00:00:00 2001 +From: Joseph Kortje <jpktech@rogers.com> +Date: Wed, 28 Oct 2009 21:25:57 -0400 +Subject: [PATCH] [ARM] Gumstix Verdex LCD config options + +add options to Kconfig for Verdex LCD support + +Signed-off-by: Bobby Powers <bobbypowers@gmail.com> +--- + drivers/video/Kconfig | 31 +++++++++++++++++++++++++++++++ + 1 files changed, 31 insertions(+), 0 deletions(-) + +--- a/drivers/video/Kconfig ++++ b/drivers/video/Kconfig +@@ -1905,6 +1905,37 @@ config FB_PXA + say M here and read <file:Documentation/kbuild/modules.txt>. + + If unsure, say N. ++choice ++ depends on FB_PXA ++ prompt "LCD Panel" ++ default FB_PXA_SAMSUNG_LTE430WQ_F0C ++ ++config FB_PXA_ALPS_CDOLLAR ++ boolean "Chris Dollar's ALPS screen" ++ ---help--- ++ Enable definitions (over-ridable on the kernel command line if ++ "PXA LCD command line parameters" is also selected) for an ALPS ++ screen which Chris Dollar uses ++ ++config FB_PXA_SHARP_LQ043_PSP ++ boolean "SHARP LQ043... series" ++ ---help--- ++ Enable definitions (over-ridable on the kernel command line if ++ "PXA LCD command line parameters" is also selected) for a SHARP ++ LQ043... screen, such as the one used by the PSP. These screens are ++ the ones normally sold by gumstix with its boards. ++ ++config FB_PXA_SAMSUNG_LTE430WQ_F0C ++ boolean "Samsung LTE430WQ-F0C (standard gumstix LCD)" ++ ---help--- ++ Enable definitions for a Samsung LTE430WQ-F0C LCD panel, such as the ones resold ++ by gumstix for use with their "LCD-Ready" boards. ++ ++config FB_PXA_NONEOFTHEABOVE ++ boolean "None of the above" ++ ++endchoice ++ + + config FB_PXA_OVERLAY + bool "Support PXA27x/PXA3xx Overlay(s) as framebuffer" diff --git a/target/linux/pxa/patches-3.10/003-gumstix_h_verdex_pro_support.patch b/target/linux/pxa/patches-3.10/003-gumstix_h_verdex_pro_support.patch new file mode 100644 index 0000000000..6dd291d483 --- /dev/null +++ b/target/linux/pxa/patches-3.10/003-gumstix_h_verdex_pro_support.patch @@ -0,0 +1,214 @@ +From adb6abbe4e3bc17c20cdc70e4a4357f1633d4970 Mon Sep 17 00:00:00 2001 +From: Joseph Kortje <jpktech@rogers.com> +Date: Wed, 28 Oct 2009 21:49:11 -0400 +Subject: [PATCH] [ARM] gumstix.h: Verdex Pro support + +Added a bunch of ifdefs to support both original gumstix boards +as well as the Verdex Pro in gumstix.h + +Signed-off-by: Bobby Powers <bobbypowers@gmail.com> +--- + arch/arm/mach-pxa/include/mach/gumstix.h | 160 ++++++++++++++++++++++++------ + 1 files changed, 130 insertions(+), 30 deletions(-) + +--- a/arch/arm/mach-pxa/include/mach/gumstix.h ++++ b/arch/arm/mach-pxa/include/mach/gumstix.h +@@ -6,6 +6,9 @@ + * published by the Free Software Foundation. + */ + ++#if !defined(__ASM_ARCH_MFP_PXA27X_H) && !defined(__ASM_ARCH_MFP_PXA25X_H) ++ #error You need to include either mfp-pxa27x.h or mfp-pxa25x.h ++#endif + + /* BTRESET - Reset line to Bluetooth module, active low signal. */ + #define GPIO_GUMSTIX_BTRESET 7 +@@ -20,9 +23,18 @@ this moves to GPIO17 and GPIO37. */ + /* GPIOx - Connects to USB D+ and used as a pull-up after GPIOn + has detected a cable insertion; driven low otherwise. */ + ++#ifndef CONFIG_MACH_GUMSTIX_VERDEX ++ + #define GPIO_GUMSTIX_USB_GPIOn 35 + #define GPIO_GUMSTIX_USB_GPIOx 41 + ++#else ++ ++#define GPIO_GUMSTIX_USB_GPIOn 100 ++#define GPIO_GUMSTIX_USB_GPIOx 27 ++ ++#endif ++ + /* usb state change */ + #define GUMSTIX_USB_INTR_IRQ PXA_GPIO_TO_IRQ(GPIO_GUMSTIX_USB_GPIOn) + +@@ -42,48 +54,136 @@ has detected a cable insertion; driven l + * ETH_RST provides a hardware reset line to the ethernet chip + * ETH is the IRQ line in from the ethernet chip to the PXA + */ ++#ifndef CONFIG_MACH_GUMSTIX_VERDEX + #define GPIO_GUMSTIX_ETH0_RST 80 +-#define GPIO_GUMSTIX_ETH0_RST_MD (GPIO_GUMSTIX_ETH0_RST | GPIO_OUT) ++#define GPIO_GUMSTIX_ETH0 36 ++#else ++#define GPIO_GUMSTIX_ETH0_RST 107 ++#define GPIO_GUMSTIX_ETH0 99 ++#endif + #define GPIO_GUMSTIX_ETH1_RST 52 +-#define GPIO_GUMSTIX_ETH1_RST_MD (GPIO_GUMSTIX_ETH1_RST | GPIO_OUT) ++#define GPIO_GUMSTIX_ETH1 27 + +-#define GPIO_GUMSTIX_ETH0 36 ++#define GPIO_GUMSTIX_ETH0_RST_MD (GPIO_GUMSTIX_ETH0_RST | GPIO_OUT) ++#define GPIO_GUMSTIX_ETH1_RST_MD (GPIO_GUMSTIX_ETH1_RST | GPIO_OUT) + #define GPIO_GUMSTIX_ETH0_MD (GPIO_GUMSTIX_ETH0 | GPIO_IN) +-#define GUMSTIX_ETH0_IRQ PXA_GPIO_TO_IRQ(GPIO_GUMSTIX_ETH0) +-#define GPIO_GUMSTIX_ETH1 27 + #define GPIO_GUMSTIX_ETH1_MD (GPIO_GUMSTIX_ETH1 | GPIO_IN) +-#define GUMSTIX_ETH1_IRQ PXA_GPIO_TO_IRQ(GPIO_GUMSTIX_ETH1) +- + +-/* CF reset line */ +-#define GPIO8_RESET 8 ++#define GUMSTIX_ETH0_IRQ PXA_GPIO_TO_IRQ(GPIO_GUMSTIX_ETH0) ++#define GUMSTIX_ETH1_IRQ PXA_GPIO_TO_IRQ(GPIO_GUMSTIX_ETH1) + +-/* CF slot 0 */ +-#define GPIO4_nBVD1 4 +-#define GPIO4_nSTSCHG GPIO4_nBVD1 +-#define GPIO11_nCD 11 +-#define GPIO26_PRDY_nBSY 26 +-#define GUMSTIX_S0_nSTSCHG_IRQ PXA_GPIO_TO_IRQ(GPIO4_nSTSCHG) +-#define GUMSTIX_S0_nCD_IRQ PXA_GPIO_TO_IRQ(GPIO11_nCD) +-#define GUMSTIX_S0_PRDY_nBSY_IRQ PXA_GPIO_TO_IRQ(GPIO26_PRDY_nBSY) ++ /* CF reset line */ ++#define GPIO8_CF_RESET 8 ++#define GPIO97_CF_RESET 97 ++#define GPIO110_CF_RESET 110 ++ ++#ifndef CONFIG_MACH_GUMSTIX_VERDEX ++#define GPIO_GUMSTIX_CF_RESET GPIO8_CF_RESET ++#else ++#define GPIO_GUMSTIX_CF_RESET GPIO97_CF_RESET ++#endif ++ ++#define GPIO_GUMSTIX_CF_OLD_RESET GPIO110_CF_RESET ++ ++/* CF signals shared by both sockets */ ++#define GPIO_GUMSTIX_nPOE 48 ++#define GPIO_GUMSTIX_nPWE 49 ++#define GPIO_GUMSTIX_nPIOR 50 ++#define GPIO_GUMSTIX_nPIOW 51 ++ ++#ifndef CONFIG_MACH_GUMSTIX_VERDEX ++#define GPIO_GUMSTIX_nPCE_1 52 ++#define GPIO_GUMSTIX_nPCE_2 53 ++#define GPIO_GUMSTIX_pSKTSEL 54 ++#else ++#define GPIO_GUMSTIX_nPCE_1 102 ++#define GPIO_GUMSTIX_nPCE_2 105 ++#define GPIO_GUMSTIX_pSKTSEL 79 ++#endif ++ ++#define GPIO_GUMSTIX_nPREG 55 ++#define GPIO_GUMSTIX_nPWAIT 56 ++#define GPIO_GUMSTIX_nIOIS16 57 ++ ++/* Pin mode definitions correspond to mfp-pxa2[57]x.h */ ++#define GPIO_GUMSTIX_nPOE_MD GPIO48_nPOE ++#define GPIO_GUMSTIX_nPWE_MD GPIO49_nPWE ++#define GPIO_GUMSTIX_nPIOR_MD GPIO50_nPIOR ++#define GPIO_GUMSTIX_nPIOW_MD GPIO51_nPIOW ++ ++#ifndef CONFIG_MACH_GUMSTIX_VERDEX ++#define GPIO_GUMSTIX_nPCE_1_MD GPIO52_nPCE_1 ++#define GPIO_GUMSTIX_nPCE_2_MD GPIO53_nPCE_2 ++#define GPIO_GUMSTIX_pSKTSEL_MD GPIO54_pSKTSEL ++#else ++#define GPIO_GUMSTIX_nPCE_1_MD GPIO102_nPCE_1 ++#define GPIO_GUMSTIX_nPCE_2_MD GPIO105_nPCE_2 ++#define GPIO_GUMSTIX_pSKTSEL_MD GPIO79_pSKTSEL ++#endif ++ ++#define GPIO_GUMSTIX_nPREG_MD GPIO55_nPREG ++#define GPIO_GUMSTIX_nPWAIT_MD GPIO56_nPWAIT ++#define GPIO_GUMSTIX_nIOIS16_MD GPIO57_nIOIS16 ++ ++ /* CF slot 0 */ ++#define GPIO4_nBVD1_0 4 ++#define GPIO4_nSTSCHG_0 GPIO4_nBVD1_0 ++#define GPIO11_nCD_0 11 ++#define GPIO26_PRDY_nBSY_0 26 ++ ++#define GPIO111_nBVD1_0 111 ++#define GPIO111_nSTSCHG_0 GPIO111_nBVD1_0 ++#define GPIO104_nCD_0 104 ++#define GPIO96_PRDY_nBSY_0 96 ++#define GPIO109_PRDY_nBSY_0 109 ++ ++#ifndef CONFIG_MACH_GUMSTIX_VERDEX ++#define GPIO_GUMSTIX_nBVD1_0 GPIO4_nBVD1_0 ++#define GPIO_GUMSTIX_nSTSCHG_0 GPIO4_nSTSCHG_0 ++#define GPIO_GUMSTIX_nCD_0 GPIO11_nCD_0 ++#define GPIO_GUMSTIX_PRDY_nBSY_0 GPIO26_PRDY_nBSY_0 ++#else ++#define GPIO_GUMSTIX_nBVD1_0 GPIO111_nBVD1_0 ++#define GPIO_GUMSTIX_nSTSCHG_0 GPIO111_nSTSCHG_0 ++#define GPIO_GUMSTIX_nCD_0 GPIO104_nCD_0 ++#define GPIO_GUMSTIX_PRDY_nBSY_0 GPIO96_PRDY_nBSY_0 ++#endif ++ ++#define GPIO_GUMSTIX_PRDY_nBSY_0_OLD GPIO109_PRDY_nBSY_0 ++#define GUMSTIX_S0_PRDY_nBSY_OLD_IRQ PXA_GPIO_TO_IRQ(GPIO109_PRDY_nBSY_0) ++ ++#define GUMSTIX_S0_nSTSCHG_IRQ PXA_GPIO_TO_IRQ(GPIO_GUMSTIX_nSTSCHG_0) ++#define GUMSTIX_S0_nCD_IRQ PXA_GPIO_TO_IRQ(GPIO_GUMSTIX_nCD_0) ++#define GUMSTIX_S0_PRDY_nBSY_IRQ PXA_GPIO_TO_IRQ(GPIO_GUMSTIX_PRDY_nBSY_0) + + /* CF slot 1 */ +-#define GPIO18_nBVD1 18 +-#define GPIO18_nSTSCHG GPIO18_nBVD1 +-#define GPIO36_nCD 36 +-#define GPIO27_PRDY_nBSY 27 +-#define GUMSTIX_S1_nSTSCHG_IRQ PXA_GPIO_TO_IRQ(GPIO18_nSTSCHG) +-#define GUMSTIX_S1_nCD_IRQ PXA_GPIO_TO_IRQ(GPIO36_nCD) +-#define GUMSTIX_S1_PRDY_nBSY_IRQ PXA_GPIO_TO_IRQ(GPIO27_PRDY_nBSY) +- +-/* CF GPIO line modes */ +-#define GPIO4_nSTSCHG_MD (GPIO4_nSTSCHG | GPIO_IN) +-#define GPIO8_RESET_MD (GPIO8_RESET | GPIO_OUT) +-#define GPIO11_nCD_MD (GPIO11_nCD | GPIO_IN) +-#define GPIO18_nSTSCHG_MD (GPIO18_nSTSCHG | GPIO_IN) +-#define GPIO26_PRDY_nBSY_MD (GPIO26_PRDY_nBSY | GPIO_IN) +-#define GPIO27_PRDY_nBSY_MD (GPIO27_PRDY_nBSY | GPIO_IN) +-#define GPIO36_nCD_MD (GPIO36_nCD | GPIO_IN) ++#define GPIO18_nBVD1_1 18 ++#define GPIO18_nSTSCHG_1 GPIO18_nBVD1_1 ++#define GPIO36_nCD_1 36 ++#define GPIO27_PRDY_nBSY_1 27 ++ ++#define GPIO_GUMSTIX_nBVD1_1 GPIO18_nBVD1_1 ++#define GPIO_GUMSTIX_nSTSCHG_1 GPIO18_nSTSCHG_1 ++#define GPIO_GUMSTIX_nCD_1 GPIO36_nCD_1 ++#define GPIO_GUMSTIX_PRDY_nBSY_1 GPIO27_PRDY_nBSY_1 ++ ++#define GUMSTIX_S1_nSTSCHG_IRQ PXA_GPIO_TO_IRQ(GPIO18_nSTSCHG_1) ++#define GUMSTIX_S1_nCD_IRQ PXA_GPIO_TO_IRQ(GPIO36_nCD_1) ++#define GUMSTIX_S1_PRDY_nBSY_IRQ PXA_GPIO_TO_IRQ(GPIO27_PRDY_nBSY_1) ++ ++/* CF GPIO line modes - correspond to mfp-pxa2[57]x.h */ ++#define GPIO_GUMSTIX_CF_RESET_MD (GPIO_GUMSTIX_CF_RESET | GPIO_OUT) ++#define GPIO_GUMSTIX_CF_OLD_RESET_MD (GPIO_GUMSTIX_CF_OLD_RESET | GPIO_OUT) ++ ++#define GPIO_GUMSTIX_nSTSCHG_0_MD GPIO111_GPIO ++#define GPIO_GUMSTIX_nCD_0_MD GPIO104_GPIO ++ ++#define GPIO_GUMSTIX_PRDY_nBSY_0_MD GPIO96_GPIO ++#define GPIO_GUMSTIX_PRDY_nBSY_0_OLD_MD GPIO109_GPIO ++ ++#define GPIO_GUMSTIX_nSTSCHG_1_MD GPIO18_GPIO ++#define GPIO_GUMSTIX_nCD_1_MD GPIO36_GPIO ++#define GPIO_GUMSTIX_PRDY_nBSY_1_MD GPIO27_GPIO + + /* for expansion boards that can't be programatically detected */ + extern int am200_init(void); diff --git a/target/linux/pxa/patches-3.10/004-smsc911x_verdex_pro_support.patch b/target/linux/pxa/patches-3.10/004-smsc911x_verdex_pro_support.patch new file mode 100644 index 0000000000..ace44df15f --- /dev/null +++ b/target/linux/pxa/patches-3.10/004-smsc911x_verdex_pro_support.patch @@ -0,0 +1,108 @@ +From 7645a459feb02f7aae4c3a5724b7800495d1b659 Mon Sep 17 00:00:00 2001 +From: Bobby Powers <bobbypowers@gmail.com> +Date: Wed, 28 Oct 2009 22:41:31 -0400 +Subject: [PATCH] [ARM] smsc911x: Verdex Pro support + +Basically Joseph Kortje's patch, cleaned up to apply to Linus's +tree. Some of the smsc911x.c had been applied already + +Signed-off-by: Bobby Powers <bobbypowers@gmail.com> +--- + drivers/net/smsc911x.c | 50 +++++++++++++++++++++++++++++++++++++-------- + drivers/net/smsc911x.h | 2 +- + include/linux/smsc911x.h | 11 ++++++++++ + 3 files changed, 53 insertions(+), 10 deletions(-) + +--- a/drivers/net/ethernet/smsc/smsc911x.c ++++ b/drivers/net/ethernet/smsc/smsc911x.c +@@ -60,6 +60,7 @@ + #include <linux/of_device.h> + #include <linux/of_gpio.h> + #include <linux/of_net.h> ++#include <asm/system_info.h> + #include "smsc911x.h" + + #define SMSC_CHIPNAME "smsc911x" +@@ -1514,7 +1515,7 @@ static int smsc911x_open(struct net_devi + SMSC_WARN(pdata, ifup, + "Timed out waiting for EEPROM busy bit to clear"); + +- smsc911x_reg_write(pdata, GPIO_CFG, 0x70070000); ++ smsc911x_reg_write(pdata, GPIO_CFG, GPIO_CFG_LED1_EN_ | GPIO_CFG_LED2_EN_ | (1 << 20)); + + /* The soft reset above cleared the device's MAC address, + * restore it from local copy (set in probe) */ +@@ -1525,8 +1526,8 @@ static int smsc911x_open(struct net_devi + /* Initialise irqs, but leave all sources disabled */ + smsc911x_disable_irq_chip(dev); + +- /* Set interrupt deassertion to 100uS */ +- intcfg = ((10 << 24) | INT_CFG_IRQ_EN_); ++ /* Set interrupt deassertion to 22*10uS */ ++ intcfg = ((22 << 24) | INT_CFG_IRQ_EN_); + + if (pdata->config.irq_polarity) { + SMSC_TRACE(pdata, ifup, "irq polarity: active high"); +@@ -1552,7 +1553,7 @@ static int smsc911x_open(struct net_devi + temp |= INT_EN_SW_INT_EN_; + smsc911x_reg_write(pdata, INT_EN, temp); + +- timeout = 1000; ++ timeout = 2000; + while (timeout--) { + if (pdata->software_irq_signal) + break; +@@ -2370,6 +2371,38 @@ static inline int smsc911x_probe_config_ + } + #endif /* CONFIG_OF */ + ++static inline unsigned int is_gumstix_oui(u8 *addr) ++{ ++ return (addr[0] == 0x00 && addr[1] == 0x15 && addr[2] == 0xC9); ++} ++ ++/** ++ * gen_serial_ether_addr - Generate software assigned Ethernet address ++ * based on the system_serial number ++ * @addr: Pointer to a six-byte array containing the Ethernet address ++ * ++ * Generate an Ethernet address (MAC) that is not multicast ++ * and has the local assigned bit set, keyed on the system_serial ++ */ ++static inline void gen_serial_ether_addr(u8 *addr) ++{ ++ static u8 ether_serial_digit = 0; ++ addr [0] = system_serial_high >> 8; ++ addr [1] = system_serial_high; ++ addr [2] = system_serial_low >> 24; ++ addr [3] = system_serial_low >> 16; ++ addr [4] = system_serial_low >> 8; ++ addr [5] = (system_serial_low & 0xc0) | /* top bits are from system serial */ ++ (1 << 4) | /* 2 bits identify interface type 1=ether, 2=usb, 3&4 undef */ ++ ((ether_serial_digit++) & 0x0f); /* 15 possible interfaces of each type */ ++ ++ if(!is_gumstix_oui(addr)) ++ { ++ addr [0] &= 0xfe; /* clear multicast bit */ ++ addr [0] |= 0x02; /* set local assignment bit (IEEE802) */ ++ } ++} ++ + static int smsc911x_drv_probe(struct platform_device *pdev) + { + struct device_node *np = pdev->dev.of_node; +@@ -2516,11 +2549,11 @@ static int smsc911x_drv_probe(struct pla + SMSC_TRACE(pdata, probe, + "Mac Address is read from LAN911x EEPROM"); + } else { +- /* eeprom values are invalid, generate random MAC */ +- eth_hw_addr_random(dev); ++ /* eeprom values are invalid, generate MAC from serial number */ ++ gen_serial_ether_addr(dev->dev_addr); + smsc911x_set_hw_mac_address(pdata, dev->dev_addr); + SMSC_TRACE(pdata, probe, +- "MAC Address is set to eth_random_addr"); ++ "MAC Address is derived from system serial number"); + } + } + diff --git a/target/linux/pxa/patches-3.10/005-verdex_pcmcia_support.patch b/target/linux/pxa/patches-3.10/005-verdex_pcmcia_support.patch new file mode 100644 index 0000000000..d79dd4f46b --- /dev/null +++ b/target/linux/pxa/patches-3.10/005-verdex_pcmcia_support.patch @@ -0,0 +1,209 @@ +From 76a102bd5c9d792db19c6c72eafdecea0311a0c9 Mon Sep 17 00:00:00 2001 +From: Craig Hughes <craig@gumstix.com> +Date: Fri, 30 Oct 2009 14:16:27 -0400 +Subject: [PATCH] [ARM] pxa: Gumstix Verdex PCMCIA support + +Needed for the Libertas CS wireless device. + +Signed-off-by: Bobby Powers <bobbypowers@gmail.com> +--- + drivers/pcmcia/Kconfig | 3 +- + drivers/pcmcia/Makefile | 3 + + drivers/pcmcia/pxa2xx_gumstix.c | 194 +++++++++++++++++++++++++++++++++++++++ + 3 files changed, 199 insertions(+), 1 deletions(-) + create mode 100644 drivers/pcmcia/pxa2xx_gumstix.c + +--- a/drivers/pcmcia/Kconfig ++++ b/drivers/pcmcia/Kconfig +@@ -217,7 +217,7 @@ config PCMCIA_PXA2XX + || MACH_ARMCORE || ARCH_PXA_PALM || TRIZEPS_PCMCIA \ + || ARCOM_PCMCIA || ARCH_PXA_ESERIES || MACH_STARGATE2 \ + || MACH_VPAC270 || MACH_BALLOON3 || MACH_COLIBRI \ +- || MACH_COLIBRI320 || MACH_H4700) ++ || MACH_COLIBRI320 || MACH_H4700 || ARCH_GUMSTIX) + select PCMCIA_SA1111 if ARCH_LUBBOCK && SA1111 + select PCMCIA_SOC_COMMON + help +--- a/drivers/pcmcia/Makefile ++++ b/drivers/pcmcia/Makefile +@@ -71,6 +71,9 @@ pxa2xx-obj-$(CONFIG_MACH_COLIBRI) += px + pxa2xx-obj-$(CONFIG_MACH_COLIBRI320) += pxa2xx_colibri.o + pxa2xx-obj-$(CONFIG_MACH_H4700) += pxa2xx_hx4700.o + ++pxa2xx-obj-$(CONFIG_MACH_GUMSTIX_VERDEX) += pxa2xx_cs.o ++pxa2xx_cs-objs := pxa2xx_gumstix.o ++ + obj-$(CONFIG_PCMCIA_PXA2XX) += pxa2xx_base.o $(pxa2xx-obj-y) + + obj-$(CONFIG_PCMCIA_XXS1500) += xxs1500_ss.o +--- /dev/null ++++ b/drivers/pcmcia/pxa2xx_gumstix.c +@@ -0,0 +1,168 @@ ++/* ++ * linux/drivers/pcmcia/pxa2xx_gumstix.c ++ * ++ * Gumstix PCMCIA specific routines. Based on Mainstone ++ * ++ * Copyright 2004, Craig Hughes <craig@gumstix.com> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include <linux/module.h> ++#include <linux/init.h> ++#include <linux/kernel.h> ++#include <linux/errno.h> ++#include <linux/interrupt.h> ++#include <linux/irq.h> ++#include <linux/gpio.h> ++ ++#include <linux/delay.h> ++#include <linux/platform_device.h> ++ ++#include <linux/gpio-pxa.h> ++ ++#include <pcmcia/ss.h> ++ ++#include <mach/hardware.h> ++#include <asm/mach-types.h> ++ ++#include <mach/pxa27x.h> ++ ++#include <asm/io.h> ++#include <mach/gpio.h> ++#include <mach/gumstix.h> ++#include "soc_common.h" ++ ++#define ARRAY_AND_SIZE(x) (x), ARRAY_SIZE(x) ++ ++#define BANK_OFF(n) (((n) < 3) ? (n) << 2 : 0x100 + (((n) - 3) << 2)) ++#define GPLR(x) __REG2(0x40E00000, BANK_OFF((x) >> 5)) ++ ++static int net_cf_vx_mode = 0; ++ ++static int gumstix_pcmcia_hw_init(struct soc_pcmcia_socket *skt) ++{ ++/* Note: The verdex_pcmcia_pin_config is moved to gumstix_verdex.c in order to use mfp_pxa2xx_config ++ for board-specific pin configuration instead of the old deprecated pxa_gpio_mode function. Thus, ++ only the IRQ init is still needed to be done here. */ ++ if (skt->nr == 0) { ++ skt->socket.pci_irq = (net_cf_vx_mode == 0) ? GUMSTIX_S0_PRDY_nBSY_IRQ : GUMSTIX_S0_PRDY_nBSY_OLD_IRQ; ++ skt->stat[SOC_STAT_CD].gpio = GUMSTIX_S0_nCD_IRQ; ++ skt->stat[SOC_STAT_CD].name = "CF0 nCD"; ++ skt->stat[SOC_STAT_RDY].gpio = GUMSTIX_S0_nSTSCHG_IRQ; ++ skt->stat[SOC_STAT_RDY].name = "CF0 nSTSCHG"; ++ } else { ++ skt->socket.pci_irq = GUMSTIX_S1_PRDY_nBSY_IRQ; ++ skt->stat[SOC_STAT_CD].gpio = GUMSTIX_S1_nCD_IRQ; ++ skt->stat[SOC_STAT_CD].name = "CF1 nCD"; ++ skt->stat[SOC_STAT_RDY].gpio = GUMSTIX_S1_nSTSCHG_IRQ; ++ skt->stat[SOC_STAT_RDY].name = "CF1 nSTSCHG"; ++ } ++ ++ return 0; ++} ++ ++static void gumstix_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) ++{ ++ if (net_cf_vx_mode) { ++ gpio_free(GPIO_GUMSTIX_CF_OLD_RESET); ++ } else { ++ gpio_free(GPIO_GUMSTIX_CF_RESET); ++ } ++ ++} ++ ++static void gumstix_pcmcia_socket_state(struct soc_pcmcia_socket *skt, ++ struct pcmcia_state *state) ++{ ++ unsigned int cd, prdy_nbsy, nbvd1; ++ if(skt->nr == 0) ++ { ++ cd = GPIO_GUMSTIX_nCD_0; ++ if(net_cf_vx_mode) ++ prdy_nbsy = GPIO_GUMSTIX_PRDY_nBSY_0_OLD; ++ else ++ prdy_nbsy = GPIO_GUMSTIX_PRDY_nBSY_0; ++ nbvd1 = GPIO_GUMSTIX_nBVD1_0; ++ } else { ++ cd = GPIO_GUMSTIX_nCD_1; ++ prdy_nbsy = GPIO_GUMSTIX_PRDY_nBSY_1; ++ nbvd1 = GPIO_GUMSTIX_nBVD1_1; ++ } ++ state->detect = !!gpio_get_value(cd); ++ state->ready = !!gpio_get_value(prdy_nbsy); ++ state->bvd1 = !!gpio_get_value(nbvd1); ++ state->bvd2 = 1; ++ state->vs_3v = 0; ++ state->vs_Xv = 0; ++ state->wrprot = 0; ++} ++ ++static int gumstix_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, ++ const socket_state_t *state) ++{ ++ return 0; ++} ++ ++static struct pcmcia_low_level gumstix_pcmcia_ops = { ++ .owner = THIS_MODULE, ++ .hw_init = gumstix_pcmcia_hw_init, ++ .hw_shutdown = gumstix_pcmcia_hw_shutdown, ++ .socket_state = gumstix_pcmcia_socket_state, ++ .configure_socket = gumstix_pcmcia_configure_socket, ++ .nr = 2, ++}; ++ ++static struct platform_device *gumstix_pcmcia_device; ++ ++extern int __init gumstix_get_cf_cards(void); ++ ++#ifdef CONFIG_MACH_GUMSTIX_VERDEX ++extern int __init gumstix_check_if_netCF_vx(void); ++#endif ++ ++static int __init gumstix_pcmcia_init(void) ++{ ++ int ret; ++ ++#ifdef CONFIG_MACH_GUMSTIX_VERDEX ++ net_cf_vx_mode = gumstix_check_if_netCF_vx(); ++#endif ++ ++ gumstix_pcmcia_ops.nr = gumstix_get_cf_cards(); ++ ++ gumstix_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); ++ if (!gumstix_pcmcia_device) ++ return -ENOMEM; ++ ++ ret = platform_device_add_data(gumstix_pcmcia_device, &gumstix_pcmcia_ops, ++ sizeof(gumstix_pcmcia_ops)); ++ ++ if (ret == 0) { ++ printk(KERN_INFO "Registering gumstix PCMCIA interface.\n"); ++ ret = platform_device_add(gumstix_pcmcia_device); ++ } ++ ++ if (ret) ++ platform_device_put(gumstix_pcmcia_device); ++ ++ return ret; ++} ++ ++static void __exit gumstix_pcmcia_exit(void) ++{ ++ /* ++ * This call is supposed to free our gumstix_pcmcia_device. ++ * Unfortunately platform_device don't have a free method, and ++ * we can't assume it's free of any reference at this point so we ++ * can't free it either. ++ */ ++ platform_device_unregister(gumstix_pcmcia_device); ++} ++ ++fs_initcall(gumstix_pcmcia_init); ++module_exit(gumstix_pcmcia_exit); ++ ++MODULE_LICENSE("GPL"); diff --git a/target/linux/pxa/patches-3.10/a01-arm-debugll-printk.patch b/target/linux/pxa/patches-3.10/a01-arm-debugll-printk.patch new file mode 100644 index 0000000000..874e5d302b --- /dev/null +++ b/target/linux/pxa/patches-3.10/a01-arm-debugll-printk.patch @@ -0,0 +1,24 @@ +--- a/kernel/printk.c ++++ b/kernel/printk.c +@@ -48,6 +48,10 @@ + + #include <asm/uaccess.h> + ++#ifdef CONFIG_DEBUG_LL ++extern void printascii(char *); ++#endif /* CONFIG_DEBUG_LL */ ++ + #define CREATE_TRACE_POINTS + #include <trace/events/printk.h> + +@@ -1578,6 +1582,10 @@ asmlinkage int vprintk_emit(int facility + } + } + ++#ifdef CONFIG_DEBUG_LL ++ printascii(printk_buf); ++#endif ++ + if (level == -1) + level = default_message_loglevel; + |