[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