Esempio n. 1
0
/**
 *	usb_tranzport_delete
 */
static void usb_tranzport_delete(struct usb_tranzport *dev)
{
	usb_tranzport_abort_transfers(dev);
	/*  This is just too twisted to be correct */
	if(dev->intf != NULL) {
	device_remove_file(&dev->intf->dev, &dev_attr_LightRecord);
	device_remove_file(&dev->intf->dev, &dev_attr_LightTrackrec);
	device_remove_file(&dev->intf->dev, &dev_attr_LightTrackmute);
	device_remove_file(&dev->intf->dev, &dev_attr_LightTracksolo);
	device_remove_file(&dev->intf->dev, &dev_attr_LightTrackmute);
	device_remove_file(&dev->intf->dev, &dev_attr_LightAnysolo);
	device_remove_file(&dev->intf->dev, &dev_attr_LightLoop);
	device_remove_file(&dev->intf->dev, &dev_attr_LightPunch);
	device_remove_file(&dev->intf->dev, &dev_attr_wheel);
	device_remove_file(&dev->intf->dev, &dev_attr_enable);
	device_remove_file(&dev->intf->dev, &dev_attr_event);
	device_remove_file(&dev->intf->dev, &dev_attr_offline);
	device_remove_file(&dev->intf->dev, &dev_attr_compress_wheel);

	device_remove_file(&dev->intf->dev, &dev_attr_dump_state);
	}

	/* free data structures */
	usb_free_urb(dev->interrupt_in_urb);
	usb_free_urb(dev->interrupt_out_urb);
	kfree(dev->ring_buffer);
	kfree(dev->interrupt_in_buffer);
	kfree(dev->interrupt_out_buffer);
	kfree(dev);
}
Esempio n. 2
0
/**
 *	usb_tranzport_delete
 */
static void usb_tranzport_delete(struct usb_tranzport *dev)
{
	usb_tranzport_abort_transfers(dev);
	if (dev->intf != NULL) {
		device_remove_file(&dev->intf->dev, &dev_attr_enable);
		device_remove_file(&dev->intf->dev, &dev_attr_offline);
		device_remove_file(&dev->intf->dev, &dev_attr_compress_wheel);
	}

	/* free data structures */
	usb_free_urb(dev->interrupt_in_urb);
	usb_free_urb(dev->interrupt_out_urb);
	kfree(dev->ring_buffer);
	kfree(dev->interrupt_in_buffer);
	kfree(dev->interrupt_out_buffer);
	kfree(dev);
}
Esempio n. 3
0
/**
 *	usb_tranzport_release
 */
static int usb_tranzport_release(struct inode *inode, struct file *file)
{
	struct usb_tranzport *dev;
	int retval = 0;

	dev = file->private_data;

	if (dev == NULL) {
		retval = -ENODEV;
		goto exit;
	}

	if (mutex_lock_interruptible(&dev->mtx)) {
		retval = -ERESTARTSYS;
		goto exit;
	}

	if (dev->open_count != 1) {
		retval = -ENODEV;
		goto unlock_exit;
	}

	if (dev->intf == NULL) {
		/* the device was unplugged before the file was released */
		mutex_unlock(&dev->mtx);
		/* unlock here as usb_tranzport_delete frees dev */
		usb_tranzport_delete(dev);
		retval = -ENODEV;
		goto exit;
	}

	/* wait until write transfer is finished */
	if (dev->interrupt_out_busy)
		wait_event_interruptible_timeout(dev->write_wait,
						!dev->interrupt_out_busy,
						2 * HZ);
	usb_tranzport_abort_transfers(dev);
	dev->open_count = 0;

unlock_exit:
	mutex_unlock(&dev->mtx);

exit:
	return retval;
}