diff options
| -rw-r--r-- | drivers/misc/thinkpad_acpi.c | 51 |
1 files changed, 34 insertions, 17 deletions
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c index 9a611402ee9d..3efe81b1b73c 100644 --- a/drivers/misc/thinkpad_acpi.c +++ b/drivers/misc/thinkpad_acpi.c | |||
| @@ -1196,9 +1196,30 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event) | |||
| 1196 | { | 1196 | { |
| 1197 | u32 hkey; | 1197 | u32 hkey; |
| 1198 | unsigned int keycode, scancode; | 1198 | unsigned int keycode, scancode; |
| 1199 | int send_acpi_ev = 0; | 1199 | int send_acpi_ev; |
| 1200 | |||
| 1201 | if (event != 0x80) { | ||
| 1202 | printk(IBM_ERR "unknown HKEY notification event %d\n", event); | ||
| 1203 | /* forward it to userspace, maybe it knows how to handle it */ | ||
| 1204 | acpi_bus_generate_netlink_event(ibm->acpi->device->pnp.device_class, | ||
| 1205 | ibm->acpi->device->dev.bus_id, | ||
| 1206 | event, 0); | ||
| 1207 | return; | ||
| 1208 | } | ||
| 1209 | |||
| 1210 | while (1) { | ||
| 1211 | if (!acpi_evalf(hkey_handle, &hkey, "MHKP", "d")) { | ||
| 1212 | printk(IBM_ERR "failed to retrieve HKEY event\n"); | ||
| 1213 | return; | ||
| 1214 | } | ||
| 1215 | |||
| 1216 | if (hkey == 0) { | ||
| 1217 | /* queue empty */ | ||
| 1218 | return; | ||
| 1219 | } | ||
| 1220 | |||
| 1221 | send_acpi_ev = 0; | ||
| 1200 | 1222 | ||
| 1201 | if (event == 0x80 && acpi_evalf(hkey_handle, &hkey, "MHKP", "d")) { | ||
| 1202 | switch (hkey >> 12) { | 1223 | switch (hkey >> 12) { |
| 1203 | case 1: | 1224 | case 1: |
| 1204 | /* 0x1000-0x1FFF: key presses */ | 1225 | /* 0x1000-0x1FFF: key presses */ |
| @@ -1220,8 +1241,8 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event) | |||
| 1220 | * eat up known LID events */ | 1241 | * eat up known LID events */ |
| 1221 | if (hkey != 0x5001 && hkey != 0x5002) { | 1242 | if (hkey != 0x5001 && hkey != 0x5002) { |
| 1222 | printk(IBM_ERR | 1243 | printk(IBM_ERR |
| 1223 | "unknown LID-related hotkey event: 0x%04x\n", | 1244 | "unknown LID-related HKEY event: 0x%04x\n", |
| 1224 | hkey); | 1245 | hkey); |
| 1225 | send_acpi_ev = 1; | 1246 | send_acpi_ev = 1; |
| 1226 | } | 1247 | } |
| 1227 | break; | 1248 | break; |
| @@ -1240,21 +1261,17 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event) | |||
| 1240 | printk(IBM_NOTICE "unhandled HKEY event 0x%04x\n", hkey); | 1261 | printk(IBM_NOTICE "unhandled HKEY event 0x%04x\n", hkey); |
| 1241 | send_acpi_ev = 1; | 1262 | send_acpi_ev = 1; |
| 1242 | } | 1263 | } |
| 1243 | } else { | ||
| 1244 | printk(IBM_ERR "unknown hotkey notification event %d\n", event); | ||
| 1245 | hkey = 0; | ||
| 1246 | send_acpi_ev = 1; | ||
| 1247 | } | ||
| 1248 | 1264 | ||
| 1249 | /* Legacy events */ | 1265 | /* Legacy events */ |
| 1250 | if (send_acpi_ev || hotkey_report_mode < 2) | 1266 | if (send_acpi_ev || hotkey_report_mode < 2) |
| 1251 | acpi_bus_generate_proc_event(ibm->acpi->device, event, hkey); | 1267 | acpi_bus_generate_proc_event(ibm->acpi->device, event, hkey); |
| 1252 | 1268 | ||
| 1253 | /* netlink events */ | 1269 | /* netlink events */ |
| 1254 | if (send_acpi_ev) { | 1270 | if (send_acpi_ev) { |
| 1255 | acpi_bus_generate_netlink_event(ibm->acpi->device->pnp.device_class, | 1271 | acpi_bus_generate_netlink_event(ibm->acpi->device->pnp.device_class, |
| 1256 | ibm->acpi->device->dev.bus_id, | 1272 | ibm->acpi->device->dev.bus_id, |
| 1257 | event, hkey); | 1273 | event, hkey); |
| 1274 | } | ||
| 1258 | } | 1275 | } |
| 1259 | } | 1276 | } |
| 1260 | 1277 | ||
