linux/include/linux/input/matrix_keypad.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _MATRIX_KEYPAD_H
   3#define _MATRIX_KEYPAD_H
   4
   5#include <linux/types.h>
   6#include <linux/input.h>
   7#include <linux/of.h>
   8
   9#define MATRIX_MAX_ROWS         32
  10#define MATRIX_MAX_COLS         32
  11
  12#define KEY(row, col, val)      ((((row) & (MATRIX_MAX_ROWS - 1)) << 24) |\
  13                                 (((col) & (MATRIX_MAX_COLS - 1)) << 16) |\
  14                                 ((val) & 0xffff))
  15
  16#define KEY_ROW(k)              (((k) >> 24) & 0xff)
  17#define KEY_COL(k)              (((k) >> 16) & 0xff)
  18#define KEY_VAL(k)              ((k) & 0xffff)
  19
  20#define MATRIX_SCAN_CODE(row, col, row_shift)   (((row) << (row_shift)) + (col))
  21
  22/**
  23 * struct matrix_keymap_data - keymap for matrix keyboards
  24 * @keymap: pointer to array of uint32 values encoded with KEY() macro
  25 *      representing keymap
  26 * @keymap_size: number of entries (initialized) in this keymap
  27 *
  28 * This structure is supposed to be used by platform code to supply
  29 * keymaps to drivers that implement matrix-like keypads/keyboards.
  30 */
  31struct matrix_keymap_data {
  32        const uint32_t *keymap;
  33        unsigned int    keymap_size;
  34};
  35
  36/**
  37 * struct matrix_keypad_platform_data - platform-dependent keypad data
  38 * @keymap_data: pointer to &matrix_keymap_data
  39 * @row_gpios: pointer to array of gpio numbers representing rows
  40 * @col_gpios: pointer to array of gpio numbers reporesenting colums
  41 * @num_row_gpios: actual number of row gpios used by device
  42 * @num_col_gpios: actual number of col gpios used by device
  43 * @col_scan_delay_us: delay, measured in microseconds, that is
  44 *      needed before we can keypad after activating column gpio
  45 * @debounce_ms: debounce interval in milliseconds
  46 * @clustered_irq: may be specified if interrupts of all row/column GPIOs
  47 *      are bundled to one single irq
  48 * @clustered_irq_flags: flags that are needed for the clustered irq
  49 * @active_low: gpio polarity
  50 * @wakeup: controls whether the device should be set up as wakeup
  51 *      source
  52 * @no_autorepeat: disable key autorepeat
  53 * @drive_inactive_cols: drive inactive columns during scan, rather than
  54 *      making them inputs.
  55 *
  56 * This structure represents platform-specific data that use used by
  57 * matrix_keypad driver to perform proper initialization.
  58 */
  59struct matrix_keypad_platform_data {
  60        const struct matrix_keymap_data *keymap_data;
  61
  62        const unsigned int *row_gpios;
  63        const unsigned int *col_gpios;
  64
  65        unsigned int    num_row_gpios;
  66        unsigned int    num_col_gpios;
  67
  68        unsigned int    col_scan_delay_us;
  69
  70        /* key debounce interval in milli-second */
  71        unsigned int    debounce_ms;
  72
  73        unsigned int    clustered_irq;
  74        unsigned int    clustered_irq_flags;
  75
  76        bool            active_low;
  77        bool            wakeup;
  78        bool            no_autorepeat;
  79        bool            drive_inactive_cols;
  80};
  81
  82int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data,
  83                               const char *keymap_name,
  84                               unsigned int rows, unsigned int cols,
  85                               unsigned short *keymap,
  86                               struct input_dev *input_dev);
  87int matrix_keypad_parse_properties(struct device *dev,
  88                                   unsigned int *rows, unsigned int *cols);
  89
  90#define matrix_keypad_parse_of_params matrix_keypad_parse_properties
  91
  92#endif /* _MATRIX_KEYPAD_H */
  93