[PATCH 15/15] input: gpio-keys: convert to input framework
Sascha Hauer
s.hauer at pengutronix.de
Wed Jan 13 07:37:36 PST 2016
To allow asking for the button states.
Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
drivers/input/gpio_keys.c | 64 +++++++++++++----------------------------------
1 file changed, 17 insertions(+), 47 deletions(-)
diff --git a/drivers/input/gpio_keys.c b/drivers/input/gpio_keys.c
index acb9e07..38c0f11 100644
--- a/drivers/input/gpio_keys.c
+++ b/drivers/input/gpio_keys.c
@@ -12,7 +12,7 @@
#include <poller.h>
#include <gpio.h>
#include <of_gpio.h>
-#include <input/keyboard.h>
+#include <input/input.h>
struct gpio_key {
int code;
@@ -30,12 +30,9 @@ struct gpio_keys {
struct gpio_key *buttons;
int nbuttons;
- /* optional */
- int fifo_size;
-
- struct kfifo *recv_fifo;
struct poller_struct poller;
- struct console_device cdev;
+ struct input_device input;
+ struct device_d *dev;
};
static inline struct gpio_keys *
@@ -44,12 +41,6 @@ poller_to_gk_pdata(struct poller_struct *poller)
return container_of(poller, struct gpio_keys, poller);
}
-static inline struct gpio_keys *
-cdev_to_gk_pdata(struct console_device *cdev)
-{
- return container_of(cdev, struct gpio_keys, cdev);
-}
-
static void gpio_key_poller(struct poller_struct *poller)
{
struct gpio_keys *gk = poller_to_gk_pdata(poller);
@@ -65,33 +56,17 @@ static void gpio_key_poller(struct poller_struct *poller)
continue;
if (val != gb->previous_state) {
+ int pressed = val != gb->active_low;
+
gb->debounce_start = get_time_ns();
- if (val != gb->active_low) {
- kfifo_put(gk->recv_fifo, (u_char*)&gb->code, sizeof(int));
- debug("pressed gpio(%d) as %d\n", gb->gpio, gb->code);
- }
+ input_report_key_event(&gk->input, gb->code, pressed);
+ dev_dbg(gk->dev, "%s gpio(%d) as %d\n",
+ pressed ? "pressed" : "released", gb->gpio, gb->code);
gb->previous_state = val;
}
}
}
-static int gpio_keys_tstc(struct console_device *cdev)
-{
- struct gpio_keys *gk = cdev_to_gk_pdata(cdev);
-
- return (kfifo_len(gk->recv_fifo) == 0) ? 0 : 1;
-}
-
-static int gpio_keys_getc(struct console_device *cdev)
-{
- int code = 0;
- struct gpio_keys *gk = cdev_to_gk_pdata(cdev);
-
- kfifo_get(gk->recv_fifo, (u_char*)&code, sizeof(int));
-
- return keycode_bb_keys[code];
-}
-
static int gpio_keys_probe_pdata(struct gpio_keys *gk, struct device_d *dev)
{
struct gpio_keys_platform_data *pdata;
@@ -105,9 +80,6 @@ static int gpio_keys_probe_pdata(struct gpio_keys *gk, struct device_d *dev)
return -ENODEV;
}
- if (pdata->fifo_size)
- gk->fifo_size = pdata->fifo_size;
-
gk->buttons = xzalloc(pdata->nbuttons * sizeof(*gk->buttons));
gk->nbuttons = pdata->nbuttons;
@@ -163,11 +135,11 @@ static int gpio_keys_probe_dt(struct gpio_keys *gk, struct device_d *dev)
static int __init gpio_keys_probe(struct device_d *dev)
{
int ret, i, gpio;
- struct console_device *cdev;
struct gpio_keys *gk;
gk = xzalloc(sizeof(*gk));
- gk->fifo_size = 50;
+
+ gk->dev = dev;
if (dev->device_node)
ret = gpio_keys_probe_dt(gk, dev);
@@ -177,8 +149,6 @@ static int __init gpio_keys_probe(struct device_d *dev)
if (ret)
return ret;
- gk->recv_fifo = kfifo_alloc(gk->fifo_size);
-
for (i = 0; i < gk->nbuttons; i++) {
gpio = gk->buttons[i].gpio;
ret = gpio_request(gpio, "gpio_keys");
@@ -192,15 +162,15 @@ static int __init gpio_keys_probe(struct device_d *dev)
gk->poller.func = gpio_key_poller;
- cdev = &gk->cdev;
- dev->type_data = cdev;
- cdev->dev = dev;
- cdev->tstc = gpio_keys_tstc;
- cdev->getc = gpio_keys_getc;
+ ret = input_device_register(&gk->input);
+ if (ret)
+ return ret;
- console_register(&gk->cdev);
+ ret = poller_register(&gk->poller);
+ if (ret)
+ return ret;
- return poller_register(&gk->poller);
+ return 0;
}
static struct of_device_id key_gpio_of_ids[] = {
--
2.6.4
More information about the barebox
mailing list