Index: linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c =================================================================== --- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c 2007-09-07 11:07:33.000000000 -0300 +++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c 2007-09-07 11:10:47.000000000 -0300 @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -23,11 +24,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); @@ -238,6 +241,58 @@ .resource = e680_emu_resources, }; +static unsigned char e680_keycode[] = { + /* row 0 */ + KEY_UP, KEY_RIGHT, KEY_RESERVED, KEY_PHONE, + /* row 1 */ + KEY_DOWN, KEY_LEFT, KEY_VOLUMEUP, KEY_VOLUMEDOWN, + /* row 2 */ + KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_KPENTER, +}; + +static unsigned char e680_direct_keycode[] = { + KEY_CAMERA, + KEY_RESERVED, + KEY_RESERVED, + KEY_HOME, + KEY_POWER, + KEY_MENU, +}; + +static int e680_kbd_init(void) +{ + pxa_gpio_mode(93 | GPIO_ALT_FN_1_IN); /* KP_DKIN<0>, VR Key */ + pxa_gpio_mode(96 | GPIO_ALT_FN_1_IN); /* KP_DKIN<3>, GAME_A */ + pxa_gpio_mode(97 | GPIO_ALT_FN_1_IN); /* KP_DKIN<4>, power key */ + pxa_gpio_mode(98 | GPIO_ALT_FN_1_IN); /* KP_DKIN<5>, GAME_B */ + 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(GPIO_TC_MM_EN); + GPDR(GPIO_TC_MM_EN) |= GPIO_bit(GPIO_TC_MM_EN); + GPSR(GPIO_TC_MM_EN) = GPIO_bit(GPIO_TC_MM_EN); + PGSR3 |= GPIO_bit(GPIO_TC_MM_EN); + return 0; +} + +static struct pxakbd_platform_data e680_kbd_platform_data = { + .init = &e680_kbd_init, + .scan_interval = HZ/40, + .matrix = { + .keycode = e680_keycode, + .cols = 4, + .rows = 3, + }, + .direct = { + .keycode = e680_direct_keycode, + .num = 6, + }, +}; + static struct platform_device *devices[] __initdata = { &e680_pcap_device, &e680_emu_device, @@ -258,6 +313,7 @@ set_pxa_fb_info(&e680_fb_info); pxa_set_mci_info(&e680_mci_platform_data); + pxa_set_kbd_info(&e680_kbd_platform_data); /* clear EMU MUX1/MUX2 (low) to close the audio path to EMU */ pxa_gpio_mode(GPIO_EMU_MUX1|GPIO_OUT);