1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
236203c4fSDmitry Torokhov #ifndef _SPARSE_KEYMAP_H
336203c4fSDmitry Torokhov #define _SPARSE_KEYMAP_H
436203c4fSDmitry Torokhov 
536203c4fSDmitry Torokhov /*
636203c4fSDmitry Torokhov  * Copyright (c) 2009 Dmitry Torokhov
736203c4fSDmitry Torokhov  */
836203c4fSDmitry Torokhov 
936203c4fSDmitry Torokhov #define KE_END		0	/* Indicates end of keymap */
1036203c4fSDmitry Torokhov #define KE_KEY		1	/* Ordinary key/button */
1136203c4fSDmitry Torokhov #define KE_SW		2	/* Switch (predetermined value) */
1236203c4fSDmitry Torokhov #define KE_VSW		3	/* Switch (value supplied at runtime) */
1336203c4fSDmitry Torokhov #define KE_IGNORE	4	/* Known entry that should be ignored */
1436203c4fSDmitry Torokhov #define KE_LAST		KE_IGNORE
1536203c4fSDmitry Torokhov 
1636203c4fSDmitry Torokhov /**
1736203c4fSDmitry Torokhov  * struct key_entry - keymap entry for use in sparse keymap
1836203c4fSDmitry Torokhov  * @type: Type of the key entry (KE_KEY, KE_SW, KE_VSW, KE_END);
1936203c4fSDmitry Torokhov  *	drivers are allowed to extend the list with their own
2036203c4fSDmitry Torokhov  *	private definitions.
2136203c4fSDmitry Torokhov  * @code: Device-specific data identifying the button/switch
2236203c4fSDmitry Torokhov  * @keycode: KEY_* code assigned to a key/button
23*f2c68551SMauro Carvalho Chehab  * @sw: struct with code/value used by KE_SW and KE_VSW
2436203c4fSDmitry Torokhov  * @sw.code: SW_* code assigned to a switch
2536203c4fSDmitry Torokhov  * @sw.value: Value that should be sent in an input even when KE_SW
2636203c4fSDmitry Torokhov  *	switch is toggled. KE_VSW switches ignore this field and
2736203c4fSDmitry Torokhov  *	expect driver to supply value for the event.
2836203c4fSDmitry Torokhov  *
2936203c4fSDmitry Torokhov  * This structure defines an entry in a sparse keymap used by some
3036203c4fSDmitry Torokhov  * input devices for which traditional table-based approach is not
3136203c4fSDmitry Torokhov  * suitable.
3236203c4fSDmitry Torokhov  */
3336203c4fSDmitry Torokhov struct key_entry {
3436203c4fSDmitry Torokhov 	int type;		/* See KE_* above */
3536203c4fSDmitry Torokhov 	u32 code;
3636203c4fSDmitry Torokhov 	union {
3736203c4fSDmitry Torokhov 		u16 keycode;		/* For KE_KEY */
3836203c4fSDmitry Torokhov 		struct {		/* For KE_SW, KE_VSW */
3936203c4fSDmitry Torokhov 			u8 code;
4036203c4fSDmitry Torokhov 			u8 value;	/* For KE_SW, ignored by KE_VSW */
4136203c4fSDmitry Torokhov 		} sw;
4236203c4fSDmitry Torokhov 	};
4336203c4fSDmitry Torokhov };
4436203c4fSDmitry Torokhov 
4536203c4fSDmitry Torokhov struct key_entry *sparse_keymap_entry_from_scancode(struct input_dev *dev,
4636203c4fSDmitry Torokhov 						    unsigned int code);
4736203c4fSDmitry Torokhov struct key_entry *sparse_keymap_entry_from_keycode(struct input_dev *dev,
4836203c4fSDmitry Torokhov 						   unsigned int code);
4936203c4fSDmitry Torokhov int sparse_keymap_setup(struct input_dev *dev,
5036203c4fSDmitry Torokhov 			const struct key_entry *keymap,
5136203c4fSDmitry Torokhov 			int (*setup)(struct input_dev *, struct key_entry *));
5236203c4fSDmitry Torokhov 
5336203c4fSDmitry Torokhov void sparse_keymap_report_entry(struct input_dev *dev, const struct key_entry *ke,
5436203c4fSDmitry Torokhov 				unsigned int value, bool autorelease);
5536203c4fSDmitry Torokhov 
5636203c4fSDmitry Torokhov bool sparse_keymap_report_event(struct input_dev *dev, unsigned int code,
5736203c4fSDmitry Torokhov 				unsigned int value, bool autorelease);
5836203c4fSDmitry Torokhov 
5936203c4fSDmitry Torokhov #endif /* _SPARSE_KEYMAP_H */
60