On Mon, 7 Feb 2011 14:58:02 -0800 Kristen Carlson Accardi <[email protected]> wrote:
> don't assume gpios are consecutively allocated, and free in gpios > and out gpios separately. Hi, any feedback on this patch? Thanks, Kristen > > 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); > } > _______________________________________________ MeeGo-kernel mailing list [email protected] http://lists.meego.com/listinfo/meego-kernel
