9
0
Fork 0

input: gpio-keys: convert to input framework

To allow asking for the button states.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2016-01-13 12:14:33 +01:00
parent 30b7c5ead3
commit 253fb33bb8
2 changed files with 18 additions and 47 deletions

View File

@ -15,6 +15,7 @@ config KEYBOARD_GPIO
bool "GPIO Buttons"
depends on GENERIC_GPIO
select POLLER
select INPUT
help
This driver implements support for buttons connected
to GPIO pins of various CPUs (and some other chips).

View File

@ -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[] = {