Lines Matching refs:hidg

119 	struct f_hidg *hidg = container_of(dev, struct f_hidg, dev);  in hidg_release()  local
121 kfree(hidg->report_desc); in hidg_release()
122 kfree(hidg->set_report_buf); in hidg_release()
123 kfree(hidg); in hidg_release()
321 struct f_hidg *hidg = file->private_data; in f_hidg_intout_read() local
330 spin_lock_irqsave(&hidg->read_spinlock, flags); in f_hidg_intout_read()
332 #define READ_COND_INTOUT (!list_empty(&hidg->completed_out_req)) in f_hidg_intout_read()
336 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in f_hidg_intout_read()
340 if (wait_event_interruptible(hidg->read_queue, READ_COND_INTOUT)) in f_hidg_intout_read()
343 spin_lock_irqsave(&hidg->read_spinlock, flags); in f_hidg_intout_read()
347 list = list_first_entry(&hidg->completed_out_req, in f_hidg_intout_read()
358 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in f_hidg_intout_read()
373 req->length = hidg->report_length; in f_hidg_intout_read()
374 ret = usb_ep_queue(hidg->out_ep, req, GFP_KERNEL); in f_hidg_intout_read()
376 free_ep_req(hidg->out_ep, req); in f_hidg_intout_read()
380 spin_lock_irqsave(&hidg->read_spinlock, flags); in f_hidg_intout_read()
381 list_add(&list->list, &hidg->completed_out_req); in f_hidg_intout_read()
382 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in f_hidg_intout_read()
384 wake_up(&hidg->read_queue); in f_hidg_intout_read()
390 #define READ_COND_SSREPORT (hidg->set_report_buf != NULL)
395 struct f_hidg *hidg = file->private_data; in f_hidg_ssreport_read() local
402 spin_lock_irqsave(&hidg->read_spinlock, flags); in f_hidg_ssreport_read()
405 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in f_hidg_ssreport_read()
409 if (wait_event_interruptible(hidg->read_queue, READ_COND_SSREPORT)) in f_hidg_ssreport_read()
412 spin_lock_irqsave(&hidg->read_spinlock, flags); in f_hidg_ssreport_read()
415 count = min_t(unsigned int, count, hidg->set_report_length); in f_hidg_ssreport_read()
416 tmp_buf = hidg->set_report_buf; in f_hidg_ssreport_read()
417 hidg->set_report_buf = NULL; in f_hidg_ssreport_read()
419 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in f_hidg_ssreport_read()
428 wake_up(&hidg->read_queue); in f_hidg_ssreport_read()
436 struct f_hidg *hidg = file->private_data; in f_hidg_read() local
438 if (hidg->use_out_ep) in f_hidg_read()
446 struct f_hidg *hidg = (struct f_hidg *)ep->driver_data; in f_hidg_req_complete() local
450 ERROR(hidg->func.config->cdev, in f_hidg_req_complete()
454 spin_lock_irqsave(&hidg->write_spinlock, flags); in f_hidg_req_complete()
455 hidg->write_pending = 0; in f_hidg_req_complete()
456 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_req_complete()
457 wake_up(&hidg->write_queue); in f_hidg_req_complete()
463 struct f_hidg *hidg = file->private_data; in f_hidg_write() local
468 spin_lock_irqsave(&hidg->write_spinlock, flags); in f_hidg_write()
470 if (!hidg->req) { in f_hidg_write()
471 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_write()
475 #define WRITE_COND (!hidg->write_pending) in f_hidg_write()
479 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_write()
484 hidg->write_queue, WRITE_COND)) in f_hidg_write()
487 spin_lock_irqsave(&hidg->write_spinlock, flags); in f_hidg_write()
490 hidg->write_pending = 1; in f_hidg_write()
491 req = hidg->req; in f_hidg_write()
492 count = min_t(unsigned, count, hidg->report_length); in f_hidg_write()
494 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_write()
497 ERROR(hidg->func.config->cdev, "hidg->req is NULL\n"); in f_hidg_write()
504 ERROR(hidg->func.config->cdev, in f_hidg_write()
510 spin_lock_irqsave(&hidg->write_spinlock, flags); in f_hidg_write()
513 if (!hidg->req) { in f_hidg_write()
514 free_ep_req(hidg->in_ep, req); in f_hidg_write()
526 req->context = hidg; in f_hidg_write()
528 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_write()
530 if (!hidg->in_ep->enabled) { in f_hidg_write()
531 ERROR(hidg->func.config->cdev, "in_ep is disabled\n"); in f_hidg_write()
536 status = usb_ep_queue(hidg->in_ep, req, GFP_ATOMIC); in f_hidg_write()
544 spin_lock_irqsave(&hidg->write_spinlock, flags); in f_hidg_write()
545 hidg->write_pending = 0; in f_hidg_write()
546 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_write()
548 wake_up(&hidg->write_queue); in f_hidg_write()
553 static struct report_entry *f_hidg_search_for_report(struct f_hidg *hidg, u8 report_id) in f_hidg_search_for_report() argument
558 list_for_each(ptr, &hidg->report_list) { in f_hidg_search_for_report()
569 struct f_hidg *hidg = container_of(work, struct f_hidg, work); in get_report_workqueue_handler() local
570 struct usb_composite_dev *cdev = hidg->func.config->cdev; in get_report_workqueue_handler()
577 spin_lock_irqsave(&hidg->get_report_spinlock, flags); in get_report_workqueue_handler()
578 req = hidg->get_req; in get_report_workqueue_handler()
580 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in get_report_workqueue_handler()
585 req->length = min_t(unsigned int, min_t(unsigned int, hidg->get_report_req_report_length, in get_report_workqueue_handler()
586 hidg->report_length), in get_report_workqueue_handler()
590 ptr = f_hidg_search_for_report(hidg, hidg->get_report_req_report_id); in get_report_workqueue_handler()
595 hidg->get_report_returned = true; in get_report_workqueue_handler()
596 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in get_report_workqueue_handler()
602 hidg->get_report_returned = false; in get_report_workqueue_handler()
603 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in get_report_workqueue_handler()
604 wake_up(&hidg->get_id_queue); in get_report_workqueue_handler()
605 #define GET_REPORT_COND (!hidg->get_report_returned) in get_report_workqueue_handler()
607 status = wait_event_interruptible_timeout(hidg->get_queue, !GET_REPORT_COND, in get_report_workqueue_handler()
609 spin_lock_irqsave(&hidg->get_report_spinlock, flags); in get_report_workqueue_handler()
610 req = hidg->get_req; in get_report_workqueue_handler()
612 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in get_report_workqueue_handler()
615 if (status == 0 && !hidg->get_report_returned) { in get_report_workqueue_handler()
618 hidg->get_report_returned = true; in get_report_workqueue_handler()
622 ptr = f_hidg_search_for_report(hidg, hidg->get_report_req_report_id); in get_report_workqueue_handler()
631 req->buf = hidg->get_report.data; in get_report_workqueue_handler()
636 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in get_report_workqueue_handler()
645 struct f_hidg *hidg = file->private_data; in f_hidg_get_report_id() local
648 ret = put_user(hidg->get_report_req_report_id, buffer); in f_hidg_get_report_id()
655 struct f_hidg *hidg = file->private_data; in f_hidg_get_report() local
656 struct usb_composite_dev *cdev = hidg->func.config->cdev; in f_hidg_get_report()
675 spin_lock_irqsave(&hidg->get_report_spinlock, flags); in f_hidg_get_report()
676 ptr = f_hidg_search_for_report(hidg, report_id); in f_hidg_get_report()
682 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in f_hidg_get_report()
690 list_add_tail(&entry->node, &hidg->report_list); in f_hidg_get_report()
694 if (hidg->get_report_returned) { in f_hidg_get_report()
695 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in f_hidg_get_report()
700 if (hidg->get_report_req_report_id == report_id) { in f_hidg_get_report()
701 hidg->get_report_returned = true; in f_hidg_get_report()
702 wake_up(&hidg->get_queue); in f_hidg_get_report()
705 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in f_hidg_get_report()
723 struct f_hidg *hidg = file->private_data; in f_hidg_poll() local
726 poll_wait(file, &hidg->read_queue, wait); in f_hidg_poll()
727 poll_wait(file, &hidg->write_queue, wait); in f_hidg_poll()
728 poll_wait(file, &hidg->get_queue, wait); in f_hidg_poll()
729 poll_wait(file, &hidg->get_id_queue, wait); in f_hidg_poll()
734 if (hidg->use_out_ep) { in f_hidg_poll()
761 struct f_hidg *hidg = in f_hidg_open() local
764 fd->private_data = hidg; in f_hidg_open()
780 struct f_hidg *hidg = (struct f_hidg *) req->context; in hidg_intout_complete() local
781 struct usb_composite_dev *cdev = hidg->func.config->cdev; in hidg_intout_complete()
795 spin_lock_irqsave(&hidg->read_spinlock, flags); in hidg_intout_complete()
796 list_add_tail(&req_list->list, &hidg->completed_out_req); in hidg_intout_complete()
797 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in hidg_intout_complete()
799 wake_up(&hidg->read_queue); in hidg_intout_complete()
815 struct f_hidg *hidg = (struct f_hidg *)req->context; in hidg_ssreport_complete() local
816 struct usb_composite_dev *cdev = hidg->func.config->cdev; in hidg_ssreport_complete()
827 spin_lock_irqsave(&hidg->read_spinlock, flags); in hidg_ssreport_complete()
829 new_buf = krealloc(hidg->set_report_buf, req->actual, GFP_ATOMIC); in hidg_ssreport_complete()
831 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in hidg_ssreport_complete()
834 hidg->set_report_buf = new_buf; in hidg_ssreport_complete()
836 hidg->set_report_length = req->actual; in hidg_ssreport_complete()
837 memcpy(hidg->set_report_buf, req->buf, req->actual); in hidg_ssreport_complete()
839 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in hidg_ssreport_complete()
841 wake_up(&hidg->read_queue); in hidg_ssreport_complete()
851 struct f_hidg *hidg = func_to_hidg(f); in hidg_setup() local
874 spin_lock_irqsave(&hidg->get_report_spinlock, flags); in hidg_setup()
875 hidg->get_report_req_report_id = value & 0xff; in hidg_setup()
876 hidg->get_report_req_report_length = length; in hidg_setup()
877 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in hidg_setup()
879 queue_work(hidg->workqueue, &hidg->work); in hidg_setup()
887 ((u8 *) req->buf)[0] = hidg->protocol; in hidg_setup()
895 ((u8 *) req->buf)[0] = hidg->idle; in hidg_setup()
902 if (hidg->use_out_ep) in hidg_setup()
905 req->context = hidg; in hidg_setup()
919 if (hidg->bInterfaceSubClass == USB_INTERFACE_SUBCLASS_BOOT) { in hidg_setup()
920 hidg->protocol = value; in hidg_setup()
930 hidg->idle = value >> 8; in hidg_setup()
944 cpu_to_le16(hidg->report_desc_length); in hidg_setup()
955 hidg->report_desc_length); in hidg_setup()
956 memcpy(req->buf, hidg->report_desc, length); in hidg_setup()
989 struct f_hidg *hidg = func_to_hidg(f); in hidg_disable() local
993 usb_ep_disable(hidg->in_ep); in hidg_disable()
995 if (hidg->out_ep) { in hidg_disable()
996 usb_ep_disable(hidg->out_ep); in hidg_disable()
998 spin_lock_irqsave(&hidg->read_spinlock, flags); in hidg_disable()
999 list_for_each_entry_safe(list, next, &hidg->completed_out_req, list) { in hidg_disable()
1000 free_ep_req(hidg->out_ep, list->req); in hidg_disable()
1004 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in hidg_disable()
1007 spin_lock_irqsave(&hidg->get_report_spinlock, flags); in hidg_disable()
1008 if (!hidg->get_report_returned) { in hidg_disable()
1009 usb_ep_free_request(f->config->cdev->gadget->ep0, hidg->get_req); in hidg_disable()
1010 hidg->get_req = NULL; in hidg_disable()
1011 hidg->get_report_returned = true; in hidg_disable()
1013 spin_unlock_irqrestore(&hidg->get_report_spinlock, flags); in hidg_disable()
1015 spin_lock_irqsave(&hidg->write_spinlock, flags); in hidg_disable()
1016 if (!hidg->write_pending) { in hidg_disable()
1017 free_ep_req(hidg->in_ep, hidg->req); in hidg_disable()
1018 hidg->write_pending = 1; in hidg_disable()
1021 hidg->req = NULL; in hidg_disable()
1022 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in hidg_disable()
1028 struct f_hidg *hidg = func_to_hidg(f); in hidg_set_alt() local
1035 if (hidg->in_ep != NULL) { in hidg_set_alt()
1037 usb_ep_disable(hidg->in_ep); in hidg_set_alt()
1040 hidg->in_ep); in hidg_set_alt()
1045 status = usb_ep_enable(hidg->in_ep); in hidg_set_alt()
1050 hidg->in_ep->driver_data = hidg; in hidg_set_alt()
1052 req_in = hidg_alloc_ep_req(hidg->in_ep, hidg->report_length); in hidg_set_alt()
1059 if (hidg->use_out_ep && hidg->out_ep != NULL) { in hidg_set_alt()
1061 usb_ep_disable(hidg->out_ep); in hidg_set_alt()
1064 hidg->out_ep); in hidg_set_alt()
1069 status = usb_ep_enable(hidg->out_ep); in hidg_set_alt()
1074 hidg->out_ep->driver_data = hidg; in hidg_set_alt()
1079 for (i = 0; i < hidg->qlen && status == 0; i++) { in hidg_set_alt()
1081 hidg_alloc_ep_req(hidg->out_ep, in hidg_set_alt()
1082 hidg->report_length); in hidg_set_alt()
1085 req->context = hidg; in hidg_set_alt()
1086 status = usb_ep_queue(hidg->out_ep, req, in hidg_set_alt()
1090 hidg->out_ep->name, status); in hidg_set_alt()
1091 free_ep_req(hidg->out_ep, req); 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()
1206 cpu_to_le16(hidg->report_length); in hidg_bind()
1207 hidg_hs_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
1208 hidg_fs_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
1215 cpu_to_le16(hidg->report_desc_length); in hidg_bind()
1227 if (hidg->use_out_ep) in hidg_bind()
1243 spin_lock_init(&hidg->write_spinlock); in hidg_bind()
1244 hidg->write_pending = 1; in hidg_bind()
1245 hidg->req = NULL; in hidg_bind()
1246 spin_lock_init(&hidg->read_spinlock); in hidg_bind()
1247 spin_lock_init(&hidg->get_report_spinlock); in hidg_bind()
1248 init_waitqueue_head(&hidg->write_queue); in hidg_bind()
1249 init_waitqueue_head(&hidg->read_queue); in hidg_bind()
1250 init_waitqueue_head(&hidg->get_queue); in hidg_bind()
1251 init_waitqueue_head(&hidg->get_id_queue); in hidg_bind()
1252 INIT_LIST_HEAD(&hidg->completed_out_req); in hidg_bind()
1253 INIT_LIST_HEAD(&hidg->report_list); in hidg_bind()
1255 INIT_WORK(&hidg->work, get_report_workqueue_handler); in hidg_bind()
1256 hidg->workqueue = alloc_workqueue("report_work", in hidg_bind()
1261 if (!hidg->workqueue) { in hidg_bind()
1267 cdev_init(&hidg->cdev, &f_hidg_fops); in hidg_bind()
1268 status = cdev_device_add(&hidg->cdev, &hidg->dev); in hidg_bind()
1274 destroy_workqueue(hidg->workqueue); in hidg_bind()
1278 if (hidg->req != NULL) in hidg_bind()
1279 free_ep_req(hidg->in_ep, hidg->req); in hidg_bind()
1281 usb_ep_free_request(c->cdev->gadget->ep0, hidg->get_req); in hidg_bind()
1282 hidg->get_req = NULL; in hidg_bind()
1502 struct f_hidg *hidg; in hidg_free() local
1505 hidg = func_to_hidg(f); in hidg_free()
1507 put_device(&hidg->dev); in hidg_free()
1515 struct f_hidg *hidg = func_to_hidg(f); in hidg_unbind() local
1517 cdev_device_del(&hidg->cdev, &hidg->dev); in hidg_unbind()
1518 destroy_workqueue(hidg->workqueue); in hidg_unbind()
1524 struct f_hidg *hidg; in hidg_alloc() local
1529 hidg = kzalloc(sizeof(*hidg), GFP_KERNEL); in hidg_alloc()
1530 if (!hidg) in hidg_alloc()
1537 device_initialize(&hidg->dev); in hidg_alloc()
1538 hidg->dev.release = hidg_release; in hidg_alloc()
1539 hidg->dev.class = &hidg_class; in hidg_alloc()
1540 hidg->dev.devt = MKDEV(major, opts->minor); in hidg_alloc()
1541 ret = dev_set_name(&hidg->dev, "hidg%d", opts->minor); in hidg_alloc()
1545 hidg->bInterfaceSubClass = opts->subclass; in hidg_alloc()
1546 hidg->bInterfaceProtocol = opts->protocol; in hidg_alloc()
1547 hidg->report_length = opts->report_length; in hidg_alloc()
1548 hidg->report_desc_length = opts->report_desc_length; in hidg_alloc()
1550 hidg->report_desc = kmemdup(opts->report_desc, in hidg_alloc()
1553 if (!hidg->report_desc) { in hidg_alloc()
1558 hidg->use_out_ep = !opts->no_out_endpoint; in hidg_alloc()
1563 hidg->func.name = "hid"; in hidg_alloc()
1564 hidg->func.bind = hidg_bind; in hidg_alloc()
1565 hidg->func.unbind = hidg_unbind; in hidg_alloc()
1566 hidg->func.set_alt = hidg_set_alt; in hidg_alloc()
1567 hidg->func.disable = hidg_disable; in hidg_alloc()
1568 hidg->func.setup = hidg_setup; in hidg_alloc()
1569 hidg->func.free_func = hidg_free; in hidg_alloc()
1572 hidg->qlen = 4; in hidg_alloc()
1574 return &hidg->func; in hidg_alloc()
1577 put_device(&hidg->dev); in hidg_alloc()