|
23 | 23 | #include <linux/ioport.h>
|
24 | 24 | #include <linux/platform_device.h>
|
25 | 25 | #include <linux/gpio.h>
|
| 26 | +#include <linux/gpio/consumer.h> |
26 | 27 | #include <linux/gpio_keys.h>
|
27 | 28 | #include <linux/of.h>
|
28 | 29 | #include <linux/of_platform.h>
|
@@ -51,15 +52,14 @@ static void gpio_keys_polled_check_state(struct input_dev *input,
|
51 | 52 | int state;
|
52 | 53 |
|
53 | 54 | if (bdata->can_sleep)
|
54 |
| - state = !!gpio_get_value_cansleep(button->gpio); |
| 55 | + state = !!gpiod_get_value_cansleep(button->gpiod); |
55 | 56 | else
|
56 |
| - state = !!gpio_get_value(button->gpio); |
| 57 | + state = !!gpiod_get_value(button->gpiod); |
57 | 58 |
|
58 | 59 | if (state != bdata->last_state) {
|
59 | 60 | unsigned int type = button->type ?: EV_KEY;
|
60 | 61 |
|
61 |
| - input_event(input, type, button->code, |
62 |
| - !!(state ^ button->active_low)); |
| 62 | + input_event(input, type, button->code, state); |
63 | 63 | input_sync(input);
|
64 | 64 | bdata->count = 0;
|
65 | 65 | bdata->last_state = state;
|
@@ -259,23 +259,38 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
|
259 | 259 | for (i = 0; i < pdata->nbuttons; i++) {
|
260 | 260 | struct gpio_keys_button *button = &pdata->buttons[i];
|
261 | 261 | struct gpio_keys_button_data *bdata = &bdev->data[i];
|
262 |
| - unsigned int gpio = button->gpio; |
263 | 262 | unsigned int type = button->type ?: EV_KEY;
|
264 | 263 |
|
265 | 264 | if (button->wakeup) {
|
266 | 265 | dev_err(dev, DRV_NAME " does not support wakeup\n");
|
267 | 266 | return -EINVAL;
|
268 | 267 | }
|
269 | 268 |
|
270 |
| - error = devm_gpio_request_one(&pdev->dev, gpio, GPIOF_IN, |
271 |
| - button->desc ? : DRV_NAME); |
272 |
| - if (error) { |
273 |
| - dev_err(dev, "unable to claim gpio %u, err=%d\n", |
274 |
| - gpio, error); |
275 |
| - return error; |
| 269 | + /* |
| 270 | + * Legacy GPIO number so request the GPIO here and |
| 271 | + * convert it to descriptor. |
| 272 | + */ |
| 273 | + if (!button->gpiod && gpio_is_valid(button->gpio)) { |
| 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 | 294 | bdata->last_state = -1;
|
280 | 295 | bdata->threshold = DIV_ROUND_UP(button->debounce_interval,
|
281 | 296 | pdata->poll_interval);
|
|
0 commit comments