usb_kbd: release all keys on error / disconnect
Signed-off-by: Peter Mamonov <pmamonov@gmail.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
9df009de99
commit
f4ea4a134b
|
@ -58,6 +58,14 @@ struct usb_kbd_pdata {
|
||||||
struct input_device input;
|
struct input_device input;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void usb_kbd_release_all_keys(struct usb_kbd_pdata *data)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i <= KEY_MAX; i++)
|
||||||
|
input_report_key_event(&data->input, i, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static int usb_kbd_int_poll(struct usb_kbd_pdata *data)
|
static int usb_kbd_int_poll(struct usb_kbd_pdata *data)
|
||||||
{
|
{
|
||||||
return usb_submit_int_msg(data->usbdev, data->intpipe, data->new,
|
return usb_submit_int_msg(data->usbdev, data->intpipe, data->new,
|
||||||
|
@ -98,6 +106,8 @@ static void usb_kbd_poll(void *arg)
|
||||||
int ret, i;
|
int ret, i;
|
||||||
|
|
||||||
ret = data->do_poll(data);
|
ret = data->do_poll(data);
|
||||||
|
if (ret < 0)
|
||||||
|
usb_kbd_release_all_keys(data);
|
||||||
if (ret == -EAGAIN)
|
if (ret == -EAGAIN)
|
||||||
goto exit;
|
goto exit;
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -209,6 +219,7 @@ static void usb_kbd_disconnect(struct usb_device *usbdev)
|
||||||
{
|
{
|
||||||
struct usb_kbd_pdata *data = usbdev->drv_data;
|
struct usb_kbd_pdata *data = usbdev->drv_data;
|
||||||
|
|
||||||
|
usb_kbd_release_all_keys(data);
|
||||||
poller_async_unregister(&data->poller);
|
poller_async_unregister(&data->poller);
|
||||||
input_device_unregister(&data->input);
|
input_device_unregister(&data->input);
|
||||||
dma_free(data->new);
|
dma_free(data->new);
|
||||||
|
|
Loading…
Reference in New Issue