Loading arch/arm/mach-pxa/Kconfig +4 −0 Original line number Diff line number Diff line Loading @@ -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 Loading arch/arm/mach-pxa/em-x270.c +128 −21 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -47,18 +48,21 @@ #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) /* NAND control GPIOs */ #define GPIO11_NAND_CS (11) #define GPIO95_MMC_WP (95) #define GPIO56_NAND_RB (56) /* Miscelaneous GPIOs */ /* eXeda specific GPIOs */ #define GPIO114_MMC_CD (114) #define GPIO20_NAND_RB (20) #define GPIO38_SD_PWEN (38) /* 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; Loading Loading @@ -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] = { Loading Loading @@ -500,13 +510,23 @@ static int em_x270_mci_init(struct device *dev, goto err_irq; } 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); 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); } return 0; Loading Loading @@ -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) Loading @@ -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); } Loading Loading @@ -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) {} Loading Loading @@ -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; Loading @@ -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)); 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(); Loading @@ -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 Loading
arch/arm/mach-pxa/Kconfig +4 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
arch/arm/mach-pxa/em-x270.c +128 −21 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -47,18 +48,21 @@ #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) /* NAND control GPIOs */ #define GPIO11_NAND_CS (11) #define GPIO95_MMC_WP (95) #define GPIO56_NAND_RB (56) /* Miscelaneous GPIOs */ /* eXeda specific GPIOs */ #define GPIO114_MMC_CD (114) #define GPIO20_NAND_RB (20) #define GPIO38_SD_PWEN (38) /* 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; Loading Loading @@ -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] = { Loading Loading @@ -500,13 +510,23 @@ static int em_x270_mci_init(struct device *dev, goto err_irq; } 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); 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); } return 0; Loading Loading @@ -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) Loading @@ -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); } Loading Loading @@ -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) {} Loading Loading @@ -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; Loading @@ -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)); 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(); Loading @@ -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