From: Aleksey Kuleshov <rndfax@yandex.ru>
To: barebox@lists.infradead.org
Cc: Aleksey Kuleshov <rndfax@yandex.ru>
Subject: [PATCH] usb_kbd: fix overpolling of keyboard
Date: Wed, 2 Mar 2016 13:50:36 +0300 [thread overview]
Message-ID: <1456915836-11021-1-git-send-email-rndfax@yandex.ru> (raw)
- use async callings to call poll function
- remove unused
- remove unnecessary locking
---
drivers/input/usb_kbd.c | 41 ++++++++++++++++++++---------------------
1 file changed, 20 insertions(+), 21 deletions(-)
diff --git a/drivers/input/usb_kbd.c b/drivers/input/usb_kbd.c
index 74bc11f..03796f3 100644
--- a/drivers/input/usb_kbd.c
+++ b/drivers/input/usb_kbd.c
@@ -46,13 +46,10 @@
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 poller_async poller;
struct usb_device *usbdev;
- int lock;
unsigned long intpipe;
int intpktsize;
int intinterval;
@@ -94,23 +91,17 @@ 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;
- 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 and die forever */
dev_err(&usbdev->dev,
"usb_submit_int_msg() failed. Keyboard disconnect?\n");
return;
@@ -125,7 +116,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);
@@ -145,10 +135,10 @@ 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;
+ poller_call_async(&data->poller, data->intinterval * MSECOND, usb_kbd_poll, data);
}
static int usb_kbd_probe(struct usb_device *usbdev,
@@ -173,7 +163,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);
@@ -199,18 +188,28 @@ 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;
+ }
+
+ ret = poller_async_register(&data->poller);
+ if (ret) {
+ dev_err(&usbdev->dev, "can't setup poller\n");
+ return ret;
+ }
- data->poller.func = usb_kbd_poll;
+ 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);
--
2.6.2
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
next reply other threads:[~2016-03-02 11:21 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-02 10:50 Aleksey Kuleshov [this message]
2016-03-03 8:01 ` Sascha Hauer
2016-03-03 8:28 ` Aleksey Kuleshov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1456915836-11021-1-git-send-email-rndfax@yandex.ru \
--to=rndfax@yandex.ru \
--cc=barebox@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox