static void gb_wmi_notify(u32 value, void* context) { struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL }; union acpi_object* obj; acpi_status status; int code; status = wmi_get_event_data(value, &response); if (status != AE_OK) { pr_err("Bad event status 0x%x\n", status); return; } obj = (union acpi_object*)response.pointer; if (!obj) { pr_info("Could not get response pointer\n"); return; } if (obj->type == ACPI_TYPE_BUFFER) { int eventcode = obj->buffer.pointer[0]; struct key_entry* key = sparse_keymap_entry_from_scancode(gb_wmi_input_dev, eventcode); pr_info("Buffer received: %x %x \n", obj->buffer.length, obj->buffer.pointer[0], obj->buffer.pointer[1]); if (key) sparse_keymap_report_entry(gb_wmi_input_dev, key, 1, true); } else pr_info("Unknown event\n"); kfree(obj); }
static void dell_wmi_notify(u32 value, void *context) { struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL }; static struct key_entry *key; union acpi_object *obj; acpi_status status; status = wmi_get_event_data(value, &response); if (status != AE_OK) { printk(KERN_INFO "dell-wmi: bad event status 0x%x\n", status); return; } obj = (union acpi_object *)response.pointer; if (obj && obj->type == ACPI_TYPE_BUFFER) { int *buffer = (int *)obj->buffer.pointer; /* * The upper bytes of the event may contain * additional information, so mask them off for the * scancode lookup */ key = dell_wmi_get_entry_by_scancode(buffer[1] & 0xFFFF); if (key) { input_report_key(dell_wmi_input_dev, key->keycode, 1); input_sync(dell_wmi_input_dev); input_report_key(dell_wmi_input_dev, key->keycode, 0); input_sync(dell_wmi_input_dev); } else if (buffer[1] & 0xFFFF) printk(KERN_INFO "dell-wmi: Unknown key %x pressed\n", buffer[1] & 0xFFFF); } kfree(obj); }
static void msi_wmi_notify(u32 value, void *context) { struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL }; struct key_entry *key; union acpi_object *obj; acpi_status status; status = wmi_get_event_data(value, &response); if (status != AE_OK) { pr_info("bad event status 0x%x\n", status); return; } obj = (union acpi_object *)response.pointer; if (obj && obj->type == ACPI_TYPE_INTEGER) { int eventcode = obj->integer.value; pr_debug("Eventcode: 0x%x\n", eventcode); key = sparse_keymap_entry_from_scancode(msi_wmi_input_dev, eventcode); if (!key) { pr_info("Unknown key pressed - %x\n", eventcode); goto msi_wmi_notify_exit; } if (event_wmi->quirk_last_pressed) { ktime_t cur = ktime_get_real(); ktime_t diff = ktime_sub(cur, last_pressed); /* Ignore event if any event happened in a 50 ms timeframe -> Key press may result in 10-20 GPEs */ if (ktime_to_us(diff) < 1000 * 50) { pr_debug("Suppressed key event 0x%X - " "Last press was %lld us ago\n", key->code, ktime_to_us(diff)); goto msi_wmi_notify_exit; } last_pressed = cur; } if (key->type == KE_KEY && /* Brightness is served via acpi video driver */ (backlight || (key->code != MSI_KEY_BRIGHTNESSUP && key->code != MSI_KEY_BRIGHTNESSDOWN))) { pr_debug("Send key: 0x%X - Input layer keycode: %d\n", key->code, key->keycode); sparse_keymap_report_entry(msi_wmi_input_dev, key, 1, true); } } else pr_info("Unknown event received\n"); msi_wmi_notify_exit: kfree(response.pointer); }
static void msi_wmi_notify(u32 value, void *context) { struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL }; static struct key_entry *key; union acpi_object *obj; ktime_t cur; wmi_get_event_data(value, &response); obj = (union acpi_object *)response.pointer; if (obj && obj->type == ACPI_TYPE_INTEGER) { int eventcode = obj->integer.value; dprintk("Eventcode: 0x%x\n", eventcode); key = sparse_keymap_entry_from_scancode(msi_wmi_input_dev, eventcode); if (key) { ktime_t diff; cur = ktime_get_real(); diff = ktime_sub(cur, last_pressed[key->code - KEYCODE_BASE]); /* Ignore event if the same event happened in a 50 ms timeframe -> Key press may result in 10-20 GPEs */ if (ktime_to_us(diff) < 1000 * 50) { dprintk("Suppressed key event 0x%X - " "Last press was %lld us ago\n", key->code, ktime_to_us(diff)); return; } last_pressed[key->code - KEYCODE_BASE] = cur; if (key->type == KE_KEY && /* Brightness is served via acpi video driver */ (!acpi_video_backlight_support() || (key->code != MSI_WMI_BRIGHTNESSUP && key->code != MSI_WMI_BRIGHTNESSDOWN))) { dprintk("Send key: 0x%X - " "Input layer keycode: %d\n", key->code, key->keycode); sparse_keymap_report_entry(msi_wmi_input_dev, key, 1, true); } } else printk(KERN_INFO "Unknown key pressed - %x\n", eventcode); } else printk(KERN_INFO DRV_PFX "Unknown event received\n"); kfree(response.pointer); }
static void dell_wmi_notify(u32 value, void *context) { struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL }; static struct key_entry *key; union acpi_object *obj; acpi_status status; status = wmi_get_event_data(value, &response); if (status != AE_OK) { printk(KERN_INFO "dell-wmi: bad event status 0x%x\n", status); return; } obj = (union acpi_object *)response.pointer; if (obj && obj->type == ACPI_TYPE_BUFFER) { int reported_key; u16 *buffer_entry = (u16 *)obj->buffer.pointer; if (dell_new_hk_type && (buffer_entry[1] != 0x10)) { printk(KERN_INFO "dell-wmi: Received unknown WMI event" " (0x%x)\n", buffer_entry[1]); return; } if (dell_new_hk_type) reported_key = (int)buffer_entry[2]; else reported_key = (int)buffer_entry[1] & 0xffff; key = dell_wmi_get_entry_by_scancode(reported_key); if (!key) { printk(KERN_INFO "dell-wmi: Unknown key %x pressed\n", reported_key); } else if ((key->keycode == KEY_BRIGHTNESSUP || key->keycode == KEY_BRIGHTNESSDOWN) && acpi_video) { /* Don't report brightness notifications that will also * come via ACPI */ return; } else { input_report_key(dell_wmi_input_dev, key->keycode, 1); input_sync(dell_wmi_input_dev); input_report_key(dell_wmi_input_dev, key->keycode, 0); input_sync(dell_wmi_input_dev); } } kfree(obj); }
static void dell_wmi_aio_notify(u32 value, void *context) { struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL }; union acpi_object *obj; struct dell_wmi_event *event; acpi_status status; status = wmi_get_event_data(value, &response); if (status != AE_OK) { pr_info("bad event status 0x%x\n", status); return; } obj = (union acpi_object *)response.pointer; if (obj) { unsigned int scancode = 0; switch (obj->type) { case ACPI_TYPE_INTEGER: /* Most All-In-One correctly return integer scancode */ scancode = obj->integer.value; sparse_keymap_report_event(dell_wmi_aio_input_dev, scancode, 1, true); break; case ACPI_TYPE_BUFFER: if (dell_wmi_aio_event_check(obj->buffer.pointer, obj->buffer.length)) { event = (struct dell_wmi_event *) obj->buffer.pointer; scancode = event->event[0]; } else { /* Broken machines return the scancode in a buffer */ if (obj->buffer.pointer && obj->buffer.length > 0) scancode = obj->buffer.pointer[0]; } if (scancode) sparse_keymap_report_event( dell_wmi_aio_input_dev, scancode, 1, true); break; } } kfree(obj); }
static void toshiba_wmi_notify(u32 value, void *context) { struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL }; union acpi_object *obj; acpi_status status; status = wmi_get_event_data(value, &response); if (ACPI_FAILURE(status)) { pr_err("Bad event status 0x%x\n", status); return; } obj = (union acpi_object *)response.pointer; if (!obj) return; /* TODO: Add proper checks once we have data */ pr_debug("Unknown event received, obj type %x\n", obj->type); kfree(response.pointer); }
static void dell_wmi_notify(u32 value, void *context) { struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL }; static struct key_entry *key; union acpi_object *obj; wmi_get_event_data(value, &response); obj = (union acpi_object *)response.pointer; if (obj && obj->type == ACPI_TYPE_BUFFER) { int reported_key; u16 *buffer_entry = (u16 *)obj->buffer.pointer; if (dell_new_hk_type && (buffer_entry[1] != 0x10)) { printk(KERN_INFO "dell-wmi: Received unknown WMI event" " (0x%x)\n", buffer_entry[1]); return; } if (dell_new_hk_type) reported_key = (int)buffer_entry[2]; else reported_key = (int)buffer_entry[1] & 0xffff; key = dell_wmi_get_entry_by_scancode(reported_key); if (!key) { printk(KERN_INFO "dell-wmi: Unknown key %x pressed\n", reported_key); } else { input_report_key(dell_wmi_input_dev, key->keycode, 1); input_sync(dell_wmi_input_dev); input_report_key(dell_wmi_input_dev, key->keycode, 0); input_sync(dell_wmi_input_dev); } } }
static void eeepc_wmi_notify(u32 value, void *context) { struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL }; union acpi_object *obj; acpi_status status; int code; status = wmi_get_event_data(value, &response); if (status != AE_OK) { pr_err("bad event status 0x%x\n", status); return; } obj = (union acpi_object *)response.pointer; if (obj && obj->type == ACPI_TYPE_INTEGER) { code = obj->integer.value; printk("Codigo %d\n",code); // if (!sparse_keymap_report_event(eeepc_wmi_input_dev, code, 1, true)) // pr_info("Unknown key %x pressed\n", code); } kfree(obj); }
static void dell_wmi_aio_notify(u32 value, void *context) { struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL }; union acpi_object *obj; acpi_status status; status = wmi_get_event_data(value, &response); if (status != AE_OK) { pr_info("bad event status 0x%x\n", status); return; } obj = (union acpi_object *)response.pointer; if (obj) { unsigned int scancode; switch (obj->type) { case ACPI_TYPE_INTEGER: /* */ scancode = obj->integer.value; sparse_keymap_report_event(dell_wmi_aio_input_dev, scancode, 1, true); break; case ACPI_TYPE_BUFFER: /* */ if (obj->buffer.pointer && obj->buffer.length > 0) { scancode = obj->buffer.pointer[0]; sparse_keymap_report_event( dell_wmi_aio_input_dev, scancode, 1, true); } break; } } kfree(obj); }
static void hp_wmi_notify(u32 value, void *context) { struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL }; u32 event_id, event_data; union acpi_object *obj; acpi_status status; u32 *location; int key_code; status = wmi_get_event_data(value, &response); if (status != AE_OK) { pr_info("bad event status 0x%x\n", status); return; } obj = (union acpi_object *)response.pointer; if (!obj) return; if (obj->type != ACPI_TYPE_BUFFER) { pr_info("Unknown response received %d\n", obj->type); kfree(obj); return; } /* * Depending on ACPI version the concatenation of id and event data * inside _WED function will result in a 8 or 16 byte buffer. */ location = (u32 *)obj->buffer.pointer; if (obj->buffer.length == 8) { event_id = *location; event_data = *(location + 1); } else if (obj->buffer.length == 16) { event_id = *location; event_data = *(location + 2); } else { pr_info("Unknown buffer length %d\n", obj->buffer.length); kfree(obj); return; } kfree(obj); switch (event_id) { case HPWMI_DOCK_EVENT: if (test_bit(SW_DOCK, hp_wmi_input_dev->swbit)) input_report_switch(hp_wmi_input_dev, SW_DOCK, hp_wmi_hw_state(HPWMI_DOCK_MASK)); if (test_bit(SW_TABLET_MODE, hp_wmi_input_dev->swbit)) input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE, hp_wmi_hw_state(HPWMI_TABLET_MASK)); input_sync(hp_wmi_input_dev); break; case HPWMI_PARK_HDD: break; case HPWMI_SMART_ADAPTER: break; case HPWMI_BEZEL_BUTTON: key_code = hp_wmi_read_int(HPWMI_HOTKEY_QUERY); if (key_code < 0) break; if (!sparse_keymap_report_event(hp_wmi_input_dev, key_code, 1, true)) pr_info("Unknown key code - 0x%x\n", key_code); break; case HPWMI_WIRELESS: if (rfkill2_count) { hp_wmi_rfkill2_refresh(); break; } if (wifi_rfkill) rfkill_set_states(wifi_rfkill, hp_wmi_get_sw_state(HPWMI_WIFI), hp_wmi_get_hw_state(HPWMI_WIFI)); if (bluetooth_rfkill) rfkill_set_states(bluetooth_rfkill, hp_wmi_get_sw_state(HPWMI_BLUETOOTH), hp_wmi_get_hw_state(HPWMI_BLUETOOTH)); if (wwan_rfkill) rfkill_set_states(wwan_rfkill, hp_wmi_get_sw_state(HPWMI_WWAN), hp_wmi_get_hw_state(HPWMI_WWAN)); break; case HPWMI_CPU_BATTERY_THROTTLE: pr_info("Unimplemented CPU throttle because of 3 Cell battery event detected\n"); break; case HPWMI_LOCK_SWITCH: break; case HPWMI_LID_SWITCH: break; case HPWMI_SCREEN_ROTATION: break; case HPWMI_COOLSENSE_SYSTEM_MOBILE: break; case HPWMI_COOLSENSE_SYSTEM_HOT: break; case HPWMI_PROXIMITY_SENSOR: break; case HPWMI_BACKLIT_KB_BRIGHTNESS: break; case HPWMI_PEAKSHIFT_PERIOD: break; case HPWMI_BATTERY_CHARGE_PERIOD: break; default: pr_info("Unknown event_id - %d - 0x%x\n", event_id, event_data); break; } }