sony_nc_notify rewritten (and placed near the other acpi callbacks), the hotkey decoding code move to a new function sony_nc_hotkeys_decode. Now generating acpi netlink events too.

Signed-off-by: Marco Chiappero <[email protected]>
---

--- a/drivers/platform/x86/sony-laptop.c
+++ b/drivers/platform/x86/sony-laptop.c
@@ -1151,62 +1151,6 @@ static struct sony_nc_event sony_127_eve
 /*
  * ACPI callbacks
  */
-static void sony_nc_notify(struct acpi_device *device, u32 event)
-{
-       u32 ev = event;
-
-       if (ev >= 0x90) {
-               /* New-style event */
-               unsigned int result;
-               int key_handle = 0;
-               ev -= 0x90;
-
-               if (sony_find_snc_handle(0x100) == ev)
-                       key_handle = 0x100;
-               if (sony_find_snc_handle(0x127) == ev)
-                       key_handle = 0x127;
-
-               if (key_handle) {
-                       struct sony_nc_event *key_event;
-
-                       if (sony_call_snc_handle(key_handle, 0x200, &result)) {
-                               dprintk("sony_nc_notify, unable to decode"
-                                       " event 0x%.2x 0x%.2x\n", key_handle,
-                                       ev);
-                               /* restore the original event */
-                               ev = event;
-                       } else {
-                               ev = result & 0xFF;
-
-                               if (key_handle == 0x100)
-                                       key_event = sony_100_events;
-                               else
-                                       key_event = sony_127_events;
-
-                               for (; key_event->data; key_event++) {
-                                       if (key_event->data == ev) {
-                                               ev = key_event->event;
-                                               break;
-                                       }
-                               }
-
-                               if (!key_event->data)
-                                       pr_info("Unknown event: 0x%x 0x%x\n",
-                                               key_handle, ev);
-                               else
-                                       sony_laptop_report_input_event(ev);
-                       }
-               } else if (sony_find_snc_handle(sony_rfkill_handle) == ev) {
-                       sony_nc_rfkill_update();
-                       return;
-               }
-       } else
-               sony_laptop_report_input_event(ev);
-
-       dprintk("sony_nc_notify, event: 0x%.2x\n", ev);
-       acpi_bus_generate_proc_event(sony_nc_acpi_device, 1, ev);
-}
-
 static acpi_status sony_walk_callback(acpi_handle handle, u32 level,
                                      void *context, void **return_value)
 {
@@ -1237,6 +1181,42 @@ static int sony_nc_function_setup(unsign
        return 0;
 }

+static int sony_nc_hotkeys_decode(unsigned int handle)
+{
+       int ret = 0;
+       unsigned int result = 0;
+       struct sony_nc_event *key_event;
+
+       if (sony_call_snc_handle(handle, 0x200, &result)) {
+               dprintk("sony_nc_hotkeys_decode,"
+                               " unable to retrieve the hotkey\n");
+               ret = -1;
+       } else {
+               result &= 0xff;
+
+               if (handle == 0x100)
+                       key_event = sony_100_events;
+               else
+                       key_event = sony_127_events;
+
+               for (; key_event->data; key_event++) {
+                       if (key_event->data == result) {
+                               ret = key_event->event;
+                               break;
+                       }
+               }
+
+               if (!key_event->data)
+                       pr_info("Unknown hotkey 0x%.2x (handle 0x%.2x)\n",
+                                                       result, handle);
+               else
+                       dprintk("sony_nc_hotkeys_decode, hotkey 0x%.2x decoded "
+                                       "to event 0x%.2x\n", result, ret);
+       }
+
+       return ret;
+}
+
 static void sony_nc_rfkill_cleanup(void)
 {
        int i;
@@ -1864,6 +1844,52 @@ static int sony_nc_snc_resume(void)
        return 0;
 }

+static void sony_nc_notify(struct acpi_device *device, u32 event)
+{
+       u8 ev = 0;
+       int value = 0;
+
+       dprintk("sony_nc_notify, event: 0x%.2x\n", event);
+
+       /* handles related events */
+       if (event >= 0x90) {
+               unsigned int result = 0, handle = 0;
+
+               /* the event should corrispond to the offset of the method */
+               unsigned int offset = event - 0x90;
+
+               handle = handles->cap[offset];
+               switch (handle) {
+               /* list of handles known for generating events */
+               case 0x0100:
+               case 0x0127:
+                       /* hotkey event, a key has been pressed, retrieve it */
+                       value = sony_nc_hotkeys_decode(handle);
+                       if (value > 0) /* known event */
+                               sony_laptop_report_input_event(value);
+                       /* else unknown event or failure, do nothing */
+                       ev = 1;
+                       break;
+
+               default:
+                       value = event;
+                       dprintk("Unknowk event for handle: 0x%x\n", handle);
+                       break;
+               }
+
+               /* clear the event (and the event reason when present) */
+               acpi_callsetfunc(sony_nc_acpi_handle, "SN05", 1 << offset,
+                               &result);
+       } else {
+               ev = 1;
+               sony_laptop_report_input_event(event);
+       }
+
+       acpi_bus_generate_proc_event(device, ev, value);
+       acpi_bus_generate_netlink_event(device->pnp.device_class,
+                                       dev_name(&device->dev), ev, value);
+}
+
 static int sony_nc_add(struct acpi_device *device)
 {
        acpi_status status;
--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" 
in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to