Hi Eric, On Mon, Jul 20, 2009 at 4:07 PM, Eric Miao<eric.y.miao@xxxxxxxxx> wrote: > >>>> Did you tried assigning max_keypmap_size in platform data to >>>> MATRIX_MAX_COLS * MATRIX_MAX_ROWS ? >>>> >>> Yes, this fixes crashes. But this is just workaround for bug in driver. >>> >> >> As you have access to h/w, care to submit a patch which fixes this? >> > > Dmitry & Trilok, > > How about this? Due to the fact that we are not able to sort out the > proper solution for a dynamic maximum of columns/rows, let's simplify > the fix to the patch below: > > > From 61ea1bd16a3636f526fb12619e84a75fa16b7f38 Mon Sep 17 00:00:00 2001 > From: Eric Miao <eric.y.miao@xxxxxxxxx> > Date: Mon, 20 Jul 2009 11:31:08 +0800 > Subject: [PATCH] input: matrix keymap size fixed to maximum > > Introduced KEY_IDX(), merged keymap_data into 'matrix_keypad_platform_data'. > > Signed-off-by: Eric Miao <eric.y.miao@xxxxxxxxx> > --- > drivers/input/keyboard/matrix_keypad.c | 22 ++++++---------------- > include/linux/input/matrix_keypad.h | 21 +++++---------------- > 2 files changed, 11 insertions(+), 32 deletions(-) > > diff --git a/drivers/input/keyboard/matrix_keypad.c b/drivers/input/keyboard/matrix_keypad.c > index e9b2e7c..a0ba134 100644 > --- a/drivers/input/keyboard/matrix_keypad.c > +++ b/drivers/input/keyboard/matrix_keypad.c > @@ -136,7 +136,7 @@ static void matrix_keypad_scan(struct work_struct *work) > if ((bits_changed & (1 << row)) == 0) > continue; > > - code = (row << 4) + col; > + code = KEY_IDX(row, col); > input_event(input_dev, EV_MSC, MSC_SCAN, code); > input_report_key(input_dev, > keypad->keycodes[code], > @@ -313,7 +313,6 @@ err_free_cols: > static int __devinit matrix_keypad_probe(struct platform_device *pdev) > { > const struct matrix_keypad_platform_data *pdata; > - const struct matrix_keymap_data *keymap_data; > struct matrix_keypad *keypad; > struct input_dev *input_dev; > unsigned short *keycodes; > @@ -326,20 +325,13 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev) > return -EINVAL; > } > > - keymap_data = pdata->keymap_data; > - if (!keymap_data) { > + if (!pdata->keymap) { > dev_err(&pdev->dev, "no keymap data defined\n"); > return -EINVAL; > } > > - if (!keymap_data->max_keymap_size) { > - dev_err(&pdev->dev, "invalid keymap data supplied\n"); > - return -EINVAL; > - } > - > keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL); > - keycodes = kzalloc(keymap_data->max_keymap_size * > - sizeof(keypad->keycodes), > + keycodes = kzalloc(sizeof(keypad->keycodes) * MATRIX_MAX_KEYS, > GFP_KERNEL); > input_dev = input_allocate_device(); > if (!keypad || !keycodes || !input_dev) { > @@ -362,16 +354,14 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev) > input_dev->close = matrix_keypad_stop; > > input_dev->keycode = keycodes; > - input_dev->keycodesize = sizeof(*keycodes); > - input_dev->keycodemax = keymap_data->max_keymap_size; > > - for (i = 0; i < keymap_data->keymap_size; i++) { > - unsigned int key = keymap_data->keymap[i]; > + for (i = 0; i < pdata->keymap_size; i++) { > + unsigned int key = pdata->keymap[i]; > unsigned int row = KEY_ROW(key); > unsigned int col = KEY_COL(key); > unsigned short code = KEY_VAL(key); > > - keycodes[(row << 4) + col] = code; > + keycodes[KEY_IDX(row, col)] = code; How about just doing like this keycodes[(row << ((fls(MATRIX_MAX_COLS) - 1))) + col] ? -- ---Trilok Soni http://triloksoni.wordpress.com http://www.linkedin.com/in/triloksoni -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html