static int data_bridge_probe(struct usb_interface *iface,
		struct usb_host_endpoint *bulk_in,
		struct usb_host_endpoint *bulk_out, char *name, int id)
{
	struct data_bridge	*dev;
	int			retval;

	dev = __dev[id];
	if (!dev) {
		pr_err("%s: device not found\n", __func__);
		return -ENODEV;
	}

	dev->pdev = platform_device_alloc(name, -1);
	if (!dev->pdev) {
		pr_err("%s: unable to allocate platform device\n", __func__);
		kfree(dev);
		return -ENOMEM;
	}

	/*clear all bits except claimed bit*/
	clear_bit(RX_HALT, &dev->flags);
	clear_bit(TX_HALT, &dev->flags);
	clear_bit(SUSPENDED, &dev->flags);

	dev->id = id;
	dev->name = name;
	dev->udev = interface_to_usbdev(iface);
	dev->intf = iface;

	if (dev->use_int_in_pipe)
		dev->bulk_in = usb_rcvintpipe(dev->udev,
			bulk_in->desc.bEndpointAddress &
			USB_ENDPOINT_NUMBER_MASK);
	else
		dev->bulk_in = usb_rcvbulkpipe(dev->udev,
			bulk_in->desc.bEndpointAddress &
			USB_ENDPOINT_NUMBER_MASK);

	if (bulk_out)
		dev->bulk_out = usb_sndbulkpipe(dev->udev,
		bulk_out->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);

	usb_set_intfdata(iface, dev);

	/*allocate list of rx urbs*/
	retval = data_bridge_prepare_rx(dev);
	if (retval) {
		platform_device_put(dev->pdev);
		return retval;
	}

	platform_device_add(dev->pdev);

	return 0;
}
Exemplo n.º 2
0
static int data_bridge_probe(struct usb_interface *iface,
		struct usb_host_endpoint *bulk_in,
		struct usb_host_endpoint *bulk_out, int id)
{
	struct data_bridge	*dev;

	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
	if (!dev) {
		err("%s: unable to allocate dev\n", __func__);
		return -ENOMEM;
	}

	dev->pdev = platform_device_alloc(data_bridge_names[id], id);
	if (!dev->pdev) {
		err("%s: unable to allocate platform device\n", __func__);
		kfree(dev);
		return -ENOMEM;
	}

	init_usb_anchor(&dev->tx_active);
	init_usb_anchor(&dev->rx_active);
	init_usb_anchor(&dev->delayed);

	INIT_LIST_HEAD(&dev->rx_idle);
	skb_queue_head_init(&dev->rx_done);

	dev->wq = bridge_wq;
	dev->id = id;
	dev->udev = interface_to_usbdev(iface);
	dev->intf = iface;

	dev->bulk_in = usb_rcvbulkpipe(dev->udev,
		bulk_in->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);

	dev->bulk_out = usb_sndbulkpipe(dev->udev,
		bulk_out->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);

	usb_set_intfdata(iface, dev);

	INIT_WORK(&dev->kevent, defer_kevent);
	INIT_WORK(&dev->process_rx_w, data_bridge_process_rx);

	__dev[id] = dev;

	/*allocate list of rx urbs*/
	data_bridge_prepare_rx(dev);
#ifdef CONFIG_MDM_HSIC_PM
	/* if the bridge is open or not, resume to consume mdm request
	 * because this link is not dead, it's alive
	 */
	queue_work(dev->wq, &dev->process_rx_w);
#endif
	platform_device_add(dev->pdev);

	return 0;
}
Exemplo n.º 3
0
static int data_bridge_probe(struct usb_interface *iface,
		struct usb_host_endpoint *bulk_in,
		struct usb_host_endpoint *bulk_out, int id)
{
	struct data_bridge	*dev;
	int			retval;

	dev = __dev[id];
	if (!dev) {
		err("%s: device not found\n", __func__);
		return -ENODEV;
	}

	dev->pdev = platform_device_alloc(data_bridge_names[id], id);
	if (!dev->pdev) {
		err("%s: unable to allocate platform device\n", __func__);
		kfree(dev);
		return -ENOMEM;
	}

	dev->flags = 0;
	dev->id = id;
	dev->udev = interface_to_usbdev(iface);
	dev->intf = iface;

	dev->bulk_in = usb_rcvbulkpipe(dev->udev,
		bulk_in->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);

	dev->bulk_out = usb_sndbulkpipe(dev->udev,
		bulk_out->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);

	usb_set_intfdata(iface, dev);

	/*allocate list of rx urbs*/
	retval = data_bridge_prepare_rx(dev);
	if (retval) {
		platform_device_put(dev->pdev);
		return retval;
	}

	platform_device_add(dev->pdev);

	return 0;
}