/* * release file op */ static int hiddev_release(struct inode * inode, struct file * file) { struct hiddev_list *list = file->private_data; struct hiddev_list **listptr; lock_kernel(); listptr = &list->hiddev->list; hiddev_fasync(-1, file, 0); while (*listptr && (*listptr != list)) listptr = &((*listptr)->next); *listptr = (*listptr)->next; if (!--list->hiddev->open) { if (list->hiddev->exist) hid_close(list->hiddev->hid); else hiddev_cleanup(list->hiddev); } kfree(list); unlock_kernel(); return 0; }
/* * This is where hid.c calls us to disconnect a hiddev device from the * corresponding hid device (usually because the usb device has disconnected) */ void hiddev_disconnect(struct hid_device *hid) { struct hiddev *hiddev = hid->hiddev; hiddev->exist = 0; if (hiddev->open) { hid_close(hiddev->hid); wake_up_interruptible(&hiddev->wait); } else { hiddev_cleanup(hiddev); } }