diff options
author | Aleksey Kuleshov <rndfax@yandex.ru> | 2016-03-09 13:17:51 +0300 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2016-03-10 10:00:01 +0100 |
commit | b73e1479d62bed0d4de1b26fef069dbc9190a129 (patch) | |
tree | a8c55e93b10c886ffb673e1edc4f476d200a0839 /drivers/input | |
parent | 9505b28a68fc105fd76053015c2742933aa671e8 (diff) | |
download | barebox-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.c | 20 |
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); |