hiddev
((struct hiddev *)hdev->hiddev)->minor);
struct hiddev *hiddev = hid->hiddev;
spin_lock_irqsave(&hiddev->list_lock, flags);
list_for_each_entry(list, &hiddev->list, node) {
spin_unlock_irqrestore(&hiddev->list_lock, flags);
wake_up_interruptible(&hiddev->wait);
spin_lock_irqsave(&list->hiddev->list_lock, flags);
spin_unlock_irqrestore(&list->hiddev->list_lock, flags);
mutex_lock(&list->hiddev->existancelock);
if (!--list->hiddev->open) {
if (list->hiddev->exist) {
hid_hw_close(list->hiddev->hid);
hid_hw_power(list->hiddev->hid, PM_HINT_NORMAL);
mutex_unlock(&list->hiddev->existancelock);
kfree(list->hiddev);
mutex_unlock(&list->hiddev->existancelock);
static int __hiddev_open(struct hiddev *hiddev, struct file *file)
lockdep_assert_held(&hiddev->existancelock);
list->hiddev = hiddev;
if (!hiddev->open++) {
error = hid_hw_power(hiddev->hid, PM_HINT_FULLON);
error = hid_hw_open(hiddev->hid);
spin_lock_irq(&hiddev->list_lock);
list_add_tail(&list->node, &hiddev->list);
spin_unlock_irq(&hiddev->list_lock);
hid_hw_power(hiddev->hid, PM_HINT_NORMAL);
hiddev->open--;
struct hiddev *hiddev;
hiddev = hid->hiddev;
mutex_lock(&hiddev->existancelock);
res = hiddev->exist ? __hiddev_open(hiddev, file) : -ENODEV;
mutex_unlock(&hiddev->existancelock);
prepare_to_wait(&list->hiddev->wait, &wait, TASK_INTERRUPTIBLE);
if (!list->hiddev->exist) {
finish_wait(&list->hiddev->wait, &wait);
finish_wait(&list->hiddev->wait, &wait);
poll_wait(file, &list->hiddev->wait, wait);
if (!list->hiddev->exist)
static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd, void __user *user_arg)
struct hid_device *hid = hiddev->hid;
struct hiddev *hiddev;
static noinline int hiddev_ioctl_string(struct hiddev *hiddev, unsigned int cmd, void __user *user_arg)
struct hid_device *hid = hiddev->hid;
struct hiddev *hiddev = list->hiddev;
mutex_lock(&hiddev->existancelock);
if (!hiddev->exist) {
hid = hiddev->hid;
r = hiddev_ioctl_string(hiddev, cmd, user_arg);
hiddev->initialized = true;
if (!hiddev->initialized) {
hiddev->initialized = true;
r = hiddev_ioctl_usage(hiddev, cmd, user_arg);
mutex_unlock(&hiddev->existancelock);
struct hiddev *hiddev;
if (!(hiddev = kzalloc_obj(struct hiddev)))
init_waitqueue_head(&hiddev->wait);
INIT_LIST_HEAD(&hiddev->list);
spin_lock_init(&hiddev->list_lock);
mutex_init(&hiddev->existancelock);
hid->hiddev = hiddev;
hiddev->hid = hid;
hiddev->exist = 1;
hid->hiddev = NULL;
kfree(hiddev);
hiddev->initialized = hid->quirks & HID_QUIRK_NO_INIT_REPORTS;
hiddev->minor = usbhid->intf->minor;
struct hiddev *hiddev = hid->hiddev;
mutex_lock(&hiddev->existancelock);
hiddev->exist = 0;
if (hiddev->open) {
hid_hw_close(hiddev->hid);
wake_up_interruptible(&hiddev->wait);
mutex_unlock(&hiddev->existancelock);
mutex_unlock(&hiddev->existancelock);
kfree(hiddev);
void *hiddev; /* The hiddev structure */