Lines Matching +full:key +full:- +full:code
1 // SPDX-License-Identifier: GPL-2.0-or-later
6 * Copyright (C) 2014-2015 Pali Rohár <pali@kernel.org>
22 #include <linux/input/sparse-keymap.h>
28 #include "dell-smbios.h"
29 #include "dell-wmi-descriptor.h"
30 #include "dell-wmi-privacy.h"
37 #define DELL_EVENT_GUID "9DBB5994-A997-11DA-B012-B622A1EF5492"
82 /* Key code is followed by brightness level */
89 /* Radio devices state change, key code is followed by other values */
94 /* Key code is followed by: next, active and attached devices */
97 /* Key code is followed by keyboard illumination level */
117 /* Untested, Dell Instant Launch key on Inspiron 7520 */
120 /* Dell Instant Launch key */
123 /* Audio panel key */
126 /* LCD Display On/Off Control key */
129 /* Untested, Multimedia key on Dell Vostro 3560 */
132 /* Dell Instant Launch key */
158 * Originally Matthew Garrett created this dell-wmi driver specially for
159 * "button with a picture of a battery" which has event code 0xe045.
160 * Later Mario Limonciello from Dell told us that event code 0xe045 is
161 * reported by Num Lock and should be ignored because key is send also
164 * Num Lock key press.
174 /* Dell Support Center key */
250 /* Fn-lock switched to function keys */
253 /* Fn-lock switched to multimedia keys */
266 /* Fn-lock */
273 * Radio disable (notify only -- there is no model for which the
299 * Radio disable (notify only -- there is no model for which the
304 /* Fn-lock */
343 /* Fn-lock button pressed */
347 static void dell_wmi_process_key(struct wmi_device *wdev, int type, int code) in dell_wmi_process_key() argument
349 struct dell_wmi_priv *priv = dev_get_drvdata(&wdev->dev); in dell_wmi_process_key()
350 const struct key_entry *key; in dell_wmi_process_key() local
352 key = sparse_keymap_entry_from_scancode(priv->input_dev, in dell_wmi_process_key()
353 (type << 16) | code); in dell_wmi_process_key()
354 if (!key) { in dell_wmi_process_key()
355 pr_info("Unknown key with type 0x%04x and code 0x%04x pressed\n", in dell_wmi_process_key()
356 type, code); in dell_wmi_process_key()
360 pr_debug("Key with type 0x%04x and code 0x%04x pressed\n", type, code); in dell_wmi_process_key()
363 if ((key->keycode == KEY_BRIGHTNESSUP || in dell_wmi_process_key()
364 key->keycode == KEY_BRIGHTNESSDOWN) && in dell_wmi_process_key()
368 if (type == 0x0000 && code == 0xe025 && !wmi_requires_smbios_request) in dell_wmi_process_key()
371 if (key->keycode == KEY_KBDILLUMTOGGLE) in dell_wmi_process_key()
375 sparse_keymap_report_entry(priv->input_dev, key, 1, true); in dell_wmi_process_key()
381 struct dell_wmi_priv *priv = dev_get_drvdata(&wdev->dev); in dell_wmi_notify()
386 if (obj->type != ACPI_TYPE_BUFFER) { in dell_wmi_notify()
387 pr_warn("bad response type %x\n", obj->type); in dell_wmi_notify()
392 obj->buffer.length, obj->buffer.pointer); in dell_wmi_notify()
394 buffer_entry = (u16 *)obj->buffer.pointer; in dell_wmi_notify()
395 buffer_size = obj->buffer.length/2; in dell_wmi_notify()
410 if (priv->interface_version == 0 && buffer_entry < buffer_end) in dell_wmi_notify()
430 case 0x0000: /* One key pressed or event occurred */ in dell_wmi_notify()
466 if (keymap[i].code == scancode) in have_scancode()
479 if (results->err || results->keymap) in handle_dmi_entry()
483 if (dm->type != 0xb2) in handle_dmi_entry()
488 hotkey_num = (table->header.length - in handle_dmi_entry()
493 * Historically, dell-wmi would ignore a DMI entry of in handle_dmi_entry()
504 results->err = -ENOMEM; in handle_dmi_entry()
510 &table->keymap[i]; in handle_dmi_entry()
513 u16 keycode = (bios_entry->keycode < in handle_dmi_entry()
515 bios_to_linux_keycode[bios_entry->keycode] : in handle_dmi_entry()
516 (bios_entry->keycode == 0xffff ? KEY_UNKNOWN : KEY_RESERVED); in handle_dmi_entry()
525 bios_entry->scancode, bios_entry->keycode); in handle_dmi_entry()
533 keymap[pos].code = bios_entry->scancode; in handle_dmi_entry()
539 results->keymap = keymap; in handle_dmi_entry()
540 results->keymap_size = pos; in handle_dmi_entry()
545 struct dell_wmi_priv *priv = dev_get_drvdata(&wdev->dev); in dell_wmi_input_setup()
550 priv->input_dev = input_allocate_device(); in dell_wmi_input_setup()
551 if (!priv->input_dev) in dell_wmi_input_setup()
552 return -ENOMEM; in dell_wmi_input_setup()
554 priv->input_dev->name = "Dell WMI hotkeys"; in dell_wmi_input_setup()
555 priv->input_dev->id.bustype = BUS_HOST; in dell_wmi_input_setup()
556 priv->input_dev->dev.parent = &wdev->dev; in dell_wmi_input_setup()
560 * Historically, dell-wmi ignored dmi_walk errors. A failure in dell_wmi_input_setup()
564 pr_warn("no DMI; using the old-style hotkey interface\n"); in dell_wmi_input_setup()
581 err = -ENOMEM; in dell_wmi_input_setup()
588 keymap[pos].code |= (0x0010 << 16); in dell_wmi_input_setup()
604 have_scancode(entry->code | (0x0010 << 16), in dell_wmi_input_setup()
610 keymap[pos].code |= (0x0010 << 16); in dell_wmi_input_setup()
617 keymap[pos].code |= (0x0011 << 16); in dell_wmi_input_setup()
624 keymap[pos].code |= (0x0012 << 16); in dell_wmi_input_setup()
639 err = sparse_keymap_setup(priv->input_dev, keymap, NULL); in dell_wmi_input_setup()
648 err = input_register_device(priv->input_dev); in dell_wmi_input_setup()
655 input_free_device(priv->input_dev); in dell_wmi_input_setup()
661 struct dell_wmi_priv *priv = dev_get_drvdata(&wdev->dev); in dell_wmi_input_destroy()
663 input_unregister_device(priv->input_dev); in dell_wmi_input_destroy()
679 * cbRes1 Standard return codes (0, -1, -2)
689 return -ENOMEM; in dell_wmi_events_set_enabled()
690 buffer->cmd_class = CLASS_INFO; in dell_wmi_events_set_enabled()
691 buffer->cmd_select = SELECT_APP_REGISTRATION; in dell_wmi_events_set_enabled()
692 buffer->input[0] = 0x10000; in dell_wmi_events_set_enabled()
693 buffer->input[1] = 0x51534554; in dell_wmi_events_set_enabled()
694 buffer->input[3] = enable; in dell_wmi_events_set_enabled()
697 ret = buffer->output[0]; in dell_wmi_events_set_enabled()
713 &wdev->dev, sizeof(struct dell_wmi_priv), GFP_KERNEL); in dell_wmi_probe()
715 return -ENOMEM; in dell_wmi_probe()
716 dev_set_drvdata(&wdev->dev, priv); in dell_wmi_probe()
718 if (!dell_wmi_get_interface_version(&priv->interface_version)) in dell_wmi_probe()
719 return -EPROBE_DEFER; in dell_wmi_probe()
735 .name = "dell-wmi",