Lines Matching refs:hidg

195 	struct f_hidg *hidg = file->private_data;  in f_hidg_read()  local
207 spin_lock_irqsave(&hidg->spinlock, flags); in f_hidg_read()
209 #define READ_COND (!list_empty(&hidg->completed_out_req)) in f_hidg_read()
213 spin_unlock_irqrestore(&hidg->spinlock, flags); in f_hidg_read()
217 if (wait_event_interruptible(hidg->read_queue, READ_COND)) in f_hidg_read()
220 spin_lock_irqsave(&hidg->spinlock, flags); in f_hidg_read()
224 list = list_first_entry(&hidg->completed_out_req, in f_hidg_read()
228 spin_unlock_irqrestore(&hidg->spinlock, flags); in f_hidg_read()
241 spin_lock_irqsave(&hidg->spinlock, flags); in f_hidg_read()
244 spin_unlock_irqrestore(&hidg->spinlock, flags); in f_hidg_read()
246 req->length = hidg->report_length; in f_hidg_read()
247 ret = usb_ep_queue(hidg->out_ep, req, GFP_KERNEL); in f_hidg_read()
257 struct f_hidg *hidg = (struct f_hidg *)ep->driver_data; in f_hidg_req_complete() local
260 ERROR(hidg->func.config->cdev, in f_hidg_req_complete()
264 hidg->write_pending = 0; in f_hidg_req_complete()
265 wake_up(&hidg->write_queue); in f_hidg_req_complete()
271 struct f_hidg *hidg = file->private_data; in f_hidg_write() local
277 mutex_lock(&hidg->lock); in f_hidg_write()
279 #define WRITE_COND (!hidg->write_pending) in f_hidg_write()
283 mutex_unlock(&hidg->lock); in f_hidg_write()
288 hidg->write_queue, WRITE_COND)) in f_hidg_write()
291 mutex_lock(&hidg->lock); in f_hidg_write()
294 count = min_t(unsigned, count, hidg->report_length); in f_hidg_write()
295 status = copy_from_user(hidg->req->buf, buffer, count); in f_hidg_write()
298 ERROR(hidg->func.config->cdev, in f_hidg_write()
300 mutex_unlock(&hidg->lock); in f_hidg_write()
304 hidg->req->status = 0; in f_hidg_write()
305 hidg->req->zero = 0; in f_hidg_write()
306 hidg->req->length = count; in f_hidg_write()
307 hidg->req->complete = f_hidg_req_complete; in f_hidg_write()
308 hidg->req->context = hidg; in f_hidg_write()
309 hidg->write_pending = 1; in f_hidg_write()
311 status = usb_ep_queue(hidg->in_ep, hidg->req, GFP_ATOMIC); in f_hidg_write()
313 ERROR(hidg->func.config->cdev, in f_hidg_write()
315 hidg->write_pending = 0; in f_hidg_write()
316 wake_up(&hidg->write_queue); in f_hidg_write()
321 mutex_unlock(&hidg->lock); in f_hidg_write()
328 struct f_hidg *hidg = file->private_data; in f_hidg_poll() local
331 poll_wait(file, &hidg->read_queue, wait); in f_hidg_poll()
332 poll_wait(file, &hidg->write_queue, wait); in f_hidg_poll()
354 struct f_hidg *hidg = in f_hidg_open() local
357 fd->private_data = hidg; in f_hidg_open()
373 struct f_hidg *hidg = (struct f_hidg *) req->context; in hidg_set_report_complete() local
383 spin_lock_irqsave(&hidg->spinlock, flags); in hidg_set_report_complete()
384 list_add_tail(&req_list->list, &hidg->completed_out_req); in hidg_set_report_complete()
385 spin_unlock_irqrestore(&hidg->spinlock, flags); in hidg_set_report_complete()
387 wake_up(&hidg->read_queue); in hidg_set_report_complete()
393 struct f_hidg *hidg = func_to_hidg(f); in hidg_setup() local
412 length = min_t(unsigned, length, hidg->report_length); in hidg_setup()
446 cpu_to_le16(hidg->report_desc_length); in hidg_setup()
457 hidg->report_desc_length); in hidg_setup()
458 memcpy(req->buf, hidg->report_desc, length); in hidg_setup()
491 struct f_hidg *hidg = func_to_hidg(f); in hidg_disable() local
494 usb_ep_disable(hidg->in_ep); in hidg_disable()
495 hidg->in_ep->driver_data = NULL; in hidg_disable()
497 usb_ep_disable(hidg->out_ep); in hidg_disable()
498 hidg->out_ep->driver_data = NULL; in hidg_disable()
500 list_for_each_entry_safe(list, next, &hidg->completed_out_req, list) { in hidg_disable()
509 struct f_hidg *hidg = func_to_hidg(f); in hidg_set_alt() local
514 if (hidg->in_ep != NULL) { in hidg_set_alt()
516 if (hidg->in_ep->driver_data != NULL) in hidg_set_alt()
517 usb_ep_disable(hidg->in_ep); in hidg_set_alt()
520 hidg->in_ep); in hidg_set_alt()
525 status = usb_ep_enable(hidg->in_ep); in hidg_set_alt()
530 hidg->in_ep->driver_data = hidg; in hidg_set_alt()
534 if (hidg->out_ep != NULL) { in hidg_set_alt()
536 if (hidg->out_ep->driver_data != NULL) in hidg_set_alt()
537 usb_ep_disable(hidg->out_ep); in hidg_set_alt()
540 hidg->out_ep); in hidg_set_alt()
545 status = usb_ep_enable(hidg->out_ep); in hidg_set_alt()
550 hidg->out_ep->driver_data = hidg; in hidg_set_alt()
555 for (i = 0; i < hidg->qlen && status == 0; i++) { in hidg_set_alt()
557 hidg_alloc_ep_req(hidg->out_ep, in hidg_set_alt()
558 hidg->report_length); in hidg_set_alt()
561 req->context = hidg; in hidg_set_alt()
562 status = usb_ep_queue(hidg->out_ep, req, in hidg_set_alt()
566 hidg->out_ep->name, status); in hidg_set_alt()
568 usb_ep_disable(hidg->out_ep); in hidg_set_alt()
569 hidg->out_ep->driver_data = NULL; in hidg_set_alt()
593 struct f_hidg *hidg = func_to_hidg(f); in hidg_bind() local
618 hidg->in_ep = ep; in hidg_bind()
624 hidg->out_ep = ep; in hidg_bind()
628 hidg->req = usb_ep_alloc_request(hidg->in_ep, GFP_KERNEL); in hidg_bind()
629 if (!hidg->req) in hidg_bind()
632 hidg->req->buf = kmalloc(hidg->report_length, GFP_KERNEL); in hidg_bind()
633 if (!hidg->req->buf) in hidg_bind()
637 hidg_interface_desc.bInterfaceSubClass = hidg->bInterfaceSubClass; in hidg_bind()
638 hidg_interface_desc.bInterfaceProtocol = hidg->bInterfaceProtocol; in hidg_bind()
639 hidg_hs_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
640 hidg_fs_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
641 hidg_hs_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
642 hidg_fs_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); in hidg_bind()
649 cpu_to_le16(hidg->report_desc_length); in hidg_bind()
661 mutex_init(&hidg->lock); in hidg_bind()
662 spin_lock_init(&hidg->spinlock); in hidg_bind()
663 init_waitqueue_head(&hidg->write_queue); in hidg_bind()
664 init_waitqueue_head(&hidg->read_queue); in hidg_bind()
665 INIT_LIST_HEAD(&hidg->completed_out_req); in hidg_bind()
668 cdev_init(&hidg->cdev, &f_hidg_fops); in hidg_bind()
669 dev = MKDEV(major, hidg->minor); in hidg_bind()
670 status = cdev_add(&hidg->cdev, dev, 1); in hidg_bind()
675 "%s%d", "hidg", hidg->minor); in hidg_bind()
683 cdev_del(&hidg->cdev); in hidg_bind()
688 if (hidg->req != NULL) { in hidg_bind()
689 kfree(hidg->req->buf); in hidg_bind()
690 if (hidg->in_ep != NULL) in hidg_bind()
691 usb_ep_free_request(hidg->in_ep, hidg->req); in hidg_bind()
902 struct f_hidg *hidg; in hidg_free() local
905 hidg = func_to_hidg(f); in hidg_free()
907 kfree(hidg->report_desc); in hidg_free()
908 kfree(hidg); in hidg_free()
916 struct f_hidg *hidg = func_to_hidg(f); in hidg_unbind() local
918 device_destroy(hidg_class, MKDEV(major, hidg->minor)); in hidg_unbind()
919 cdev_del(&hidg->cdev); in hidg_unbind()
922 usb_ep_disable(hidg->in_ep); in hidg_unbind()
923 kfree(hidg->req->buf); in hidg_unbind()
924 usb_ep_free_request(hidg->in_ep, hidg->req); in hidg_unbind()
931 struct f_hidg *hidg; in hidg_alloc() local
935 hidg = kzalloc(sizeof(*hidg), GFP_KERNEL); in hidg_alloc()
936 if (!hidg) in hidg_alloc()
944 hidg->minor = opts->minor; in hidg_alloc()
945 hidg->bInterfaceSubClass = opts->subclass; in hidg_alloc()
946 hidg->bInterfaceProtocol = opts->protocol; in hidg_alloc()
947 hidg->report_length = opts->report_length; in hidg_alloc()
948 hidg->report_desc_length = opts->report_desc_length; in hidg_alloc()
950 hidg->report_desc = kmemdup(opts->report_desc, in hidg_alloc()
953 if (!hidg->report_desc) { in hidg_alloc()
954 kfree(hidg); in hidg_alloc()
962 hidg->func.name = "hid"; in hidg_alloc()
963 hidg->func.bind = hidg_bind; in hidg_alloc()
964 hidg->func.unbind = hidg_unbind; in hidg_alloc()
965 hidg->func.set_alt = hidg_set_alt; in hidg_alloc()
966 hidg->func.disable = hidg_disable; in hidg_alloc()
967 hidg->func.setup = hidg_setup; in hidg_alloc()
968 hidg->func.free_func = hidg_free; in hidg_alloc()
971 hidg->qlen = 4; in hidg_alloc()
973 return &hidg->func; in hidg_alloc()