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; }
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; }
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; }