aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/keyboard/gpio_keys_polled.c
diff options
context:
space:
mode:
authorAaron Lu <aaron.lu@intel.com>2014-10-21 17:30:25 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2014-11-04 15:58:23 -0500
commit633a21d80b4a2cd648aa2dacdb22494ffb2f28f0 (patch)
tree0e2dfc45b7ce0b9ed7401bc886417d447a7a08fd /drivers/input/keyboard/gpio_keys_polled.c
parent5c51277a9ababfa44a7f944100bdc9fbda139905 (diff)
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: Aaron Lu <aaron.lu@intel.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Acked-by: Alexandre Courbot <acourbot@nvidia.com> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Acked-by: Grant Likely <grant.likely@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/input/keyboard/gpio_keys_polled.c')
-rw-r--r--drivers/input/keyboard/gpio_keys_polled.c39
1 files changed, 27 insertions, 12 deletions
diff --git a/drivers/input/keyboard/gpio_keys_polled.c b/drivers/input/keyboard/gpio_keys_polled.c
index 432d36395f35..b7a514ced509 100644
--- a/drivers/input/keyboard/gpio_keys_polled.c
+++ b/drivers/input/keyboard/gpio_keys_polled.c
@@ -23,6 +23,7 @@
23#include <linux/ioport.h> 23#include <linux/ioport.h>
24#include <linux/platform_device.h> 24#include <linux/platform_device.h>
25#include <linux/gpio.h> 25#include <linux/gpio.h>
26#include <linux/gpio/consumer.h>
26#include <linux/gpio_keys.h> 27#include <linux/gpio_keys.h>
27#include <linux/of.h> 28#include <linux/of.h>
28#include <linux/of_platform.h> 29#include <linux/of_platform.h>
@@ -51,15 +52,14 @@ static void gpio_keys_polled_check_state(struct input_dev *input,
51 int state; 52 int state;
52 53
53 if (bdata->can_sleep) 54 if (bdata->can_sleep)
54 state = !!gpio_get_value_cansleep(button->gpio); 55 state = !!gpiod_get_value_cansleep(button->gpiod);
55 else 56 else
56 state = !!gpio_get_value(button->gpio); 57 state = !!gpiod_get_value(button->gpiod);
57 58
58 if (state != bdata->last_state) { 59 if (state != bdata->last_state) {
59 unsigned int type = button->type ?: EV_KEY; 60 unsigned int type = button->type ?: EV_KEY;
60 61
61 input_event(input, type, button->code, 62 input_event(input, type, button->code, state);
62 !!(state ^ button->active_low));
63 input_sync(input); 63 input_sync(input);
64 bdata->count = 0; 64 bdata->count = 0;
65 bdata->last_state = state; 65 bdata->last_state = state;
@@ -259,7 +259,6 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
259 for (i = 0; i < pdata->nbuttons; i++) { 259 for (i = 0; i < pdata->nbuttons; i++) {
260 struct gpio_keys_button *button = &pdata->buttons[i]; 260 struct gpio_keys_button *button = &pdata->buttons[i];
261 struct gpio_keys_button_data *bdata = &bdev->data[i]; 261 struct gpio_keys_button_data *bdata = &bdev->data[i];
262 unsigned int gpio = button->gpio;
263 unsigned int type = button->type ?: EV_KEY; 262 unsigned int type = button->type ?: EV_KEY;
264 263
265 if (button->wakeup) { 264 if (button->wakeup) {
@@ -267,15 +266,31 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
267 return -EINVAL; 266 return -EINVAL;
268 } 267 }
269 268
270 error = devm_gpio_request_one(&pdev->dev, gpio, GPIOF_IN, 269 /*
271 button->desc ? : DRV_NAME); 270 * Legacy GPIO number so request the GPIO here and
272 if (error) { 271 * convert it to descriptor.
273 dev_err(dev, "unable to claim gpio %u, err=%d\n", 272 */
274 gpio, error); 273 if (!button->gpiod && gpio_is_valid(button->gpio)) {
275 return error; 274 unsigned flags = 0;
275
276 if (button->active_low)
277 flags |= GPIOF_ACTIVE_LOW;
278
279 error = devm_gpio_request_one(&pdev->dev, button->gpio,
280 flags, button->desc ? : DRV_NAME);
281 if (error) {
282 dev_err(dev, "unable to claim gpio %u, err=%d\n",
283 button->gpio, error);
284 return error;
285 }
286
287 button->gpiod = gpio_to_desc(button->gpio);
276 } 288 }
277 289
278 bdata->can_sleep = gpio_cansleep(gpio); 290 if (IS_ERR(button->gpiod))
291 return PTR_ERR(button->gpiod);
292
293 bdata->can_sleep = gpiod_cansleep(button->gpiod);
279 bdata->last_state = -1; 294 bdata->last_state = -1;
280 bdata->threshold = DIV_ROUND_UP(button->debounce_interval, 295 bdata->threshold = DIV_ROUND_UP(button->debounce_interval,
281 pdata->poll_interval); 296 pdata->poll_interval);