Lines Matching refs:uhid
58 static void uhid_queue(struct uhid_device *uhid, struct uhid_event *ev) in uhid_queue() argument
62 newhead = (uhid->head + 1) % UHID_BUFSIZE; in uhid_queue()
64 if (newhead != uhid->tail) { in uhid_queue()
65 uhid->outq[uhid->head] = ev; in uhid_queue()
66 uhid->head = newhead; in uhid_queue()
67 wake_up_interruptible(&uhid->waitq); in uhid_queue()
69 hid_warn(uhid->hid, "Output queue is full\n"); in uhid_queue()
74 static int uhid_queue_event(struct uhid_device *uhid, __u32 event) in uhid_queue_event() argument
85 spin_lock_irqsave(&uhid->qlock, flags); in uhid_queue_event()
86 uhid_queue(uhid, ev); in uhid_queue_event()
87 spin_unlock_irqrestore(&uhid->qlock, flags); in uhid_queue_event()
94 struct uhid_device *uhid = hid->driver_data; in uhid_hid_start() local
111 spin_lock_irqsave(&uhid->qlock, flags); in uhid_hid_start()
112 uhid_queue(uhid, ev); in uhid_hid_start()
113 spin_unlock_irqrestore(&uhid->qlock, flags); in uhid_hid_start()
120 struct uhid_device *uhid = hid->driver_data; in uhid_hid_stop() local
123 uhid_queue_event(uhid, UHID_STOP); in uhid_hid_stop()
128 struct uhid_device *uhid = hid->driver_data; in uhid_hid_open() local
130 return uhid_queue_event(uhid, UHID_OPEN); in uhid_hid_open()
135 struct uhid_device *uhid = hid->driver_data; in uhid_hid_close() local
137 uhid_queue_event(uhid, UHID_CLOSE); in uhid_hid_close()
142 struct uhid_device *uhid = hid->driver_data; in uhid_hid_parse() local
144 return hid_parse_report(hid, uhid->rd_data, uhid->rd_size); in uhid_hid_parse()
148 static int __uhid_report_queue_and_wait(struct uhid_device *uhid, in __uhid_report_queue_and_wait() argument
155 spin_lock_irqsave(&uhid->qlock, flags); in __uhid_report_queue_and_wait()
156 *report_id = ++uhid->report_id; in __uhid_report_queue_and_wait()
157 uhid->report_type = ev->type + 1; in __uhid_report_queue_and_wait()
158 uhid->report_running = true; in __uhid_report_queue_and_wait()
159 uhid_queue(uhid, ev); in __uhid_report_queue_and_wait()
160 spin_unlock_irqrestore(&uhid->qlock, flags); in __uhid_report_queue_and_wait()
162 ret = wait_event_interruptible_timeout(uhid->report_wait, in __uhid_report_queue_and_wait()
163 !uhid->report_running || !uhid->running, in __uhid_report_queue_and_wait()
165 if (!ret || !uhid->running || uhid->report_running) in __uhid_report_queue_and_wait()
172 uhid->report_running = false; in __uhid_report_queue_and_wait()
177 static void uhid_report_wake_up(struct uhid_device *uhid, u32 id, in uhid_report_wake_up() argument
182 spin_lock_irqsave(&uhid->qlock, flags); in uhid_report_wake_up()
185 if (uhid->report_type != ev->type || uhid->report_id != id) in uhid_report_wake_up()
187 if (!uhid->report_running) in uhid_report_wake_up()
190 memcpy(&uhid->report_buf, ev, sizeof(*ev)); in uhid_report_wake_up()
191 uhid->report_running = false; in uhid_report_wake_up()
192 wake_up_interruptible(&uhid->report_wait); in uhid_report_wake_up()
195 spin_unlock_irqrestore(&uhid->qlock, flags); in uhid_report_wake_up()
201 struct uhid_device *uhid = hid->driver_data; in uhid_hid_get_report() local
206 if (!uhid->running) in uhid_hid_get_report()
217 ret = mutex_lock_interruptible(&uhid->report_lock); in uhid_hid_get_report()
224 ret = __uhid_report_queue_and_wait(uhid, ev, &ev->u.get_report.id); in uhid_hid_get_report()
228 req = &uhid->report_buf.u.get_report_reply; in uhid_hid_get_report()
237 mutex_unlock(&uhid->report_lock); in uhid_hid_get_report()
244 struct uhid_device *uhid = hid->driver_data; in uhid_hid_set_report() local
248 if (!uhid->running || count > UHID_DATA_MAX) in uhid_hid_set_report()
261 ret = mutex_lock_interruptible(&uhid->report_lock); in uhid_hid_set_report()
268 ret = __uhid_report_queue_and_wait(uhid, ev, &ev->u.set_report.id); in uhid_hid_set_report()
272 if (uhid->report_buf.u.set_report_reply.err) in uhid_hid_set_report()
278 mutex_unlock(&uhid->report_lock); in uhid_hid_set_report()
315 struct uhid_device *uhid = hid->driver_data; in uhid_hid_output_raw() local
343 spin_lock_irqsave(&uhid->qlock, flags); in uhid_hid_output_raw()
344 uhid_queue(uhid, ev); in uhid_hid_output_raw()
345 spin_unlock_irqrestore(&uhid->qlock, flags); in uhid_hid_output_raw()
454 static int uhid_dev_create2(struct uhid_device *uhid, in uhid_dev_create2() argument
462 if (uhid->running) in uhid_dev_create2()
473 uhid->rd_size = rd_size; in uhid_dev_create2()
474 uhid->rd_data = rd_data; in uhid_dev_create2()
495 hid->driver_data = uhid; in uhid_dev_create2()
498 uhid->hid = hid; in uhid_dev_create2()
499 uhid->running = true; in uhid_dev_create2()
511 uhid->hid = NULL; in uhid_dev_create2()
512 uhid->running = false; in uhid_dev_create2()
514 kfree(uhid->rd_data); in uhid_dev_create2()
515 uhid->rd_data = NULL; in uhid_dev_create2()
516 uhid->rd_size = 0; in uhid_dev_create2()
520 static int uhid_dev_create(struct uhid_device *uhid, in uhid_dev_create() argument
542 return uhid_dev_create2(uhid, ev); in uhid_dev_create()
545 static int uhid_dev_destroy(struct uhid_device *uhid) in uhid_dev_destroy() argument
547 if (!uhid->running) in uhid_dev_destroy()
550 uhid->running = false; in uhid_dev_destroy()
551 wake_up_interruptible(&uhid->report_wait); in uhid_dev_destroy()
553 hid_destroy_device(uhid->hid); in uhid_dev_destroy()
554 kfree(uhid->rd_data); in uhid_dev_destroy()
559 static int uhid_dev_input(struct uhid_device *uhid, struct uhid_event *ev) in uhid_dev_input() argument
561 if (!uhid->running) in uhid_dev_input()
564 hid_input_report(uhid->hid, HID_INPUT_REPORT, ev->u.input.data, in uhid_dev_input()
570 static int uhid_dev_input2(struct uhid_device *uhid, struct uhid_event *ev) in uhid_dev_input2() argument
572 if (!uhid->running) in uhid_dev_input2()
575 hid_input_report(uhid->hid, HID_INPUT_REPORT, ev->u.input2.data, in uhid_dev_input2()
581 static int uhid_dev_get_report_reply(struct uhid_device *uhid, in uhid_dev_get_report_reply() argument
584 if (!uhid->running) in uhid_dev_get_report_reply()
587 uhid_report_wake_up(uhid, ev->u.get_report_reply.id, ev); in uhid_dev_get_report_reply()
591 static int uhid_dev_set_report_reply(struct uhid_device *uhid, in uhid_dev_set_report_reply() argument
594 if (!uhid->running) in uhid_dev_set_report_reply()
597 uhid_report_wake_up(uhid, ev->u.set_report_reply.id, ev); in uhid_dev_set_report_reply()
603 struct uhid_device *uhid; in uhid_char_open() local
605 uhid = kzalloc(sizeof(*uhid), GFP_KERNEL); in uhid_char_open()
606 if (!uhid) in uhid_char_open()
609 mutex_init(&uhid->devlock); in uhid_char_open()
610 mutex_init(&uhid->report_lock); in uhid_char_open()
611 spin_lock_init(&uhid->qlock); in uhid_char_open()
612 init_waitqueue_head(&uhid->waitq); in uhid_char_open()
613 init_waitqueue_head(&uhid->report_wait); in uhid_char_open()
614 uhid->running = false; in uhid_char_open()
616 file->private_data = uhid; in uhid_char_open()
624 struct uhid_device *uhid = file->private_data; in uhid_char_release() local
627 uhid_dev_destroy(uhid); in uhid_char_release()
630 kfree(uhid->outq[i]); in uhid_char_release()
632 kfree(uhid); in uhid_char_release()
640 struct uhid_device *uhid = file->private_data; in uhid_char_read() local
651 if (uhid->head == uhid->tail) in uhid_char_read()
654 ret = wait_event_interruptible(uhid->waitq, in uhid_char_read()
655 uhid->head != uhid->tail); in uhid_char_read()
660 ret = mutex_lock_interruptible(&uhid->devlock); in uhid_char_read()
664 if (uhid->head == uhid->tail) { in uhid_char_read()
665 mutex_unlock(&uhid->devlock); in uhid_char_read()
668 len = min(count, sizeof(**uhid->outq)); in uhid_char_read()
669 if (copy_to_user(buffer, uhid->outq[uhid->tail], len)) { in uhid_char_read()
672 kfree(uhid->outq[uhid->tail]); in uhid_char_read()
673 uhid->outq[uhid->tail] = NULL; in uhid_char_read()
675 spin_lock_irqsave(&uhid->qlock, flags); in uhid_char_read()
676 uhid->tail = (uhid->tail + 1) % UHID_BUFSIZE; in uhid_char_read()
677 spin_unlock_irqrestore(&uhid->qlock, flags); in uhid_char_read()
681 mutex_unlock(&uhid->devlock); in uhid_char_read()
688 struct uhid_device *uhid = file->private_data; in uhid_char_write() local
696 ret = mutex_lock_interruptible(&uhid->devlock); in uhid_char_write()
700 memset(&uhid->input_buf, 0, sizeof(uhid->input_buf)); in uhid_char_write()
701 len = min(count, sizeof(uhid->input_buf)); in uhid_char_write()
703 ret = uhid_event_from_user(buffer, len, &uhid->input_buf); in uhid_char_write()
707 switch (uhid->input_buf.type) { in uhid_char_write()
709 ret = uhid_dev_create(uhid, &uhid->input_buf); in uhid_char_write()
712 ret = uhid_dev_create2(uhid, &uhid->input_buf); in uhid_char_write()
715 ret = uhid_dev_destroy(uhid); in uhid_char_write()
718 ret = uhid_dev_input(uhid, &uhid->input_buf); in uhid_char_write()
721 ret = uhid_dev_input2(uhid, &uhid->input_buf); in uhid_char_write()
724 ret = uhid_dev_get_report_reply(uhid, &uhid->input_buf); in uhid_char_write()
727 ret = uhid_dev_set_report_reply(uhid, &uhid->input_buf); in uhid_char_write()
734 mutex_unlock(&uhid->devlock); in uhid_char_write()
742 struct uhid_device *uhid = file->private_data; in uhid_char_poll() local
744 poll_wait(file, &uhid->waitq, wait); in uhid_char_poll()
746 if (uhid->head != uhid->tail) in uhid_char_poll()