From 716ca530e1c4515d8683c9d5be3d56b301758b66 Mon Sep 17 00:00:00 2001 From: James <> Date: Wed, 4 Nov 2015 11:49:21 +0000 Subject: trunk-47381 --- .../patches-3.10/005-verdex_pcmcia_support.patch | 209 +++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 target/linux/pxa/patches-3.10/005-verdex_pcmcia_support.patch (limited to 'target/linux/pxa/patches-3.10/005-verdex_pcmcia_support.patch') 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 0000000..d79dd4f --- /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 +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 +--- + 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 ++ * ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++ ++#include ++ ++#include ++#include ++ ++#include ++ ++#include ++#include ++#include ++#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"); -- cgit v1.2.3