From d0e367ba4da3d4e8877e587b02fc63b0ae6d1e54 Mon Sep 17 00:00:00 2001 From: Aleksey Kuleshov Date: Wed, 9 Mar 2016 13:17:48 +0300 Subject: usb_kbd: remove unused fields Signed-off-by: Aleksey Kuleshov Signed-off-by: Sascha Hauer --- drivers/input/usb_kbd.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'drivers/input') diff --git a/drivers/input/usb_kbd.c b/drivers/input/usb_kbd.c index 74bc11f3bb..e41266c87f 100644 --- a/drivers/input/usb_kbd.c +++ b/drivers/input/usb_kbd.c @@ -46,10 +46,8 @@ struct usb_kbd_pdata; struct usb_kbd_pdata { - uint64_t last_report; uint8_t *new; uint8_t old[USB_KBD_BOOT_REPORT_SIZE]; - uint8_t flags; struct poller_struct poller; struct usb_device *usbdev; int lock; @@ -173,7 +171,6 @@ static int usb_kbd_probe(struct usb_device *usbdev, data->new = dma_alloc(USB_KBD_BOOT_REPORT_SIZE); data->usbdev = usbdev; - data->last_report = get_time_ns(); data->ep = &iface->ep_desc[0]; data->intpipe = usb_rcvintpipe(usbdev, data->ep->bEndpointAddress); -- cgit v1.2.3 From c0d42b3d7b03740106053338a1f3316a8365332b Mon Sep 17 00:00:00 2001 From: Aleksey Kuleshov Date: Wed, 9 Mar 2016 13:17:49 +0300 Subject: usb_kbd: check for registering error Signed-off-by: Aleksey Kuleshov Signed-off-by: Sascha Hauer --- drivers/input/usb_kbd.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'drivers/input') diff --git a/drivers/input/usb_kbd.c b/drivers/input/usb_kbd.c index e41266c87f..ff8e591ed1 100644 --- a/drivers/input/usb_kbd.c +++ b/drivers/input/usb_kbd.c @@ -196,7 +196,11 @@ static int usb_kbd_probe(struct usb_device *usbdev, } else dev_dbg(&usbdev->dev, "poll keyboard via int ep\n"); - input_device_register(&data->input); + ret = input_device_register(&data->input); + if (ret) { + dev_err(&usbdev->dev, "can't register input\n"); + return ret; + } data->poller.func = usb_kbd_poll; -- cgit v1.2.3 From 9505b28a68fc105fd76053015c2742933aa671e8 Mon Sep 17 00:00:00 2001 From: Aleksey Kuleshov Date: Wed, 9 Mar 2016 13:17:50 +0300 Subject: usb_kbd: style fixes Signed-off-by: Aleksey Kuleshov Signed-off-by: Sascha Hauer --- drivers/input/usb_kbd.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'drivers/input') diff --git a/drivers/input/usb_kbd.c b/drivers/input/usb_kbd.c index ff8e591ed1..6f7a081618 100644 --- a/drivers/input/usb_kbd.c +++ b/drivers/input/usb_kbd.c @@ -123,7 +123,6 @@ static void usb_kbd_poll(struct poller_struct *poller) input_report_key_event(&data->input, usb_kbd_keycode[i + 224], (data->new[0] >> i) & 1); for (i = 2; i < 8; i++) { - if (data->old[i] > 3 && memscan(data->new + 2, data->old[i], 6) == data->new + 8) { if (usb_kbd_keycode[data->old[i]]) input_report_key_event(&data->input, usb_kbd_keycode[data->old[i]], 0); @@ -143,7 +142,7 @@ static void usb_kbd_poll(struct poller_struct *poller) } } - memcpy(data->old, data->new, 8); + memcpy(data->old, data->new, USB_KBD_BOOT_REPORT_SIZE); exit: data->lock = 0; -- cgit v1.2.3 From b73e1479d62bed0d4de1b26fef069dbc9190a129 Mon Sep 17 00:00:00 2001 From: Aleksey Kuleshov Date: Wed, 9 Mar 2016 13:17:51 +0300 Subject: 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 Signed-off-by: Sascha Hauer --- drivers/input/usb_kbd.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'drivers/input') 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); -- cgit v1.2.3 From 504c511e4ac0fe67ca0126507509b7e7e995751b Mon Sep 17 00:00:00 2001 From: Aleksey Kuleshov Date: Wed, 9 Mar 2016 13:17:52 +0300 Subject: usb_kbd: lock is useless since pollers are atomic Signed-off-by: Aleksey Kuleshov Signed-off-by: Sascha Hauer --- drivers/input/usb_kbd.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) (limited to 'drivers/input') diff --git a/drivers/input/usb_kbd.c b/drivers/input/usb_kbd.c index bdaf305781..2acc95d9fd 100644 --- a/drivers/input/usb_kbd.c +++ b/drivers/input/usb_kbd.c @@ -50,7 +50,6 @@ struct usb_kbd_pdata { uint8_t old[USB_KBD_BOOT_REPORT_SIZE]; struct poller_async poller; struct usb_device *usbdev; - int lock; unsigned long intpipe; int intpktsize; int intinterval; @@ -98,16 +97,11 @@ static void usb_kbd_poll(void *arg) struct usb_device *usbdev = data->usbdev; int ret, i; - if (data->lock) - return; - - data->lock = 1; - ret = data->do_poll(data); if (ret == -EAGAIN) goto exit; if (ret < 0) { - /* exit and lock forever */ + /* exit with noreturn */ dev_err(&usbdev->dev, "usb_submit_int_msg() failed. Keyboard disconnect?\n"); return; @@ -144,7 +138,6 @@ static void usb_kbd_poll(void *arg) memcpy(data->old, data->new, USB_KBD_BOOT_REPORT_SIZE); exit: - data->lock = 0; poller_call_async(&data->poller, data->intinterval * MSECOND, usb_kbd_poll, data); } -- cgit v1.2.3