Add key mappings for ezx phones Signed-off-by: Daniel Ribeiro Signed-off-by: Antonio Ospite Index: linux-2.6-arm/arch/arm/mach-pxa/ezx.c =================================================================== --- linux-2.6-arm.orig/arch/arm/mach-pxa/ezx.c +++ linux-2.6-arm/arch/arm/mach-pxa/ezx.c @@ -19,11 +19,13 @@ #include #include #include +#include #include #include #include #include +#include #include #include @@ -200,6 +202,261 @@ .detect_delay = 150 / (1000 / HZ), }; +/* KEYPAD */ +#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULES) + +#ifdef CONFIG_MACH_EZX_A780 +static unsigned long a780_keypad_pins[] __initdata = { + GPIO93_KP_DKIN_0 | WAKEUP_ON_LEVEL_HIGH, + GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH, + GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH, + GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH, + GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH, + GPIO98_KP_MKIN_4 | WAKEUP_ON_LEVEL_HIGH, + GPIO103_KP_MKOUT_0, + GPIO104_KP_MKOUT_1, + GPIO105_KP_MKOUT_2, + GPIO106_KP_MKOUT_3, + GPIO107_KP_MKOUT_4, +}; + +static unsigned int a780_key_map[] = { + 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), + + 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), + + 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), + + 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), + + 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 = 30, +}; +#else +static unsigned long a780_keypad_pins[] __initdata = {}; +static struct pxa27x_keypad_platform_data a780_keypad_platform_data; +#endif /* CONFIG_MACH_EZX_A780 */ + +#ifdef CONFIG_MACH_EZX_E680 +static unsigned long e680_keypad_pins[] __initdata = { + GPIO93_KP_DKIN_0 | WAKEUP_ON_LEVEL_HIGH, + GPIO96_KP_DKIN_3 | WAKEUP_ON_LEVEL_HIGH, + GPIO97_KP_DKIN_4 | WAKEUP_ON_LEVEL_HIGH, + GPIO98_KP_DKIN_5 | WAKEUP_ON_LEVEL_HIGH, + GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH, + GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH, + GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH, + GPIO103_KP_MKOUT_0, + GPIO104_KP_MKOUT_1, + GPIO105_KP_MKOUT_2, + GPIO106_KP_MKOUT_3, +}; + +static unsigned int e680_key_map[] = { + KEY(0, 0, KEY_UP), + KEY(0, 1, KEY_RIGHT), + KEY(0, 2, KEY_RESERVED), + KEY(0, 3, KEY_PHONE), + + KEY(1, 0, KEY_DOWN), + KEY(1, 1, KEY_LEFT), + KEY(1, 2, KEY_VOLUMEUP), + KEY(1, 3, KEY_VOLUMEDOWN), + + KEY(2, 0, KEY_RESERVED), + KEY(2, 1, KEY_RESERVED), + KEY(2, 2, KEY_RESERVED), + KEY(2, 3, KEY_KPENTER), +}; + +static struct pxa27x_keypad_platform_data e680_keypad_platform_data = { + .matrix_key_rows = 3, + .matrix_key_cols = 4, + .matrix_key_map = e680_key_map, + .matrix_key_map_size = ARRAY_SIZE(e680_key_map), + + .direct_key_num = 6, + .direct_key_map = { + KEY_CAMERA, + KEY_RESERVED, + KEY_RESERVED, + KEY_HOME, + KEY_POWER, + KEY_MENU, + 0, + 0, + }, + + .debounce_interval = 30, +}; +#else +static unsigned long e680_keypad_pins[] __initdata = {}; +static struct pxa27x_keypad_platform_data e680_keypad_platform_data; +#endif /* CONFIG_MACH_EZX_E680 */ + +#ifdef CONFIG_MACH_EZX_A1200 +static unsigned long a1200_keypad_pins[] __initdata = { + GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH, + GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH, + GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH, + GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH, + GPIO98_KP_MKIN_4 | WAKEUP_ON_LEVEL_HIGH, + GPIO103_KP_MKOUT_0, + GPIO104_KP_MKOUT_1, + GPIO105_KP_MKOUT_2, + GPIO106_KP_MKOUT_3, + GPIO107_KP_MKOUT_4, + GPIO108_KP_MKOUT_5, +}; + +static unsigned int a1200_key_map[] = { + KEY(0, 0, KEY_RESERVED), + KEY(0, 1, KEY_RIGHT), + KEY(0, 2, KEY_PAGEDOWN), + KEY(0, 3, KEY_RESERVED), + KEY(0, 4, KEY_RESERVED), + KEY(0, 5, KEY_RESERVED), + + KEY(1, 0, KEY_RESERVED), + KEY(1, 1, KEY_DOWN), + KEY(2, 1, KEY_CAMERA), + KEY(1, 3, KEY_RESERVED), + KEY(1, 4, KEY_RESERVED), + KEY(1, 5, KEY_RESERVED), + + KEY(2, 0, KEY_RESERVED), + KEY(2, 1, KEY_KPENTER), + KEY(2, 2, KEY_RECORD), + KEY(2, 3, KEY_RESERVED), + KEY(2, 4, KEY_RESERVED), + KEY(2, 5, KEY_ENTER), + + KEY(3, 0, KEY_RESERVED), + KEY(3, 1, KEY_UP), + KEY(3, 2, KEY_HOME), + KEY(3, 3, KEY_RESERVED), + KEY(3, 4, KEY_RESERVED), + KEY(3, 5, KEY_RESERVED), + + KEY(4, 0, KEY_RESERVED), + KEY(4, 1, KEY_LEFT), + KEY(4, 2, KEY_PAGEUP), + KEY(4, 3, KEY_RESERVED), + KEY(4, 4, KEY_RESERVED), + KEY(4, 5, KEY_RESERVED), +}; + +static struct pxa27x_keypad_platform_data a1200_keypad_platform_data = { + .matrix_key_rows = 5, + .matrix_key_cols = 6, + .matrix_key_map = a1200_key_map, + .matrix_key_map_size = ARRAY_SIZE(a1200_key_map), + + .debounce_interval = 30, +}; +#else +static unsigned long a1200_keypad_pins[] __initdata = {}; +static struct pxa27x_keypad_platform_data a1200_keypad_platform_data; +#endif /* CONFIG_MACH_EZX_A1200 */ + +#ifdef CONFIG_MACH_EZX_A910 +static unsigned long a910_keypad_pins[] __initdata = { + GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH, + GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH, + GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH, + GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH, + GPIO98_KP_MKIN_4 | WAKEUP_ON_LEVEL_HIGH, + GPIO103_KP_MKOUT_0, + GPIO104_KP_MKOUT_1, + GPIO105_KP_MKOUT_2, + GPIO106_KP_MKOUT_3, + GPIO107_KP_MKOUT_4, + GPIO108_KP_MKOUT_5, +}; + +static unsigned int a910_key_map[] = { + 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), + + 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), + + 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), + + 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), + + 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 = 30, +}; +#else +static unsigned long a910_keypad_pins[] __initdata = {}; +static struct pxa27x_keypad_platform_data a910_keypad_platform_data; +#endif /* CONFIG_MACH_EZX_A910 */ + +#endif /* CONFIG_KEYBOARD_PXA27x */ + static struct platform_device *devices[] __initdata = { &ezx_pcap_device, &ezx_backlight_device, @@ -279,6 +536,24 @@ set_pxa_fb_info(&ezx_fb_info_2); } pxa_set_mci_info(&ezx_mci_platform_data); + +#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULES) + if (machine_is_ezx_a780()) { + pxa2xx_mfp_config(ARRAY_AND_SIZE(a780_keypad_pins)); + pxa_set_keypad_info(&a780_keypad_platform_data); + } else if (machine_is_ezx_e680()) { + pxa2xx_mfp_config(ARRAY_AND_SIZE(e680_keypad_pins)); + pxa_set_keypad_info(&e680_keypad_platform_data); + } else if (machine_is_ezx_a1200()) { + pxa2xx_mfp_config(ARRAY_AND_SIZE(a1200_keypad_pins)); + pxa_set_keypad_info(&a1200_keypad_platform_data); + } else if (machine_is_ezx_a910()) { + pxa2xx_mfp_config(ARRAY_AND_SIZE(a910_keypad_pins)); + pxa_set_keypad_info(&a910_keypad_platform_data); + } else + printk(KERN_WARNING "Can't load a keymap for your phone\n"); +#endif + platform_add_devices(devices, ARRAY_SIZE(devices)); /* A910 and E2 dont have a touchscreen */