Lines Matching +full:fn +full:- +full:keymap
5 * Copyright (C) 2014-2015 Pali Rohár <pali.rohar@gmail.com>
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
35 #include <linux/input/sparse-keymap.h>
41 #include "dell-smbios.h"
42 #include "dell-wmi-descriptor.h"
49 #define DELL_EVENT_GUID "9DBB5994-A997-11DA-B012-B622A1EF5492"
87 * Keymap for WMI events of type 0x0000
172 * Originally Matthew Garrett created this dell-wmi driver specially for
203 struct dell_bios_keymap_entry keymap[]; member
210 struct key_entry *keymap; member
258 * Keymap for WMI events of type 0x0010
264 /* Fn-lock switched to function keys */
267 /* Fn-lock switched to multimedia keys */
273 /* Fn-lock */
280 * Radio disable (notify only -- there is no model for which the
291 * a notification. On the XPS 13 9350, this is Fn+F7, and there's
306 * Radio disable (notify only -- there is no model for which the
311 /* Fn-lock */
316 * Keymap for WMI events of type 0x0011
335 struct dell_wmi_priv *priv = dev_get_drvdata(&wdev->dev); in dell_wmi_process_key()
338 key = sparse_keymap_entry_from_scancode(priv->input_dev, in dell_wmi_process_key()
349 if ((key->keycode == KEY_BRIGHTNESSUP || in dell_wmi_process_key()
350 key->keycode == KEY_BRIGHTNESSDOWN) && in dell_wmi_process_key()
357 if (key->keycode == KEY_KBDILLUMTOGGLE) in dell_wmi_process_key()
361 sparse_keymap_report_entry(priv->input_dev, key, 1, true); in dell_wmi_process_key()
367 struct dell_wmi_priv *priv = dev_get_drvdata(&wdev->dev); in dell_wmi_notify()
372 if (obj->type != ACPI_TYPE_BUFFER) { in dell_wmi_notify()
373 pr_warn("bad response type %x\n", obj->type); in dell_wmi_notify()
378 obj->buffer.length, obj->buffer.pointer); in dell_wmi_notify()
380 buffer_entry = (u16 *)obj->buffer.pointer; in dell_wmi_notify()
381 buffer_size = obj->buffer.length/2; in dell_wmi_notify()
396 if (priv->interface_version == 0 && buffer_entry < buffer_end) in dell_wmi_notify()
440 static bool have_scancode(u32 scancode, const struct key_entry *keymap, int len) in have_scancode() argument
445 if (keymap[i].code == scancode) in have_scancode()
456 struct key_entry *keymap; in handle_dmi_entry() local
458 if (results->err || results->keymap) in handle_dmi_entry()
462 if (dm->type != 0xb2) in handle_dmi_entry()
467 hotkey_num = (table->header.length - in handle_dmi_entry()
472 * Historically, dell-wmi would ignore a DMI entry of in handle_dmi_entry()
481 keymap = kcalloc(hotkey_num, sizeof(struct key_entry), GFP_KERNEL); in handle_dmi_entry()
482 if (!keymap) { in handle_dmi_entry()
483 results->err = -ENOMEM; in handle_dmi_entry()
489 &table->keymap[i]; in handle_dmi_entry()
492 u16 keycode = (bios_entry->keycode < in handle_dmi_entry()
494 bios_to_linux_keycode[bios_entry->keycode] : in handle_dmi_entry()
504 bios_entry->scancode, bios_entry->keycode); in handle_dmi_entry()
509 keymap[pos].type = KE_IGNORE; in handle_dmi_entry()
511 keymap[pos].type = KE_KEY; in handle_dmi_entry()
512 keymap[pos].code = bios_entry->scancode; in handle_dmi_entry()
513 keymap[pos].keycode = keycode; in handle_dmi_entry()
518 results->keymap = keymap; in handle_dmi_entry()
519 results->keymap_size = pos; in handle_dmi_entry()
524 struct dell_wmi_priv *priv = dev_get_drvdata(&wdev->dev); in dell_wmi_input_setup()
526 struct key_entry *keymap; in dell_wmi_input_setup() local
529 priv->input_dev = input_allocate_device(); in dell_wmi_input_setup()
530 if (!priv->input_dev) in dell_wmi_input_setup()
531 return -ENOMEM; in dell_wmi_input_setup()
533 priv->input_dev->name = "Dell WMI hotkeys"; in dell_wmi_input_setup()
534 priv->input_dev->id.bustype = BUS_HOST; in dell_wmi_input_setup()
535 priv->input_dev->dev.parent = &wdev->dev; in dell_wmi_input_setup()
539 * Historically, dell-wmi ignored dmi_walk errors. A failure in dell_wmi_input_setup()
543 pr_warn("no DMI; using the old-style hotkey interface\n"); in dell_wmi_input_setup()
551 keymap = kcalloc(dmi_results.keymap_size + in dell_wmi_input_setup()
557 if (!keymap) { in dell_wmi_input_setup()
558 kfree(dmi_results.keymap); in dell_wmi_input_setup()
559 err = -ENOMEM; in dell_wmi_input_setup()
565 keymap[pos] = dmi_results.keymap[i]; in dell_wmi_input_setup()
566 keymap[pos].code |= (0x0010 << 16); in dell_wmi_input_setup()
570 kfree(dmi_results.keymap); in dell_wmi_input_setup()
582 have_scancode(entry->code | (0x0010 << 16), in dell_wmi_input_setup()
583 keymap, dmi_results.keymap_size) in dell_wmi_input_setup()
587 keymap[pos] = *entry; in dell_wmi_input_setup()
588 keymap[pos].code |= (0x0010 << 16); in dell_wmi_input_setup()
594 keymap[pos] = dell_wmi_keymap_type_0011[i]; in dell_wmi_input_setup()
595 keymap[pos].code |= (0x0011 << 16); in dell_wmi_input_setup()
604 keymap[pos] = dell_wmi_keymap_type_0000[i]; in dell_wmi_input_setup()
608 keymap[pos].type = KE_END; in dell_wmi_input_setup()
610 err = sparse_keymap_setup(priv->input_dev, keymap, NULL); in dell_wmi_input_setup()
612 * Sparse keymap library makes a copy of keymap so we don't need the in dell_wmi_input_setup()
615 kfree(keymap); in dell_wmi_input_setup()
619 err = input_register_device(priv->input_dev); in dell_wmi_input_setup()
626 input_free_device(priv->input_dev); in dell_wmi_input_setup()
632 struct dell_wmi_priv *priv = dev_get_drvdata(&wdev->dev); in dell_wmi_input_destroy()
634 input_unregister_device(priv->input_dev); in dell_wmi_input_destroy()
650 * cbRes1 Standard return codes (0, -1, -2)
660 return -ENOMEM; in dell_wmi_events_set_enabled()
661 buffer->cmd_class = CLASS_INFO; in dell_wmi_events_set_enabled()
662 buffer->cmd_select = SELECT_APP_REGISTRATION; in dell_wmi_events_set_enabled()
663 buffer->input[0] = 0x10000; in dell_wmi_events_set_enabled()
664 buffer->input[1] = 0x51534554; in dell_wmi_events_set_enabled()
665 buffer->input[3] = enable; in dell_wmi_events_set_enabled()
668 ret = buffer->output[0]; in dell_wmi_events_set_enabled()
684 &wdev->dev, sizeof(struct dell_wmi_priv), GFP_KERNEL); in dell_wmi_probe()
686 return -ENOMEM; in dell_wmi_probe()
687 dev_set_drvdata(&wdev->dev, priv); in dell_wmi_probe()
689 if (!dell_wmi_get_interface_version(&priv->interface_version)) in dell_wmi_probe()
690 return -EPROBE_DEFER; in dell_wmi_probe()
707 .name = "dell-wmi",