summaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorAleksey Kuleshov <rndfax@yandex.ru>2016-03-09 13:17:51 +0300
committerSascha Hauer <s.hauer@pengutronix.de>2016-03-10 10:00:01 +0100
commitb73e1479d62bed0d4de1b26fef069dbc9190a129 (patch)
treea8c55e93b10c886ffb673e1edc4f476d200a0839 /drivers/input
parent9505b28a68fc105fd76053015c2742933aa671e8 (diff)
downloadbarebox-b73e1479d62bed0d4de1b26fef069dbc9190a129.tar.gz
barebox-b73e1479d62bed0d4de1b26fef069dbc9190a129.tar.xz
usb_kbd: use async polling instead of regular polling
This fixes the overpolling of USB keyboard which causes slowdown of entier barebox by using periodic polling occuting once per some milliseconds. Signed-off-by: Aleksey Kuleshov <rndfax@yandex.ru> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/usb_kbd.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/input/usb_kbd.c b/drivers/input/usb_kbd.c
index 6f7a081618..bdaf305781 100644
--- a/drivers/input/usb_kbd.c
+++ b/drivers/input/usb_kbd.c
@@ -48,7 +48,7 @@ struct usb_kbd_pdata;
struct usb_kbd_pdata {
uint8_t *new;
uint8_t old[USB_KBD_BOOT_REPORT_SIZE];
- struct poller_struct poller;
+ struct poller_async poller;
struct usb_device *usbdev;
int lock;
unsigned long intpipe;
@@ -92,10 +92,9 @@ static const unsigned char usb_kbd_keycode[256] = {
150,158,159,128,136,177,178,176,142,152,173,140
};
-static void usb_kbd_poll(struct poller_struct *poller)
+static void usb_kbd_poll(void *arg)
{
- struct usb_kbd_pdata *data = container_of(poller,
- struct usb_kbd_pdata, poller);
+ struct usb_kbd_pdata *data = arg;
struct usb_device *usbdev = data->usbdev;
int ret, i;
@@ -146,6 +145,7 @@ static void usb_kbd_poll(struct poller_struct *poller)
exit:
data->lock = 0;
+ poller_call_async(&data->poller, data->intinterval * MSECOND, usb_kbd_poll, data);
}
static int usb_kbd_probe(struct usb_device *usbdev,
@@ -201,16 +201,22 @@ static int usb_kbd_probe(struct usb_device *usbdev,
return ret;
}
- data->poller.func = usb_kbd_poll;
+ ret = poller_async_register(&data->poller);
+ if (ret) {
+ dev_err(&usbdev->dev, "can't setup poller\n");
+ return ret;
+ }
+
+ poller_call_async(&data->poller, data->intinterval * MSECOND, usb_kbd_poll, data);
- return poller_register(&data->poller);
+ return 0;
}
static void usb_kbd_disconnect(struct usb_device *usbdev)
{
struct usb_kbd_pdata *data = usbdev->drv_data;
- poller_unregister(&data->poller);
+ poller_async_unregister(&data->poller);
input_device_unregister(&data->input);
dma_free(data->new);
free(data);