Bladeren bron

Input: usbtouchscreen - find input endpoint automatically

Find input enpoint automatically instead of assuming that the first one is
OK.  This is needed for devices with multiple endpoints such as iNexio
where the first endpoint might be output.

Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Ondrej Zary 15 jaren geleden
bovenliggende
commit
f4a5e359c4
1 gewijzigde bestanden met toevoegingen van 14 en 3 verwijderingen
  1. 14 3
      drivers/input/touchscreen/usbtouchscreen.c

+ 14 - 3
drivers/input/touchscreen/usbtouchscreen.c

@@ -1050,13 +1050,23 @@ static void usbtouch_free_buffers(struct usb_device *udev,
 	kfree(usbtouch->buffer);
 	kfree(usbtouch->buffer);
 }
 }
 
 
+static struct usb_endpoint_descriptor *
+usbtouch_get_input_endpoint(struct usb_host_interface *interface)
+{
+	int i;
+
+	for (i = 0; i < interface->desc.bNumEndpoints; i++)
+		if (usb_endpoint_dir_in(&interface->endpoint[i].desc))
+			return &interface->endpoint[i].desc;
+
+	return NULL;
+}
 
 
 static int usbtouch_probe(struct usb_interface *intf,
 static int usbtouch_probe(struct usb_interface *intf,
 			  const struct usb_device_id *id)
 			  const struct usb_device_id *id)
 {
 {
 	struct usbtouch_usb *usbtouch;
 	struct usbtouch_usb *usbtouch;
 	struct input_dev *input_dev;
 	struct input_dev *input_dev;
-	struct usb_host_interface *interface;
 	struct usb_endpoint_descriptor *endpoint;
 	struct usb_endpoint_descriptor *endpoint;
 	struct usb_device *udev = interface_to_usbdev(intf);
 	struct usb_device *udev = interface_to_usbdev(intf);
 	struct usbtouch_device_info *type;
 	struct usbtouch_device_info *type;
@@ -1066,8 +1076,9 @@ static int usbtouch_probe(struct usb_interface *intf,
 	if (id->driver_info == DEVTYPE_IGNORE)
 	if (id->driver_info == DEVTYPE_IGNORE)
 		return -ENODEV;
 		return -ENODEV;
 
 
-	interface = intf->cur_altsetting;
-	endpoint = &interface->endpoint[0].desc;
+	endpoint = usbtouch_get_input_endpoint(intf->cur_altsetting);
+	if (!endpoint)
+		return -ENXIO;
 
 
 	usbtouch = kzalloc(sizeof(struct usbtouch_usb), GFP_KERNEL);
 	usbtouch = kzalloc(sizeof(struct usbtouch_usb), GFP_KERNEL);
 	input_dev = input_allocate_device();
 	input_dev = input_allocate_device();