[ARM] 5154/1: PalmTX PCMCIA
Marek VaĊĦut [Mon, 7 Jul 2008 16:28:59 +0000 (17:28 +0100)]
This patch adds PCMCIA support for PalmTX handheld computer.
There is one chip hard-soldered to slot0, another slot is
not in use and not accessible.

Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>

arch/arm/mach-pxa/palmtx.c
drivers/pcmcia/Kconfig
drivers/pcmcia/Makefile
drivers/pcmcia/pxa2xx_palmtx.c [new file with mode: 0644]

index ae89732..0ca2f17 100644 (file)
@@ -69,6 +69,18 @@ static unsigned long palmtx_pin_config[] __initdata = {
 
        /* USB */
        GPIO13_GPIO,
+
+       /* PCMCIA */
+       GPIO48_nPOE,
+       GPIO49_nPWE,
+       GPIO50_nPIOR,
+       GPIO51_nPIOW,
+       GPIO85_nPCE_1,
+       GPIO54_nPCE_2,
+       GPIO79_PSKTSEL,
+       GPIO55_nPREG,
+       GPIO56_nPWAIT,
+       GPIO57_nIOIS16,
 };
 
 /******************************************************************************
index 1b0eb5a..86dd324 100644 (file)
@@ -219,7 +219,8 @@ config PCMCIA_SA1111
 config PCMCIA_PXA2XX
        tristate "PXA2xx support"
        depends on ARM && ARCH_PXA && PCMCIA
-       depends on ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL || MACH_ARMCORE
+       depends on (ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL \
+                   || MACH_ARMCORE || ARCH_PXA_PALM)
        help
          Say Y here to include support for the PXA2xx PCMCIA controller
 
index 6f6478b..8e6dd22 100644 (file)
@@ -71,4 +71,5 @@ pxa2xx_cs-$(CONFIG_ARCH_LUBBOCK)              += pxa2xx_lubbock.o sa1111_generic.o
 pxa2xx_cs-$(CONFIG_MACH_MAINSTONE)             += pxa2xx_mainstone.o
 pxa2xx_cs-$(CONFIG_PXA_SHARPSL)                        += pxa2xx_sharpsl.o
 pxa2xx_cs-$(CONFIG_MACH_ARMCORE)               += pxa2xx_cm_x270.o
+pxa2xx_cs-$(CONFIG_MACH_PALMTX)                += pxa2xx_palmtx.o
 
diff --git a/drivers/pcmcia/pxa2xx_palmtx.c b/drivers/pcmcia/pxa2xx_palmtx.c
new file mode 100644 (file)
index 0000000..4abde19
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * linux/drivers/pcmcia/pxa2xx_palmtx.c
+ *
+ * Driver for Palm T|X PCMCIA
+ *
+ * Copyright (C) 2007-2008 Marek Vasut <marek.vasut@gmail.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/platform_device.h>
+
+#include <asm/mach-types.h>
+
+#include <asm/arch/gpio.h>
+#include <asm/arch/palmtx.h>
+
+#include "soc_common.h"
+
+static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
+{
+       skt->irq = IRQ_GPIO(GPIO_NR_PALMTX_PCMCIA_READY);
+       return 0;
+}
+
+static void palmtx_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
+{
+}
+
+static void palmtx_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
+                                       struct pcmcia_state *state)
+{
+       state->detect = 1; /* always inserted */
+       state->ready  = !!gpio_get_value(GPIO_NR_PALMTX_PCMCIA_READY);
+       state->bvd1   = 1;
+       state->bvd2   = 1;
+       state->wrprot = 0;
+       state->vs_3v  = 1;
+       state->vs_Xv  = 0;
+}
+
+static int
+palmtx_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
+                               const socket_state_t *state)
+{
+       gpio_set_value(GPIO_NR_PALMTX_PCMCIA_POWER1, 1);
+       gpio_set_value(GPIO_NR_PALMTX_PCMCIA_POWER2, 1);
+       gpio_set_value(GPIO_NR_PALMTX_PCMCIA_RESET,
+                       !!(state->flags & SS_RESET));
+
+       return 0;
+}
+
+static void palmtx_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
+{
+}
+
+static void palmtx_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
+{
+}
+
+static struct pcmcia_low_level palmtx_pcmcia_ops = {
+       .owner                  = THIS_MODULE,
+
+       .first                  = 0,
+       .nr                     = 1,
+
+       .hw_init                = palmtx_pcmcia_hw_init,
+       .hw_shutdown            = palmtx_pcmcia_hw_shutdown,
+
+       .socket_state           = palmtx_pcmcia_socket_state,
+       .configure_socket       = palmtx_pcmcia_configure_socket,
+
+       .socket_init            = palmtx_pcmcia_socket_init,
+       .socket_suspend         = palmtx_pcmcia_socket_suspend,
+};
+
+static struct platform_device *palmtx_pcmcia_device;
+
+static int __init palmtx_pcmcia_init(void)
+{
+       int ret;
+
+       if (!machine_is_palmtx())
+               return -ENODEV;
+
+       palmtx_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1);
+       if (!palmtx_pcmcia_device)
+               return -ENOMEM;
+
+       ret = platform_device_add_data(palmtx_pcmcia_device, &palmtx_pcmcia_ops,
+                                       sizeof(palmtx_pcmcia_ops));
+
+       if (!ret)
+               ret = platform_device_add(palmtx_pcmcia_device);
+
+       if (ret)
+               platform_device_put(palmtx_pcmcia_device);
+
+       return ret;
+}
+
+static void __exit palmtx_pcmcia_exit(void)
+{
+       platform_device_unregister(palmtx_pcmcia_device);
+}
+
+fs_initcall(palmtx_pcmcia_init);
+module_exit(palmtx_pcmcia_exit);
+
+MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>");
+MODULE_DESCRIPTION("PCMCIA support for Palm T|X");
+MODULE_ALIAS("platform:pxa2xx-pcmcia");
+MODULE_LICENSE("GPL");