Lines Matching refs:djrcv_dev

514 static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev);
530 struct dj_receiver_dev *djrcv_dev; in dj_find_receiver_dev() local
540 list_for_each_entry(djrcv_dev, &dj_hdev_list, list) { in dj_find_receiver_dev()
541 if (djrcv_dev->mouse && in dj_find_receiver_dev()
542 hid_compare_device_paths(hdev, djrcv_dev->mouse, sep)) { in dj_find_receiver_dev()
543 kref_get(&djrcv_dev->kref); in dj_find_receiver_dev()
544 return djrcv_dev; in dj_find_receiver_dev()
546 if (djrcv_dev->keyboard && in dj_find_receiver_dev()
547 hid_compare_device_paths(hdev, djrcv_dev->keyboard, sep)) { in dj_find_receiver_dev()
548 kref_get(&djrcv_dev->kref); in dj_find_receiver_dev()
549 return djrcv_dev; in dj_find_receiver_dev()
551 if (djrcv_dev->hidpp && in dj_find_receiver_dev()
552 hid_compare_device_paths(hdev, djrcv_dev->hidpp, sep)) { in dj_find_receiver_dev()
553 kref_get(&djrcv_dev->kref); in dj_find_receiver_dev()
554 return djrcv_dev; in dj_find_receiver_dev()
563 struct dj_receiver_dev *djrcv_dev = container_of(kref, struct dj_receiver_dev, kref); in dj_release_receiver_dev() local
565 list_del(&djrcv_dev->list); in dj_release_receiver_dev()
566 kfifo_free(&djrcv_dev->notif_fifo); in dj_release_receiver_dev()
567 kfree(djrcv_dev); in dj_release_receiver_dev()
572 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in dj_put_receiver_dev() local
576 if (djrcv_dev->mouse == hdev) in dj_put_receiver_dev()
577 djrcv_dev->mouse = NULL; in dj_put_receiver_dev()
578 if (djrcv_dev->keyboard == hdev) in dj_put_receiver_dev()
579 djrcv_dev->keyboard = NULL; in dj_put_receiver_dev()
580 if (djrcv_dev->hidpp == hdev) in dj_put_receiver_dev()
581 djrcv_dev->hidpp = NULL; in dj_put_receiver_dev()
583 kref_put(&djrcv_dev->kref, dj_release_receiver_dev); in dj_put_receiver_dev()
593 struct dj_receiver_dev *djrcv_dev; in dj_get_receiver_dev() local
597 djrcv_dev = dj_find_receiver_dev(hdev, type); in dj_get_receiver_dev()
598 if (!djrcv_dev) { in dj_get_receiver_dev()
599 djrcv_dev = kzalloc(sizeof(*djrcv_dev), GFP_KERNEL); in dj_get_receiver_dev()
600 if (!djrcv_dev) in dj_get_receiver_dev()
603 INIT_WORK(&djrcv_dev->work, delayedwork_callback); in dj_get_receiver_dev()
604 spin_lock_init(&djrcv_dev->lock); in dj_get_receiver_dev()
605 if (kfifo_alloc(&djrcv_dev->notif_fifo, in dj_get_receiver_dev()
608 kfree(djrcv_dev); in dj_get_receiver_dev()
609 djrcv_dev = NULL; in dj_get_receiver_dev()
612 kref_init(&djrcv_dev->kref); in dj_get_receiver_dev()
613 list_add_tail(&djrcv_dev->list, &dj_hdev_list); in dj_get_receiver_dev()
614 djrcv_dev->last_query = jiffies; in dj_get_receiver_dev()
615 djrcv_dev->type = type; in dj_get_receiver_dev()
619 djrcv_dev->keyboard = hdev; in dj_get_receiver_dev()
621 djrcv_dev->mouse = hdev; in dj_get_receiver_dev()
623 djrcv_dev->hidpp = hdev; in dj_get_receiver_dev()
625 hid_set_drvdata(hdev, djrcv_dev); in dj_get_receiver_dev()
628 return djrcv_dev; in dj_get_receiver_dev()
631 static void logi_dj_recv_destroy_djhid_device(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_destroy_djhid_device() argument
638 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_recv_destroy_djhid_device()
639 dj_dev = djrcv_dev->paired_dj_devices[workitem->device_index]; in logi_dj_recv_destroy_djhid_device()
640 djrcv_dev->paired_dj_devices[workitem->device_index] = NULL; in logi_dj_recv_destroy_djhid_device()
641 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_recv_destroy_djhid_device()
647 hid_err(djrcv_dev->hidpp, "%s: can't destroy a NULL device\n", in logi_dj_recv_destroy_djhid_device()
652 static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_add_djhid_device() argument
656 struct hid_device *djrcv_hdev = djrcv_dev->hidpp; in logi_dj_recv_add_djhid_device()
668 if (djrcv_dev->paired_dj_devices[device_index]) { in logi_dj_recv_add_djhid_device()
708 if (djrcv_dev->type == recvr_type_27mhz) in logi_dj_recv_add_djhid_device()
726 dj_dev->dj_receiver_dev = djrcv_dev; in logi_dj_recv_add_djhid_device()
730 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_recv_add_djhid_device()
731 djrcv_dev->paired_dj_devices[device_index] = dj_dev; in logi_dj_recv_add_djhid_device()
732 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_recv_add_djhid_device()
742 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_recv_add_djhid_device()
743 djrcv_dev->paired_dj_devices[device_index] = NULL; in logi_dj_recv_add_djhid_device()
744 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_recv_add_djhid_device()
752 struct dj_receiver_dev *djrcv_dev = in delayedwork_callback() local
762 spin_lock_irqsave(&djrcv_dev->lock, flags); in delayedwork_callback()
768 if (!djrcv_dev->ready) { in delayedwork_callback()
771 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in delayedwork_callback()
775 count = kfifo_out(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem)); in delayedwork_callback()
778 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in delayedwork_callback()
782 if (!kfifo_is_empty(&djrcv_dev->notif_fifo)) in delayedwork_callback()
783 schedule_work(&djrcv_dev->work); in delayedwork_callback()
785 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in delayedwork_callback()
789 logi_dj_recv_add_djhid_device(djrcv_dev, &workitem); in delayedwork_callback()
792 logi_dj_recv_destroy_djhid_device(djrcv_dev, &workitem); in delayedwork_callback()
795 retval = logi_dj_recv_query_paired_devices(djrcv_dev); in delayedwork_callback()
797 hid_err(djrcv_dev->hidpp, "%s: logi_dj_recv_query_paired_devices error: %d\n", in delayedwork_callback()
819 static void logi_dj_recv_queue_unknown_work(struct dj_receiver_dev *djrcv_dev) in logi_dj_recv_queue_unknown_work() argument
824 if (time_before(jiffies, djrcv_dev->last_query + HZ / 2)) in logi_dj_recv_queue_unknown_work()
827 kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem)); in logi_dj_recv_queue_unknown_work()
828 schedule_work(&djrcv_dev->work); in logi_dj_recv_queue_unknown_work()
831 static void logi_dj_recv_queue_notification(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_queue_notification() argument
861 logi_dj_recv_queue_unknown_work(djrcv_dev); in logi_dj_recv_queue_notification()
865 kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem)); in logi_dj_recv_queue_notification()
866 schedule_work(&djrcv_dev->work); in logi_dj_recv_queue_notification()
885 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_hidpp_dev_conn_notif_equad() local
908 if (djrcv_dev->type == recvr_type_mouse_only) in logi_hidpp_dev_conn_notif_equad()
942 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_hidpp_recv_queue_notif() local
1028 kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem)); in logi_hidpp_recv_queue_notif()
1029 schedule_work(&djrcv_dev->work); in logi_hidpp_recv_queue_notif()
1032 static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_forward_null_report() argument
1040 djdev = djrcv_dev->paired_dj_devices[dj_report->device_index]; in logi_dj_recv_forward_null_report()
1058 static void logi_dj_recv_forward_dj(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_forward_dj() argument
1064 dj_device = djrcv_dev->paired_dj_devices[dj_report->device_index]; in logi_dj_recv_forward_dj()
1090 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_recv_forward_input_report() local
1101 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_recv_forward_input_report()
1103 dj_dev = djrcv_dev->paired_dj_devices[i]; in logi_dj_recv_forward_input_report()
1106 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_recv_forward_input_report()
1111 logi_dj_recv_queue_unknown_work(djrcv_dev); in logi_dj_recv_forward_input_report()
1112 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_recv_forward_input_report()
1117 static int logi_dj_recv_send_report(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_send_report() argument
1120 struct hid_device *hdev = djrcv_dev->hidpp; in logi_dj_recv_send_report()
1142 static int logi_dj_recv_query_hidpp_devices(struct dj_receiver_dev *djrcv_dev) in logi_dj_recv_query_hidpp_devices() argument
1159 retval = hid_hw_raw_request(djrcv_dev->hidpp, in logi_dj_recv_query_hidpp_devices()
1169 static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev) in logi_dj_recv_query_paired_devices() argument
1174 djrcv_dev->last_query = jiffies; in logi_dj_recv_query_paired_devices()
1176 if (djrcv_dev->type != recvr_type_dj) in logi_dj_recv_query_paired_devices()
1177 return logi_dj_recv_query_hidpp_devices(djrcv_dev); in logi_dj_recv_query_paired_devices()
1185 retval = logi_dj_recv_send_report(djrcv_dev, dj_report); in logi_dj_recv_query_paired_devices()
1191 static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_switch_to_dj_mode() argument
1194 struct hid_device *hdev = djrcv_dev->hidpp; in logi_dj_recv_switch_to_dj_mode()
1203 if (djrcv_dev->type == recvr_type_dj) { in logi_dj_recv_switch_to_dj_mode()
1211 retval = logi_dj_recv_send_report(djrcv_dev, dj_report); in logi_dj_recv_switch_to_dj_mode()
1281 struct dj_receiver_dev *djrcv_dev = djdev->dj_receiver_dev; in logi_dj_ll_raw_request() local
1298 return hid_hw_raw_request(djrcv_dev->hidpp, reportnum, buf, in logi_dj_ll_raw_request()
1305 if (djrcv_dev->type != recvr_type_dj && count >= 2) { in logi_dj_ll_raw_request()
1306 if (!djrcv_dev->keyboard) { in logi_dj_ll_raw_request()
1311 return hid_hw_raw_request(djrcv_dev->keyboard, 0, buf, count, in logi_dj_ll_raw_request()
1326 ret = hid_hw_raw_request(djrcv_dev->hidpp, out_buf[0], out_buf, in logi_dj_ll_raw_request()
1440 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_dj_event() local
1475 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_dj_event()
1477 if (!djrcv_dev->paired_dj_devices[dj_report->device_index]) { in logi_dj_dj_event()
1479 logi_dj_recv_queue_notification(djrcv_dev, dj_report); in logi_dj_dj_event()
1488 logi_dj_recv_queue_notification(djrcv_dev, dj_report); in logi_dj_dj_event()
1493 logi_dj_recv_forward_null_report(djrcv_dev, dj_report); in logi_dj_dj_event()
1497 logi_dj_recv_forward_dj(djrcv_dev, dj_report); in logi_dj_dj_event()
1501 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_dj_event()
1510 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_hidpp_event() local
1547 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_hidpp_event()
1549 dj_dev = djrcv_dev->paired_dj_devices[device_index]; in logi_dj_hidpp_event()
1555 if (djrcv_dev->type == recvr_type_27mhz && dj_dev && in logi_dj_hidpp_event()
1564 kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem)); in logi_dj_hidpp_event()
1575 logi_dj_recv_queue_unknown_work(djrcv_dev); in logi_dj_hidpp_event()
1578 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_hidpp_event()
1587 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_raw_event() local
1590 if (!djrcv_dev) in logi_dj_raw_event()
1595 if (djrcv_dev->unnumbered_application == HID_GD_KEYBOARD) { in logi_dj_raw_event()
1614 if (djrcv_dev->unnumbered_application == HID_GD_MOUSE && in logi_dj_raw_event()
1665 struct dj_receiver_dev *djrcv_dev; in logi_dj_probe() local
1731 djrcv_dev = dj_get_receiver_dev(hdev, id->driver_data, in logi_dj_probe()
1733 if (!djrcv_dev) { in logi_dj_probe()
1739 djrcv_dev->unnumbered_application = rep->application; in logi_dj_probe()
1750 retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0); in logi_dj_probe()
1770 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_probe()
1771 djrcv_dev->ready = true; in logi_dj_probe()
1772 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_probe()
1773 retval = logi_dj_recv_query_paired_devices(djrcv_dev); in logi_dj_probe()
1799 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_reset_resume() local
1801 if (!djrcv_dev || djrcv_dev->hidpp != hdev) in logi_dj_reset_resume()
1804 retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0); in logi_dj_reset_resume()
1816 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_remove() local
1823 if (!djrcv_dev) in logi_dj_remove()
1830 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_remove()
1831 djrcv_dev->ready = false; in logi_dj_remove()
1832 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_remove()
1834 cancel_work_sync(&djrcv_dev->work); in logi_dj_remove()
1847 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_remove()
1848 dj_dev = djrcv_dev->paired_dj_devices[i]; in logi_dj_remove()
1849 djrcv_dev->paired_dj_devices[i] = NULL; in logi_dj_remove()
1850 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_remove()