static int snd_us122l_probe(struct usb_interface *intf, const struct usb_device_id *id) { struct usb_device *device = interface_to_usbdev(intf); struct snd_card *card; int err; if ((device->descriptor.idProduct == USB_ID_US144 || device->descriptor.idProduct == USB_ID_US144MKII) && device->speed == USB_SPEED_HIGH) { snd_printk(KERN_ERR "disable ehci-hcd to run US-144 \n"); return -ENODEV; } snd_printdd(KERN_DEBUG"%p:%i\n", intf, intf->cur_altsetting->desc.bInterfaceNumber); if (intf->cur_altsetting->desc.bInterfaceNumber != 1) return 0; err = us122l_usb_probe(usb_get_intf(intf), id, &card); if (err < 0) { usb_put_intf(intf); return err; } usb_set_intfdata(intf, card); return 0; }
void zd_usb_clear(struct zd_usb *usb) { usb_set_intfdata(usb->intf, NULL); usb_put_intf(usb->intf); ZD_MEMCLEAR(usb, sizeof(*usb)); /* FIXME: usb_interrupt, usb_tx, usb_rx? */ }
static void i1480_usb_destroy(struct i1480_usb *i1480_usb) { usb_kill_urb(i1480_usb->neep_urb); usb_free_urb(i1480_usb->neep_urb); usb_set_intfdata(i1480_usb->usb_iface, NULL); usb_put_intf(i1480_usb->usb_iface); usb_put_dev(i1480_usb->usb_dev); }
static void acm_port_destruct(struct tty_port *port) { struct acm *acm = container_of(port, struct acm, port); dev_dbg(&acm->control->dev, "%s\n", __func__); acm_release_minor(acm); usb_put_intf(acm->control); kfree(acm->country_codes); kfree(acm); }
static void cbaf_disconnect(struct usb_interface *iface) { struct cbaf *cbaf = usb_get_intfdata(iface); struct device *dev = &iface->dev; sysfs_remove_group(&dev->kobj, &cbaf_dev_attr_group); usb_set_intfdata(iface, NULL); usb_put_intf(iface); kfree(cbaf->buffer); /* paranoia: clean up crypto keys */ kzfree(cbaf); }
static void qcnmea_tty_unregister(struct qcnmea *nmea) { int i,nr; tty_unregister_device(qcnmea_tty_driver, nmea->minor); usb_put_intf(nmea->intf); qcnmea_tab[nmea->minor] = NULL; usb_free_urb(nmea->write_urb); for (i = 0; i < QCNMEA_NR; i++) usb_free_urb(nmea->ru[i].urb); kfree(nmea);
static void acm_tty_unregister(struct acm *acm) { int i; tty_unregister_device(acm_tty_driver, acm->minor); usb_put_intf(acm->control); acm_table[acm->minor] = NULL; usb_free_urb(acm->ctrlurb); for (i = 0; i < ACM_NW; i++) usb_free_urb(acm->wb[i].urb); for (i = 0; i < acm->rx_buflimit; i++) usb_free_urb(acm->read_urbs[i]); kfree(acm->country_codes); kfree(acm); }
static void acm_tty_unregister(struct acm *acm) { int i,nr; nr = acm->rx_buflimit; tty_unregister_device(acm_tty_driver, acm->minor); usb_put_intf(acm->control); acm_table[acm->minor] = NULL; usb_free_urb(acm->ctrlurb); usb_free_urb(acm->writeurb); for (i = 0; i < nr; i++) usb_free_urb(acm->ru[i].urb); kfree(acm->country_codes); kfree(acm); }
static int i1480_usb_create(struct i1480_usb *i1480_usb, struct usb_interface *iface) { struct usb_device *usb_dev = interface_to_usbdev(iface); int result = -ENOMEM; i1480_usb->usb_dev = usb_get_dev(usb_dev); /* bind the USB device */ i1480_usb->usb_iface = usb_get_intf(iface); usb_set_intfdata(iface, i1480_usb); /* Bind the driver to iface0 */ i1480_usb->neep_urb = usb_alloc_urb(0, GFP_KERNEL); if (i1480_usb->neep_urb == NULL) goto error; return 0; error: usb_set_intfdata(iface, NULL); usb_put_intf(iface); usb_put_dev(usb_dev); return result; }
static int cbaf_probe(struct usb_interface *iface, const struct usb_device_id *id) { struct cbaf *cbaf; struct device *dev = &iface->dev; int result = -ENOMEM; cbaf = kzalloc(sizeof(*cbaf), GFP_KERNEL); if (cbaf == NULL) goto error_kzalloc; cbaf->buffer = kmalloc(512, GFP_KERNEL); if (cbaf->buffer == NULL) goto error_kmalloc_buffer; cbaf->buffer_size = 512; cbaf->usb_dev = usb_get_dev(interface_to_usbdev(iface)); cbaf->usb_iface = usb_get_intf(iface); result = cbaf_check(cbaf); if (result < 0) { dev_err(dev, "This device is not WUSB-CBAF compliant and is not supported yet.\n"); goto error_check; } result = sysfs_create_group(&dev->kobj, &cbaf_dev_attr_group); if (result < 0) { dev_err(dev, "Can't register sysfs attr group: %d\n", result); goto error_create_group; } usb_set_intfdata(iface, cbaf); return 0; error_create_group: error_check: usb_put_intf(iface); usb_put_dev(cbaf->usb_dev); kfree(cbaf->buffer); error_kmalloc_buffer: kfree(cbaf); error_kzalloc: return result; }
/* Line6 device disconnected. */ static void line6_disconnect(struct usb_interface *interface) { struct usb_line6 *line6; struct usb_device *usbdev; int interface_number; if (interface == NULL) return; usbdev = interface_to_usbdev(interface); if (usbdev == NULL) return; /* removal of additional special files should go here */ sysfs_remove_link(&interface->dev.kobj, "usb_device"); interface_number = interface->cur_altsetting->desc.bInterfaceNumber; line6 = usb_get_intfdata(interface); if (line6 != NULL) { if (line6->urb_listen != NULL) line6_stop_listen(line6); if (usbdev != line6->usbdev) dev_err(line6->ifcdev, "driver bug: inconsistent usb device\n"); switch (line6->usbdev->descriptor.idProduct) { case LINE6_DEVID_BASSPODXT: case LINE6_DEVID_BASSPODXTLIVE: case LINE6_DEVID_BASSPODXTPRO: case LINE6_DEVID_POCKETPOD: case LINE6_DEVID_PODX3: case LINE6_DEVID_PODX3LIVE: case LINE6_DEVID_PODXT: case LINE6_DEVID_PODXTPRO: line6_pod_disconnect(interface); break; case LINE6_DEVID_PODHD300: case LINE6_DEVID_PODHD500: line6_podhd_disconnect(interface); break; case LINE6_DEVID_PODXTLIVE: switch (interface_number) { case PODXTLIVE_INTERFACE_POD: line6_pod_disconnect(interface); break; case PODXTLIVE_INTERFACE_VARIAX: line6_variax_disconnect(interface); break; } break; case LINE6_DEVID_VARIAX: line6_variax_disconnect(interface); break; case LINE6_DEVID_PODSTUDIO_GX: case LINE6_DEVID_PODSTUDIO_UX1: case LINE6_DEVID_PODSTUDIO_UX2: case LINE6_DEVID_TONEPORT_GX: case LINE6_DEVID_TONEPORT_UX1: case LINE6_DEVID_TONEPORT_UX2: case LINE6_DEVID_GUITARPORT: line6_toneport_disconnect(interface); break; default: MISSING_CASE; } dev_info(&interface->dev, "Line6 %s now disconnected\n", line6->properties->name); } line6_destruct(interface); /* decrement reference counters: */ usb_put_intf(interface); usb_put_dev(usbdev); }
/* Line6 device disconnected. */ static void line6_disconnect(struct usb_interface *interface) { struct usb_line6 *line6; struct usb_device *usbdev; int interface_number, i; if (interface == NULL) return; usbdev = interface_to_usbdev(interface); if (usbdev == NULL) return; sysfs_remove_link(&interface->dev.kobj, "usb_device"); interface_number = interface->cur_altsetting->desc.bInterfaceNumber; line6 = usb_get_intfdata(interface); if (line6 != NULL) { if (line6->urb_listen != NULL) usb_kill_urb(line6->urb_listen); if (usbdev != line6->usbdev) dev_err(line6->ifcdev, "driver bug: inconsistent usb device\n"); switch (line6->usbdev->descriptor.idProduct) { case LINE6_DEVID_BASSPODXT: case LINE6_DEVID_BASSPODXTLIVE: case LINE6_DEVID_BASSPODXTPRO: case LINE6_DEVID_POCKETPOD: case LINE6_DEVID_PODX3: case LINE6_DEVID_PODX3LIVE: case LINE6_DEVID_PODXT: case LINE6_DEVID_PODXTPRO: pod_disconnect(interface); break; case LINE6_DEVID_PODXTLIVE: switch (interface_number) { case PODXTLIVE_INTERFACE_POD: pod_disconnect(interface); break; case PODXTLIVE_INTERFACE_VARIAX: variax_disconnect(interface); break; } break; case LINE6_DEVID_VARIAX: variax_disconnect(interface); break; case LINE6_DEVID_TONEPORT_GX: case LINE6_DEVID_TONEPORT_UX1: case LINE6_DEVID_TONEPORT_UX2: case LINE6_DEVID_GUITARPORT: toneport_disconnect(interface); break; default: MISSING_CASE; } dev_info(&interface->dev, "Line6 %s now disconnected\n", line6->properties->name); for (i = LINE6_MAX_DEVICES; i--;) if (line6_devices[i] == line6) line6_devices[i] = NULL; } line6_destruct(interface); /* decrement reference counters: */ usb_put_intf(interface); usb_put_dev(usbdev); line6_list_devices(); }
/* Probe USB device. */ static int line6_probe(struct usb_interface *interface, const struct usb_device_id *id) { int devtype; struct usb_device *usbdev = NULL; struct usb_line6 *line6 = NULL; const struct line6_properties *properties; int devnum; int interface_number, alternate = 0; int product; int size = 0; int ep_read = 0, ep_write = 0; int ret; if (interface == NULL) return -ENODEV; usbdev = interface_to_usbdev(interface); if (usbdev == NULL) return -ENODEV; /* we don't handle multiple configurations */ if (usbdev->descriptor.bNumConfigurations != 1) { ret = -ENODEV; goto err_put; } /* check vendor and product id */ for (devtype = ARRAY_SIZE(line6_id_table) - 1; devtype--;) { u16 idVendor = le16_to_cpu(usbdev->descriptor.idVendor); u16 idProduct = le16_to_cpu(usbdev->descriptor.idProduct); if (idVendor == line6_id_table[devtype].idVendor && idProduct == line6_id_table[devtype].idProduct) break; } if (devtype < 0) { ret = -ENODEV; goto err_put; } /* find free slot in device table: */ for (devnum = 0; devnum < LINE6_MAX_DEVICES; ++devnum) if (line6_devices[devnum] == NULL) break; if (devnum == LINE6_MAX_DEVICES) { ret = -ENODEV; goto err_put; } /* initialize device info: */ properties = &line6_properties_table[devtype]; dev_info(&interface->dev, "Line6 %s found\n", properties->name); product = le16_to_cpu(usbdev->descriptor.idProduct); /* query interface number */ interface_number = interface->cur_altsetting->desc.bInterfaceNumber; switch (product) { case LINE6_DEVID_BASSPODXTLIVE: case LINE6_DEVID_PODXTLIVE: case LINE6_DEVID_VARIAX: alternate = 1; break; case LINE6_DEVID_POCKETPOD: switch (interface_number) { case 0: return 0; /* this interface has no endpoints */ case 1: alternate = 0; break; default: MISSING_CASE; } break; case LINE6_DEVID_PODX3: case LINE6_DEVID_PODX3LIVE: switch (interface_number) { case 0: alternate = 1; break; case 1: alternate = 0; break; default: MISSING_CASE; } break; case LINE6_DEVID_BASSPODXT: case LINE6_DEVID_BASSPODXTPRO: case LINE6_DEVID_PODXT: case LINE6_DEVID_PODXTPRO: alternate = 5; break; case LINE6_DEVID_GUITARPORT: case LINE6_DEVID_PODSTUDIO_GX: case LINE6_DEVID_PODSTUDIO_UX1: case LINE6_DEVID_TONEPORT_GX: case LINE6_DEVID_TONEPORT_UX1: alternate = 2; /* 1..4 seem to be ok */ break; case LINE6_DEVID_TONEPORT_UX2: case LINE6_DEVID_PODSTUDIO_UX2: switch (interface_number) { case 0: /* defaults to 44.1kHz, 16-bit */ alternate = 2; break; case 1: /* don't know yet what this is ... alternate = 1; break; */ return -ENODEV; default: MISSING_CASE; } break; default: MISSING_CASE; ret = -ENODEV; goto err_put; } ret = usb_set_interface(usbdev, interface_number, alternate); if (ret < 0) { dev_err(&interface->dev, "set_interface failed\n"); goto err_put; } /* initialize device data based on product id: */ switch (product) { case LINE6_DEVID_BASSPODXT: case LINE6_DEVID_BASSPODXTLIVE: case LINE6_DEVID_BASSPODXTPRO: case LINE6_DEVID_PODXT: case LINE6_DEVID_PODXTPRO: size = sizeof(struct usb_line6_pod); ep_read = 0x84; ep_write = 0x03; break; case LINE6_DEVID_POCKETPOD: size = sizeof(struct usb_line6_pod); ep_read = 0x82; ep_write = 0x02; break; case LINE6_DEVID_PODX3: case LINE6_DEVID_PODX3LIVE: /* currently unused! */ size = sizeof(struct usb_line6_pod); ep_read = 0x81; ep_write = 0x01; break; case LINE6_DEVID_PODSTUDIO_GX: case LINE6_DEVID_PODSTUDIO_UX1: case LINE6_DEVID_PODSTUDIO_UX2: case LINE6_DEVID_TONEPORT_GX: case LINE6_DEVID_TONEPORT_UX1: case LINE6_DEVID_TONEPORT_UX2: case LINE6_DEVID_GUITARPORT: size = sizeof(struct usb_line6_toneport); /* these don't have a control channel */ break; case LINE6_DEVID_PODXTLIVE: switch (interface_number) { case PODXTLIVE_INTERFACE_POD: size = sizeof(struct usb_line6_pod); ep_read = 0x84; ep_write = 0x03; break; case PODXTLIVE_INTERFACE_VARIAX: size = sizeof(struct usb_line6_variax); ep_read = 0x86; ep_write = 0x05; break; default: ret = -ENODEV; goto err_put; } break; case LINE6_DEVID_VARIAX: size = sizeof(struct usb_line6_variax); ep_read = 0x82; ep_write = 0x01; break; default: MISSING_CASE; ret = -ENODEV; goto err_put; } if (size == 0) { dev_err(line6->ifcdev, "driver bug: interface data size not set\n"); ret = -ENODEV; goto err_put; } line6 = kzalloc(size, GFP_KERNEL); if (line6 == NULL) { dev_err(&interface->dev, "Out of memory\n"); ret = -ENODEV; goto err_put; } /* store basic data: */ line6->interface_number = interface_number; line6->properties = properties; line6->usbdev = usbdev; line6->ifcdev = &interface->dev; line6->ep_control_read = ep_read; line6->ep_control_write = ep_write; line6->product = product; /* get data from endpoint descriptor (see usb_maxpacket): */ { struct usb_host_endpoint *ep; unsigned epnum = usb_pipeendpoint(usb_rcvintpipe(usbdev, ep_read)); ep = usbdev->ep_in[epnum]; if (ep != NULL) { line6->interval = ep->desc.bInterval; line6->max_packet_size = le16_to_cpu(ep->desc.wMaxPacketSize); } else { line6->interval = LINE6_FALLBACK_INTERVAL; line6->max_packet_size = LINE6_FALLBACK_MAXPACKETSIZE; dev_err(line6->ifcdev, "endpoint not available, using fallback values"); } } usb_set_intfdata(interface, line6); if (properties->capabilities & LINE6_BIT_CONTROL) { /* initialize USB buffers: */ line6->buffer_listen = kmalloc(LINE6_BUFSIZE_LISTEN, GFP_KERNEL); if (line6->buffer_listen == NULL) { dev_err(&interface->dev, "Out of memory\n"); ret = -ENOMEM; goto err_destruct; } line6->buffer_message = kmalloc(LINE6_MESSAGE_MAXLEN, GFP_KERNEL); if (line6->buffer_message == NULL) { dev_err(&interface->dev, "Out of memory\n"); ret = -ENOMEM; goto err_destruct; } line6->urb_listen = usb_alloc_urb(0, GFP_KERNEL); if (line6->urb_listen == NULL) { dev_err(&interface->dev, "Out of memory\n"); line6_destruct(interface); ret = -ENOMEM; goto err_destruct; } ret = line6_start_listen(line6); if (ret < 0) { dev_err(&interface->dev, "%s: usb_submit_urb failed\n", __func__); goto err_destruct; } } /* initialize device data based on product id: */ switch (product) { case LINE6_DEVID_BASSPODXT: case LINE6_DEVID_BASSPODXTLIVE: case LINE6_DEVID_BASSPODXTPRO: case LINE6_DEVID_POCKETPOD: case LINE6_DEVID_PODX3: case LINE6_DEVID_PODX3LIVE: case LINE6_DEVID_PODXT: case LINE6_DEVID_PODXTPRO: ret = line6_pod_init(interface, (struct usb_line6_pod *)line6); break; case LINE6_DEVID_PODXTLIVE: switch (interface_number) { case PODXTLIVE_INTERFACE_POD: ret = line6_pod_init(interface, (struct usb_line6_pod *)line6); break; case PODXTLIVE_INTERFACE_VARIAX: ret = line6_variax_init(interface, (struct usb_line6_variax *)line6); break; default: dev_err(&interface->dev, "PODxt Live interface %d not supported\n", interface_number); ret = -ENODEV; } break; case LINE6_DEVID_VARIAX: ret = line6_variax_init(interface, (struct usb_line6_variax *)line6); break; case LINE6_DEVID_PODSTUDIO_GX: case LINE6_DEVID_PODSTUDIO_UX1: case LINE6_DEVID_PODSTUDIO_UX2: case LINE6_DEVID_TONEPORT_GX: case LINE6_DEVID_TONEPORT_UX1: case LINE6_DEVID_TONEPORT_UX2: case LINE6_DEVID_GUITARPORT: ret = line6_toneport_init(interface, (struct usb_line6_toneport *)line6); break; default: MISSING_CASE; ret = -ENODEV; } if (ret < 0) goto err_destruct; ret = sysfs_create_link(&interface->dev.kobj, &usbdev->dev.kobj, "usb_device"); if (ret < 0) goto err_destruct; /* creation of additional special files should go here */ dev_info(&interface->dev, "Line6 %s now attached\n", line6->properties->name); line6_devices[devnum] = line6; switch (product) { case LINE6_DEVID_PODX3: case LINE6_DEVID_PODX3LIVE: dev_info(&interface->dev, "NOTE: the Line6 %s is detected, but not yet supported\n", line6->properties->name); } /* increment reference counters: */ usb_get_intf(interface); usb_get_dev(usbdev); return 0; err_destruct: line6_destruct(interface); err_put: usb_put_intf(interface); usb_put_dev(usbdev); return ret; }