PageRenderTime 22ms CodeModel.GetById 9ms app.highlight 8ms RepoModel.GetById 2ms app.codeStats 0ms

/include/linux/input/matrix_keypad.h

https://github.com/airy09/android_kernel_sony_apq8064
C Header | 128 lines | 64 code | 20 blank | 44 comment | 1 complexity | da2f2eeeb20799081b39c91f9d5e6a91 MD5 | raw file
  1#ifndef _MATRIX_KEYPAD_H
  2#define _MATRIX_KEYPAD_H
  3
  4#include <linux/types.h>
  5#include <linux/input.h>
  6#include <linux/of.h>
  7
  8#define MATRIX_MAX_ROWS		18
  9#define MATRIX_MAX_COLS		18
 10
 11#define KEY(row, col, val)	((((row) % (MATRIX_MAX_ROWS)) << 24) |\
 12				 (((col) % (MATRIX_MAX_COLS)) << 16) |\
 13				 (val & 0xffff))
 14
 15#define KEY_ROW(k)		(((k) >> 24) & 0xff)
 16#define KEY_COL(k)		(((k) >> 16) & 0xff)
 17#define KEY_VAL(k)		((k) & 0xffff)
 18
 19#define MATRIX_SCAN_CODE(row, col, row_shift)	(((row) << (row_shift)) + (col))
 20
 21/**
 22 * struct matrix_keymap_data - keymap for matrix keyboards
 23 * @keymap: pointer to array of uint32 values encoded with KEY() macro
 24 *	representing keymap
 25 * @keymap_size: number of entries (initialized) in this keymap
 26 *
 27 * This structure is supposed to be used by platform code to supply
 28 * keymaps to drivers that implement matrix-like keypads/keyboards.
 29 */
 30struct matrix_keymap_data {
 31	const uint32_t *keymap;
 32	unsigned int	keymap_size;
 33};
 34
 35/**
 36 * struct matrix_keypad_platform_data - platform-dependent keypad data
 37 * @keymap_data: pointer to &matrix_keymap_data
 38 * @row_gpios: pointer to array of gpio numbers representing rows
 39 * @col_gpios: pointer to array of gpio numbers reporesenting colums
 40 * @num_row_gpios: actual number of row gpios used by device
 41 * @num_col_gpios: actual number of col gpios used by device
 42 * @col_scan_delay_us: delay, measured in microseconds, that is
 43 *	needed before we can keypad after activating column gpio
 44 * @debounce_ms: debounce interval in milliseconds
 45 * @clustered_irq: may be specified if interrupts of all row/column GPIOs
 46 *	are bundled to one single irq
 47 * @clustered_irq_flags: flags that are needed for the clustered irq
 48 * @active_low: gpio polarity
 49 * @wakeup: controls whether the device should be set up as wakeup
 50 *	source
 51 * @no_autorepeat: disable key autorepeat
 52 *
 53 * This structure represents platform-specific data that use used by
 54 * matrix_keypad driver to perform proper initialization.
 55 */
 56struct matrix_keypad_platform_data {
 57	const struct matrix_keymap_data *keymap_data;
 58
 59	const unsigned int *row_gpios;
 60	const unsigned int *col_gpios;
 61
 62	unsigned int	num_row_gpios;
 63	unsigned int	num_col_gpios;
 64
 65	unsigned int	col_scan_delay_us;
 66
 67	/* key debounce interval in milli-second */
 68	unsigned int	debounce_ms;
 69
 70	unsigned int	clustered_irq;
 71	unsigned int	clustered_irq_flags;
 72
 73	bool		active_low;
 74	bool		wakeup;
 75	bool		no_autorepeat;
 76};
 77
 78/**
 79 * matrix_keypad_build_keymap - convert platform keymap into matrix keymap
 80 * @keymap_data: keymap supplied by the platform code
 81 * @row_shift: number of bits to shift row value by to advance to the next
 82 * line in the keymap
 83 * @keymap: expanded version of keymap that is suitable for use by
 84 * matrix keyboad driver
 85 * @keybit: pointer to bitmap of keys supported by input device
 86 *
 87 * This function converts platform keymap (encoded with KEY() macro) into
 88 * an array of keycodes that is suitable for using in a standard matrix
 89 * keyboard driver that uses row and col as indices.
 90 */
 91static inline void
 92matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data,
 93			   unsigned int row_shift,
 94			   unsigned short *keymap, unsigned long *keybit)
 95{
 96	int i;
 97
 98	for (i = 0; i < keymap_data->keymap_size; i++) {
 99		unsigned int key = keymap_data->keymap[i];
100		unsigned int row = KEY_ROW(key);
101		unsigned int col = KEY_COL(key);
102		unsigned short code = KEY_VAL(key);
103
104		keymap[MATRIX_SCAN_CODE(row, col, row_shift)] = code;
105		__set_bit(code, keybit);
106	}
107	__clear_bit(KEY_RESERVED, keybit);
108}
109
110#ifdef CONFIG_INPUT_OF_MATRIX_KEYMAP
111struct matrix_keymap_data *
112matrix_keyboard_of_fill_keymap(struct device_node *np, const char *propname);
113
114void matrix_keyboard_of_free_keymap(const struct matrix_keymap_data *kd);
115#else
116static inline struct matrix_keymap_data *
117matrix_keyboard_of_fill_keymap(struct device_node *np, const char *propname)
118{
119	return NULL;
120}
121
122static inline void
123matrix_keyboard_of_free_keymap(const struct matrix_keymap_data *kd)
124{
125}
126#endif
127
128#endif /* _MATRIX_KEYPAD_H */