Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: atlas_btns - add support for loadable keymaps

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>

+22 -15
+22 -15
drivers/input/misc/atlas_btns.c
··· 29 29 #include <asm/uaccess.h> 30 30 #include <acpi/acpi_drivers.h> 31 31 32 - #define ACPI_ATLAS_NAME "Atlas ACPI" 33 - #define ACPI_ATLAS_CLASS "Atlas" 32 + #define ACPI_ATLAS_NAME "Atlas ACPI" 33 + #define ACPI_ATLAS_CLASS "Atlas" 34 34 35 + static unsigned short atlas_keymap[16]; 35 36 static struct input_dev *input_dev; 36 37 37 38 /* button handling code */ ··· 51 50 void *handler_context, void *region_context) 52 51 { 53 52 acpi_status status; 54 - int keycode; 55 53 56 54 if (function == ACPI_WRITE) { 57 - keycode = KEY_F1 + (address & 0x0F); 58 - input_report_key(input_dev, keycode, !(address & 0x10)); 55 + int code = address & 0x0f; 56 + int key_down = !(address & 0x10); 57 + 58 + input_event(input_dev, EV_MSC, MSC_SCAN, code); 59 + input_report_key(input_dev, atlas_keymap[code], key_down); 59 60 input_sync(input_dev); 61 + 60 62 status = 0; 61 63 } else { 62 64 printk(KERN_WARNING "atlas: shrugged on unexpected function" ··· 74 70 static int atlas_acpi_button_add(struct acpi_device *device) 75 71 { 76 72 acpi_status status; 73 + int i; 77 74 int err; 78 75 79 76 input_dev = input_allocate_device(); ··· 86 81 input_dev->name = "Atlas ACPI button driver"; 87 82 input_dev->phys = "ASIM0000/atlas/input0"; 88 83 input_dev->id.bustype = BUS_HOST; 89 - input_dev->evbit[BIT_WORD(EV_KEY)] = BIT_MASK(EV_KEY); 84 + input_dev->keycode = atlas_keymap; 85 + input_dev->keycodesize = sizeof(unsigned short); 86 + input_dev->keycodemax = ARRAY_SIZE(atlas_keymap); 90 87 91 - set_bit(KEY_F1, input_dev->keybit); 92 - set_bit(KEY_F2, input_dev->keybit); 93 - set_bit(KEY_F3, input_dev->keybit); 94 - set_bit(KEY_F4, input_dev->keybit); 95 - set_bit(KEY_F5, input_dev->keybit); 96 - set_bit(KEY_F6, input_dev->keybit); 97 - set_bit(KEY_F7, input_dev->keybit); 98 - set_bit(KEY_F8, input_dev->keybit); 99 - set_bit(KEY_F9, input_dev->keybit); 88 + input_set_capability(input_dev, EV_MSC, MSC_SCAN); 89 + __set_bit(EV_KEY, input_dev->evbit); 90 + for (i = 0; i < ARRAY_SIZE(atlas_keymap); i++) { 91 + if (i < 9) { 92 + atlas_keymap[i] = KEY_F1 + i; 93 + __set_bit(KEY_F1 + i, input_dev->keybit); 94 + } else 95 + atlas_keymap[i] = KEY_RESERVED; 96 + } 100 97 101 98 err = input_register_device(input_dev); 102 99 if (err) {