Lines Matching refs:hidg
89 struct f_hidg *hidg = container_of(dev, struct f_hidg, dev); in hidg_release() local
91 kfree(hidg->set_report_buf); in hidg_release()
92 kfree(hidg); in hidg_release()
290 struct f_hidg *hidg = file->private_data; in f_hidg_intout_read() local
299 spin_lock_irqsave(&hidg->read_spinlock, flags); in f_hidg_intout_read()
301 #define READ_COND_INTOUT (!list_empty(&hidg->completed_out_req)) in f_hidg_intout_read()
305 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in f_hidg_intout_read()
309 if (wait_event_interruptible(hidg->read_queue, READ_COND_INTOUT)) in f_hidg_intout_read()
312 spin_lock_irqsave(&hidg->read_spinlock, flags); in f_hidg_intout_read()
316 list = list_first_entry(&hidg->completed_out_req, in f_hidg_intout_read()
327 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in f_hidg_intout_read()
342 req->length = hidg->report_length; in f_hidg_intout_read()
343 ret = usb_ep_queue(hidg->out_ep, req, GFP_KERNEL); in f_hidg_intout_read()
345 free_ep_req(hidg->out_ep, req); in f_hidg_intout_read()
349 spin_lock_irqsave(&hidg->read_spinlock, flags); in f_hidg_intout_read()
350 list_add(&list->list, &hidg->completed_out_req); in f_hidg_intout_read()
351 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in f_hidg_intout_read()
353 wake_up(&hidg->read_queue); in f_hidg_intout_read()
359 #define READ_COND_SSREPORT (hidg->set_report_buf != NULL)
364 struct f_hidg *hidg = file->private_data; in f_hidg_ssreport_read() local
371 spin_lock_irqsave(&hidg->read_spinlock, flags); in f_hidg_ssreport_read()
374 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in f_hidg_ssreport_read()
378 if (wait_event_interruptible(hidg->read_queue, READ_COND_SSREPORT)) in f_hidg_ssreport_read()
381 spin_lock_irqsave(&hidg->read_spinlock, flags); in f_hidg_ssreport_read()
384 count = min_t(unsigned int, count, hidg->set_report_length); in f_hidg_ssreport_read()
385 tmp_buf = hidg->set_report_buf; in f_hidg_ssreport_read()
386 hidg->set_report_buf = NULL; in f_hidg_ssreport_read()
388 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in f_hidg_ssreport_read()
397 wake_up(&hidg->read_queue); in f_hidg_ssreport_read()
405 struct f_hidg *hidg = file->private_data; in f_hidg_read() local
407 if (hidg->use_out_ep) in f_hidg_read()
415 struct f_hidg *hidg = (struct f_hidg *)ep->driver_data; in f_hidg_req_complete() local
419 ERROR(hidg->func.config->cdev, in f_hidg_req_complete()
423 spin_lock_irqsave(&hidg->write_spinlock, flags); in f_hidg_req_complete()
424 hidg->write_pending = 0; in f_hidg_req_complete()
425 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_req_complete()
426 wake_up(&hidg->write_queue); in f_hidg_req_complete()
432 struct f_hidg *hidg = file->private_data; in f_hidg_write() local
437 spin_lock_irqsave(&hidg->write_spinlock, flags); in f_hidg_write()
439 if (!hidg->req) { in f_hidg_write()
440 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_write()
444 #define WRITE_COND (!hidg->write_pending) in f_hidg_write()
448 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_write()
453 hidg->write_queue, WRITE_COND)) in f_hidg_write()
456 spin_lock_irqsave(&hidg->write_spinlock, flags); in f_hidg_write()
459 hidg->write_pending = 1; in f_hidg_write()
460 req = hidg->req; in f_hidg_write()
461 count = min_t(unsigned, count, hidg->report_length); in f_hidg_write()
463 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_write()
466 ERROR(hidg->func.config->cdev, "hidg->req is NULL\n"); in f_hidg_write()
473 ERROR(hidg->func.config->cdev, in f_hidg_write()
479 spin_lock_irqsave(&hidg->write_spinlock, flags); in f_hidg_write()
482 if (!hidg->req) { in f_hidg_write()
483 free_ep_req(hidg->in_ep, req); in f_hidg_write()
495 req->context = hidg; in f_hidg_write()
497 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_write()
499 if (!hidg->in_ep->enabled) { in f_hidg_write()
500 ERROR(hidg->func.config->cdev, "in_ep is disabled\n"); in f_hidg_write()
505 status = usb_ep_queue(hidg->in_ep, req, GFP_ATOMIC); in f_hidg_write()
513 spin_lock_irqsave(&hidg->write_spinlock, flags); in f_hidg_write()
514 hidg->write_pending = 0; in f_hidg_write()
515 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in f_hidg_write()
517 wake_up(&hidg->write_queue); in f_hidg_write()
524 struct f_hidg *hidg = file->private_data; in f_hidg_poll() local
527 poll_wait(file, &hidg->read_queue, wait); in f_hidg_poll()
528 poll_wait(file, &hidg->write_queue, wait); in f_hidg_poll()
533 if (hidg->use_out_ep) { in f_hidg_poll()
556 struct f_hidg *hidg = in f_hidg_open() local
559 fd->private_data = hidg; in f_hidg_open()
575 struct f_hidg *hidg = (struct f_hidg *) req->context; in hidg_intout_complete() local
576 struct usb_composite_dev *cdev = hidg->func.config->cdev; in hidg_intout_complete()
590 spin_lock_irqsave(&hidg->read_spinlock, flags); in hidg_intout_complete()
591 list_add_tail(&req_list->list, &hidg->completed_out_req); in hidg_intout_complete()
592 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in hidg_intout_complete()
594 wake_up(&hidg->read_queue); in hidg_intout_complete()
610 struct f_hidg *hidg = (struct f_hidg *)req->context; in hidg_ssreport_complete() local
611 struct usb_composite_dev *cdev = hidg->func.config->cdev; in hidg_ssreport_complete()
622 spin_lock_irqsave(&hidg->read_spinlock, flags); in hidg_ssreport_complete()
624 new_buf = krealloc(hidg->set_report_buf, req->actual, GFP_ATOMIC); in hidg_ssreport_complete()
626 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in hidg_ssreport_complete()
629 hidg->set_report_buf = new_buf; in hidg_ssreport_complete()
631 hidg->set_report_length = req->actual; in hidg_ssreport_complete()
632 memcpy(hidg->set_report_buf, req->buf, req->actual); in hidg_ssreport_complete()
634 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in hidg_ssreport_complete()
636 wake_up(&hidg->read_queue); in hidg_ssreport_complete()
642 struct f_hidg *hidg = func_to_hidg(f); in hidg_setup() local
661 length = min_t(unsigned, length, hidg->report_length); in hidg_setup()
671 ((u8 *) req->buf)[0] = hidg->protocol; in hidg_setup()
679 ((u8 *) req->buf)[0] = hidg->idle; in hidg_setup()
686 if (hidg->use_out_ep) in hidg_setup()
689 req->context = hidg; in hidg_setup()
703 if (hidg->bInterfaceSubClass == USB_INTERFACE_SUBCLASS_BOOT) { in hidg_setup()
704 hidg->protocol = value; in hidg_setup()
714 hidg->idle = value >> 8; in hidg_setup()
728 cpu_to_le16(hidg->report_desc_length); in hidg_setup()
739 hidg->report_desc_length); in hidg_setup()
740 memcpy(req->buf, hidg->report_desc, length); in hidg_setup()
773 struct f_hidg *hidg = func_to_hidg(f); in hidg_disable() local
777 usb_ep_disable(hidg->in_ep); in hidg_disable()
779 if (hidg->out_ep) { in hidg_disable()
780 usb_ep_disable(hidg->out_ep); in hidg_disable()
782 spin_lock_irqsave(&hidg->read_spinlock, flags); in hidg_disable()
783 list_for_each_entry_safe(list, next, &hidg->completed_out_req, list) { in hidg_disable()
784 free_ep_req(hidg->out_ep, list->req); in hidg_disable()
788 spin_unlock_irqrestore(&hidg->read_spinlock, flags); in hidg_disable()
791 spin_lock_irqsave(&hidg->write_spinlock, flags); in hidg_disable()
792 if (!hidg->write_pending) { in hidg_disable()
793 free_ep_req(hidg->in_ep, hidg->req); in hidg_disable()
794 hidg->write_pending = 1; in hidg_disable()
797 hidg->req = NULL; in hidg_disable()
798 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in hidg_disable()
804 struct f_hidg *hidg = func_to_hidg(f); in hidg_set_alt() local
811 if (hidg->in_ep != NULL) { in hidg_set_alt()
813 usb_ep_disable(hidg->in_ep); in hidg_set_alt()
816 hidg->in_ep); in hidg_set_alt()
821 status = usb_ep_enable(hidg->in_ep); in hidg_set_alt()
826 hidg->in_ep->driver_data = hidg; in hidg_set_alt()
828 req_in = hidg_alloc_ep_req(hidg->in_ep, hidg->report_length); in hidg_set_alt()
835 if (hidg->use_out_ep && hidg->out_ep != NULL) { in hidg_set_alt()
837 usb_ep_disable(hidg->out_ep); in hidg_set_alt()
840 hidg->out_ep); in hidg_set_alt()
845 status = usb_ep_enable(hidg->out_ep); in hidg_set_alt()
850 hidg->out_ep->driver_data = hidg; in hidg_set_alt()
855 for (i = 0; i < hidg->qlen && status == 0; i++) { in hidg_set_alt()
857 hidg_alloc_ep_req(hidg->out_ep, in hidg_set_alt()
858 hidg->report_length); in hidg_set_alt()
861 req->context = hidg; in hidg_set_alt()
862 status = usb_ep_queue(hidg->out_ep, req, in hidg_set_alt()
866 hidg->out_ep->name, status); in hidg_set_alt()
867 free_ep_req(hidg->out_ep, req); in hidg_set_alt()
876 if (hidg->in_ep != NULL) { in hidg_set_alt()
877 spin_lock_irqsave(&hidg->write_spinlock, flags); in hidg_set_alt()
878 hidg->req = req_in; in hidg_set_alt()
879 hidg->write_pending = 0; in hidg_set_alt()
880 spin_unlock_irqrestore(&hidg->write_spinlock, flags); in hidg_set_alt()
882 wake_up(&hidg->write_queue); in hidg_set_alt()
886 if (hidg->out_ep) in hidg_set_alt()
887 usb_ep_disable(hidg->out_ep); in hidg_set_alt()
890 free_ep_req(hidg->in_ep, req_in); in hidg_set_alt()
893 if (hidg->in_ep) in hidg_set_alt()
894 usb_ep_disable(hidg->in_ep); in hidg_set_alt()
913 struct f_hidg *hidg = func_to_hidg(f); in hidg_bind() local
935 hidg->in_ep = ep; in hidg_bind()
937 hidg->out_ep = NULL; in hidg_bind()
938 if (hidg->use_out_ep) { in hidg_bind()
942 hidg->out_ep = ep; in hidg_bind()
946 hidg->set_report_buf = NULL; in hidg_bind()
949 hidg_interface_desc.bInterfaceSubClass = hidg->bInterfaceSubClass; in hidg_bind()
950 hidg_interface_desc.bInterfaceProtocol = hidg->bInterfaceProtocol; in hidg_bind()
951 hidg_interface_desc.bNumEndpoints = hidg->use_out_ep ? 2 : 1; in hidg_bind()
952 hidg->protocol = HID_REPORT_PROTOCOL; in hidg_bind()
953 hidg->idle = 1; in hidg_bind()
954 hidg_ss_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
956 cpu_to_le16(hidg->report_length); in hidg_bind()
957 hidg_hs_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
958 hidg_fs_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
959 hidg_ss_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
961 cpu_to_le16(hidg->report_length); in hidg_bind()
962 hidg_hs_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
963 hidg_fs_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
970 cpu_to_le16(hidg->report_desc_length); in hidg_bind()
982 if (hidg->use_out_ep) in hidg_bind()
998 spin_lock_init(&hidg->write_spinlock); in hidg_bind()
999 hidg->write_pending = 1; in hidg_bind()
1000 hidg->req = NULL; in hidg_bind()
1001 spin_lock_init(&hidg->read_spinlock); in hidg_bind()
1002 init_waitqueue_head(&hidg->write_queue); in hidg_bind()
1003 init_waitqueue_head(&hidg->read_queue); in hidg_bind()
1004 INIT_LIST_HEAD(&hidg->completed_out_req); in hidg_bind()
1007 cdev_init(&hidg->cdev, &f_hidg_fops); in hidg_bind()
1008 status = cdev_device_add(&hidg->cdev, &hidg->dev); in hidg_bind()
1017 if (hidg->req != NULL) in hidg_bind()
1018 free_ep_req(hidg->in_ep, hidg->req); in hidg_bind()
1238 struct f_hidg *hidg; in hidg_free() local
1241 hidg = func_to_hidg(f); in hidg_free()
1243 put_device(&hidg->dev); in hidg_free()
1251 struct f_hidg *hidg = func_to_hidg(f); in hidg_unbind() local
1253 cdev_device_del(&hidg->cdev, &hidg->dev); in hidg_unbind()
1260 struct f_hidg *hidg; in hidg_alloc() local
1265 hidg = kzalloc(sizeof(*hidg), GFP_KERNEL); in hidg_alloc()
1266 if (!hidg) in hidg_alloc()
1274 device_initialize(&hidg->dev); in hidg_alloc()
1275 hidg->dev.release = hidg_release; in hidg_alloc()
1276 hidg->dev.class = hidg_class; in hidg_alloc()
1277 hidg->dev.devt = MKDEV(major, opts->minor); in hidg_alloc()
1278 ret = dev_set_name(&hidg->dev, "hidg%d", opts->minor); in hidg_alloc()
1285 hidg->bInterfaceSubClass = opts->subclass; in hidg_alloc()
1286 hidg->bInterfaceProtocol = opts->protocol; in hidg_alloc()
1287 hidg->report_length = opts->report_length; in hidg_alloc()
1288 hidg->report_desc_length = opts->report_desc_length; in hidg_alloc()
1290 hidg->report_desc = devm_kmemdup(&hidg->dev, opts->report_desc, in hidg_alloc()
1293 if (!hidg->report_desc) { in hidg_alloc()
1294 put_device(&hidg->dev); in hidg_alloc()
1299 hidg->use_out_ep = !opts->no_out_endpoint; in hidg_alloc()
1303 hidg->func.name = "hid"; in hidg_alloc()
1304 hidg->func.bind = hidg_bind; in hidg_alloc()
1305 hidg->func.unbind = hidg_unbind; in hidg_alloc()
1306 hidg->func.set_alt = hidg_set_alt; in hidg_alloc()
1307 hidg->func.disable = hidg_disable; in hidg_alloc()
1308 hidg->func.setup = hidg_setup; in hidg_alloc()
1309 hidg->func.free_func = hidg_free; in hidg_alloc()
1312 hidg->qlen = 4; in hidg_alloc()
1314 return &hidg->func; in hidg_alloc()