Skip to contentSkip to conversation

drivers/platform/x86/sony-laptop.c: fix scancodes

PATCH New Dan Carpenter 3 participants 4 messages Nov 30, 2011 – Dec 3, 2011

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

Hi John,

Commit 04840b50f395 "drivers/platform/x86/sony-laptop.c: fix scancodes" introduces a gcc warning:

drivers/platform/x86/sony-laptop.c:395:14: warning:
‘scancode’ may be used uninitialized in this function [-Wuninitialized]

   345  static void sony_laptop_report_input_event(u8 event)
   346  {
   347          struct input_dev *jog_dev = sony_laptop_input.jog_dev;
   348          struct input_dev *key_dev = sony_laptop_input.key_dev;
   349          struct sony_laptop_keypress kp = { NULL };
   350          int scancode;
   351  

-- [snip] --

   373          /* key_dev events */
   374          case SONYPI_EVENT_JOGDIAL_PRESSED:
   375                  kp.key = BTN_MIDDLE;
   376                  kp.dev = jog_dev;
   377                  break;

scancode doesn't get initialized on this path, but kp.dev is set.

   378  
   379          default:
   380                  if (event >= ARRAY_SIZE(sony_laptop_input_index)) {
   381                          dprintk("sony_laptop_report_input_event, event not known: %d\n", event);
   382                          break;
   383                  }
   384                  scancode = sony_laptop_input_index[event];
   385                  if (scancode != -1) {
   386                          kp.key = sony_laptop_input_keycode_map[scancode];
   387                          if (kp.key != KEY_UNKNOWN)
   388                                  kp.dev = key_dev;
   389                  }
   390                  break;
   391          }
   392  
   393          if (kp.dev) {
   394                  /* we emit the scancode so we can always remap the key */
   395                  input_event(kp.dev, EV_MSC, MSC_SCAN, scancode);

We use scancode here.

regards,
dan carpenter

#1 lore raw
Quoted 7 lines · Dan Carpenter

Hi John,

Commit 04840b50f395 "drivers/platform/x86/sony-laptop.c: fix scancodes" introduces a gcc warning:

drivers/platform/x86/sony-laptop.c:395:14: warning:
‘scancode’ may be used uninitialized in this function [-Wuninitialized]

Ok, that's a dumb bug on my part.

I'll make a better patch this evening.

#2 lore raw
In reply to Dan Carpenter
Quoted 8 lines · Dan Carpenter

Hi John,

Commit 04840b50f395 "drivers/platform/x86/sony-laptop.c: fix scancodes" introduces a gcc warning:

drivers/platform/x86/sony-laptop.c:395:14: warning:
‘scancode’ may be used uninitialized in this function [-Wuninitialized]

Ok, my code was broken, but so was the original - the jogdial device isn't supposed to send scancodes for it's events:

        jog_dev->name = "Sony Vaio Jogdial";
        jog_dev->id.bustype = BUS_ISA;
        jog_dev->id.vendor = PCI_VENDOR_ID_SONY;
        key_dev->dev.parent =&acpi_device->dev;

        input_set_capability(jog_dev, EV_KEY, BTN_MIDDLE);
        input_set_capability(jog_dev, EV_REL, REL_WHEEL);

Note, no EV_MSC, MSC_SCAN here.

Whoops, anoher bug! Look there, it's setting key_dev->dev.parent instead of jog_dev.dev_parent!

I'll post a new patch when I've finished testing it.

#3 lore raw

PATCH 1/1 Fix scancodes emitted by sony-laptop driver (Version 2 with warnings fixed)

In reply to Dan Carpenter
Quoted 8 lines · Dan Carpenter

Hi John,

Commit 04840b50f395 "drivers/platform/x86/sony-laptop.c: fix scancodes" introduces a gcc warning:

drivers/platform/x86/sony-laptop.c:395:14: warning:
‘scancode’ may be used uninitialized in this function [-Wuninitialized]

Ok, I've fixed my stupid mistake and also the two bugs in the jogdial driver (It wasn't setting it's parent and it was emitting scancode events even though it's not a keyboard device).

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.

Documentation/laptops/sony-laptop.txt +5 -0
index 2bd4e82..0d5ac7f 100644
@@ -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
drivers/platform/x86/sony-laptop.c +8 -5
index c006dee..4babb79 100644
@@ -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 = -1;
 
 	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,11 @@ static void sony_laptop_report_input_event(u8 event)
 	}
 
 	if (kp.dev) {
+		/* if we have a scancode we emit it so we can always
+                   remap the key */
+		if (scancode != -1)
+			input_event(kp.dev, EV_MSC, MSC_SCAN, scancode);
 		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_sync(kp.dev);
 
 		/* schedule key release */
@@ -466,7 +469,7 @@ static int sony_laptop_setup_input(struct acpi_device *acpi_device)
 	jog_dev->name = "Sony Vaio Jogdial";
 	jog_dev->id.bustype = BUS_ISA;
 	jog_dev->id.vendor = PCI_VENDOR_ID_SONY;
-	key_dev->dev.parent = &acpi_device->dev;
+	jog_dev->dev.parent = &acpi_device->dev;
 
 	input_set_capability(jog_dev, EV_KEY, BTN_MIDDLE);
 	input_set_capability(jog_dev, EV_REL, REL_WHEEL);