[Meego-kernel] [PATCH] intel_mid_keypad: cleanup freeing of gpios

Kristen Carlson Accardi kristen at linux.intel.com
Mon Feb 7 14:58:02 PST 2011


don't assume gpios are consecutively allocated, and free in gpios
and out gpios separately.

Signed-off-by: Kristen Carlson Accardi <kristen at linux.intel.com>
---
 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



More information about the MeeGo-kernel mailing list