don't assume gpios are consecutively allocated, and free in gpios and out gpios separately.
Signed-off-by: Kristen Carlson Accardi <[email protected]> --- drivers/input/keyboard/intel_mid_keypad.c | 38 ++++++++++++++++++---------- 1 files changed, 24 insertions(+), 14 deletions(-) diff --git a/drivers/input/keyboard/intel_mid_keypad.c b/drivers/input/keyboard/intel_mid_keypad.c index 732c443..7c23ac5 100644 --- a/drivers/input/keyboard/intel_mid_keypad.c +++ b/drivers/input/keyboard/intel_mid_keypad.c @@ -250,35 +250,43 @@ static irqreturn_t mrst_keypad_irq_handler(int irq, void *dev_id) static int mrst_keypad_gpio_init(struct mrst_keypad *keypad) { - int i, err, cnt = 0; + int i, err; int in_pins = KEYPAD_MATRIX_GPIO_IN_PIN + keypad->matrix_key_rows; int out_pins = KEYPAD_MATRIX_GPIO_OUT_PIN + keypad->matrix_key_cols; /* explicitely tell which pins have been occupied... */ - for (i = KEYPAD_MATRIX_GPIO_IN_PIN; i < in_pins; i++, cnt++) { + for (i = KEYPAD_MATRIX_GPIO_IN_PIN; i < in_pins; i++) { err = gpio_request(i, NULL); - gpio_direction_input(i); if (err) { pr_err(DRV_NAME "GPIO pin %d failed to request.\n", i); - goto err_request; + goto err_free_rows; } + + gpio_direction_input(i); } - for (i = KEYPAD_MATRIX_GPIO_OUT_PIN; i < out_pins; i++, cnt++) { + for (i = KEYPAD_MATRIX_GPIO_OUT_PIN; i < out_pins; i++) { err = gpio_request(i, NULL); - gpio_direction_output(i, 1); + if (err) { pr_err(DRV_NAME "GPIO pin %d failed to request.\n", i); - goto err_request; + goto err_free_cols; } + + gpio_direction_output(i, 1); } return 0; -err_request: - /* free requested pins... */ - for (i = out_pins - 1; i >= KEYPAD_MATRIX_GPIO_OUT_PIN; i--) +err_free_cols: + while (--i >= KEYPAD_MATRIX_GPIO_OUT_PIN) + gpio_free(i); + + i = in_pins; + +err_free_rows: + while (--i >= KEYPAD_MATRIX_GPIO_IN_PIN) gpio_free(i); return err; @@ -293,13 +301,15 @@ static int mrst_keypad_open(struct input_dev *dev) static void mrst_keypad_close(struct input_dev *dev) { struct mrst_keypad *keypad = input_get_drvdata(dev); - int pins = KEYPAD_MATRIX_GPIO_IN_PIN + keypad->matrix_key_rows + - keypad->matrix_key_cols; - + int in_pins = KEYPAD_MATRIX_GPIO_IN_PIN + keypad->matrix_key_rows; + int out_pins = KEYPAD_MATRIX_GPIO_OUT_PIN + keypad->matrix_key_cols; int i; /* free occupied pins */ - for (i = KEYPAD_MATRIX_GPIO_IN_PIN; i < pins; i++) + for (i = KEYPAD_MATRIX_GPIO_IN_PIN; i < in_pins; i++) + gpio_free(i); + + for (i = KEYPAD_MATRIX_GPIO_OUT_PIN; i < out_pins; i++) gpio_free(i); } -- 1.7.3.1 _______________________________________________ MeeGo-kernel mailing list [email protected] http://lists.meego.com/listinfo/meego-kernel
