Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 49253d54 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman
Browse files

staging: comedi: vmk80xx: factor out usb endpoint detection



Factor the code that detects the usb endpoints out of vmk80xx_usb_probe().

Cleanup the detection code in the new function,

Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent da7b18ee
Loading
Loading
Loading
Loading
+39 −35
Original line number Diff line number Diff line
@@ -1138,6 +1138,40 @@ static int vmk80xx_pwm_winsn(struct comedi_device *dev,
	return n;
}

static int vmk80xx_find_usb_endpoints(struct vmk80xx_private *devpriv,
				      struct usb_interface *intf)
{
	struct usb_host_interface *iface_desc = intf->cur_altsetting;
	struct usb_endpoint_descriptor *ep_desc;
	int i;

	if (iface_desc->desc.bNumEndpoints != 2)
		return -ENODEV;

	for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) {
		ep_desc = &iface_desc->endpoint[i].desc;

		if (usb_endpoint_is_int_in(ep_desc) ||
		    usb_endpoint_is_bulk_in(ep_desc)) {
			if (!devpriv->ep_rx)
				devpriv->ep_rx = ep_desc;
			continue;
		}

		if (usb_endpoint_is_int_out(ep_desc) ||
		    usb_endpoint_is_bulk_out(ep_desc)) {
			if (!devpriv->ep_tx)
				devpriv->ep_tx = ep_desc;
			continue;
		}
	}

	if (!devpriv->ep_rx || !devpriv->ep_tx)
		return -ENODEV;

	return 0;
}

static int vmk80xx_attach_common(struct comedi_device *dev,
				 struct vmk80xx_private *devpriv)
{
@@ -1299,9 +1333,8 @@ static int vmk80xx_usb_probe(struct usb_interface *intf,
{
	const struct vmk80xx_board *boardinfo;
	struct vmk80xx_private *devpriv;
	struct usb_host_interface *iface_desc;
	struct usb_endpoint_descriptor *ep_desc;
	size_t size;
	int ret;
	int i;

	mutex_lock(&glb_mutex);
@@ -1320,37 +1353,12 @@ static int vmk80xx_usb_probe(struct usb_interface *intf,
	memset(devpriv, 0x00, sizeof(*devpriv));
	devpriv->count = i;

	iface_desc = intf->cur_altsetting;
	if (iface_desc->desc.bNumEndpoints != 2)
		goto error;

	for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) {
		ep_desc = &iface_desc->endpoint[i].desc;

		if (usb_endpoint_is_int_in(ep_desc)) {
			devpriv->ep_rx = ep_desc;
			continue;
		}

		if (usb_endpoint_is_int_out(ep_desc)) {
			devpriv->ep_tx = ep_desc;
			continue;
		}

		if (usb_endpoint_is_bulk_in(ep_desc)) {
			devpriv->ep_rx = ep_desc;
			continue;
		}

		if (usb_endpoint_is_bulk_out(ep_desc)) {
			devpriv->ep_tx = ep_desc;
			continue;
		}
	ret = vmk80xx_find_usb_endpoints(devpriv, intf);
	if (ret) {
		mutex_unlock(&glb_mutex);
		return ret;
	}

	if (!devpriv->ep_rx || !devpriv->ep_tx)
		goto error;

	size = le16_to_cpu(devpriv->ep_rx->wMaxPacketSize);
	devpriv->usb_rx_buf = kmalloc(size, GFP_KERNEL);
	if (!devpriv->usb_rx_buf) {
@@ -1406,10 +1414,6 @@ static int vmk80xx_usb_probe(struct usb_interface *intf,
	comedi_usb_auto_config(intf, &vmk80xx_driver);

	return 0;
error:
	mutex_unlock(&glb_mutex);

	return -ENODEV;
}

static const struct usb_device_id vmk80xx_usb_id_table[] = {