]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
drivers/platform/x86/sony-laptop.c: fix scancodes
authorJohn Hughes <john@calvaedi.com>
Fri, 2 Dec 2011 03:06:58 +0000 (14:06 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Tue, 6 Dec 2011 03:57:35 +0000 (14:57 +1100)
The scancodes returned by the sony-laptop driver for function keys did not
match the scancodes used to remap keys.  Also, since the scancode was sent
to the input subsystem after the mapped keysym the /lib/udev/keymap
utility was confused about which scancode to report for which keysym.

This patch fixes the driver so the correct scancode is shown for each key.
 It also adds to the documentation a description of where to find the
scancodes.

Before the patch FN/E returned scancode 0x1B, but to remap scancode 0x14
had to be used.

Signed-off-by: John Hughes <john@calva.com>
Cc: Mattia Dongili <malattia@linux.it>
Cc: Matthew Garrett <mjg@redhat.com>
Acked-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Documentation/laptops/sony-laptop.txt
drivers/platform/x86/sony-laptop.c

index 2bd4e82e5d9ff2085f78f44c6a9351a61a2512e5..0d5ac7f5287e611d4aa171937a1d83b31d0f6038 100644 (file)
@@ -17,6 +17,11 @@ subsystem. See the logs of acpid or /proc/acpi/event and
 devices are created by the driver. Additionally, loading the driver with the
 debug option will report all events in the kernel log.
 
+The "scancodes" passed to the input system (that can be remapped with udev)
+are indexes to the table "sony_laptop_input_keycode_map" in the sony-laptop.c
+module.  For example the "FN/E" key combination (EJECTCD on some models)
+generates the scancode 20 (0x14).
+
 Backlight control:
 ------------------
 If your laptop model supports it, you will find sysfs files in the
index c006dee5ebfe84bb33a962dbdddf4ff9440c74be..9ba4a2bea92475902de8d28ac52813fe9c92df95 100644 (file)
@@ -347,6 +347,7 @@ static void sony_laptop_report_input_event(u8 event)
        struct input_dev *jog_dev = sony_laptop_input.jog_dev;
        struct input_dev *key_dev = sony_laptop_input.key_dev;
        struct sony_laptop_keypress kp = { NULL };
+       int scancode;
 
        if (event == SONYPI_EVENT_FNKEY_RELEASED ||
                        event == SONYPI_EVENT_ANYBUTTON_RELEASED) {
@@ -380,8 +381,8 @@ static void sony_laptop_report_input_event(u8 event)
                        dprintk("sony_laptop_report_input_event, event not known: %d\n", event);
                        break;
                }
-               if (sony_laptop_input_index[event] != -1) {
-                       kp.key = sony_laptop_input_keycode_map[sony_laptop_input_index[event]];
+               if ((scancode = sony_laptop_input_index[event]) != -1) {
+                       kp.key = sony_laptop_input_keycode_map[scancode];
                        if (kp.key != KEY_UNKNOWN)
                                kp.dev = key_dev;
                }
@@ -389,9 +390,9 @@ static void sony_laptop_report_input_event(u8 event)
        }
 
        if (kp.dev) {
-               input_report_key(kp.dev, kp.key, 1);
                /* we emit the scancode so we can always remap the key */
-               input_event(kp.dev, EV_MSC, MSC_SCAN, event);
+               input_event(kp.dev, EV_MSC, MSC_SCAN, scancode);
+               input_report_key(kp.dev, kp.key, 1);
                input_sync(kp.dev);
 
                /* schedule key release */