Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 633a21d8 authored by Aaron Lu's avatar Aaron Lu Committed by Rafael J. Wysocki
Browse files

input: gpio_keys_polled: Add support for GPIO descriptors



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: default avatarAaron Lu <aaron.lu@intel.com>
Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Acked-by: default avatarAlexandre Courbot <acourbot@nvidia.com>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Acked-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Acked-by: default avatarGrant Likely <grant.likely@linaro.org>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 5c51277a
Loading
Loading
Loading
Loading
+27 −12
Original line number Diff line number Diff line
@@ -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);
		/*
		 * 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",
				gpio, error);
					button->gpio, error);
				return error;
			}

		bdata->can_sleep = gpio_cansleep(gpio);
			button->gpiod = gpio_to_desc(button->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);
+3 −0
Original line number Diff line number Diff line
@@ -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;
};

/**