diff options
| author | Maxim Mikityanskiy <maxtram95@gmail.com> | 2012-12-15 12:31:35 -0500 |
|---|---|---|
| committer | Matthew Garrett <matthew.garrett@nebula.com> | 2013-02-24 17:49:54 -0500 |
| commit | fedda8e7385f5fb01acb8897beca90b6256fc7bd (patch) | |
| tree | bd55b0a7c575f910b2d3cff577ecf86969434ee8 /drivers | |
| parent | da8506288fc4b2cc62d0ba477c2fe2a16f8891b0 (diff) | |
msi-wmi: Introduced quirk_last_pressed
Introduced quirk_last_pressed variable that would indicate if
last_pressed is used or not. Also converted last_pressed to simple
variable in order to allow keymap to be non-contiguous.
Signed-off-by: Maxim Mikityanskiy <maxtram95@gmail.com>
Signed-off-by: Matthew Garrett <matthew.garrett@nebula.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/platform/x86/msi-wmi.c | 54 |
1 files changed, 28 insertions, 26 deletions
diff --git a/drivers/platform/x86/msi-wmi.c b/drivers/platform/x86/msi-wmi.c index 3a6061985e4d..739bd4d17c23 100644 --- a/drivers/platform/x86/msi-wmi.c +++ b/drivers/platform/x86/msi-wmi.c | |||
| @@ -43,8 +43,7 @@ MODULE_ALIAS("wmi:" MSIWMI_BIOS_GUID); | |||
| 43 | MODULE_ALIAS("wmi:" MSIWMI_EVENT_GUID); | 43 | MODULE_ALIAS("wmi:" MSIWMI_EVENT_GUID); |
| 44 | 44 | ||
| 45 | enum msi_scancodes { | 45 | enum msi_scancodes { |
| 46 | MSI_SCANCODE_BASE = 0xD0, | 46 | MSI_KEY_BRIGHTNESSUP = 0xD0, |
| 47 | MSI_KEY_BRIGHTNESSUP = MSI_SCANCODE_BASE, | ||
| 48 | MSI_KEY_BRIGHTNESSDOWN, | 47 | MSI_KEY_BRIGHTNESSDOWN, |
| 49 | MSI_KEY_VOLUMEUP, | 48 | MSI_KEY_VOLUMEUP, |
| 50 | MSI_KEY_VOLUMEDOWN, | 49 | MSI_KEY_VOLUMEDOWN, |
| @@ -58,7 +57,9 @@ static struct key_entry msi_wmi_keymap[] = { | |||
| 58 | { KE_KEY, MSI_KEY_MUTE, {KEY_MUTE} }, | 57 | { KE_KEY, MSI_KEY_MUTE, {KEY_MUTE} }, |
| 59 | { KE_END, 0 } | 58 | { KE_END, 0 } |
| 60 | }; | 59 | }; |
| 61 | static ktime_t last_pressed[ARRAY_SIZE(msi_wmi_keymap) - 1]; | 60 | |
| 61 | static ktime_t last_pressed; | ||
| 62 | static bool quirk_last_pressed; | ||
| 62 | 63 | ||
| 63 | static const char *event_wmi_guid; | 64 | static const char *event_wmi_guid; |
| 64 | 65 | ||
| @@ -153,7 +154,6 @@ static void msi_wmi_notify(u32 value, void *context) | |||
| 153 | struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL }; | 154 | struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL }; |
| 154 | static struct key_entry *key; | 155 | static struct key_entry *key; |
| 155 | union acpi_object *obj; | 156 | union acpi_object *obj; |
| 156 | ktime_t cur; | ||
| 157 | acpi_status status; | 157 | acpi_status status; |
| 158 | 158 | ||
| 159 | status = wmi_get_event_data(value, &response); | 159 | status = wmi_get_event_data(value, &response); |
| @@ -169,12 +169,15 @@ static void msi_wmi_notify(u32 value, void *context) | |||
| 169 | pr_debug("Eventcode: 0x%x\n", eventcode); | 169 | pr_debug("Eventcode: 0x%x\n", eventcode); |
| 170 | key = sparse_keymap_entry_from_scancode(msi_wmi_input_dev, | 170 | key = sparse_keymap_entry_from_scancode(msi_wmi_input_dev, |
| 171 | eventcode); | 171 | eventcode); |
| 172 | if (key) { | 172 | if (!key) { |
| 173 | ktime_t diff; | 173 | pr_info("Unknown key pressed - %x\n", eventcode); |
| 174 | cur = ktime_get_real(); | 174 | goto msi_wmi_notify_exit; |
| 175 | diff = ktime_sub(cur, last_pressed[key->code - | 175 | } |
| 176 | MSI_SCANCODE_BASE]); | 176 | |
| 177 | /* Ignore event if the same event happened in a 50 ms | 177 | if (quirk_last_pressed) { |
| 178 | ktime_t cur = ktime_get_real(); | ||
| 179 | ktime_t diff = ktime_sub(cur, last_pressed); | ||
| 180 | /* Ignore event if any event happened in a 50 ms | ||
| 178 | timeframe -> Key press may result in 10-20 GPEs */ | 181 | timeframe -> Key press may result in 10-20 GPEs */ |
| 179 | if (ktime_to_us(diff) < 1000 * 50) { | 182 | if (ktime_to_us(diff) < 1000 * 50) { |
| 180 | pr_debug("Suppressed key event 0x%X - " | 183 | pr_debug("Suppressed key event 0x%X - " |
| @@ -182,21 +185,19 @@ static void msi_wmi_notify(u32 value, void *context) | |||
| 182 | key->code, ktime_to_us(diff)); | 185 | key->code, ktime_to_us(diff)); |
| 183 | goto msi_wmi_notify_exit; | 186 | goto msi_wmi_notify_exit; |
| 184 | } | 187 | } |
| 185 | last_pressed[key->code - MSI_SCANCODE_BASE] = cur; | 188 | last_pressed = cur; |
| 186 | 189 | } | |
| 187 | if (key->type == KE_KEY && | 190 | |
| 188 | /* Brightness is served via acpi video driver */ | 191 | if (key->type == KE_KEY && |
| 189 | (backlight || | 192 | /* Brightness is served via acpi video driver */ |
| 190 | (key->code != MSI_KEY_BRIGHTNESSUP && | 193 | (backlight || |
| 191 | key->code != MSI_KEY_BRIGHTNESSDOWN))) { | 194 | (key->code != MSI_KEY_BRIGHTNESSUP && |
| 192 | pr_debug("Send key: 0x%X - " | 195 | key->code != MSI_KEY_BRIGHTNESSDOWN))) { |
| 193 | "Input layer keycode: %d\n", | 196 | pr_debug("Send key: 0x%X - Input layer keycode: %d\n", |
| 194 | key->code, key->keycode); | 197 | key->code, key->keycode); |
| 195 | sparse_keymap_report_entry(msi_wmi_input_dev, | 198 | sparse_keymap_report_entry(msi_wmi_input_dev, key, 1, |
| 196 | key, 1, true); | 199 | true); |
| 197 | } | 200 | } |
| 198 | } else | ||
| 199 | pr_info("Unknown key pressed - %x\n", eventcode); | ||
| 200 | } else | 201 | } else |
| 201 | pr_info("Unknown event received\n"); | 202 | pr_info("Unknown event received\n"); |
| 202 | 203 | ||
| @@ -250,7 +251,7 @@ static int __init msi_wmi_input_setup(void) | |||
| 250 | if (err) | 251 | if (err) |
| 251 | goto err_free_keymap; | 252 | goto err_free_keymap; |
| 252 | 253 | ||
| 253 | memset(last_pressed, 0, sizeof(last_pressed)); | 254 | last_pressed = ktime_set(0, 0); |
| 254 | 255 | ||
| 255 | return 0; | 256 | return 0; |
| 256 | 257 | ||
| @@ -281,6 +282,7 @@ static int __init msi_wmi_init(void) | |||
| 281 | 282 | ||
| 282 | pr_debug("Event handler installed\n"); | 283 | pr_debug("Event handler installed\n"); |
| 283 | event_wmi_guid = MSIWMI_EVENT_GUID; | 284 | event_wmi_guid = MSIWMI_EVENT_GUID; |
| 285 | quirk_last_pressed = true; | ||
| 284 | } | 286 | } |
| 285 | 287 | ||
| 286 | if (wmi_has_guid(MSIWMI_BIOS_GUID) && !acpi_video_backlight_support()) { | 288 | if (wmi_has_guid(MSIWMI_BIOS_GUID) && !acpi_video_backlight_support()) { |
