Lines Matching refs:hidg
123 struct f_hidg *hidg = container_of(dev, struct f_hidg, dev); in hidg_release() local
125 kfree(hidg->report_desc); in hidg_release()
126 kfree(hidg->set_report_buf); in hidg_release()
127 kfree(hidg); in hidg_release()
307 struct f_hidg *hidg = file->private_data; in f_hidg_intout_read() local
316 spin_lock_irqsave(&hidg->read_spinlock, flags); in f_hidg_intout_read()
318 #define READ_COND_INTOUT (!list_empty(&hidg->completed_out_req) || hidg->disabled) in f_hidg_intout_read()
322 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in f_hidg_intout_read()
326 if (wait_event_interruptible(hidg->read_queue, READ_COND_INTOUT)) in f_hidg_intout_read()
329 spin_lock_irqsave(&hidg->read_spinlock, flags); in f_hidg_intout_read()
332 if (hidg->disabled) { in f_hidg_intout_read()
333 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in f_hidg_intout_read()
338 list = list_first_entry(&hidg->completed_out_req, in f_hidg_intout_read()
349 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in f_hidg_intout_read()
364 req->length = hidg->report_length; in f_hidg_intout_read()
365 ret = usb_ep_queue(hidg->out_ep, req, GFP_KERNEL); in f_hidg_intout_read()
367 free_ep_req(hidg->out_ep, req); in f_hidg_intout_read()
371 spin_lock_irqsave(&hidg->read_spinlock, flags); in f_hidg_intout_read()
372 list_add(&list->list, &hidg->completed_out_req); in f_hidg_intout_read()
373 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in f_hidg_intout_read()
375 wake_up(&hidg->read_queue); in f_hidg_intout_read()
381 #define READ_COND_SSREPORT (hidg->set_report_buf != NULL || hidg->disabled)
386 struct f_hidg *hidg = file->private_data; in f_hidg_ssreport_read() local
393 spin_lock_irqsave(&hidg->read_spinlock, flags); in f_hidg_ssreport_read()
396 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in f_hidg_ssreport_read()
400 if (wait_event_interruptible(hidg->read_queue, READ_COND_SSREPORT)) in f_hidg_ssreport_read()
403 spin_lock_irqsave(&hidg->read_spinlock, flags); in f_hidg_ssreport_read()
406 count = min_t(unsigned int, count, hidg->set_report_length); in f_hidg_ssreport_read()
407 tmp_buf = hidg->set_report_buf; in f_hidg_ssreport_read()
408 hidg->set_report_buf = NULL; in f_hidg_ssreport_read()
410 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in f_hidg_ssreport_read()
419 wake_up(&hidg->read_queue); in f_hidg_ssreport_read()
427 struct f_hidg *hidg = file->private_data; in f_hidg_read() local
429 if (hidg->use_out_ep) in f_hidg_read()
437 struct f_hidg *hidg = (struct f_hidg *)ep->driver_data; in f_hidg_req_complete() local
441 ERROR(hidg->func.config->cdev, in f_hidg_req_complete()
445 spin_lock_irqsave(&hidg->write_spinlock, flags); in f_hidg_req_complete()
446 hidg->write_pending = 0; in f_hidg_req_complete()
447 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_req_complete()
448 wake_up(&hidg->write_queue); in f_hidg_req_complete()
454 struct f_hidg *hidg = file->private_data; in f_hidg_write() local
459 spin_lock_irqsave(&hidg->write_spinlock, flags); in f_hidg_write()
461 if (!hidg->req) { in f_hidg_write()
462 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_write()
466 #define WRITE_COND (!hidg->write_pending) in f_hidg_write()
470 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_write()
475 hidg->write_queue, WRITE_COND)) in f_hidg_write()
478 spin_lock_irqsave(&hidg->write_spinlock, flags); in f_hidg_write()
481 hidg->write_pending = 1; in f_hidg_write()
482 req = hidg->req; in f_hidg_write()
483 count = min_t(unsigned, count, hidg->report_length); in f_hidg_write()
485 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_write()
488 ERROR(hidg->func.config->cdev, "hidg->req is NULL\n"); in f_hidg_write()
495 ERROR(hidg->func.config->cdev, in f_hidg_write()
501 spin_lock_irqsave(&hidg->write_spinlock, flags); in f_hidg_write()
504 if (!hidg->req) { in f_hidg_write()
505 free_ep_req(hidg->in_ep, req); in f_hidg_write()
517 req->context = hidg; in f_hidg_write()
519 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_write()
521 if (!hidg->in_ep->enabled) { in f_hidg_write()
522 ERROR(hidg->func.config->cdev, "in_ep is disabled\n"); in f_hidg_write()
527 status = usb_ep_queue(hidg->in_ep, req, GFP_ATOMIC); in f_hidg_write()
535 spin_lock_irqsave(&hidg->write_spinlock, flags); in f_hidg_write()
536 hidg->write_pending = 0; in f_hidg_write()
537 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_write()
539 wake_up(&hidg->write_queue); in f_hidg_write()
544 static struct report_entry *f_hidg_search_for_report(struct f_hidg *hidg, u8 report_id) in f_hidg_search_for_report() argument
549 list_for_each(ptr, &hidg->report_list) { in f_hidg_search_for_report()
560 struct f_hidg *hidg = container_of(work, struct f_hidg, work); in get_report_workqueue_handler() local
561 struct usb_composite_dev *cdev = hidg->func.config->cdev; in get_report_workqueue_handler()
568 spin_lock_irqsave(&hidg->get_report_spinlock, flags); in get_report_workqueue_handler()
569 req = hidg->get_req; in get_report_workqueue_handler()
571 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in get_report_workqueue_handler()
576 req->length = min_t(unsigned int, min_t(unsigned int, hidg->get_report_req_report_length, in get_report_workqueue_handler()
577 hidg->report_length), in get_report_workqueue_handler()
581 ptr = f_hidg_search_for_report(hidg, hidg->get_report_req_report_id); in get_report_workqueue_handler()
586 hidg->get_report_returned = true; in get_report_workqueue_handler()
587 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in get_report_workqueue_handler()
593 hidg->get_report_returned = false; in get_report_workqueue_handler()
594 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in get_report_workqueue_handler()
595 wake_up(&hidg->get_id_queue); in get_report_workqueue_handler()
596 #define GET_REPORT_COND (!hidg->get_report_returned) in get_report_workqueue_handler()
598 status = wait_event_interruptible_timeout(hidg->get_queue, !GET_REPORT_COND, in get_report_workqueue_handler()
600 spin_lock_irqsave(&hidg->get_report_spinlock, flags); in get_report_workqueue_handler()
601 req = hidg->get_req; in get_report_workqueue_handler()
603 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in get_report_workqueue_handler()
606 if (status == 0 && !hidg->get_report_returned) { in get_report_workqueue_handler()
609 hidg->get_report_returned = true; in get_report_workqueue_handler()
613 ptr = f_hidg_search_for_report(hidg, hidg->get_report_req_report_id); in get_report_workqueue_handler()
622 req->buf = hidg->get_report.data; in get_report_workqueue_handler()
627 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in get_report_workqueue_handler()
636 struct f_hidg *hidg = file->private_data; in f_hidg_get_report_id() local
639 ret = put_user(hidg->get_report_req_report_id, buffer); in f_hidg_get_report_id()
646 struct f_hidg *hidg = file->private_data; in f_hidg_get_report() local
647 struct usb_composite_dev *cdev = hidg->func.config->cdev; in f_hidg_get_report()
666 spin_lock_irqsave(&hidg->get_report_spinlock, flags); in f_hidg_get_report()
667 ptr = f_hidg_search_for_report(hidg, report_id); in f_hidg_get_report()
673 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in f_hidg_get_report()
681 list_add_tail(&entry->node, &hidg->report_list); in f_hidg_get_report()
685 if (hidg->get_report_returned) { in f_hidg_get_report()
686 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in f_hidg_get_report()
691 if (hidg->get_report_req_report_id == report_id) { in f_hidg_get_report()
692 hidg->get_report_returned = true; in f_hidg_get_report()
693 wake_up(&hidg->get_queue); in f_hidg_get_report()
696 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in f_hidg_get_report()
714 struct f_hidg *hidg = file->private_data; in f_hidg_poll() local
717 poll_wait(file, &hidg->read_queue, wait); in f_hidg_poll()
718 poll_wait(file, &hidg->write_queue, wait); in f_hidg_poll()
719 poll_wait(file, &hidg->get_queue, wait); in f_hidg_poll()
720 poll_wait(file, &hidg->get_id_queue, wait); in f_hidg_poll()
725 if (hidg->use_out_ep) { in f_hidg_poll()
752 struct f_hidg *hidg = in f_hidg_open() local
755 fd->private_data = hidg; in f_hidg_open()
771 struct f_hidg *hidg = (struct f_hidg *) req->context; in hidg_intout_complete() local
772 struct usb_composite_dev *cdev = hidg->func.config->cdev; in hidg_intout_complete()
786 spin_lock_irqsave(&hidg->read_spinlock, flags); in hidg_intout_complete()
787 list_add_tail(&req_list->list, &hidg->completed_out_req); in hidg_intout_complete()
788 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in hidg_intout_complete()
790 wake_up(&hidg->read_queue); in hidg_intout_complete()
806 struct f_hidg *hidg = (struct f_hidg *)req->context; in hidg_ssreport_complete() local
807 struct usb_composite_dev *cdev = hidg->func.config->cdev; in hidg_ssreport_complete()
818 spin_lock_irqsave(&hidg->read_spinlock, flags); in hidg_ssreport_complete()
820 new_buf = krealloc(hidg->set_report_buf, req->actual, GFP_ATOMIC); in hidg_ssreport_complete()
822 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in hidg_ssreport_complete()
825 hidg->set_report_buf = new_buf; in hidg_ssreport_complete()
827 hidg->set_report_length = req->actual; in hidg_ssreport_complete()
828 memcpy(hidg->set_report_buf, req->buf, req->actual); in hidg_ssreport_complete()
830 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in hidg_ssreport_complete()
832 wake_up(&hidg->read_queue); in hidg_ssreport_complete()
842 struct f_hidg *hidg = func_to_hidg(f); in hidg_setup() local
865 spin_lock_irqsave(&hidg->get_report_spinlock, flags); in hidg_setup()
866 hidg->get_report_req_report_id = value & 0xff; in hidg_setup()
867 hidg->get_report_req_report_length = length; in hidg_setup()
868 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in hidg_setup()
870 queue_work(hidg->workqueue, &hidg->work); in hidg_setup()
878 ((u8 *) req->buf)[0] = hidg->protocol; in hidg_setup()
886 ((u8 *) req->buf)[0] = hidg->idle; in hidg_setup()
893 if (hidg->use_out_ep) in hidg_setup()
896 req->context = hidg; in hidg_setup()
910 if (hidg->bInterfaceSubClass == USB_INTERFACE_SUBCLASS_BOOT) { in hidg_setup()
911 hidg->protocol = value; in hidg_setup()
921 hidg->idle = value >> 8; in hidg_setup()
935 cpu_to_le16(hidg->report_desc_length); in hidg_setup()
946 hidg->report_desc_length); in hidg_setup()
947 memcpy(req->buf, hidg->report_desc, length); in hidg_setup()
980 struct f_hidg *hidg = func_to_hidg(f); in hidg_disable() local
984 usb_ep_disable(hidg->in_ep); in hidg_disable()
986 if (hidg->out_ep) { in hidg_disable()
987 usb_ep_disable(hidg->out_ep); in hidg_disable()
989 spin_lock_irqsave(&hidg->read_spinlock, flags); in hidg_disable()
990 list_for_each_entry_safe(list, next, &hidg->completed_out_req, list) { in hidg_disable()
991 free_ep_req(hidg->out_ep, list->req); in hidg_disable()
995 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in hidg_disable()
998 spin_lock_irqsave(&hidg->get_report_spinlock, flags); in hidg_disable()
999 if (!hidg->get_report_returned) { in hidg_disable()
1000 usb_ep_free_request(f->config->cdev->gadget->ep0, hidg->get_req); in hidg_disable()
1001 hidg->get_req = NULL; in hidg_disable()
1002 hidg->get_report_returned = true; in hidg_disable()
1004 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in hidg_disable()
1006 spin_lock_irqsave(&hidg->read_spinlock, flags); in hidg_disable()
1007 hidg->disabled = true; in hidg_disable()
1008 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in hidg_disable()
1009 wake_up(&hidg->read_queue); in hidg_disable()
1011 spin_lock_irqsave(&hidg->write_spinlock, flags); in hidg_disable()
1012 if (!hidg->write_pending) { in hidg_disable()
1013 free_ep_req(hidg->in_ep, hidg->req); in hidg_disable()
1014 hidg->write_pending = 1; in hidg_disable()
1017 hidg->req = NULL; in hidg_disable()
1018 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in hidg_disable()
1024 struct f_hidg *hidg = func_to_hidg(f); in hidg_set_alt() local
1031 if (hidg->in_ep != NULL) { in hidg_set_alt()
1033 usb_ep_disable(hidg->in_ep); in hidg_set_alt()
1036 hidg->in_ep); in hidg_set_alt()
1041 status = usb_ep_enable(hidg->in_ep); in hidg_set_alt()
1046 hidg->in_ep->driver_data = hidg; in hidg_set_alt()
1048 req_in = hidg_alloc_ep_req(hidg->in_ep, hidg->report_length); in hidg_set_alt()
1055 if (hidg->use_out_ep && hidg->out_ep != NULL) { in hidg_set_alt()
1057 usb_ep_disable(hidg->out_ep); in hidg_set_alt()
1060 hidg->out_ep); in hidg_set_alt()
1065 status = usb_ep_enable(hidg->out_ep); in hidg_set_alt()
1070 hidg->out_ep->driver_data = hidg; in hidg_set_alt()
1075 for (i = 0; i < hidg->qlen && status == 0; i++) { in hidg_set_alt()
1077 hidg_alloc_ep_req(hidg->out_ep, in hidg_set_alt()
1078 hidg->report_length); in hidg_set_alt()
1081 req->context = hidg; in hidg_set_alt()
1082 status = usb_ep_queue(hidg->out_ep, req, in hidg_set_alt()
1086 hidg->out_ep->name, status); in hidg_set_alt()
1087 free_ep_req(hidg->out_ep, req); in hidg_set_alt()
1096 spin_lock_irqsave(&hidg->read_spinlock, flags); in hidg_set_alt()
1097 hidg->disabled = false; in hidg_set_alt()
1098 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in hidg_set_alt()
1100 if (hidg->in_ep != NULL) { in hidg_set_alt()
1101 spin_lock_irqsave(&hidg->write_spinlock, flags); in hidg_set_alt()
1102 hidg->req = req_in; in hidg_set_alt()
1103 hidg->write_pending = 0; in hidg_set_alt()
1104 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in hidg_set_alt()
1106 wake_up(&hidg->write_queue); in hidg_set_alt()
1110 if (hidg->out_ep) in hidg_set_alt()
1111 usb_ep_disable(hidg->out_ep); in hidg_set_alt()
1114 free_ep_req(hidg->in_ep, req_in); in hidg_set_alt()
1117 if (hidg->in_ep) in hidg_set_alt()
1118 usb_ep_disable(hidg->in_ep); in hidg_set_alt()
1149 struct f_hidg *hidg = func_to_hidg(f); in hidg_bind() local
1153 hidg->get_req = usb_ep_alloc_request(c->cdev->gadget->ep0, GFP_ATOMIC); in hidg_bind()
1154 if (!hidg->get_req) in hidg_bind()
1157 hidg->get_req->zero = 0; in hidg_bind()
1158 hidg->get_req->complete = hidg_get_report_complete; in hidg_bind()
1159 hidg->get_req->context = hidg; in hidg_bind()
1160 hidg->get_report_returned = true; in hidg_bind()
1180 hidg->in_ep = ep; in hidg_bind()
1182 hidg->out_ep = NULL; in hidg_bind()
1183 if (hidg->use_out_ep) { in hidg_bind()
1187 hidg->out_ep = ep; in hidg_bind()
1191 hidg->set_report_buf = NULL; in hidg_bind()
1194 hidg_interface_desc.bInterfaceSubClass = hidg->bInterfaceSubClass; in hidg_bind()
1195 hidg_interface_desc.bInterfaceProtocol = hidg->bInterfaceProtocol; in hidg_bind()
1196 hidg_interface_desc.bNumEndpoints = hidg->use_out_ep ? 2 : 1; in hidg_bind()
1197 hidg->protocol = HID_REPORT_PROTOCOL; in hidg_bind()
1198 hidg->idle = 1; in hidg_bind()
1199 hidg_ss_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
1201 cpu_to_le16(hidg->report_length); in hidg_bind()
1202 hidg_hs_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
1203 hidg_fs_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
1204 hidg_ss_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
1207 if (!hidg->interval_user_set) { in hidg_bind()
1212 hidg_fs_in_ep_desc.bInterval = hidg->interval; in hidg_bind()
1213 hidg_hs_in_ep_desc.bInterval = hidg->interval; in hidg_bind()
1214 hidg_ss_in_ep_desc.bInterval = hidg->interval; in hidg_bind()
1218 cpu_to_le16(hidg->report_length); in hidg_bind()
1219 hidg_hs_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
1220 hidg_fs_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
1227 cpu_to_le16(hidg->report_desc_length); in hidg_bind()
1239 if (hidg->use_out_ep) { in hidg_bind()
1241 if (!hidg->interval_user_set) { in hidg_bind()
1246 hidg_fs_out_ep_desc.bInterval = hidg->interval; in hidg_bind()
1247 hidg_hs_out_ep_desc.bInterval = hidg->interval; in hidg_bind()
1248 hidg_ss_out_ep_desc.bInterval = hidg->interval; in hidg_bind()
1265 hidg->write_pending = 1; in hidg_bind()
1266 hidg->req = NULL; in hidg_bind()
1268 INIT_WORK(&hidg->work, get_report_workqueue_handler); in hidg_bind()
1269 hidg->workqueue = alloc_workqueue("report_work", in hidg_bind()
1273 if (!hidg->workqueue) { in hidg_bind()
1279 cdev_init(&hidg->cdev, &f_hidg_fops); in hidg_bind()
1280 status = cdev_device_add(&hidg->cdev, &hidg->dev); in hidg_bind()
1286 destroy_workqueue(hidg->workqueue); in hidg_bind()
1291 if (hidg->req != NULL) in hidg_bind()
1292 free_ep_req(hidg->in_ep, hidg->req); in hidg_bind()
1294 usb_ep_free_request(c->cdev->gadget->ep0, hidg->get_req); in hidg_bind()
1295 hidg->get_req = NULL; in hidg_bind()
1567 struct f_hidg *hidg; in hidg_free() local
1570 hidg = func_to_hidg(f); in hidg_free()
1572 put_device(&hidg->dev); in hidg_free()
1580 struct f_hidg *hidg = func_to_hidg(f); in hidg_unbind() local
1582 cdev_device_del(&hidg->cdev, &hidg->dev); in hidg_unbind()
1583 destroy_workqueue(hidg->workqueue); in hidg_unbind()
1589 struct f_hidg *hidg; in hidg_alloc() local
1594 hidg = kzalloc_obj(*hidg); in hidg_alloc()
1595 if (!hidg) in hidg_alloc()
1602 spin_lock_init(&hidg->write_spinlock); in hidg_alloc()
1603 spin_lock_init(&hidg->read_spinlock); in hidg_alloc()
1604 spin_lock_init(&hidg->get_report_spinlock); in hidg_alloc()
1605 init_waitqueue_head(&hidg->write_queue); in hidg_alloc()
1606 init_waitqueue_head(&hidg->read_queue); in hidg_alloc()
1607 init_waitqueue_head(&hidg->get_queue); in hidg_alloc()
1608 init_waitqueue_head(&hidg->get_id_queue); in hidg_alloc()
1609 INIT_LIST_HEAD(&hidg->completed_out_req); in hidg_alloc()
1610 INIT_LIST_HEAD(&hidg->report_list); in hidg_alloc()
1612 device_initialize(&hidg->dev); in hidg_alloc()
1613 hidg->dev.release = hidg_release; in hidg_alloc()
1614 hidg->dev.class = &hidg_class; in hidg_alloc()
1615 hidg->dev.devt = MKDEV(major, opts->minor); in hidg_alloc()
1616 ret = dev_set_name(&hidg->dev, "hidg%d", opts->minor); in hidg_alloc()
1620 hidg->bInterfaceSubClass = opts->subclass; in hidg_alloc()
1621 hidg->bInterfaceProtocol = opts->protocol; in hidg_alloc()
1622 hidg->report_length = opts->report_length; in hidg_alloc()
1623 hidg->report_desc_length = opts->report_desc_length; in hidg_alloc()
1624 hidg->interval = opts->interval; in hidg_alloc()
1625 hidg->interval_user_set = opts->interval_user_set; in hidg_alloc()
1627 hidg->report_desc = kmemdup(opts->report_desc, in hidg_alloc()
1630 if (!hidg->report_desc) { in hidg_alloc()
1635 hidg->use_out_ep = !opts->no_out_endpoint; in hidg_alloc()
1640 hidg->func.name = "hid"; in hidg_alloc()
1641 hidg->func.bind = hidg_bind; in hidg_alloc()
1642 hidg->func.unbind = hidg_unbind; in hidg_alloc()
1643 hidg->func.set_alt = hidg_set_alt; in hidg_alloc()
1644 hidg->func.disable = hidg_disable; in hidg_alloc()
1645 hidg->func.setup = hidg_setup; in hidg_alloc()
1646 hidg->func.free_func = hidg_free; in hidg_alloc()
1649 hidg->qlen = 4; in hidg_alloc()
1651 return &hidg->func; in hidg_alloc()
1654 put_device(&hidg->dev); in hidg_alloc()