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

Reply via email to