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

Reply via email to