^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Generic support for sparse keymaps
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2009 Dmitry Torokhov
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Derived from wistron button driver:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Copyright (C) 2005 Miloslav Trmac <mitr@volny.cz>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Copyright (C) 2005 Bernhard Rosenkraenzer <bero@arklinux.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Copyright (C) 2005 Dmitry Torokhov <dtor@mail.ru>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/input.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/input/sparse-keymap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) MODULE_AUTHOR("Dmitry Torokhov <dtor@mail.ru>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) MODULE_DESCRIPTION("Generic support for sparse keymaps");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) MODULE_LICENSE("GPL v2");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) static unsigned int sparse_keymap_get_key_index(struct input_dev *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) const struct key_entry *k)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) struct key_entry *key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) unsigned int idx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) for (key = dev->keycode; key->type != KE_END; key++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) if (key->type == KE_KEY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) if (key == k)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) idx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) return idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) static struct key_entry *sparse_keymap_entry_by_index(struct input_dev *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) unsigned int index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) struct key_entry *key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) unsigned int key_cnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) for (key = dev->keycode; key->type != KE_END; key++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) if (key->type == KE_KEY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) if (key_cnt++ == index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) return key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) * sparse_keymap_entry_from_scancode - perform sparse keymap lookup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) * @dev: Input device using sparse keymap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * @code: Scan code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * This function is used to perform &struct key_entry lookup in an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * input device using sparse keymap.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) struct key_entry *sparse_keymap_entry_from_scancode(struct input_dev *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) unsigned int code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct key_entry *key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) for (key = dev->keycode; key->type != KE_END; key++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) if (code == key->code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) return key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) EXPORT_SYMBOL(sparse_keymap_entry_from_scancode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * sparse_keymap_entry_from_keycode - perform sparse keymap lookup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * @dev: Input device using sparse keymap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * @keycode: Key code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) * This function is used to perform &struct key_entry lookup in an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) * input device using sparse keymap.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) struct key_entry *sparse_keymap_entry_from_keycode(struct input_dev *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) unsigned int keycode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) struct key_entry *key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) for (key = dev->keycode; key->type != KE_END; key++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) if (key->type == KE_KEY && keycode == key->keycode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) return key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) EXPORT_SYMBOL(sparse_keymap_entry_from_keycode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) static struct key_entry *sparse_keymap_locate(struct input_dev *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) const struct input_keymap_entry *ke)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) struct key_entry *key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) unsigned int scancode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) if (ke->flags & INPUT_KEYMAP_BY_INDEX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) key = sparse_keymap_entry_by_index(dev, ke->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) else if (input_scancode_to_scalar(ke, &scancode) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) key = sparse_keymap_entry_from_scancode(dev, scancode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) key = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) return key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) static int sparse_keymap_getkeycode(struct input_dev *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) struct input_keymap_entry *ke)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) const struct key_entry *key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) if (dev->keycode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) key = sparse_keymap_locate(dev, ke);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) if (key && key->type == KE_KEY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) ke->keycode = key->keycode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) if (!(ke->flags & INPUT_KEYMAP_BY_INDEX))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) ke->index =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) sparse_keymap_get_key_index(dev, key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) ke->len = sizeof(key->code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) memcpy(ke->scancode, &key->code, sizeof(key->code));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) static int sparse_keymap_setkeycode(struct input_dev *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) const struct input_keymap_entry *ke,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) unsigned int *old_keycode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) struct key_entry *key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) if (dev->keycode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) key = sparse_keymap_locate(dev, ke);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) if (key && key->type == KE_KEY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) *old_keycode = key->keycode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) key->keycode = ke->keycode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) set_bit(ke->keycode, dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) if (!sparse_keymap_entry_from_keycode(dev, *old_keycode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) clear_bit(*old_keycode, dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) * sparse_keymap_setup - set up sparse keymap for an input device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) * @dev: Input device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) * @keymap: Keymap in form of array of &key_entry structures ending
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) * with %KE_END type entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) * @setup: Function that can be used to adjust keymap entries
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) * depending on device's needs, may be %NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) * The function calculates size and allocates copy of the original
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) * keymap after which sets up input device event bits appropriately.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * The allocated copy of the keymap is automatically freed when it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) * is no longer needed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) int sparse_keymap_setup(struct input_dev *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) const struct key_entry *keymap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) int (*setup)(struct input_dev *, struct key_entry *))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) size_t map_size = 1; /* to account for the last KE_END entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) const struct key_entry *e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) struct key_entry *map, *entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) for (e = keymap; e->type != KE_END; e++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) map_size++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) map = devm_kmemdup(&dev->dev, keymap, map_size * sizeof(*map),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) if (!map)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) for (i = 0; i < map_size; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) entry = &map[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) if (setup) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) error = setup(dev, entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) switch (entry->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) case KE_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) __set_bit(EV_KEY, dev->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) __set_bit(entry->keycode, dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) case KE_SW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) case KE_VSW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) __set_bit(EV_SW, dev->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) __set_bit(entry->sw.code, dev->swbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) if (test_bit(EV_KEY, dev->evbit)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) __set_bit(KEY_UNKNOWN, dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) __set_bit(EV_MSC, dev->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) __set_bit(MSC_SCAN, dev->mscbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) dev->keycode = map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) dev->keycodemax = map_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) dev->getkeycode = sparse_keymap_getkeycode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) dev->setkeycode = sparse_keymap_setkeycode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) EXPORT_SYMBOL(sparse_keymap_setup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) * sparse_keymap_report_entry - report event corresponding to given key entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) * @dev: Input device for which event should be reported
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) * @ke: key entry describing event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) * @value: Value that should be reported (ignored by %KE_SW entries)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) * @autorelease: Signals whether release event should be emitted for %KE_KEY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) * entries right after reporting press event, ignored by all other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) * entries
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) * This function is used to report input event described by given
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) * &struct key_entry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) void sparse_keymap_report_entry(struct input_dev *dev, const struct key_entry *ke,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) unsigned int value, bool autorelease)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) switch (ke->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) case KE_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) input_event(dev, EV_MSC, MSC_SCAN, ke->code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) input_report_key(dev, ke->keycode, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) input_sync(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) if (value && autorelease) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) input_report_key(dev, ke->keycode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) input_sync(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) case KE_SW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) value = ke->sw.value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) case KE_VSW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) input_report_switch(dev, ke->sw.code, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) input_sync(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) EXPORT_SYMBOL(sparse_keymap_report_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) * sparse_keymap_report_event - report event corresponding to given scancode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) * @dev: Input device using sparse keymap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) * @code: Scan code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) * @value: Value that should be reported (ignored by %KE_SW entries)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) * @autorelease: Signals whether release event should be emitted for %KE_KEY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) * entries right after reporting press event, ignored by all other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) * entries
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) * This function is used to perform lookup in an input device using sparse
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) * keymap and report corresponding event. Returns %true if lookup was
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) * successful and %false otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) bool sparse_keymap_report_event(struct input_dev *dev, unsigned int code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) unsigned int value, bool autorelease)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) const struct key_entry *ke =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) sparse_keymap_entry_from_scancode(dev, code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) struct key_entry unknown_ke;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) if (ke) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) sparse_keymap_report_entry(dev, ke, value, autorelease);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) /* Report an unknown key event as a debugging aid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) unknown_ke.type = KE_KEY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) unknown_ke.code = code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) unknown_ke.keycode = KEY_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) sparse_keymap_report_entry(dev, &unknown_ke, value, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) EXPORT_SYMBOL(sparse_keymap_report_event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)