On Tue, Oct 07, 2014 at 02:16:47AM +0200, Rafael J. Wysocki wrote:
> From: Aaron Lu <aaron...@intel.com>
> 
> GPIO descriptors are the preferred way over legacy GPIO numbers
> nowadays. Convert the driver to use GPIO descriptors internally but
> still allow passing legacy GPIO numbers from platform data to support
> existing platforms.
> 
> Signed-off-by: Aaron Lu <aaron...@intel.com>
> Signed-off-by: Mika Westerberg <mika.westerb...@linux.intel.com>
> Acked-by: Alexandre Courbot <acour...@nvidia.com>
> Reviewed-by: Linus Walleij <linus.wall...@linaro.org>
> Signed-off-by: Rafael J. Wysocki <rafael.j.wyso...@intel.com>


Acked-by: Dmitry Torokhov <dmitry.torok...@gmail.com>


> ---
>  drivers/input/keyboard/gpio_keys_polled.c | 39 
> +++++++++++++++++++++----------
>  include/linux/gpio_keys.h                 |  3 +++
>  2 files changed, 30 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/input/keyboard/gpio_keys_polled.c 
> b/drivers/input/keyboard/gpio_keys_polled.c
> index 432d363..b7a514c 100644
> --- a/drivers/input/keyboard/gpio_keys_polled.c
> +++ b/drivers/input/keyboard/gpio_keys_polled.c
> @@ -23,6 +23,7 @@
>  #include <linux/ioport.h>
>  #include <linux/platform_device.h>
>  #include <linux/gpio.h>
> +#include <linux/gpio/consumer.h>
>  #include <linux/gpio_keys.h>
>  #include <linux/of.h>
>  #include <linux/of_platform.h>
> @@ -51,15 +52,14 @@ static void gpio_keys_polled_check_state(struct input_dev 
> *input,
>       int state;
>  
>       if (bdata->can_sleep)
> -             state = !!gpio_get_value_cansleep(button->gpio);
> +             state = !!gpiod_get_value_cansleep(button->gpiod);
>       else
> -             state = !!gpio_get_value(button->gpio);
> +             state = !!gpiod_get_value(button->gpiod);
>  
>       if (state != bdata->last_state) {
>               unsigned int type = button->type ?: EV_KEY;
>  
> -             input_event(input, type, button->code,
> -                         !!(state ^ button->active_low));
> +             input_event(input, type, button->code, state);
>               input_sync(input);
>               bdata->count = 0;
>               bdata->last_state = state;
> @@ -259,7 +259,6 @@ static int gpio_keys_polled_probe(struct platform_device 
> *pdev)
>       for (i = 0; i < pdata->nbuttons; i++) {
>               struct gpio_keys_button *button = &pdata->buttons[i];
>               struct gpio_keys_button_data *bdata = &bdev->data[i];
> -             unsigned int gpio = button->gpio;
>               unsigned int type = button->type ?: EV_KEY;
>  
>               if (button->wakeup) {
> @@ -267,15 +266,31 @@ static int gpio_keys_polled_probe(struct 
> platform_device *pdev)
>                       return -EINVAL;
>               }
>  
> -             error = devm_gpio_request_one(&pdev->dev, gpio, GPIOF_IN,
> -                                           button->desc ? : DRV_NAME);
> -             if (error) {
> -                     dev_err(dev, "unable to claim gpio %u, err=%d\n",
> -                             gpio, error);
> -                     return error;
> +             /*
> +              * Legacy GPIO number so request the GPIO here and
> +              * convert it to descriptor.
> +              */
> +             if (!button->gpiod && gpio_is_valid(button->gpio)) {
> +                     unsigned flags = 0;
> +
> +                     if (button->active_low)
> +                             flags |= GPIOF_ACTIVE_LOW;
> +
> +                     error = devm_gpio_request_one(&pdev->dev, button->gpio,
> +                                     flags, button->desc ? : DRV_NAME);
> +                     if (error) {
> +                             dev_err(dev, "unable to claim gpio %u, 
> err=%d\n",
> +                                     button->gpio, error);
> +                             return error;
> +                     }
> +
> +                     button->gpiod = gpio_to_desc(button->gpio);
>               }
>  
> -             bdata->can_sleep = gpio_cansleep(gpio);
> +             if (IS_ERR(button->gpiod))
> +                     return PTR_ERR(button->gpiod);
> +
> +             bdata->can_sleep = gpiod_cansleep(button->gpiod);
>               bdata->last_state = -1;
>               bdata->threshold = DIV_ROUND_UP(button->debounce_interval,
>                                               pdata->poll_interval);
> diff --git a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h
> index 8b62246..ee2d8c6 100644
> --- a/include/linux/gpio_keys.h
> +++ b/include/linux/gpio_keys.h
> @@ -2,6 +2,7 @@
>  #define _GPIO_KEYS_H
>  
>  struct device;
> +struct gpio_desc;
>  
>  /**
>   * struct gpio_keys_button - configuration parameters
> @@ -17,6 +18,7 @@ struct device;
>   *                   disable button via sysfs
>   * @value:           axis value for %EV_ABS
>   * @irq:             Irq number in case of interrupt keys
> + * @gpiod:           GPIO descriptor
>   */
>  struct gpio_keys_button {
>       unsigned int code;
> @@ -29,6 +31,7 @@ struct gpio_keys_button {
>       bool can_disable;
>       int value;
>       unsigned int irq;
> +     struct gpio_desc *gpiod;
>  };
>  
>  /**
> -- 
> 1.9.3
> 
> 

-- 
Dmitry
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to