Index: linux-2.6.25.3/arch/arm/mach-pxa/ezx-a780.c =================================================================== --- linux-2.6.25.3.orig/arch/arm/mach-pxa/ezx-a780.c +++ linux-2.6.25.3/arch/arm/mach-pxa/ezx-a780.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "generic.h" @@ -236,6 +237,79 @@ .resource = a780_emu_resources, }; +/* KEYPAD */ +#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULES) +static unsigned int a780_key_map[] = { + /* row 0 */ + KEY(0, 0, KEY_PHONE), + KEY(0, 1, KEY_MENU), + KEY(0, 2, KEY_CANCEL), + KEY(0, 3, KEY_PAGEUP), + KEY(0, 4, KEY_UP), + + /* row 1 */ + KEY(1, 0, KEY_KP1), + KEY(1, 1, KEY_KP2), + KEY(1, 2, KEY_KP3), + KEY(1, 3, KEY_ENTER), + KEY(1, 4, KEY_KPENTER), + + /* row 2 */ + KEY(2, 0, KEY_KP4), + KEY(2, 1, KEY_KP5), + KEY(2, 2, KEY_KP6), + KEY(2, 3, KEY_RECORD), + KEY(2, 4, KEY_LEFT), + + /* row 3 */ + KEY(3, 0, KEY_KP7), + KEY(3, 1, KEY_KP8), + KEY(3, 2, KEY_KP9), + KEY(3, 3, KEY_HOME), + KEY(3, 4, KEY_RIGHT), + + /* row 4 */ + KEY(4, 0, KEY_KPASTERISK), + KEY(4, 1, KEY_KP0), + KEY(4, 2, KEY_KPDOT), + KEY(4, 3, KEY_PAGEDOWN), + KEY(4, 4, KEY_DOWN), +}; + +static struct pxa27x_keypad_platform_data a780_keypad_platform_data = { + .matrix_key_rows = 5, + .matrix_key_cols = 5, + .matrix_key_map = a780_key_map, + .matrix_key_map_size = ARRAY_SIZE(a780_key_map), + + .direct_key_num = 1, + .direct_key_map = {KEY_CAMERA, 0, 0, 0, 0, 0, 0, 0}, + + .debounce_interval = 0x40, +}; + +static void __init a780_keypad_init(void) +{ + pxa_gpio_mode(93 | GPIO_ALT_FN_1_IN); /* KP_DKIN<0>, voice_rec */ + 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(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(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> */ + PKWR = 0xec400; + PGSR3 |= 0xf80; + + pxa_set_keypad_info(&a780_keypad_platform_data); +} +#else +static inline void a780_keypad_init(void) {}; +#endif + static struct platform_device *devices[] __initdata = { &a780_pcap_device, &a780_emu_device, @@ -257,6 +331,8 @@ set_pxa_fb_info(&a780_fb_info); pxa_set_mci_info(&a780_mci_platform_data); + a780_keypad_init(); + /* clear EMU MUX1/MUX2 (low) to close the audio path to EMU */ pxa_gpio_mode(GPIO_EMU_MUX1|GPIO_OUT); clr_GPIO(GPIO_EMU_MUX1);