Commit d82f1c35 authored by Eric Miao's avatar Eric Miao Committed by Dmitry Torokhov

Input: matrix_keypad - make matrix keymap size dynamic

Remove assumption on the shift and size of rows/columns form
matrix_keypad driver.
Signed-off-by: default avatarEric Miao <eric.y.miao@gmail.com>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 19493478
...@@ -27,6 +27,7 @@ struct matrix_keypad { ...@@ -27,6 +27,7 @@ struct matrix_keypad {
const struct matrix_keypad_platform_data *pdata; const struct matrix_keypad_platform_data *pdata;
struct input_dev *input_dev; struct input_dev *input_dev;
unsigned short *keycodes; unsigned short *keycodes;
unsigned int row_shift;
uint32_t last_key_state[MATRIX_MAX_COLS]; uint32_t last_key_state[MATRIX_MAX_COLS];
struct delayed_work work; struct delayed_work work;
...@@ -136,7 +137,7 @@ static void matrix_keypad_scan(struct work_struct *work) ...@@ -136,7 +137,7 @@ static void matrix_keypad_scan(struct work_struct *work)
if ((bits_changed & (1 << row)) == 0) if ((bits_changed & (1 << row)) == 0)
continue; continue;
code = (row << 4) + col; code = MATRIX_SCAN_CODE(row, col, keypad->row_shift);
input_event(input_dev, EV_MSC, MSC_SCAN, code); input_event(input_dev, EV_MSC, MSC_SCAN, code);
input_report_key(input_dev, input_report_key(input_dev,
keypad->keycodes[code], keypad->keycodes[code],
...@@ -317,6 +318,7 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev) ...@@ -317,6 +318,7 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev)
struct matrix_keypad *keypad; struct matrix_keypad *keypad;
struct input_dev *input_dev; struct input_dev *input_dev;
unsigned short *keycodes; unsigned short *keycodes;
unsigned int row_shift;
int i; int i;
int err; int err;
...@@ -332,14 +334,11 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev) ...@@ -332,14 +334,11 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev)
return -EINVAL; return -EINVAL;
} }
if (!keymap_data->max_keymap_size) { row_shift = get_count_order(pdata->num_col_gpios);
dev_err(&pdev->dev, "invalid keymap data supplied\n");
return -EINVAL;
}
keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL); keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL);
keycodes = kzalloc(keymap_data->max_keymap_size * keycodes = kzalloc((pdata->num_row_gpios << row_shift) *
sizeof(keypad->keycodes), sizeof(*keycodes),
GFP_KERNEL); GFP_KERNEL);
input_dev = input_allocate_device(); input_dev = input_allocate_device();
if (!keypad || !keycodes || !input_dev) { if (!keypad || !keycodes || !input_dev) {
...@@ -350,6 +349,7 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev) ...@@ -350,6 +349,7 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev)
keypad->input_dev = input_dev; keypad->input_dev = input_dev;
keypad->pdata = pdata; keypad->pdata = pdata;
keypad->keycodes = keycodes; keypad->keycodes = keycodes;
keypad->row_shift = row_shift;
keypad->stopped = true; keypad->stopped = true;
INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan); INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan);
spin_lock_init(&keypad->lock); spin_lock_init(&keypad->lock);
...@@ -363,7 +363,7 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev) ...@@ -363,7 +363,7 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev)
input_dev->keycode = keycodes; input_dev->keycode = keycodes;
input_dev->keycodesize = sizeof(*keycodes); input_dev->keycodesize = sizeof(*keycodes);
input_dev->keycodemax = keymap_data->max_keymap_size; input_dev->keycodemax = pdata->num_row_gpios << keypad->row_shift;
for (i = 0; i < keymap_data->keymap_size; i++) { for (i = 0; i < keymap_data->keymap_size; i++) {
unsigned int key = keymap_data->keymap[i]; unsigned int key = keymap_data->keymap[i];
...@@ -371,7 +371,7 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev) ...@@ -371,7 +371,7 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev)
unsigned int col = KEY_COL(key); unsigned int col = KEY_COL(key);
unsigned short code = KEY_VAL(key); unsigned short code = KEY_VAL(key);
keycodes[(row << 4) + col] = code; keycodes[MATRIX_SCAN_CODE(row, col, row_shift)] = code;
__set_bit(code, input_dev->keybit); __set_bit(code, input_dev->keybit);
} }
__clear_bit(KEY_RESERVED, input_dev->keybit); __clear_bit(KEY_RESERVED, input_dev->keybit);
......
...@@ -15,12 +15,13 @@ ...@@ -15,12 +15,13 @@
#define KEY_COL(k) (((k) >> 16) & 0xff) #define KEY_COL(k) (((k) >> 16) & 0xff)
#define KEY_VAL(k) ((k) & 0xffff) #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 * struct matrix_keymap_data - keymap for matrix keyboards
* @keymap: pointer to array of uint32 values encoded with KEY() macro * @keymap: pointer to array of uint32 values encoded with KEY() macro
* representing keymap * representing keymap
* @keymap_size: number of entries (initialized) in this keymap * @keymap_size: number of entries (initialized) in this keymap
* @max_keymap_size: maximum size of keymap supported by the device
* *
* This structure is supposed to be used by platform code to supply * This structure is supposed to be used by platform code to supply
* keymaps to drivers that implement matrix-like keypads/keyboards. * keymaps to drivers that implement matrix-like keypads/keyboards.
...@@ -28,14 +29,13 @@ ...@@ -28,14 +29,13 @@
struct matrix_keymap_data { struct matrix_keymap_data {
const uint32_t *keymap; const uint32_t *keymap;
unsigned int keymap_size; unsigned int keymap_size;
unsigned int max_keymap_size;
}; };
/** /**
* struct matrix_keypad_platform_data - platform-dependent keypad data * struct matrix_keypad_platform_data - platform-dependent keypad data
* @keymap_data: pointer to &matrix_keymap_data * @keymap_data: pointer to &matrix_keymap_data
* @row_gpios: array of gpio numbers reporesenting rows * @row_gpios: pointer to array of gpio numbers representing rows
* @col_gpios: array of gpio numbers reporesenting colums * @col_gpios: pointer to array of gpio numbers reporesenting colums
* @num_row_gpios: actual number of row gpios used by device * @num_row_gpios: actual number of row gpios used by device
* @num_col_gpios: actual number of col 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 * @col_scan_delay_us: delay, measured in microseconds, that is
...@@ -48,8 +48,9 @@ struct matrix_keymap_data { ...@@ -48,8 +48,9 @@ struct matrix_keymap_data {
struct matrix_keypad_platform_data { struct matrix_keypad_platform_data {
const struct matrix_keymap_data *keymap_data; const struct matrix_keymap_data *keymap_data;
unsigned int row_gpios[MATRIX_MAX_ROWS]; const unsigned int *row_gpios;
unsigned int col_gpios[MATRIX_MAX_COLS]; const unsigned int *col_gpios;
unsigned int num_row_gpios; unsigned int num_row_gpios;
unsigned int num_col_gpios; unsigned int num_col_gpios;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment