From: Marco Chiappero <marco@absence.it>
To: Matthew Garrett <mjg59@srcf.ucam.org>
Cc: platform-driver-x86@vger.kernel.org, Mattia Dongili <malattia@linux.it>
Subject: [PATCH V2 8/14] sony-laptop: sony_nc_notify rewritten and improved
Date: Fri, 09 Sep 2011 18:53:30 +0200 [thread overview]
Message-ID: <1315587210.3613.94.camel@vesuvio> (raw)
In-Reply-To: <1315585214.3613.51.camel@vesuvio>
sony_nc_notify rewritten (and placed near the other acpi callbacks), the
hotkey decoding code moved to a new function sony_nc_hotkeys_decode.
Signed-off-by: Marco Chiappero <marco@absence.it>
---
--- 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,41 @@ static int sony_nc_function_setup(unsign
return 0;
}
+static int sony_nc_hotkeys_decode(unsigned int handle)
+{
+ int ret = -EINVAL;
+ 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");
+ } 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;
@@ -1832,6 +1811,65 @@ static int sony_nc_handles_resume(void)
return 0;
}
+static void sony_nc_notify(struct acpi_device *device, u32 event)
+{
+ dprintk("sony_nc_notify, event: 0x%.2x\n", event);
+
+ /* handles related events */
+ if (event >= 0x90) {
+ unsigned int result = 0, handle = 0, value = 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 {
+ /* restore the original event for
+ the acpi bus notification */
+ value = event;
+ }
+
+ acpi_bus_generate_proc_event(sony_nc_acpi_device, 1,
+ value);
+
+ break;
+
+ case 0x0124:
+ case 0x0135:
+ sony_call_snc_handle(handle, 0x0100, &result);
+ result &= 0x03;
+ dprintk("sony_nc_notify, RFKILL event received "
+ "(reason: %s)\n", result == 1 ?
+ "switch state changed" : "battery");
+
+ if (result == 1) { /* hw swtich event */
+ sony_nc_rfkill_update();
+ }
+
+ break;
+
+ default:
+ 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 {
+ sony_laptop_report_input_event(event);
+ acpi_bus_generate_proc_event(sony_nc_acpi_device, 1, event);
+ }
+}
+
static int sony_nc_add(struct acpi_device *device)
{
acpi_status status;
next prev parent reply other threads:[~2011-09-09 16:53 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-09 16:20 [PATCH V2 0/14] miscellaneous code improvements for sony-laptop Marco Chiappero
2011-09-09 16:34 ` [PATCH V2 1/14] sony-laptop: fix potential improper handle usage Marco Chiappero
2011-09-09 16:39 ` [PATCH V2 2/14] sony-laptop: use usigned data type when calling ACPI methods Marco Chiappero
2011-09-09 16:41 ` [PATCH V2 3/14] sony-laptop: replace simple_strtoul with strict_strtoul Marco Chiappero
2011-09-09 16:45 ` [PATCH V2 4/14] sony-laptop: add new ACPI SN06 method helper functions Marco Chiappero
2011-09-09 16:47 ` [PATCH V2 5/14] sony-laptop: new SNC setup and cleanup functions Marco Chiappero
2011-09-09 16:49 ` [PATCH V2 6/14] sony-laptop: new sony_nc_handles_resume function Marco Chiappero
2011-09-09 16:51 ` [PATCH V2 7/14] sony-laptop: sony_nc_function_setup modifications Marco Chiappero
2011-09-09 16:53 ` Marco Chiappero [this message]
2011-09-09 16:54 ` [PATCH V2 9/14] sony-laptop: sony_walk_callback moved for better readability Marco Chiappero
2011-09-09 16:56 ` [PATCH V2 10/14] sony-laptop: code style fixes Marco Chiappero
2011-09-09 16:58 ` [PATCH V2 11/14] sony-laptop: keyboard backlight support extended to newer Vaios Marco Chiappero
2011-09-09 17:01 ` [PATCH V2 12/14] sony-laptop: rfkill improvements Marco Chiappero
2011-09-09 17:02 ` [PATCH V2 13/14] sony-laptop: input core improvements Marco Chiappero
2011-09-09 17:04 ` [PATCH V2 14/14] sony-laptop: Documentation changes Marco Chiappero
2011-09-10 4:03 ` [PATCH V2 0/14] miscellaneous code improvements for sony-laptop Mattia Dongili
2011-09-13 20:58 ` Marco Chiappero
2011-09-13 20:43 ` [PATCH V2 RESEND 1/14] sony-laptop: fix potential improper handle usage Marco Chiappero
2011-09-13 20:45 ` [PATCH V2 RESEND 2/14] sony-laptop: use usigned data type when calling ACPI methods Marco Chiappero
2011-09-13 20:45 ` [PATCH V2 RESEND 3/14] sony-laptop: replace simple_strtoul with strict_strtoul Marco Chiappero
2011-09-13 20:45 ` [PATCH V2 RESEND 4/14] sony-laptop: add new ACPI SN06 method helper functions Marco Chiappero
2011-09-13 20:46 ` [PATCH V2 RESEND 5/14] sony-laptop: new SNC setup and cleanup functions Marco Chiappero
2011-09-13 20:47 ` [PATCH V2 RESEND 6/14] sony-laptop: new sony_nc_handles_resume function Marco Chiappero
2011-09-13 20:47 ` [PATCH V2 RESEND 7/14] sony-laptop: sony_nc_function_setup modifications Marco Chiappero
2011-09-13 20:47 ` [PATCH V2 RESEND 8/14] sony-laptop: sony_nc_notify rewritten and improved Marco Chiappero
2011-09-13 20:47 ` [PATCH V2 RESEND 9/14] sony-laptop: sony_walk_callback moved for better readability Marco Chiappero
2011-09-13 20:47 ` [PATCH V2 RESEND 10/14] sony-laptop: code style fixes Marco Chiappero
2011-09-13 20:53 ` [PATCH V2 RESEND 11/14] sony-laptop: keyboard backlight support extended to newer Vaios Marco Chiappero
2011-09-13 20:53 ` [PATCH V2 RESEND 12/14] sony-laptop: rfkill improvements Marco Chiappero
2011-09-13 20:53 ` [PATCH V2 RESEND 13/14] sony-laptop: input core improvements Marco Chiappero
2011-09-13 20:53 ` [PATCH V2 RESEND 14/14] sony-laptop: documentation changes Marco Chiappero
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1315587210.3613.94.camel@vesuvio \
--to=marco@absence.it \
--cc=malattia@linux.it \
--cc=mjg59@srcf.ucam.org \
--cc=platform-driver-x86@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox