linux/include/linux/input/matrix_keypad.h
<<
>>
Prefs
   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         32
   9#define MATRIX_MAX_COLS         32
  10
  11#define KEY(row, col, val)      ((((row) & (MATRIX_MAX_ROWS - 1)) << 24) |\
  12                                 (((col) & (MATRIX_MAX_COLS - 1)) << 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
  78int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data,
  79                               const char *keymap_name,
  80                               unsigned int rows, unsigned int cols,
  81                               unsigned short *keymap,
  82                               struct input_dev *input_dev);
  83
  84#ifdef CONFIG_OF
  85/**
  86 * matrix_keypad_parse_of_params() - Read parameters from matrix-keypad node
  87 *
  88 * @dev: Device containing of_node
  89 * @rows: Returns number of matrix rows
  90 * @cols: Returns number of matrix columns
  91 * @return 0 if OK, <0 on error
  92 */
  93int matrix_keypad_parse_of_params(struct device *dev,
  94                                  unsigned int *rows, unsigned int *cols);
  95#else
  96static inline int matrix_keypad_parse_of_params(struct device *dev,
  97                                  unsigned int *rows, unsigned int *cols)
  98{
  99        return -ENOSYS;
 100}
 101#endif /* CONFIG_OF */
 102
 103#endif /* _MATRIX_KEYPAD_H */
 104