diff options
Diffstat (limited to 'drivers/input/gpio_keys.c')
-rw-r--r-- | drivers/input/gpio_keys.c | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/drivers/input/gpio_keys.c b/drivers/input/gpio_keys.c index 11d598c402..c23d20563c 100644 --- a/drivers/input/gpio_keys.c +++ b/drivers/input/gpio_keys.c @@ -1,7 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0-only /* * Copyright (C) 2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> - * - * Under GPLv2 */ #include <common.h> @@ -30,24 +29,25 @@ struct gpio_keys { struct gpio_key *buttons; int nbuttons; - struct poller_struct poller; + struct poller_async poller; struct input_device input; - struct device_d *dev; + struct device *dev; }; -static inline struct gpio_keys * -poller_to_gk_pdata(struct poller_struct *poller) +static void gpio_key_poller(void *data) { - return container_of(poller, struct gpio_keys, poller); -} - -static void gpio_key_poller(struct poller_struct *poller) -{ - struct gpio_keys *gk = poller_to_gk_pdata(poller); + struct gpio_keys *gk = data; struct gpio_key *gb; int i, val; for (i = 0; i < gk->nbuttons; i++) { + gb = &gk->buttons[i]; + + if (gpio_slice_acquired(gb->gpio)) + goto out; + } + + for (i = 0; i < gk->nbuttons; i++) { gb = &gk->buttons[i]; val = gpio_get_value(gb->gpio); @@ -65,9 +65,11 @@ static void gpio_key_poller(struct poller_struct *poller) gb->previous_state = val; } } +out: + poller_call_async(&gk->poller, 10 * MSECOND, gpio_key_poller, gk); } -static int gpio_keys_probe_pdata(struct gpio_keys *gk, struct device_d *dev) +static int gpio_keys_probe_pdata(struct gpio_keys *gk, struct device *dev) { struct gpio_keys_platform_data *pdata; int i; @@ -93,9 +95,9 @@ static int gpio_keys_probe_pdata(struct gpio_keys *gk, struct device_d *dev) return 0; } -static int gpio_keys_probe_dt(struct gpio_keys *gk, struct device_d *dev) +static int gpio_keys_probe_dt(struct gpio_keys *gk, struct device *dev) { - struct device_node *npkey, *np = dev->device_node; + struct device_node *npkey, *np = dev->of_node; int i = 0, ret; if (!IS_ENABLED(CONFIG_OFDEVICE) || !IS_ENABLED(CONFIG_OF_GPIO)) @@ -132,7 +134,7 @@ static int gpio_keys_probe_dt(struct gpio_keys *gk, struct device_d *dev) return 0; } -static int __init gpio_keys_probe(struct device_d *dev) +static int __init gpio_keys_probe(struct device *dev) { int ret, i, gpio; struct gpio_keys *gk; @@ -141,7 +143,7 @@ static int __init gpio_keys_probe(struct device_d *dev) gk->dev = dev; - if (dev->device_node) + if (dev->of_node) ret = gpio_keys_probe_dt(gk, dev); else ret = gpio_keys_probe_pdata(gk, dev); @@ -160,16 +162,16 @@ static int __init gpio_keys_probe(struct device_d *dev) gk->buttons[i].previous_state = gk->buttons[i].active_low; } - gk->poller.func = gpio_key_poller; - ret = input_device_register(&gk->input); if (ret) return ret; - ret = poller_register(&gk->poller, dev_name(dev)); + ret = poller_async_register(&gk->poller, dev_name(dev)); if (ret) return ret; + poller_call_async(&gk->poller, 10 * MSECOND, gpio_key_poller, gk); + return 0; } @@ -177,8 +179,9 @@ static struct of_device_id key_gpio_of_ids[] = { { .compatible = "gpio-keys", }, { } }; +MODULE_DEVICE_TABLE(of, key_gpio_of_ids); -static struct driver_d gpio_keys_driver = { +static struct driver gpio_keys_driver = { .name = "gpio_keys", .probe = gpio_keys_probe, .of_compatible = DRV_OF_COMPAT(key_gpio_of_ids), |