[ARM] pxa: add eXeda platform support
authorMike Rapoport <mike@compulab.co.il>
Mon, 2 Feb 2009 06:57:55 +0000 (08:57 +0200)
committerEric Miao <eric.miao@marvell.com>
Mon, 2 Feb 2009 09:40:17 +0000 (17:40 +0800)
Signed-off-by: Mike Rapoport <mike@compulab.co.il>
Signed-off-by: Eric Miao <eric.miao@marvell.com>
arch/arm/mach-pxa/Kconfig
arch/arm/mach-pxa/em-x270.c

index a2ed2aa731b6dfb4731e3e1b6c5cb7cf6dae9635..ffd28e48d75f5ffbb5136730816493964974d87e 100644 (file)
@@ -254,6 +254,10 @@ config MACH_EM_X270
        bool "CompuLab EM-x270 platform"
        select PXA27x
 
+config MACH_EXEDA
+       bool "CompuLab eXeda platform"
+       select PXA27x
+
 config MACH_COLIBRI
        bool "Toradex Colibri PX27x"
        select PXA27x
index ea099183773d3d88fa2d4104313bb88e381bf30d..9f15a7c9cc5f51a4e9238597d418d1764d527454 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <linux/irq.h>
 #include <linux/platform_device.h>
+#include <linux/delay.h>
 
 #include <linux/dm9000.h>
 #include <linux/rtc-v3020.h>
 #include "generic.h"
 #include "devices.h"
 
-/* GPIO IRQ usage */
-#define GPIO41_ETHIRQ          (41)
+/* EM-X270 specific GPIOs */
 #define GPIO13_MMC_CD          (13)
-#define EM_X270_ETHIRQ         IRQ_GPIO(GPIO41_ETHIRQ)
+#define GPIO95_MMC_WP          (95)
+#define GPIO56_NAND_RB         (56)
 
-/* NAND control GPIOs */
-#define GPIO11_NAND_CS (11)
-#define GPIO56_NAND_RB (56)
+/* eXeda specific GPIOs */
+#define GPIO114_MMC_CD         (114)
+#define GPIO20_NAND_RB         (20)
+#define GPIO38_SD_PWEN         (38)
 
-/* Miscelaneous GPIOs */
+/* common  GPIOs */
+#define GPIO11_NAND_CS         (11)
 #define GPIO93_CAM_RESET       (93)
-#define GPIO95_MMC_WP          (95)
+#define GPIO41_ETHIRQ          (41)
+#define EM_X270_ETHIRQ         IRQ_GPIO(GPIO41_ETHIRQ)
 
 static int mmc_cd;
 static int nand_rb;
@@ -190,6 +194,12 @@ static unsigned long em_x270_pin_config[] = {
        GPIO95_GPIO,    /* MMC Write protect */
 };
 
+static unsigned long exeda_pin_config[] = {
+       GPIO20_GPIO,                            /* NAND Ready/Busy */
+       GPIO38_GPIO     | MFP_LPM_DRIVE_LOW,    /* SD slot power */
+       GPIO114_GPIO,                           /* MMC card detect */
+};
+
 #if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
 static struct resource em_x270_dm9000_resource[] = {
        [0] = {
@@ -500,14 +510,24 @@ static int em_x270_mci_init(struct device *dev,
                goto err_irq;
        }
 
-       err = gpio_request(GPIO95_MMC_WP, "MMC WP");
-       if (err) {
-               dev_err(dev, "can't request MMC write protect: %d\n", err);
-               goto err_gpio_wp;
+       if (machine_is_em_x270()) {
+               err = gpio_request(GPIO95_MMC_WP, "MMC WP");
+               if (err) {
+                       dev_err(dev, "can't request MMC write protect: %d\n",
+                               err);
+                       goto err_gpio_wp;
+               }
+               gpio_direction_input(GPIO95_MMC_WP);
+       } else {
+               err = gpio_request(GPIO38_SD_PWEN, "sdio power");
+               if (err) {
+                       dev_err(dev, "can't request MMC power control : %d\n",
+                               err);
+                       goto err_gpio_wp;
+               }
+               gpio_direction_output(GPIO38_SD_PWEN, 1);
        }
 
-       gpio_direction_input(GPIO95_MMC_WP);
-
        return 0;
 
 err_gpio_wp:
@@ -535,6 +555,12 @@ static void em_x270_mci_setpower(struct device *dev, unsigned int vdd)
 static void em_x270_mci_exit(struct device *dev, void *data)
 {
        free_irq(gpio_to_irq(mmc_cd), data);
+       regulator_put(em_x270_sdio_ldo);
+
+       if (machine_is_em_x270())
+               gpio_free(GPIO95_MMC_WP);
+       else
+               gpio_free(GPIO38_SD_PWEN);
 }
 
 static int em_x270_mci_get_ro(struct device *dev)
@@ -549,12 +575,14 @@ static struct pxamci_platform_data em_x270_mci_platform_data = {
                          MMC_VDD_30_31|MMC_VDD_31_32,
        .init           = em_x270_mci_init,
        .setpower       = em_x270_mci_setpower,
-       .get_ro         = em_x270_mci_get_ro,
        .exit           = em_x270_mci_exit,
 };
 
 static void __init em_x270_init_mmc(void)
 {
+       if (machine_is_em_x270())
+               em_x270_mci_platform_data.get_ro = em_x270_mci_get_ro;
+
        em_x270_mci_platform_data.detect_delay  = msecs_to_jiffies(250);
        pxa_set_mci_info(&em_x270_mci_platform_data);
 }
@@ -651,23 +679,76 @@ static inline void em_x270_init_ac97(void) {}
 #endif
 
 #if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
-static unsigned int em_x270_matrix_keys[] = {
+static unsigned int em_x270_module_matrix_keys[] = {
        KEY(0, 0, KEY_A), KEY(1, 0, KEY_UP), KEY(2, 1, KEY_B),
        KEY(0, 2, KEY_LEFT), KEY(1, 1, KEY_ENTER), KEY(2, 0, KEY_RIGHT),
        KEY(0, 1, KEY_C), KEY(1, 2, KEY_DOWN), KEY(2, 2, KEY_D),
 };
 
-struct pxa27x_keypad_platform_data em_x270_keypad_info = {
+struct pxa27x_keypad_platform_data em_x270_module_keypad_info = {
        /* code map for the matrix keys */
        .matrix_key_rows        = 3,
        .matrix_key_cols        = 3,
-       .matrix_key_map         = em_x270_matrix_keys,
-       .matrix_key_map_size    = ARRAY_SIZE(em_x270_matrix_keys),
+       .matrix_key_map         = em_x270_module_matrix_keys,
+       .matrix_key_map_size    = ARRAY_SIZE(em_x270_module_matrix_keys),
+};
+
+static unsigned int em_x270_exeda_matrix_keys[] = {
+       KEY(0, 0, KEY_RIGHTSHIFT), KEY(0, 1, KEY_RIGHTCTRL),
+       KEY(0, 2, KEY_RIGHTALT), KEY(0, 3, KEY_SPACE),
+       KEY(0, 4, KEY_LEFTALT), KEY(0, 5, KEY_LEFTCTRL),
+       KEY(0, 6, KEY_ENTER), KEY(0, 7, KEY_SLASH),
+
+       KEY(1, 0, KEY_DOT), KEY(1, 1, KEY_M),
+       KEY(1, 2, KEY_N), KEY(1, 3, KEY_B),
+       KEY(1, 4, KEY_V), KEY(1, 5, KEY_C),
+       KEY(1, 6, KEY_X), KEY(1, 7, KEY_Z),
+
+       KEY(2, 0, KEY_LEFTSHIFT), KEY(2, 1, KEY_SEMICOLON),
+       KEY(2, 2, KEY_L), KEY(2, 3, KEY_K),
+       KEY(2, 4, KEY_J), KEY(2, 5, KEY_H),
+       KEY(2, 6, KEY_G), KEY(2, 7, KEY_F),
+
+       KEY(3, 0, KEY_D), KEY(3, 1, KEY_S),
+       KEY(3, 2, KEY_A), KEY(3, 3, KEY_TAB),
+       KEY(3, 4, KEY_BACKSPACE), KEY(3, 5, KEY_P),
+       KEY(3, 6, KEY_O), KEY(3, 7, KEY_I),
+
+       KEY(4, 0, KEY_U), KEY(4, 1, KEY_Y),
+       KEY(4, 2, KEY_T), KEY(4, 3, KEY_R),
+       KEY(4, 4, KEY_E), KEY(4, 5, KEY_W),
+       KEY(4, 6, KEY_Q), KEY(4, 7, KEY_MINUS),
+
+       KEY(5, 0, KEY_0), KEY(5, 1, KEY_9),
+       KEY(5, 2, KEY_8), KEY(5, 3, KEY_7),
+       KEY(5, 4, KEY_6), KEY(5, 5, KEY_5),
+       KEY(5, 6, KEY_4), KEY(5, 7, KEY_3),
+
+       KEY(6, 0, KEY_2), KEY(6, 1, KEY_1),
+       KEY(6, 2, KEY_ENTER), KEY(6, 3, KEY_END),
+       KEY(6, 4, KEY_DOWN), KEY(6, 5, KEY_UP),
+       KEY(6, 6, KEY_MENU), KEY(6, 7, KEY_F1),
+
+       KEY(7, 0, KEY_LEFT), KEY(7, 1, KEY_RIGHT),
+       KEY(7, 2, KEY_BACK), KEY(7, 3, KEY_HOME),
+       KEY(7, 4, 0), KEY(7, 5, 0),
+       KEY(7, 6, 0), KEY(7, 7, 0),
+};
+
+struct pxa27x_keypad_platform_data em_x270_exeda_keypad_info = {
+       /* code map for the matrix keys */
+       .matrix_key_rows        = 8,
+       .matrix_key_cols        = 8,
+       .matrix_key_map         = em_x270_exeda_matrix_keys,
+       .matrix_key_map_size    = ARRAY_SIZE(em_x270_exeda_matrix_keys),
 };
 
 static void __init em_x270_init_keypad(void)
 {
-       pxa_set_keypad_info(&em_x270_keypad_info);
+       if (machine_is_em_x270())
+               pxa_set_keypad_info(&em_x270_module_keypad_info);
+       else
+               pxa_set_keypad_info(&em_x270_exeda_keypad_info);
 }
 #else
 static inline void em_x270_init_keypad(void) {}
@@ -921,6 +1002,7 @@ static void __init em_x270_init_da9030(void)
 
 static void __init em_x270_module_init(void)
 {
+       pr_info("%s\n", __func__);
        pxa2xx_mfp_config(ARRAY_AND_SIZE(em_x270_pin_config));
 
        mmc_cd = GPIO13_MMC_CD;
@@ -928,11 +1010,26 @@ static void __init em_x270_module_init(void)
        dm9000_flags = DM9000_PLATF_32BITONLY;
 }
 
+static void __init em_x270_exeda_init(void)
+{
+       pr_info("%s\n", __func__);
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(exeda_pin_config));
+
+       mmc_cd = GPIO114_MMC_CD;
+       nand_rb = GPIO20_NAND_RB;
+       dm9000_flags = DM9000_PLATF_16BITONLY;
+}
+
 static void __init em_x270_init(void)
 {
        pxa2xx_mfp_config(ARRAY_AND_SIZE(common_pin_config));
 
-       em_x270_module_init();
+       if (machine_is_em_x270())
+               em_x270_module_init();
+       else if (machine_is_exeda())
+               em_x270_exeda_init();
+       else
+               panic("Unsupported machine: %d\n", machine_arch_type);
 
        em_x270_init_da9030();
        em_x270_init_dm9000();
@@ -958,3 +1055,13 @@ MACHINE_START(EM_X270, "Compulab EM-X270")
        .timer          = &pxa_timer,
        .init_machine   = em_x270_init,
 MACHINE_END
+
+MACHINE_START(EXEDA, "Compulab eXeda")
+       .boot_params    = 0xa0000100,
+       .phys_io        = 0x40000000,
+       .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
+       .map_io         = pxa_map_io,
+       .init_irq       = pxa27x_init_irq,
+       .timer          = &pxa_timer,
+       .init_machine   = em_x270_init,
+MACHINE_END