提交 3eea123d 编写于 作者: H Henrique de Moraes Holschuh 提交者: Len Brown

ACPI: thinkpad-acpi: dequeue all pending hot key events at once (v2.2)

Receive all pending HKEY events at once from a single notification, and don't
complain if the queue is empty.
Signed-off-by: NHenrique de Moraes Holschuh <hmh@hmh.eng.br>
Signed-off-by: NLen Brown <len.brown@intel.com>
上级 1b6521dc
...@@ -1196,9 +1196,30 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event) ...@@ -1196,9 +1196,30 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event)
{ {
u32 hkey; u32 hkey;
unsigned int keycode, scancode; unsigned int keycode, scancode;
int send_acpi_ev = 0; int send_acpi_ev;
if (event != 0x80) {
printk(IBM_ERR "unknown HKEY notification event %d\n", event);
/* forward it to userspace, maybe it knows how to handle it */
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 HKEY 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) { switch (hkey >> 12) {
case 1: case 1:
/* 0x1000-0x1FFF: key presses */ /* 0x1000-0x1FFF: key presses */
...@@ -1220,8 +1241,8 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event) ...@@ -1220,8 +1241,8 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event)
* eat up known LID events */ * eat up known LID events */
if (hkey != 0x5001 && hkey != 0x5002) { if (hkey != 0x5001 && hkey != 0x5002) {
printk(IBM_ERR printk(IBM_ERR
"unknown LID-related hotkey event: 0x%04x\n", "unknown LID-related HKEY event: 0x%04x\n",
hkey); hkey);
send_acpi_ev = 1; send_acpi_ev = 1;
} }
break; break;
...@@ -1240,21 +1261,17 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event) ...@@ -1240,21 +1261,17 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event)
printk(IBM_NOTICE "unhandled HKEY event 0x%04x\n", hkey); printk(IBM_NOTICE "unhandled HKEY event 0x%04x\n", hkey);
send_acpi_ev = 1; send_acpi_ev = 1;
} }
} else {
printk(IBM_ERR "unknown hotkey notification event %d\n", event);
hkey = 0;
send_acpi_ev = 1;
}
/* Legacy events */ /* Legacy events */
if (send_acpi_ev || hotkey_report_mode < 2) if (send_acpi_ev || hotkey_report_mode < 2)
acpi_bus_generate_proc_event(ibm->acpi->device, event, hkey); acpi_bus_generate_proc_event(ibm->acpi->device, event, hkey);
/* netlink events */ /* netlink events */
if (send_acpi_ev) { if (send_acpi_ev) {
acpi_bus_generate_netlink_event(ibm->acpi->device->pnp.device_class, acpi_bus_generate_netlink_event(ibm->acpi->device->pnp.device_class,
ibm->acpi->device->dev.bus_id, ibm->acpi->device->dev.bus_id,
event, hkey); event, hkey);
}
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册