Lines Matching refs:uhid

61 	struct uhid_device *uhid = container_of(work, struct uhid_device, worker);  in uhid_device_add_worker()  local
64 ret = hid_add_device(uhid->hid); in uhid_device_add_worker()
66 hid_err(uhid->hid, "Cannot register HID device: error %d\n", ret); in uhid_device_add_worker()
68 hid_destroy_device(uhid->hid); in uhid_device_add_worker()
69 uhid->hid = NULL; in uhid_device_add_worker()
70 uhid->running = false; in uhid_device_add_worker()
74 static void uhid_queue(struct uhid_device *uhid, struct uhid_event *ev) in uhid_queue() argument
78 newhead = (uhid->head + 1) % UHID_BUFSIZE; in uhid_queue()
80 if (newhead != uhid->tail) { in uhid_queue()
81 uhid->outq[uhid->head] = ev; in uhid_queue()
82 uhid->head = newhead; in uhid_queue()
83 wake_up_interruptible(&uhid->waitq); in uhid_queue()
85 hid_warn(uhid->hid, "Output queue is full\n"); in uhid_queue()
90 static int uhid_queue_event(struct uhid_device *uhid, __u32 event) in uhid_queue_event() argument
101 spin_lock_irqsave(&uhid->qlock, flags); in uhid_queue_event()
102 uhid_queue(uhid, ev); in uhid_queue_event()
103 spin_unlock_irqrestore(&uhid->qlock, flags); in uhid_queue_event()
110 struct uhid_device *uhid = hid->driver_data; in uhid_hid_start() local
127 spin_lock_irqsave(&uhid->qlock, flags); in uhid_hid_start()
128 uhid_queue(uhid, ev); in uhid_hid_start()
129 spin_unlock_irqrestore(&uhid->qlock, flags); in uhid_hid_start()
136 struct uhid_device *uhid = hid->driver_data; in uhid_hid_stop() local
139 uhid_queue_event(uhid, UHID_STOP); in uhid_hid_stop()
144 struct uhid_device *uhid = hid->driver_data; in uhid_hid_open() local
146 return uhid_queue_event(uhid, UHID_OPEN); in uhid_hid_open()
151 struct uhid_device *uhid = hid->driver_data; in uhid_hid_close() local
153 uhid_queue_event(uhid, UHID_CLOSE); in uhid_hid_close()
158 struct uhid_device *uhid = hid->driver_data; in uhid_hid_parse() local
160 return hid_parse_report(hid, uhid->rd_data, uhid->rd_size); in uhid_hid_parse()
164 static int __uhid_report_queue_and_wait(struct uhid_device *uhid, in __uhid_report_queue_and_wait() argument
171 spin_lock_irqsave(&uhid->qlock, flags); in __uhid_report_queue_and_wait()
172 *report_id = ++uhid->report_id; in __uhid_report_queue_and_wait()
173 uhid->report_type = ev->type + 1; in __uhid_report_queue_and_wait()
174 uhid->report_running = true; in __uhid_report_queue_and_wait()
175 uhid_queue(uhid, ev); in __uhid_report_queue_and_wait()
176 spin_unlock_irqrestore(&uhid->qlock, flags); in __uhid_report_queue_and_wait()
178 ret = wait_event_interruptible_timeout(uhid->report_wait, in __uhid_report_queue_and_wait()
179 !uhid->report_running || !uhid->running, in __uhid_report_queue_and_wait()
181 if (!ret || !uhid->running || uhid->report_running) in __uhid_report_queue_and_wait()
188 uhid->report_running = false; in __uhid_report_queue_and_wait()
193 static void uhid_report_wake_up(struct uhid_device *uhid, u32 id, in uhid_report_wake_up() argument
198 spin_lock_irqsave(&uhid->qlock, flags); in uhid_report_wake_up()
201 if (uhid->report_type != ev->type || uhid->report_id != id) in uhid_report_wake_up()
203 if (!uhid->report_running) in uhid_report_wake_up()
206 memcpy(&uhid->report_buf, ev, sizeof(*ev)); in uhid_report_wake_up()
207 uhid->report_running = false; in uhid_report_wake_up()
208 wake_up_interruptible(&uhid->report_wait); in uhid_report_wake_up()
211 spin_unlock_irqrestore(&uhid->qlock, flags); in uhid_report_wake_up()
217 struct uhid_device *uhid = hid->driver_data; in uhid_hid_get_report() local
222 if (!uhid->running) in uhid_hid_get_report()
233 ret = mutex_lock_interruptible(&uhid->report_lock); in uhid_hid_get_report()
240 ret = __uhid_report_queue_and_wait(uhid, ev, &ev->u.get_report.id); in uhid_hid_get_report()
244 req = &uhid->report_buf.u.get_report_reply; in uhid_hid_get_report()
253 mutex_unlock(&uhid->report_lock); in uhid_hid_get_report()
260 struct uhid_device *uhid = hid->driver_data; in uhid_hid_set_report() local
264 if (!uhid->running || count > UHID_DATA_MAX) in uhid_hid_set_report()
277 ret = mutex_lock_interruptible(&uhid->report_lock); in uhid_hid_set_report()
284 ret = __uhid_report_queue_and_wait(uhid, ev, &ev->u.set_report.id); in uhid_hid_set_report()
288 if (uhid->report_buf.u.set_report_reply.err) in uhid_hid_set_report()
294 mutex_unlock(&uhid->report_lock); in uhid_hid_set_report()
331 struct uhid_device *uhid = hid->driver_data; in uhid_hid_output_raw() local
359 spin_lock_irqsave(&uhid->qlock, flags); in uhid_hid_output_raw()
360 uhid_queue(uhid, ev); in uhid_hid_output_raw()
361 spin_unlock_irqrestore(&uhid->qlock, flags); in uhid_hid_output_raw()
471 static int uhid_dev_create2(struct uhid_device *uhid, in uhid_dev_create2() argument
479 if (uhid->running) in uhid_dev_create2()
490 uhid->rd_size = rd_size; in uhid_dev_create2()
491 uhid->rd_data = rd_data; in uhid_dev_create2()
512 hid->driver_data = uhid; in uhid_dev_create2()
515 uhid->hid = hid; in uhid_dev_create2()
516 uhid->running = true; in uhid_dev_create2()
522 schedule_work(&uhid->worker); in uhid_dev_create2()
527 kfree(uhid->rd_data); in uhid_dev_create2()
528 uhid->rd_data = NULL; in uhid_dev_create2()
529 uhid->rd_size = 0; in uhid_dev_create2()
533 static int uhid_dev_create(struct uhid_device *uhid, in uhid_dev_create() argument
555 return uhid_dev_create2(uhid, ev); in uhid_dev_create()
558 static int uhid_dev_destroy(struct uhid_device *uhid) in uhid_dev_destroy() argument
560 if (!uhid->running) in uhid_dev_destroy()
563 uhid->running = false; in uhid_dev_destroy()
564 wake_up_interruptible(&uhid->report_wait); in uhid_dev_destroy()
566 cancel_work_sync(&uhid->worker); in uhid_dev_destroy()
568 hid_destroy_device(uhid->hid); in uhid_dev_destroy()
569 kfree(uhid->rd_data); in uhid_dev_destroy()
574 static int uhid_dev_input(struct uhid_device *uhid, struct uhid_event *ev) in uhid_dev_input() argument
576 if (!uhid->running) in uhid_dev_input()
579 hid_input_report(uhid->hid, HID_INPUT_REPORT, ev->u.input.data, in uhid_dev_input()
585 static int uhid_dev_input2(struct uhid_device *uhid, struct uhid_event *ev) in uhid_dev_input2() argument
587 if (!uhid->running) in uhid_dev_input2()
590 hid_input_report(uhid->hid, HID_INPUT_REPORT, ev->u.input2.data, in uhid_dev_input2()
596 static int uhid_dev_get_report_reply(struct uhid_device *uhid, in uhid_dev_get_report_reply() argument
599 if (!uhid->running) in uhid_dev_get_report_reply()
602 uhid_report_wake_up(uhid, ev->u.get_report_reply.id, ev); in uhid_dev_get_report_reply()
606 static int uhid_dev_set_report_reply(struct uhid_device *uhid, in uhid_dev_set_report_reply() argument
609 if (!uhid->running) in uhid_dev_set_report_reply()
612 uhid_report_wake_up(uhid, ev->u.set_report_reply.id, ev); in uhid_dev_set_report_reply()
618 struct uhid_device *uhid; in uhid_char_open() local
620 uhid = kzalloc(sizeof(*uhid), GFP_KERNEL); in uhid_char_open()
621 if (!uhid) in uhid_char_open()
624 mutex_init(&uhid->devlock); in uhid_char_open()
625 mutex_init(&uhid->report_lock); in uhid_char_open()
626 spin_lock_init(&uhid->qlock); in uhid_char_open()
627 init_waitqueue_head(&uhid->waitq); in uhid_char_open()
628 init_waitqueue_head(&uhid->report_wait); in uhid_char_open()
629 uhid->running = false; in uhid_char_open()
630 INIT_WORK(&uhid->worker, uhid_device_add_worker); in uhid_char_open()
632 file->private_data = uhid; in uhid_char_open()
640 struct uhid_device *uhid = file->private_data; in uhid_char_release() local
643 uhid_dev_destroy(uhid); in uhid_char_release()
646 kfree(uhid->outq[i]); in uhid_char_release()
648 kfree(uhid); in uhid_char_release()
656 struct uhid_device *uhid = file->private_data; in uhid_char_read() local
667 if (uhid->head == uhid->tail) in uhid_char_read()
670 ret = wait_event_interruptible(uhid->waitq, in uhid_char_read()
671 uhid->head != uhid->tail); in uhid_char_read()
676 ret = mutex_lock_interruptible(&uhid->devlock); in uhid_char_read()
680 if (uhid->head == uhid->tail) { in uhid_char_read()
681 mutex_unlock(&uhid->devlock); in uhid_char_read()
684 len = min(count, sizeof(**uhid->outq)); in uhid_char_read()
685 if (copy_to_user(buffer, uhid->outq[uhid->tail], len)) { in uhid_char_read()
688 kfree(uhid->outq[uhid->tail]); in uhid_char_read()
689 uhid->outq[uhid->tail] = NULL; in uhid_char_read()
691 spin_lock_irqsave(&uhid->qlock, flags); in uhid_char_read()
692 uhid->tail = (uhid->tail + 1) % UHID_BUFSIZE; in uhid_char_read()
693 spin_unlock_irqrestore(&uhid->qlock, flags); in uhid_char_read()
697 mutex_unlock(&uhid->devlock); in uhid_char_read()
704 struct uhid_device *uhid = file->private_data; in uhid_char_write() local
712 ret = mutex_lock_interruptible(&uhid->devlock); in uhid_char_write()
716 memset(&uhid->input_buf, 0, sizeof(uhid->input_buf)); in uhid_char_write()
717 len = min(count, sizeof(uhid->input_buf)); in uhid_char_write()
719 ret = uhid_event_from_user(buffer, len, &uhid->input_buf); in uhid_char_write()
723 switch (uhid->input_buf.type) { in uhid_char_write()
725 ret = uhid_dev_create(uhid, &uhid->input_buf); in uhid_char_write()
728 ret = uhid_dev_create2(uhid, &uhid->input_buf); in uhid_char_write()
731 ret = uhid_dev_destroy(uhid); in uhid_char_write()
734 ret = uhid_dev_input(uhid, &uhid->input_buf); in uhid_char_write()
737 ret = uhid_dev_input2(uhid, &uhid->input_buf); in uhid_char_write()
740 ret = uhid_dev_get_report_reply(uhid, &uhid->input_buf); in uhid_char_write()
743 ret = uhid_dev_set_report_reply(uhid, &uhid->input_buf); in uhid_char_write()
750 mutex_unlock(&uhid->devlock); in uhid_char_write()
758 struct uhid_device *uhid = file->private_data; in uhid_char_poll() local
760 poll_wait(file, &uhid->waitq, wait); in uhid_char_poll()
762 if (uhid->head != uhid->tail) in uhid_char_poll()