Receive all pending hot key events at once from a single notification, and
don't complain if the queue is empty.
Signed-off-by: Henrique de Moraes Holschuh <[EMAIL PROTECTED]>
---
drivers/misc/thinkpad_acpi.c | 52 ++++++++++++++++++++++++++++-------------
1 files changed, 35 insertions(+), 17 deletions(-)
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c
index 9a61140..de415fe 100644
--- a/drivers/misc/thinkpad_acpi.c
+++ b/drivers/misc/thinkpad_acpi.c
@@ -1196,9 +1196,31 @@ static void hotkey_notify(struct ibm_struct *ibm, u32
event)
{
u32 hkey;
unsigned int keycode, scancode;
- int send_acpi_ev = 0;
+ int send_acpi_ev;
+
+ if (event != 0x80) {
+ printk(IBM_ERR "unknown hotkey notification event %d\n", event);
+ /* forward it to userspace, maybe it knows how to handle it */
+ acpi_bus_generate_proc_event(ibm->acpi->device, event, 0);
+
acpi_bus_generate_netlink_event(ibm->acpi->device->pnp.device_class,
+ ibm->acpi->device->dev.bus_id,
+ event, 0);
+ return;
+ }
+
+ while (1) {
+ if (!acpi_evalf(hkey_handle, &hkey, "MHKP", "d")) {
+ printk(IBM_ERR "failed to retrieve hot key event\n");
+ return;
+ }
+
+ if (hkey == 0) {
+ /* queue empty */
+ return;
+ }
+
+ send_acpi_ev = 0;
- if (event == 0x80 && acpi_evalf(hkey_handle, &hkey, "MHKP", "d")) {
switch (hkey >> 12) {
case 1:
/* 0x1000-0x1FFF: key presses */
@@ -1220,8 +1242,8 @@ static void hotkey_notify(struct ibm_struct *ibm, u32
event)
* eat up known LID events */
if (hkey != 0x5001 && hkey != 0x5002) {
printk(IBM_ERR
- "unknown LID-related hotkey event:
0x%04x\n",
- hkey);
+ "unknown LID-related hotkey event:
0x%04x\n",
+ hkey);
send_acpi_ev = 1;
}
break;
@@ -1240,21 +1262,17 @@ static void hotkey_notify(struct ibm_struct *ibm, u32
event)
printk(IBM_NOTICE "unhandled HKEY event 0x%04x\n",
hkey);
send_acpi_ev = 1;
}
- } else {
- printk(IBM_ERR "unknown hotkey notification event %d\n", event);
- hkey = 0;
- send_acpi_ev = 1;
- }
- /* Legacy events */
- if (send_acpi_ev || hotkey_report_mode < 2)
- acpi_bus_generate_proc_event(ibm->acpi->device, event, hkey);
+ /* Legacy events */
+ if (send_acpi_ev || hotkey_report_mode < 2)
+ acpi_bus_generate_proc_event(ibm->acpi->device, event,
hkey);
- /* netlink events */
- if (send_acpi_ev) {
-
acpi_bus_generate_netlink_event(ibm->acpi->device->pnp.device_class,
- ibm->acpi->device->dev.bus_id,
- event, hkey);
+ /* netlink events */
+ if (send_acpi_ev) {
+
acpi_bus_generate_netlink_event(ibm->acpi->device->pnp.device_class,
+
ibm->acpi->device->dev.bus_id,
+ event, hkey);
+ }
}
}
--
1.5.3.1
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
ibm-acpi-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ibm-acpi-devel