Re: [PATCH 09/12] input: gpio_keys_polled - Add support for GPIO descriptors

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Tue, Oct 07, 2014 at 02:16:47AM +0200, Rafael J. Wysocki wrote:
> From: Aaron Lu <aaron.lu@xxxxxxxxx>
> 
> 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.lu@xxxxxxxxx>
> Signed-off-by: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx>
> Acked-by: Alexandre Courbot <acourbot@xxxxxxxxxx>
> Reviewed-by: Linus Walleij <linus.walleij@xxxxxxxxxx>
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>


Acked-by: Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx>


> ---
>  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 devicetree" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]
  Powered by Linux