diff options
author | Aaron Lu <aaron.lu@intel.com> | 2014-10-21 17:30:25 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-11-04 15:58:23 -0500 |
commit | 633a21d80b4a2cd648aa2dacdb22494ffb2f28f0 (patch) | |
tree | 0e2dfc45b7ce0b9ed7401bc886417d447a7a08fd /drivers/input/keyboard/gpio_keys_polled.c | |
parent | 5c51277a9ababfa44a7f944100bdc9fbda139905 (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.c | 39 |
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); |