1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun #ifndef _SPARSE_KEYMAP_H 3*4882a593Smuzhiyun #define _SPARSE_KEYMAP_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun /* 6*4882a593Smuzhiyun * Copyright (c) 2009 Dmitry Torokhov 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #define KE_END 0 /* Indicates end of keymap */ 10*4882a593Smuzhiyun #define KE_KEY 1 /* Ordinary key/button */ 11*4882a593Smuzhiyun #define KE_SW 2 /* Switch (predetermined value) */ 12*4882a593Smuzhiyun #define KE_VSW 3 /* Switch (value supplied at runtime) */ 13*4882a593Smuzhiyun #define KE_IGNORE 4 /* Known entry that should be ignored */ 14*4882a593Smuzhiyun #define KE_LAST KE_IGNORE 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /** 17*4882a593Smuzhiyun * struct key_entry - keymap entry for use in sparse keymap 18*4882a593Smuzhiyun * @type: Type of the key entry (KE_KEY, KE_SW, KE_VSW, KE_END); 19*4882a593Smuzhiyun * drivers are allowed to extend the list with their own 20*4882a593Smuzhiyun * private definitions. 21*4882a593Smuzhiyun * @code: Device-specific data identifying the button/switch 22*4882a593Smuzhiyun * @keycode: KEY_* code assigned to a key/button 23*4882a593Smuzhiyun * @sw: struct with code/value used by KE_SW and KE_VSW 24*4882a593Smuzhiyun * @sw.code: SW_* code assigned to a switch 25*4882a593Smuzhiyun * @sw.value: Value that should be sent in an input even when KE_SW 26*4882a593Smuzhiyun * switch is toggled. KE_VSW switches ignore this field and 27*4882a593Smuzhiyun * expect driver to supply value for the event. 28*4882a593Smuzhiyun * 29*4882a593Smuzhiyun * This structure defines an entry in a sparse keymap used by some 30*4882a593Smuzhiyun * input devices for which traditional table-based approach is not 31*4882a593Smuzhiyun * suitable. 32*4882a593Smuzhiyun */ 33*4882a593Smuzhiyun struct key_entry { 34*4882a593Smuzhiyun int type; /* See KE_* above */ 35*4882a593Smuzhiyun u32 code; 36*4882a593Smuzhiyun union { 37*4882a593Smuzhiyun u16 keycode; /* For KE_KEY */ 38*4882a593Smuzhiyun struct { /* For KE_SW, KE_VSW */ 39*4882a593Smuzhiyun u8 code; 40*4882a593Smuzhiyun u8 value; /* For KE_SW, ignored by KE_VSW */ 41*4882a593Smuzhiyun } sw; 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun }; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun struct key_entry *sparse_keymap_entry_from_scancode(struct input_dev *dev, 46*4882a593Smuzhiyun unsigned int code); 47*4882a593Smuzhiyun struct key_entry *sparse_keymap_entry_from_keycode(struct input_dev *dev, 48*4882a593Smuzhiyun unsigned int code); 49*4882a593Smuzhiyun int sparse_keymap_setup(struct input_dev *dev, 50*4882a593Smuzhiyun const struct key_entry *keymap, 51*4882a593Smuzhiyun int (*setup)(struct input_dev *, struct key_entry *)); 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun void sparse_keymap_report_entry(struct input_dev *dev, const struct key_entry *ke, 54*4882a593Smuzhiyun unsigned int value, bool autorelease); 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun bool sparse_keymap_report_event(struct input_dev *dev, unsigned int code, 57*4882a593Smuzhiyun unsigned int value, bool autorelease); 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun #endif /* _SPARSE_KEYMAP_H */ 60