Index: linux-2.6.25.4/arch/arm/mach-pxa/ezx-a910.c =================================================================== --- linux-2.6.25.4.orig/arch/arm/mach-pxa/ezx-a910.c +++ linux-2.6.25.4/arch/arm/mach-pxa/ezx-a910.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -24,6 +25,7 @@ #include #include #include +#include #include "generic.h" @@ -242,6 +244,83 @@ }, }; +/* KEYPAD */ +#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULES) +static unsigned int a910_key_map[] = { + /* row 0 */ + KEY(0, 0, KEY_KP6), + KEY(0, 1, KEY_RIGHT), + KEY(0, 2, KEY_PAGEDOWN), + KEY(0, 3, KEY_KPENTER), + KEY(0, 4, KEY_KP5), + KEY(0, 5, KEY_CAMERA), + + /* row 1 */ + KEY(1, 0, KEY_KP8), + KEY(1, 1, KEY_DOWN), + KEY(1, 2, KEY_RESERVED), + KEY(1, 3, KEY_F1), /* Left SoftKey */ + KEY(1, 4, KEY_KPASTERISK), + KEY(1, 5, KEY_RESERVED), + + /* row 2 */ + KEY(2, 0, KEY_KP7), + KEY(2, 1, KEY_KP9), + KEY(2, 2, KEY_RECORD), + KEY(2, 3, KEY_F2), /* Right SoftKey */ + KEY(2, 4, KEY_CANCEL), + KEY(2, 5, KEY_ENTER), + + /* row 3 */ + KEY(3, 0, KEY_KP2), + KEY(3, 1, KEY_UP), + KEY(3, 2, KEY_PHONE), + KEY(3, 3, KEY_KP0), + KEY(3, 4, KEY_KP1), + KEY(3, 5, KEY_RECORD), + + /* row 4 */ + KEY(4, 0, KEY_KP4), + KEY(4, 1, KEY_LEFT), + KEY(4, 2, KEY_PAGEUP), + KEY(4, 3, KEY_KPDOT), + KEY(4, 4, KEY_KP3), + KEY(4, 5, KEY_RESERVED), +}; + +static struct pxa27x_keypad_platform_data a910_keypad_platform_data = { + .matrix_key_rows = 5, + .matrix_key_cols = 6, + .matrix_key_map = a910_key_map, + .matrix_key_map_size = ARRAY_SIZE(a910_key_map), + + .debounce_interval = 0x40, +}; + +static void __init a910_keypad_init(void) +{ + pxa_gpio_mode(100 | GPIO_ALT_FN_1_IN); /* KP_MKIN<0> */ + pxa_gpio_mode(101 | GPIO_ALT_FN_1_IN); /* KP_MKIN<1> */ + pxa_gpio_mode(102 | GPIO_ALT_FN_1_IN); /* KP_MKIN<2> */ + pxa_gpio_mode(97 | GPIO_ALT_FN_3_IN); /* KP_MKIN<3> */ + pxa_gpio_mode(98 | GPIO_ALT_FN_3_IN); /* KP_MKIN<4> */ + pxa_gpio_mode(103 | GPIO_ALT_FN_2_OUT); /* KP_MKOUT<0> */ + pxa_gpio_mode(104 | GPIO_ALT_FN_2_OUT); /* KP_MKOUT<1> */ + pxa_gpio_mode(105 | GPIO_ALT_FN_2_OUT); /* KP_MKOUT<2> */ + pxa_gpio_mode(106 | GPIO_ALT_FN_2_OUT); /* KP_MKOUT<3> */ + pxa_gpio_mode(107 | GPIO_ALT_FN_2_OUT); /* KP_MKOUT<4> */ + pxa_gpio_mode(108 | GPIO_ALT_FN_2_OUT); /* KP_MKOUT<5> */ + + PKWR = 0xEC000; + PGSR3 |= 0x1F80; + + pxa_set_keypad_info(&a910_keypad_platform_data); +} +#else +static inline void a910_keypad_init(void) {}; +#endif + + static struct platform_device *devices[] __initdata = { &a910_pcap_device, &a910_eoc_device, @@ -252,6 +331,8 @@ set_pxa_fb_info(&a910_fb_info); pxa_set_mci_info(&a910_mci_platform_data); + a910_keypad_init(); + platform_add_devices(devices, ARRAY_SIZE(devices)); i2c_register_board_info(0, a910_i2c_board_info,