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()) { |