mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-22 20:23:57 +08:00
4384041533
We now have a binding which adds two parameters to the matrix keypad DT node. This is separate from the GPIO-driven matrix keypad binding, and unfortunately incompatible, since that uses row-gpios/col-gpios for the row and column counts. So the easiest option here is to provide a function for non-GPIO drivers to use to decode the binding. Note: We could in fact create an entirely separate structure to hold these two fields, but it does not seem worth it, yet. If we have more parameters then we can add this, and then refactor each driver to hold such a structure. Signed-off-by: Simon Glass <sjg@chromium.org> Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Tested-by: Sourav Poddar <sourav.poddar@ti.com> (v2) Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
104 lines
3.1 KiB
C
104 lines
3.1 KiB
C
#ifndef _MATRIX_KEYPAD_H
|
|
#define _MATRIX_KEYPAD_H
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/input.h>
|
|
#include <linux/of.h>
|
|
|
|
#define MATRIX_MAX_ROWS 32
|
|
#define MATRIX_MAX_COLS 32
|
|
|
|
#define KEY(row, col, val) ((((row) & (MATRIX_MAX_ROWS - 1)) << 24) |\
|
|
(((col) & (MATRIX_MAX_COLS - 1)) << 16) |\
|
|
((val) & 0xffff))
|
|
|
|
#define KEY_ROW(k) (((k) >> 24) & 0xff)
|
|
#define KEY_COL(k) (((k) >> 16) & 0xff)
|
|
#define KEY_VAL(k) ((k) & 0xffff)
|
|
|
|
#define MATRIX_SCAN_CODE(row, col, row_shift) (((row) << (row_shift)) + (col))
|
|
|
|
/**
|
|
* struct matrix_keymap_data - keymap for matrix keyboards
|
|
* @keymap: pointer to array of uint32 values encoded with KEY() macro
|
|
* representing keymap
|
|
* @keymap_size: number of entries (initialized) in this keymap
|
|
*
|
|
* This structure is supposed to be used by platform code to supply
|
|
* keymaps to drivers that implement matrix-like keypads/keyboards.
|
|
*/
|
|
struct matrix_keymap_data {
|
|
const uint32_t *keymap;
|
|
unsigned int keymap_size;
|
|
};
|
|
|
|
/**
|
|
* struct matrix_keypad_platform_data - platform-dependent keypad data
|
|
* @keymap_data: pointer to &matrix_keymap_data
|
|
* @row_gpios: pointer to array of gpio numbers representing rows
|
|
* @col_gpios: pointer to array of gpio numbers reporesenting colums
|
|
* @num_row_gpios: actual number of row gpios used by device
|
|
* @num_col_gpios: actual number of col gpios used by device
|
|
* @col_scan_delay_us: delay, measured in microseconds, that is
|
|
* needed before we can keypad after activating column gpio
|
|
* @debounce_ms: debounce interval in milliseconds
|
|
* @clustered_irq: may be specified if interrupts of all row/column GPIOs
|
|
* are bundled to one single irq
|
|
* @clustered_irq_flags: flags that are needed for the clustered irq
|
|
* @active_low: gpio polarity
|
|
* @wakeup: controls whether the device should be set up as wakeup
|
|
* source
|
|
* @no_autorepeat: disable key autorepeat
|
|
*
|
|
* This structure represents platform-specific data that use used by
|
|
* matrix_keypad driver to perform proper initialization.
|
|
*/
|
|
struct matrix_keypad_platform_data {
|
|
const struct matrix_keymap_data *keymap_data;
|
|
|
|
const unsigned int *row_gpios;
|
|
const unsigned int *col_gpios;
|
|
|
|
unsigned int num_row_gpios;
|
|
unsigned int num_col_gpios;
|
|
|
|
unsigned int col_scan_delay_us;
|
|
|
|
/* key debounce interval in milli-second */
|
|
unsigned int debounce_ms;
|
|
|
|
unsigned int clustered_irq;
|
|
unsigned int clustered_irq_flags;
|
|
|
|
bool active_low;
|
|
bool wakeup;
|
|
bool no_autorepeat;
|
|
};
|
|
|
|
int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data,
|
|
const char *keymap_name,
|
|
unsigned int rows, unsigned int cols,
|
|
unsigned short *keymap,
|
|
struct input_dev *input_dev);
|
|
|
|
#ifdef CONFIG_OF
|
|
/**
|
|
* matrix_keypad_parse_of_params() - Read parameters from matrix-keypad node
|
|
*
|
|
* @dev: Device containing of_node
|
|
* @rows: Returns number of matrix rows
|
|
* @cols: Returns number of matrix columns
|
|
* @return 0 if OK, <0 on error
|
|
*/
|
|
int matrix_keypad_parse_of_params(struct device *dev,
|
|
unsigned int *rows, unsigned int *cols);
|
|
#else
|
|
static inline int matrix_keypad_parse_of_params(struct device *dev,
|
|
unsigned int *rows, unsigned int *cols)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
#endif /* CONFIG_OF */
|
|
|
|
#endif /* _MATRIX_KEYPAD_H */
|