summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Welwarsky <matze@welwarsky.de>2009-04-01 22:10:47 +0900
committerLen Brown <len.brown@intel.com>2009-04-03 13:04:23 -0400
commit16dd55f309cf69a648ca3b1fc04b3b6f079c8be0 (patch)
treef82c22c1835fe7c257d7307e0e16dcef203370b2
parent14bd31365fbeeccee72b0aead3baa4e5da208281 (diff)
sony-laptop: fix event reporting for new style events
In short Fn key events are always reported through acpi. The input layer gets all the old style events and only those new style events that, after being decoded, are mapped to an locally represented events. rfkill only update the rfkill device status. Signed-off-by: Matthias Welwarsky <matze@welwarsky.de> Signed-off-by: Mattia Dongili <malattia@linux.it> Signed-off-by: Len Brown <len.brown@intel.com>
-rw-r--r--drivers/platform/x86/sony-laptop.c41
1 files changed, 23 insertions, 18 deletions
diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c
index 011c03596b2..e02edf68a68 100644
--- a/drivers/platform/x86/sony-laptop.c
+++ b/drivers/platform/x86/sony-laptop.c
@@ -917,10 +917,10 @@ static struct sony_nc_event sony_127_events[] = {
static void sony_acpi_notify(acpi_handle handle, u32 event, void *data)
{
u32 ev = event;
- int result;
if (ev >= 0x90) {
/* New-style event */
+ int result;
int key_handle = 0;
ev -= 0x90;
@@ -932,38 +932,43 @@ static void sony_acpi_notify(acpi_handle handle, u32 event, void *data)
if (key_handle) {
struct sony_nc_event *key_event;
- if (sony_call_snc_handle(key_handle, 0x200, &result))
+ if (sony_call_snc_handle(key_handle, 0x200, &result)) {
dprintk("sony_acpi_notify, unable to decode"
" event 0x%.2x 0x%.2x\n", key_handle,
ev);
- else
+ /* 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;
+ 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;
+ for (; key_event->data; key_event++) {
+ if (key_event->data == ev) {
+ ev = key_event->event;
+ break;
+ }
}
- }
- if (!key_event->data) {
- printk(KERN_INFO DRV_PFX
- "Unknown event: 0x%x 0x%x\n", key_handle,
- ev);
+ if (!key_event->data)
+ printk(KERN_INFO DRV_PFX
+ "Unknown event: 0x%x 0x%x\n",
+ key_handle,
+ ev);
+ else
+ sony_laptop_report_input_event(ev);
}
} else if (sony_find_snc_handle(0x124) == ev) {
sony_nc_rfkill_update();
return;
}
- }
+ } else
+ sony_laptop_report_input_event(ev);
dprintk("sony_acpi_notify, event: 0x%.2x\n", ev);
- sony_laptop_report_input_event(ev);
acpi_bus_generate_proc_event(sony_nc_acpi_device, 1, ev);
}