Index: linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c =================================================================== --- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-a780.c 2007-08-31 23:03:16.000000000 -0300 +++ linux-2.6.21/arch/arm/mach-pxa/ezx-a780.c 2007-08-31 23:05:18.000000000 -0300 @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -24,11 +25,13 @@ #include #include #include +#include #include "generic.h" extern void ezx_lcd_power(int, struct fb_var_screeninfo *); extern void ezx_backlight_power(int); +extern void __init pxa_set_kbd_info(struct pxakbd_platform_data *); #ifdef CONFIG_EZX_PCAP extern int ezx_pcap_mmcsd_power(int); @@ -235,6 +238,55 @@ .resource = a780_emu_resources, }; +static unsigned char a780_keycode[] = { + /* row 0 */ + KEY_PHONE, KEY_MENU, KEY_CANCEL, KEY_PAGEUP, KEY_UP, + /* row 1 */ + KEY_KP1, KEY_KP2, KEY_KP3, KEY_ENTER, KEY_KPENTER, /*center joypad */ + /* row 2 */ + KEY_KP4, KEY_KP5, KEY_KP6, KEY_RECORD, KEY_LEFT, + /* row 3 */ + KEY_KP7, KEY_KP8, KEY_KP9, KEY_HOME, KEY_RIGHT, + /* row 4 */ + KEY_KPASTERISK, KEY_KP0, KEY_KPDOT, KEY_PAGEDOWN, KEY_DOWN, +}; + +static unsigned char a780_direct_keycode[] = { + KEY_CAMERA, +}; + +static int a780_kbd_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; + return 0; +} + +static struct pxakbd_platform_data a780_kbd_platform_data = { + .init = &a780_kbd_init, + .scan_interval = HZ/40, + .matrix = { + .keycode = a780_keycode, + .cols = 5, + .rows = 5, + }, + .direct = { + .keycode = a780_direct_keycode, + .num = 1, + }, +}; + static struct platform_device *devices[] __initdata = { &a780_pcap_device, &a780_emu_device, @@ -255,6 +307,7 @@ set_pxa_fb_info(&a780_fb_info); pxa_set_mci_info(&a780_mci_platform_data); + pxa_set_kbd_info(&a780_kbd_platform_data); /* clear EMU MUX1/MUX2 (low) to close the audio path to EMU */ pxa_gpio_mode(GPIO_EMU_MUX1|GPIO_OUT);