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 * @drive_inactive_cols: drive inactive columns during scan, rather than
  53 *      making them inputs.
  54 *
  55 * This structure represents platform-specific data that use used by
  56 * matrix_keypad driver to perform proper initialization.
  57 */
  58struct matrix_keypad_platform_data {
  59        const struct matrix_keymap_data *keymap_data;
  60
  61        const unsigned int *row_gpios;
  62        const unsigned int *col_gpios;
  63
  64        unsigned int    num_row_gpios;
  65        unsigned int    num_col_gpios;
  66
  67        unsigned int    col_scan_delay_us;
  68
  69        /* key debounce interval in milli-second */
  70        unsigned int    debounce_ms;
  71
  72        unsigned int    clustered_irq;
  73        unsigned int    clustered_irq_flags;
  74
  75        bool            active_low;
  76        bool            wakeup;
  77        bool            no_autorepeat;
  78        bool            drive_inactive_cols;
  79};
  80
  81int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data,
  82                               const char *keymap_name,
  83                               unsigned int rows, unsigned int cols,
  84                               unsigned short *keymap,
  85                               struct input_dev *input_dev);
  86int matrix_keypad_parse_properties(struct device *dev,
  87                                   unsigned int *rows, unsigned int *cols);
  88
  89#define matrix_keypad_parse_of_params matrix_keypad_parse_properties
  90
  91#endif /* _MATRIX_KEYPAD_H */
  92